diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-29 14:28:30 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-29 14:28:30 -0500 |
commit | 76babde121d2ffef04ca692ce64ef9f8a9866086 (patch) | |
tree | 294923bbb4974258d86d223e35eee691abacdfb1 /arch/ppc | |
parent | e71ac6032edf77a1e4a81f3e3b260807e94b37a5 (diff) | |
parent | 15e812ad849e142e3dfc984d33c4d8042389f148 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (67 commits)
[PATCH] powerpc: Remove oprofile spinlock backtrace code
[PATCH] powerpc: Add oprofile calltrace support to all powerpc cpus
[PATCH] powerpc: Add oprofile calltrace support
[PATCH] for_each_possible_cpu: ppc
[PATCH] for_each_possible_cpu: powerpc
[PATCH] lock PTE before updating it in 440/BookE page fault handler
[PATCH] powerpc: Kill _machine and hard-coded platform numbers
ppc: Fix compile error in arch/ppc/lib/strcase.c
[PATCH] git-powerpc: WARN was a dumb idea
[PATCH] powerpc: a couple of trivial compile warning fixes
powerpc: remove OCP references
powerpc: Make uImage default build output for MPC8540 ADS
powerpc: move math-emu over to arch/powerpc
powerpc: use memparse() for mem= command line parsing
ppc: fix strncasecmp prototype
[PATCH] powerpc: make ISA floppies work again
[PATCH] powerpc: Fix some initcall return values
[PATCH] powerpc: Workaround for pSeries RTAS bug
[PATCH] spufs: fix __init/__exit annotations
[PATCH] powerpc: add hvc backend for rtas
...
Diffstat (limited to 'arch/ppc')
112 files changed, 183 insertions, 16663 deletions
diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig index 3a3e302b4ea2..e9a8f5d1dfcd 100644 --- a/arch/ppc/Kconfig +++ b/arch/ppc/Kconfig | |||
@@ -61,15 +61,15 @@ config 6xx | |||
61 | select PPC_FPU | 61 | select PPC_FPU |
62 | help | 62 | help |
63 | There are four types of PowerPC chips supported. The more common | 63 | There are four types of PowerPC chips supported. The more common |
64 | types (601, 603, 604, 740, 750, 7400), the Motorola embedded | 64 | types (601, 603, 604, 740, 750, 7400), the older Freescale |
65 | versions (821, 823, 850, 855, 860, 52xx, 82xx, 83xx), the IBM | 65 | (formerly Motorola) embedded versions (821, 823, 850, 855, 860, |
66 | embedded versions (403 and 405) and the POWER3 processor. | 66 | 52xx, 82xx, 83xx), the IBM embedded versions (403 and 405) and |
67 | (For support for more recent 64-bit processors, set ARCH=powerpc.) | 67 | the Book E embedded processors from IBM (44x) and Freescale (85xx). |
68 | For support for 64-bit processors, set ARCH=powerpc. | ||
68 | Unless you are building a kernel for one of the embedded processor | 69 | Unless you are building a kernel for one of the embedded processor |
69 | systems or a POWER3-based IBM RS/6000, choose 6xx. | 70 | systems, choose 6xx. |
70 | Note that the kernel runs in 32-bit mode even on 64-bit chips. | 71 | Also note that because the 52xx, 82xx, & 83xx family have a 603e |
71 | Also note that because the 52xx, 82xx, & 83xx family has a 603e core, | 72 | core, specific support for that chipset is asked later on. |
72 | specific support for that chipset is asked later on. | ||
73 | 73 | ||
74 | config 40x | 74 | config 40x |
75 | bool "40x" | 75 | bool "40x" |
@@ -77,10 +77,6 @@ config 40x | |||
77 | config 44x | 77 | config 44x |
78 | bool "44x" | 78 | bool "44x" |
79 | 79 | ||
80 | config POWER3 | ||
81 | select PPC_FPU | ||
82 | bool "POWER3" | ||
83 | |||
84 | config 8xx | 80 | config 8xx |
85 | bool "8xx" | 81 | bool "8xx" |
86 | 82 | ||
@@ -252,14 +248,9 @@ config PPC601_SYNC_FIX | |||
252 | source arch/ppc/platforms/4xx/Kconfig | 248 | source arch/ppc/platforms/4xx/Kconfig |
253 | source arch/ppc/platforms/85xx/Kconfig | 249 | source arch/ppc/platforms/85xx/Kconfig |
254 | 250 | ||
255 | config PPC64BRIDGE | ||
256 | bool | ||
257 | depends on POWER3 | ||
258 | default y | ||
259 | |||
260 | config PPC_STD_MMU | 251 | config PPC_STD_MMU |
261 | bool | 252 | bool |
262 | depends on 6xx || POWER3 | 253 | depends on 6xx |
263 | default y | 254 | default y |
264 | 255 | ||
265 | config NOT_COHERENT_CACHE | 256 | config NOT_COHERENT_CACHE |
@@ -534,8 +525,8 @@ endmenu | |||
534 | 525 | ||
535 | choice | 526 | choice |
536 | prompt "Machine Type" | 527 | prompt "Machine Type" |
537 | depends on 6xx || POWER3 | 528 | depends on 6xx |
538 | default PPC_MULTIPLATFORM | 529 | default PPC_PREP |
539 | ---help--- | 530 | ---help--- |
540 | Linux currently supports several different kinds of PowerPC-based | 531 | Linux currently supports several different kinds of PowerPC-based |
541 | machines: Apple Power Macintoshes and clones (such as the Motorola | 532 | machines: Apple Power Macintoshes and clones (such as the Motorola |
@@ -545,15 +536,14 @@ choice | |||
545 | Platform) machines (including all of the recent IBM RS/6000 and | 536 | Platform) machines (including all of the recent IBM RS/6000 and |
546 | pSeries machines), and several embedded PowerPC systems containing | 537 | pSeries machines), and several embedded PowerPC systems containing |
547 | 4xx, 6xx, 7xx, 8xx, 74xx, and 82xx processors. Currently, the | 538 | 4xx, 6xx, 7xx, 8xx, 74xx, and 82xx processors. Currently, the |
548 | default option is to build a kernel which works on PReP and CHRP. | 539 | default option is to build a kernel which works on PReP. |
549 | 540 | ||
550 | Note that support for Apple machines is now only available with | 541 | Note that support for Apple and CHRP machines is now only available |
551 | ARCH=powerpc, and has been removed from this menu. If you wish | 542 | with ARCH=powerpc, and has been removed from this menu. If you |
552 | to build a kernel for an Apple machine, exit this configuration | 543 | wish to build a kernel for an Apple or CHRP machine, exit this |
553 | process and re-run it with ARCH=powerpc. | 544 | configuration process and re-run it with ARCH=powerpc. |
554 | 545 | ||
555 | Select CHRP/PReP if configuring for an IBM RS/6000 or | 546 | Select PReP if configuring for a PReP machine. |
556 | pSeries machine, or a PReP machine. | ||
557 | 547 | ||
558 | Select Gemini if configuring for a Synergy Microsystems' Gemini | 548 | Select Gemini if configuring for a Synergy Microsystems' Gemini |
559 | series Single Board Computer. More information is available at: | 549 | series Single Board Computer. More information is available at: |
@@ -562,8 +552,8 @@ choice | |||
562 | Select APUS if configuring for a PowerUP Amiga. More information is | 552 | Select APUS if configuring for a PowerUP Amiga. More information is |
563 | available at: <http://linux-apus.sourceforge.net/>. | 553 | available at: <http://linux-apus.sourceforge.net/>. |
564 | 554 | ||
565 | config PPC_MULTIPLATFORM | 555 | config PPC_PREP |
566 | bool "CHRP/PReP" | 556 | bool "PReP" |
567 | 557 | ||
568 | config APUS | 558 | config APUS |
569 | bool "Amiga-APUS" | 559 | bool "Amiga-APUS" |
@@ -715,6 +705,13 @@ config LITE5200 | |||
715 | much but it's only been tested on this board version. I think this | 705 | much but it's only been tested on this board version. I think this |
716 | board is also known as IceCube. | 706 | board is also known as IceCube. |
717 | 707 | ||
708 | config LITE5200B | ||
709 | bool "Freescale LITE5200B" | ||
710 | depends LITE5200 | ||
711 | help | ||
712 | Support for the LITE5200B dev board for the MPC5200 from Freescale. | ||
713 | This is the new board with 2 PCI slots. | ||
714 | |||
718 | config MPC834x_SYS | 715 | config MPC834x_SYS |
719 | bool "Freescale MPC834x SYS" | 716 | bool "Freescale MPC834x SYS" |
720 | help | 717 | help |
@@ -800,25 +797,6 @@ config CPM2 | |||
800 | you wish to build a kernel for a machine with a CPM2 coprocessor | 797 | you wish to build a kernel for a machine with a CPM2 coprocessor |
801 | on it (826x, 827x, 8560). | 798 | on it (826x, 827x, 8560). |
802 | 799 | ||
803 | config PPC_CHRP | ||
804 | bool "Support for CHRP (Common Hardware Reference Platform) machines" | ||
805 | depends on PPC_MULTIPLATFORM | ||
806 | select PPC_I8259 | ||
807 | select PPC_INDIRECT_PCI | ||
808 | default y | ||
809 | |||
810 | config PPC_PREP | ||
811 | bool "Support for PReP (PowerPC Reference Platform) machines" | ||
812 | depends on PPC_MULTIPLATFORM | ||
813 | select PPC_I8259 | ||
814 | select PPC_INDIRECT_PCI | ||
815 | default y | ||
816 | |||
817 | config PPC_OF | ||
818 | bool | ||
819 | depends on PPC_CHRP | ||
820 | default y | ||
821 | |||
822 | config PPC_GEN550 | 800 | config PPC_GEN550 |
823 | bool | 801 | bool |
824 | depends on SANDPOINT || SPRUCE || PPLUS || \ | 802 | depends on SANDPOINT || SPRUCE || PPLUS || \ |
@@ -977,14 +955,6 @@ source "mm/Kconfig" | |||
977 | 955 | ||
978 | source "fs/Kconfig.binfmt" | 956 | source "fs/Kconfig.binfmt" |
979 | 957 | ||
980 | config PROC_DEVICETREE | ||
981 | bool "Support for Open Firmware device tree in /proc" | ||
982 | depends on PPC_OF && PROC_FS | ||
983 | help | ||
984 | This option adds a device-tree directory under /proc which contains | ||
985 | an image of the device tree that the kernel copies from Open | ||
986 | Firmware. If unsure, say Y here. | ||
987 | |||
988 | config PREP_RESIDUAL | 958 | config PREP_RESIDUAL |
989 | bool "Support for PReP Residual Data" | 959 | bool "Support for PReP Residual Data" |
990 | depends on PPC_PREP | 960 | depends on PPC_PREP |
@@ -1177,8 +1147,7 @@ menu "Bus options" | |||
1177 | 1147 | ||
1178 | config ISA | 1148 | config ISA |
1179 | bool "Support for ISA-bus hardware" | 1149 | bool "Support for ISA-bus hardware" |
1180 | depends on PPC_PREP || PPC_CHRP | 1150 | depends on PPC_PREP |
1181 | select PPC_I8259 | ||
1182 | help | 1151 | help |
1183 | Find out whether you have ISA slots on your motherboard. ISA is the | 1152 | Find out whether you have ISA slots on your motherboard. ISA is the |
1184 | name of a bus system, i.e. the way the CPU talks to the other stuff | 1153 | name of a bus system, i.e. the way the CPU talks to the other stuff |
@@ -1188,18 +1157,18 @@ config ISA | |||
1188 | 1157 | ||
1189 | config GENERIC_ISA_DMA | 1158 | config GENERIC_ISA_DMA |
1190 | bool | 1159 | bool |
1191 | depends on POWER3 || 6xx && !CPM2 | 1160 | depends on 6xx && !CPM2 |
1192 | default y | 1161 | default y |
1193 | 1162 | ||
1194 | config PPC_I8259 | 1163 | config PPC_I8259 |
1195 | bool | 1164 | bool |
1196 | default y if 85xx | 1165 | default y if 85xx || PPC_PREP |
1197 | default n | 1166 | default n |
1198 | 1167 | ||
1199 | config PPC_INDIRECT_PCI | 1168 | config PPC_INDIRECT_PCI |
1200 | bool | 1169 | bool |
1201 | depends on PCI | 1170 | depends on PCI |
1202 | default y if 40x || 44x || 85xx || 83xx | 1171 | default y if 40x || 44x || 85xx || 83xx || PPC_PREP |
1203 | default n | 1172 | default n |
1204 | 1173 | ||
1205 | config EISA | 1174 | config EISA |
@@ -1390,7 +1359,7 @@ config CONSISTENT_SIZE | |||
1390 | 1359 | ||
1391 | config BOOT_LOAD_BOOL | 1360 | config BOOT_LOAD_BOOL |
1392 | bool "Set the boot link/load address" | 1361 | bool "Set the boot link/load address" |
1393 | depends on ADVANCED_OPTIONS && !PPC_MULTIPLATFORM | 1362 | depends on ADVANCED_OPTIONS && !PPC_PREP |
1394 | help | 1363 | help |
1395 | This option allows you to set the initial load address of the zImage | 1364 | This option allows you to set the initial load address of the zImage |
1396 | or zImage.initrd file. This can be useful if you are on a board | 1365 | or zImage.initrd file. This can be useful if you are on a board |
diff --git a/arch/ppc/Kconfig.debug b/arch/ppc/Kconfig.debug index 8cc75abf3d83..f94b87740973 100644 --- a/arch/ppc/Kconfig.debug +++ b/arch/ppc/Kconfig.debug | |||
@@ -53,13 +53,6 @@ config BDI_SWITCH | |||
53 | Unless you are intending to debug the kernel with one of these | 53 | Unless you are intending to debug the kernel with one of these |
54 | machines, say N here. | 54 | machines, say N here. |
55 | 55 | ||
56 | config BOOTX_TEXT | ||
57 | bool "Support for early boot text console (BootX or OpenFirmware only)" | ||
58 | depends PPC_OF | ||
59 | help | ||
60 | Say Y here to see progress messages from the boot firmware in text | ||
61 | mode. Requires either BootX or Open Firmware. | ||
62 | |||
63 | config SERIAL_TEXT_DEBUG | 56 | config SERIAL_TEXT_DEBUG |
64 | bool "Support for early boot texts over serial port" | 57 | bool "Support for early boot texts over serial port" |
65 | depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \ | 58 | depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \ |
diff --git a/arch/ppc/Makefile b/arch/ppc/Makefile index 9fbdf54ba2be..0db66dcf0723 100644 --- a/arch/ppc/Makefile +++ b/arch/ppc/Makefile | |||
@@ -40,10 +40,8 @@ ifndef CONFIG_FSL_BOOKE | |||
40 | CFLAGS += -mstring | 40 | CFLAGS += -mstring |
41 | endif | 41 | endif |
42 | 42 | ||
43 | cpu-as-$(CONFIG_PPC64BRIDGE) += -Wa,-mppc64bridge | ||
44 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 | 43 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 |
45 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec | 44 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec |
46 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec | ||
47 | cpu-as-$(CONFIG_E500) += -Wa,-me500 | 45 | cpu-as-$(CONFIG_E500) += -Wa,-me500 |
48 | cpu-as-$(CONFIG_E200) += -Wa,-me200 | 46 | cpu-as-$(CONFIG_E200) += -Wa,-me200 |
49 | 47 | ||
@@ -59,8 +57,6 @@ head-$(CONFIG_4xx) := arch/ppc/kernel/head_4xx.o | |||
59 | head-$(CONFIG_44x) := arch/ppc/kernel/head_44x.o | 57 | head-$(CONFIG_44x) := arch/ppc/kernel/head_44x.o |
60 | head-$(CONFIG_FSL_BOOKE) := arch/ppc/kernel/head_fsl_booke.o | 58 | head-$(CONFIG_FSL_BOOKE) := arch/ppc/kernel/head_fsl_booke.o |
61 | 59 | ||
62 | head-$(CONFIG_6xx) += arch/ppc/kernel/idle_6xx.o | ||
63 | head-$(CONFIG_POWER4) += arch/ppc/kernel/idle_power4.o | ||
64 | head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o | 60 | head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o |
65 | 61 | ||
66 | core-y += arch/ppc/kernel/ arch/powerpc/kernel/ \ | 62 | core-y += arch/ppc/kernel/ arch/powerpc/kernel/ \ |
@@ -71,7 +67,7 @@ core-y += arch/ppc/kernel/ arch/powerpc/kernel/ \ | |||
71 | core-$(CONFIG_4xx) += arch/ppc/platforms/4xx/ | 67 | core-$(CONFIG_4xx) += arch/ppc/platforms/4xx/ |
72 | core-$(CONFIG_83xx) += arch/ppc/platforms/83xx/ | 68 | core-$(CONFIG_83xx) += arch/ppc/platforms/83xx/ |
73 | core-$(CONFIG_85xx) += arch/ppc/platforms/85xx/ | 69 | core-$(CONFIG_85xx) += arch/ppc/platforms/85xx/ |
74 | core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/ | 70 | core-$(CONFIG_MATH_EMULATION) += arch/powerpc/math-emu/ |
75 | core-$(CONFIG_XMON) += arch/ppc/xmon/ | 71 | core-$(CONFIG_XMON) += arch/ppc/xmon/ |
76 | core-$(CONFIG_APUS) += arch/ppc/amiga/ | 72 | core-$(CONFIG_APUS) += arch/ppc/amiga/ |
77 | drivers-$(CONFIG_8xx) += arch/ppc/8xx_io/ | 73 | drivers-$(CONFIG_8xx) += arch/ppc/8xx_io/ |
diff --git a/arch/ppc/boot/Makefile b/arch/ppc/boot/Makefile index 84eec0bef93c..b739e25d4728 100644 --- a/arch/ppc/boot/Makefile +++ b/arch/ppc/boot/Makefile | |||
@@ -19,14 +19,13 @@ HOSTCFLAGS += -Iarch/$(ARCH)/boot/include | |||
19 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd | 19 | BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd |
20 | 20 | ||
21 | bootdir-y := simple | 21 | bootdir-y := simple |
22 | bootdir-$(CONFIG_PPC_OF) += openfirmware | ||
23 | subdir-y := lib common images | 22 | subdir-y := lib common images |
24 | subdir-$(CONFIG_PPC_MULTIPLATFORM) += of1275 | 23 | subdir-$(CONFIG_PPC_PREP) += of1275 |
25 | 24 | ||
26 | # for cleaning | 25 | # for cleaning |
27 | subdir- += simple openfirmware | 26 | subdir- += simple |
28 | 27 | ||
29 | hostprogs-y := $(addprefix utils/, addnote mknote hack-coff mkprep mkbugboot mktree) | 28 | hostprogs-y := $(addprefix utils/, mkprep mkbugboot mktree) |
30 | 29 | ||
31 | PHONY += $(BOOT_TARGETS) $(bootdir-y) | 30 | PHONY += $(BOOT_TARGETS) $(bootdir-y) |
32 | 31 | ||
diff --git a/arch/ppc/boot/openfirmware/Makefile b/arch/ppc/boot/openfirmware/Makefile deleted file mode 100644 index 66b739743759..000000000000 --- a/arch/ppc/boot/openfirmware/Makefile +++ /dev/null | |||
@@ -1,109 +0,0 @@ | |||
1 | # Makefile for making bootable images on various OpenFirmware machines. | ||
2 | # | ||
3 | # This file is included by the global makefile so that you can add your own | ||
4 | # architecture-specific flags and dependencies. | ||
5 | # | ||
6 | # Paul Mackerras January 1997 | ||
7 | # XCOFF bootable images for PowerMacs | ||
8 | # Geert Uytterhoeven September 1997 | ||
9 | # ELF bootable iamges for CHRP machines. | ||
10 | # Tom Rini January 2001 | ||
11 | # Cleaned up, moved into arch/ppc/boot/pmac | ||
12 | # Tom Rini July/August 2002 | ||
13 | # Merged 'chrp' and 'pmac' into 'openfirmware', and cleaned up the | ||
14 | # rules. | ||
15 | |||
16 | zImage.initrd znetboot.initrd: del-ramdisk-sec := -R .ramdisk | ||
17 | zImage.initrd znetboot.initrd: initrd := .initrd | ||
18 | |||
19 | |||
20 | boot := arch/ppc/boot | ||
21 | common := $(boot)/common | ||
22 | utils := $(boot)/utils | ||
23 | bootlib := $(boot)/lib | ||
24 | of1275 := $(boot)/of1275 | ||
25 | images := $(boot)/images | ||
26 | |||
27 | CHRP_LD_ARGS := -T $(srctree)/$(boot)/ld.script -e _start -Ttext 0x00800000 | ||
28 | |||
29 | COMMONOBJS := start.o misc.o common.o | ||
30 | CHRPOBJS := crt0.o $(COMMONOBJS) chrpmain.o | ||
31 | |||
32 | targets := $(CHRPOBJS) dummy.o | ||
33 | CHRPOBJS := $(addprefix $(obj)/, $(CHRPOBJS)) | ||
34 | |||
35 | LIBS := lib/lib.a $(bootlib)/lib.a $(of1275)/lib.a $(common)/lib.a | ||
36 | |||
37 | ifdef CONFIG_SMP | ||
38 | END := .smp | ||
39 | endif | ||
40 | ifdef CONFIG_PPC64BRIDGE | ||
41 | END += .64 | ||
42 | endif | ||
43 | |||
44 | |||
45 | $(images)/ramdisk.image.gz: | ||
46 | @echo ' MISSING $@' | ||
47 | @echo ' RAM disk image must be provided separately' | ||
48 | @/bin/false | ||
49 | |||
50 | quiet_cmd_genimage = GEN $@ | ||
51 | cmd_genimage = $(OBJCOPY) -R .comment \ | ||
52 | --add-section=.image=$(images)/vmlinux.gz \ | ||
53 | --set-section-flags=.image=contents,alloc,load,readonly,data $< $@ | ||
54 | |||
55 | targets += image.o | ||
56 | $(obj)/image.o: $(obj)/dummy.o $(images)/vmlinux.gz FORCE | ||
57 | $(call if_changed,genimage) | ||
58 | |||
59 | # Place the ramdisk in the initrd image. | ||
60 | quiet_cmd_genimage-initrd = GEN $@ | ||
61 | cmd_genimage-initrd = $(OBJCOPY) $< $@ \ | ||
62 | --add-section=.ramdisk=$(images)/ramdisk.image.gz \ | ||
63 | --set-section-flags=.ramdisk=contents,alloc,load,readonly,data | ||
64 | targets += image.initrd.o | ||
65 | $(obj)/image.initrd.o: $(obj)/image.o $(images)/ramdisk.image.gz FORCE | ||
66 | $(call if_changed,genimage-initrd) | ||
67 | |||
68 | |||
69 | targets += crt0.o | ||
70 | $(obj)/crt0.o: $(common)/crt0.S FORCE | ||
71 | $(call if_changed_dep,as_o_S) | ||
72 | |||
73 | quiet_cmd_gen-chrp = CHRP $@ | ||
74 | cmd_gen-chrp = $(LD) $(CHRP_LD_ARGS) -o $@ $(CHRPOBJS) $< $(LIBS) && \ | ||
75 | $(OBJCOPY) $@ $@ -R .comment $(del-ramdisk-sec) | ||
76 | |||
77 | $(images)/zImage.chrp: $(obj)/image.o $(CHRPOBJS) $(LIBS) \ | ||
78 | $(srctree)/$(boot)/ld.script | ||
79 | $(call cmd,gen-chrp) | ||
80 | $(images)/zImage.initrd.chrp: $(obj)/image.initrd.o $(CHRPOBJS) $(LIBS) \ | ||
81 | $(srctree)/$(boot)/ld.script | ||
82 | $(call cmd,gen-chrp) | ||
83 | |||
84 | quiet_cmd_addnote = ADDNOTE $@ | ||
85 | cmd_addnote = cat $< > $@ && $(utils)/addnote $@ | ||
86 | $(images)/zImage.chrp-rs6k $(images)/zImage.initrd.chrp-rs6k: \ | ||
87 | %-rs6k: % | ||
88 | $(call cmd,addnote) | ||
89 | |||
90 | # The targets used on the make command-line | ||
91 | |||
92 | PHONY += zImage zImage.initrd | ||
93 | zImage: $(images)/zImage.chrp \ | ||
94 | $(images)/zImage.chrp-rs6k | ||
95 | @echo ' kernel: $@ is ready ($<)' | ||
96 | zImage.initrd: $(images)/zImage.initrd.chrp \ | ||
97 | $(images)/zImage.initrd.chrp-rs6k | ||
98 | @echo ' kernel: $@ is ready ($<)' | ||
99 | |||
100 | TFTPIMAGE := /tftpboot/zImage | ||
101 | |||
102 | PHONY += znetboot znetboot.initrd | ||
103 | znetboot: $(images)/zImage.chrp | ||
104 | cp $(images)/zImage.chrp $(TFTPIMAGE).chrp$(END) | ||
105 | @echo ' kernel: $@ is ready ($<)' | ||
106 | znetboot.initrd:$(images)/zImage.initrd.chrp | ||
107 | cp $(images)/zImage.initrd.chrp $(TFTPIMAGE).chrp$(END) | ||
108 | @echo ' kernel: $@ is ready ($<)' | ||
109 | |||
diff --git a/arch/ppc/boot/openfirmware/chrpmain.c b/arch/ppc/boot/openfirmware/chrpmain.c deleted file mode 100644 index 245dbd9fc120..000000000000 --- a/arch/ppc/boot/openfirmware/chrpmain.c +++ /dev/null | |||
@@ -1,101 +0,0 @@ | |||
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 <linux/string.h> | ||
10 | #include "nonstdio.h" | ||
11 | #include "of1275.h" | ||
12 | #include <asm/processor.h> | ||
13 | #include <asm/page.h> | ||
14 | |||
15 | /* Passed from the linker */ | ||
16 | extern char __image_begin, __image_end; | ||
17 | extern char __ramdisk_begin, __ramdisk_end; | ||
18 | extern char _start, _end; | ||
19 | |||
20 | extern unsigned int heap_max; | ||
21 | extern void flush_cache(void *, unsigned long); | ||
22 | extern void gunzip(void *, int, unsigned char *, int *); | ||
23 | extern void make_bi_recs(unsigned long addr, char *name, unsigned int mach, | ||
24 | unsigned int progend); | ||
25 | |||
26 | char *avail_ram; | ||
27 | char *begin_avail, *end_avail; | ||
28 | char *avail_high; | ||
29 | |||
30 | #define RAM_START 0x00000000 | ||
31 | #define RAM_END (64<<20) | ||
32 | |||
33 | #define BOOT_START ((unsigned long)_start) | ||
34 | #define BOOT_END ((unsigned long)(_end + 0xFFF) & ~0xFFF) | ||
35 | |||
36 | #define RAM_FREE ((unsigned long)(_end+0x1000)&~0xFFF) | ||
37 | #define PROG_START 0x00010000 | ||
38 | #define PROG_SIZE 0x007f0000 /* 8MB */ | ||
39 | |||
40 | #define SCRATCH_SIZE (128 << 10) | ||
41 | |||
42 | static char scratch[SCRATCH_SIZE]; /* 128k of scratch space for gunzip */ | ||
43 | |||
44 | typedef void (*kernel_start_t)(int, int, void *, unsigned int, unsigned int); | ||
45 | |||
46 | void | ||
47 | boot(int a1, int a2, void *prom) | ||
48 | { | ||
49 | unsigned sa, len; | ||
50 | void *dst; | ||
51 | unsigned char *im; | ||
52 | unsigned int initrd_size, initrd_start; | ||
53 | |||
54 | printf("chrpboot starting: loaded at 0x%p\n\r", &_start); | ||
55 | |||
56 | initrd_size = &__ramdisk_end - &__ramdisk_begin; | ||
57 | if (initrd_size) { | ||
58 | initrd_start = (RAM_END - initrd_size) & ~0xFFF; | ||
59 | a1 = initrd_start; | ||
60 | a2 = initrd_size; | ||
61 | claim(initrd_start, RAM_END - initrd_start, 0); | ||
62 | printf("initial ramdisk moving 0x%x <- 0x%p (%x bytes)\n\r", | ||
63 | initrd_start, &__ramdisk_begin, initrd_size); | ||
64 | memcpy((char *)initrd_start, &__ramdisk_begin, initrd_size); | ||
65 | } else { | ||
66 | initrd_start = 0; | ||
67 | initrd_size = 0; | ||
68 | a2 = 0xdeadbeef; | ||
69 | } | ||
70 | |||
71 | im = &__image_begin; | ||
72 | len = &__image_end - &__image_begin; | ||
73 | /* claim 4MB starting at PROG_START */ | ||
74 | claim(PROG_START, PROG_SIZE - PROG_START, 0); | ||
75 | dst = (void *) PROG_START; | ||
76 | if (im[0] == 0x1f && im[1] == 0x8b) { | ||
77 | avail_ram = scratch; | ||
78 | begin_avail = avail_high = avail_ram; | ||
79 | end_avail = scratch + sizeof(scratch); | ||
80 | printf("gunzipping (0x%p <- 0x%p:0x%p)...", dst, im, im+len); | ||
81 | gunzip(dst, PROG_SIZE - PROG_START, im, &len); | ||
82 | printf("done %u bytes\n\r", len); | ||
83 | printf("%u bytes of heap consumed, max in use %u\n\r", | ||
84 | avail_high - begin_avail, heap_max); | ||
85 | } else { | ||
86 | memmove(dst, im, len); | ||
87 | } | ||
88 | |||
89 | flush_cache(dst, len); | ||
90 | make_bi_recs(((unsigned long) dst + len), "chrpboot", _MACH_chrp, | ||
91 | (PROG_START + PROG_SIZE)); | ||
92 | |||
93 | sa = PROG_START; | ||
94 | printf("start address = 0x%x\n\r", sa); | ||
95 | |||
96 | (*(kernel_start_t)sa)(a1, a2, prom, initrd_start, initrd_size); | ||
97 | |||
98 | printf("returned?\n\r"); | ||
99 | |||
100 | pause(); | ||
101 | } | ||
diff --git a/arch/ppc/boot/openfirmware/common.c b/arch/ppc/boot/openfirmware/common.c deleted file mode 100644 index 0f46756a903e..000000000000 --- a/arch/ppc/boot/openfirmware/common.c +++ /dev/null | |||
@@ -1,146 +0,0 @@ | |||
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 | |||
10 | #include "nonstdio.h" | ||
11 | #include "of1275.h" | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/zlib.h> | ||
14 | #include <asm/bootinfo.h> | ||
15 | #include <asm/page.h> | ||
16 | |||
17 | /* Information from the linker */ | ||
18 | |||
19 | extern int strcmp(const char *s1, const char *s2); | ||
20 | extern char *avail_ram, *avail_high; | ||
21 | extern char *end_avail; | ||
22 | |||
23 | unsigned int heap_use, heap_max; | ||
24 | |||
25 | struct memchunk { | ||
26 | unsigned int size; | ||
27 | struct memchunk *next; | ||
28 | }; | ||
29 | |||
30 | static struct memchunk *freechunks; | ||
31 | |||
32 | static void *zalloc(unsigned size) | ||
33 | { | ||
34 | void *p; | ||
35 | struct memchunk **mpp, *mp; | ||
36 | |||
37 | size = (size + 7) & -8; | ||
38 | heap_use += size; | ||
39 | if (heap_use > heap_max) | ||
40 | heap_max = heap_use; | ||
41 | for (mpp = &freechunks; (mp = *mpp) != 0; mpp = &mp->next) { | ||
42 | if (mp->size == size) { | ||
43 | *mpp = mp->next; | ||
44 | return mp; | ||
45 | } | ||
46 | } | ||
47 | p = avail_ram; | ||
48 | avail_ram += size; | ||
49 | if (avail_ram > avail_high) | ||
50 | avail_high = avail_ram; | ||
51 | if (avail_ram > end_avail) { | ||
52 | printf("oops... out of memory\n\r"); | ||
53 | pause(); | ||
54 | } | ||
55 | return p; | ||
56 | } | ||
57 | |||
58 | #define HEAD_CRC 2 | ||
59 | #define EXTRA_FIELD 4 | ||
60 | #define ORIG_NAME 8 | ||
61 | #define COMMENT 0x10 | ||
62 | #define RESERVED 0xe0 | ||
63 | |||
64 | void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp) | ||
65 | { | ||
66 | z_stream s; | ||
67 | int r, i, flags; | ||
68 | |||
69 | /* skip header */ | ||
70 | i = 10; | ||
71 | flags = src[3]; | ||
72 | if (src[2] != Z_DEFLATED || (flags & RESERVED) != 0) { | ||
73 | printf("bad gzipped data\n\r"); | ||
74 | exit(); | ||
75 | } | ||
76 | if ((flags & EXTRA_FIELD) != 0) | ||
77 | i = 12 + src[10] + (src[11] << 8); | ||
78 | if ((flags & ORIG_NAME) != 0) | ||
79 | while (src[i++] != 0) | ||
80 | ; | ||
81 | if ((flags & COMMENT) != 0) | ||
82 | while (src[i++] != 0) | ||
83 | ; | ||
84 | if ((flags & HEAD_CRC) != 0) | ||
85 | i += 2; | ||
86 | if (i >= *lenp) { | ||
87 | printf("gunzip: ran out of data in header\n\r"); | ||
88 | exit(); | ||
89 | } | ||
90 | |||
91 | /* Initialize ourself. */ | ||
92 | s.workspace = zalloc(zlib_inflate_workspacesize()); | ||
93 | r = zlib_inflateInit2(&s, -MAX_WBITS); | ||
94 | if (r != Z_OK) { | ||
95 | printf("zlib_inflateInit2 returned %d\n\r", r); | ||
96 | exit(); | ||
97 | } | ||
98 | s.next_in = src + i; | ||
99 | s.avail_in = *lenp - i; | ||
100 | s.next_out = dst; | ||
101 | s.avail_out = dstlen; | ||
102 | r = zlib_inflate(&s, Z_FINISH); | ||
103 | if (r != Z_OK && r != Z_STREAM_END) { | ||
104 | printf("inflate returned %d msg: %s\n\r", r, s.msg); | ||
105 | exit(); | ||
106 | } | ||
107 | *lenp = s.next_out - (unsigned char *) dst; | ||
108 | zlib_inflateEnd(&s); | ||
109 | } | ||
110 | |||
111 | /* Make a bi_rec in OF. We need to be passed a name for BI_BOOTLOADER_ID, | ||
112 | * a machine type for BI_MACHTYPE, and the location where the end of the | ||
113 | * bootloader is (PROG_START + PROG_SIZE) | ||
114 | */ | ||
115 | void make_bi_recs(unsigned long addr, char *name, unsigned int mach, | ||
116 | unsigned long progend) | ||
117 | { | ||
118 | struct bi_record *rec; | ||
119 | |||
120 | |||
121 | /* leave a 1MB gap then align to the next 1MB boundary */ | ||
122 | addr = _ALIGN(addr+ (1<<20) - 1, (1<<20)); | ||
123 | /* oldworld machine seem very unhappy about this. -- Tom */ | ||
124 | if (addr >= progend) | ||
125 | claim(addr, 0x1000, 0); | ||
126 | |||
127 | rec = (struct bi_record *)addr; | ||
128 | rec->tag = BI_FIRST; | ||
129 | rec->size = sizeof(struct bi_record); | ||
130 | rec = (struct bi_record *)((unsigned long)rec + rec->size); | ||
131 | |||
132 | rec->tag = BI_BOOTLOADER_ID; | ||
133 | sprintf( (char *)rec->data, name); | ||
134 | rec->size = sizeof(struct bi_record) + strlen(name) + 1; | ||
135 | rec = (struct bi_record *)((unsigned long)rec + rec->size); | ||
136 | |||
137 | rec->tag = BI_MACHTYPE; | ||
138 | rec->data[0] = mach; | ||
139 | rec->data[1] = 1; | ||
140 | rec->size = sizeof(struct bi_record) + 2 * sizeof(unsigned long); | ||
141 | rec = (struct bi_record *)((unsigned long)rec + rec->size); | ||
142 | |||
143 | rec->tag = BI_LAST; | ||
144 | rec->size = sizeof(struct bi_record); | ||
145 | rec = (struct bi_record *)((unsigned long)rec + rec->size); | ||
146 | } | ||
diff --git a/arch/ppc/boot/openfirmware/dummy.c b/arch/ppc/boot/openfirmware/dummy.c deleted file mode 100644 index 31dbf45bf99c..000000000000 --- a/arch/ppc/boot/openfirmware/dummy.c +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | int main(void) | ||
2 | { | ||
3 | return 0; | ||
4 | } | ||
diff --git a/arch/ppc/boot/openfirmware/misc.S b/arch/ppc/boot/openfirmware/misc.S deleted file mode 100644 index ab9e897cadd0..000000000000 --- a/arch/ppc/boot/openfirmware/misc.S +++ /dev/null | |||
@@ -1,67 +0,0 @@ | |||
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 | .text | ||
10 | |||
11 | /* | ||
12 | * Use the BAT2 & 3 registers to map the 1st 16MB of RAM to | ||
13 | * the address given as the 1st argument. | ||
14 | */ | ||
15 | .globl setup_bats | ||
16 | setup_bats: | ||
17 | mfpvr 5 | ||
18 | rlwinm 5,5,16,16,31 /* r3 = 1 for 601, 4 for 604 */ | ||
19 | cmpwi 0,5,1 | ||
20 | li 0,0 | ||
21 | bne 4f | ||
22 | mtibatl 3,0 /* invalidate BAT first */ | ||
23 | ori 3,3,4 /* set up BAT registers for 601 */ | ||
24 | li 4,0x7f | ||
25 | mtibatu 2,3 | ||
26 | mtibatl 2,4 | ||
27 | oris 3,3,0x80 | ||
28 | oris 4,4,0x80 | ||
29 | mtibatu 3,3 | ||
30 | mtibatl 3,4 | ||
31 | b 5f | ||
32 | 4: mtdbatu 3,0 /* invalidate BATs first */ | ||
33 | mtibatu 3,0 | ||
34 | ori 3,3,0xff /* set up BAT registers for 604 */ | ||
35 | li 4,2 | ||
36 | mtdbatl 2,4 | ||
37 | mtdbatu 2,3 | ||
38 | mtibatl 2,4 | ||
39 | mtibatu 2,3 | ||
40 | oris 3,3,0x80 | ||
41 | oris 4,4,0x80 | ||
42 | mtdbatl 3,4 | ||
43 | mtdbatu 3,3 | ||
44 | mtibatl 3,4 | ||
45 | mtibatu 3,3 | ||
46 | 5: sync | ||
47 | isync | ||
48 | blr | ||
49 | |||
50 | /* | ||
51 | * Flush the dcache and invalidate the icache for a range of addresses. | ||
52 | * | ||
53 | * flush_cache(addr, len) | ||
54 | */ | ||
55 | .global flush_cache | ||
56 | flush_cache: | ||
57 | addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */ | ||
58 | rlwinm. 4,4,27,5,31 | ||
59 | mtctr 4 | ||
60 | beqlr | ||
61 | 1: dcbf 0,3 | ||
62 | icbi 0,3 | ||
63 | addi 3,3,0x20 | ||
64 | bdnz 1b | ||
65 | sync | ||
66 | isync | ||
67 | blr | ||
diff --git a/arch/ppc/boot/openfirmware/start.c b/arch/ppc/boot/openfirmware/start.c deleted file mode 100644 index 1617a26956bf..000000000000 --- a/arch/ppc/boot/openfirmware/start.c +++ /dev/null | |||
@@ -1,172 +0,0 @@ | |||
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 "of1275.h" | ||
11 | |||
12 | extern int strlen(const char *s); | ||
13 | extern void boot(int a1, int a2, void *prom); | ||
14 | |||
15 | phandle stdin; | ||
16 | phandle stdout; | ||
17 | phandle stderr; | ||
18 | |||
19 | void printk(char *fmt, ...); | ||
20 | |||
21 | void | ||
22 | start(int a1, int a2, void *promptr) | ||
23 | { | ||
24 | ofinit(promptr); | ||
25 | if (ofstdio(&stdin, &stdout, &stderr)) | ||
26 | exit(); | ||
27 | |||
28 | boot(a1, a2, promptr); | ||
29 | for (;;) | ||
30 | exit(); | ||
31 | } | ||
32 | |||
33 | int writestring(void *f, char *ptr, int nb) | ||
34 | { | ||
35 | int w = 0, i; | ||
36 | char *ret = "\r"; | ||
37 | |||
38 | for (i = 0; i < nb; ++i) { | ||
39 | if (ptr[i] == '\n') { | ||
40 | if (i > w) { | ||
41 | write(f, ptr + w, i - w); | ||
42 | w = i; | ||
43 | } | ||
44 | write(f, ret, 1); | ||
45 | } | ||
46 | } | ||
47 | if (w < nb) | ||
48 | write(f, ptr + w, nb - w); | ||
49 | return nb; | ||
50 | } | ||
51 | |||
52 | int | ||
53 | putc(int c, void *f) | ||
54 | { | ||
55 | char ch = c; | ||
56 | |||
57 | return writestring(f, &ch, 1) == 1? c: -1; | ||
58 | } | ||
59 | |||
60 | int | ||
61 | putchar(int c) | ||
62 | { | ||
63 | return putc(c, stdout); | ||
64 | } | ||
65 | |||
66 | int | ||
67 | fputs(char *str, void *f) | ||
68 | { | ||
69 | int n = strlen(str); | ||
70 | |||
71 | return writestring(f, str, n) == n? 0: -1; | ||
72 | } | ||
73 | |||
74 | int | ||
75 | readchar(void) | ||
76 | { | ||
77 | char ch; | ||
78 | |||
79 | for (;;) { | ||
80 | switch (read(stdin, &ch, 1)) { | ||
81 | case 1: | ||
82 | return ch; | ||
83 | case -1: | ||
84 | printk("read(stdin) returned -1\n"); | ||
85 | return -1; | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | |||
90 | static char line[256]; | ||
91 | static char *lineptr; | ||
92 | static int lineleft; | ||
93 | |||
94 | int | ||
95 | getchar(void) | ||
96 | { | ||
97 | int c; | ||
98 | |||
99 | if (lineleft == 0) { | ||
100 | lineptr = line; | ||
101 | for (;;) { | ||
102 | c = readchar(); | ||
103 | if (c == -1 || c == 4) | ||
104 | break; | ||
105 | if (c == '\r' || c == '\n') { | ||
106 | *lineptr++ = '\n'; | ||
107 | putchar('\n'); | ||
108 | break; | ||
109 | } | ||
110 | switch (c) { | ||
111 | case 0177: | ||
112 | case '\b': | ||
113 | if (lineptr > line) { | ||
114 | putchar('\b'); | ||
115 | putchar(' '); | ||
116 | putchar('\b'); | ||
117 | --lineptr; | ||
118 | } | ||
119 | break; | ||
120 | case 'U' & 0x1F: | ||
121 | while (lineptr > line) { | ||
122 | putchar('\b'); | ||
123 | putchar(' '); | ||
124 | putchar('\b'); | ||
125 | --lineptr; | ||
126 | } | ||
127 | break; | ||
128 | default: | ||
129 | if (lineptr >= &line[sizeof(line) - 1]) | ||
130 | putchar('\a'); | ||
131 | else { | ||
132 | putchar(c); | ||
133 | *lineptr++ = c; | ||
134 | } | ||
135 | } | ||
136 | } | ||
137 | lineleft = lineptr - line; | ||
138 | lineptr = line; | ||
139 | } | ||
140 | if (lineleft == 0) | ||
141 | return -1; | ||
142 | --lineleft; | ||
143 | return *lineptr++; | ||
144 | } | ||
145 | |||
146 | extern int vsprintf(char *buf, const char *fmt, va_list args); | ||
147 | static char sprint_buf[1024]; | ||
148 | |||
149 | void | ||
150 | printk(char *fmt, ...) | ||
151 | { | ||
152 | va_list args; | ||
153 | int n; | ||
154 | |||
155 | va_start(args, fmt); | ||
156 | n = vsprintf(sprint_buf, fmt, args); | ||
157 | va_end(args); | ||
158 | writestring(stdout, sprint_buf, n); | ||
159 | } | ||
160 | |||
161 | int | ||
162 | printf(char *fmt, ...) | ||
163 | { | ||
164 | va_list args; | ||
165 | int n; | ||
166 | |||
167 | va_start(args, fmt); | ||
168 | n = vsprintf(sprint_buf, fmt, args); | ||
169 | va_end(args); | ||
170 | writestring(stdout, sprint_buf, n); | ||
171 | return n; | ||
172 | } | ||
diff --git a/arch/ppc/boot/simple/mpc10x_memory.c b/arch/ppc/boot/simple/mpc10x_memory.c index c24290823f7f..8da8f576031d 100644 --- a/arch/ppc/boot/simple/mpc10x_memory.c +++ b/arch/ppc/boot/simple/mpc10x_memory.c | |||
@@ -50,10 +50,10 @@ MPC10X_PCI_OP(read, dword, u32 *, in_le32, 0) | |||
50 | * the system. This assumes that the firmware has correctly set up the memory | 50 | * the system. This assumes that the firmware has correctly set up the memory |
51 | * controller registers. On CONFIG_PPC_PREP, we know we are being called | 51 | * controller registers. On CONFIG_PPC_PREP, we know we are being called |
52 | * under a PReP memory map. On all other machines, we assume we are under | 52 | * under a PReP memory map. On all other machines, we assume we are under |
53 | * a CHRP memory map. Further, on CONFIG_PPC_MULTIPLATFORM we must rename | 53 | * a CHRP memory map. Further, on CONFIG_PPC_PREP we must rename |
54 | * this function. | 54 | * this function. |
55 | */ | 55 | */ |
56 | #ifdef CONFIG_PPC_MULTIPLATFORM | 56 | #ifdef CONFIG_PPC_PREP |
57 | #define get_mem_size mpc10x_get_mem_size | 57 | #define get_mem_size mpc10x_get_mem_size |
58 | #endif | 58 | #endif |
59 | unsigned long | 59 | unsigned long |
diff --git a/arch/ppc/boot/simple/relocate.S b/arch/ppc/boot/simple/relocate.S index 7efddc507564..2533113c1cc5 100644 --- a/arch/ppc/boot/simple/relocate.S +++ b/arch/ppc/boot/simple/relocate.S | |||
@@ -194,7 +194,7 @@ start_ldr: | |||
194 | /* | 194 | /* |
195 | * Start at the begining. | 195 | * Start at the begining. |
196 | */ | 196 | */ |
197 | #ifdef CONFIG_PPC_MULTIPLATFORM | 197 | #ifdef CONFIG_PPC_PREP |
198 | li r9,0xc | 198 | li r9,0xc |
199 | mtlr r9 | 199 | mtlr r9 |
200 | /* tell kernel we're prep, by putting 0xdeadc0de at KERNELLOAD, | 200 | /* tell kernel we're prep, by putting 0xdeadc0de at KERNELLOAD, |
diff --git a/arch/ppc/boot/utils/addnote.c b/arch/ppc/boot/utils/addnote.c deleted file mode 100644 index 6c52b18f2d04..000000000000 --- a/arch/ppc/boot/utils/addnote.c +++ /dev/null | |||
@@ -1,175 +0,0 @@ | |||
1 | /* | ||
2 | * Program to hack in a PT_NOTE program header entry in an ELF file. | ||
3 | * This is needed for OF on RS/6000s to load an image correctly. | ||
4 | * Note that OF needs a program header entry for the note, not an | ||
5 | * ELF section. | ||
6 | * | ||
7 | * Copyright 2000 Paul Mackerras. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version | ||
12 | * 2 of the License, or (at your option) any later version. | ||
13 | * | ||
14 | * Usage: addnote zImage | ||
15 | */ | ||
16 | #include <stdio.h> | ||
17 | #include <stdlib.h> | ||
18 | #include <fcntl.h> | ||
19 | #include <unistd.h> | ||
20 | #include <string.h> | ||
21 | |||
22 | char arch[] = "PowerPC"; | ||
23 | |||
24 | #define N_DESCR 6 | ||
25 | unsigned int descr[N_DESCR] = { | ||
26 | #if 1 | ||
27 | /* values for IBM RS/6000 machines */ | ||
28 | 0xffffffff, /* real-mode = true */ | ||
29 | 0x00c00000, /* real-base, i.e. where we expect OF to be */ | ||
30 | 0xffffffff, /* real-size */ | ||
31 | 0xffffffff, /* virt-base */ | ||
32 | 0xffffffff, /* virt-size */ | ||
33 | 0x4000, /* load-base */ | ||
34 | #else | ||
35 | /* values for longtrail CHRP */ | ||
36 | 0, /* real-mode = false */ | ||
37 | 0xffffffff, /* real-base */ | ||
38 | 0xffffffff, /* real-size */ | ||
39 | 0xffffffff, /* virt-base */ | ||
40 | 0xffffffff, /* virt-size */ | ||
41 | 0x00600000, /* load-base */ | ||
42 | #endif | ||
43 | }; | ||
44 | |||
45 | unsigned char buf[512]; | ||
46 | |||
47 | #define GET_16BE(off) ((buf[off] << 8) + (buf[(off)+1])) | ||
48 | #define GET_32BE(off) ((GET_16BE(off) << 16) + GET_16BE((off)+2)) | ||
49 | |||
50 | #define PUT_16BE(off, v) (buf[off] = ((v) >> 8) & 0xff, \ | ||
51 | buf[(off) + 1] = (v) & 0xff) | ||
52 | #define PUT_32BE(off, v) (PUT_16BE((off), (v) >> 16), \ | ||
53 | PUT_16BE((off) + 2, (v))) | ||
54 | |||
55 | /* Structure of an ELF file */ | ||
56 | #define E_IDENT 0 /* ELF header */ | ||
57 | #define E_PHOFF 28 | ||
58 | #define E_PHENTSIZE 42 | ||
59 | #define E_PHNUM 44 | ||
60 | #define E_HSIZE 52 /* size of ELF header */ | ||
61 | |||
62 | #define EI_MAGIC 0 /* offsets in E_IDENT area */ | ||
63 | #define EI_CLASS 4 | ||
64 | #define EI_DATA 5 | ||
65 | |||
66 | #define PH_TYPE 0 /* ELF program header */ | ||
67 | #define PH_OFFSET 4 | ||
68 | #define PH_FILESZ 16 | ||
69 | #define PH_HSIZE 32 /* size of program header */ | ||
70 | |||
71 | #define PT_NOTE 4 /* Program header type = note */ | ||
72 | |||
73 | #define ELFCLASS32 1 | ||
74 | #define ELFDATA2MSB 2 | ||
75 | |||
76 | unsigned char elf_magic[4] = { 0x7f, 'E', 'L', 'F' }; | ||
77 | |||
78 | int main(int ac, char **av) | ||
79 | { | ||
80 | int fd, n, i; | ||
81 | int ph, ps, np; | ||
82 | int nnote, ns; | ||
83 | |||
84 | if (ac != 2) { | ||
85 | fprintf(stderr, "Usage: %s elf-file\n", av[0]); | ||
86 | exit(1); | ||
87 | } | ||
88 | fd = open(av[1], O_RDWR); | ||
89 | if (fd < 0) { | ||
90 | perror(av[1]); | ||
91 | exit(1); | ||
92 | } | ||
93 | |||
94 | nnote = strlen(arch) + 1 + (N_DESCR + 3) * 4; | ||
95 | |||
96 | n = read(fd, buf, sizeof(buf)); | ||
97 | if (n < 0) { | ||
98 | perror("read"); | ||
99 | exit(1); | ||
100 | } | ||
101 | |||
102 | if (n < E_HSIZE || memcmp(&buf[E_IDENT+EI_MAGIC], elf_magic, 4) != 0) | ||
103 | goto notelf; | ||
104 | |||
105 | if (buf[E_IDENT+EI_CLASS] != ELFCLASS32 | ||
106 | || buf[E_IDENT+EI_DATA] != ELFDATA2MSB) { | ||
107 | fprintf(stderr, "%s is not a big-endian 32-bit ELF image\n", | ||
108 | av[1]); | ||
109 | exit(1); | ||
110 | } | ||
111 | |||
112 | ph = GET_32BE(E_PHOFF); | ||
113 | ps = GET_16BE(E_PHENTSIZE); | ||
114 | np = GET_16BE(E_PHNUM); | ||
115 | if (ph < E_HSIZE || ps < PH_HSIZE || np < 1) | ||
116 | goto notelf; | ||
117 | if (ph + (np + 1) * ps + nnote > n) | ||
118 | goto nospace; | ||
119 | |||
120 | for (i = 0; i < np; ++i) { | ||
121 | if (GET_32BE(ph + PH_TYPE) == PT_NOTE) { | ||
122 | fprintf(stderr, "%s already has a note entry\n", | ||
123 | av[1]); | ||
124 | exit(0); | ||
125 | } | ||
126 | ph += ps; | ||
127 | } | ||
128 | |||
129 | /* XXX check that the area we want to use is all zeroes */ | ||
130 | for (i = 0; i < ps + nnote; ++i) | ||
131 | if (buf[ph + i] != 0) | ||
132 | goto nospace; | ||
133 | |||
134 | /* fill in the program header entry */ | ||
135 | ns = ph + ps; | ||
136 | PUT_32BE(ph + PH_TYPE, PT_NOTE); | ||
137 | PUT_32BE(ph + PH_OFFSET, ns); | ||
138 | PUT_32BE(ph + PH_FILESZ, nnote); | ||
139 | |||
140 | /* fill in the note area we point to */ | ||
141 | /* XXX we should probably make this a proper section */ | ||
142 | PUT_32BE(ns, strlen(arch) + 1); | ||
143 | PUT_32BE(ns + 4, N_DESCR * 4); | ||
144 | PUT_32BE(ns + 8, 0x1275); | ||
145 | strcpy(&buf[ns + 12], arch); | ||
146 | ns += 12 + strlen(arch) + 1; | ||
147 | for (i = 0; i < N_DESCR; ++i) | ||
148 | PUT_32BE(ns + i * 4, descr[i]); | ||
149 | |||
150 | /* Update the number of program headers */ | ||
151 | PUT_16BE(E_PHNUM, np + 1); | ||
152 | |||
153 | /* write back */ | ||
154 | lseek(fd, (long) 0, SEEK_SET); | ||
155 | i = write(fd, buf, n); | ||
156 | if (i < 0) { | ||
157 | perror("write"); | ||
158 | exit(1); | ||
159 | } | ||
160 | if (i < n) { | ||
161 | fprintf(stderr, "%s: write truncated\n", av[1]); | ||
162 | exit(1); | ||
163 | } | ||
164 | |||
165 | exit(0); | ||
166 | |||
167 | notelf: | ||
168 | fprintf(stderr, "%s does not appear to be an ELF file\n", av[0]); | ||
169 | exit(1); | ||
170 | |||
171 | nospace: | ||
172 | fprintf(stderr, "sorry, I can't find space in %s to put the note\n", | ||
173 | av[0]); | ||
174 | exit(1); | ||
175 | } | ||
diff --git a/arch/ppc/boot/utils/hack-coff.c b/arch/ppc/boot/utils/hack-coff.c deleted file mode 100644 index 5e5a6573a1ef..000000000000 --- a/arch/ppc/boot/utils/hack-coff.c +++ /dev/null | |||
@@ -1,84 +0,0 @@ | |||
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/ppc/boot/utils/mknote.c b/arch/ppc/boot/utils/mknote.c deleted file mode 100644 index b9fbb2cbfc8f..000000000000 --- a/arch/ppc/boot/utils/mknote.c +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) Cort Dougan 1999. | ||
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 | * Generate a note section as per the CHRP specification. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <stdio.h> | ||
14 | #include <string.h> | ||
15 | |||
16 | #define PL(x) printf("%c%c%c%c", ((x)>>24)&0xff, ((x)>>16)&0xff, ((x)>>8)&0xff, (x)&0xff ); | ||
17 | |||
18 | int main(void) | ||
19 | { | ||
20 | /* header */ | ||
21 | /* namesz */ | ||
22 | PL(strlen("PowerPC")+1); | ||
23 | /* descrsz */ | ||
24 | PL(6*4); | ||
25 | /* type */ | ||
26 | PL(0x1275); | ||
27 | /* name */ | ||
28 | printf("PowerPC"); printf("%c", 0); | ||
29 | |||
30 | /* descriptor */ | ||
31 | /* real-mode */ | ||
32 | PL(0xffffffff); | ||
33 | /* real-base */ | ||
34 | PL(0x00c00000); | ||
35 | /* real-size */ | ||
36 | PL(0xffffffff); | ||
37 | /* virt-base */ | ||
38 | PL(0xffffffff); | ||
39 | /* virt-size */ | ||
40 | PL(0xffffffff); | ||
41 | /* load-base */ | ||
42 | PL(0x4000); | ||
43 | return 0; | ||
44 | } | ||
diff --git a/arch/ppc/configs/ibmchrp_defconfig b/arch/ppc/configs/ibmchrp_defconfig deleted file mode 100644 index 27f3e69c1f96..000000000000 --- a/arch/ppc/configs/ibmchrp_defconfig +++ /dev/null | |||
@@ -1,875 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # | ||
4 | CONFIG_MMU=y | ||
5 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
6 | CONFIG_HAVE_DEC_LOCK=y | ||
7 | CONFIG_PPC=y | ||
8 | CONFIG_PPC32=y | ||
9 | CONFIG_GENERIC_NVRAM=y | ||
10 | |||
11 | # | ||
12 | # Code maturity level options | ||
13 | # | ||
14 | CONFIG_EXPERIMENTAL=y | ||
15 | CONFIG_CLEAN_COMPILE=y | ||
16 | # CONFIG_STANDALONE is not set | ||
17 | CONFIG_BROKEN_ON_SMP=y | ||
18 | |||
19 | # | ||
20 | # General setup | ||
21 | # | ||
22 | CONFIG_SWAP=y | ||
23 | CONFIG_SYSVIPC=y | ||
24 | CONFIG_POSIX_MQUEUE=y | ||
25 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
26 | CONFIG_SYSCTL=y | ||
27 | # CONFIG_AUDIT is not set | ||
28 | CONFIG_LOG_BUF_SHIFT=14 | ||
29 | # CONFIG_HOTPLUG is not set | ||
30 | CONFIG_IKCONFIG=y | ||
31 | CONFIG_IKCONFIG_PROC=y | ||
32 | # CONFIG_EMBEDDED is not set | ||
33 | CONFIG_KALLSYMS=y | ||
34 | CONFIG_FUTEX=y | ||
35 | CONFIG_EPOLL=y | ||
36 | CONFIG_IOSCHED_NOOP=y | ||
37 | CONFIG_IOSCHED_AS=y | ||
38 | CONFIG_IOSCHED_DEADLINE=y | ||
39 | CONFIG_IOSCHED_CFQ=y | ||
40 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
41 | |||
42 | # | ||
43 | # Loadable module support | ||
44 | # | ||
45 | CONFIG_MODULES=y | ||
46 | CONFIG_MODULE_UNLOAD=y | ||
47 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
48 | CONFIG_OBSOLETE_MODPARM=y | ||
49 | # CONFIG_MODVERSIONS is not set | ||
50 | CONFIG_KMOD=y | ||
51 | |||
52 | # | ||
53 | # Processor | ||
54 | # | ||
55 | CONFIG_6xx=y | ||
56 | # CONFIG_40x is not set | ||
57 | # CONFIG_44x is not set | ||
58 | # CONFIG_POWER3 is not set | ||
59 | # CONFIG_POWER4 is not set | ||
60 | # CONFIG_8xx is not set | ||
61 | # CONFIG_ALTIVEC is not set | ||
62 | # CONFIG_TAU is not set | ||
63 | # CONFIG_CPU_FREQ is not set | ||
64 | # CONFIG_PPC601_SYNC_FIX is not set | ||
65 | CONFIG_PPC_STD_MMU=y | ||
66 | |||
67 | # | ||
68 | # Platform options | ||
69 | # | ||
70 | CONFIG_PPC_MULTIPLATFORM=y | ||
71 | # CONFIG_APUS is not set | ||
72 | # CONFIG_WILLOW is not set | ||
73 | # CONFIG_PCORE is not set | ||
74 | # CONFIG_POWERPMC250 is not set | ||
75 | # CONFIG_EV64260 is not set | ||
76 | # CONFIG_SPRUCE is not set | ||
77 | # CONFIG_LOPEC is not set | ||
78 | # CONFIG_MCPN765 is not set | ||
79 | # CONFIG_MVME5100 is not set | ||
80 | # CONFIG_PPLUS is not set | ||
81 | # CONFIG_PRPMC750 is not set | ||
82 | # CONFIG_PRPMC800 is not set | ||
83 | # CONFIG_SANDPOINT is not set | ||
84 | # CONFIG_ADIR is not set | ||
85 | # CONFIG_K2 is not set | ||
86 | # CONFIG_PAL4 is not set | ||
87 | # CONFIG_GEMINI is not set | ||
88 | # CONFIG_EST8260 is not set | ||
89 | # CONFIG_SBS8260 is not set | ||
90 | # CONFIG_RPX6 is not set | ||
91 | # CONFIG_TQM8260 is not set | ||
92 | CONFIG_PPC_CHRP=y | ||
93 | CONFIG_PPC_PMAC=y | ||
94 | CONFIG_PPC_PREP=y | ||
95 | CONFIG_PPC_OF=y | ||
96 | CONFIG_PPCBUG_NVRAM=y | ||
97 | # CONFIG_SMP is not set | ||
98 | # CONFIG_PREEMPT is not set | ||
99 | CONFIG_HIGHMEM=y | ||
100 | CONFIG_KERNEL_ELF=y | ||
101 | CONFIG_BINFMT_ELF=y | ||
102 | CONFIG_BINFMT_MISC=y | ||
103 | CONFIG_PROC_DEVICETREE=y | ||
104 | CONFIG_PPC_RTAS=y | ||
105 | # CONFIG_PREP_RESIDUAL is not set | ||
106 | # CONFIG_CMDLINE_BOOL is not set | ||
107 | |||
108 | # | ||
109 | # Bus options | ||
110 | # | ||
111 | CONFIG_ISA=y | ||
112 | CONFIG_GENERIC_ISA_DMA=y | ||
113 | CONFIG_PCI=y | ||
114 | CONFIG_PCI_DOMAINS=y | ||
115 | CONFIG_PCI_LEGACY_PROC=y | ||
116 | CONFIG_PCI_NAMES=y | ||
117 | |||
118 | # | ||
119 | # Advanced setup | ||
120 | # | ||
121 | # CONFIG_ADVANCED_OPTIONS is not set | ||
122 | |||
123 | # | ||
124 | # Default settings for advanced configuration options are used | ||
125 | # | ||
126 | CONFIG_HIGHMEM_START=0xfe000000 | ||
127 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
128 | CONFIG_KERNEL_START=0xc0000000 | ||
129 | CONFIG_TASK_SIZE=0x80000000 | ||
130 | CONFIG_BOOT_LOAD=0x00800000 | ||
131 | |||
132 | # | ||
133 | # Device Drivers | ||
134 | # | ||
135 | |||
136 | # | ||
137 | # Generic Driver Options | ||
138 | # | ||
139 | |||
140 | # | ||
141 | # Memory Technology Devices (MTD) | ||
142 | # | ||
143 | # CONFIG_MTD is not set | ||
144 | |||
145 | # | ||
146 | # Parallel port support | ||
147 | # | ||
148 | # CONFIG_PARPORT is not set | ||
149 | |||
150 | # | ||
151 | # Plug and Play support | ||
152 | # | ||
153 | # CONFIG_PNP is not set | ||
154 | |||
155 | # | ||
156 | # Block devices | ||
157 | # | ||
158 | CONFIG_BLK_DEV_FD=y | ||
159 | # CONFIG_BLK_DEV_XD is not set | ||
160 | # CONFIG_BLK_CPQ_DA is not set | ||
161 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
162 | # CONFIG_BLK_DEV_DAC960 is not set | ||
163 | # CONFIG_BLK_DEV_UMEM is not set | ||
164 | CONFIG_BLK_DEV_LOOP=y | ||
165 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
166 | # CONFIG_BLK_DEV_NBD is not set | ||
167 | # CONFIG_BLK_DEV_CARMEL is not set | ||
168 | CONFIG_BLK_DEV_RAM=y | ||
169 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
170 | CONFIG_BLK_DEV_INITRD=y | ||
171 | CONFIG_LBD=y | ||
172 | |||
173 | # | ||
174 | # ATA/ATAPI/MFM/RLL support | ||
175 | # | ||
176 | # CONFIG_IDE is not set | ||
177 | |||
178 | # | ||
179 | # SCSI device support | ||
180 | # | ||
181 | CONFIG_SCSI=y | ||
182 | CONFIG_SCSI_PROC_FS=y | ||
183 | |||
184 | # | ||
185 | # SCSI support type (disk, tape, CD-ROM) | ||
186 | # | ||
187 | CONFIG_BLK_DEV_SD=y | ||
188 | CONFIG_CHR_DEV_ST=y | ||
189 | # CONFIG_CHR_DEV_OSST is not set | ||
190 | CONFIG_BLK_DEV_SR=y | ||
191 | CONFIG_BLK_DEV_SR_VENDOR=y | ||
192 | CONFIG_CHR_DEV_SG=y | ||
193 | |||
194 | # | ||
195 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
196 | # | ||
197 | # CONFIG_SCSI_MULTI_LUN is not set | ||
198 | # CONFIG_SCSI_REPORT_LUNS is not set | ||
199 | CONFIG_SCSI_CONSTANTS=y | ||
200 | # CONFIG_SCSI_LOGGING is not set | ||
201 | |||
202 | # | ||
203 | # SCSI Transport Attributes | ||
204 | # | ||
205 | CONFIG_SCSI_SPI_ATTRS=y | ||
206 | # CONFIG_SCSI_FC_ATTRS is not set | ||
207 | |||
208 | # | ||
209 | # SCSI low-level drivers | ||
210 | # | ||
211 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
212 | # CONFIG_SCSI_7000FASST is not set | ||
213 | # CONFIG_SCSI_ACARD is not set | ||
214 | # CONFIG_SCSI_AHA152X is not set | ||
215 | # CONFIG_SCSI_AHA1542 is not set | ||
216 | # CONFIG_SCSI_AACRAID is not set | ||
217 | # CONFIG_SCSI_AIC7XXX is not set | ||
218 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
219 | # CONFIG_SCSI_AIC79XX is not set | ||
220 | # CONFIG_SCSI_ADVANSYS is not set | ||
221 | # CONFIG_SCSI_IN2000 is not set | ||
222 | # CONFIG_SCSI_MEGARAID is not set | ||
223 | # CONFIG_SCSI_SATA is not set | ||
224 | # CONFIG_SCSI_BUSLOGIC is not set | ||
225 | # CONFIG_SCSI_CPQFCTS is not set | ||
226 | # CONFIG_SCSI_DMX3191D is not set | ||
227 | # CONFIG_SCSI_DTC3280 is not set | ||
228 | # CONFIG_SCSI_EATA is not set | ||
229 | # CONFIG_SCSI_EATA_PIO is not set | ||
230 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
231 | # CONFIG_SCSI_GDTH is not set | ||
232 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
233 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
234 | # CONFIG_SCSI_IPS is not set | ||
235 | # CONFIG_SCSI_INIA100 is not set | ||
236 | # CONFIG_SCSI_NCR53C406A is not set | ||
237 | CONFIG_SCSI_SYM53C8XX_2=y | ||
238 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 | ||
239 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | ||
240 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | ||
241 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | ||
242 | # CONFIG_SCSI_IPR is not set | ||
243 | # CONFIG_SCSI_PAS16 is not set | ||
244 | # CONFIG_SCSI_PSI240I is not set | ||
245 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
246 | # CONFIG_SCSI_QLOGIC_ISP is not set | ||
247 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
248 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
249 | CONFIG_SCSI_QLA2XXX=y | ||
250 | # CONFIG_SCSI_QLA21XX is not set | ||
251 | # CONFIG_SCSI_QLA22XX is not set | ||
252 | # CONFIG_SCSI_QLA2300 is not set | ||
253 | # CONFIG_SCSI_QLA2322 is not set | ||
254 | # CONFIG_SCSI_QLA6312 is not set | ||
255 | # CONFIG_SCSI_QLA6322 is not set | ||
256 | # CONFIG_SCSI_SYM53C416 is not set | ||
257 | # CONFIG_SCSI_DC395x is not set | ||
258 | # CONFIG_SCSI_DC390T is not set | ||
259 | # CONFIG_SCSI_T128 is not set | ||
260 | # CONFIG_SCSI_U14_34F is not set | ||
261 | # CONFIG_SCSI_NSP32 is not set | ||
262 | # CONFIG_SCSI_DEBUG is not set | ||
263 | # CONFIG_SCSI_MESH is not set | ||
264 | # CONFIG_SCSI_MAC53C94 is not set | ||
265 | |||
266 | # | ||
267 | # Old CD-ROM drivers (not SCSI, not IDE) | ||
268 | # | ||
269 | # CONFIG_CD_NO_IDESCSI is not set | ||
270 | |||
271 | # | ||
272 | # Multi-device support (RAID and LVM) | ||
273 | # | ||
274 | # CONFIG_MD is not set | ||
275 | |||
276 | # | ||
277 | # Fusion MPT device support | ||
278 | # | ||
279 | # CONFIG_FUSION is not set | ||
280 | |||
281 | # | ||
282 | # IEEE 1394 (FireWire) support | ||
283 | # | ||
284 | # CONFIG_IEEE1394 is not set | ||
285 | |||
286 | # | ||
287 | # I2O device support | ||
288 | # | ||
289 | # CONFIG_I2O is not set | ||
290 | |||
291 | # | ||
292 | # Macintosh device drivers | ||
293 | # | ||
294 | # CONFIG_ADB is not set | ||
295 | # CONFIG_ADB_CUDA is not set | ||
296 | # CONFIG_ADB_PMU is not set | ||
297 | # CONFIG_MAC_FLOPPY is not set | ||
298 | # CONFIG_MAC_SERIAL is not set | ||
299 | |||
300 | # | ||
301 | # Networking support | ||
302 | # | ||
303 | CONFIG_NET=y | ||
304 | |||
305 | # | ||
306 | # Networking options | ||
307 | # | ||
308 | CONFIG_PACKET=y | ||
309 | # CONFIG_PACKET_MMAP is not set | ||
310 | # CONFIG_NETLINK_DEV is not set | ||
311 | CONFIG_UNIX=y | ||
312 | # CONFIG_NET_KEY is not set | ||
313 | CONFIG_INET=y | ||
314 | CONFIG_IP_MULTICAST=y | ||
315 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
316 | # CONFIG_IP_PNP is not set | ||
317 | # CONFIG_NET_IPIP is not set | ||
318 | # CONFIG_NET_IPGRE is not set | ||
319 | # CONFIG_IP_MROUTE is not set | ||
320 | # CONFIG_ARPD is not set | ||
321 | CONFIG_SYN_COOKIES=y | ||
322 | # CONFIG_INET_AH is not set | ||
323 | # CONFIG_INET_ESP is not set | ||
324 | # CONFIG_INET_IPCOMP is not set | ||
325 | |||
326 | # | ||
327 | # IP: Virtual Server Configuration | ||
328 | # | ||
329 | # CONFIG_IP_VS is not set | ||
330 | # CONFIG_IPV6 is not set | ||
331 | CONFIG_NETFILTER=y | ||
332 | # CONFIG_NETFILTER_DEBUG is not set | ||
333 | |||
334 | # | ||
335 | # IP: Netfilter Configuration | ||
336 | # | ||
337 | CONFIG_IP_NF_CONNTRACK=m | ||
338 | CONFIG_IP_NF_FTP=m | ||
339 | CONFIG_IP_NF_IRC=m | ||
340 | CONFIG_IP_NF_TFTP=m | ||
341 | CONFIG_IP_NF_AMANDA=m | ||
342 | # CONFIG_IP_NF_QUEUE is not set | ||
343 | CONFIG_IP_NF_IPTABLES=m | ||
344 | CONFIG_IP_NF_MATCH_LIMIT=m | ||
345 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
346 | CONFIG_IP_NF_MATCH_MAC=m | ||
347 | # CONFIG_IP_NF_MATCH_PKTTYPE is not set | ||
348 | CONFIG_IP_NF_MATCH_MARK=m | ||
349 | CONFIG_IP_NF_MATCH_MULTIPORT=m | ||
350 | CONFIG_IP_NF_MATCH_TOS=m | ||
351 | CONFIG_IP_NF_MATCH_RECENT=m | ||
352 | CONFIG_IP_NF_MATCH_ECN=m | ||
353 | CONFIG_IP_NF_MATCH_DSCP=m | ||
354 | CONFIG_IP_NF_MATCH_AH_ESP=m | ||
355 | CONFIG_IP_NF_MATCH_LENGTH=m | ||
356 | CONFIG_IP_NF_MATCH_TTL=m | ||
357 | CONFIG_IP_NF_MATCH_TCPMSS=m | ||
358 | CONFIG_IP_NF_MATCH_HELPER=m | ||
359 | CONFIG_IP_NF_MATCH_STATE=m | ||
360 | CONFIG_IP_NF_MATCH_CONNTRACK=m | ||
361 | CONFIG_IP_NF_MATCH_OWNER=m | ||
362 | CONFIG_IP_NF_FILTER=m | ||
363 | CONFIG_IP_NF_TARGET_REJECT=m | ||
364 | CONFIG_IP_NF_NAT=m | ||
365 | CONFIG_IP_NF_NAT_NEEDED=y | ||
366 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
367 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
368 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
369 | CONFIG_IP_NF_TARGET_SAME=m | ||
370 | CONFIG_IP_NF_NAT_SNMP_BASIC=m | ||
371 | CONFIG_IP_NF_NAT_IRC=m | ||
372 | CONFIG_IP_NF_NAT_FTP=m | ||
373 | CONFIG_IP_NF_NAT_TFTP=m | ||
374 | CONFIG_IP_NF_NAT_AMANDA=m | ||
375 | # CONFIG_IP_NF_MANGLE is not set | ||
376 | # CONFIG_IP_NF_TARGET_LOG is not set | ||
377 | CONFIG_IP_NF_TARGET_ULOG=m | ||
378 | CONFIG_IP_NF_TARGET_TCPMSS=m | ||
379 | CONFIG_IP_NF_ARPTABLES=m | ||
380 | CONFIG_IP_NF_ARPFILTER=m | ||
381 | CONFIG_IP_NF_ARP_MANGLE=m | ||
382 | CONFIG_IP_NF_COMPAT_IPCHAINS=m | ||
383 | # CONFIG_IP_NF_COMPAT_IPFWADM is not set | ||
384 | CONFIG_IP_NF_TARGET_NOTRACK=m | ||
385 | CONFIG_IP_NF_RAW=m | ||
386 | |||
387 | # | ||
388 | # SCTP Configuration (EXPERIMENTAL) | ||
389 | # | ||
390 | # CONFIG_IP_SCTP is not set | ||
391 | # CONFIG_ATM is not set | ||
392 | # CONFIG_BRIDGE is not set | ||
393 | # CONFIG_VLAN_8021Q is not set | ||
394 | # CONFIG_DECNET is not set | ||
395 | # CONFIG_LLC2 is not set | ||
396 | # CONFIG_IPX is not set | ||
397 | # CONFIG_ATALK is not set | ||
398 | # CONFIG_X25 is not set | ||
399 | # CONFIG_LAPB is not set | ||
400 | # CONFIG_NET_DIVERT is not set | ||
401 | # CONFIG_ECONET is not set | ||
402 | # CONFIG_WAN_ROUTER is not set | ||
403 | # CONFIG_NET_HW_FLOWCONTROL is not set | ||
404 | |||
405 | # | ||
406 | # QoS and/or fair queueing | ||
407 | # | ||
408 | # CONFIG_NET_SCHED is not set | ||
409 | |||
410 | # | ||
411 | # Network testing | ||
412 | # | ||
413 | # CONFIG_NET_PKTGEN is not set | ||
414 | # CONFIG_NETPOLL is not set | ||
415 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
416 | # CONFIG_HAMRADIO is not set | ||
417 | # CONFIG_IRDA is not set | ||
418 | # CONFIG_BT is not set | ||
419 | CONFIG_NETDEVICES=y | ||
420 | # CONFIG_DUMMY is not set | ||
421 | # CONFIG_BONDING is not set | ||
422 | # CONFIG_EQUALIZER is not set | ||
423 | # CONFIG_TUN is not set | ||
424 | |||
425 | # | ||
426 | # ARCnet devices | ||
427 | # | ||
428 | # CONFIG_ARCNET is not set | ||
429 | |||
430 | # | ||
431 | # Ethernet (10 or 100Mbit) | ||
432 | # | ||
433 | CONFIG_NET_ETHERNET=y | ||
434 | CONFIG_MII=y | ||
435 | # CONFIG_MACE is not set | ||
436 | # CONFIG_BMAC is not set | ||
437 | # CONFIG_OAKNET is not set | ||
438 | # CONFIG_HAPPYMEAL is not set | ||
439 | # CONFIG_SUNGEM is not set | ||
440 | # CONFIG_NET_VENDOR_3COM is not set | ||
441 | # CONFIG_LANCE is not set | ||
442 | # CONFIG_NET_VENDOR_SMC is not set | ||
443 | # CONFIG_NET_VENDOR_RACAL is not set | ||
444 | |||
445 | # | ||
446 | # Tulip family network device support | ||
447 | # | ||
448 | # CONFIG_NET_TULIP is not set | ||
449 | # CONFIG_AT1700 is not set | ||
450 | # CONFIG_DEPCA is not set | ||
451 | # CONFIG_HP100 is not set | ||
452 | # CONFIG_NET_ISA is not set | ||
453 | CONFIG_NET_PCI=y | ||
454 | CONFIG_PCNET32=y | ||
455 | # CONFIG_AMD8111_ETH is not set | ||
456 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
457 | # CONFIG_AC3200 is not set | ||
458 | # CONFIG_APRICOT is not set | ||
459 | # CONFIG_B44 is not set | ||
460 | # CONFIG_FORCEDETH is not set | ||
461 | # CONFIG_CS89x0 is not set | ||
462 | # CONFIG_DGRS is not set | ||
463 | # CONFIG_EEPRO100 is not set | ||
464 | # CONFIG_E100 is not set | ||
465 | # CONFIG_FEALNX is not set | ||
466 | # CONFIG_NATSEMI is not set | ||
467 | # CONFIG_NE2K_PCI is not set | ||
468 | # CONFIG_8139CP is not set | ||
469 | # CONFIG_8139TOO is not set | ||
470 | # CONFIG_SIS900 is not set | ||
471 | # CONFIG_EPIC100 is not set | ||
472 | # CONFIG_SUNDANCE is not set | ||
473 | # CONFIG_TLAN is not set | ||
474 | # CONFIG_VIA_RHINE is not set | ||
475 | # CONFIG_NET_POCKET is not set | ||
476 | |||
477 | # | ||
478 | # Ethernet (1000 Mbit) | ||
479 | # | ||
480 | # CONFIG_ACENIC is not set | ||
481 | # CONFIG_DL2K is not set | ||
482 | # CONFIG_E1000 is not set | ||
483 | # CONFIG_NS83820 is not set | ||
484 | # CONFIG_HAMACHI is not set | ||
485 | # CONFIG_YELLOWFIN is not set | ||
486 | # CONFIG_R8169 is not set | ||
487 | # CONFIG_SK98LIN is not set | ||
488 | # CONFIG_TIGON3 is not set | ||
489 | |||
490 | # | ||
491 | # Ethernet (10000 Mbit) | ||
492 | # | ||
493 | # CONFIG_IXGB is not set | ||
494 | # CONFIG_S2IO is not set | ||
495 | |||
496 | # | ||
497 | # Token Ring devices | ||
498 | # | ||
499 | # CONFIG_TR is not set | ||
500 | |||
501 | # | ||
502 | # Wireless LAN (non-hamradio) | ||
503 | # | ||
504 | # CONFIG_NET_RADIO is not set | ||
505 | |||
506 | # | ||
507 | # Wan interfaces | ||
508 | # | ||
509 | # CONFIG_WAN is not set | ||
510 | # CONFIG_FDDI is not set | ||
511 | # CONFIG_HIPPI is not set | ||
512 | # CONFIG_PPP is not set | ||
513 | # CONFIG_SLIP is not set | ||
514 | # CONFIG_NET_FC is not set | ||
515 | # CONFIG_RCPCI is not set | ||
516 | # CONFIG_SHAPER is not set | ||
517 | # CONFIG_NETCONSOLE is not set | ||
518 | |||
519 | # | ||
520 | # ISDN subsystem | ||
521 | # | ||
522 | # CONFIG_ISDN is not set | ||
523 | |||
524 | # | ||
525 | # Telephony Support | ||
526 | # | ||
527 | # CONFIG_PHONE is not set | ||
528 | |||
529 | # | ||
530 | # Input device support | ||
531 | # | ||
532 | CONFIG_INPUT=y | ||
533 | |||
534 | # | ||
535 | # Userland interfaces | ||
536 | # | ||
537 | CONFIG_INPUT_MOUSEDEV=y | ||
538 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
539 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
540 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
541 | # CONFIG_INPUT_JOYDEV is not set | ||
542 | # CONFIG_INPUT_TSDEV is not set | ||
543 | CONFIG_INPUT_EVDEV=y | ||
544 | # CONFIG_INPUT_EVBUG is not set | ||
545 | |||
546 | # | ||
547 | # Input I/O drivers | ||
548 | # | ||
549 | # CONFIG_GAMEPORT is not set | ||
550 | CONFIG_SOUND_GAMEPORT=y | ||
551 | CONFIG_SERIO=y | ||
552 | CONFIG_SERIO_I8042=y | ||
553 | CONFIG_SERIO_SERPORT=y | ||
554 | # CONFIG_SERIO_CT82C710 is not set | ||
555 | # CONFIG_SERIO_PCIPS2 is not set | ||
556 | |||
557 | # | ||
558 | # Input Device Drivers | ||
559 | # | ||
560 | CONFIG_INPUT_KEYBOARD=y | ||
561 | CONFIG_KEYBOARD_ATKBD=y | ||
562 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
563 | # CONFIG_KEYBOARD_LKKBD is not set | ||
564 | # CONFIG_KEYBOARD_XTKBD is not set | ||
565 | # CONFIG_KEYBOARD_NEWTON is not set | ||
566 | CONFIG_INPUT_MOUSE=y | ||
567 | CONFIG_MOUSE_PS2=y | ||
568 | # CONFIG_MOUSE_SERIAL is not set | ||
569 | # CONFIG_MOUSE_INPORT is not set | ||
570 | # CONFIG_MOUSE_LOGIBM is not set | ||
571 | # CONFIG_MOUSE_PC110PAD is not set | ||
572 | # CONFIG_MOUSE_VSXXXAA is not set | ||
573 | # CONFIG_INPUT_JOYSTICK is not set | ||
574 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
575 | CONFIG_INPUT_MISC=y | ||
576 | CONFIG_INPUT_UINPUT=y | ||
577 | |||
578 | # | ||
579 | # Character devices | ||
580 | # | ||
581 | CONFIG_VT=y | ||
582 | CONFIG_VT_CONSOLE=y | ||
583 | CONFIG_HW_CONSOLE=y | ||
584 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
585 | |||
586 | # | ||
587 | # Serial drivers | ||
588 | # | ||
589 | CONFIG_SERIAL_8250=y | ||
590 | # CONFIG_SERIAL_8250_CONSOLE is not set | ||
591 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
592 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
593 | |||
594 | # | ||
595 | # Non-8250 serial port support | ||
596 | # | ||
597 | CONFIG_SERIAL_CORE=y | ||
598 | # CONFIG_SERIAL_PMACZILOG is not set | ||
599 | CONFIG_UNIX98_PTYS=y | ||
600 | CONFIG_LEGACY_PTYS=y | ||
601 | CONFIG_LEGACY_PTY_COUNT=256 | ||
602 | # CONFIG_QIC02_TAPE is not set | ||
603 | |||
604 | # | ||
605 | # IPMI | ||
606 | # | ||
607 | # CONFIG_IPMI_HANDLER is not set | ||
608 | |||
609 | # | ||
610 | # Watchdog Cards | ||
611 | # | ||
612 | # CONFIG_WATCHDOG is not set | ||
613 | CONFIG_NVRAM=y | ||
614 | CONFIG_GEN_RTC=y | ||
615 | # CONFIG_GEN_RTC_X is not set | ||
616 | # CONFIG_DTLK is not set | ||
617 | # CONFIG_R3964 is not set | ||
618 | # CONFIG_APPLICOM is not set | ||
619 | |||
620 | # | ||
621 | # Ftape, the floppy tape device driver | ||
622 | # | ||
623 | # CONFIG_FTAPE is not set | ||
624 | # CONFIG_AGP is not set | ||
625 | # CONFIG_DRM is not set | ||
626 | # CONFIG_RAW_DRIVER is not set | ||
627 | |||
628 | # | ||
629 | # I2C support | ||
630 | # | ||
631 | # CONFIG_I2C is not set | ||
632 | |||
633 | # | ||
634 | # Misc devices | ||
635 | # | ||
636 | |||
637 | # | ||
638 | # Multimedia devices | ||
639 | # | ||
640 | # CONFIG_VIDEO_DEV is not set | ||
641 | |||
642 | # | ||
643 | # Digital Video Broadcasting Devices | ||
644 | # | ||
645 | # CONFIG_DVB is not set | ||
646 | |||
647 | # | ||
648 | # Graphics support | ||
649 | # | ||
650 | CONFIG_FB=y | ||
651 | # CONFIG_FB_PM2 is not set | ||
652 | # CONFIG_FB_CYBER2000 is not set | ||
653 | CONFIG_FB_OF=y | ||
654 | # CONFIG_FB_CONTROL is not set | ||
655 | # CONFIG_FB_PLATINUM is not set | ||
656 | # CONFIG_FB_VALKYRIE is not set | ||
657 | # CONFIG_FB_CT65550 is not set | ||
658 | # CONFIG_FB_IMSTT is not set | ||
659 | # CONFIG_FB_S3TRIO is not set | ||
660 | # CONFIG_FB_VGA16 is not set | ||
661 | # CONFIG_FB_RIVA is not set | ||
662 | CONFIG_FB_MATROX=y | ||
663 | CONFIG_FB_MATROX_MILLENIUM=y | ||
664 | CONFIG_FB_MATROX_MYSTIQUE=y | ||
665 | # CONFIG_FB_MATROX_G450 is not set | ||
666 | CONFIG_FB_MATROX_G100A=y | ||
667 | CONFIG_FB_MATROX_G100=y | ||
668 | # CONFIG_FB_MATROX_MULTIHEAD is not set | ||
669 | # CONFIG_FB_RADEON_OLD is not set | ||
670 | # CONFIG_FB_RADEON is not set | ||
671 | # CONFIG_FB_ATY128 is not set | ||
672 | # CONFIG_FB_ATY is not set | ||
673 | # CONFIG_FB_SIS is not set | ||
674 | # CONFIG_FB_NEOMAGIC is not set | ||
675 | # CONFIG_FB_KYRO is not set | ||
676 | CONFIG_FB_3DFX=y | ||
677 | # CONFIG_FB_VOODOO1 is not set | ||
678 | # CONFIG_FB_TRIDENT is not set | ||
679 | # CONFIG_FB_VIRTUAL is not set | ||
680 | |||
681 | # | ||
682 | # Console display driver support | ||
683 | # | ||
684 | CONFIG_VGA_CONSOLE=y | ||
685 | # CONFIG_MDA_CONSOLE is not set | ||
686 | CONFIG_DUMMY_CONSOLE=y | ||
687 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
688 | CONFIG_PCI_CONSOLE=y | ||
689 | # CONFIG_FONTS is not set | ||
690 | CONFIG_FONT_8x8=y | ||
691 | CONFIG_FONT_8x16=y | ||
692 | |||
693 | # | ||
694 | # Logo configuration | ||
695 | # | ||
696 | CONFIG_LOGO=y | ||
697 | CONFIG_LOGO_LINUX_MONO=y | ||
698 | CONFIG_LOGO_LINUX_VGA16=y | ||
699 | CONFIG_LOGO_LINUX_CLUT224=y | ||
700 | |||
701 | # | ||
702 | # Sound | ||
703 | # | ||
704 | # CONFIG_SOUND is not set | ||
705 | |||
706 | # | ||
707 | # USB support | ||
708 | # | ||
709 | # CONFIG_USB is not set | ||
710 | |||
711 | # | ||
712 | # USB Gadget Support | ||
713 | # | ||
714 | # CONFIG_USB_GADGET is not set | ||
715 | |||
716 | # | ||
717 | # File systems | ||
718 | # | ||
719 | CONFIG_EXT2_FS=y | ||
720 | # CONFIG_EXT2_FS_XATTR is not set | ||
721 | # CONFIG_EXT3_FS is not set | ||
722 | # CONFIG_JBD is not set | ||
723 | # CONFIG_REISERFS_FS is not set | ||
724 | # CONFIG_JFS_FS is not set | ||
725 | # CONFIG_XFS_FS is not set | ||
726 | # CONFIG_MINIX_FS is not set | ||
727 | # CONFIG_ROMFS_FS is not set | ||
728 | # CONFIG_QUOTA is not set | ||
729 | # CONFIG_AUTOFS_FS is not set | ||
730 | # CONFIG_AUTOFS4_FS is not set | ||
731 | |||
732 | # | ||
733 | # CD-ROM/DVD Filesystems | ||
734 | # | ||
735 | CONFIG_ISO9660_FS=y | ||
736 | # CONFIG_JOLIET is not set | ||
737 | # CONFIG_ZISOFS is not set | ||
738 | # CONFIG_UDF_FS is not set | ||
739 | |||
740 | # | ||
741 | # DOS/FAT/NT Filesystems | ||
742 | # | ||
743 | CONFIG_FAT_FS=m | ||
744 | CONFIG_MSDOS_FS=m | ||
745 | CONFIG_VFAT_FS=m | ||
746 | # CONFIG_NTFS_FS is not set | ||
747 | |||
748 | # | ||
749 | # Pseudo filesystems | ||
750 | # | ||
751 | CONFIG_PROC_FS=y | ||
752 | CONFIG_PROC_KCORE=y | ||
753 | CONFIG_SYSFS=y | ||
754 | CONFIG_DEVFS_FS=y | ||
755 | # CONFIG_DEVFS_MOUNT is not set | ||
756 | # CONFIG_DEVFS_DEBUG is not set | ||
757 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
758 | CONFIG_TMPFS=y | ||
759 | # CONFIG_HUGETLB_PAGE is not set | ||
760 | CONFIG_RAMFS=y | ||
761 | |||
762 | # | ||
763 | # Miscellaneous filesystems | ||
764 | # | ||
765 | # CONFIG_ADFS_FS is not set | ||
766 | # CONFIG_AFFS_FS is not set | ||
767 | # CONFIG_HFS_FS is not set | ||
768 | # CONFIG_HFSPLUS_FS is not set | ||
769 | # CONFIG_BEFS_FS is not set | ||
770 | # CONFIG_BFS_FS is not set | ||
771 | # CONFIG_EFS_FS is not set | ||
772 | # CONFIG_CRAMFS is not set | ||
773 | # CONFIG_VXFS_FS is not set | ||
774 | # CONFIG_HPFS_FS is not set | ||
775 | # CONFIG_QNX4FS_FS is not set | ||
776 | # CONFIG_SYSV_FS is not set | ||
777 | # CONFIG_UFS_FS is not set | ||
778 | |||
779 | # | ||
780 | # Network File Systems | ||
781 | # | ||
782 | # CONFIG_NFS_FS is not set | ||
783 | # CONFIG_NFSD is not set | ||
784 | # CONFIG_EXPORTFS is not set | ||
785 | # CONFIG_SMB_FS is not set | ||
786 | # CONFIG_CIFS is not set | ||
787 | # CONFIG_NCP_FS is not set | ||
788 | # CONFIG_CODA_FS is not set | ||
789 | # CONFIG_AFS_FS is not set | ||
790 | |||
791 | # | ||
792 | # Partition Types | ||
793 | # | ||
794 | CONFIG_PARTITION_ADVANCED=y | ||
795 | # CONFIG_ACORN_PARTITION is not set | ||
796 | # CONFIG_OSF_PARTITION is not set | ||
797 | # CONFIG_AMIGA_PARTITION is not set | ||
798 | # CONFIG_ATARI_PARTITION is not set | ||
799 | CONFIG_MAC_PARTITION=y | ||
800 | CONFIG_MSDOS_PARTITION=y | ||
801 | # CONFIG_BSD_DISKLABEL is not set | ||
802 | # CONFIG_MINIX_SUBPARTITION is not set | ||
803 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
804 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
805 | # CONFIG_LDM_PARTITION is not set | ||
806 | # CONFIG_NEC98_PARTITION is not set | ||
807 | # CONFIG_SGI_PARTITION is not set | ||
808 | # CONFIG_ULTRIX_PARTITION is not set | ||
809 | # CONFIG_SUN_PARTITION is not set | ||
810 | # CONFIG_EFI_PARTITION is not set | ||
811 | |||
812 | # | ||
813 | # Native Language Support | ||
814 | # | ||
815 | CONFIG_NLS=y | ||
816 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
817 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
818 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
819 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
820 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
821 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
822 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
823 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
824 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
825 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
826 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
827 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
828 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
829 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
830 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
831 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
832 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
833 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
834 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
835 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
836 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
837 | # CONFIG_NLS_ISO8859_8 is not set | ||
838 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
839 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
840 | CONFIG_NLS_ISO8859_1=m | ||
841 | # CONFIG_NLS_ISO8859_2 is not set | ||
842 | # CONFIG_NLS_ISO8859_3 is not set | ||
843 | # CONFIG_NLS_ISO8859_4 is not set | ||
844 | # CONFIG_NLS_ISO8859_5 is not set | ||
845 | # CONFIG_NLS_ISO8859_6 is not set | ||
846 | # CONFIG_NLS_ISO8859_7 is not set | ||
847 | # CONFIG_NLS_ISO8859_9 is not set | ||
848 | # CONFIG_NLS_ISO8859_13 is not set | ||
849 | # CONFIG_NLS_ISO8859_14 is not set | ||
850 | # CONFIG_NLS_ISO8859_15 is not set | ||
851 | # CONFIG_NLS_KOI8_R is not set | ||
852 | # CONFIG_NLS_KOI8_U is not set | ||
853 | # CONFIG_NLS_UTF8 is not set | ||
854 | |||
855 | # | ||
856 | # Library routines | ||
857 | # | ||
858 | CONFIG_CRC32=y | ||
859 | # CONFIG_LIBCRC32C is not set | ||
860 | |||
861 | # | ||
862 | # Kernel hacking | ||
863 | # | ||
864 | # CONFIG_DEBUG_KERNEL is not set | ||
865 | # CONFIG_BOOTX_TEXT is not set | ||
866 | |||
867 | # | ||
868 | # Security options | ||
869 | # | ||
870 | # CONFIG_SECURITY is not set | ||
871 | |||
872 | # | ||
873 | # Cryptographic options | ||
874 | # | ||
875 | # CONFIG_CRYPTO is not set | ||
diff --git a/arch/ppc/configs/pmac_defconfig b/arch/ppc/configs/pmac_defconfig deleted file mode 100644 index a2db8b541c9b..000000000000 --- a/arch/ppc/configs/pmac_defconfig +++ /dev/null | |||
@@ -1,1591 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.13-rc3 | ||
4 | # Wed Jul 13 14:13:13 2005 | ||
5 | # | ||
6 | CONFIG_MMU=y | ||
7 | CONFIG_GENERIC_HARDIRQS=y | ||
8 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
9 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
10 | CONFIG_HAVE_DEC_LOCK=y | ||
11 | CONFIG_PPC=y | ||
12 | CONFIG_PPC32=y | ||
13 | CONFIG_GENERIC_NVRAM=y | ||
14 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
15 | |||
16 | # | ||
17 | # Code maturity level options | ||
18 | # | ||
19 | CONFIG_EXPERIMENTAL=y | ||
20 | CONFIG_CLEAN_COMPILE=y | ||
21 | CONFIG_BROKEN_ON_SMP=y | ||
22 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
23 | |||
24 | # | ||
25 | # General setup | ||
26 | # | ||
27 | CONFIG_LOCALVERSION="" | ||
28 | CONFIG_SWAP=y | ||
29 | CONFIG_SYSVIPC=y | ||
30 | CONFIG_POSIX_MQUEUE=y | ||
31 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
32 | CONFIG_SYSCTL=y | ||
33 | # CONFIG_AUDIT is not set | ||
34 | CONFIG_HOTPLUG=y | ||
35 | CONFIG_KOBJECT_UEVENT=y | ||
36 | CONFIG_IKCONFIG=y | ||
37 | CONFIG_IKCONFIG_PROC=y | ||
38 | # CONFIG_EMBEDDED is not set | ||
39 | CONFIG_KALLSYMS=y | ||
40 | # CONFIG_KALLSYMS_ALL is not set | ||
41 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
42 | CONFIG_PRINTK=y | ||
43 | CONFIG_BUG=y | ||
44 | CONFIG_BASE_FULL=y | ||
45 | CONFIG_FUTEX=y | ||
46 | CONFIG_EPOLL=y | ||
47 | CONFIG_SHMEM=y | ||
48 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
49 | CONFIG_CC_ALIGN_LABELS=0 | ||
50 | CONFIG_CC_ALIGN_LOOPS=0 | ||
51 | CONFIG_CC_ALIGN_JUMPS=0 | ||
52 | # CONFIG_TINY_SHMEM is not set | ||
53 | CONFIG_BASE_SMALL=0 | ||
54 | |||
55 | # | ||
56 | # Loadable module support | ||
57 | # | ||
58 | CONFIG_MODULES=y | ||
59 | CONFIG_MODULE_UNLOAD=y | ||
60 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
61 | CONFIG_OBSOLETE_MODPARM=y | ||
62 | CONFIG_MODVERSIONS=y | ||
63 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
64 | CONFIG_KMOD=y | ||
65 | |||
66 | # | ||
67 | # Processor | ||
68 | # | ||
69 | CONFIG_6xx=y | ||
70 | # CONFIG_40x is not set | ||
71 | # CONFIG_44x is not set | ||
72 | # CONFIG_POWER3 is not set | ||
73 | # CONFIG_POWER4 is not set | ||
74 | # CONFIG_8xx is not set | ||
75 | # CONFIG_E200 is not set | ||
76 | # CONFIG_E500 is not set | ||
77 | CONFIG_PPC_FPU=y | ||
78 | CONFIG_ALTIVEC=y | ||
79 | CONFIG_TAU=y | ||
80 | # CONFIG_TAU_INT is not set | ||
81 | # CONFIG_TAU_AVERAGE is not set | ||
82 | # CONFIG_KEXEC is not set | ||
83 | CONFIG_CPU_FREQ=y | ||
84 | CONFIG_CPU_FREQ_TABLE=y | ||
85 | # CONFIG_CPU_FREQ_DEBUG is not set | ||
86 | CONFIG_CPU_FREQ_STAT=m | ||
87 | CONFIG_CPU_FREQ_STAT_DETAILS=y | ||
88 | CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y | ||
89 | # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
90 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
91 | CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||
92 | CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||
93 | CONFIG_CPU_FREQ_GOV_ONDEMAND=m | ||
94 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m | ||
95 | CONFIG_CPU_FREQ_PMAC=y | ||
96 | CONFIG_PPC601_SYNC_FIX=y | ||
97 | CONFIG_PM=y | ||
98 | CONFIG_PPC_STD_MMU=y | ||
99 | |||
100 | # | ||
101 | # Platform options | ||
102 | # | ||
103 | CONFIG_PPC_MULTIPLATFORM=y | ||
104 | # CONFIG_APUS is not set | ||
105 | # CONFIG_KATANA is not set | ||
106 | # CONFIG_WILLOW is not set | ||
107 | # CONFIG_CPCI690 is not set | ||
108 | # CONFIG_PCORE is not set | ||
109 | # CONFIG_POWERPMC250 is not set | ||
110 | # CONFIG_CHESTNUT is not set | ||
111 | # CONFIG_SPRUCE is not set | ||
112 | # CONFIG_HDPU is not set | ||
113 | # CONFIG_EV64260 is not set | ||
114 | # CONFIG_LOPEC is not set | ||
115 | # CONFIG_MCPN765 is not set | ||
116 | # CONFIG_MVME5100 is not set | ||
117 | # CONFIG_PPLUS is not set | ||
118 | # CONFIG_PRPMC750 is not set | ||
119 | # CONFIG_PRPMC800 is not set | ||
120 | # CONFIG_SANDPOINT is not set | ||
121 | # CONFIG_RADSTONE_PPC7D is not set | ||
122 | # CONFIG_ADIR is not set | ||
123 | # CONFIG_K2 is not set | ||
124 | # CONFIG_PAL4 is not set | ||
125 | # CONFIG_GEMINI is not set | ||
126 | # CONFIG_EST8260 is not set | ||
127 | # CONFIG_SBC82xx is not set | ||
128 | # CONFIG_SBS8260 is not set | ||
129 | # CONFIG_RPX8260 is not set | ||
130 | # CONFIG_TQM8260 is not set | ||
131 | # CONFIG_ADS8272 is not set | ||
132 | # CONFIG_PQ2FADS is not set | ||
133 | # CONFIG_LITE5200 is not set | ||
134 | # CONFIG_MPC834x_SYS is not set | ||
135 | CONFIG_PPC_CHRP=y | ||
136 | CONFIG_PPC_PMAC=y | ||
137 | CONFIG_PPC_PREP=y | ||
138 | CONFIG_PPC_OF=y | ||
139 | CONFIG_PPCBUG_NVRAM=y | ||
140 | # CONFIG_SMP is not set | ||
141 | # CONFIG_HIGHMEM is not set | ||
142 | # CONFIG_HZ_100 is not set | ||
143 | CONFIG_HZ_250=y | ||
144 | # CONFIG_HZ_1000 is not set | ||
145 | CONFIG_HZ=250 | ||
146 | CONFIG_PREEMPT_NONE=y | ||
147 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
148 | # CONFIG_PREEMPT is not set | ||
149 | CONFIG_SELECT_MEMORY_MODEL=y | ||
150 | CONFIG_FLATMEM_MANUAL=y | ||
151 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
152 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
153 | CONFIG_FLATMEM=y | ||
154 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
155 | CONFIG_BINFMT_ELF=y | ||
156 | CONFIG_BINFMT_MISC=m | ||
157 | CONFIG_PROC_DEVICETREE=y | ||
158 | # CONFIG_PREP_RESIDUAL is not set | ||
159 | # CONFIG_CMDLINE_BOOL is not set | ||
160 | # CONFIG_PM_DEBUG is not set | ||
161 | CONFIG_SOFTWARE_SUSPEND=y | ||
162 | CONFIG_PM_STD_PARTITION="" | ||
163 | # CONFIG_SECCOMP is not set | ||
164 | CONFIG_ISA_DMA_API=y | ||
165 | |||
166 | # | ||
167 | # Bus options | ||
168 | # | ||
169 | # CONFIG_ISA is not set | ||
170 | CONFIG_GENERIC_ISA_DMA=y | ||
171 | CONFIG_PCI=y | ||
172 | CONFIG_PCI_DOMAINS=y | ||
173 | CONFIG_PCI_LEGACY_PROC=y | ||
174 | CONFIG_PCI_NAMES=y | ||
175 | # CONFIG_PCI_DEBUG is not set | ||
176 | |||
177 | # | ||
178 | # PCCARD (PCMCIA/CardBus) support | ||
179 | # | ||
180 | CONFIG_PCCARD=m | ||
181 | # CONFIG_PCMCIA_DEBUG is not set | ||
182 | CONFIG_PCMCIA=m | ||
183 | # CONFIG_PCMCIA_LOAD_CIS is not set | ||
184 | # CONFIG_PCMCIA_IOCTL is not set | ||
185 | CONFIG_CARDBUS=y | ||
186 | |||
187 | # | ||
188 | # PC-card bridges | ||
189 | # | ||
190 | CONFIG_YENTA=m | ||
191 | # CONFIG_PD6729 is not set | ||
192 | # CONFIG_I82092 is not set | ||
193 | # CONFIG_TCIC is not set | ||
194 | CONFIG_PCCARD_NONSTATIC=m | ||
195 | |||
196 | # | ||
197 | # Advanced setup | ||
198 | # | ||
199 | CONFIG_ADVANCED_OPTIONS=y | ||
200 | CONFIG_HIGHMEM_START=0xfe000000 | ||
201 | # CONFIG_LOWMEM_SIZE_BOOL is not set | ||
202 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
203 | # CONFIG_KERNEL_START_BOOL is not set | ||
204 | CONFIG_KERNEL_START=0xc0000000 | ||
205 | CONFIG_TASK_SIZE_BOOL=y | ||
206 | CONFIG_TASK_SIZE=0xc0000000 | ||
207 | CONFIG_BOOT_LOAD=0x00800000 | ||
208 | |||
209 | # | ||
210 | # Networking | ||
211 | # | ||
212 | CONFIG_NET=y | ||
213 | |||
214 | # | ||
215 | # Networking options | ||
216 | # | ||
217 | CONFIG_PACKET=y | ||
218 | # CONFIG_PACKET_MMAP is not set | ||
219 | CONFIG_UNIX=y | ||
220 | # CONFIG_NET_KEY is not set | ||
221 | CONFIG_INET=y | ||
222 | CONFIG_IP_MULTICAST=y | ||
223 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
224 | CONFIG_IP_FIB_HASH=y | ||
225 | # CONFIG_IP_PNP is not set | ||
226 | # CONFIG_NET_IPIP is not set | ||
227 | # CONFIG_NET_IPGRE is not set | ||
228 | # CONFIG_IP_MROUTE is not set | ||
229 | # CONFIG_ARPD is not set | ||
230 | CONFIG_SYN_COOKIES=y | ||
231 | # CONFIG_INET_AH is not set | ||
232 | # CONFIG_INET_ESP is not set | ||
233 | # CONFIG_INET_IPCOMP is not set | ||
234 | # CONFIG_INET_TUNNEL is not set | ||
235 | CONFIG_IP_TCPDIAG=y | ||
236 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
237 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
238 | CONFIG_TCP_CONG_BIC=y | ||
239 | |||
240 | # | ||
241 | # IP: Virtual Server Configuration | ||
242 | # | ||
243 | # CONFIG_IP_VS is not set | ||
244 | # CONFIG_IPV6 is not set | ||
245 | CONFIG_NETFILTER=y | ||
246 | # CONFIG_NETFILTER_DEBUG is not set | ||
247 | |||
248 | # | ||
249 | # IP: Netfilter Configuration | ||
250 | # | ||
251 | CONFIG_IP_NF_CONNTRACK=m | ||
252 | CONFIG_IP_NF_CT_ACCT=y | ||
253 | CONFIG_IP_NF_CONNTRACK_MARK=y | ||
254 | CONFIG_IP_NF_CT_PROTO_SCTP=m | ||
255 | CONFIG_IP_NF_FTP=m | ||
256 | CONFIG_IP_NF_IRC=m | ||
257 | CONFIG_IP_NF_TFTP=m | ||
258 | CONFIG_IP_NF_AMANDA=m | ||
259 | CONFIG_IP_NF_QUEUE=m | ||
260 | CONFIG_IP_NF_IPTABLES=m | ||
261 | CONFIG_IP_NF_MATCH_LIMIT=m | ||
262 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
263 | CONFIG_IP_NF_MATCH_MAC=m | ||
264 | CONFIG_IP_NF_MATCH_PKTTYPE=m | ||
265 | CONFIG_IP_NF_MATCH_MARK=m | ||
266 | CONFIG_IP_NF_MATCH_MULTIPORT=m | ||
267 | CONFIG_IP_NF_MATCH_TOS=m | ||
268 | CONFIG_IP_NF_MATCH_RECENT=m | ||
269 | CONFIG_IP_NF_MATCH_ECN=m | ||
270 | CONFIG_IP_NF_MATCH_DSCP=m | ||
271 | CONFIG_IP_NF_MATCH_AH_ESP=m | ||
272 | CONFIG_IP_NF_MATCH_LENGTH=m | ||
273 | CONFIG_IP_NF_MATCH_TTL=m | ||
274 | CONFIG_IP_NF_MATCH_TCPMSS=m | ||
275 | CONFIG_IP_NF_MATCH_HELPER=m | ||
276 | CONFIG_IP_NF_MATCH_STATE=m | ||
277 | CONFIG_IP_NF_MATCH_CONNTRACK=m | ||
278 | CONFIG_IP_NF_MATCH_OWNER=m | ||
279 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
280 | CONFIG_IP_NF_MATCH_REALM=m | ||
281 | CONFIG_IP_NF_MATCH_SCTP=m | ||
282 | CONFIG_IP_NF_MATCH_COMMENT=m | ||
283 | CONFIG_IP_NF_MATCH_CONNMARK=m | ||
284 | CONFIG_IP_NF_MATCH_HASHLIMIT=m | ||
285 | CONFIG_IP_NF_FILTER=m | ||
286 | CONFIG_IP_NF_TARGET_REJECT=m | ||
287 | CONFIG_IP_NF_TARGET_LOG=m | ||
288 | CONFIG_IP_NF_TARGET_ULOG=m | ||
289 | CONFIG_IP_NF_TARGET_TCPMSS=m | ||
290 | CONFIG_IP_NF_NAT=m | ||
291 | CONFIG_IP_NF_NAT_NEEDED=y | ||
292 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
293 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
294 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
295 | CONFIG_IP_NF_TARGET_SAME=m | ||
296 | CONFIG_IP_NF_NAT_SNMP_BASIC=m | ||
297 | CONFIG_IP_NF_NAT_IRC=m | ||
298 | CONFIG_IP_NF_NAT_FTP=m | ||
299 | CONFIG_IP_NF_NAT_TFTP=m | ||
300 | CONFIG_IP_NF_NAT_AMANDA=m | ||
301 | CONFIG_IP_NF_MANGLE=m | ||
302 | CONFIG_IP_NF_TARGET_TOS=m | ||
303 | CONFIG_IP_NF_TARGET_ECN=m | ||
304 | CONFIG_IP_NF_TARGET_DSCP=m | ||
305 | CONFIG_IP_NF_TARGET_MARK=m | ||
306 | CONFIG_IP_NF_TARGET_CLASSIFY=m | ||
307 | CONFIG_IP_NF_TARGET_CONNMARK=m | ||
308 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | ||
309 | CONFIG_IP_NF_RAW=m | ||
310 | CONFIG_IP_NF_TARGET_NOTRACK=m | ||
311 | CONFIG_IP_NF_ARPTABLES=m | ||
312 | CONFIG_IP_NF_ARPFILTER=m | ||
313 | CONFIG_IP_NF_ARP_MANGLE=m | ||
314 | |||
315 | # | ||
316 | # SCTP Configuration (EXPERIMENTAL) | ||
317 | # | ||
318 | # CONFIG_IP_SCTP is not set | ||
319 | # CONFIG_ATM is not set | ||
320 | # CONFIG_BRIDGE is not set | ||
321 | # CONFIG_VLAN_8021Q is not set | ||
322 | # CONFIG_DECNET is not set | ||
323 | # CONFIG_LLC2 is not set | ||
324 | # CONFIG_IPX is not set | ||
325 | # CONFIG_ATALK is not set | ||
326 | # CONFIG_X25 is not set | ||
327 | # CONFIG_LAPB is not set | ||
328 | # CONFIG_NET_DIVERT is not set | ||
329 | # CONFIG_ECONET is not set | ||
330 | # CONFIG_WAN_ROUTER is not set | ||
331 | # CONFIG_NET_SCHED is not set | ||
332 | CONFIG_NET_CLS_ROUTE=y | ||
333 | |||
334 | # | ||
335 | # Network testing | ||
336 | # | ||
337 | # CONFIG_NET_PKTGEN is not set | ||
338 | CONFIG_NETPOLL=y | ||
339 | # CONFIG_NETPOLL_RX is not set | ||
340 | # CONFIG_NETPOLL_TRAP is not set | ||
341 | CONFIG_NET_POLL_CONTROLLER=y | ||
342 | # CONFIG_HAMRADIO is not set | ||
343 | CONFIG_IRDA=m | ||
344 | |||
345 | # | ||
346 | # IrDA protocols | ||
347 | # | ||
348 | CONFIG_IRLAN=m | ||
349 | CONFIG_IRNET=m | ||
350 | CONFIG_IRCOMM=m | ||
351 | # CONFIG_IRDA_ULTRA is not set | ||
352 | |||
353 | # | ||
354 | # IrDA options | ||
355 | # | ||
356 | CONFIG_IRDA_CACHE_LAST_LSAP=y | ||
357 | CONFIG_IRDA_FAST_RR=y | ||
358 | # CONFIG_IRDA_DEBUG is not set | ||
359 | |||
360 | # | ||
361 | # Infrared-port device drivers | ||
362 | # | ||
363 | |||
364 | # | ||
365 | # SIR device drivers | ||
366 | # | ||
367 | CONFIG_IRTTY_SIR=m | ||
368 | |||
369 | # | ||
370 | # Dongle support | ||
371 | # | ||
372 | # CONFIG_DONGLE is not set | ||
373 | |||
374 | # | ||
375 | # Old SIR device drivers | ||
376 | # | ||
377 | # CONFIG_IRPORT_SIR is not set | ||
378 | |||
379 | # | ||
380 | # Old Serial dongle support | ||
381 | # | ||
382 | |||
383 | # | ||
384 | # FIR device drivers | ||
385 | # | ||
386 | # CONFIG_USB_IRDA is not set | ||
387 | # CONFIG_SIGMATEL_FIR is not set | ||
388 | # CONFIG_NSC_FIR is not set | ||
389 | # CONFIG_WINBOND_FIR is not set | ||
390 | # CONFIG_TOSHIBA_FIR is not set | ||
391 | # CONFIG_SMC_IRCC_FIR is not set | ||
392 | # CONFIG_ALI_FIR is not set | ||
393 | # CONFIG_VLSI_FIR is not set | ||
394 | # CONFIG_VIA_FIR is not set | ||
395 | # CONFIG_BT is not set | ||
396 | |||
397 | # | ||
398 | # Device Drivers | ||
399 | # | ||
400 | |||
401 | # | ||
402 | # Generic Driver Options | ||
403 | # | ||
404 | # CONFIG_STANDALONE is not set | ||
405 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
406 | CONFIG_FW_LOADER=m | ||
407 | # CONFIG_DEBUG_DRIVER is not set | ||
408 | |||
409 | # | ||
410 | # Memory Technology Devices (MTD) | ||
411 | # | ||
412 | # CONFIG_MTD is not set | ||
413 | |||
414 | # | ||
415 | # Parallel port support | ||
416 | # | ||
417 | # CONFIG_PARPORT is not set | ||
418 | |||
419 | # | ||
420 | # Plug and Play support | ||
421 | # | ||
422 | |||
423 | # | ||
424 | # Block devices | ||
425 | # | ||
426 | # CONFIG_BLK_DEV_FD is not set | ||
427 | CONFIG_MAC_FLOPPY=m | ||
428 | # CONFIG_BLK_CPQ_DA is not set | ||
429 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
430 | # CONFIG_BLK_DEV_DAC960 is not set | ||
431 | # CONFIG_BLK_DEV_UMEM is not set | ||
432 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
433 | CONFIG_BLK_DEV_LOOP=y | ||
434 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
435 | # CONFIG_BLK_DEV_NBD is not set | ||
436 | # CONFIG_BLK_DEV_SX8 is not set | ||
437 | # CONFIG_BLK_DEV_UB is not set | ||
438 | CONFIG_BLK_DEV_RAM=y | ||
439 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
440 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
441 | CONFIG_BLK_DEV_INITRD=y | ||
442 | CONFIG_INITRAMFS_SOURCE="" | ||
443 | CONFIG_LBD=y | ||
444 | CONFIG_CDROM_PKTCDVD=m | ||
445 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | ||
446 | # CONFIG_CDROM_PKTCDVD_WCACHE is not set | ||
447 | |||
448 | # | ||
449 | # IO Schedulers | ||
450 | # | ||
451 | CONFIG_IOSCHED_NOOP=y | ||
452 | CONFIG_IOSCHED_AS=y | ||
453 | CONFIG_IOSCHED_DEADLINE=y | ||
454 | CONFIG_IOSCHED_CFQ=y | ||
455 | # CONFIG_ATA_OVER_ETH is not set | ||
456 | |||
457 | # | ||
458 | # ATA/ATAPI/MFM/RLL support | ||
459 | # | ||
460 | CONFIG_IDE=y | ||
461 | CONFIG_BLK_DEV_IDE=y | ||
462 | |||
463 | # | ||
464 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
465 | # | ||
466 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
467 | CONFIG_BLK_DEV_IDEDISK=y | ||
468 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
469 | # CONFIG_BLK_DEV_IDECS is not set | ||
470 | CONFIG_BLK_DEV_IDECD=y | ||
471 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
472 | CONFIG_BLK_DEV_IDEFLOPPY=y | ||
473 | CONFIG_BLK_DEV_IDESCSI=y | ||
474 | # CONFIG_IDE_TASK_IOCTL is not set | ||
475 | |||
476 | # | ||
477 | # IDE chipset support/bugfixes | ||
478 | # | ||
479 | # CONFIG_IDE_GENERIC is not set | ||
480 | CONFIG_BLK_DEV_IDEPCI=y | ||
481 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
482 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
483 | CONFIG_BLK_DEV_GENERIC=y | ||
484 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
485 | # CONFIG_BLK_DEV_SL82C105 is not set | ||
486 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
487 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | ||
488 | CONFIG_IDEDMA_PCI_AUTO=y | ||
489 | # CONFIG_IDEDMA_ONLYDISK is not set | ||
490 | # CONFIG_BLK_DEV_AEC62XX is not set | ||
491 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
492 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
493 | CONFIG_BLK_DEV_CMD64X=y | ||
494 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
495 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
496 | # CONFIG_BLK_DEV_CS5520 is not set | ||
497 | # CONFIG_BLK_DEV_CS5530 is not set | ||
498 | # CONFIG_BLK_DEV_HPT34X is not set | ||
499 | # CONFIG_BLK_DEV_HPT366 is not set | ||
500 | # CONFIG_BLK_DEV_SC1200 is not set | ||
501 | # CONFIG_BLK_DEV_PIIX is not set | ||
502 | # CONFIG_BLK_DEV_IT821X is not set | ||
503 | # CONFIG_BLK_DEV_NS87415 is not set | ||
504 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
505 | CONFIG_BLK_DEV_PDC202XX_NEW=y | ||
506 | # CONFIG_PDC202XX_FORCE is not set | ||
507 | # CONFIG_BLK_DEV_SVWKS is not set | ||
508 | # CONFIG_BLK_DEV_SIIMAGE is not set | ||
509 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
510 | # CONFIG_BLK_DEV_TRM290 is not set | ||
511 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
512 | CONFIG_BLK_DEV_IDE_PMAC=y | ||
513 | CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y | ||
514 | CONFIG_BLK_DEV_IDEDMA_PMAC=y | ||
515 | CONFIG_BLK_DEV_IDE_PMAC_BLINK=y | ||
516 | # CONFIG_IDE_ARM is not set | ||
517 | CONFIG_BLK_DEV_IDEDMA=y | ||
518 | # CONFIG_IDEDMA_IVB is not set | ||
519 | CONFIG_IDEDMA_AUTO=y | ||
520 | # CONFIG_BLK_DEV_HD is not set | ||
521 | |||
522 | # | ||
523 | # SCSI device support | ||
524 | # | ||
525 | CONFIG_SCSI=y | ||
526 | CONFIG_SCSI_PROC_FS=y | ||
527 | |||
528 | # | ||
529 | # SCSI support type (disk, tape, CD-ROM) | ||
530 | # | ||
531 | CONFIG_BLK_DEV_SD=y | ||
532 | CONFIG_CHR_DEV_ST=y | ||
533 | # CONFIG_CHR_DEV_OSST is not set | ||
534 | CONFIG_BLK_DEV_SR=y | ||
535 | CONFIG_BLK_DEV_SR_VENDOR=y | ||
536 | CONFIG_CHR_DEV_SG=y | ||
537 | # CONFIG_CHR_DEV_SCH is not set | ||
538 | |||
539 | # | ||
540 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
541 | # | ||
542 | # CONFIG_SCSI_MULTI_LUN is not set | ||
543 | CONFIG_SCSI_CONSTANTS=y | ||
544 | # CONFIG_SCSI_LOGGING is not set | ||
545 | |||
546 | # | ||
547 | # SCSI Transport Attributes | ||
548 | # | ||
549 | CONFIG_SCSI_SPI_ATTRS=y | ||
550 | # CONFIG_SCSI_FC_ATTRS is not set | ||
551 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
552 | |||
553 | # | ||
554 | # SCSI low-level drivers | ||
555 | # | ||
556 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
557 | # CONFIG_SCSI_3W_9XXX is not set | ||
558 | # CONFIG_SCSI_ACARD is not set | ||
559 | # CONFIG_SCSI_AACRAID is not set | ||
560 | CONFIG_SCSI_AIC7XXX=m | ||
561 | CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 | ||
562 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 | ||
563 | CONFIG_AIC7XXX_DEBUG_ENABLE=y | ||
564 | CONFIG_AIC7XXX_DEBUG_MASK=0 | ||
565 | CONFIG_AIC7XXX_REG_PRETTY_PRINT=y | ||
566 | CONFIG_SCSI_AIC7XXX_OLD=m | ||
567 | # CONFIG_SCSI_AIC79XX is not set | ||
568 | # CONFIG_SCSI_DPT_I2O is not set | ||
569 | # CONFIG_MEGARAID_NEWGEN is not set | ||
570 | # CONFIG_MEGARAID_LEGACY is not set | ||
571 | # CONFIG_SCSI_SATA is not set | ||
572 | # CONFIG_SCSI_BUSLOGIC is not set | ||
573 | # CONFIG_SCSI_DMX3191D is not set | ||
574 | # CONFIG_SCSI_EATA is not set | ||
575 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
576 | # CONFIG_SCSI_GDTH is not set | ||
577 | # CONFIG_SCSI_IPS is not set | ||
578 | # CONFIG_SCSI_INITIO is not set | ||
579 | # CONFIG_SCSI_INIA100 is not set | ||
580 | CONFIG_SCSI_SYM53C8XX_2=y | ||
581 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 | ||
582 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | ||
583 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | ||
584 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | ||
585 | # CONFIG_SCSI_IPR is not set | ||
586 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
587 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
588 | CONFIG_SCSI_QLA2XXX=y | ||
589 | # CONFIG_SCSI_QLA21XX is not set | ||
590 | # CONFIG_SCSI_QLA22XX is not set | ||
591 | # CONFIG_SCSI_QLA2300 is not set | ||
592 | # CONFIG_SCSI_QLA2322 is not set | ||
593 | # CONFIG_SCSI_QLA6312 is not set | ||
594 | # CONFIG_SCSI_LPFC is not set | ||
595 | # CONFIG_SCSI_DC395x is not set | ||
596 | # CONFIG_SCSI_DC390T is not set | ||
597 | # CONFIG_SCSI_NSP32 is not set | ||
598 | # CONFIG_SCSI_DEBUG is not set | ||
599 | CONFIG_SCSI_MESH=y | ||
600 | CONFIG_SCSI_MESH_SYNC_RATE=5 | ||
601 | CONFIG_SCSI_MESH_RESET_DELAY_MS=1000 | ||
602 | CONFIG_SCSI_MAC53C94=y | ||
603 | |||
604 | # | ||
605 | # PCMCIA SCSI adapter support | ||
606 | # | ||
607 | # CONFIG_PCMCIA_AHA152X is not set | ||
608 | # CONFIG_PCMCIA_FDOMAIN is not set | ||
609 | # CONFIG_PCMCIA_NINJA_SCSI is not set | ||
610 | # CONFIG_PCMCIA_QLOGIC is not set | ||
611 | # CONFIG_PCMCIA_SYM53C500 is not set | ||
612 | |||
613 | # | ||
614 | # Multi-device support (RAID and LVM) | ||
615 | # | ||
616 | # CONFIG_MD is not set | ||
617 | |||
618 | # | ||
619 | # Fusion MPT device support | ||
620 | # | ||
621 | # CONFIG_FUSION is not set | ||
622 | # CONFIG_FUSION_SPI is not set | ||
623 | # CONFIG_FUSION_FC is not set | ||
624 | |||
625 | # | ||
626 | # IEEE 1394 (FireWire) support | ||
627 | # | ||
628 | CONFIG_IEEE1394=m | ||
629 | |||
630 | # | ||
631 | # Subsystem Options | ||
632 | # | ||
633 | # CONFIG_IEEE1394_VERBOSEDEBUG is not set | ||
634 | # CONFIG_IEEE1394_OUI_DB is not set | ||
635 | CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y | ||
636 | CONFIG_IEEE1394_CONFIG_ROM_IP1394=y | ||
637 | # CONFIG_IEEE1394_EXPORT_FULL_API is not set | ||
638 | |||
639 | # | ||
640 | # Device Drivers | ||
641 | # | ||
642 | # CONFIG_IEEE1394_PCILYNX is not set | ||
643 | CONFIG_IEEE1394_OHCI1394=m | ||
644 | |||
645 | # | ||
646 | # Protocol Drivers | ||
647 | # | ||
648 | CONFIG_IEEE1394_VIDEO1394=m | ||
649 | CONFIG_IEEE1394_SBP2=m | ||
650 | # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set | ||
651 | CONFIG_IEEE1394_ETH1394=m | ||
652 | CONFIG_IEEE1394_DV1394=m | ||
653 | CONFIG_IEEE1394_RAWIO=m | ||
654 | CONFIG_IEEE1394_CMP=m | ||
655 | CONFIG_IEEE1394_AMDTP=m | ||
656 | |||
657 | # | ||
658 | # I2O device support | ||
659 | # | ||
660 | # CONFIG_I2O is not set | ||
661 | |||
662 | # | ||
663 | # Macintosh device drivers | ||
664 | # | ||
665 | CONFIG_ADB=y | ||
666 | CONFIG_ADB_CUDA=y | ||
667 | CONFIG_ADB_PMU=y | ||
668 | CONFIG_PMAC_APM_EMU=y | ||
669 | CONFIG_PMAC_MEDIABAY=y | ||
670 | CONFIG_PMAC_BACKLIGHT=y | ||
671 | CONFIG_ADB_MACIO=y | ||
672 | CONFIG_INPUT_ADBHID=y | ||
673 | CONFIG_MAC_EMUMOUSEBTN=y | ||
674 | CONFIG_THERM_WINDTUNNEL=m | ||
675 | CONFIG_THERM_ADT746X=m | ||
676 | # CONFIG_ANSLCD is not set | ||
677 | |||
678 | # | ||
679 | # Network device support | ||
680 | # | ||
681 | CONFIG_NETDEVICES=y | ||
682 | # CONFIG_DUMMY is not set | ||
683 | # CONFIG_BONDING is not set | ||
684 | # CONFIG_EQUALIZER is not set | ||
685 | CONFIG_TUN=m | ||
686 | |||
687 | # | ||
688 | # ARCnet devices | ||
689 | # | ||
690 | # CONFIG_ARCNET is not set | ||
691 | |||
692 | # | ||
693 | # Ethernet (10 or 100Mbit) | ||
694 | # | ||
695 | CONFIG_NET_ETHERNET=y | ||
696 | CONFIG_MII=y | ||
697 | CONFIG_MACE=y | ||
698 | # CONFIG_MACE_AAUI_PORT is not set | ||
699 | CONFIG_BMAC=y | ||
700 | # CONFIG_HAPPYMEAL is not set | ||
701 | CONFIG_SUNGEM=y | ||
702 | # CONFIG_NET_VENDOR_3COM is not set | ||
703 | |||
704 | # | ||
705 | # Tulip family network device support | ||
706 | # | ||
707 | # CONFIG_NET_TULIP is not set | ||
708 | # CONFIG_HP100 is not set | ||
709 | CONFIG_NET_PCI=y | ||
710 | CONFIG_PCNET32=y | ||
711 | # CONFIG_AMD8111_ETH is not set | ||
712 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
713 | # CONFIG_B44 is not set | ||
714 | # CONFIG_FORCEDETH is not set | ||
715 | # CONFIG_DGRS is not set | ||
716 | # CONFIG_EEPRO100 is not set | ||
717 | # CONFIG_E100 is not set | ||
718 | # CONFIG_FEALNX is not set | ||
719 | # CONFIG_NATSEMI is not set | ||
720 | # CONFIG_NE2K_PCI is not set | ||
721 | # CONFIG_8139CP is not set | ||
722 | # CONFIG_8139TOO is not set | ||
723 | # CONFIG_SIS900 is not set | ||
724 | # CONFIG_EPIC100 is not set | ||
725 | # CONFIG_SUNDANCE is not set | ||
726 | # CONFIG_TLAN is not set | ||
727 | # CONFIG_VIA_RHINE is not set | ||
728 | |||
729 | # | ||
730 | # Ethernet (1000 Mbit) | ||
731 | # | ||
732 | # CONFIG_ACENIC is not set | ||
733 | # CONFIG_DL2K is not set | ||
734 | # CONFIG_E1000 is not set | ||
735 | # CONFIG_NS83820 is not set | ||
736 | # CONFIG_HAMACHI is not set | ||
737 | # CONFIG_YELLOWFIN is not set | ||
738 | # CONFIG_R8169 is not set | ||
739 | # CONFIG_SKGE is not set | ||
740 | # CONFIG_SK98LIN is not set | ||
741 | # CONFIG_VIA_VELOCITY is not set | ||
742 | # CONFIG_TIGON3 is not set | ||
743 | # CONFIG_BNX2 is not set | ||
744 | # CONFIG_MV643XX_ETH is not set | ||
745 | |||
746 | # | ||
747 | # Ethernet (10000 Mbit) | ||
748 | # | ||
749 | # CONFIG_IXGB is not set | ||
750 | # CONFIG_S2IO is not set | ||
751 | |||
752 | # | ||
753 | # Token Ring devices | ||
754 | # | ||
755 | # CONFIG_TR is not set | ||
756 | |||
757 | # | ||
758 | # Wireless LAN (non-hamradio) | ||
759 | # | ||
760 | CONFIG_NET_RADIO=y | ||
761 | |||
762 | # | ||
763 | # Obsolete Wireless cards support (pre-802.11) | ||
764 | # | ||
765 | # CONFIG_STRIP is not set | ||
766 | # CONFIG_PCMCIA_WAVELAN is not set | ||
767 | # CONFIG_PCMCIA_NETWAVE is not set | ||
768 | |||
769 | # | ||
770 | # Wireless 802.11 Frequency Hopping cards support | ||
771 | # | ||
772 | # CONFIG_PCMCIA_RAYCS is not set | ||
773 | |||
774 | # | ||
775 | # Wireless 802.11b ISA/PCI cards support | ||
776 | # | ||
777 | CONFIG_HERMES=m | ||
778 | CONFIG_APPLE_AIRPORT=m | ||
779 | # CONFIG_PLX_HERMES is not set | ||
780 | # CONFIG_TMD_HERMES is not set | ||
781 | # CONFIG_PCI_HERMES is not set | ||
782 | # CONFIG_ATMEL is not set | ||
783 | |||
784 | # | ||
785 | # Wireless 802.11b Pcmcia/Cardbus cards support | ||
786 | # | ||
787 | CONFIG_PCMCIA_HERMES=m | ||
788 | # CONFIG_AIRO_CS is not set | ||
789 | # CONFIG_PCMCIA_WL3501 is not set | ||
790 | |||
791 | # | ||
792 | # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support | ||
793 | # | ||
794 | # CONFIG_PRISM54 is not set | ||
795 | CONFIG_NET_WIRELESS=y | ||
796 | |||
797 | # | ||
798 | # PCMCIA network device support | ||
799 | # | ||
800 | # CONFIG_NET_PCMCIA is not set | ||
801 | |||
802 | # | ||
803 | # Wan interfaces | ||
804 | # | ||
805 | # CONFIG_WAN is not set | ||
806 | # CONFIG_FDDI is not set | ||
807 | # CONFIG_HIPPI is not set | ||
808 | CONFIG_PPP=y | ||
809 | CONFIG_PPP_MULTILINK=y | ||
810 | # CONFIG_PPP_FILTER is not set | ||
811 | CONFIG_PPP_ASYNC=y | ||
812 | CONFIG_PPP_SYNC_TTY=m | ||
813 | CONFIG_PPP_DEFLATE=y | ||
814 | CONFIG_PPP_BSDCOMP=m | ||
815 | CONFIG_PPPOE=m | ||
816 | # CONFIG_SLIP is not set | ||
817 | # CONFIG_NET_FC is not set | ||
818 | # CONFIG_SHAPER is not set | ||
819 | CONFIG_NETCONSOLE=m | ||
820 | |||
821 | # | ||
822 | # ISDN subsystem | ||
823 | # | ||
824 | # CONFIG_ISDN is not set | ||
825 | |||
826 | # | ||
827 | # Telephony Support | ||
828 | # | ||
829 | # CONFIG_PHONE is not set | ||
830 | |||
831 | # | ||
832 | # Input device support | ||
833 | # | ||
834 | CONFIG_INPUT=y | ||
835 | |||
836 | # | ||
837 | # Userland interfaces | ||
838 | # | ||
839 | CONFIG_INPUT_MOUSEDEV=y | ||
840 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
841 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
842 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
843 | # CONFIG_INPUT_JOYDEV is not set | ||
844 | # CONFIG_INPUT_TSDEV is not set | ||
845 | CONFIG_INPUT_EVDEV=y | ||
846 | # CONFIG_INPUT_EVBUG is not set | ||
847 | |||
848 | # | ||
849 | # Input Device Drivers | ||
850 | # | ||
851 | CONFIG_INPUT_KEYBOARD=y | ||
852 | # CONFIG_KEYBOARD_ATKBD is not set | ||
853 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
854 | # CONFIG_KEYBOARD_LKKBD is not set | ||
855 | # CONFIG_KEYBOARD_XTKBD is not set | ||
856 | # CONFIG_KEYBOARD_NEWTON is not set | ||
857 | CONFIG_INPUT_MOUSE=y | ||
858 | # CONFIG_MOUSE_PS2 is not set | ||
859 | # CONFIG_MOUSE_SERIAL is not set | ||
860 | # CONFIG_MOUSE_VSXXXAA is not set | ||
861 | # CONFIG_INPUT_JOYSTICK is not set | ||
862 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
863 | # CONFIG_INPUT_MISC is not set | ||
864 | |||
865 | # | ||
866 | # Hardware I/O ports | ||
867 | # | ||
868 | # CONFIG_SERIO is not set | ||
869 | # CONFIG_GAMEPORT is not set | ||
870 | |||
871 | # | ||
872 | # Character devices | ||
873 | # | ||
874 | CONFIG_VT=y | ||
875 | CONFIG_VT_CONSOLE=y | ||
876 | CONFIG_HW_CONSOLE=y | ||
877 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
878 | |||
879 | # | ||
880 | # Serial drivers | ||
881 | # | ||
882 | CONFIG_SERIAL_8250=m | ||
883 | CONFIG_SERIAL_8250_CS=m | ||
884 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
885 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
886 | |||
887 | # | ||
888 | # Non-8250 serial port support | ||
889 | # | ||
890 | CONFIG_SERIAL_CORE=y | ||
891 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
892 | CONFIG_SERIAL_PMACZILOG=y | ||
893 | CONFIG_SERIAL_PMACZILOG_CONSOLE=y | ||
894 | # CONFIG_SERIAL_JSM is not set | ||
895 | CONFIG_UNIX98_PTYS=y | ||
896 | CONFIG_LEGACY_PTYS=y | ||
897 | CONFIG_LEGACY_PTY_COUNT=256 | ||
898 | |||
899 | # | ||
900 | # IPMI | ||
901 | # | ||
902 | # CONFIG_IPMI_HANDLER is not set | ||
903 | |||
904 | # | ||
905 | # Watchdog Cards | ||
906 | # | ||
907 | # CONFIG_WATCHDOG is not set | ||
908 | CONFIG_NVRAM=y | ||
909 | CONFIG_GEN_RTC=y | ||
910 | # CONFIG_GEN_RTC_X is not set | ||
911 | # CONFIG_DTLK is not set | ||
912 | # CONFIG_R3964 is not set | ||
913 | # CONFIG_APPLICOM is not set | ||
914 | |||
915 | # | ||
916 | # Ftape, the floppy tape device driver | ||
917 | # | ||
918 | CONFIG_AGP=m | ||
919 | CONFIG_AGP_UNINORTH=m | ||
920 | CONFIG_DRM=m | ||
921 | # CONFIG_DRM_TDFX is not set | ||
922 | CONFIG_DRM_R128=m | ||
923 | CONFIG_DRM_RADEON=m | ||
924 | # CONFIG_DRM_MGA is not set | ||
925 | # CONFIG_DRM_SIS is not set | ||
926 | # CONFIG_DRM_VIA is not set | ||
927 | |||
928 | # | ||
929 | # PCMCIA character devices | ||
930 | # | ||
931 | # CONFIG_SYNCLINK_CS is not set | ||
932 | # CONFIG_RAW_DRIVER is not set | ||
933 | |||
934 | # | ||
935 | # TPM devices | ||
936 | # | ||
937 | # CONFIG_TCG_TPM is not set | ||
938 | |||
939 | # | ||
940 | # I2C support | ||
941 | # | ||
942 | CONFIG_I2C=y | ||
943 | CONFIG_I2C_CHARDEV=m | ||
944 | |||
945 | # | ||
946 | # I2C Algorithms | ||
947 | # | ||
948 | CONFIG_I2C_ALGOBIT=y | ||
949 | # CONFIG_I2C_ALGOPCF is not set | ||
950 | # CONFIG_I2C_ALGOPCA is not set | ||
951 | |||
952 | # | ||
953 | # I2C Hardware Bus support | ||
954 | # | ||
955 | # CONFIG_I2C_ALI1535 is not set | ||
956 | # CONFIG_I2C_ALI1563 is not set | ||
957 | # CONFIG_I2C_ALI15X3 is not set | ||
958 | # CONFIG_I2C_AMD756 is not set | ||
959 | # CONFIG_I2C_AMD8111 is not set | ||
960 | # CONFIG_I2C_HYDRA is not set | ||
961 | # CONFIG_I2C_I801 is not set | ||
962 | # CONFIG_I2C_I810 is not set | ||
963 | # CONFIG_I2C_PIIX4 is not set | ||
964 | # CONFIG_I2C_ISA is not set | ||
965 | CONFIG_I2C_KEYWEST=m | ||
966 | # CONFIG_I2C_MPC is not set | ||
967 | # CONFIG_I2C_NFORCE2 is not set | ||
968 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
969 | # CONFIG_I2C_PROSAVAGE is not set | ||
970 | # CONFIG_I2C_SAVAGE4 is not set | ||
971 | # CONFIG_SCx200_ACB is not set | ||
972 | # CONFIG_I2C_SIS5595 is not set | ||
973 | # CONFIG_I2C_SIS630 is not set | ||
974 | # CONFIG_I2C_SIS96X is not set | ||
975 | # CONFIG_I2C_STUB is not set | ||
976 | # CONFIG_I2C_VIA is not set | ||
977 | # CONFIG_I2C_VIAPRO is not set | ||
978 | # CONFIG_I2C_VOODOO3 is not set | ||
979 | # CONFIG_I2C_PCA_ISA is not set | ||
980 | # CONFIG_I2C_SENSOR is not set | ||
981 | |||
982 | # | ||
983 | # Miscellaneous I2C Chip support | ||
984 | # | ||
985 | # CONFIG_SENSORS_DS1337 is not set | ||
986 | # CONFIG_SENSORS_DS1374 is not set | ||
987 | # CONFIG_SENSORS_EEPROM is not set | ||
988 | # CONFIG_SENSORS_PCF8574 is not set | ||
989 | # CONFIG_SENSORS_PCA9539 is not set | ||
990 | # CONFIG_SENSORS_PCF8591 is not set | ||
991 | # CONFIG_SENSORS_RTC8564 is not set | ||
992 | # CONFIG_SENSORS_M41T00 is not set | ||
993 | # CONFIG_SENSORS_MAX6875 is not set | ||
994 | # CONFIG_I2C_DEBUG_CORE is not set | ||
995 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
996 | # CONFIG_I2C_DEBUG_BUS is not set | ||
997 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
998 | |||
999 | # | ||
1000 | # Dallas's 1-wire bus | ||
1001 | # | ||
1002 | # CONFIG_W1 is not set | ||
1003 | |||
1004 | # | ||
1005 | # Hardware Monitoring support | ||
1006 | # | ||
1007 | # CONFIG_HWMON is not set | ||
1008 | |||
1009 | # | ||
1010 | # Misc devices | ||
1011 | # | ||
1012 | |||
1013 | # | ||
1014 | # Multimedia devices | ||
1015 | # | ||
1016 | # CONFIG_VIDEO_DEV is not set | ||
1017 | |||
1018 | # | ||
1019 | # Digital Video Broadcasting Devices | ||
1020 | # | ||
1021 | # CONFIG_DVB is not set | ||
1022 | |||
1023 | # | ||
1024 | # Graphics support | ||
1025 | # | ||
1026 | CONFIG_FB=y | ||
1027 | CONFIG_FB_CFB_FILLRECT=y | ||
1028 | CONFIG_FB_CFB_COPYAREA=y | ||
1029 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
1030 | CONFIG_FB_SOFT_CURSOR=y | ||
1031 | CONFIG_FB_MACMODES=y | ||
1032 | CONFIG_FB_MODE_HELPERS=y | ||
1033 | CONFIG_FB_TILEBLITTING=y | ||
1034 | # CONFIG_FB_CIRRUS is not set | ||
1035 | # CONFIG_FB_PM2 is not set | ||
1036 | # CONFIG_FB_CYBER2000 is not set | ||
1037 | CONFIG_FB_OF=y | ||
1038 | CONFIG_FB_CONTROL=y | ||
1039 | CONFIG_FB_PLATINUM=y | ||
1040 | CONFIG_FB_VALKYRIE=y | ||
1041 | CONFIG_FB_CT65550=y | ||
1042 | # CONFIG_FB_ASILIANT is not set | ||
1043 | CONFIG_FB_IMSTT=y | ||
1044 | # CONFIG_FB_VGA16 is not set | ||
1045 | # CONFIG_FB_NVIDIA is not set | ||
1046 | # CONFIG_FB_RIVA is not set | ||
1047 | CONFIG_FB_MATROX=y | ||
1048 | CONFIG_FB_MATROX_MILLENIUM=y | ||
1049 | CONFIG_FB_MATROX_MYSTIQUE=y | ||
1050 | CONFIG_FB_MATROX_G=y | ||
1051 | # CONFIG_FB_MATROX_I2C is not set | ||
1052 | # CONFIG_FB_MATROX_MULTIHEAD is not set | ||
1053 | # CONFIG_FB_RADEON_OLD is not set | ||
1054 | CONFIG_FB_RADEON=y | ||
1055 | CONFIG_FB_RADEON_I2C=y | ||
1056 | # CONFIG_FB_RADEON_DEBUG is not set | ||
1057 | CONFIG_FB_ATY128=y | ||
1058 | CONFIG_FB_ATY=y | ||
1059 | CONFIG_FB_ATY_CT=y | ||
1060 | CONFIG_FB_ATY_GENERIC_LCD=y | ||
1061 | # CONFIG_FB_ATY_XL_INIT is not set | ||
1062 | CONFIG_FB_ATY_GX=y | ||
1063 | # CONFIG_FB_SAVAGE is not set | ||
1064 | # CONFIG_FB_SIS is not set | ||
1065 | # CONFIG_FB_NEOMAGIC is not set | ||
1066 | # CONFIG_FB_KYRO is not set | ||
1067 | CONFIG_FB_3DFX=y | ||
1068 | CONFIG_FB_3DFX_ACCEL=y | ||
1069 | # CONFIG_FB_VOODOO1 is not set | ||
1070 | # CONFIG_FB_TRIDENT is not set | ||
1071 | # CONFIG_FB_S1D13XXX is not set | ||
1072 | # CONFIG_FB_VIRTUAL is not set | ||
1073 | |||
1074 | # | ||
1075 | # Console display driver support | ||
1076 | # | ||
1077 | # CONFIG_VGA_CONSOLE is not set | ||
1078 | CONFIG_DUMMY_CONSOLE=y | ||
1079 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
1080 | # CONFIG_FONTS is not set | ||
1081 | CONFIG_FONT_8x8=y | ||
1082 | CONFIG_FONT_8x16=y | ||
1083 | |||
1084 | # | ||
1085 | # Logo configuration | ||
1086 | # | ||
1087 | CONFIG_LOGO=y | ||
1088 | CONFIG_LOGO_LINUX_MONO=y | ||
1089 | CONFIG_LOGO_LINUX_VGA16=y | ||
1090 | CONFIG_LOGO_LINUX_CLUT224=y | ||
1091 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
1092 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
1093 | CONFIG_BACKLIGHT_DEVICE=y | ||
1094 | CONFIG_LCD_CLASS_DEVICE=y | ||
1095 | CONFIG_LCD_DEVICE=y | ||
1096 | |||
1097 | # | ||
1098 | # Sound | ||
1099 | # | ||
1100 | CONFIG_SOUND=m | ||
1101 | CONFIG_DMASOUND_PMAC=m | ||
1102 | CONFIG_DMASOUND=m | ||
1103 | |||
1104 | # | ||
1105 | # Advanced Linux Sound Architecture | ||
1106 | # | ||
1107 | CONFIG_SND=m | ||
1108 | CONFIG_SND_TIMER=m | ||
1109 | CONFIG_SND_PCM=m | ||
1110 | CONFIG_SND_HWDEP=m | ||
1111 | CONFIG_SND_RAWMIDI=m | ||
1112 | CONFIG_SND_SEQUENCER=m | ||
1113 | CONFIG_SND_SEQ_DUMMY=m | ||
1114 | CONFIG_SND_OSSEMUL=y | ||
1115 | CONFIG_SND_MIXER_OSS=m | ||
1116 | CONFIG_SND_PCM_OSS=m | ||
1117 | CONFIG_SND_SEQUENCER_OSS=y | ||
1118 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
1119 | # CONFIG_SND_DEBUG is not set | ||
1120 | |||
1121 | # | ||
1122 | # Generic devices | ||
1123 | # | ||
1124 | CONFIG_SND_DUMMY=m | ||
1125 | # CONFIG_SND_VIRMIDI is not set | ||
1126 | # CONFIG_SND_MTPAV is not set | ||
1127 | # CONFIG_SND_SERIAL_U16550 is not set | ||
1128 | # CONFIG_SND_MPU401 is not set | ||
1129 | |||
1130 | # | ||
1131 | # PCI devices | ||
1132 | # | ||
1133 | # CONFIG_SND_ALI5451 is not set | ||
1134 | # CONFIG_SND_ATIIXP is not set | ||
1135 | # CONFIG_SND_ATIIXP_MODEM is not set | ||
1136 | # CONFIG_SND_AU8810 is not set | ||
1137 | # CONFIG_SND_AU8820 is not set | ||
1138 | # CONFIG_SND_AU8830 is not set | ||
1139 | # CONFIG_SND_AZT3328 is not set | ||
1140 | # CONFIG_SND_BT87X is not set | ||
1141 | # CONFIG_SND_CS46XX is not set | ||
1142 | # CONFIG_SND_CS4281 is not set | ||
1143 | # CONFIG_SND_EMU10K1 is not set | ||
1144 | # CONFIG_SND_EMU10K1X is not set | ||
1145 | # CONFIG_SND_CA0106 is not set | ||
1146 | # CONFIG_SND_KORG1212 is not set | ||
1147 | # CONFIG_SND_MIXART is not set | ||
1148 | # CONFIG_SND_NM256 is not set | ||
1149 | # CONFIG_SND_RME32 is not set | ||
1150 | # CONFIG_SND_RME96 is not set | ||
1151 | # CONFIG_SND_RME9652 is not set | ||
1152 | # CONFIG_SND_HDSP is not set | ||
1153 | # CONFIG_SND_HDSPM is not set | ||
1154 | # CONFIG_SND_TRIDENT is not set | ||
1155 | # CONFIG_SND_YMFPCI is not set | ||
1156 | # CONFIG_SND_ALS4000 is not set | ||
1157 | # CONFIG_SND_CMIPCI is not set | ||
1158 | # CONFIG_SND_ENS1370 is not set | ||
1159 | # CONFIG_SND_ENS1371 is not set | ||
1160 | # CONFIG_SND_ES1938 is not set | ||
1161 | # CONFIG_SND_ES1968 is not set | ||
1162 | # CONFIG_SND_MAESTRO3 is not set | ||
1163 | # CONFIG_SND_FM801 is not set | ||
1164 | # CONFIG_SND_ICE1712 is not set | ||
1165 | # CONFIG_SND_ICE1724 is not set | ||
1166 | # CONFIG_SND_INTEL8X0 is not set | ||
1167 | # CONFIG_SND_INTEL8X0M is not set | ||
1168 | # CONFIG_SND_SONICVIBES is not set | ||
1169 | # CONFIG_SND_VIA82XX is not set | ||
1170 | # CONFIG_SND_VIA82XX_MODEM is not set | ||
1171 | # CONFIG_SND_VX222 is not set | ||
1172 | # CONFIG_SND_HDA_INTEL is not set | ||
1173 | |||
1174 | # | ||
1175 | # ALSA PowerMac devices | ||
1176 | # | ||
1177 | CONFIG_SND_POWERMAC=m | ||
1178 | |||
1179 | # | ||
1180 | # USB devices | ||
1181 | # | ||
1182 | CONFIG_SND_USB_AUDIO=m | ||
1183 | CONFIG_SND_USB_USX2Y=m | ||
1184 | |||
1185 | # | ||
1186 | # PCMCIA devices | ||
1187 | # | ||
1188 | |||
1189 | # | ||
1190 | # Open Sound System | ||
1191 | # | ||
1192 | # CONFIG_SOUND_PRIME is not set | ||
1193 | |||
1194 | # | ||
1195 | # USB support | ||
1196 | # | ||
1197 | CONFIG_USB_ARCH_HAS_HCD=y | ||
1198 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
1199 | CONFIG_USB=y | ||
1200 | # CONFIG_USB_DEBUG is not set | ||
1201 | |||
1202 | # | ||
1203 | # Miscellaneous USB options | ||
1204 | # | ||
1205 | CONFIG_USB_DEVICEFS=y | ||
1206 | # CONFIG_USB_BANDWIDTH is not set | ||
1207 | CONFIG_USB_DYNAMIC_MINORS=y | ||
1208 | CONFIG_USB_SUSPEND=y | ||
1209 | # CONFIG_USB_OTG is not set | ||
1210 | |||
1211 | # | ||
1212 | # USB Host Controller Drivers | ||
1213 | # | ||
1214 | # CONFIG_USB_EHCI_HCD is not set | ||
1215 | # CONFIG_USB_ISP116X_HCD is not set | ||
1216 | CONFIG_USB_OHCI_HCD=y | ||
1217 | # CONFIG_USB_OHCI_BIG_ENDIAN is not set | ||
1218 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
1219 | # CONFIG_USB_UHCI_HCD is not set | ||
1220 | # CONFIG_USB_SL811_HCD is not set | ||
1221 | |||
1222 | # | ||
1223 | # USB Device Class drivers | ||
1224 | # | ||
1225 | # CONFIG_USB_AUDIO is not set | ||
1226 | # CONFIG_USB_BLUETOOTH_TTY is not set | ||
1227 | # CONFIG_USB_MIDI is not set | ||
1228 | CONFIG_USB_ACM=m | ||
1229 | CONFIG_USB_PRINTER=m | ||
1230 | |||
1231 | # | ||
1232 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information | ||
1233 | # | ||
1234 | # CONFIG_USB_STORAGE is not set | ||
1235 | |||
1236 | # | ||
1237 | # USB Input Devices | ||
1238 | # | ||
1239 | CONFIG_USB_HID=y | ||
1240 | CONFIG_USB_HIDINPUT=y | ||
1241 | # CONFIG_HID_FF is not set | ||
1242 | CONFIG_USB_HIDDEV=y | ||
1243 | # CONFIG_USB_AIPTEK is not set | ||
1244 | # CONFIG_USB_WACOM is not set | ||
1245 | # CONFIG_USB_ACECAD is not set | ||
1246 | # CONFIG_USB_KBTAB is not set | ||
1247 | # CONFIG_USB_POWERMATE is not set | ||
1248 | # CONFIG_USB_MTOUCH is not set | ||
1249 | # CONFIG_USB_ITMTOUCH is not set | ||
1250 | # CONFIG_USB_EGALAX is not set | ||
1251 | # CONFIG_USB_XPAD is not set | ||
1252 | # CONFIG_USB_ATI_REMOTE is not set | ||
1253 | # CONFIG_USB_KEYSPAN_REMOTE is not set | ||
1254 | |||
1255 | # | ||
1256 | # USB Imaging devices | ||
1257 | # | ||
1258 | # CONFIG_USB_MDC800 is not set | ||
1259 | # CONFIG_USB_MICROTEK is not set | ||
1260 | |||
1261 | # | ||
1262 | # USB Multimedia devices | ||
1263 | # | ||
1264 | # CONFIG_USB_DABUSB is not set | ||
1265 | |||
1266 | # | ||
1267 | # Video4Linux support is needed for USB Multimedia device support | ||
1268 | # | ||
1269 | |||
1270 | # | ||
1271 | # USB Network Adapters | ||
1272 | # | ||
1273 | # CONFIG_USB_CATC is not set | ||
1274 | # CONFIG_USB_KAWETH is not set | ||
1275 | CONFIG_USB_PEGASUS=m | ||
1276 | # CONFIG_USB_RTL8150 is not set | ||
1277 | # CONFIG_USB_USBNET is not set | ||
1278 | # CONFIG_USB_ZD1201 is not set | ||
1279 | # CONFIG_USB_MON is not set | ||
1280 | |||
1281 | # | ||
1282 | # USB port drivers | ||
1283 | # | ||
1284 | |||
1285 | # | ||
1286 | # USB Serial Converter support | ||
1287 | # | ||
1288 | CONFIG_USB_SERIAL=m | ||
1289 | # CONFIG_USB_SERIAL_GENERIC is not set | ||
1290 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
1291 | # CONFIG_USB_SERIAL_BELKIN is not set | ||
1292 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
1293 | # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set | ||
1294 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
1295 | # CONFIG_USB_SERIAL_CYPRESS_M8 is not set | ||
1296 | # CONFIG_USB_SERIAL_EMPEG is not set | ||
1297 | # CONFIG_USB_SERIAL_FTDI_SIO is not set | ||
1298 | CONFIG_USB_SERIAL_VISOR=m | ||
1299 | # CONFIG_USB_SERIAL_IPAQ is not set | ||
1300 | # CONFIG_USB_SERIAL_IR is not set | ||
1301 | # CONFIG_USB_SERIAL_EDGEPORT is not set | ||
1302 | # CONFIG_USB_SERIAL_EDGEPORT_TI is not set | ||
1303 | # CONFIG_USB_SERIAL_GARMIN is not set | ||
1304 | # CONFIG_USB_SERIAL_IPW is not set | ||
1305 | # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set | ||
1306 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
1307 | CONFIG_USB_SERIAL_KEYSPAN_MPR=y | ||
1308 | CONFIG_USB_SERIAL_KEYSPAN_USA28=y | ||
1309 | CONFIG_USB_SERIAL_KEYSPAN_USA28X=y | ||
1310 | CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y | ||
1311 | CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y | ||
1312 | CONFIG_USB_SERIAL_KEYSPAN_USA19=y | ||
1313 | CONFIG_USB_SERIAL_KEYSPAN_USA18X=y | ||
1314 | CONFIG_USB_SERIAL_KEYSPAN_USA19W=y | ||
1315 | CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y | ||
1316 | CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y | ||
1317 | CONFIG_USB_SERIAL_KEYSPAN_USA49W=y | ||
1318 | CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y | ||
1319 | # CONFIG_USB_SERIAL_KLSI is not set | ||
1320 | # CONFIG_USB_SERIAL_KOBIL_SCT is not set | ||
1321 | # CONFIG_USB_SERIAL_MCT_U232 is not set | ||
1322 | # CONFIG_USB_SERIAL_PL2303 is not set | ||
1323 | # CONFIG_USB_SERIAL_HP4X is not set | ||
1324 | # CONFIG_USB_SERIAL_SAFE is not set | ||
1325 | # CONFIG_USB_SERIAL_TI is not set | ||
1326 | # CONFIG_USB_SERIAL_CYBERJACK is not set | ||
1327 | # CONFIG_USB_SERIAL_XIRCOM is not set | ||
1328 | # CONFIG_USB_SERIAL_OPTION is not set | ||
1329 | # CONFIG_USB_SERIAL_OMNINET is not set | ||
1330 | CONFIG_USB_EZUSB=y | ||
1331 | |||
1332 | # | ||
1333 | # USB Miscellaneous drivers | ||
1334 | # | ||
1335 | # CONFIG_USB_EMI62 is not set | ||
1336 | # CONFIG_USB_EMI26 is not set | ||
1337 | # CONFIG_USB_AUERSWALD is not set | ||
1338 | # CONFIG_USB_RIO500 is not set | ||
1339 | # CONFIG_USB_LEGOTOWER is not set | ||
1340 | # CONFIG_USB_LCD is not set | ||
1341 | # CONFIG_USB_LED is not set | ||
1342 | # CONFIG_USB_CYTHERM is not set | ||
1343 | # CONFIG_USB_PHIDGETKIT is not set | ||
1344 | # CONFIG_USB_PHIDGETSERVO is not set | ||
1345 | # CONFIG_USB_IDMOUSE is not set | ||
1346 | # CONFIG_USB_LD is not set | ||
1347 | # CONFIG_USB_TEST is not set | ||
1348 | |||
1349 | # | ||
1350 | # USB DSL modem support | ||
1351 | # | ||
1352 | |||
1353 | # | ||
1354 | # USB Gadget Support | ||
1355 | # | ||
1356 | # CONFIG_USB_GADGET is not set | ||
1357 | |||
1358 | # | ||
1359 | # MMC/SD Card support | ||
1360 | # | ||
1361 | # CONFIG_MMC is not set | ||
1362 | |||
1363 | # | ||
1364 | # InfiniBand support | ||
1365 | # | ||
1366 | # CONFIG_INFINIBAND is not set | ||
1367 | |||
1368 | # | ||
1369 | # SN Devices | ||
1370 | # | ||
1371 | |||
1372 | # | ||
1373 | # File systems | ||
1374 | # | ||
1375 | CONFIG_EXT2_FS=y | ||
1376 | CONFIG_EXT2_FS_XATTR=y | ||
1377 | # CONFIG_EXT2_FS_POSIX_ACL is not set | ||
1378 | # CONFIG_EXT2_FS_SECURITY is not set | ||
1379 | # CONFIG_EXT2_FS_XIP is not set | ||
1380 | CONFIG_EXT3_FS=y | ||
1381 | CONFIG_EXT3_FS_XATTR=y | ||
1382 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1383 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1384 | CONFIG_JBD=y | ||
1385 | # CONFIG_JBD_DEBUG is not set | ||
1386 | CONFIG_FS_MBCACHE=y | ||
1387 | # CONFIG_REISERFS_FS is not set | ||
1388 | # CONFIG_JFS_FS is not set | ||
1389 | CONFIG_FS_POSIX_ACL=y | ||
1390 | |||
1391 | # | ||
1392 | # XFS support | ||
1393 | # | ||
1394 | # CONFIG_XFS_FS is not set | ||
1395 | # CONFIG_MINIX_FS is not set | ||
1396 | # CONFIG_ROMFS_FS is not set | ||
1397 | CONFIG_INOTIFY=y | ||
1398 | # CONFIG_QUOTA is not set | ||
1399 | CONFIG_DNOTIFY=y | ||
1400 | # CONFIG_AUTOFS_FS is not set | ||
1401 | # CONFIG_AUTOFS4_FS is not set | ||
1402 | |||
1403 | # | ||
1404 | # CD-ROM/DVD Filesystems | ||
1405 | # | ||
1406 | CONFIG_ISO9660_FS=y | ||
1407 | # CONFIG_JOLIET is not set | ||
1408 | # CONFIG_ZISOFS is not set | ||
1409 | CONFIG_UDF_FS=m | ||
1410 | CONFIG_UDF_NLS=y | ||
1411 | |||
1412 | # | ||
1413 | # DOS/FAT/NT Filesystems | ||
1414 | # | ||
1415 | CONFIG_FAT_FS=m | ||
1416 | CONFIG_MSDOS_FS=m | ||
1417 | CONFIG_VFAT_FS=m | ||
1418 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1419 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1420 | # CONFIG_NTFS_FS is not set | ||
1421 | |||
1422 | # | ||
1423 | # Pseudo filesystems | ||
1424 | # | ||
1425 | CONFIG_PROC_FS=y | ||
1426 | CONFIG_PROC_KCORE=y | ||
1427 | CONFIG_SYSFS=y | ||
1428 | CONFIG_DEVPTS_FS_XATTR=y | ||
1429 | CONFIG_DEVPTS_FS_SECURITY=y | ||
1430 | CONFIG_TMPFS=y | ||
1431 | CONFIG_TMPFS_XATTR=y | ||
1432 | CONFIG_TMPFS_SECURITY=y | ||
1433 | # CONFIG_HUGETLB_PAGE is not set | ||
1434 | CONFIG_RAMFS=y | ||
1435 | |||
1436 | # | ||
1437 | # Miscellaneous filesystems | ||
1438 | # | ||
1439 | # CONFIG_ADFS_FS is not set | ||
1440 | # CONFIG_AFFS_FS is not set | ||
1441 | CONFIG_HFS_FS=m | ||
1442 | CONFIG_HFSPLUS_FS=m | ||
1443 | # CONFIG_BEFS_FS is not set | ||
1444 | # CONFIG_BFS_FS is not set | ||
1445 | # CONFIG_EFS_FS is not set | ||
1446 | CONFIG_CRAMFS=m | ||
1447 | # CONFIG_VXFS_FS is not set | ||
1448 | # CONFIG_HPFS_FS is not set | ||
1449 | # CONFIG_QNX4FS_FS is not set | ||
1450 | # CONFIG_SYSV_FS is not set | ||
1451 | # CONFIG_UFS_FS is not set | ||
1452 | |||
1453 | # | ||
1454 | # Network File Systems | ||
1455 | # | ||
1456 | CONFIG_NFS_FS=y | ||
1457 | CONFIG_NFS_V3=y | ||
1458 | CONFIG_NFS_V3_ACL=y | ||
1459 | # CONFIG_NFS_V4 is not set | ||
1460 | # CONFIG_NFS_DIRECTIO is not set | ||
1461 | CONFIG_NFSD=y | ||
1462 | CONFIG_NFSD_V2_ACL=y | ||
1463 | CONFIG_NFSD_V3=y | ||
1464 | CONFIG_NFSD_V3_ACL=y | ||
1465 | # CONFIG_NFSD_V4 is not set | ||
1466 | CONFIG_NFSD_TCP=y | ||
1467 | CONFIG_LOCKD=y | ||
1468 | CONFIG_LOCKD_V4=y | ||
1469 | CONFIG_EXPORTFS=y | ||
1470 | CONFIG_NFS_ACL_SUPPORT=y | ||
1471 | CONFIG_NFS_COMMON=y | ||
1472 | CONFIG_SUNRPC=y | ||
1473 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1474 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1475 | CONFIG_SMB_FS=m | ||
1476 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
1477 | # CONFIG_CIFS is not set | ||
1478 | # CONFIG_NCP_FS is not set | ||
1479 | # CONFIG_CODA_FS is not set | ||
1480 | # CONFIG_AFS_FS is not set | ||
1481 | |||
1482 | # | ||
1483 | # Partition Types | ||
1484 | # | ||
1485 | CONFIG_PARTITION_ADVANCED=y | ||
1486 | # CONFIG_ACORN_PARTITION is not set | ||
1487 | # CONFIG_OSF_PARTITION is not set | ||
1488 | # CONFIG_AMIGA_PARTITION is not set | ||
1489 | # CONFIG_ATARI_PARTITION is not set | ||
1490 | CONFIG_MAC_PARTITION=y | ||
1491 | CONFIG_MSDOS_PARTITION=y | ||
1492 | # CONFIG_BSD_DISKLABEL is not set | ||
1493 | # CONFIG_MINIX_SUBPARTITION is not set | ||
1494 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
1495 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
1496 | # CONFIG_LDM_PARTITION is not set | ||
1497 | # CONFIG_SGI_PARTITION is not set | ||
1498 | # CONFIG_ULTRIX_PARTITION is not set | ||
1499 | # CONFIG_SUN_PARTITION is not set | ||
1500 | # CONFIG_EFI_PARTITION is not set | ||
1501 | |||
1502 | # | ||
1503 | # Native Language Support | ||
1504 | # | ||
1505 | CONFIG_NLS=y | ||
1506 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1507 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
1508 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1509 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1510 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1511 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1512 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1513 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1514 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1515 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1516 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1517 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1518 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1519 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1520 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1521 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1522 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1523 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1524 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1525 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1526 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1527 | # CONFIG_NLS_ISO8859_8 is not set | ||
1528 | CONFIG_NLS_CODEPAGE_1250=m | ||
1529 | CONFIG_NLS_CODEPAGE_1251=m | ||
1530 | CONFIG_NLS_ASCII=m | ||
1531 | CONFIG_NLS_ISO8859_1=m | ||
1532 | # CONFIG_NLS_ISO8859_2 is not set | ||
1533 | # CONFIG_NLS_ISO8859_3 is not set | ||
1534 | # CONFIG_NLS_ISO8859_4 is not set | ||
1535 | # CONFIG_NLS_ISO8859_5 is not set | ||
1536 | # CONFIG_NLS_ISO8859_6 is not set | ||
1537 | # CONFIG_NLS_ISO8859_7 is not set | ||
1538 | # CONFIG_NLS_ISO8859_9 is not set | ||
1539 | # CONFIG_NLS_ISO8859_13 is not set | ||
1540 | # CONFIG_NLS_ISO8859_14 is not set | ||
1541 | CONFIG_NLS_ISO8859_15=m | ||
1542 | # CONFIG_NLS_KOI8_R is not set | ||
1543 | # CONFIG_NLS_KOI8_U is not set | ||
1544 | CONFIG_NLS_UTF8=m | ||
1545 | |||
1546 | # | ||
1547 | # Library routines | ||
1548 | # | ||
1549 | CONFIG_CRC_CCITT=y | ||
1550 | CONFIG_CRC32=y | ||
1551 | # CONFIG_LIBCRC32C is not set | ||
1552 | CONFIG_ZLIB_INFLATE=y | ||
1553 | CONFIG_ZLIB_DEFLATE=y | ||
1554 | |||
1555 | # | ||
1556 | # Profiling support | ||
1557 | # | ||
1558 | # CONFIG_PROFILING is not set | ||
1559 | |||
1560 | # | ||
1561 | # Kernel hacking | ||
1562 | # | ||
1563 | # CONFIG_PRINTK_TIME is not set | ||
1564 | CONFIG_DEBUG_KERNEL=y | ||
1565 | CONFIG_MAGIC_SYSRQ=y | ||
1566 | CONFIG_LOG_BUF_SHIFT=16 | ||
1567 | # CONFIG_SCHEDSTATS is not set | ||
1568 | # CONFIG_DEBUG_SLAB is not set | ||
1569 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1570 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1571 | # CONFIG_DEBUG_KOBJECT is not set | ||
1572 | # CONFIG_DEBUG_INFO is not set | ||
1573 | # CONFIG_DEBUG_FS is not set | ||
1574 | # CONFIG_XMON is not set | ||
1575 | # CONFIG_BDI_SWITCH is not set | ||
1576 | CONFIG_BOOTX_TEXT=y | ||
1577 | |||
1578 | # | ||
1579 | # Security options | ||
1580 | # | ||
1581 | # CONFIG_KEYS is not set | ||
1582 | # CONFIG_SECURITY is not set | ||
1583 | |||
1584 | # | ||
1585 | # Cryptographic options | ||
1586 | # | ||
1587 | # CONFIG_CRYPTO is not set | ||
1588 | |||
1589 | # | ||
1590 | # Hardware crypto devices | ||
1591 | # | ||
diff --git a/arch/ppc/configs/power3_defconfig b/arch/ppc/configs/power3_defconfig deleted file mode 100644 index a1ef929bca59..000000000000 --- a/arch/ppc/configs/power3_defconfig +++ /dev/null | |||
@@ -1,1035 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # | ||
4 | CONFIG_MMU=y | ||
5 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
6 | CONFIG_HAVE_DEC_LOCK=y | ||
7 | CONFIG_PPC=y | ||
8 | CONFIG_PPC32=y | ||
9 | CONFIG_GENERIC_NVRAM=y | ||
10 | |||
11 | # | ||
12 | # Code maturity level options | ||
13 | # | ||
14 | CONFIG_EXPERIMENTAL=y | ||
15 | CONFIG_CLEAN_COMPILE=y | ||
16 | # CONFIG_STANDALONE is not set | ||
17 | |||
18 | # | ||
19 | # General setup | ||
20 | # | ||
21 | CONFIG_SWAP=y | ||
22 | CONFIG_SYSVIPC=y | ||
23 | CONFIG_POSIX_MQUEUE=y | ||
24 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
25 | CONFIG_SYSCTL=y | ||
26 | # CONFIG_AUDIT is not set | ||
27 | CONFIG_LOG_BUF_SHIFT=15 | ||
28 | # CONFIG_HOTPLUG is not set | ||
29 | CONFIG_IKCONFIG=y | ||
30 | CONFIG_IKCONFIG_PROC=y | ||
31 | # CONFIG_EMBEDDED is not set | ||
32 | CONFIG_KALLSYMS=y | ||
33 | CONFIG_FUTEX=y | ||
34 | CONFIG_EPOLL=y | ||
35 | CONFIG_IOSCHED_NOOP=y | ||
36 | CONFIG_IOSCHED_AS=y | ||
37 | CONFIG_IOSCHED_DEADLINE=y | ||
38 | CONFIG_IOSCHED_CFQ=y | ||
39 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
40 | |||
41 | # | ||
42 | # Loadable module support | ||
43 | # | ||
44 | CONFIG_MODULES=y | ||
45 | CONFIG_MODULE_UNLOAD=y | ||
46 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
47 | CONFIG_OBSOLETE_MODPARM=y | ||
48 | # CONFIG_MODVERSIONS is not set | ||
49 | CONFIG_KMOD=y | ||
50 | CONFIG_STOP_MACHINE=y | ||
51 | |||
52 | # | ||
53 | # Processor | ||
54 | # | ||
55 | # CONFIG_6xx is not set | ||
56 | # CONFIG_40x is not set | ||
57 | # CONFIG_44x is not set | ||
58 | CONFIG_POWER3=y | ||
59 | # CONFIG_POWER4 is not set | ||
60 | # CONFIG_8xx is not set | ||
61 | # CONFIG_CPU_FREQ is not set | ||
62 | CONFIG_PPC64BRIDGE=y | ||
63 | CONFIG_PPC_STD_MMU=y | ||
64 | |||
65 | # | ||
66 | # Platform options | ||
67 | # | ||
68 | CONFIG_PPC_MULTIPLATFORM=y | ||
69 | # CONFIG_APUS is not set | ||
70 | # CONFIG_WILLOW is not set | ||
71 | # CONFIG_PCORE is not set | ||
72 | # CONFIG_POWERPMC250 is not set | ||
73 | # CONFIG_EV64260 is not set | ||
74 | # CONFIG_SPRUCE is not set | ||
75 | # CONFIG_LOPEC is not set | ||
76 | # CONFIG_MCPN765 is not set | ||
77 | # CONFIG_MVME5100 is not set | ||
78 | # CONFIG_PPLUS is not set | ||
79 | # CONFIG_PRPMC750 is not set | ||
80 | # CONFIG_PRPMC800 is not set | ||
81 | # CONFIG_SANDPOINT is not set | ||
82 | # CONFIG_ADIR is not set | ||
83 | # CONFIG_K2 is not set | ||
84 | # CONFIG_PAL4 is not set | ||
85 | # CONFIG_GEMINI is not set | ||
86 | # CONFIG_EST8260 is not set | ||
87 | # CONFIG_SBS8260 is not set | ||
88 | # CONFIG_RPX6 is not set | ||
89 | # CONFIG_TQM8260 is not set | ||
90 | CONFIG_PPC_CHRP=y | ||
91 | CONFIG_PPC_PMAC=y | ||
92 | CONFIG_PPC_PREP=y | ||
93 | CONFIG_PPC_OF=y | ||
94 | CONFIG_PPCBUG_NVRAM=y | ||
95 | CONFIG_SMP=y | ||
96 | # CONFIG_IRQ_ALL_CPUS is not set | ||
97 | CONFIG_NR_CPUS=32 | ||
98 | # CONFIG_PREEMPT is not set | ||
99 | CONFIG_HIGHMEM=y | ||
100 | CONFIG_KERNEL_ELF=y | ||
101 | CONFIG_BINFMT_ELF=y | ||
102 | CONFIG_BINFMT_MISC=y | ||
103 | CONFIG_PROC_DEVICETREE=y | ||
104 | CONFIG_PPC_RTAS=y | ||
105 | # CONFIG_PREP_RESIDUAL is not set | ||
106 | # CONFIG_CMDLINE_BOOL is not set | ||
107 | |||
108 | # | ||
109 | # Bus options | ||
110 | # | ||
111 | CONFIG_ISA=y | ||
112 | CONFIG_GENERIC_ISA_DMA=y | ||
113 | CONFIG_PCI=y | ||
114 | CONFIG_PCI_DOMAINS=y | ||
115 | CONFIG_PCI_LEGACY_PROC=y | ||
116 | CONFIG_PCI_NAMES=y | ||
117 | |||
118 | # | ||
119 | # Advanced setup | ||
120 | # | ||
121 | CONFIG_ADVANCED_OPTIONS=y | ||
122 | # CONFIG_HIGHMEM_START_BOOL is not set | ||
123 | CONFIG_HIGHMEM_START=0xfe000000 | ||
124 | # CONFIG_LOWMEM_SIZE_BOOL is not set | ||
125 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
126 | # CONFIG_KERNEL_START_BOOL is not set | ||
127 | CONFIG_KERNEL_START=0xc0000000 | ||
128 | CONFIG_TASK_SIZE_BOOL=y | ||
129 | CONFIG_TASK_SIZE=0xc0000000 | ||
130 | CONFIG_BOOT_LOAD=0x00800000 | ||
131 | |||
132 | # | ||
133 | # Device Drivers | ||
134 | # | ||
135 | |||
136 | # | ||
137 | # Generic Driver Options | ||
138 | # | ||
139 | |||
140 | # | ||
141 | # Memory Technology Devices (MTD) | ||
142 | # | ||
143 | # CONFIG_MTD is not set | ||
144 | |||
145 | # | ||
146 | # Parallel port support | ||
147 | # | ||
148 | CONFIG_PARPORT=m | ||
149 | CONFIG_PARPORT_PC=m | ||
150 | CONFIG_PARPORT_PC_CML1=m | ||
151 | # CONFIG_PARPORT_SERIAL is not set | ||
152 | CONFIG_PARPORT_PC_FIFO=y | ||
153 | # CONFIG_PARPORT_PC_SUPERIO is not set | ||
154 | # CONFIG_PARPORT_OTHER is not set | ||
155 | # CONFIG_PARPORT_1284 is not set | ||
156 | |||
157 | # | ||
158 | # Plug and Play support | ||
159 | # | ||
160 | # CONFIG_PNP is not set | ||
161 | |||
162 | # | ||
163 | # Block devices | ||
164 | # | ||
165 | CONFIG_BLK_DEV_FD=y | ||
166 | # CONFIG_BLK_DEV_XD is not set | ||
167 | # CONFIG_PARIDE is not set | ||
168 | # CONFIG_BLK_CPQ_DA is not set | ||
169 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
170 | # CONFIG_BLK_DEV_DAC960 is not set | ||
171 | # CONFIG_BLK_DEV_UMEM is not set | ||
172 | CONFIG_BLK_DEV_LOOP=y | ||
173 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
174 | # CONFIG_BLK_DEV_NBD is not set | ||
175 | # CONFIG_BLK_DEV_CARMEL is not set | ||
176 | CONFIG_BLK_DEV_RAM=y | ||
177 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
178 | CONFIG_BLK_DEV_INITRD=y | ||
179 | CONFIG_LBD=y | ||
180 | |||
181 | # | ||
182 | # ATA/ATAPI/MFM/RLL support | ||
183 | # | ||
184 | # CONFIG_IDE is not set | ||
185 | |||
186 | # | ||
187 | # SCSI device support | ||
188 | # | ||
189 | CONFIG_SCSI=y | ||
190 | CONFIG_SCSI_PROC_FS=y | ||
191 | |||
192 | # | ||
193 | # SCSI support type (disk, tape, CD-ROM) | ||
194 | # | ||
195 | CONFIG_BLK_DEV_SD=y | ||
196 | CONFIG_CHR_DEV_ST=y | ||
197 | # CONFIG_CHR_DEV_OSST is not set | ||
198 | CONFIG_BLK_DEV_SR=y | ||
199 | CONFIG_BLK_DEV_SR_VENDOR=y | ||
200 | CONFIG_CHR_DEV_SG=y | ||
201 | |||
202 | # | ||
203 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
204 | # | ||
205 | # CONFIG_SCSI_MULTI_LUN is not set | ||
206 | # CONFIG_SCSI_REPORT_LUNS is not set | ||
207 | CONFIG_SCSI_CONSTANTS=y | ||
208 | CONFIG_SCSI_LOGGING=y | ||
209 | |||
210 | # | ||
211 | # SCSI Transport Attributes | ||
212 | # | ||
213 | CONFIG_SCSI_SPI_ATTRS=y | ||
214 | # CONFIG_SCSI_FC_ATTRS is not set | ||
215 | |||
216 | # | ||
217 | # SCSI low-level drivers | ||
218 | # | ||
219 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
220 | # CONFIG_SCSI_7000FASST is not set | ||
221 | # CONFIG_SCSI_ACARD is not set | ||
222 | # CONFIG_SCSI_AHA152X is not set | ||
223 | # CONFIG_SCSI_AHA1542 is not set | ||
224 | # CONFIG_SCSI_AACRAID is not set | ||
225 | # CONFIG_SCSI_AIC7XXX is not set | ||
226 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
227 | # CONFIG_SCSI_AIC79XX is not set | ||
228 | # CONFIG_SCSI_ADVANSYS is not set | ||
229 | # CONFIG_SCSI_IN2000 is not set | ||
230 | # CONFIG_SCSI_MEGARAID is not set | ||
231 | # CONFIG_SCSI_SATA is not set | ||
232 | # CONFIG_SCSI_BUSLOGIC is not set | ||
233 | # CONFIG_SCSI_CPQFCTS is not set | ||
234 | # CONFIG_SCSI_DMX3191D is not set | ||
235 | # CONFIG_SCSI_DTC3280 is not set | ||
236 | # CONFIG_SCSI_EATA is not set | ||
237 | # CONFIG_SCSI_EATA_PIO is not set | ||
238 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
239 | # CONFIG_SCSI_GDTH is not set | ||
240 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
241 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
242 | # CONFIG_SCSI_IPS is not set | ||
243 | # CONFIG_SCSI_INIA100 is not set | ||
244 | # CONFIG_SCSI_PPA is not set | ||
245 | # CONFIG_SCSI_IMM is not set | ||
246 | # CONFIG_SCSI_NCR53C406A is not set | ||
247 | CONFIG_SCSI_SYM53C8XX_2=y | ||
248 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 | ||
249 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | ||
250 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | ||
251 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | ||
252 | # CONFIG_SCSI_IPR is not set | ||
253 | # CONFIG_SCSI_PAS16 is not set | ||
254 | # CONFIG_SCSI_PSI240I is not set | ||
255 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
256 | # CONFIG_SCSI_QLOGIC_ISP is not set | ||
257 | # CONFIG_SCSI_QLOGIC_FC is not set | ||
258 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
259 | CONFIG_SCSI_QLA2XXX=y | ||
260 | # CONFIG_SCSI_QLA21XX is not set | ||
261 | # CONFIG_SCSI_QLA22XX is not set | ||
262 | # CONFIG_SCSI_QLA2300 is not set | ||
263 | # CONFIG_SCSI_QLA2322 is not set | ||
264 | # CONFIG_SCSI_QLA6312 is not set | ||
265 | # CONFIG_SCSI_QLA6322 is not set | ||
266 | # CONFIG_SCSI_SYM53C416 is not set | ||
267 | # CONFIG_SCSI_DC395x is not set | ||
268 | # CONFIG_SCSI_DC390T is not set | ||
269 | # CONFIG_SCSI_T128 is not set | ||
270 | # CONFIG_SCSI_U14_34F is not set | ||
271 | # CONFIG_SCSI_NSP32 is not set | ||
272 | # CONFIG_SCSI_DEBUG is not set | ||
273 | # CONFIG_SCSI_MESH is not set | ||
274 | # CONFIG_SCSI_MAC53C94 is not set | ||
275 | |||
276 | # | ||
277 | # Old CD-ROM drivers (not SCSI, not IDE) | ||
278 | # | ||
279 | # CONFIG_CD_NO_IDESCSI is not set | ||
280 | |||
281 | # | ||
282 | # Multi-device support (RAID and LVM) | ||
283 | # | ||
284 | CONFIG_MD=y | ||
285 | CONFIG_BLK_DEV_MD=y | ||
286 | CONFIG_MD_LINEAR=y | ||
287 | CONFIG_MD_RAID0=y | ||
288 | CONFIG_MD_RAID1=y | ||
289 | CONFIG_MD_RAID5=y | ||
290 | CONFIG_MD_RAID6=y | ||
291 | # CONFIG_MD_MULTIPATH is not set | ||
292 | CONFIG_BLK_DEV_DM=y | ||
293 | CONFIG_DM_CRYPT=y | ||
294 | |||
295 | # | ||
296 | # Fusion MPT device support | ||
297 | # | ||
298 | # CONFIG_FUSION is not set | ||
299 | |||
300 | # | ||
301 | # IEEE 1394 (FireWire) support | ||
302 | # | ||
303 | # CONFIG_IEEE1394 is not set | ||
304 | |||
305 | # | ||
306 | # I2O device support | ||
307 | # | ||
308 | # CONFIG_I2O is not set | ||
309 | |||
310 | # | ||
311 | # Macintosh device drivers | ||
312 | # | ||
313 | # CONFIG_ADB is not set | ||
314 | # CONFIG_ADB_CUDA is not set | ||
315 | # CONFIG_ADB_PMU is not set | ||
316 | # CONFIG_MAC_FLOPPY is not set | ||
317 | # CONFIG_MAC_SERIAL is not set | ||
318 | |||
319 | # | ||
320 | # Networking support | ||
321 | # | ||
322 | CONFIG_NET=y | ||
323 | |||
324 | # | ||
325 | # Networking options | ||
326 | # | ||
327 | CONFIG_PACKET=y | ||
328 | # CONFIG_PACKET_MMAP is not set | ||
329 | # CONFIG_NETLINK_DEV is not set | ||
330 | CONFIG_UNIX=y | ||
331 | # CONFIG_NET_KEY is not set | ||
332 | CONFIG_INET=y | ||
333 | CONFIG_IP_MULTICAST=y | ||
334 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
335 | # CONFIG_IP_PNP is not set | ||
336 | # CONFIG_NET_IPIP is not set | ||
337 | # CONFIG_NET_IPGRE is not set | ||
338 | # CONFIG_IP_MROUTE is not set | ||
339 | # CONFIG_ARPD is not set | ||
340 | CONFIG_SYN_COOKIES=y | ||
341 | # CONFIG_INET_AH is not set | ||
342 | # CONFIG_INET_ESP is not set | ||
343 | # CONFIG_INET_IPCOMP is not set | ||
344 | # CONFIG_IPV6 is not set | ||
345 | # CONFIG_NETFILTER is not set | ||
346 | |||
347 | # | ||
348 | # SCTP Configuration (EXPERIMENTAL) | ||
349 | # | ||
350 | # CONFIG_IP_SCTP is not set | ||
351 | # CONFIG_ATM is not set | ||
352 | # CONFIG_BRIDGE is not set | ||
353 | # CONFIG_VLAN_8021Q is not set | ||
354 | # CONFIG_DECNET is not set | ||
355 | # CONFIG_LLC2 is not set | ||
356 | # CONFIG_IPX is not set | ||
357 | # CONFIG_ATALK is not set | ||
358 | # CONFIG_X25 is not set | ||
359 | # CONFIG_LAPB is not set | ||
360 | # CONFIG_NET_DIVERT is not set | ||
361 | # CONFIG_ECONET is not set | ||
362 | # CONFIG_WAN_ROUTER is not set | ||
363 | # CONFIG_NET_HW_FLOWCONTROL is not set | ||
364 | |||
365 | # | ||
366 | # QoS and/or fair queueing | ||
367 | # | ||
368 | # CONFIG_NET_SCHED is not set | ||
369 | |||
370 | # | ||
371 | # Network testing | ||
372 | # | ||
373 | # CONFIG_NET_PKTGEN is not set | ||
374 | # CONFIG_NETPOLL is not set | ||
375 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
376 | # CONFIG_HAMRADIO is not set | ||
377 | # CONFIG_IRDA is not set | ||
378 | # CONFIG_BT is not set | ||
379 | CONFIG_NETDEVICES=y | ||
380 | # CONFIG_DUMMY is not set | ||
381 | # CONFIG_BONDING is not set | ||
382 | # CONFIG_EQUALIZER is not set | ||
383 | # CONFIG_TUN is not set | ||
384 | |||
385 | # | ||
386 | # ARCnet devices | ||
387 | # | ||
388 | # CONFIG_ARCNET is not set | ||
389 | |||
390 | # | ||
391 | # Ethernet (10 or 100Mbit) | ||
392 | # | ||
393 | CONFIG_NET_ETHERNET=y | ||
394 | CONFIG_MII=y | ||
395 | # CONFIG_MACE is not set | ||
396 | # CONFIG_BMAC is not set | ||
397 | # CONFIG_OAKNET is not set | ||
398 | # CONFIG_HAPPYMEAL is not set | ||
399 | # CONFIG_SUNGEM is not set | ||
400 | # CONFIG_NET_VENDOR_3COM is not set | ||
401 | # CONFIG_LANCE is not set | ||
402 | # CONFIG_NET_VENDOR_SMC is not set | ||
403 | # CONFIG_NET_VENDOR_RACAL is not set | ||
404 | |||
405 | # | ||
406 | # Tulip family network device support | ||
407 | # | ||
408 | # CONFIG_NET_TULIP is not set | ||
409 | # CONFIG_AT1700 is not set | ||
410 | # CONFIG_DEPCA is not set | ||
411 | # CONFIG_HP100 is not set | ||
412 | # CONFIG_NET_ISA is not set | ||
413 | CONFIG_NET_PCI=y | ||
414 | CONFIG_PCNET32=y | ||
415 | # CONFIG_AMD8111_ETH is not set | ||
416 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
417 | # CONFIG_AC3200 is not set | ||
418 | # CONFIG_APRICOT is not set | ||
419 | # CONFIG_B44 is not set | ||
420 | # CONFIG_FORCEDETH is not set | ||
421 | # CONFIG_CS89x0 is not set | ||
422 | # CONFIG_DGRS is not set | ||
423 | # CONFIG_EEPRO100 is not set | ||
424 | CONFIG_E100=y | ||
425 | # CONFIG_E100_NAPI is not set | ||
426 | # CONFIG_FEALNX is not set | ||
427 | # CONFIG_NATSEMI is not set | ||
428 | # CONFIG_NE2K_PCI is not set | ||
429 | # CONFIG_8139CP is not set | ||
430 | # CONFIG_8139TOO is not set | ||
431 | # CONFIG_SIS900 is not set | ||
432 | # CONFIG_EPIC100 is not set | ||
433 | # CONFIG_SUNDANCE is not set | ||
434 | # CONFIG_TLAN is not set | ||
435 | # CONFIG_VIA_RHINE is not set | ||
436 | # CONFIG_NET_POCKET is not set | ||
437 | |||
438 | # | ||
439 | # Ethernet (1000 Mbit) | ||
440 | # | ||
441 | # CONFIG_ACENIC is not set | ||
442 | # CONFIG_DL2K is not set | ||
443 | CONFIG_E1000=y | ||
444 | # CONFIG_E1000_NAPI is not set | ||
445 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
446 | # CONFIG_NS83820 is not set | ||
447 | # CONFIG_HAMACHI is not set | ||
448 | # CONFIG_YELLOWFIN is not set | ||
449 | # CONFIG_R8169 is not set | ||
450 | # CONFIG_SK98LIN is not set | ||
451 | # CONFIG_TIGON3 is not set | ||
452 | |||
453 | # | ||
454 | # Ethernet (10000 Mbit) | ||
455 | # | ||
456 | # CONFIG_IXGB is not set | ||
457 | # CONFIG_S2IO is not set | ||
458 | |||
459 | # | ||
460 | # Token Ring devices | ||
461 | # | ||
462 | # CONFIG_TR is not set | ||
463 | |||
464 | # | ||
465 | # Wireless LAN (non-hamradio) | ||
466 | # | ||
467 | # CONFIG_NET_RADIO is not set | ||
468 | |||
469 | # | ||
470 | # Wan interfaces | ||
471 | # | ||
472 | # CONFIG_WAN is not set | ||
473 | # CONFIG_FDDI is not set | ||
474 | # CONFIG_HIPPI is not set | ||
475 | # CONFIG_PLIP is not set | ||
476 | # CONFIG_PPP is not set | ||
477 | # CONFIG_SLIP is not set | ||
478 | # CONFIG_NET_FC is not set | ||
479 | # CONFIG_RCPCI is not set | ||
480 | # CONFIG_SHAPER is not set | ||
481 | # CONFIG_NETCONSOLE is not set | ||
482 | |||
483 | # | ||
484 | # ISDN subsystem | ||
485 | # | ||
486 | # CONFIG_ISDN is not set | ||
487 | |||
488 | # | ||
489 | # Telephony Support | ||
490 | # | ||
491 | # CONFIG_PHONE is not set | ||
492 | |||
493 | # | ||
494 | # Input device support | ||
495 | # | ||
496 | CONFIG_INPUT=y | ||
497 | |||
498 | # | ||
499 | # Userland interfaces | ||
500 | # | ||
501 | CONFIG_INPUT_MOUSEDEV=y | ||
502 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
503 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
504 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
505 | # CONFIG_INPUT_JOYDEV is not set | ||
506 | # CONFIG_INPUT_TSDEV is not set | ||
507 | CONFIG_INPUT_EVDEV=y | ||
508 | # CONFIG_INPUT_EVBUG is not set | ||
509 | |||
510 | # | ||
511 | # Input I/O drivers | ||
512 | # | ||
513 | CONFIG_GAMEPORT=m | ||
514 | CONFIG_SOUND_GAMEPORT=m | ||
515 | # CONFIG_GAMEPORT_NS558 is not set | ||
516 | # CONFIG_GAMEPORT_L4 is not set | ||
517 | # CONFIG_GAMEPORT_EMU10K1 is not set | ||
518 | # CONFIG_GAMEPORT_VORTEX is not set | ||
519 | # CONFIG_GAMEPORT_FM801 is not set | ||
520 | # CONFIG_GAMEPORT_CS461x is not set | ||
521 | CONFIG_SERIO=y | ||
522 | CONFIG_SERIO_I8042=y | ||
523 | CONFIG_SERIO_SERPORT=y | ||
524 | # CONFIG_SERIO_CT82C710 is not set | ||
525 | # CONFIG_SERIO_PARKBD is not set | ||
526 | # CONFIG_SERIO_PCIPS2 is not set | ||
527 | |||
528 | # | ||
529 | # Input Device Drivers | ||
530 | # | ||
531 | CONFIG_INPUT_KEYBOARD=y | ||
532 | CONFIG_KEYBOARD_ATKBD=y | ||
533 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
534 | # CONFIG_KEYBOARD_LKKBD is not set | ||
535 | # CONFIG_KEYBOARD_XTKBD is not set | ||
536 | # CONFIG_KEYBOARD_NEWTON is not set | ||
537 | CONFIG_INPUT_MOUSE=y | ||
538 | CONFIG_MOUSE_PS2=y | ||
539 | # CONFIG_MOUSE_SERIAL is not set | ||
540 | # CONFIG_MOUSE_INPORT is not set | ||
541 | # CONFIG_MOUSE_LOGIBM is not set | ||
542 | # CONFIG_MOUSE_PC110PAD is not set | ||
543 | # CONFIG_MOUSE_VSXXXAA is not set | ||
544 | # CONFIG_INPUT_JOYSTICK is not set | ||
545 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
546 | CONFIG_INPUT_MISC=y | ||
547 | CONFIG_INPUT_UINPUT=y | ||
548 | |||
549 | # | ||
550 | # Character devices | ||
551 | # | ||
552 | CONFIG_VT=y | ||
553 | CONFIG_VT_CONSOLE=y | ||
554 | CONFIG_HW_CONSOLE=y | ||
555 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
556 | |||
557 | # | ||
558 | # Serial drivers | ||
559 | # | ||
560 | CONFIG_SERIAL_8250=y | ||
561 | CONFIG_SERIAL_8250_CONSOLE=y | ||
562 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
563 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
564 | |||
565 | # | ||
566 | # Non-8250 serial port support | ||
567 | # | ||
568 | CONFIG_SERIAL_CORE=y | ||
569 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
570 | # CONFIG_SERIAL_PMACZILOG is not set | ||
571 | CONFIG_UNIX98_PTYS=y | ||
572 | CONFIG_LEGACY_PTYS=y | ||
573 | CONFIG_LEGACY_PTY_COUNT=256 | ||
574 | CONFIG_PRINTER=m | ||
575 | # CONFIG_LP_CONSOLE is not set | ||
576 | # CONFIG_PPDEV is not set | ||
577 | # CONFIG_TIPAR is not set | ||
578 | # CONFIG_QIC02_TAPE is not set | ||
579 | |||
580 | # | ||
581 | # IPMI | ||
582 | # | ||
583 | # CONFIG_IPMI_HANDLER is not set | ||
584 | |||
585 | # | ||
586 | # Watchdog Cards | ||
587 | # | ||
588 | # CONFIG_WATCHDOG is not set | ||
589 | CONFIG_NVRAM=y | ||
590 | CONFIG_GEN_RTC=y | ||
591 | # CONFIG_GEN_RTC_X is not set | ||
592 | # CONFIG_DTLK is not set | ||
593 | # CONFIG_R3964 is not set | ||
594 | # CONFIG_APPLICOM is not set | ||
595 | |||
596 | # | ||
597 | # Ftape, the floppy tape device driver | ||
598 | # | ||
599 | # CONFIG_AGP is not set | ||
600 | # CONFIG_DRM is not set | ||
601 | # CONFIG_RAW_DRIVER is not set | ||
602 | |||
603 | # | ||
604 | # I2C support | ||
605 | # | ||
606 | CONFIG_I2C=y | ||
607 | CONFIG_I2C_CHARDEV=y | ||
608 | |||
609 | # | ||
610 | # I2C Algorithms | ||
611 | # | ||
612 | CONFIG_I2C_ALGOBIT=y | ||
613 | CONFIG_I2C_ALGOPCF=y | ||
614 | |||
615 | # | ||
616 | # I2C Hardware Bus support | ||
617 | # | ||
618 | # CONFIG_I2C_ALI1535 is not set | ||
619 | # CONFIG_I2C_ALI1563 is not set | ||
620 | # CONFIG_I2C_ALI15X3 is not set | ||
621 | # CONFIG_I2C_AMD756 is not set | ||
622 | # CONFIG_I2C_AMD8111 is not set | ||
623 | # CONFIG_I2C_HYDRA is not set | ||
624 | # CONFIG_I2C_I801 is not set | ||
625 | # CONFIG_I2C_I810 is not set | ||
626 | # CONFIG_I2C_ISA is not set | ||
627 | # CONFIG_I2C_KEYWEST is not set | ||
628 | # CONFIG_I2C_NFORCE2 is not set | ||
629 | # CONFIG_I2C_PARPORT is not set | ||
630 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
631 | # CONFIG_I2C_PIIX4 is not set | ||
632 | # CONFIG_I2C_PROSAVAGE is not set | ||
633 | # CONFIG_I2C_SAVAGE4 is not set | ||
634 | # CONFIG_SCx200_ACB is not set | ||
635 | # CONFIG_I2C_SIS5595 is not set | ||
636 | # CONFIG_I2C_SIS630 is not set | ||
637 | # CONFIG_I2C_SIS96X is not set | ||
638 | # CONFIG_I2C_VIA is not set | ||
639 | # CONFIG_I2C_VIAPRO is not set | ||
640 | # CONFIG_I2C_VOODOO3 is not set | ||
641 | |||
642 | # | ||
643 | # Hardware Sensors Chip support | ||
644 | # | ||
645 | # CONFIG_I2C_SENSOR is not set | ||
646 | # CONFIG_SENSORS_ADM1021 is not set | ||
647 | # CONFIG_SENSORS_ASB100 is not set | ||
648 | # CONFIG_SENSORS_DS1621 is not set | ||
649 | # CONFIG_SENSORS_FSCHER is not set | ||
650 | # CONFIG_SENSORS_GL518SM is not set | ||
651 | # CONFIG_SENSORS_IT87 is not set | ||
652 | # CONFIG_SENSORS_LM75 is not set | ||
653 | # CONFIG_SENSORS_LM78 is not set | ||
654 | # CONFIG_SENSORS_LM80 is not set | ||
655 | # CONFIG_SENSORS_LM83 is not set | ||
656 | # CONFIG_SENSORS_LM85 is not set | ||
657 | # CONFIG_SENSORS_LM90 is not set | ||
658 | # CONFIG_SENSORS_VIA686A is not set | ||
659 | # CONFIG_SENSORS_W83781D is not set | ||
660 | # CONFIG_SENSORS_W83L785TS is not set | ||
661 | # CONFIG_SENSORS_W83627HF is not set | ||
662 | |||
663 | # | ||
664 | # Other I2C Chip support | ||
665 | # | ||
666 | # CONFIG_SENSORS_EEPROM is not set | ||
667 | # CONFIG_SENSORS_PCF8574 is not set | ||
668 | # CONFIG_SENSORS_PCF8591 is not set | ||
669 | # CONFIG_I2C_DEBUG_CORE is not set | ||
670 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
671 | # CONFIG_I2C_DEBUG_BUS is not set | ||
672 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
673 | |||
674 | # | ||
675 | # Misc devices | ||
676 | # | ||
677 | |||
678 | # | ||
679 | # Multimedia devices | ||
680 | # | ||
681 | # CONFIG_VIDEO_DEV is not set | ||
682 | |||
683 | # | ||
684 | # Digital Video Broadcasting Devices | ||
685 | # | ||
686 | # CONFIG_DVB is not set | ||
687 | |||
688 | # | ||
689 | # Graphics support | ||
690 | # | ||
691 | CONFIG_FB=y | ||
692 | # CONFIG_FB_PM2 is not set | ||
693 | # CONFIG_FB_CYBER2000 is not set | ||
694 | CONFIG_FB_OF=y | ||
695 | # CONFIG_FB_CONTROL is not set | ||
696 | # CONFIG_FB_PLATINUM is not set | ||
697 | # CONFIG_FB_VALKYRIE is not set | ||
698 | # CONFIG_FB_CT65550 is not set | ||
699 | # CONFIG_FB_IMSTT is not set | ||
700 | # CONFIG_FB_S3TRIO is not set | ||
701 | # CONFIG_FB_VGA16 is not set | ||
702 | # CONFIG_FB_RIVA is not set | ||
703 | CONFIG_FB_MATROX=y | ||
704 | CONFIG_FB_MATROX_MILLENIUM=y | ||
705 | CONFIG_FB_MATROX_MYSTIQUE=y | ||
706 | # CONFIG_FB_MATROX_G450 is not set | ||
707 | CONFIG_FB_MATROX_G100A=y | ||
708 | CONFIG_FB_MATROX_G100=y | ||
709 | CONFIG_FB_MATROX_I2C=y | ||
710 | # CONFIG_FB_MATROX_MAVEN is not set | ||
711 | CONFIG_FB_MATROX_MULTIHEAD=y | ||
712 | # CONFIG_FB_RADEON_OLD is not set | ||
713 | # CONFIG_FB_RADEON is not set | ||
714 | # CONFIG_FB_ATY128 is not set | ||
715 | # CONFIG_FB_ATY is not set | ||
716 | # CONFIG_FB_SIS is not set | ||
717 | # CONFIG_FB_NEOMAGIC is not set | ||
718 | # CONFIG_FB_KYRO is not set | ||
719 | # CONFIG_FB_3DFX is not set | ||
720 | # CONFIG_FB_VOODOO1 is not set | ||
721 | # CONFIG_FB_TRIDENT is not set | ||
722 | # CONFIG_FB_VIRTUAL is not set | ||
723 | |||
724 | # | ||
725 | # Console display driver support | ||
726 | # | ||
727 | # CONFIG_VGA_CONSOLE is not set | ||
728 | # CONFIG_MDA_CONSOLE is not set | ||
729 | CONFIG_DUMMY_CONSOLE=y | ||
730 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
731 | CONFIG_PCI_CONSOLE=y | ||
732 | # CONFIG_FONTS is not set | ||
733 | CONFIG_FONT_8x8=y | ||
734 | CONFIG_FONT_8x16=y | ||
735 | |||
736 | # | ||
737 | # Logo configuration | ||
738 | # | ||
739 | CONFIG_LOGO=y | ||
740 | CONFIG_LOGO_LINUX_MONO=y | ||
741 | CONFIG_LOGO_LINUX_VGA16=y | ||
742 | CONFIG_LOGO_LINUX_CLUT224=y | ||
743 | |||
744 | # | ||
745 | # Sound | ||
746 | # | ||
747 | CONFIG_SOUND=y | ||
748 | # CONFIG_DMASOUND_PMAC is not set | ||
749 | |||
750 | # | ||
751 | # Advanced Linux Sound Architecture | ||
752 | # | ||
753 | CONFIG_SND=m | ||
754 | CONFIG_SND_TIMER=m | ||
755 | CONFIG_SND_PCM=m | ||
756 | CONFIG_SND_HWDEP=m | ||
757 | CONFIG_SND_RAWMIDI=m | ||
758 | CONFIG_SND_SEQUENCER=m | ||
759 | CONFIG_SND_SEQ_DUMMY=m | ||
760 | CONFIG_SND_OSSEMUL=y | ||
761 | CONFIG_SND_MIXER_OSS=m | ||
762 | CONFIG_SND_PCM_OSS=m | ||
763 | CONFIG_SND_SEQUENCER_OSS=y | ||
764 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
765 | # CONFIG_SND_DEBUG is not set | ||
766 | |||
767 | # | ||
768 | # Generic devices | ||
769 | # | ||
770 | CONFIG_SND_MPU401_UART=m | ||
771 | CONFIG_SND_OPL3_LIB=m | ||
772 | CONFIG_SND_DUMMY=m | ||
773 | # CONFIG_SND_VIRMIDI is not set | ||
774 | # CONFIG_SND_MTPAV is not set | ||
775 | # CONFIG_SND_SERIAL_U16550 is not set | ||
776 | # CONFIG_SND_MPU401 is not set | ||
777 | |||
778 | # | ||
779 | # ISA devices | ||
780 | # | ||
781 | # CONFIG_SND_AD1848 is not set | ||
782 | # CONFIG_SND_CS4231 is not set | ||
783 | CONFIG_SND_CS4232=m | ||
784 | # CONFIG_SND_CS4236 is not set | ||
785 | # CONFIG_SND_ES1688 is not set | ||
786 | # CONFIG_SND_ES18XX is not set | ||
787 | # CONFIG_SND_GUSCLASSIC is not set | ||
788 | # CONFIG_SND_GUSEXTREME is not set | ||
789 | # CONFIG_SND_GUSMAX is not set | ||
790 | # CONFIG_SND_INTERWAVE is not set | ||
791 | # CONFIG_SND_INTERWAVE_STB is not set | ||
792 | # CONFIG_SND_OPTI92X_AD1848 is not set | ||
793 | # CONFIG_SND_OPTI92X_CS4231 is not set | ||
794 | # CONFIG_SND_OPTI93X is not set | ||
795 | # CONFIG_SND_SB8 is not set | ||
796 | # CONFIG_SND_SB16 is not set | ||
797 | # CONFIG_SND_SBAWE is not set | ||
798 | # CONFIG_SND_WAVEFRONT is not set | ||
799 | # CONFIG_SND_CMI8330 is not set | ||
800 | # CONFIG_SND_OPL3SA2 is not set | ||
801 | # CONFIG_SND_SGALAXY is not set | ||
802 | # CONFIG_SND_SSCAPE is not set | ||
803 | |||
804 | # | ||
805 | # PCI devices | ||
806 | # | ||
807 | CONFIG_SND_AC97_CODEC=m | ||
808 | # CONFIG_SND_ALI5451 is not set | ||
809 | # CONFIG_SND_ATIIXP is not set | ||
810 | # CONFIG_SND_AU8810 is not set | ||
811 | # CONFIG_SND_AU8820 is not set | ||
812 | # CONFIG_SND_AU8830 is not set | ||
813 | # CONFIG_SND_AZT3328 is not set | ||
814 | # CONFIG_SND_BT87X is not set | ||
815 | CONFIG_SND_CS46XX=m | ||
816 | # CONFIG_SND_CS46XX_NEW_DSP is not set | ||
817 | CONFIG_SND_CS4281=m | ||
818 | # CONFIG_SND_EMU10K1 is not set | ||
819 | # CONFIG_SND_KORG1212 is not set | ||
820 | # CONFIG_SND_MIXART is not set | ||
821 | # CONFIG_SND_NM256 is not set | ||
822 | # CONFIG_SND_RME32 is not set | ||
823 | # CONFIG_SND_RME96 is not set | ||
824 | # CONFIG_SND_RME9652 is not set | ||
825 | # CONFIG_SND_HDSP is not set | ||
826 | # CONFIG_SND_TRIDENT is not set | ||
827 | # CONFIG_SND_YMFPCI is not set | ||
828 | # CONFIG_SND_ALS4000 is not set | ||
829 | # CONFIG_SND_CMIPCI is not set | ||
830 | # CONFIG_SND_ENS1370 is not set | ||
831 | # CONFIG_SND_ENS1371 is not set | ||
832 | # CONFIG_SND_ES1938 is not set | ||
833 | # CONFIG_SND_ES1968 is not set | ||
834 | # CONFIG_SND_MAESTRO3 is not set | ||
835 | # CONFIG_SND_FM801 is not set | ||
836 | # CONFIG_SND_ICE1712 is not set | ||
837 | # CONFIG_SND_ICE1724 is not set | ||
838 | # CONFIG_SND_INTEL8X0 is not set | ||
839 | # CONFIG_SND_INTEL8X0M is not set | ||
840 | # CONFIG_SND_SONICVIBES is not set | ||
841 | # CONFIG_SND_VIA82XX is not set | ||
842 | # CONFIG_SND_VX222 is not set | ||
843 | |||
844 | # | ||
845 | # ALSA PowerMac devices | ||
846 | # | ||
847 | # CONFIG_SND_POWERMAC is not set | ||
848 | |||
849 | # | ||
850 | # Open Sound System | ||
851 | # | ||
852 | # CONFIG_SOUND_PRIME is not set | ||
853 | |||
854 | # | ||
855 | # USB support | ||
856 | # | ||
857 | # CONFIG_USB is not set | ||
858 | |||
859 | # | ||
860 | # USB Gadget Support | ||
861 | # | ||
862 | # CONFIG_USB_GADGET is not set | ||
863 | |||
864 | # | ||
865 | # File systems | ||
866 | # | ||
867 | CONFIG_EXT2_FS=y | ||
868 | # CONFIG_EXT2_FS_XATTR is not set | ||
869 | # CONFIG_EXT3_FS is not set | ||
870 | # CONFIG_JBD is not set | ||
871 | # CONFIG_REISERFS_FS is not set | ||
872 | # CONFIG_JFS_FS is not set | ||
873 | # CONFIG_XFS_FS is not set | ||
874 | # CONFIG_MINIX_FS is not set | ||
875 | # CONFIG_ROMFS_FS is not set | ||
876 | # CONFIG_QUOTA is not set | ||
877 | # CONFIG_AUTOFS_FS is not set | ||
878 | # CONFIG_AUTOFS4_FS is not set | ||
879 | |||
880 | # | ||
881 | # CD-ROM/DVD Filesystems | ||
882 | # | ||
883 | CONFIG_ISO9660_FS=y | ||
884 | CONFIG_JOLIET=y | ||
885 | # CONFIG_ZISOFS is not set | ||
886 | # CONFIG_UDF_FS is not set | ||
887 | |||
888 | # | ||
889 | # DOS/FAT/NT Filesystems | ||
890 | # | ||
891 | CONFIG_FAT_FS=y | ||
892 | CONFIG_MSDOS_FS=y | ||
893 | CONFIG_VFAT_FS=y | ||
894 | # CONFIG_NTFS_FS is not set | ||
895 | |||
896 | # | ||
897 | # Pseudo filesystems | ||
898 | # | ||
899 | CONFIG_PROC_FS=y | ||
900 | CONFIG_PROC_KCORE=y | ||
901 | CONFIG_SYSFS=y | ||
902 | # CONFIG_DEVFS_FS is not set | ||
903 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
904 | CONFIG_TMPFS=y | ||
905 | # CONFIG_HUGETLB_PAGE is not set | ||
906 | CONFIG_RAMFS=y | ||
907 | |||
908 | # | ||
909 | # Miscellaneous filesystems | ||
910 | # | ||
911 | # CONFIG_ADFS_FS is not set | ||
912 | # CONFIG_AFFS_FS is not set | ||
913 | # CONFIG_HFS_FS is not set | ||
914 | # CONFIG_HFSPLUS_FS is not set | ||
915 | # CONFIG_BEFS_FS is not set | ||
916 | # CONFIG_BFS_FS is not set | ||
917 | # CONFIG_EFS_FS is not set | ||
918 | # CONFIG_CRAMFS is not set | ||
919 | # CONFIG_VXFS_FS is not set | ||
920 | # CONFIG_HPFS_FS is not set | ||
921 | # CONFIG_QNX4FS_FS is not set | ||
922 | # CONFIG_SYSV_FS is not set | ||
923 | # CONFIG_UFS_FS is not set | ||
924 | |||
925 | # | ||
926 | # Network File Systems | ||
927 | # | ||
928 | CONFIG_NFS_FS=y | ||
929 | # CONFIG_NFS_V3 is not set | ||
930 | # CONFIG_NFS_V4 is not set | ||
931 | # CONFIG_NFS_DIRECTIO is not set | ||
932 | CONFIG_NFSD=y | ||
933 | # CONFIG_NFSD_V3 is not set | ||
934 | # CONFIG_NFSD_TCP is not set | ||
935 | CONFIG_LOCKD=y | ||
936 | CONFIG_EXPORTFS=y | ||
937 | CONFIG_SUNRPC=y | ||
938 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
939 | # CONFIG_SMB_FS is not set | ||
940 | # CONFIG_CIFS is not set | ||
941 | # CONFIG_NCP_FS is not set | ||
942 | # CONFIG_CODA_FS is not set | ||
943 | # CONFIG_AFS_FS is not set | ||
944 | |||
945 | # | ||
946 | # Partition Types | ||
947 | # | ||
948 | # CONFIG_PARTITION_ADVANCED is not set | ||
949 | CONFIG_MSDOS_PARTITION=y | ||
950 | |||
951 | # | ||
952 | # Native Language Support | ||
953 | # | ||
954 | CONFIG_NLS=y | ||
955 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
956 | CONFIG_NLS_CODEPAGE_437=y | ||
957 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
958 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
959 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
960 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
961 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
962 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
963 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
964 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
965 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
966 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
967 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
968 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
969 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
970 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
971 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
972 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
973 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
974 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
975 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
976 | # CONFIG_NLS_ISO8859_8 is not set | ||
977 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
978 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
979 | CONFIG_NLS_ISO8859_1=y | ||
980 | # CONFIG_NLS_ISO8859_2 is not set | ||
981 | # CONFIG_NLS_ISO8859_3 is not set | ||
982 | # CONFIG_NLS_ISO8859_4 is not set | ||
983 | # CONFIG_NLS_ISO8859_5 is not set | ||
984 | # CONFIG_NLS_ISO8859_6 is not set | ||
985 | # CONFIG_NLS_ISO8859_7 is not set | ||
986 | # CONFIG_NLS_ISO8859_9 is not set | ||
987 | # CONFIG_NLS_ISO8859_13 is not set | ||
988 | # CONFIG_NLS_ISO8859_14 is not set | ||
989 | # CONFIG_NLS_ISO8859_15 is not set | ||
990 | # CONFIG_NLS_KOI8_R is not set | ||
991 | # CONFIG_NLS_KOI8_U is not set | ||
992 | # CONFIG_NLS_UTF8 is not set | ||
993 | |||
994 | # | ||
995 | # Library routines | ||
996 | # | ||
997 | CONFIG_CRC32=y | ||
998 | # CONFIG_LIBCRC32C is not set | ||
999 | CONFIG_ZLIB_INFLATE=m | ||
1000 | CONFIG_ZLIB_DEFLATE=m | ||
1001 | |||
1002 | # | ||
1003 | # Kernel hacking | ||
1004 | # | ||
1005 | # CONFIG_DEBUG_KERNEL is not set | ||
1006 | CONFIG_BOOTX_TEXT=y | ||
1007 | |||
1008 | # | ||
1009 | # Security options | ||
1010 | # | ||
1011 | # CONFIG_SECURITY is not set | ||
1012 | |||
1013 | # | ||
1014 | # Cryptographic options | ||
1015 | # | ||
1016 | CONFIG_CRYPTO=y | ||
1017 | CONFIG_CRYPTO_HMAC=y | ||
1018 | CONFIG_CRYPTO_NULL=y | ||
1019 | CONFIG_CRYPTO_MD4=m | ||
1020 | CONFIG_CRYPTO_MD5=m | ||
1021 | CONFIG_CRYPTO_SHA1=m | ||
1022 | CONFIG_CRYPTO_SHA256=m | ||
1023 | CONFIG_CRYPTO_SHA512=m | ||
1024 | CONFIG_CRYPTO_DES=m | ||
1025 | CONFIG_CRYPTO_BLOWFISH=m | ||
1026 | CONFIG_CRYPTO_TWOFISH=m | ||
1027 | # CONFIG_CRYPTO_SERPENT is not set | ||
1028 | CONFIG_CRYPTO_AES=m | ||
1029 | CONFIG_CRYPTO_CAST5=m | ||
1030 | CONFIG_CRYPTO_CAST6=m | ||
1031 | CONFIG_CRYPTO_ARC4=m | ||
1032 | CONFIG_CRYPTO_DEFLATE=m | ||
1033 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
1034 | # CONFIG_CRYPTO_CRC32C is not set | ||
1035 | # CONFIG_CRYPTO_TEST is not set | ||
diff --git a/arch/ppc/configs/common_defconfig b/arch/ppc/configs/prep_defconfig index 4d33bee23a89..4d33bee23a89 100644 --- a/arch/ppc/configs/common_defconfig +++ b/arch/ppc/configs/prep_defconfig | |||
diff --git a/arch/ppc/kernel/Makefile b/arch/ppc/kernel/Makefile index e399bbb969a4..466437f4bcbb 100644 --- a/arch/ppc/kernel/Makefile +++ b/arch/ppc/kernel/Makefile | |||
@@ -1,48 +1,24 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | ifneq ($(CONFIG_PPC_MERGE),y) | ||
5 | |||
6 | extra-$(CONFIG_PPC_STD_MMU) := head.o | 4 | extra-$(CONFIG_PPC_STD_MMU) := head.o |
7 | extra-$(CONFIG_40x) := head_4xx.o | 5 | extra-$(CONFIG_40x) := head_4xx.o |
8 | extra-$(CONFIG_44x) := head_44x.o | 6 | extra-$(CONFIG_44x) := head_44x.o |
9 | extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o | 7 | extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o |
10 | extra-$(CONFIG_8xx) := head_8xx.o | 8 | extra-$(CONFIG_8xx) := head_8xx.o |
11 | extra-$(CONFIG_6xx) += idle_6xx.o | ||
12 | extra-y += vmlinux.lds | 9 | extra-y += vmlinux.lds |
13 | 10 | ||
14 | obj-y := entry.o traps.o idle.o time.o misc.o \ | 11 | obj-y := entry.o traps.o time.o misc.o \ |
15 | setup.o \ | 12 | setup.o \ |
16 | ppc_htab.o | 13 | ppc_htab.o |
17 | obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o | 14 | obj-$(CONFIG_MODULES) += ppc_ksyms.o |
18 | obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o | ||
19 | obj-$(CONFIG_MODULES) += module.o ppc_ksyms.o | ||
20 | obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-mapping.o | 15 | obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-mapping.o |
21 | obj-$(CONFIG_PCI) += pci.o | 16 | obj-$(CONFIG_PCI) += pci.o |
22 | obj-$(CONFIG_RAPIDIO) += rio.o | 17 | obj-$(CONFIG_RAPIDIO) += rio.o |
23 | obj-$(CONFIG_KGDB) += ppc-stub.o | 18 | obj-$(CONFIG_KGDB) += ppc-stub.o |
24 | obj-$(CONFIG_SMP) += smp.o smp-tbsync.o | 19 | obj-$(CONFIG_SMP) += smp.o smp-tbsync.o |
25 | obj-$(CONFIG_TAU) += temp.o | ||
26 | ifndef CONFIG_E200 | ||
27 | obj-$(CONFIG_FSL_BOOKE) += perfmon_fsl_booke.o | ||
28 | endif | ||
29 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o | 20 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o |
30 | 21 | ||
31 | ifndef CONFIG_MATH_EMULATION | 22 | ifndef CONFIG_MATH_EMULATION |
32 | obj-$(CONFIG_8xx) += softemu8xx.o | 23 | obj-$(CONFIG_8xx) += softemu8xx.o |
33 | endif | 24 | endif |
34 | |||
35 | # These are here while we do the architecture merge | ||
36 | |||
37 | else | ||
38 | obj-y := idle.o | ||
39 | obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o | ||
40 | obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o | ||
41 | obj-$(CONFIG_MODULES) += module.o | ||
42 | obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-mapping.o | ||
43 | obj-$(CONFIG_KGDB) += ppc-stub.o | ||
44 | obj-$(CONFIG_TAU) += temp.o | ||
45 | ifndef CONFIG_E200 | ||
46 | obj-$(CONFIG_FSL_BOOKE) += perfmon_fsl_booke.o | ||
47 | endif | ||
48 | endif | ||
diff --git a/arch/ppc/kernel/cpu_setup_6xx.S b/arch/ppc/kernel/cpu_setup_6xx.S deleted file mode 100644 index 55ed7716636f..000000000000 --- a/arch/ppc/kernel/cpu_setup_6xx.S +++ /dev/null | |||
@@ -1,474 +0,0 @@ | |||
1 | /* | ||
2 | * This file contains low level CPU setup functions. | ||
3 | * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License | ||
7 | * as published by the Free Software Foundation; either version | ||
8 | * 2 of the License, or (at your option) any later version. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/config.h> | ||
13 | #include <asm/processor.h> | ||
14 | #include <asm/page.h> | ||
15 | #include <asm/cputable.h> | ||
16 | #include <asm/ppc_asm.h> | ||
17 | #include <asm/asm-offsets.h> | ||
18 | #include <asm/cache.h> | ||
19 | |||
20 | _GLOBAL(__setup_cpu_603) | ||
21 | b setup_common_caches | ||
22 | _GLOBAL(__setup_cpu_604) | ||
23 | mflr r4 | ||
24 | bl setup_common_caches | ||
25 | bl setup_604_hid0 | ||
26 | mtlr r4 | ||
27 | blr | ||
28 | _GLOBAL(__setup_cpu_750) | ||
29 | mflr r4 | ||
30 | bl __init_fpu_registers | ||
31 | bl setup_common_caches | ||
32 | bl setup_750_7400_hid0 | ||
33 | mtlr r4 | ||
34 | blr | ||
35 | _GLOBAL(__setup_cpu_750cx) | ||
36 | mflr r4 | ||
37 | bl __init_fpu_registers | ||
38 | bl setup_common_caches | ||
39 | bl setup_750_7400_hid0 | ||
40 | bl setup_750cx | ||
41 | mtlr r4 | ||
42 | blr | ||
43 | _GLOBAL(__setup_cpu_750fx) | ||
44 | mflr r4 | ||
45 | bl __init_fpu_registers | ||
46 | bl setup_common_caches | ||
47 | bl setup_750_7400_hid0 | ||
48 | bl setup_750fx | ||
49 | mtlr r4 | ||
50 | blr | ||
51 | _GLOBAL(__setup_cpu_7400) | ||
52 | mflr r4 | ||
53 | bl __init_fpu_registers | ||
54 | bl setup_7400_workarounds | ||
55 | bl setup_common_caches | ||
56 | bl setup_750_7400_hid0 | ||
57 | mtlr r4 | ||
58 | blr | ||
59 | _GLOBAL(__setup_cpu_7410) | ||
60 | mflr r4 | ||
61 | bl __init_fpu_registers | ||
62 | bl setup_7410_workarounds | ||
63 | bl setup_common_caches | ||
64 | bl setup_750_7400_hid0 | ||
65 | li r3,0 | ||
66 | mtspr SPRN_L2CR2,r3 | ||
67 | mtlr r4 | ||
68 | blr | ||
69 | _GLOBAL(__setup_cpu_745x) | ||
70 | mflr r4 | ||
71 | bl setup_common_caches | ||
72 | bl setup_745x_specifics | ||
73 | mtlr r4 | ||
74 | blr | ||
75 | |||
76 | /* Enable caches for 603's, 604, 750 & 7400 */ | ||
77 | setup_common_caches: | ||
78 | mfspr r11,SPRN_HID0 | ||
79 | andi. r0,r11,HID0_DCE | ||
80 | ori r11,r11,HID0_ICE|HID0_DCE | ||
81 | ori r8,r11,HID0_ICFI | ||
82 | bne 1f /* don't invalidate the D-cache */ | ||
83 | ori r8,r8,HID0_DCI /* unless it wasn't enabled */ | ||
84 | 1: sync | ||
85 | mtspr SPRN_HID0,r8 /* enable and invalidate caches */ | ||
86 | sync | ||
87 | mtspr SPRN_HID0,r11 /* enable caches */ | ||
88 | sync | ||
89 | isync | ||
90 | blr | ||
91 | |||
92 | /* 604, 604e, 604ev, ... | ||
93 | * Enable superscalar execution & branch history table | ||
94 | */ | ||
95 | setup_604_hid0: | ||
96 | mfspr r11,SPRN_HID0 | ||
97 | ori r11,r11,HID0_SIED|HID0_BHTE | ||
98 | ori r8,r11,HID0_BTCD | ||
99 | sync | ||
100 | mtspr SPRN_HID0,r8 /* flush branch target address cache */ | ||
101 | sync /* on 604e/604r */ | ||
102 | mtspr SPRN_HID0,r11 | ||
103 | sync | ||
104 | isync | ||
105 | blr | ||
106 | |||
107 | /* 7400 <= rev 2.7 and 7410 rev = 1.0 suffer from some | ||
108 | * erratas we work around here. | ||
109 | * Moto MPC710CE.pdf describes them, those are errata | ||
110 | * #3, #4 and #5 | ||
111 | * Note that we assume the firmware didn't choose to | ||
112 | * apply other workarounds (there are other ones documented | ||
113 | * in the .pdf). It appear that Apple firmware only works | ||
114 | * around #3 and with the same fix we use. We may want to | ||
115 | * check if the CPU is using 60x bus mode in which case | ||
116 | * the workaround for errata #4 is useless. Also, we may | ||
117 | * want to explicitely clear HID0_NOPDST as this is not | ||
118 | * needed once we have applied workaround #5 (though it's | ||
119 | * not set by Apple's firmware at least). | ||
120 | */ | ||
121 | setup_7400_workarounds: | ||
122 | mfpvr r3 | ||
123 | rlwinm r3,r3,0,20,31 | ||
124 | cmpwi 0,r3,0x0207 | ||
125 | ble 1f | ||
126 | blr | ||
127 | setup_7410_workarounds: | ||
128 | mfpvr r3 | ||
129 | rlwinm r3,r3,0,20,31 | ||
130 | cmpwi 0,r3,0x0100 | ||
131 | bnelr | ||
132 | 1: | ||
133 | mfspr r11,SPRN_MSSSR0 | ||
134 | /* Errata #3: Set L1OPQ_SIZE to 0x10 */ | ||
135 | rlwinm r11,r11,0,9,6 | ||
136 | oris r11,r11,0x0100 | ||
137 | /* Errata #4: Set L2MQ_SIZE to 1 (check for MPX mode first ?) */ | ||
138 | oris r11,r11,0x0002 | ||
139 | /* Errata #5: Set DRLT_SIZE to 0x01 */ | ||
140 | rlwinm r11,r11,0,5,2 | ||
141 | oris r11,r11,0x0800 | ||
142 | sync | ||
143 | mtspr SPRN_MSSSR0,r11 | ||
144 | sync | ||
145 | isync | ||
146 | blr | ||
147 | |||
148 | /* 740/750/7400/7410 | ||
149 | * Enable Store Gathering (SGE), Address Brodcast (ABE), | ||
150 | * Branch History Table (BHTE), Branch Target ICache (BTIC) | ||
151 | * Dynamic Power Management (DPM), Speculative (SPD) | ||
152 | * Clear Instruction cache throttling (ICTC) | ||
153 | */ | ||
154 | setup_750_7400_hid0: | ||
155 | mfspr r11,SPRN_HID0 | ||
156 | ori r11,r11,HID0_SGE | HID0_ABE | HID0_BHTE | HID0_BTIC | ||
157 | oris r11,r11,HID0_DPM@h | ||
158 | BEGIN_FTR_SECTION | ||
159 | xori r11,r11,HID0_BTIC | ||
160 | END_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC) | ||
161 | BEGIN_FTR_SECTION | ||
162 | xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */ | ||
163 | END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM) | ||
164 | li r3,HID0_SPD | ||
165 | andc r11,r11,r3 /* clear SPD: enable speculative */ | ||
166 | li r3,0 | ||
167 | mtspr SPRN_ICTC,r3 /* Instruction Cache Throttling off */ | ||
168 | isync | ||
169 | mtspr SPRN_HID0,r11 | ||
170 | sync | ||
171 | isync | ||
172 | blr | ||
173 | |||
174 | /* 750cx specific | ||
175 | * Looks like we have to disable NAP feature for some PLL settings... | ||
176 | * (waiting for confirmation) | ||
177 | */ | ||
178 | setup_750cx: | ||
179 | mfspr r10, SPRN_HID1 | ||
180 | rlwinm r10,r10,4,28,31 | ||
181 | cmpwi cr0,r10,7 | ||
182 | cmpwi cr1,r10,9 | ||
183 | cmpwi cr2,r10,11 | ||
184 | cror 4*cr0+eq,4*cr0+eq,4*cr1+eq | ||
185 | cror 4*cr0+eq,4*cr0+eq,4*cr2+eq | ||
186 | bnelr | ||
187 | lwz r6,CPU_SPEC_FEATURES(r5) | ||
188 | li r7,CPU_FTR_CAN_NAP | ||
189 | andc r6,r6,r7 | ||
190 | stw r6,CPU_SPEC_FEATURES(r5) | ||
191 | blr | ||
192 | |||
193 | /* 750fx specific | ||
194 | */ | ||
195 | setup_750fx: | ||
196 | blr | ||
197 | |||
198 | /* MPC 745x | ||
199 | * Enable Store Gathering (SGE), Branch Folding (FOLD) | ||
200 | * Branch History Table (BHTE), Branch Target ICache (BTIC) | ||
201 | * Dynamic Power Management (DPM), Speculative (SPD) | ||
202 | * Ensure our data cache instructions really operate. | ||
203 | * Timebase has to be running or we wouldn't have made it here, | ||
204 | * just ensure we don't disable it. | ||
205 | * Clear Instruction cache throttling (ICTC) | ||
206 | * Enable L2 HW prefetch | ||
207 | */ | ||
208 | setup_745x_specifics: | ||
209 | /* We check for the presence of an L3 cache setup by | ||
210 | * the firmware. If any, we disable NAP capability as | ||
211 | * it's known to be bogus on rev 2.1 and earlier | ||
212 | */ | ||
213 | mfspr r11,SPRN_L3CR | ||
214 | andis. r11,r11,L3CR_L3E@h | ||
215 | beq 1f | ||
216 | lwz r6,CPU_SPEC_FEATURES(r5) | ||
217 | andi. r0,r6,CPU_FTR_L3_DISABLE_NAP | ||
218 | beq 1f | ||
219 | li r7,CPU_FTR_CAN_NAP | ||
220 | andc r6,r6,r7 | ||
221 | stw r6,CPU_SPEC_FEATURES(r5) | ||
222 | 1: | ||
223 | mfspr r11,SPRN_HID0 | ||
224 | |||
225 | /* All of the bits we have to set..... | ||
226 | */ | ||
227 | ori r11,r11,HID0_SGE | HID0_FOLD | HID0_BHTE | ||
228 | ori r11,r11,HID0_LRSTK | HID0_BTIC | ||
229 | oris r11,r11,HID0_DPM@h | ||
230 | BEGIN_FTR_SECTION | ||
231 | xori r11,r11,HID0_BTIC | ||
232 | END_FTR_SECTION_IFSET(CPU_FTR_NO_BTIC) | ||
233 | BEGIN_FTR_SECTION | ||
234 | xoris r11,r11,HID0_DPM@h /* disable dynamic power mgmt */ | ||
235 | END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM) | ||
236 | |||
237 | /* All of the bits we have to clear.... | ||
238 | */ | ||
239 | li r3,HID0_SPD | HID0_NOPDST | HID0_NOPTI | ||
240 | andc r11,r11,r3 /* clear SPD: enable speculative */ | ||
241 | li r3,0 | ||
242 | |||
243 | mtspr SPRN_ICTC,r3 /* Instruction Cache Throttling off */ | ||
244 | isync | ||
245 | mtspr SPRN_HID0,r11 | ||
246 | sync | ||
247 | isync | ||
248 | |||
249 | /* Enable L2 HW prefetch, if L2 is enabled | ||
250 | */ | ||
251 | mfspr r3,SPRN_L2CR | ||
252 | andis. r3,r3,L2CR_L2E@h | ||
253 | beqlr | ||
254 | mfspr r3,SPRN_MSSCR0 | ||
255 | ori r3,r3,3 | ||
256 | sync | ||
257 | mtspr SPRN_MSSCR0,r3 | ||
258 | sync | ||
259 | isync | ||
260 | blr | ||
261 | |||
262 | /* | ||
263 | * Initialize the FPU registers. This is needed to work around an errata | ||
264 | * in some 750 cpus where using a not yet initialized FPU register after | ||
265 | * power on reset may hang the CPU | ||
266 | */ | ||
267 | _GLOBAL(__init_fpu_registers) | ||
268 | mfmsr r10 | ||
269 | ori r11,r10,MSR_FP | ||
270 | mtmsr r11 | ||
271 | isync | ||
272 | addis r9,r3,empty_zero_page@ha | ||
273 | addi r9,r9,empty_zero_page@l | ||
274 | REST_32FPRS(0,r9) | ||
275 | sync | ||
276 | mtmsr r10 | ||
277 | isync | ||
278 | blr | ||
279 | |||
280 | |||
281 | /* Definitions for the table use to save CPU states */ | ||
282 | #define CS_HID0 0 | ||
283 | #define CS_HID1 4 | ||
284 | #define CS_HID2 8 | ||
285 | #define CS_MSSCR0 12 | ||
286 | #define CS_MSSSR0 16 | ||
287 | #define CS_ICTRL 20 | ||
288 | #define CS_LDSTCR 24 | ||
289 | #define CS_LDSTDB 28 | ||
290 | #define CS_SIZE 32 | ||
291 | |||
292 | .data | ||
293 | .balign L1_CACHE_BYTES | ||
294 | cpu_state_storage: | ||
295 | .space CS_SIZE | ||
296 | .balign L1_CACHE_BYTES,0 | ||
297 | .text | ||
298 | |||
299 | /* Called in normal context to backup CPU 0 state. This | ||
300 | * does not include cache settings. This function is also | ||
301 | * called for machine sleep. This does not include the MMU | ||
302 | * setup, BATs, etc... but rather the "special" registers | ||
303 | * like HID0, HID1, MSSCR0, etc... | ||
304 | */ | ||
305 | _GLOBAL(__save_cpu_setup) | ||
306 | /* Some CR fields are volatile, we back it up all */ | ||
307 | mfcr r7 | ||
308 | |||
309 | /* Get storage ptr */ | ||
310 | lis r5,cpu_state_storage@h | ||
311 | ori r5,r5,cpu_state_storage@l | ||
312 | |||
313 | /* Save HID0 (common to all CONFIG_6xx cpus) */ | ||
314 | mfspr r3,SPRN_HID0 | ||
315 | stw r3,CS_HID0(r5) | ||
316 | |||
317 | /* Now deal with CPU type dependent registers */ | ||
318 | mfspr r3,SPRN_PVR | ||
319 | srwi r3,r3,16 | ||
320 | cmplwi cr0,r3,0x8000 /* 7450 */ | ||
321 | cmplwi cr1,r3,0x000c /* 7400 */ | ||
322 | cmplwi cr2,r3,0x800c /* 7410 */ | ||
323 | cmplwi cr3,r3,0x8001 /* 7455 */ | ||
324 | cmplwi cr4,r3,0x8002 /* 7457 */ | ||
325 | cmplwi cr5,r3,0x8003 /* 7447A */ | ||
326 | cmplwi cr6,r3,0x7000 /* 750FX */ | ||
327 | cmplwi cr7,r3,0x8004 /* 7448 */ | ||
328 | /* cr1 is 7400 || 7410 */ | ||
329 | cror 4*cr1+eq,4*cr1+eq,4*cr2+eq | ||
330 | /* cr0 is 74xx */ | ||
331 | cror 4*cr0+eq,4*cr0+eq,4*cr3+eq | ||
332 | cror 4*cr0+eq,4*cr0+eq,4*cr4+eq | ||
333 | cror 4*cr0+eq,4*cr0+eq,4*cr1+eq | ||
334 | cror 4*cr0+eq,4*cr0+eq,4*cr5+eq | ||
335 | cror 4*cr0+eq,4*cr0+eq,4*cr7+eq | ||
336 | bne 1f | ||
337 | /* Backup 74xx specific regs */ | ||
338 | mfspr r4,SPRN_MSSCR0 | ||
339 | stw r4,CS_MSSCR0(r5) | ||
340 | mfspr r4,SPRN_MSSSR0 | ||
341 | stw r4,CS_MSSSR0(r5) | ||
342 | beq cr1,1f | ||
343 | /* Backup 745x specific registers */ | ||
344 | mfspr r4,SPRN_HID1 | ||
345 | stw r4,CS_HID1(r5) | ||
346 | mfspr r4,SPRN_ICTRL | ||
347 | stw r4,CS_ICTRL(r5) | ||
348 | mfspr r4,SPRN_LDSTCR | ||
349 | stw r4,CS_LDSTCR(r5) | ||
350 | mfspr r4,SPRN_LDSTDB | ||
351 | stw r4,CS_LDSTDB(r5) | ||
352 | 1: | ||
353 | bne cr6,1f | ||
354 | /* Backup 750FX specific registers */ | ||
355 | mfspr r4,SPRN_HID1 | ||
356 | stw r4,CS_HID1(r5) | ||
357 | /* If rev 2.x, backup HID2 */ | ||
358 | mfspr r3,SPRN_PVR | ||
359 | andi. r3,r3,0xff00 | ||
360 | cmpwi cr0,r3,0x0200 | ||
361 | bne 1f | ||
362 | mfspr r4,SPRN_HID2 | ||
363 | stw r4,CS_HID2(r5) | ||
364 | 1: | ||
365 | mtcr r7 | ||
366 | blr | ||
367 | |||
368 | /* Called with no MMU context (typically MSR:IR/DR off) to | ||
369 | * restore CPU state as backed up by the previous | ||
370 | * function. This does not include cache setting | ||
371 | */ | ||
372 | _GLOBAL(__restore_cpu_setup) | ||
373 | /* Some CR fields are volatile, we back it up all */ | ||
374 | mfcr r7 | ||
375 | |||
376 | /* Get storage ptr */ | ||
377 | lis r5,(cpu_state_storage-KERNELBASE)@h | ||
378 | ori r5,r5,cpu_state_storage@l | ||
379 | |||
380 | /* Restore HID0 */ | ||
381 | lwz r3,CS_HID0(r5) | ||
382 | sync | ||
383 | isync | ||
384 | mtspr SPRN_HID0,r3 | ||
385 | sync | ||
386 | isync | ||
387 | |||
388 | /* Now deal with CPU type dependent registers */ | ||
389 | mfspr r3,SPRN_PVR | ||
390 | srwi r3,r3,16 | ||
391 | cmplwi cr0,r3,0x8000 /* 7450 */ | ||
392 | cmplwi cr1,r3,0x000c /* 7400 */ | ||
393 | cmplwi cr2,r3,0x800c /* 7410 */ | ||
394 | cmplwi cr3,r3,0x8001 /* 7455 */ | ||
395 | cmplwi cr4,r3,0x8002 /* 7457 */ | ||
396 | cmplwi cr5,r3,0x8003 /* 7447A */ | ||
397 | cmplwi cr6,r3,0x7000 /* 750FX */ | ||
398 | cmplwi cr7,r3,0x8004 /* 7448 */ | ||
399 | /* cr1 is 7400 || 7410 */ | ||
400 | cror 4*cr1+eq,4*cr1+eq,4*cr2+eq | ||
401 | /* cr0 is 74xx */ | ||
402 | cror 4*cr0+eq,4*cr0+eq,4*cr3+eq | ||
403 | cror 4*cr0+eq,4*cr0+eq,4*cr4+eq | ||
404 | cror 4*cr0+eq,4*cr0+eq,4*cr1+eq | ||
405 | cror 4*cr0+eq,4*cr0+eq,4*cr5+eq | ||
406 | cror 4*cr0+eq,4*cr0+eq,4*cr7+eq | ||
407 | bne 2f | ||
408 | /* Restore 74xx specific regs */ | ||
409 | lwz r4,CS_MSSCR0(r5) | ||
410 | sync | ||
411 | mtspr SPRN_MSSCR0,r4 | ||
412 | sync | ||
413 | isync | ||
414 | lwz r4,CS_MSSSR0(r5) | ||
415 | sync | ||
416 | mtspr SPRN_MSSSR0,r4 | ||
417 | sync | ||
418 | isync | ||
419 | bne cr2,1f | ||
420 | /* Clear 7410 L2CR2 */ | ||
421 | li r4,0 | ||
422 | mtspr SPRN_L2CR2,r4 | ||
423 | 1: beq cr1,2f | ||
424 | /* Restore 745x specific registers */ | ||
425 | lwz r4,CS_HID1(r5) | ||
426 | sync | ||
427 | mtspr SPRN_HID1,r4 | ||
428 | isync | ||
429 | sync | ||
430 | lwz r4,CS_ICTRL(r5) | ||
431 | sync | ||
432 | mtspr SPRN_ICTRL,r4 | ||
433 | isync | ||
434 | sync | ||
435 | lwz r4,CS_LDSTCR(r5) | ||
436 | sync | ||
437 | mtspr SPRN_LDSTCR,r4 | ||
438 | isync | ||
439 | sync | ||
440 | lwz r4,CS_LDSTDB(r5) | ||
441 | sync | ||
442 | mtspr SPRN_LDSTDB,r4 | ||
443 | isync | ||
444 | sync | ||
445 | 2: bne cr6,1f | ||
446 | /* Restore 750FX specific registers | ||
447 | * that is restore HID2 on rev 2.x and PLL config & switch | ||
448 | * to PLL 0 on all | ||
449 | */ | ||
450 | /* If rev 2.x, restore HID2 with low voltage bit cleared */ | ||
451 | mfspr r3,SPRN_PVR | ||
452 | andi. r3,r3,0xff00 | ||
453 | cmpwi cr0,r3,0x0200 | ||
454 | bne 4f | ||
455 | lwz r4,CS_HID2(r5) | ||
456 | rlwinm r4,r4,0,19,17 | ||
457 | mtspr SPRN_HID2,r4 | ||
458 | sync | ||
459 | 4: | ||
460 | lwz r4,CS_HID1(r5) | ||
461 | rlwinm r5,r4,0,16,14 | ||
462 | mtspr SPRN_HID1,r5 | ||
463 | /* Wait for PLL to stabilize */ | ||
464 | mftbl r5 | ||
465 | 3: mftbl r6 | ||
466 | sub r6,r6,r5 | ||
467 | cmplwi cr0,r6,10000 | ||
468 | ble 3b | ||
469 | /* Setup final PLL */ | ||
470 | mtspr SPRN_HID1,r4 | ||
471 | 1: | ||
472 | mtcr r7 | ||
473 | blr | ||
474 | |||
diff --git a/arch/ppc/kernel/entry.S b/arch/ppc/kernel/entry.S index 3a2815978488..5891ecbdc703 100644 --- a/arch/ppc/kernel/entry.S +++ b/arch/ppc/kernel/entry.S | |||
@@ -135,10 +135,10 @@ transfer_to_handler: | |||
135 | mfspr r11,SPRN_HID0 | 135 | mfspr r11,SPRN_HID0 |
136 | mtcr r11 | 136 | mtcr r11 |
137 | BEGIN_FTR_SECTION | 137 | BEGIN_FTR_SECTION |
138 | bt- 8,power_save_6xx_restore /* Check DOZE */ | 138 | bt- 8,4f /* Check DOZE */ |
139 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) | 139 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) |
140 | BEGIN_FTR_SECTION | 140 | BEGIN_FTR_SECTION |
141 | bt- 9,power_save_6xx_restore /* Check NAP */ | 141 | bt- 9,4f /* Check NAP */ |
142 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) | 142 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) |
143 | #endif /* CONFIG_6xx */ | 143 | #endif /* CONFIG_6xx */ |
144 | .globl transfer_to_handler_cont | 144 | .globl transfer_to_handler_cont |
@@ -157,6 +157,10 @@ transfer_to_handler_cont: | |||
157 | SYNC | 157 | SYNC |
158 | RFI /* jump to handler, enable MMU */ | 158 | RFI /* jump to handler, enable MMU */ |
159 | 159 | ||
160 | #ifdef CONFIG_6xx | ||
161 | 4: b power_save_6xx_restore | ||
162 | #endif | ||
163 | |||
160 | /* | 164 | /* |
161 | * On kernel stack overflow, load up an initial stack pointer | 165 | * On kernel stack overflow, load up an initial stack pointer |
162 | * and call StackOverflow(regs), which should not return. | 166 | * and call StackOverflow(regs), which should not return. |
@@ -926,55 +930,3 @@ END_FTR_SECTION_IFSET(CPU_FTR_601) | |||
926 | b 4b | 930 | b 4b |
927 | 931 | ||
928 | .comm ee_restarts,4 | 932 | .comm ee_restarts,4 |
929 | |||
930 | /* | ||
931 | * PROM code for specific machines follows. Put it | ||
932 | * here so it's easy to add arch-specific sections later. | ||
933 | * -- Cort | ||
934 | */ | ||
935 | #ifdef CONFIG_PPC_OF | ||
936 | /* | ||
937 | * On CHRP, the Run-Time Abstraction Services (RTAS) have to be | ||
938 | * called with the MMU off. | ||
939 | */ | ||
940 | _GLOBAL(enter_rtas) | ||
941 | stwu r1,-INT_FRAME_SIZE(r1) | ||
942 | mflr r0 | ||
943 | stw r0,INT_FRAME_SIZE+4(r1) | ||
944 | lis r4,rtas_data@ha | ||
945 | lwz r4,rtas_data@l(r4) | ||
946 | lis r6,1f@ha /* physical return address for rtas */ | ||
947 | addi r6,r6,1f@l | ||
948 | tophys(r6,r6) | ||
949 | tophys(r7,r1) | ||
950 | lis r8,rtas_entry@ha | ||
951 | lwz r8,rtas_entry@l(r8) | ||
952 | mfmsr r9 | ||
953 | stw r9,8(r1) | ||
954 | LOAD_MSR_KERNEL(r0,MSR_KERNEL) | ||
955 | SYNC /* disable interrupts so SRR0/1 */ | ||
956 | MTMSRD(r0) /* don't get trashed */ | ||
957 | li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR) | ||
958 | mtlr r6 | ||
959 | CLR_TOP32(r7) | ||
960 | mtspr SPRN_SPRG2,r7 | ||
961 | mtspr SPRN_SRR0,r8 | ||
962 | mtspr SPRN_SRR1,r9 | ||
963 | RFI | ||
964 | 1: tophys(r9,r1) | ||
965 | lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */ | ||
966 | lwz r9,8(r9) /* original msr value */ | ||
967 | FIX_SRR1(r9,r0) | ||
968 | addi r1,r1,INT_FRAME_SIZE | ||
969 | li r0,0 | ||
970 | mtspr SPRN_SPRG2,r0 | ||
971 | mtspr SPRN_SRR0,r8 | ||
972 | mtspr SPRN_SRR1,r9 | ||
973 | RFI /* return to caller */ | ||
974 | |||
975 | .globl machine_check_in_rtas | ||
976 | machine_check_in_rtas: | ||
977 | twi 31,0,0 | ||
978 | /* XXX load up BATs and panic */ | ||
979 | |||
980 | #endif /* CONFIG_PPC_OF */ | ||
diff --git a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S index 53ea845fb911..01303efeddad 100644 --- a/arch/ppc/kernel/head.S +++ b/arch/ppc/kernel/head.S | |||
@@ -37,19 +37,6 @@ | |||
37 | #include <asm/amigappc.h> | 37 | #include <asm/amigappc.h> |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | #ifdef CONFIG_PPC64BRIDGE | ||
41 | #define LOAD_BAT(n, reg, RA, RB) \ | ||
42 | ld RA,(n*32)+0(reg); \ | ||
43 | ld RB,(n*32)+8(reg); \ | ||
44 | mtspr SPRN_IBAT##n##U,RA; \ | ||
45 | mtspr SPRN_IBAT##n##L,RB; \ | ||
46 | ld RA,(n*32)+16(reg); \ | ||
47 | ld RB,(n*32)+24(reg); \ | ||
48 | mtspr SPRN_DBAT##n##U,RA; \ | ||
49 | mtspr SPRN_DBAT##n##L,RB; \ | ||
50 | |||
51 | #else /* CONFIG_PPC64BRIDGE */ | ||
52 | |||
53 | /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ | 40 | /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ |
54 | #define LOAD_BAT(n, reg, RA, RB) \ | 41 | #define LOAD_BAT(n, reg, RA, RB) \ |
55 | /* see the comment for clear_bats() -- Cort */ \ | 42 | /* see the comment for clear_bats() -- Cort */ \ |
@@ -66,7 +53,6 @@ | |||
66 | mtspr SPRN_DBAT##n##U,RA; \ | 53 | mtspr SPRN_DBAT##n##U,RA; \ |
67 | mtspr SPRN_DBAT##n##L,RB; \ | 54 | mtspr SPRN_DBAT##n##L,RB; \ |
68 | 1: | 55 | 1: |
69 | #endif /* CONFIG_PPC64BRIDGE */ | ||
70 | 56 | ||
71 | .text | 57 | .text |
72 | .stabs "arch/ppc/kernel/",N_SO,0,0,0f | 58 | .stabs "arch/ppc/kernel/",N_SO,0,0,0f |
@@ -129,11 +115,6 @@ _start: | |||
129 | 115 | ||
130 | .globl __start | 116 | .globl __start |
131 | __start: | 117 | __start: |
132 | /* | ||
133 | * We have to do any OF calls before we map ourselves to KERNELBASE, | ||
134 | * because OF may have I/O devices mapped into that area | ||
135 | * (particularly on CHRP). | ||
136 | */ | ||
137 | mr r31,r3 /* save parameters */ | 118 | mr r31,r3 /* save parameters */ |
138 | mr r30,r4 | 119 | mr r30,r4 |
139 | mr r29,r5 | 120 | mr r29,r5 |
@@ -148,14 +129,6 @@ __start: | |||
148 | */ | 129 | */ |
149 | bl early_init | 130 | bl early_init |
150 | 131 | ||
151 | /* | ||
152 | * On POWER4, we first need to tweak some CPU configuration registers | ||
153 | * like real mode cache inhibit or exception base | ||
154 | */ | ||
155 | #ifdef CONFIG_POWER4 | ||
156 | bl __970_cpu_preinit | ||
157 | #endif /* CONFIG_POWER4 */ | ||
158 | |||
159 | #ifdef CONFIG_APUS | 132 | #ifdef CONFIG_APUS |
160 | /* On APUS the __va/__pa constants need to be set to the correct | 133 | /* On APUS the __va/__pa constants need to be set to the correct |
161 | * values before continuing. | 134 | * values before continuing. |
@@ -169,7 +142,6 @@ __start: | |||
169 | */ | 142 | */ |
170 | bl mmu_off | 143 | bl mmu_off |
171 | __after_mmu_off: | 144 | __after_mmu_off: |
172 | #ifndef CONFIG_POWER4 | ||
173 | bl clear_bats | 145 | bl clear_bats |
174 | bl flush_tlbs | 146 | bl flush_tlbs |
175 | 147 | ||
@@ -177,10 +149,6 @@ __after_mmu_off: | |||
177 | #if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) | 149 | #if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) |
178 | bl setup_disp_bat | 150 | bl setup_disp_bat |
179 | #endif | 151 | #endif |
180 | #else /* CONFIG_POWER4 */ | ||
181 | bl reloc_offset | ||
182 | bl initial_mm_power4 | ||
183 | #endif /* CONFIG_POWER4 */ | ||
184 | 152 | ||
185 | /* | 153 | /* |
186 | * Call setup_cpu for CPU 0 and initialize 6xx Idle | 154 | * Call setup_cpu for CPU 0 and initialize 6xx Idle |
@@ -192,18 +160,11 @@ __after_mmu_off: | |||
192 | bl reloc_offset | 160 | bl reloc_offset |
193 | bl init_idle_6xx | 161 | bl init_idle_6xx |
194 | #endif /* CONFIG_6xx */ | 162 | #endif /* CONFIG_6xx */ |
195 | #ifdef CONFIG_POWER4 | ||
196 | bl reloc_offset | ||
197 | bl init_idle_power4 | ||
198 | #endif /* CONFIG_POWER4 */ | ||
199 | 163 | ||
200 | 164 | ||
201 | #ifndef CONFIG_APUS | 165 | #ifndef CONFIG_APUS |
202 | /* | 166 | /* |
203 | * We need to run with _start at physical address 0. | 167 | * We need to run with _start at physical address 0. |
204 | * On CHRP, we are loaded at 0x10000 since OF on CHRP uses | ||
205 | * the exception vectors at 0 (and therefore this copy | ||
206 | * overwrites OF's exception vectors with our own). | ||
207 | * If the MMU is already turned on, we copy stuff to KERNELBASE, | 168 | * If the MMU is already turned on, we copy stuff to KERNELBASE, |
208 | * otherwise we copy it to 0. | 169 | * otherwise we copy it to 0. |
209 | */ | 170 | */ |
@@ -358,51 +319,19 @@ i##n: \ | |||
358 | #endif | 319 | #endif |
359 | 320 | ||
360 | /* Machine check */ | 321 | /* Machine check */ |
361 | /* | ||
362 | * On CHRP, this is complicated by the fact that we could get a | ||
363 | * machine check inside RTAS, and we have no guarantee that certain | ||
364 | * critical registers will have the values we expect. The set of | ||
365 | * registers that might have bad values includes all the GPRs | ||
366 | * and all the BATs. We indicate that we are in RTAS by putting | ||
367 | * a non-zero value, the address of the exception frame to use, | ||
368 | * in SPRG2. The machine check handler checks SPRG2 and uses its | ||
369 | * value if it is non-zero. If we ever needed to free up SPRG2, | ||
370 | * we could use a field in the thread_info or thread_struct instead. | ||
371 | * (Other exception handlers assume that r1 is a valid kernel stack | ||
372 | * pointer when we take an exception from supervisor mode.) | ||
373 | * -- paulus. | ||
374 | */ | ||
375 | . = 0x200 | 322 | . = 0x200 |
376 | mtspr SPRN_SPRG0,r10 | 323 | mtspr SPRN_SPRG0,r10 |
377 | mtspr SPRN_SPRG1,r11 | 324 | mtspr SPRN_SPRG1,r11 |
378 | mfcr r10 | 325 | mfcr r10 |
379 | #ifdef CONFIG_PPC_CHRP | ||
380 | mfspr r11,SPRN_SPRG2 | ||
381 | cmpwi 0,r11,0 | ||
382 | bne 7f | ||
383 | #endif /* CONFIG_PPC_CHRP */ | ||
384 | EXCEPTION_PROLOG_1 | 326 | EXCEPTION_PROLOG_1 |
385 | 7: EXCEPTION_PROLOG_2 | 327 | 7: EXCEPTION_PROLOG_2 |
386 | addi r3,r1,STACK_FRAME_OVERHEAD | 328 | addi r3,r1,STACK_FRAME_OVERHEAD |
387 | #ifdef CONFIG_PPC_CHRP | ||
388 | mfspr r4,SPRN_SPRG2 | ||
389 | cmpwi cr1,r4,0 | ||
390 | bne cr1,1f | ||
391 | #endif | ||
392 | EXC_XFER_STD(0x200, machine_check_exception) | 329 | EXC_XFER_STD(0x200, machine_check_exception) |
393 | #ifdef CONFIG_PPC_CHRP | ||
394 | 1: b machine_check_in_rtas | ||
395 | #endif | ||
396 | 330 | ||
397 | /* Data access exception. */ | 331 | /* Data access exception. */ |
398 | . = 0x300 | 332 | . = 0x300 |
399 | #ifdef CONFIG_PPC64BRIDGE | ||
400 | b DataAccess | ||
401 | DataAccessCont: | ||
402 | #else | ||
403 | DataAccess: | 333 | DataAccess: |
404 | EXCEPTION_PROLOG | 334 | EXCEPTION_PROLOG |
405 | #endif /* CONFIG_PPC64BRIDGE */ | ||
406 | mfspr r10,SPRN_DSISR | 335 | mfspr r10,SPRN_DSISR |
407 | andis. r0,r10,0xa470 /* weird error? */ | 336 | andis. r0,r10,0xa470 /* weird error? */ |
408 | bne 1f /* if not, try to put a PTE */ | 337 | bne 1f /* if not, try to put a PTE */ |
@@ -414,21 +343,10 @@ DataAccess: | |||
414 | mfspr r4,SPRN_DAR | 343 | mfspr r4,SPRN_DAR |
415 | EXC_XFER_EE_LITE(0x300, handle_page_fault) | 344 | EXC_XFER_EE_LITE(0x300, handle_page_fault) |
416 | 345 | ||
417 | #ifdef CONFIG_PPC64BRIDGE | ||
418 | /* SLB fault on data access. */ | ||
419 | . = 0x380 | ||
420 | b DataSegment | ||
421 | #endif /* CONFIG_PPC64BRIDGE */ | ||
422 | |||
423 | /* Instruction access exception. */ | 346 | /* Instruction access exception. */ |
424 | . = 0x400 | 347 | . = 0x400 |
425 | #ifdef CONFIG_PPC64BRIDGE | ||
426 | b InstructionAccess | ||
427 | InstructionAccessCont: | ||
428 | #else | ||
429 | InstructionAccess: | 348 | InstructionAccess: |
430 | EXCEPTION_PROLOG | 349 | EXCEPTION_PROLOG |
431 | #endif /* CONFIG_PPC64BRIDGE */ | ||
432 | andis. r0,r9,0x4000 /* no pte found? */ | 350 | andis. r0,r9,0x4000 /* no pte found? */ |
433 | beq 1f /* if so, try to put a PTE */ | 351 | beq 1f /* if so, try to put a PTE */ |
434 | li r3,0 /* into the hash table */ | 352 | li r3,0 /* into the hash table */ |
@@ -438,12 +356,6 @@ InstructionAccess: | |||
438 | mr r5,r9 | 356 | mr r5,r9 |
439 | EXC_XFER_EE_LITE(0x400, handle_page_fault) | 357 | EXC_XFER_EE_LITE(0x400, handle_page_fault) |
440 | 358 | ||
441 | #ifdef CONFIG_PPC64BRIDGE | ||
442 | /* SLB fault on instruction access. */ | ||
443 | . = 0x480 | ||
444 | b InstructionSegment | ||
445 | #endif /* CONFIG_PPC64BRIDGE */ | ||
446 | |||
447 | /* External interrupt */ | 359 | /* External interrupt */ |
448 | EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE) | 360 | EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE) |
449 | 361 | ||
@@ -708,15 +620,9 @@ DataStoreTLBMiss: | |||
708 | EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE) | 620 | EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE) |
709 | EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE) | 621 | EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE) |
710 | EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) | 622 | EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) |
711 | #ifdef CONFIG_POWER4 | ||
712 | EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE) | ||
713 | EXCEPTION(0x1700, Trap_17, altivec_assist_exception, EXC_XFER_EE) | ||
714 | EXCEPTION(0x1800, Trap_18, TAUException, EXC_XFER_STD) | ||
715 | #else /* !CONFIG_POWER4 */ | ||
716 | EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE) | 623 | EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE) |
717 | EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD) | 624 | EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD) |
718 | EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE) | 625 | EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE) |
719 | #endif /* CONFIG_POWER4 */ | ||
720 | EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE) | 626 | EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE) |
721 | EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE) | 627 | EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE) |
722 | EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE) | 628 | EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE) |
@@ -754,28 +660,6 @@ AltiVecUnavailable: | |||
754 | addi r3,r1,STACK_FRAME_OVERHEAD | 660 | addi r3,r1,STACK_FRAME_OVERHEAD |
755 | EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception) | 661 | EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception) |
756 | 662 | ||
757 | #ifdef CONFIG_PPC64BRIDGE | ||
758 | DataAccess: | ||
759 | EXCEPTION_PROLOG | ||
760 | b DataAccessCont | ||
761 | |||
762 | InstructionAccess: | ||
763 | EXCEPTION_PROLOG | ||
764 | b InstructionAccessCont | ||
765 | |||
766 | DataSegment: | ||
767 | EXCEPTION_PROLOG | ||
768 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
769 | mfspr r4,SPRN_DAR | ||
770 | stw r4,_DAR(r11) | ||
771 | EXC_XFER_STD(0x380, unknown_exception) | ||
772 | |||
773 | InstructionSegment: | ||
774 | EXCEPTION_PROLOG | ||
775 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
776 | EXC_XFER_STD(0x480, unknown_exception) | ||
777 | #endif /* CONFIG_PPC64BRIDGE */ | ||
778 | |||
779 | #ifdef CONFIG_ALTIVEC | 663 | #ifdef CONFIG_ALTIVEC |
780 | /* Note that the AltiVec support is closely modeled after the FP | 664 | /* Note that the AltiVec support is closely modeled after the FP |
781 | * support. Changes to one are likely to be applicable to the | 665 | * support. Changes to one are likely to be applicable to the |
@@ -1048,13 +932,6 @@ __secondary_start_pmac_0: | |||
1048 | 932 | ||
1049 | .globl __secondary_start | 933 | .globl __secondary_start |
1050 | __secondary_start: | 934 | __secondary_start: |
1051 | #ifdef CONFIG_PPC64BRIDGE | ||
1052 | mfmsr r0 | ||
1053 | clrldi r0,r0,1 /* make sure it's in 32-bit mode */ | ||
1054 | SYNC | ||
1055 | MTMSRD(r0) | ||
1056 | isync | ||
1057 | #endif | ||
1058 | /* Copy some CPU settings from CPU 0 */ | 935 | /* Copy some CPU settings from CPU 0 */ |
1059 | bl __restore_cpu_setup | 936 | bl __restore_cpu_setup |
1060 | 937 | ||
@@ -1065,10 +942,6 @@ __secondary_start: | |||
1065 | lis r3,-KERNELBASE@h | 942 | lis r3,-KERNELBASE@h |
1066 | bl init_idle_6xx | 943 | bl init_idle_6xx |
1067 | #endif /* CONFIG_6xx */ | 944 | #endif /* CONFIG_6xx */ |
1068 | #ifdef CONFIG_POWER4 | ||
1069 | lis r3,-KERNELBASE@h | ||
1070 | bl init_idle_power4 | ||
1071 | #endif /* CONFIG_POWER4 */ | ||
1072 | 945 | ||
1073 | /* get current_thread_info and current */ | 946 | /* get current_thread_info and current */ |
1074 | lis r1,secondary_ti@ha | 947 | lis r1,secondary_ti@ha |
@@ -1109,12 +982,12 @@ __secondary_start: | |||
1109 | * Those generic dummy functions are kept for CPUs not | 982 | * Those generic dummy functions are kept for CPUs not |
1110 | * included in CONFIG_6xx | 983 | * included in CONFIG_6xx |
1111 | */ | 984 | */ |
1112 | #if !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) | 985 | #if !defined(CONFIG_6xx) |
1113 | _GLOBAL(__save_cpu_setup) | 986 | _GLOBAL(__save_cpu_setup) |
1114 | blr | 987 | blr |
1115 | _GLOBAL(__restore_cpu_setup) | 988 | _GLOBAL(__restore_cpu_setup) |
1116 | blr | 989 | blr |
1117 | #endif /* !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) */ | 990 | #endif /* !defined(CONFIG_6xx) */ |
1118 | 991 | ||
1119 | 992 | ||
1120 | /* | 993 | /* |
@@ -1132,11 +1005,6 @@ load_up_mmu: | |||
1132 | tophys(r6,r6) | 1005 | tophys(r6,r6) |
1133 | lwz r6,_SDR1@l(r6) | 1006 | lwz r6,_SDR1@l(r6) |
1134 | mtspr SPRN_SDR1,r6 | 1007 | mtspr SPRN_SDR1,r6 |
1135 | #ifdef CONFIG_PPC64BRIDGE | ||
1136 | /* clear the ASR so we only use the pseudo-segment registers. */ | ||
1137 | li r6,0 | ||
1138 | mtasr r6 | ||
1139 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1140 | li r0,16 /* load up segment register values */ | 1008 | li r0,16 /* load up segment register values */ |
1141 | mtctr r0 /* for context 0 */ | 1009 | mtctr r0 /* for context 0 */ |
1142 | lis r3,0x2000 /* Ku = 1, VSID = 0 */ | 1010 | lis r3,0x2000 /* Ku = 1, VSID = 0 */ |
@@ -1145,7 +1013,7 @@ load_up_mmu: | |||
1145 | addi r3,r3,0x111 /* increment VSID */ | 1013 | addi r3,r3,0x111 /* increment VSID */ |
1146 | addis r4,r4,0x1000 /* address of next segment */ | 1014 | addis r4,r4,0x1000 /* address of next segment */ |
1147 | bdnz 3b | 1015 | bdnz 3b |
1148 | #ifndef CONFIG_POWER4 | 1016 | |
1149 | /* Load the BAT registers with the values set up by MMU_init. | 1017 | /* Load the BAT registers with the values set up by MMU_init. |
1150 | MMU_init takes care of whether we're on a 601 or not. */ | 1018 | MMU_init takes care of whether we're on a 601 or not. */ |
1151 | mfpvr r3 | 1019 | mfpvr r3 |
@@ -1158,7 +1026,7 @@ load_up_mmu: | |||
1158 | LOAD_BAT(1,r3,r4,r5) | 1026 | LOAD_BAT(1,r3,r4,r5) |
1159 | LOAD_BAT(2,r3,r4,r5) | 1027 | LOAD_BAT(2,r3,r4,r5) |
1160 | LOAD_BAT(3,r3,r4,r5) | 1028 | LOAD_BAT(3,r3,r4,r5) |
1161 | #endif /* CONFIG_POWER4 */ | 1029 | |
1162 | blr | 1030 | blr |
1163 | 1031 | ||
1164 | /* | 1032 | /* |
@@ -1269,9 +1137,6 @@ _GLOBAL(set_context) | |||
1269 | li r4,0 | 1137 | li r4,0 |
1270 | isync | 1138 | isync |
1271 | 3: | 1139 | 3: |
1272 | #ifdef CONFIG_PPC64BRIDGE | ||
1273 | slbie r4 | ||
1274 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1275 | mtsrin r3,r4 | 1140 | mtsrin r3,r4 |
1276 | addi r3,r3,0x111 /* next VSID */ | 1141 | addi r3,r3,0x111 /* next VSID */ |
1277 | rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */ | 1142 | rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */ |
@@ -1358,7 +1223,6 @@ mmu_off: | |||
1358 | sync | 1223 | sync |
1359 | RFI | 1224 | RFI |
1360 | 1225 | ||
1361 | #ifndef CONFIG_POWER4 | ||
1362 | /* | 1226 | /* |
1363 | * Use the first pair of BAT registers to map the 1st 16MB | 1227 | * Use the first pair of BAT registers to map the 1st 16MB |
1364 | * of RAM to KERNELBASE. From this point on we can't safely | 1228 | * of RAM to KERNELBASE. From this point on we can't safely |
@@ -1366,7 +1230,6 @@ mmu_off: | |||
1366 | */ | 1230 | */ |
1367 | initial_bats: | 1231 | initial_bats: |
1368 | lis r11,KERNELBASE@h | 1232 | lis r11,KERNELBASE@h |
1369 | #ifndef CONFIG_PPC64BRIDGE | ||
1370 | mfspr r9,SPRN_PVR | 1233 | mfspr r9,SPRN_PVR |
1371 | rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */ | 1234 | rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */ |
1372 | cmpwi 0,r9,1 | 1235 | cmpwi 0,r9,1 |
@@ -1381,7 +1244,6 @@ initial_bats: | |||
1381 | mtspr SPRN_IBAT1L,r10 | 1244 | mtspr SPRN_IBAT1L,r10 |
1382 | isync | 1245 | isync |
1383 | blr | 1246 | blr |
1384 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1385 | 1247 | ||
1386 | 4: tophys(r8,r11) | 1248 | 4: tophys(r8,r11) |
1387 | #ifdef CONFIG_SMP | 1249 | #ifdef CONFIG_SMP |
@@ -1395,11 +1257,6 @@ initial_bats: | |||
1395 | ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */ | 1257 | ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */ |
1396 | #endif /* CONFIG_APUS */ | 1258 | #endif /* CONFIG_APUS */ |
1397 | 1259 | ||
1398 | #ifdef CONFIG_PPC64BRIDGE | ||
1399 | /* clear out the high 32 bits in the BAT */ | ||
1400 | clrldi r11,r11,32 | ||
1401 | clrldi r8,r8,32 | ||
1402 | #endif /* CONFIG_PPC64BRIDGE */ | ||
1403 | mtspr SPRN_DBAT0L,r8 /* N.B. 6xx (not 601) have valid */ | 1260 | mtspr SPRN_DBAT0L,r8 /* N.B. 6xx (not 601) have valid */ |
1404 | mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */ | 1261 | mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */ |
1405 | mtspr SPRN_IBAT0L,r8 | 1262 | mtspr SPRN_IBAT0L,r8 |
@@ -1432,38 +1289,6 @@ setup_disp_bat: | |||
1432 | 1289 | ||
1433 | #endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */ | 1290 | #endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */ |
1434 | 1291 | ||
1435 | #else /* CONFIG_POWER4 */ | ||
1436 | /* | ||
1437 | * Load up the SDR1 and segment register values now | ||
1438 | * since we don't have the BATs. | ||
1439 | * Also make sure we are running in 32-bit mode. | ||
1440 | */ | ||
1441 | |||
1442 | initial_mm_power4: | ||
1443 | addis r14,r3,_SDR1@ha /* get the value from _SDR1 */ | ||
1444 | lwz r14,_SDR1@l(r14) /* assume hash table below 4GB */ | ||
1445 | mtspr SPRN_SDR1,r14 | ||
1446 | slbia | ||
1447 | lis r4,0x2000 /* set pseudo-segment reg 12 */ | ||
1448 | ori r5,r4,0x0ccc | ||
1449 | mtsr 12,r5 | ||
1450 | #if 0 | ||
1451 | ori r5,r4,0x0888 /* set pseudo-segment reg 8 */ | ||
1452 | mtsr 8,r5 /* (for access to serial port) */ | ||
1453 | #endif | ||
1454 | #ifdef CONFIG_BOOTX_TEXT | ||
1455 | ori r5,r4,0x0999 /* set pseudo-segment reg 9 */ | ||
1456 | mtsr 9,r5 /* (for access to screen) */ | ||
1457 | #endif | ||
1458 | mfmsr r0 | ||
1459 | clrldi r0,r0,1 | ||
1460 | sync | ||
1461 | mtmsr r0 | ||
1462 | isync | ||
1463 | blr | ||
1464 | |||
1465 | #endif /* CONFIG_POWER4 */ | ||
1466 | |||
1467 | #ifdef CONFIG_8260 | 1292 | #ifdef CONFIG_8260 |
1468 | /* Jump into the system reset for the rom. | 1293 | /* Jump into the system reset for the rom. |
1469 | * We first disable the MMU, and then jump to the ROM reset address. | 1294 | * We first disable the MMU, and then jump to the ROM reset address. |
diff --git a/arch/ppc/kernel/idle.c b/arch/ppc/kernel/idle.c deleted file mode 100644 index 1be3ca5bae40..000000000000 --- a/arch/ppc/kernel/idle.c +++ /dev/null | |||
@@ -1,112 +0,0 @@ | |||
1 | /* | ||
2 | * Idle daemon for PowerPC. Idle daemon will handle any action | ||
3 | * that needs to be taken when the system becomes idle. | ||
4 | * | ||
5 | * Written by Cort Dougan (cort@cs.nmt.edu). Subsequently hacked | ||
6 | * on by Tom Rini, Armin Kuster, Paul Mackerras and others. | ||
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 <linux/config.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/sched.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/mm.h> | ||
18 | #include <linux/smp.h> | ||
19 | #include <linux/smp_lock.h> | ||
20 | #include <linux/stddef.h> | ||
21 | #include <linux/unistd.h> | ||
22 | #include <linux/ptrace.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <linux/sysctl.h> | ||
25 | #include <linux/cpu.h> | ||
26 | |||
27 | #include <asm/pgtable.h> | ||
28 | #include <asm/uaccess.h> | ||
29 | #include <asm/system.h> | ||
30 | #include <asm/io.h> | ||
31 | #include <asm/mmu.h> | ||
32 | #include <asm/cache.h> | ||
33 | #include <asm/cputable.h> | ||
34 | #include <asm/machdep.h> | ||
35 | #include <asm/smp.h> | ||
36 | |||
37 | void default_idle(void) | ||
38 | { | ||
39 | void (*powersave)(void); | ||
40 | |||
41 | powersave = ppc_md.power_save; | ||
42 | |||
43 | if (!need_resched()) { | ||
44 | if (powersave != NULL) | ||
45 | powersave(); | ||
46 | #ifdef CONFIG_SMP | ||
47 | else { | ||
48 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
49 | while (!need_resched() && | ||
50 | !cpu_is_offline(smp_processor_id())) | ||
51 | barrier(); | ||
52 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
53 | } | ||
54 | #endif | ||
55 | } | ||
56 | } | ||
57 | |||
58 | /* | ||
59 | * The body of the idle task. | ||
60 | */ | ||
61 | void cpu_idle(void) | ||
62 | { | ||
63 | int cpu = smp_processor_id(); | ||
64 | |||
65 | for (;;) { | ||
66 | while (!need_resched()) { | ||
67 | if (ppc_md.idle != NULL) | ||
68 | ppc_md.idle(); | ||
69 | else | ||
70 | default_idle(); | ||
71 | } | ||
72 | |||
73 | if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING) | ||
74 | cpu_die(); | ||
75 | preempt_enable_no_resched(); | ||
76 | schedule(); | ||
77 | preempt_disable(); | ||
78 | } | ||
79 | } | ||
80 | |||
81 | #if defined(CONFIG_SYSCTL) && defined(CONFIG_6xx) | ||
82 | /* | ||
83 | * Register the sysctl to set/clear powersave_nap. | ||
84 | */ | ||
85 | extern int powersave_nap; | ||
86 | |||
87 | static ctl_table powersave_nap_ctl_table[]={ | ||
88 | { | ||
89 | .ctl_name = KERN_PPC_POWERSAVE_NAP, | ||
90 | .procname = "powersave-nap", | ||
91 | .data = &powersave_nap, | ||
92 | .maxlen = sizeof(int), | ||
93 | .mode = 0644, | ||
94 | .proc_handler = &proc_dointvec, | ||
95 | }, | ||
96 | { 0, }, | ||
97 | }; | ||
98 | static ctl_table powersave_nap_sysctl_root[] = { | ||
99 | { 1, "kernel", NULL, 0, 0755, powersave_nap_ctl_table, }, | ||
100 | { 0,}, | ||
101 | }; | ||
102 | |||
103 | static int __init | ||
104 | register_powersave_nap_sysctl(void) | ||
105 | { | ||
106 | register_sysctl_table(powersave_nap_sysctl_root, 0); | ||
107 | |||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | __initcall(register_powersave_nap_sysctl); | ||
112 | #endif | ||
diff --git a/arch/ppc/kernel/idle_6xx.S b/arch/ppc/kernel/idle_6xx.S deleted file mode 100644 index 1a2194cf6828..000000000000 --- a/arch/ppc/kernel/idle_6xx.S +++ /dev/null | |||
@@ -1,233 +0,0 @@ | |||
1 | /* | ||
2 | * This file contains the power_save function for 6xx & 7xxx CPUs | ||
3 | * rewritten in assembler | ||
4 | * | ||
5 | * Warning ! This code assumes that if your machine has a 750fx | ||
6 | * it will have PLL 1 set to low speed mode (used during NAP/DOZE). | ||
7 | * if this is not the case some additional changes will have to | ||
8 | * be done to check a runtime var (a bit like powersave-nap) | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <linux/threads.h> | ||
18 | #include <asm/processor.h> | ||
19 | #include <asm/page.h> | ||
20 | #include <asm/cputable.h> | ||
21 | #include <asm/thread_info.h> | ||
22 | #include <asm/ppc_asm.h> | ||
23 | #include <asm/asm-offsets.h> | ||
24 | |||
25 | #undef DEBUG | ||
26 | |||
27 | .text | ||
28 | |||
29 | /* | ||
30 | * Init idle, called at early CPU setup time from head.S for each CPU | ||
31 | * Make sure no rest of NAP mode remains in HID0, save default | ||
32 | * values for some CPU specific registers. Called with r24 | ||
33 | * containing CPU number and r3 reloc offset | ||
34 | */ | ||
35 | _GLOBAL(init_idle_6xx) | ||
36 | BEGIN_FTR_SECTION | ||
37 | mfspr r4,SPRN_HID0 | ||
38 | rlwinm r4,r4,0,10,8 /* Clear NAP */ | ||
39 | mtspr SPRN_HID0, r4 | ||
40 | b 1f | ||
41 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) | ||
42 | blr | ||
43 | 1: | ||
44 | slwi r5,r24,2 | ||
45 | add r5,r5,r3 | ||
46 | BEGIN_FTR_SECTION | ||
47 | mfspr r4,SPRN_MSSCR0 | ||
48 | addis r6,r5, nap_save_msscr0@ha | ||
49 | stw r4,nap_save_msscr0@l(r6) | ||
50 | END_FTR_SECTION_IFSET(CPU_FTR_NAP_DISABLE_L2_PR) | ||
51 | BEGIN_FTR_SECTION | ||
52 | mfspr r4,SPRN_HID1 | ||
53 | addis r6,r5,nap_save_hid1@ha | ||
54 | stw r4,nap_save_hid1@l(r6) | ||
55 | END_FTR_SECTION_IFSET(CPU_FTR_DUAL_PLL_750FX) | ||
56 | blr | ||
57 | |||
58 | /* | ||
59 | * Here is the power_save_6xx function. This could eventually be | ||
60 | * split into several functions & changing the function pointer | ||
61 | * depending on the various features. | ||
62 | */ | ||
63 | _GLOBAL(ppc6xx_idle) | ||
64 | /* Check if we can nap or doze, put HID0 mask in r3 | ||
65 | */ | ||
66 | lis r3, 0 | ||
67 | BEGIN_FTR_SECTION | ||
68 | lis r3,HID0_DOZE@h | ||
69 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) | ||
70 | BEGIN_FTR_SECTION | ||
71 | /* We must dynamically check for the NAP feature as it | ||
72 | * can be cleared by CPU init after the fixups are done | ||
73 | */ | ||
74 | lis r4,cur_cpu_spec@ha | ||
75 | lwz r4,cur_cpu_spec@l(r4) | ||
76 | lwz r4,CPU_SPEC_FEATURES(r4) | ||
77 | andi. r0,r4,CPU_FTR_CAN_NAP | ||
78 | beq 1f | ||
79 | /* Now check if user or arch enabled NAP mode */ | ||
80 | lis r4,powersave_nap@ha | ||
81 | lwz r4,powersave_nap@l(r4) | ||
82 | cmpwi 0,r4,0 | ||
83 | beq 1f | ||
84 | lis r3,HID0_NAP@h | ||
85 | 1: | ||
86 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) | ||
87 | cmpwi 0,r3,0 | ||
88 | beqlr | ||
89 | |||
90 | /* Clear MSR:EE */ | ||
91 | mfmsr r7 | ||
92 | rlwinm r0,r7,0,17,15 | ||
93 | mtmsr r0 | ||
94 | |||
95 | /* Check current_thread_info()->flags */ | ||
96 | rlwinm r4,r1,0,0,18 | ||
97 | lwz r4,TI_FLAGS(r4) | ||
98 | andi. r0,r4,_TIF_NEED_RESCHED | ||
99 | beq 1f | ||
100 | mtmsr r7 /* out of line this ? */ | ||
101 | blr | ||
102 | 1: | ||
103 | /* Some pre-nap cleanups needed on some CPUs */ | ||
104 | andis. r0,r3,HID0_NAP@h | ||
105 | beq 2f | ||
106 | BEGIN_FTR_SECTION | ||
107 | /* Disable L2 prefetch on some 745x and try to ensure | ||
108 | * L2 prefetch engines are idle. As explained by errata | ||
109 | * text, we can't be sure they are, we just hope very hard | ||
110 | * that well be enough (sic !). At least I noticed Apple | ||
111 | * doesn't even bother doing the dcbf's here... | ||
112 | */ | ||
113 | mfspr r4,SPRN_MSSCR0 | ||
114 | rlwinm r4,r4,0,0,29 | ||
115 | sync | ||
116 | mtspr SPRN_MSSCR0,r4 | ||
117 | sync | ||
118 | isync | ||
119 | lis r4,KERNELBASE@h | ||
120 | dcbf 0,r4 | ||
121 | dcbf 0,r4 | ||
122 | dcbf 0,r4 | ||
123 | dcbf 0,r4 | ||
124 | END_FTR_SECTION_IFSET(CPU_FTR_NAP_DISABLE_L2_PR) | ||
125 | #ifdef DEBUG | ||
126 | lis r6,nap_enter_count@ha | ||
127 | lwz r4,nap_enter_count@l(r6) | ||
128 | addi r4,r4,1 | ||
129 | stw r4,nap_enter_count@l(r6) | ||
130 | #endif | ||
131 | 2: | ||
132 | BEGIN_FTR_SECTION | ||
133 | /* Go to low speed mode on some 750FX */ | ||
134 | lis r4,powersave_lowspeed@ha | ||
135 | lwz r4,powersave_lowspeed@l(r4) | ||
136 | cmpwi 0,r4,0 | ||
137 | beq 1f | ||
138 | mfspr r4,SPRN_HID1 | ||
139 | oris r4,r4,0x0001 | ||
140 | mtspr SPRN_HID1,r4 | ||
141 | 1: | ||
142 | END_FTR_SECTION_IFSET(CPU_FTR_DUAL_PLL_750FX) | ||
143 | |||
144 | /* Go to NAP or DOZE now */ | ||
145 | mfspr r4,SPRN_HID0 | ||
146 | lis r5,(HID0_NAP|HID0_SLEEP)@h | ||
147 | BEGIN_FTR_SECTION | ||
148 | oris r5,r5,HID0_DOZE@h | ||
149 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) | ||
150 | andc r4,r4,r5 | ||
151 | or r4,r4,r3 | ||
152 | BEGIN_FTR_SECTION | ||
153 | oris r4,r4,HID0_DPM@h /* that should be done once for all */ | ||
154 | END_FTR_SECTION_IFCLR(CPU_FTR_NO_DPM) | ||
155 | mtspr SPRN_HID0,r4 | ||
156 | BEGIN_FTR_SECTION | ||
157 | DSSALL | ||
158 | sync | ||
159 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
160 | ori r7,r7,MSR_EE /* Could be ommited (already set) */ | ||
161 | oris r7,r7,MSR_POW@h | ||
162 | sync | ||
163 | isync | ||
164 | mtmsr r7 | ||
165 | isync | ||
166 | sync | ||
167 | blr | ||
168 | |||
169 | /* | ||
170 | * Return from NAP/DOZE mode, restore some CPU specific registers, | ||
171 | * we are called with DR/IR still off and r2 containing physical | ||
172 | * address of current. | ||
173 | */ | ||
174 | _GLOBAL(power_save_6xx_restore) | ||
175 | mfspr r11,SPRN_HID0 | ||
176 | rlwinm. r11,r11,0,10,8 /* Clear NAP & copy NAP bit !state to cr1 EQ */ | ||
177 | cror 4*cr1+eq,4*cr0+eq,4*cr0+eq | ||
178 | BEGIN_FTR_SECTION | ||
179 | rlwinm r11,r11,0,9,7 /* Clear DOZE */ | ||
180 | END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) | ||
181 | mtspr SPRN_HID0, r11 | ||
182 | |||
183 | #ifdef DEBUG | ||
184 | beq cr1,1f | ||
185 | lis r11,(nap_return_count-KERNELBASE)@ha | ||
186 | lwz r9,nap_return_count@l(r11) | ||
187 | addi r9,r9,1 | ||
188 | stw r9,nap_return_count@l(r11) | ||
189 | 1: | ||
190 | #endif | ||
191 | |||
192 | rlwinm r9,r1,0,0,18 | ||
193 | tophys(r9,r9) | ||
194 | lwz r11,TI_CPU(r9) | ||
195 | slwi r11,r11,2 | ||
196 | /* Todo make sure all these are in the same page | ||
197 | * and load r22 (@ha part + CPU offset) only once | ||
198 | */ | ||
199 | BEGIN_FTR_SECTION | ||
200 | beq cr1,1f | ||
201 | addis r9,r11,(nap_save_msscr0-KERNELBASE)@ha | ||
202 | lwz r9,nap_save_msscr0@l(r9) | ||
203 | mtspr SPRN_MSSCR0, r9 | ||
204 | sync | ||
205 | isync | ||
206 | 1: | ||
207 | END_FTR_SECTION_IFSET(CPU_FTR_NAP_DISABLE_L2_PR) | ||
208 | BEGIN_FTR_SECTION | ||
209 | addis r9,r11,(nap_save_hid1-KERNELBASE)@ha | ||
210 | lwz r9,nap_save_hid1@l(r9) | ||
211 | mtspr SPRN_HID1, r9 | ||
212 | END_FTR_SECTION_IFSET(CPU_FTR_DUAL_PLL_750FX) | ||
213 | b transfer_to_handler_cont | ||
214 | |||
215 | .data | ||
216 | |||
217 | _GLOBAL(nap_save_msscr0) | ||
218 | .space 4*NR_CPUS | ||
219 | |||
220 | _GLOBAL(nap_save_hid1) | ||
221 | .space 4*NR_CPUS | ||
222 | |||
223 | _GLOBAL(powersave_nap) | ||
224 | .long 0 | ||
225 | _GLOBAL(powersave_lowspeed) | ||
226 | .long 0 | ||
227 | |||
228 | #ifdef DEBUG | ||
229 | _GLOBAL(nap_enter_count) | ||
230 | .space 4 | ||
231 | _GLOBAL(nap_return_count) | ||
232 | .space 4 | ||
233 | #endif | ||
diff --git a/arch/ppc/kernel/idle_power4.S b/arch/ppc/kernel/idle_power4.S deleted file mode 100644 index cc0d535365cd..000000000000 --- a/arch/ppc/kernel/idle_power4.S +++ /dev/null | |||
@@ -1,91 +0,0 @@ | |||
1 | /* | ||
2 | * This file contains the power_save function for 6xx & 7xxx CPUs | ||
3 | * rewritten in assembler | ||
4 | * | ||
5 | * Warning ! This code assumes that if your machine has a 750fx | ||
6 | * it will have PLL 1 set to low speed mode (used during NAP/DOZE). | ||
7 | * if this is not the case some additional changes will have to | ||
8 | * be done to check a runtime var (a bit like powersave-nap) | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License | ||
12 | * as published by the Free Software Foundation; either version | ||
13 | * 2 of the License, or (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <linux/threads.h> | ||
18 | #include <asm/processor.h> | ||
19 | #include <asm/page.h> | ||
20 | #include <asm/cputable.h> | ||
21 | #include <asm/thread_info.h> | ||
22 | #include <asm/ppc_asm.h> | ||
23 | #include <asm/asm-offsets.h> | ||
24 | |||
25 | #undef DEBUG | ||
26 | |||
27 | .text | ||
28 | |||
29 | /* | ||
30 | * Init idle, called at early CPU setup time from head.S for each CPU | ||
31 | * So nothing for now. Called with r24 containing CPU number and r3 | ||
32 | * reloc offset | ||
33 | */ | ||
34 | .globl init_idle_power4 | ||
35 | init_idle_power4: | ||
36 | blr | ||
37 | |||
38 | /* | ||
39 | * Here is the power_save_6xx function. This could eventually be | ||
40 | * split into several functions & changing the function pointer | ||
41 | * depending on the various features. | ||
42 | */ | ||
43 | .globl power4_idle | ||
44 | power4_idle: | ||
45 | BEGIN_FTR_SECTION | ||
46 | blr | ||
47 | END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP) | ||
48 | /* We must dynamically check for the NAP feature as it | ||
49 | * can be cleared by CPU init after the fixups are done | ||
50 | */ | ||
51 | lis r4,cur_cpu_spec@ha | ||
52 | lwz r4,cur_cpu_spec@l(r4) | ||
53 | lwz r4,CPU_SPEC_FEATURES(r4) | ||
54 | andi. r0,r4,CPU_FTR_CAN_NAP | ||
55 | beqlr | ||
56 | /* Now check if user or arch enabled NAP mode */ | ||
57 | lis r4,powersave_nap@ha | ||
58 | lwz r4,powersave_nap@l(r4) | ||
59 | cmpwi 0,r4,0 | ||
60 | beqlr | ||
61 | |||
62 | /* Clear MSR:EE */ | ||
63 | mfmsr r7 | ||
64 | rlwinm r0,r7,0,17,15 | ||
65 | mtmsr r0 | ||
66 | |||
67 | /* Check current_thread_info()->flags */ | ||
68 | rlwinm r4,r1,0,0,18 | ||
69 | lwz r4,TI_FLAGS(r4) | ||
70 | andi. r0,r4,_TIF_NEED_RESCHED | ||
71 | beq 1f | ||
72 | mtmsr r7 /* out of line this ? */ | ||
73 | blr | ||
74 | 1: | ||
75 | /* Go to NAP now */ | ||
76 | BEGIN_FTR_SECTION | ||
77 | DSSALL | ||
78 | sync | ||
79 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
80 | ori r7,r7,MSR_EE /* Could be ommited (already set) */ | ||
81 | oris r7,r7,MSR_POW@h | ||
82 | sync | ||
83 | isync | ||
84 | mtmsr r7 | ||
85 | isync | ||
86 | sync | ||
87 | blr | ||
88 | |||
89 | .globl powersave_nap | ||
90 | powersave_nap: | ||
91 | .long 0 | ||
diff --git a/arch/ppc/kernel/l2cr.S b/arch/ppc/kernel/l2cr.S deleted file mode 100644 index d7f4e982b539..000000000000 --- a/arch/ppc/kernel/l2cr.S +++ /dev/null | |||
@@ -1,471 +0,0 @@ | |||
1 | /* | ||
2 | L2CR functions | ||
3 | Copyright © 1997-1998 by PowerLogix R & D, Inc. | ||
4 | |||
5 | This program is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published by | ||
7 | the Free Software Foundation; either version 2 of the License, or | ||
8 | (at your option) any later version. | ||
9 | |||
10 | This program is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | GNU General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with this program; if not, write to the Free Software | ||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | /* | ||
20 | Thur, Dec. 12, 1998. | ||
21 | - First public release, contributed by PowerLogix. | ||
22 | *********** | ||
23 | Sat, Aug. 7, 1999. | ||
24 | - Terry: Made sure code disabled interrupts before running. (Previously | ||
25 | it was assumed interrupts were already disabled). | ||
26 | - Terry: Updated for tentative G4 support. 4MB of memory is now flushed | ||
27 | instead of 2MB. (Prob. only 3 is necessary). | ||
28 | - Terry: Updated for workaround to HID0[DPM] processor bug | ||
29 | during global invalidates. | ||
30 | *********** | ||
31 | Thu, July 13, 2000. | ||
32 | - Terry: Added isync to correct for an errata. | ||
33 | |||
34 | 22 August 2001. | ||
35 | - DanM: Finally added the 7450 patch I've had for the past | ||
36 | several months. The L2CR is similar, but I'm going | ||
37 | to assume the user of this functions knows what they | ||
38 | are doing. | ||
39 | |||
40 | Author: Terry Greeniaus (tgree@phys.ualberta.ca) | ||
41 | Please e-mail updates to this file to me, thanks! | ||
42 | */ | ||
43 | #include <linux/config.h> | ||
44 | #include <asm/processor.h> | ||
45 | #include <asm/cputable.h> | ||
46 | #include <asm/ppc_asm.h> | ||
47 | #include <asm/cache.h> | ||
48 | #include <asm/page.h> | ||
49 | |||
50 | /* Usage: | ||
51 | |||
52 | When setting the L2CR register, you must do a few special | ||
53 | things. If you are enabling the cache, you must perform a | ||
54 | global invalidate. If you are disabling the cache, you must | ||
55 | flush the cache contents first. This routine takes care of | ||
56 | doing these things. When first enabling the cache, make sure | ||
57 | you pass in the L2CR you want, as well as passing in the | ||
58 | global invalidate bit set. A global invalidate will only be | ||
59 | performed if the L2I bit is set in applyThis. When enabling | ||
60 | the cache, you should also set the L2E bit in applyThis. If | ||
61 | you want to modify the L2CR contents after the cache has been | ||
62 | enabled, the recommended procedure is to first call | ||
63 | __setL2CR(0) to disable the cache and then call it again with | ||
64 | the new values for L2CR. Examples: | ||
65 | |||
66 | _setL2CR(0) - disables the cache | ||
67 | _setL2CR(0xB3A04000) - enables my G3 upgrade card: | ||
68 | - L2E set to turn on the cache | ||
69 | - L2SIZ set to 1MB | ||
70 | - L2CLK set to 1:1 | ||
71 | - L2RAM set to pipelined synchronous late-write | ||
72 | - L2I set to perform a global invalidation | ||
73 | - L2OH set to 0.5 nS | ||
74 | - L2DF set because this upgrade card | ||
75 | requires it | ||
76 | |||
77 | A similar call should work for your card. You need to know | ||
78 | the correct setting for your card and then place them in the | ||
79 | fields I have outlined above. Other fields support optional | ||
80 | features, such as L2DO which caches only data, or L2TS which | ||
81 | causes cache pushes from the L1 cache to go to the L2 cache | ||
82 | instead of to main memory. | ||
83 | |||
84 | IMPORTANT: | ||
85 | Starting with the 7450, the bits in this register have moved | ||
86 | or behave differently. The Enable, Parity Enable, Size, | ||
87 | and L2 Invalidate are the only bits that have not moved. | ||
88 | The size is read-only for these processors with internal L2 | ||
89 | cache, and the invalidate is a control as well as status. | ||
90 | -- Dan | ||
91 | |||
92 | */ | ||
93 | /* | ||
94 | * Summary: this procedure ignores the L2I bit in the value passed in, | ||
95 | * flushes the cache if it was already enabled, always invalidates the | ||
96 | * cache, then enables the cache if the L2E bit is set in the value | ||
97 | * passed in. | ||
98 | * -- paulus. | ||
99 | */ | ||
100 | _GLOBAL(_set_L2CR) | ||
101 | /* Make sure this is a 750 or 7400 chip */ | ||
102 | BEGIN_FTR_SECTION | ||
103 | li r3,-1 | ||
104 | blr | ||
105 | END_FTR_SECTION_IFCLR(CPU_FTR_L2CR) | ||
106 | |||
107 | mflr r9 | ||
108 | |||
109 | /* Stop DST streams */ | ||
110 | BEGIN_FTR_SECTION | ||
111 | DSSALL | ||
112 | sync | ||
113 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
114 | |||
115 | /* Turn off interrupts and data relocation. */ | ||
116 | mfmsr r7 /* Save MSR in r7 */ | ||
117 | rlwinm r4,r7,0,17,15 | ||
118 | rlwinm r4,r4,0,28,26 /* Turn off DR bit */ | ||
119 | sync | ||
120 | mtmsr r4 | ||
121 | isync | ||
122 | |||
123 | /* Before we perform the global invalidation, we must disable dynamic | ||
124 | * power management via HID0[DPM] to work around a processor bug where | ||
125 | * DPM can possibly interfere with the state machine in the processor | ||
126 | * that invalidates the L2 cache tags. | ||
127 | */ | ||
128 | mfspr r8,SPRN_HID0 /* Save HID0 in r8 */ | ||
129 | rlwinm r4,r8,0,12,10 /* Turn off HID0[DPM] */ | ||
130 | sync | ||
131 | mtspr SPRN_HID0,r4 /* Disable DPM */ | ||
132 | sync | ||
133 | |||
134 | /* Get the current enable bit of the L2CR into r4 */ | ||
135 | mfspr r4,SPRN_L2CR | ||
136 | |||
137 | /* Tweak some bits */ | ||
138 | rlwinm r5,r3,0,0,0 /* r5 contains the new enable bit */ | ||
139 | rlwinm r3,r3,0,11,9 /* Turn off the invalidate bit */ | ||
140 | rlwinm r3,r3,0,1,31 /* Turn off the enable bit */ | ||
141 | |||
142 | /* Check to see if we need to flush */ | ||
143 | rlwinm. r4,r4,0,0,0 | ||
144 | beq 2f | ||
145 | |||
146 | /* Flush the cache. First, read the first 4MB of memory (physical) to | ||
147 | * put new data in the cache. (Actually we only need | ||
148 | * the size of the L2 cache plus the size of the L1 cache, but 4MB will | ||
149 | * cover everything just to be safe). | ||
150 | */ | ||
151 | |||
152 | /**** Might be a good idea to set L2DO here - to prevent instructions | ||
153 | from getting into the cache. But since we invalidate | ||
154 | the next time we enable the cache it doesn't really matter. | ||
155 | Don't do this unless you accomodate all processor variations. | ||
156 | The bit moved on the 7450..... | ||
157 | ****/ | ||
158 | |||
159 | BEGIN_FTR_SECTION | ||
160 | /* Disable L2 prefetch on some 745x and try to ensure | ||
161 | * L2 prefetch engines are idle. As explained by errata | ||
162 | * text, we can't be sure they are, we just hope very hard | ||
163 | * that well be enough (sic !). At least I noticed Apple | ||
164 | * doesn't even bother doing the dcbf's here... | ||
165 | */ | ||
166 | mfspr r4,SPRN_MSSCR0 | ||
167 | rlwinm r4,r4,0,0,29 | ||
168 | sync | ||
169 | mtspr SPRN_MSSCR0,r4 | ||
170 | sync | ||
171 | isync | ||
172 | lis r4,KERNELBASE@h | ||
173 | dcbf 0,r4 | ||
174 | dcbf 0,r4 | ||
175 | dcbf 0,r4 | ||
176 | dcbf 0,r4 | ||
177 | END_FTR_SECTION_IFSET(CPU_FTR_SPEC7450) | ||
178 | |||
179 | /* TODO: use HW flush assist when available */ | ||
180 | |||
181 | lis r4,0x0002 | ||
182 | mtctr r4 | ||
183 | li r4,0 | ||
184 | 1: | ||
185 | lwzx r0,r0,r4 | ||
186 | addi r4,r4,32 /* Go to start of next cache line */ | ||
187 | bdnz 1b | ||
188 | isync | ||
189 | |||
190 | /* Now, flush the first 4MB of memory */ | ||
191 | lis r4,0x0002 | ||
192 | mtctr r4 | ||
193 | li r4,0 | ||
194 | sync | ||
195 | 1: | ||
196 | dcbf 0,r4 | ||
197 | addi r4,r4,32 /* Go to start of next cache line */ | ||
198 | bdnz 1b | ||
199 | |||
200 | 2: | ||
201 | /* Set up the L2CR configuration bits (and switch L2 off) */ | ||
202 | /* CPU errata: Make sure the mtspr below is already in the | ||
203 | * L1 icache | ||
204 | */ | ||
205 | b 20f | ||
206 | .balign L1_CACHE_BYTES | ||
207 | 22: | ||
208 | sync | ||
209 | mtspr SPRN_L2CR,r3 | ||
210 | sync | ||
211 | b 23f | ||
212 | 20: | ||
213 | b 21f | ||
214 | 21: sync | ||
215 | isync | ||
216 | b 22b | ||
217 | |||
218 | 23: | ||
219 | /* Perform a global invalidation */ | ||
220 | oris r3,r3,0x0020 | ||
221 | sync | ||
222 | mtspr SPRN_L2CR,r3 | ||
223 | sync | ||
224 | isync /* For errata */ | ||
225 | |||
226 | BEGIN_FTR_SECTION | ||
227 | /* On the 7450, we wait for the L2I bit to clear...... | ||
228 | */ | ||
229 | 10: mfspr r3,SPRN_L2CR | ||
230 | andis. r4,r3,0x0020 | ||
231 | bne 10b | ||
232 | b 11f | ||
233 | END_FTR_SECTION_IFSET(CPU_FTR_SPEC7450) | ||
234 | |||
235 | /* Wait for the invalidation to complete */ | ||
236 | 3: mfspr r3,SPRN_L2CR | ||
237 | rlwinm. r4,r3,0,31,31 | ||
238 | bne 3b | ||
239 | |||
240 | 11: rlwinm r3,r3,0,11,9 /* Turn off the L2I bit */ | ||
241 | sync | ||
242 | mtspr SPRN_L2CR,r3 | ||
243 | sync | ||
244 | |||
245 | /* See if we need to enable the cache */ | ||
246 | cmplwi r5,0 | ||
247 | beq 4f | ||
248 | |||
249 | /* Enable the cache */ | ||
250 | oris r3,r3,0x8000 | ||
251 | mtspr SPRN_L2CR,r3 | ||
252 | sync | ||
253 | |||
254 | /* Enable L2 HW prefetch on 744x/745x */ | ||
255 | BEGIN_FTR_SECTION | ||
256 | mfspr r3,SPRN_MSSCR0 | ||
257 | ori r3,r3,3 | ||
258 | sync | ||
259 | mtspr SPRN_MSSCR0,r3 | ||
260 | sync | ||
261 | isync | ||
262 | END_FTR_SECTION_IFSET(CPU_FTR_SPEC7450) | ||
263 | 4: | ||
264 | |||
265 | /* Restore HID0[DPM] to whatever it was before */ | ||
266 | sync | ||
267 | mtspr 1008,r8 | ||
268 | sync | ||
269 | |||
270 | /* Restore MSR (restores EE and DR bits to original state) */ | ||
271 | SYNC | ||
272 | mtmsr r7 | ||
273 | isync | ||
274 | |||
275 | mtlr r9 | ||
276 | blr | ||
277 | |||
278 | _GLOBAL(_get_L2CR) | ||
279 | /* Return the L2CR contents */ | ||
280 | li r3,0 | ||
281 | BEGIN_FTR_SECTION | ||
282 | mfspr r3,SPRN_L2CR | ||
283 | END_FTR_SECTION_IFSET(CPU_FTR_L2CR) | ||
284 | blr | ||
285 | |||
286 | |||
287 | /* | ||
288 | * Here is a similar routine for dealing with the L3 cache | ||
289 | * on the 745x family of chips | ||
290 | */ | ||
291 | |||
292 | _GLOBAL(_set_L3CR) | ||
293 | /* Make sure this is a 745x chip */ | ||
294 | BEGIN_FTR_SECTION | ||
295 | li r3,-1 | ||
296 | blr | ||
297 | END_FTR_SECTION_IFCLR(CPU_FTR_L3CR) | ||
298 | |||
299 | /* Turn off interrupts and data relocation. */ | ||
300 | mfmsr r7 /* Save MSR in r7 */ | ||
301 | rlwinm r4,r7,0,17,15 | ||
302 | rlwinm r4,r4,0,28,26 /* Turn off DR bit */ | ||
303 | sync | ||
304 | mtmsr r4 | ||
305 | isync | ||
306 | |||
307 | /* Stop DST streams */ | ||
308 | DSSALL | ||
309 | sync | ||
310 | |||
311 | /* Get the current enable bit of the L3CR into r4 */ | ||
312 | mfspr r4,SPRN_L3CR | ||
313 | |||
314 | /* Tweak some bits */ | ||
315 | rlwinm r5,r3,0,0,0 /* r5 contains the new enable bit */ | ||
316 | rlwinm r3,r3,0,22,20 /* Turn off the invalidate bit */ | ||
317 | rlwinm r3,r3,0,2,31 /* Turn off the enable & PE bits */ | ||
318 | rlwinm r3,r3,0,5,3 /* Turn off the clken bit */ | ||
319 | /* Check to see if we need to flush */ | ||
320 | rlwinm. r4,r4,0,0,0 | ||
321 | beq 2f | ||
322 | |||
323 | /* Flush the cache. | ||
324 | */ | ||
325 | |||
326 | /* TODO: use HW flush assist */ | ||
327 | |||
328 | lis r4,0x0008 | ||
329 | mtctr r4 | ||
330 | li r4,0 | ||
331 | 1: | ||
332 | lwzx r0,r0,r4 | ||
333 | dcbf 0,r4 | ||
334 | addi r4,r4,32 /* Go to start of next cache line */ | ||
335 | bdnz 1b | ||
336 | |||
337 | 2: | ||
338 | /* Set up the L3CR configuration bits (and switch L3 off) */ | ||
339 | sync | ||
340 | mtspr SPRN_L3CR,r3 | ||
341 | sync | ||
342 | |||
343 | oris r3,r3,L3CR_L3RES@h /* Set reserved bit 5 */ | ||
344 | mtspr SPRN_L3CR,r3 | ||
345 | sync | ||
346 | oris r3,r3,L3CR_L3CLKEN@h /* Set clken */ | ||
347 | mtspr SPRN_L3CR,r3 | ||
348 | sync | ||
349 | |||
350 | /* Wait for stabilize */ | ||
351 | li r0,256 | ||
352 | mtctr r0 | ||
353 | 1: bdnz 1b | ||
354 | |||
355 | /* Perform a global invalidation */ | ||
356 | ori r3,r3,0x0400 | ||
357 | sync | ||
358 | mtspr SPRN_L3CR,r3 | ||
359 | sync | ||
360 | isync | ||
361 | |||
362 | /* We wait for the L3I bit to clear...... */ | ||
363 | 10: mfspr r3,SPRN_L3CR | ||
364 | andi. r4,r3,0x0400 | ||
365 | bne 10b | ||
366 | |||
367 | /* Clear CLKEN */ | ||
368 | rlwinm r3,r3,0,5,3 /* Turn off the clken bit */ | ||
369 | mtspr SPRN_L3CR,r3 | ||
370 | sync | ||
371 | |||
372 | /* Wait for stabilize */ | ||
373 | li r0,256 | ||
374 | mtctr r0 | ||
375 | 1: bdnz 1b | ||
376 | |||
377 | /* See if we need to enable the cache */ | ||
378 | cmplwi r5,0 | ||
379 | beq 4f | ||
380 | |||
381 | /* Enable the cache */ | ||
382 | oris r3,r3,(L3CR_L3E | L3CR_L3CLKEN)@h | ||
383 | mtspr SPRN_L3CR,r3 | ||
384 | sync | ||
385 | |||
386 | /* Wait for stabilize */ | ||
387 | li r0,256 | ||
388 | mtctr r0 | ||
389 | 1: bdnz 1b | ||
390 | |||
391 | /* Restore MSR (restores EE and DR bits to original state) */ | ||
392 | 4: SYNC | ||
393 | mtmsr r7 | ||
394 | isync | ||
395 | blr | ||
396 | |||
397 | _GLOBAL(_get_L3CR) | ||
398 | /* Return the L3CR contents */ | ||
399 | li r3,0 | ||
400 | BEGIN_FTR_SECTION | ||
401 | mfspr r3,SPRN_L3CR | ||
402 | END_FTR_SECTION_IFSET(CPU_FTR_L3CR) | ||
403 | blr | ||
404 | |||
405 | /* --- End of PowerLogix code --- | ||
406 | */ | ||
407 | |||
408 | |||
409 | /* flush_disable_L1() - Flush and disable L1 cache | ||
410 | * | ||
411 | * clobbers r0, r3, ctr, cr0 | ||
412 | * Must be called with interrupts disabled and MMU enabled. | ||
413 | */ | ||
414 | _GLOBAL(__flush_disable_L1) | ||
415 | /* Stop pending alitvec streams and memory accesses */ | ||
416 | BEGIN_FTR_SECTION | ||
417 | DSSALL | ||
418 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
419 | sync | ||
420 | |||
421 | /* Load counter to 0x4000 cache lines (512k) and | ||
422 | * load cache with datas | ||
423 | */ | ||
424 | li r3,0x4000 /* 512kB / 32B */ | ||
425 | mtctr r3 | ||
426 | lis r3,KERNELBASE@h | ||
427 | 1: | ||
428 | lwz r0,0(r3) | ||
429 | addi r3,r3,0x0020 /* Go to start of next cache line */ | ||
430 | bdnz 1b | ||
431 | isync | ||
432 | sync | ||
433 | |||
434 | /* Now flush those cache lines */ | ||
435 | li r3,0x4000 /* 512kB / 32B */ | ||
436 | mtctr r3 | ||
437 | lis r3,KERNELBASE@h | ||
438 | 1: | ||
439 | dcbf 0,r3 | ||
440 | addi r3,r3,0x0020 /* Go to start of next cache line */ | ||
441 | bdnz 1b | ||
442 | sync | ||
443 | |||
444 | /* We can now disable the L1 cache (HID0:DCE, HID0:ICE) */ | ||
445 | mfspr r3,SPRN_HID0 | ||
446 | rlwinm r3,r3,0,18,15 | ||
447 | mtspr SPRN_HID0,r3 | ||
448 | sync | ||
449 | isync | ||
450 | blr | ||
451 | |||
452 | /* inval_enable_L1 - Invalidate and enable L1 cache | ||
453 | * | ||
454 | * Assumes L1 is already disabled and MSR:EE is off | ||
455 | * | ||
456 | * clobbers r3 | ||
457 | */ | ||
458 | _GLOBAL(__inval_enable_L1) | ||
459 | /* Enable and then Flash inval the instruction & data cache */ | ||
460 | mfspr r3,SPRN_HID0 | ||
461 | ori r3,r3, HID0_ICE|HID0_ICFI|HID0_DCE|HID0_DCI | ||
462 | sync | ||
463 | isync | ||
464 | mtspr SPRN_HID0,r3 | ||
465 | xori r3,r3, HID0_ICFI|HID0_DCI | ||
466 | mtspr SPRN_HID0,r3 | ||
467 | sync | ||
468 | |||
469 | blr | ||
470 | |||
471 | |||
diff --git a/arch/ppc/kernel/module.c b/arch/ppc/kernel/module.c deleted file mode 100644 index 92f4e5f64f02..000000000000 --- a/arch/ppc/kernel/module.c +++ /dev/null | |||
@@ -1,320 +0,0 @@ | |||
1 | /* Kernel module help for PPC. | ||
2 | Copyright (C) 2001 Rusty Russell. | ||
3 | |||
4 | This program is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 2 of the License, or | ||
7 | (at your option) any later version. | ||
8 | |||
9 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with this program; if not, write to the Free Software | ||
16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/moduleloader.h> | ||
20 | #include <linux/elf.h> | ||
21 | #include <linux/vmalloc.h> | ||
22 | #include <linux/fs.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/cache.h> | ||
26 | |||
27 | #if 0 | ||
28 | #define DEBUGP printk | ||
29 | #else | ||
30 | #define DEBUGP(fmt , ...) | ||
31 | #endif | ||
32 | |||
33 | LIST_HEAD(module_bug_list); | ||
34 | |||
35 | void *module_alloc(unsigned long size) | ||
36 | { | ||
37 | if (size == 0) | ||
38 | return NULL; | ||
39 | return vmalloc(size); | ||
40 | } | ||
41 | |||
42 | /* Free memory returned from module_alloc */ | ||
43 | void module_free(struct module *mod, void *module_region) | ||
44 | { | ||
45 | vfree(module_region); | ||
46 | /* FIXME: If module_region == mod->init_region, trim exception | ||
47 | table entries. */ | ||
48 | } | ||
49 | |||
50 | /* Count how many different relocations (different symbol, different | ||
51 | addend) */ | ||
52 | static unsigned int count_relocs(const Elf32_Rela *rela, unsigned int num) | ||
53 | { | ||
54 | unsigned int i, j, ret = 0; | ||
55 | |||
56 | /* Sure, this is order(n^2), but it's usually short, and not | ||
57 | time critical */ | ||
58 | for (i = 0; i < num; i++) { | ||
59 | for (j = 0; j < i; j++) { | ||
60 | /* If this addend appeared before, it's | ||
61 | already been counted */ | ||
62 | if (ELF32_R_SYM(rela[i].r_info) | ||
63 | == ELF32_R_SYM(rela[j].r_info) | ||
64 | && rela[i].r_addend == rela[j].r_addend) | ||
65 | break; | ||
66 | } | ||
67 | if (j == i) ret++; | ||
68 | } | ||
69 | return ret; | ||
70 | } | ||
71 | |||
72 | /* Get the potential trampolines size required of the init and | ||
73 | non-init sections */ | ||
74 | static unsigned long get_plt_size(const Elf32_Ehdr *hdr, | ||
75 | const Elf32_Shdr *sechdrs, | ||
76 | const char *secstrings, | ||
77 | int is_init) | ||
78 | { | ||
79 | unsigned long ret = 0; | ||
80 | unsigned i; | ||
81 | |||
82 | /* Everything marked ALLOC (this includes the exported | ||
83 | symbols) */ | ||
84 | for (i = 1; i < hdr->e_shnum; i++) { | ||
85 | /* If it's called *.init*, and we're not init, we're | ||
86 | not interested */ | ||
87 | if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0) | ||
88 | != is_init) | ||
89 | continue; | ||
90 | |||
91 | /* We don't want to look at debug sections. */ | ||
92 | if (strstr(secstrings + sechdrs[i].sh_name, ".debug") != 0) | ||
93 | continue; | ||
94 | |||
95 | if (sechdrs[i].sh_type == SHT_RELA) { | ||
96 | DEBUGP("Found relocations in section %u\n", i); | ||
97 | DEBUGP("Ptr: %p. Number: %u\n", | ||
98 | (void *)hdr + sechdrs[i].sh_offset, | ||
99 | sechdrs[i].sh_size / sizeof(Elf32_Rela)); | ||
100 | ret += count_relocs((void *)hdr | ||
101 | + sechdrs[i].sh_offset, | ||
102 | sechdrs[i].sh_size | ||
103 | / sizeof(Elf32_Rela)) | ||
104 | * sizeof(struct ppc_plt_entry); | ||
105 | } | ||
106 | } | ||
107 | |||
108 | return ret; | ||
109 | } | ||
110 | |||
111 | int module_frob_arch_sections(Elf32_Ehdr *hdr, | ||
112 | Elf32_Shdr *sechdrs, | ||
113 | char *secstrings, | ||
114 | struct module *me) | ||
115 | { | ||
116 | unsigned int i; | ||
117 | |||
118 | /* Find .plt and .init.plt sections */ | ||
119 | for (i = 0; i < hdr->e_shnum; i++) { | ||
120 | if (strcmp(secstrings + sechdrs[i].sh_name, ".init.plt") == 0) | ||
121 | me->arch.init_plt_section = i; | ||
122 | else if (strcmp(secstrings + sechdrs[i].sh_name, ".plt") == 0) | ||
123 | me->arch.core_plt_section = i; | ||
124 | } | ||
125 | if (!me->arch.core_plt_section || !me->arch.init_plt_section) { | ||
126 | printk("Module doesn't contain .plt or .init.plt sections.\n"); | ||
127 | return -ENOEXEC; | ||
128 | } | ||
129 | |||
130 | /* Override their sizes */ | ||
131 | sechdrs[me->arch.core_plt_section].sh_size | ||
132 | = get_plt_size(hdr, sechdrs, secstrings, 0); | ||
133 | sechdrs[me->arch.init_plt_section].sh_size | ||
134 | = get_plt_size(hdr, sechdrs, secstrings, 1); | ||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | int apply_relocate(Elf32_Shdr *sechdrs, | ||
139 | const char *strtab, | ||
140 | unsigned int symindex, | ||
141 | unsigned int relsec, | ||
142 | struct module *module) | ||
143 | { | ||
144 | printk(KERN_ERR "%s: Non-ADD RELOCATION unsupported\n", | ||
145 | module->name); | ||
146 | return -ENOEXEC; | ||
147 | } | ||
148 | |||
149 | static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val) | ||
150 | { | ||
151 | if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16) | ||
152 | && entry->jump[1] == 0x396b0000 + (val & 0xffff)) | ||
153 | return 1; | ||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | /* Set up a trampoline in the PLT to bounce us to the distant function */ | ||
158 | static uint32_t do_plt_call(void *location, | ||
159 | Elf32_Addr val, | ||
160 | Elf32_Shdr *sechdrs, | ||
161 | struct module *mod) | ||
162 | { | ||
163 | struct ppc_plt_entry *entry; | ||
164 | |||
165 | DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location); | ||
166 | /* Init, or core PLT? */ | ||
167 | if (location >= mod->module_core | ||
168 | && location < mod->module_core + mod->core_size) | ||
169 | entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr; | ||
170 | else | ||
171 | entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr; | ||
172 | |||
173 | /* Find this entry, or if that fails, the next avail. entry */ | ||
174 | while (entry->jump[0]) { | ||
175 | if (entry_matches(entry, val)) return (uint32_t)entry; | ||
176 | entry++; | ||
177 | } | ||
178 | |||
179 | /* Stolen from Paul Mackerras as well... */ | ||
180 | entry->jump[0] = 0x3d600000+((val+0x8000)>>16); /* lis r11,sym@ha */ | ||
181 | entry->jump[1] = 0x396b0000 + (val&0xffff); /* addi r11,r11,sym@l*/ | ||
182 | entry->jump[2] = 0x7d6903a6; /* mtctr r11 */ | ||
183 | entry->jump[3] = 0x4e800420; /* bctr */ | ||
184 | |||
185 | DEBUGP("Initialized plt for 0x%x at %p\n", val, entry); | ||
186 | return (uint32_t)entry; | ||
187 | } | ||
188 | |||
189 | int apply_relocate_add(Elf32_Shdr *sechdrs, | ||
190 | const char *strtab, | ||
191 | unsigned int symindex, | ||
192 | unsigned int relsec, | ||
193 | struct module *module) | ||
194 | { | ||
195 | unsigned int i; | ||
196 | Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr; | ||
197 | Elf32_Sym *sym; | ||
198 | uint32_t *location; | ||
199 | uint32_t value; | ||
200 | |||
201 | DEBUGP("Applying ADD relocate section %u to %u\n", relsec, | ||
202 | sechdrs[relsec].sh_info); | ||
203 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) { | ||
204 | /* This is where to make the change */ | ||
205 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr | ||
206 | + rela[i].r_offset; | ||
207 | /* This is the symbol it is referring to. Note that all | ||
208 | undefined symbols have been resolved. */ | ||
209 | sym = (Elf32_Sym *)sechdrs[symindex].sh_addr | ||
210 | + ELF32_R_SYM(rela[i].r_info); | ||
211 | /* `Everything is relative'. */ | ||
212 | value = sym->st_value + rela[i].r_addend; | ||
213 | |||
214 | switch (ELF32_R_TYPE(rela[i].r_info)) { | ||
215 | case R_PPC_ADDR32: | ||
216 | /* Simply set it */ | ||
217 | *(uint32_t *)location = value; | ||
218 | break; | ||
219 | |||
220 | case R_PPC_ADDR16_LO: | ||
221 | /* Low half of the symbol */ | ||
222 | *(uint16_t *)location = value; | ||
223 | break; | ||
224 | |||
225 | case R_PPC_ADDR16_HA: | ||
226 | /* Sign-adjusted lower 16 bits: PPC ELF ABI says: | ||
227 | (((x >> 16) + ((x & 0x8000) ? 1 : 0))) & 0xFFFF. | ||
228 | This is the same, only sane. | ||
229 | */ | ||
230 | *(uint16_t *)location = (value + 0x8000) >> 16; | ||
231 | break; | ||
232 | |||
233 | case R_PPC_REL24: | ||
234 | if ((int)(value - (uint32_t)location) < -0x02000000 | ||
235 | || (int)(value - (uint32_t)location) >= 0x02000000) | ||
236 | value = do_plt_call(location, value, | ||
237 | sechdrs, module); | ||
238 | |||
239 | /* Only replace bits 2 through 26 */ | ||
240 | DEBUGP("REL24 value = %08X. location = %08X\n", | ||
241 | value, (uint32_t)location); | ||
242 | DEBUGP("Location before: %08X.\n", | ||
243 | *(uint32_t *)location); | ||
244 | *(uint32_t *)location | ||
245 | = (*(uint32_t *)location & ~0x03fffffc) | ||
246 | | ((value - (uint32_t)location) | ||
247 | & 0x03fffffc); | ||
248 | DEBUGP("Location after: %08X.\n", | ||
249 | *(uint32_t *)location); | ||
250 | DEBUGP("ie. jump to %08X+%08X = %08X\n", | ||
251 | *(uint32_t *)location & 0x03fffffc, | ||
252 | (uint32_t)location, | ||
253 | (*(uint32_t *)location & 0x03fffffc) | ||
254 | + (uint32_t)location); | ||
255 | break; | ||
256 | |||
257 | case R_PPC_REL32: | ||
258 | /* 32-bit relative jump. */ | ||
259 | *(uint32_t *)location = value - (uint32_t)location; | ||
260 | break; | ||
261 | |||
262 | default: | ||
263 | printk("%s: unknown ADD relocation: %u\n", | ||
264 | module->name, | ||
265 | ELF32_R_TYPE(rela[i].r_info)); | ||
266 | return -ENOEXEC; | ||
267 | } | ||
268 | } | ||
269 | return 0; | ||
270 | } | ||
271 | |||
272 | int module_finalize(const Elf_Ehdr *hdr, | ||
273 | const Elf_Shdr *sechdrs, | ||
274 | struct module *me) | ||
275 | { | ||
276 | char *secstrings; | ||
277 | unsigned int i; | ||
278 | |||
279 | me->arch.bug_table = NULL; | ||
280 | me->arch.num_bugs = 0; | ||
281 | |||
282 | /* Find the __bug_table section, if present */ | ||
283 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | ||
284 | for (i = 1; i < hdr->e_shnum; i++) { | ||
285 | if (strcmp(secstrings+sechdrs[i].sh_name, "__bug_table")) | ||
286 | continue; | ||
287 | me->arch.bug_table = (void *) sechdrs[i].sh_addr; | ||
288 | me->arch.num_bugs = sechdrs[i].sh_size / sizeof(struct bug_entry); | ||
289 | break; | ||
290 | } | ||
291 | |||
292 | /* | ||
293 | * Strictly speaking this should have a spinlock to protect against | ||
294 | * traversals, but since we only traverse on BUG()s, a spinlock | ||
295 | * could potentially lead to deadlock and thus be counter-productive. | ||
296 | */ | ||
297 | list_add(&me->arch.bug_list, &module_bug_list); | ||
298 | |||
299 | return 0; | ||
300 | } | ||
301 | |||
302 | void module_arch_cleanup(struct module *mod) | ||
303 | { | ||
304 | list_del(&mod->arch.bug_list); | ||
305 | } | ||
306 | |||
307 | struct bug_entry *module_find_bug(unsigned long bugaddr) | ||
308 | { | ||
309 | struct mod_arch_specific *mod; | ||
310 | unsigned int i; | ||
311 | struct bug_entry *bug; | ||
312 | |||
313 | list_for_each_entry(mod, &module_bug_list, bug_list) { | ||
314 | bug = mod->bug_table; | ||
315 | for (i = 0; i < mod->num_bugs; ++i, ++bug) | ||
316 | if (bugaddr == bug->bug_addr) | ||
317 | return bug; | ||
318 | } | ||
319 | return NULL; | ||
320 | } | ||
diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c index 04d04c5bfdd0..809673a36f7a 100644 --- a/arch/ppc/kernel/pci.c +++ b/arch/ppc/kernel/pci.c | |||
@@ -46,9 +46,6 @@ static void pcibios_fixup_resources(struct pci_dev* dev); | |||
46 | static void fixup_broken_pcnet32(struct pci_dev* dev); | 46 | static void fixup_broken_pcnet32(struct pci_dev* dev); |
47 | static int reparent_resources(struct resource *parent, struct resource *res); | 47 | static int reparent_resources(struct resource *parent, struct resource *res); |
48 | static void fixup_cpc710_pci64(struct pci_dev* dev); | 48 | static void fixup_cpc710_pci64(struct pci_dev* dev); |
49 | #ifdef CONFIG_PPC_OF | ||
50 | static u8* pci_to_OF_bus_map; | ||
51 | #endif | ||
52 | 49 | ||
53 | /* By default, we don't re-assign bus numbers. | 50 | /* By default, we don't re-assign bus numbers. |
54 | */ | 51 | */ |
@@ -625,406 +622,13 @@ pcibios_alloc_controller(void) | |||
625 | return hose; | 622 | return hose; |
626 | } | 623 | } |
627 | 624 | ||
628 | #ifdef CONFIG_PPC_OF | ||
629 | /* | ||
630 | * Functions below are used on OpenFirmware machines. | ||
631 | */ | ||
632 | static void | ||
633 | make_one_node_map(struct device_node* node, u8 pci_bus) | ||
634 | { | ||
635 | int *bus_range; | ||
636 | int len; | ||
637 | |||
638 | if (pci_bus >= pci_bus_count) | ||
639 | return; | ||
640 | bus_range = (int *) get_property(node, "bus-range", &len); | ||
641 | if (bus_range == NULL || len < 2 * sizeof(int)) { | ||
642 | printk(KERN_WARNING "Can't get bus-range for %s, " | ||
643 | "assuming it starts at 0\n", node->full_name); | ||
644 | pci_to_OF_bus_map[pci_bus] = 0; | ||
645 | } else | ||
646 | pci_to_OF_bus_map[pci_bus] = bus_range[0]; | ||
647 | |||
648 | for (node=node->child; node != 0;node = node->sibling) { | ||
649 | struct pci_dev* dev; | ||
650 | unsigned int *class_code, *reg; | ||
651 | |||
652 | class_code = (unsigned int *) get_property(node, "class-code", NULL); | ||
653 | if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && | ||
654 | (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) | ||
655 | continue; | ||
656 | reg = (unsigned int *)get_property(node, "reg", NULL); | ||
657 | if (!reg) | ||
658 | continue; | ||
659 | dev = pci_find_slot(pci_bus, ((reg[0] >> 8) & 0xff)); | ||
660 | if (!dev || !dev->subordinate) | ||
661 | continue; | ||
662 | make_one_node_map(node, dev->subordinate->number); | ||
663 | } | ||
664 | } | ||
665 | |||
666 | void | ||
667 | pcibios_make_OF_bus_map(void) | ||
668 | { | ||
669 | int i; | ||
670 | struct pci_controller* hose; | ||
671 | u8* of_prop_map; | ||
672 | |||
673 | pci_to_OF_bus_map = (u8*)kmalloc(pci_bus_count, GFP_KERNEL); | ||
674 | if (!pci_to_OF_bus_map) { | ||
675 | printk(KERN_ERR "Can't allocate OF bus map !\n"); | ||
676 | return; | ||
677 | } | ||
678 | |||
679 | /* We fill the bus map with invalid values, that helps | ||
680 | * debugging. | ||
681 | */ | ||
682 | for (i=0; i<pci_bus_count; i++) | ||
683 | pci_to_OF_bus_map[i] = 0xff; | ||
684 | |||
685 | /* For each hose, we begin searching bridges */ | ||
686 | for(hose=hose_head; hose; hose=hose->next) { | ||
687 | struct device_node* node; | ||
688 | node = (struct device_node *)hose->arch_data; | ||
689 | if (!node) | ||
690 | continue; | ||
691 | make_one_node_map(node, hose->first_busno); | ||
692 | } | ||
693 | of_prop_map = get_property(find_path_device("/"), "pci-OF-bus-map", NULL); | ||
694 | if (of_prop_map) | ||
695 | memcpy(of_prop_map, pci_to_OF_bus_map, pci_bus_count); | ||
696 | #ifdef DEBUG | ||
697 | printk("PCI->OF bus map:\n"); | ||
698 | for (i=0; i<pci_bus_count; i++) { | ||
699 | if (pci_to_OF_bus_map[i] == 0xff) | ||
700 | continue; | ||
701 | printk("%d -> %d\n", i, pci_to_OF_bus_map[i]); | ||
702 | } | ||
703 | #endif | ||
704 | } | ||
705 | |||
706 | typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data); | ||
707 | |||
708 | static struct device_node* | ||
709 | scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data) | ||
710 | { | ||
711 | struct device_node* sub_node; | ||
712 | |||
713 | for (; node != 0;node = node->sibling) { | ||
714 | unsigned int *class_code; | ||
715 | |||
716 | if (filter(node, data)) | ||
717 | return node; | ||
718 | |||
719 | /* For PCI<->PCI bridges or CardBus bridges, we go down | ||
720 | * Note: some OFs create a parent node "multifunc-device" as | ||
721 | * a fake root for all functions of a multi-function device, | ||
722 | * we go down them as well. | ||
723 | */ | ||
724 | class_code = (unsigned int *) get_property(node, "class-code", NULL); | ||
725 | if ((!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && | ||
726 | (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) && | ||
727 | strcmp(node->name, "multifunc-device")) | ||
728 | continue; | ||
729 | sub_node = scan_OF_pci_childs(node->child, filter, data); | ||
730 | if (sub_node) | ||
731 | return sub_node; | ||
732 | } | ||
733 | return NULL; | ||
734 | } | ||
735 | |||
736 | static int | ||
737 | scan_OF_pci_childs_iterator(struct device_node* node, void* data) | ||
738 | { | ||
739 | unsigned int *reg; | ||
740 | u8* fdata = (u8*)data; | ||
741 | |||
742 | reg = (unsigned int *) get_property(node, "reg", NULL); | ||
743 | if (reg && ((reg[0] >> 8) & 0xff) == fdata[1] | ||
744 | && ((reg[0] >> 16) & 0xff) == fdata[0]) | ||
745 | return 1; | ||
746 | return 0; | ||
747 | } | ||
748 | |||
749 | static struct device_node* | ||
750 | scan_OF_childs_for_device(struct device_node* node, u8 bus, u8 dev_fn) | ||
751 | { | ||
752 | u8 filter_data[2] = {bus, dev_fn}; | ||
753 | |||
754 | return scan_OF_pci_childs(node, scan_OF_pci_childs_iterator, filter_data); | ||
755 | } | ||
756 | |||
757 | /* | ||
758 | * Scans the OF tree for a device node matching a PCI device | ||
759 | */ | ||
760 | struct device_node * | ||
761 | pci_busdev_to_OF_node(struct pci_bus *bus, int devfn) | ||
762 | { | ||
763 | struct pci_controller *hose; | ||
764 | struct device_node *node; | ||
765 | int busnr; | ||
766 | |||
767 | if (!have_of) | ||
768 | return NULL; | ||
769 | |||
770 | /* Lookup the hose */ | ||
771 | busnr = bus->number; | ||
772 | hose = pci_bus_to_hose(busnr); | ||
773 | if (!hose) | ||
774 | return NULL; | ||
775 | |||
776 | /* Check it has an OF node associated */ | ||
777 | node = (struct device_node *) hose->arch_data; | ||
778 | if (!node) | ||
779 | return NULL; | ||
780 | |||
781 | /* Fixup bus number according to what OF think it is. */ | ||
782 | if (pci_to_OF_bus_map) | ||
783 | busnr = pci_to_OF_bus_map[busnr]; | ||
784 | if (busnr == 0xff) | ||
785 | return NULL; | ||
786 | |||
787 | /* Now, lookup childs of the hose */ | ||
788 | return scan_OF_childs_for_device(node->child, busnr, devfn); | ||
789 | } | ||
790 | EXPORT_SYMBOL(pci_busdev_to_OF_node); | ||
791 | |||
792 | struct device_node* | ||
793 | pci_device_to_OF_node(struct pci_dev *dev) | ||
794 | { | ||
795 | return pci_busdev_to_OF_node(dev->bus, dev->devfn); | ||
796 | } | ||
797 | EXPORT_SYMBOL(pci_device_to_OF_node); | ||
798 | |||
799 | /* This routine is meant to be used early during boot, when the | ||
800 | * PCI bus numbers have not yet been assigned, and you need to | ||
801 | * issue PCI config cycles to an OF device. | ||
802 | * It could also be used to "fix" RTAS config cycles if you want | ||
803 | * to set pci_assign_all_buses to 1 and still use RTAS for PCI | ||
804 | * config cycles. | ||
805 | */ | ||
806 | struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node) | ||
807 | { | ||
808 | if (!have_of) | ||
809 | return NULL; | ||
810 | while(node) { | ||
811 | struct pci_controller* hose; | ||
812 | for (hose=hose_head;hose;hose=hose->next) | ||
813 | if (hose->arch_data == node) | ||
814 | return hose; | ||
815 | node=node->parent; | ||
816 | } | ||
817 | return NULL; | ||
818 | } | ||
819 | |||
820 | static int | ||
821 | find_OF_pci_device_filter(struct device_node* node, void* data) | ||
822 | { | ||
823 | return ((void *)node == data); | ||
824 | } | ||
825 | |||
826 | /* | ||
827 | * Returns the PCI device matching a given OF node | ||
828 | */ | ||
829 | int | ||
830 | pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn) | ||
831 | { | ||
832 | unsigned int *reg; | ||
833 | struct pci_controller* hose; | ||
834 | struct pci_dev* dev = NULL; | ||
835 | |||
836 | if (!have_of) | ||
837 | return -ENODEV; | ||
838 | /* Make sure it's really a PCI device */ | ||
839 | hose = pci_find_hose_for_OF_device(node); | ||
840 | if (!hose || !hose->arch_data) | ||
841 | return -ENODEV; | ||
842 | if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child, | ||
843 | find_OF_pci_device_filter, (void *)node)) | ||
844 | return -ENODEV; | ||
845 | reg = (unsigned int *) get_property(node, "reg", NULL); | ||
846 | if (!reg) | ||
847 | return -ENODEV; | ||
848 | *bus = (reg[0] >> 16) & 0xff; | ||
849 | *devfn = ((reg[0] >> 8) & 0xff); | ||
850 | |||
851 | /* Ok, here we need some tweak. If we have already renumbered | ||
852 | * all busses, we can't rely on the OF bus number any more. | ||
853 | * the pci_to_OF_bus_map is not enough as several PCI busses | ||
854 | * may match the same OF bus number. | ||
855 | */ | ||
856 | if (!pci_to_OF_bus_map) | ||
857 | return 0; | ||
858 | |||
859 | for_each_pci_dev(dev) | ||
860 | if (pci_to_OF_bus_map[dev->bus->number] == *bus && | ||
861 | dev->devfn == *devfn) { | ||
862 | *bus = dev->bus->number; | ||
863 | pci_dev_put(dev); | ||
864 | return 0; | ||
865 | } | ||
866 | |||
867 | return -ENODEV; | ||
868 | } | ||
869 | EXPORT_SYMBOL(pci_device_from_OF_node); | ||
870 | |||
871 | void __init | ||
872 | pci_process_bridge_OF_ranges(struct pci_controller *hose, | ||
873 | struct device_node *dev, int primary) | ||
874 | { | ||
875 | static unsigned int static_lc_ranges[256] __initdata; | ||
876 | unsigned int *dt_ranges, *lc_ranges, *ranges, *prev; | ||
877 | unsigned int size; | ||
878 | int rlen = 0, orig_rlen; | ||
879 | int memno = 0; | ||
880 | struct resource *res; | ||
881 | int np, na = prom_n_addr_cells(dev); | ||
882 | np = na + 5; | ||
883 | |||
884 | /* First we try to merge ranges to fix a problem with some pmacs | ||
885 | * that can have more than 3 ranges, fortunately using contiguous | ||
886 | * addresses -- BenH | ||
887 | */ | ||
888 | dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen); | ||
889 | if (!dt_ranges) | ||
890 | return; | ||
891 | /* Sanity check, though hopefully that never happens */ | ||
892 | if (rlen > sizeof(static_lc_ranges)) { | ||
893 | printk(KERN_WARNING "OF ranges property too large !\n"); | ||
894 | rlen = sizeof(static_lc_ranges); | ||
895 | } | ||
896 | lc_ranges = static_lc_ranges; | ||
897 | memcpy(lc_ranges, dt_ranges, rlen); | ||
898 | orig_rlen = rlen; | ||
899 | |||
900 | /* Let's work on a copy of the "ranges" property instead of damaging | ||
901 | * the device-tree image in memory | ||
902 | */ | ||
903 | ranges = lc_ranges; | ||
904 | prev = NULL; | ||
905 | while ((rlen -= np * sizeof(unsigned int)) >= 0) { | ||
906 | if (prev) { | ||
907 | if (prev[0] == ranges[0] && prev[1] == ranges[1] && | ||
908 | (prev[2] + prev[na+4]) == ranges[2] && | ||
909 | (prev[na+2] + prev[na+4]) == ranges[na+2]) { | ||
910 | prev[na+4] += ranges[na+4]; | ||
911 | ranges[0] = 0; | ||
912 | ranges += np; | ||
913 | continue; | ||
914 | } | ||
915 | } | ||
916 | prev = ranges; | ||
917 | ranges += np; | ||
918 | } | ||
919 | |||
920 | /* | ||
921 | * The ranges property is laid out as an array of elements, | ||
922 | * each of which comprises: | ||
923 | * cells 0 - 2: a PCI address | ||
924 | * cells 3 or 3+4: a CPU physical address | ||
925 | * (size depending on dev->n_addr_cells) | ||
926 | * cells 4+5 or 5+6: the size of the range | ||
927 | */ | ||
928 | ranges = lc_ranges; | ||
929 | rlen = orig_rlen; | ||
930 | while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) { | ||
931 | res = NULL; | ||
932 | size = ranges[na+4]; | ||
933 | switch ((ranges[0] >> 24) & 0x3) { | ||
934 | case 1: /* I/O space */ | ||
935 | if (ranges[2] != 0) | ||
936 | break; | ||
937 | hose->io_base_phys = ranges[na+2]; | ||
938 | /* limit I/O space to 16MB */ | ||
939 | if (size > 0x01000000) | ||
940 | size = 0x01000000; | ||
941 | hose->io_base_virt = ioremap(ranges[na+2], size); | ||
942 | if (primary) | ||
943 | isa_io_base = (unsigned long) hose->io_base_virt; | ||
944 | res = &hose->io_resource; | ||
945 | res->flags = IORESOURCE_IO; | ||
946 | res->start = ranges[2]; | ||
947 | DBG("PCI: IO 0x%lx -> 0x%lx\n", | ||
948 | res->start, res->start + size - 1); | ||
949 | break; | ||
950 | case 2: /* memory space */ | ||
951 | memno = 0; | ||
952 | if (ranges[1] == 0 && ranges[2] == 0 | ||
953 | && ranges[na+4] <= (16 << 20)) { | ||
954 | /* 1st 16MB, i.e. ISA memory area */ | ||
955 | if (primary) | ||
956 | isa_mem_base = ranges[na+2]; | ||
957 | memno = 1; | ||
958 | } | ||
959 | while (memno < 3 && hose->mem_resources[memno].flags) | ||
960 | ++memno; | ||
961 | if (memno == 0) | ||
962 | hose->pci_mem_offset = ranges[na+2] - ranges[2]; | ||
963 | if (memno < 3) { | ||
964 | res = &hose->mem_resources[memno]; | ||
965 | res->flags = IORESOURCE_MEM; | ||
966 | if(ranges[0] & 0x40000000) | ||
967 | res->flags |= IORESOURCE_PREFETCH; | ||
968 | res->start = ranges[na+2]; | ||
969 | DBG("PCI: MEM[%d] 0x%lx -> 0x%lx\n", memno, | ||
970 | res->start, res->start + size - 1); | ||
971 | } | ||
972 | break; | ||
973 | } | ||
974 | if (res != NULL) { | ||
975 | res->name = dev->full_name; | ||
976 | res->end = res->start + size - 1; | ||
977 | res->parent = NULL; | ||
978 | res->sibling = NULL; | ||
979 | res->child = NULL; | ||
980 | } | ||
981 | ranges += np; | ||
982 | } | ||
983 | } | ||
984 | |||
985 | /* We create the "pci-OF-bus-map" property now so it appears in the | ||
986 | * /proc device tree | ||
987 | */ | ||
988 | void __init | ||
989 | pci_create_OF_bus_map(void) | ||
990 | { | ||
991 | struct property* of_prop; | ||
992 | |||
993 | of_prop = (struct property*) alloc_bootmem(sizeof(struct property) + 256); | ||
994 | if (of_prop && find_path_device("/")) { | ||
995 | memset(of_prop, -1, sizeof(struct property) + 256); | ||
996 | of_prop->name = "pci-OF-bus-map"; | ||
997 | of_prop->length = 256; | ||
998 | of_prop->value = (unsigned char *)&of_prop[1]; | ||
999 | prom_add_property(find_path_device("/"), of_prop); | ||
1000 | } | ||
1001 | } | ||
1002 | |||
1003 | static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf) | ||
1004 | { | ||
1005 | struct pci_dev *pdev; | ||
1006 | struct device_node *np; | ||
1007 | |||
1008 | pdev = to_pci_dev (dev); | ||
1009 | np = pci_device_to_OF_node(pdev); | ||
1010 | if (np == NULL || np->full_name == NULL) | ||
1011 | return 0; | ||
1012 | return sprintf(buf, "%s", np->full_name); | ||
1013 | } | ||
1014 | static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); | ||
1015 | |||
1016 | #else /* CONFIG_PPC_OF */ | ||
1017 | void pcibios_make_OF_bus_map(void) | 625 | void pcibios_make_OF_bus_map(void) |
1018 | { | 626 | { |
1019 | } | 627 | } |
1020 | #endif /* CONFIG_PPC_OF */ | ||
1021 | 628 | ||
1022 | /* Add sysfs properties */ | 629 | /* Add sysfs properties */ |
1023 | void pcibios_add_platform_entries(struct pci_dev *pdev) | 630 | void pcibios_add_platform_entries(struct pci_dev *pdev) |
1024 | { | 631 | { |
1025 | #ifdef CONFIG_PPC_OF | ||
1026 | device_create_file(&pdev->dev, &dev_attr_devspec); | ||
1027 | #endif /* CONFIG_PPC_OF */ | ||
1028 | } | 632 | } |
1029 | 633 | ||
1030 | 634 | ||
diff --git a/arch/ppc/kernel/perfmon_fsl_booke.c b/arch/ppc/kernel/perfmon_fsl_booke.c deleted file mode 100644 index 32455dfcc36b..000000000000 --- a/arch/ppc/kernel/perfmon_fsl_booke.c +++ /dev/null | |||
@@ -1,222 +0,0 @@ | |||
1 | /* kernel/perfmon_fsl_booke.c | ||
2 | * Freescale Book-E Performance Monitor code | ||
3 | * | ||
4 | * Author: Andy Fleming | ||
5 | * Copyright (c) 2004 Freescale Semiconductor, Inc | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/errno.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/stddef.h> | ||
18 | #include <linux/unistd.h> | ||
19 | #include <linux/ptrace.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/user.h> | ||
22 | #include <linux/a.out.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/config.h> | ||
25 | #include <linux/init.h> | ||
26 | #include <linux/module.h> | ||
27 | #include <linux/prctl.h> | ||
28 | |||
29 | #include <asm/pgtable.h> | ||
30 | #include <asm/uaccess.h> | ||
31 | #include <asm/system.h> | ||
32 | #include <asm/io.h> | ||
33 | #include <asm/reg.h> | ||
34 | #include <asm/xmon.h> | ||
35 | #include <asm/pmc.h> | ||
36 | |||
37 | static inline u32 get_pmlca(int ctr); | ||
38 | static inline void set_pmlca(int ctr, u32 pmlca); | ||
39 | |||
40 | static inline u32 get_pmlca(int ctr) | ||
41 | { | ||
42 | u32 pmlca; | ||
43 | |||
44 | switch (ctr) { | ||
45 | case 0: | ||
46 | pmlca = mfpmr(PMRN_PMLCA0); | ||
47 | break; | ||
48 | case 1: | ||
49 | pmlca = mfpmr(PMRN_PMLCA1); | ||
50 | break; | ||
51 | case 2: | ||
52 | pmlca = mfpmr(PMRN_PMLCA2); | ||
53 | break; | ||
54 | case 3: | ||
55 | pmlca = mfpmr(PMRN_PMLCA3); | ||
56 | break; | ||
57 | default: | ||
58 | panic("Bad ctr number\n"); | ||
59 | } | ||
60 | |||
61 | return pmlca; | ||
62 | } | ||
63 | |||
64 | static inline void set_pmlca(int ctr, u32 pmlca) | ||
65 | { | ||
66 | switch (ctr) { | ||
67 | case 0: | ||
68 | mtpmr(PMRN_PMLCA0, pmlca); | ||
69 | break; | ||
70 | case 1: | ||
71 | mtpmr(PMRN_PMLCA1, pmlca); | ||
72 | break; | ||
73 | case 2: | ||
74 | mtpmr(PMRN_PMLCA2, pmlca); | ||
75 | break; | ||
76 | case 3: | ||
77 | mtpmr(PMRN_PMLCA3, pmlca); | ||
78 | break; | ||
79 | default: | ||
80 | panic("Bad ctr number\n"); | ||
81 | } | ||
82 | } | ||
83 | |||
84 | void init_pmc_stop(int ctr) | ||
85 | { | ||
86 | u32 pmlca = (PMLCA_FC | PMLCA_FCS | PMLCA_FCU | | ||
87 | PMLCA_FCM1 | PMLCA_FCM0); | ||
88 | u32 pmlcb = 0; | ||
89 | |||
90 | switch (ctr) { | ||
91 | case 0: | ||
92 | mtpmr(PMRN_PMLCA0, pmlca); | ||
93 | mtpmr(PMRN_PMLCB0, pmlcb); | ||
94 | break; | ||
95 | case 1: | ||
96 | mtpmr(PMRN_PMLCA1, pmlca); | ||
97 | mtpmr(PMRN_PMLCB1, pmlcb); | ||
98 | break; | ||
99 | case 2: | ||
100 | mtpmr(PMRN_PMLCA2, pmlca); | ||
101 | mtpmr(PMRN_PMLCB2, pmlcb); | ||
102 | break; | ||
103 | case 3: | ||
104 | mtpmr(PMRN_PMLCA3, pmlca); | ||
105 | mtpmr(PMRN_PMLCB3, pmlcb); | ||
106 | break; | ||
107 | default: | ||
108 | panic("Bad ctr number!\n"); | ||
109 | } | ||
110 | } | ||
111 | |||
112 | void set_pmc_event(int ctr, int event) | ||
113 | { | ||
114 | u32 pmlca; | ||
115 | |||
116 | pmlca = get_pmlca(ctr); | ||
117 | |||
118 | pmlca = (pmlca & ~PMLCA_EVENT_MASK) | | ||
119 | ((event << PMLCA_EVENT_SHIFT) & | ||
120 | PMLCA_EVENT_MASK); | ||
121 | |||
122 | set_pmlca(ctr, pmlca); | ||
123 | } | ||
124 | |||
125 | void set_pmc_user_kernel(int ctr, int user, int kernel) | ||
126 | { | ||
127 | u32 pmlca; | ||
128 | |||
129 | pmlca = get_pmlca(ctr); | ||
130 | |||
131 | if(user) | ||
132 | pmlca &= ~PMLCA_FCU; | ||
133 | else | ||
134 | pmlca |= PMLCA_FCU; | ||
135 | |||
136 | if(kernel) | ||
137 | pmlca &= ~PMLCA_FCS; | ||
138 | else | ||
139 | pmlca |= PMLCA_FCS; | ||
140 | |||
141 | set_pmlca(ctr, pmlca); | ||
142 | } | ||
143 | |||
144 | void set_pmc_marked(int ctr, int mark0, int mark1) | ||
145 | { | ||
146 | u32 pmlca = get_pmlca(ctr); | ||
147 | |||
148 | if(mark0) | ||
149 | pmlca &= ~PMLCA_FCM0; | ||
150 | else | ||
151 | pmlca |= PMLCA_FCM0; | ||
152 | |||
153 | if(mark1) | ||
154 | pmlca &= ~PMLCA_FCM1; | ||
155 | else | ||
156 | pmlca |= PMLCA_FCM1; | ||
157 | |||
158 | set_pmlca(ctr, pmlca); | ||
159 | } | ||
160 | |||
161 | void pmc_start_ctr(int ctr, int enable) | ||
162 | { | ||
163 | u32 pmlca = get_pmlca(ctr); | ||
164 | |||
165 | pmlca &= ~PMLCA_FC; | ||
166 | |||
167 | if (enable) | ||
168 | pmlca |= PMLCA_CE; | ||
169 | else | ||
170 | pmlca &= ~PMLCA_CE; | ||
171 | |||
172 | set_pmlca(ctr, pmlca); | ||
173 | } | ||
174 | |||
175 | void pmc_start_ctrs(int enable) | ||
176 | { | ||
177 | u32 pmgc0 = mfpmr(PMRN_PMGC0); | ||
178 | |||
179 | pmgc0 &= ~PMGC0_FAC; | ||
180 | pmgc0 |= PMGC0_FCECE; | ||
181 | |||
182 | if (enable) | ||
183 | pmgc0 |= PMGC0_PMIE; | ||
184 | else | ||
185 | pmgc0 &= ~PMGC0_PMIE; | ||
186 | |||
187 | mtpmr(PMRN_PMGC0, pmgc0); | ||
188 | } | ||
189 | |||
190 | void pmc_stop_ctrs(void) | ||
191 | { | ||
192 | u32 pmgc0 = mfpmr(PMRN_PMGC0); | ||
193 | |||
194 | pmgc0 |= PMGC0_FAC; | ||
195 | |||
196 | pmgc0 &= ~(PMGC0_PMIE | PMGC0_FCECE); | ||
197 | |||
198 | mtpmr(PMRN_PMGC0, pmgc0); | ||
199 | } | ||
200 | |||
201 | void dump_pmcs(void) | ||
202 | { | ||
203 | printk("pmgc0: %x\n", mfpmr(PMRN_PMGC0)); | ||
204 | printk("pmc\t\tpmlca\t\tpmlcb\n"); | ||
205 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC0), | ||
206 | mfpmr(PMRN_PMLCA0), mfpmr(PMRN_PMLCB0)); | ||
207 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC1), | ||
208 | mfpmr(PMRN_PMLCA1), mfpmr(PMRN_PMLCB1)); | ||
209 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC2), | ||
210 | mfpmr(PMRN_PMLCA2), mfpmr(PMRN_PMLCB2)); | ||
211 | printk("%8x\t%8x\t%8x\n", mfpmr(PMRN_PMC3), | ||
212 | mfpmr(PMRN_PMLCA3), mfpmr(PMRN_PMLCB3)); | ||
213 | } | ||
214 | |||
215 | EXPORT_SYMBOL(init_pmc_stop); | ||
216 | EXPORT_SYMBOL(set_pmc_event); | ||
217 | EXPORT_SYMBOL(set_pmc_user_kernel); | ||
218 | EXPORT_SYMBOL(set_pmc_marked); | ||
219 | EXPORT_SYMBOL(pmc_start_ctr); | ||
220 | EXPORT_SYMBOL(pmc_start_ctrs); | ||
221 | EXPORT_SYMBOL(pmc_stop_ctrs); | ||
222 | EXPORT_SYMBOL(dump_pmcs); | ||
diff --git a/arch/ppc/kernel/ppc_htab.c b/arch/ppc/kernel/ppc_htab.c index 9b84bffdefce..75c645043746 100644 --- a/arch/ppc/kernel/ppc_htab.c +++ b/arch/ppc/kernel/ppc_htab.c | |||
@@ -104,7 +104,7 @@ static char *pmc2_lookup(unsigned long mmcr0) | |||
104 | static int ppc_htab_show(struct seq_file *m, void *v) | 104 | static int ppc_htab_show(struct seq_file *m, void *v) |
105 | { | 105 | { |
106 | unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0; | 106 | unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0; |
107 | #if defined(CONFIG_PPC_STD_MMU) && !defined(CONFIG_PPC64BRIDGE) | 107 | #if defined(CONFIG_PPC_STD_MMU) |
108 | unsigned int kptes = 0, uptes = 0; | 108 | unsigned int kptes = 0, uptes = 0; |
109 | PTE *ptr; | 109 | PTE *ptr; |
110 | #endif /* CONFIG_PPC_STD_MMU */ | 110 | #endif /* CONFIG_PPC_STD_MMU */ |
@@ -133,7 +133,6 @@ static int ppc_htab_show(struct seq_file *m, void *v) | |||
133 | return 0; | 133 | return 0; |
134 | } | 134 | } |
135 | 135 | ||
136 | #ifndef CONFIG_PPC64BRIDGE | ||
137 | for (ptr = Hash; ptr < Hash_end; ptr++) { | 136 | for (ptr = Hash; ptr < Hash_end; ptr++) { |
138 | unsigned int mctx, vsid; | 137 | unsigned int mctx, vsid; |
139 | 138 | ||
@@ -147,7 +146,6 @@ static int ppc_htab_show(struct seq_file *m, void *v) | |||
147 | else | 146 | else |
148 | uptes++; | 147 | uptes++; |
149 | } | 148 | } |
150 | #endif | ||
151 | 149 | ||
152 | seq_printf(m, | 150 | seq_printf(m, |
153 | "PTE Hash Table Information\n" | 151 | "PTE Hash Table Information\n" |
@@ -155,20 +153,16 @@ static int ppc_htab_show(struct seq_file *m, void *v) | |||
155 | "Buckets\t\t: %lu\n" | 153 | "Buckets\t\t: %lu\n" |
156 | "Address\t\t: %08lx\n" | 154 | "Address\t\t: %08lx\n" |
157 | "Entries\t\t: %lu\n" | 155 | "Entries\t\t: %lu\n" |
158 | #ifndef CONFIG_PPC64BRIDGE | ||
159 | "User ptes\t: %u\n" | 156 | "User ptes\t: %u\n" |
160 | "Kernel ptes\t: %u\n" | 157 | "Kernel ptes\t: %u\n" |
161 | "Percent full\t: %lu%%\n" | 158 | "Percent full\t: %lu%%\n" |
162 | #endif | ||
163 | , (unsigned long)(Hash_size>>10), | 159 | , (unsigned long)(Hash_size>>10), |
164 | (Hash_size/(sizeof(PTE)*8)), | 160 | (Hash_size/(sizeof(PTE)*8)), |
165 | (unsigned long)Hash, | 161 | (unsigned long)Hash, |
166 | Hash_size/sizeof(PTE) | 162 | Hash_size/sizeof(PTE) |
167 | #ifndef CONFIG_PPC64BRIDGE | ||
168 | , uptes, | 163 | , uptes, |
169 | kptes, | 164 | kptes, |
170 | ((kptes+uptes)*100) / (Hash_size/sizeof(PTE)) | 165 | ((kptes+uptes)*100) / (Hash_size/sizeof(PTE)) |
171 | #endif | ||
172 | ); | 166 | ); |
173 | 167 | ||
174 | seq_printf(m, | 168 | seq_printf(m, |
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c index 82adb4601348..865ba74991a9 100644 --- a/arch/ppc/kernel/ppc_ksyms.c +++ b/arch/ppc/kernel/ppc_ksyms.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/bitops.h> | 18 | #include <linux/bitops.h> |
19 | 19 | ||
20 | #include <asm/page.h> | 20 | #include <asm/page.h> |
21 | #include <asm/semaphore.h> | ||
22 | #include <asm/processor.h> | 21 | #include <asm/processor.h> |
23 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
24 | #include <asm/io.h> | 23 | #include <asm/io.h> |
@@ -30,7 +29,6 @@ | |||
30 | #include <linux/adb.h> | 29 | #include <linux/adb.h> |
31 | #include <linux/cuda.h> | 30 | #include <linux/cuda.h> |
32 | #include <linux/pmu.h> | 31 | #include <linux/pmu.h> |
33 | #include <asm/prom.h> | ||
34 | #include <asm/system.h> | 32 | #include <asm/system.h> |
35 | #include <asm/pci-bridge.h> | 33 | #include <asm/pci-bridge.h> |
36 | #include <asm/irq.h> | 34 | #include <asm/irq.h> |
@@ -208,27 +206,6 @@ EXPORT_SYMBOL(adb_try_handler_change); | |||
208 | EXPORT_SYMBOL(cuda_request); | 206 | EXPORT_SYMBOL(cuda_request); |
209 | EXPORT_SYMBOL(cuda_poll); | 207 | EXPORT_SYMBOL(cuda_poll); |
210 | #endif /* CONFIG_ADB_CUDA */ | 208 | #endif /* CONFIG_ADB_CUDA */ |
211 | #ifdef CONFIG_PPC_OF | ||
212 | EXPORT_SYMBOL(find_devices); | ||
213 | EXPORT_SYMBOL(find_type_devices); | ||
214 | EXPORT_SYMBOL(find_compatible_devices); | ||
215 | EXPORT_SYMBOL(find_path_device); | ||
216 | EXPORT_SYMBOL(device_is_compatible); | ||
217 | EXPORT_SYMBOL(machine_is_compatible); | ||
218 | EXPORT_SYMBOL(find_all_nodes); | ||
219 | EXPORT_SYMBOL(get_property); | ||
220 | EXPORT_SYMBOL(request_OF_resource); | ||
221 | EXPORT_SYMBOL(release_OF_resource); | ||
222 | EXPORT_SYMBOL(of_find_node_by_name); | ||
223 | EXPORT_SYMBOL(of_find_node_by_type); | ||
224 | EXPORT_SYMBOL(of_find_compatible_node); | ||
225 | EXPORT_SYMBOL(of_find_node_by_path); | ||
226 | EXPORT_SYMBOL(of_find_all_nodes); | ||
227 | EXPORT_SYMBOL(of_get_parent); | ||
228 | EXPORT_SYMBOL(of_get_next_child); | ||
229 | EXPORT_SYMBOL(of_node_get); | ||
230 | EXPORT_SYMBOL(of_node_put); | ||
231 | #endif /* CONFIG_PPC_OF */ | ||
232 | #if defined(CONFIG_BOOTX_TEXT) | 209 | #if defined(CONFIG_BOOTX_TEXT) |
233 | EXPORT_SYMBOL(btext_update_display); | 210 | EXPORT_SYMBOL(btext_update_display); |
234 | #endif | 211 | #endif |
@@ -262,9 +239,6 @@ EXPORT_SYMBOL(console_drivers); | |||
262 | EXPORT_SYMBOL(xmon); | 239 | EXPORT_SYMBOL(xmon); |
263 | EXPORT_SYMBOL(xmon_printf); | 240 | EXPORT_SYMBOL(xmon_printf); |
264 | #endif | 241 | #endif |
265 | EXPORT_SYMBOL(__up); | ||
266 | EXPORT_SYMBOL(__down); | ||
267 | EXPORT_SYMBOL(__down_interruptible); | ||
268 | 242 | ||
269 | #if defined(CONFIG_KGDB) || defined(CONFIG_XMON) | 243 | #if defined(CONFIG_KGDB) || defined(CONFIG_XMON) |
270 | extern void (*debugger)(struct pt_regs *regs); | 244 | extern void (*debugger)(struct pt_regs *regs); |
diff --git a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c index 53e9deacee82..1f79e84ab464 100644 --- a/arch/ppc/kernel/setup.c +++ b/arch/ppc/kernel/setup.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Common prep/chrp boot and setup code. | 2 | * Common prep boot and setup code. |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/config.h> | 5 | #include <linux/config.h> |
@@ -72,17 +72,12 @@ unsigned long ISA_DMA_THRESHOLD; | |||
72 | unsigned int DMA_MODE_READ; | 72 | unsigned int DMA_MODE_READ; |
73 | unsigned int DMA_MODE_WRITE; | 73 | unsigned int DMA_MODE_WRITE; |
74 | 74 | ||
75 | #ifdef CONFIG_PPC_MULTIPLATFORM | 75 | #ifdef CONFIG_PPC_PREP |
76 | int _machine = 0; | ||
77 | EXPORT_SYMBOL(_machine); | ||
78 | |||
79 | extern void prep_init(unsigned long r3, unsigned long r4, | 76 | extern void prep_init(unsigned long r3, unsigned long r4, |
80 | unsigned long r5, unsigned long r6, unsigned long r7); | 77 | unsigned long r5, unsigned long r6, unsigned long r7); |
81 | extern void chrp_init(unsigned long r3, unsigned long r4, | ||
82 | unsigned long r5, unsigned long r6, unsigned long r7); | ||
83 | 78 | ||
84 | dev_t boot_dev; | 79 | dev_t boot_dev; |
85 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 80 | #endif /* CONFIG_PPC_PREP */ |
86 | 81 | ||
87 | int have_of; | 82 | int have_of; |
88 | EXPORT_SYMBOL(have_of); | 83 | EXPORT_SYMBOL(have_of); |
@@ -319,72 +314,12 @@ early_init(int r3, int r4, int r5) | |||
319 | identify_cpu(offset, 0); | 314 | identify_cpu(offset, 0); |
320 | do_cpu_ftr_fixups(offset); | 315 | do_cpu_ftr_fixups(offset); |
321 | 316 | ||
322 | #if defined(CONFIG_PPC_OF) | ||
323 | reloc_got2(offset); | ||
324 | |||
325 | /* | ||
326 | * don't do anything on prep | ||
327 | * for now, don't use bootinfo because it breaks yaboot 0.5 | ||
328 | * and assume that if we didn't find a magic number, we have OF | ||
329 | */ | ||
330 | if (*(unsigned long *)(0) != 0xdeadc0de) | ||
331 | phys = prom_init(r3, r4, (prom_entry)r5); | ||
332 | |||
333 | reloc_got2(-offset); | ||
334 | #endif | ||
335 | |||
336 | return phys; | 317 | return phys; |
337 | } | 318 | } |
338 | 319 | ||
339 | #ifdef CONFIG_PPC_OF | 320 | #ifdef CONFIG_PPC_PREP |
340 | /* | ||
341 | * Assume here that all clock rates are the same in a | ||
342 | * smp system. -- Cort | ||
343 | */ | ||
344 | int | ||
345 | of_show_percpuinfo(struct seq_file *m, int i) | ||
346 | { | ||
347 | struct device_node *cpu_node; | ||
348 | u32 *fp; | ||
349 | int s; | ||
350 | |||
351 | cpu_node = find_type_devices("cpu"); | ||
352 | if (!cpu_node) | ||
353 | return 0; | ||
354 | for (s = 0; s < i && cpu_node->next; s++) | ||
355 | cpu_node = cpu_node->next; | ||
356 | fp = (u32 *)get_property(cpu_node, "clock-frequency", NULL); | ||
357 | if (fp) | ||
358 | seq_printf(m, "clock\t\t: %dMHz\n", *fp / 1000000); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | void __init | ||
363 | intuit_machine_type(void) | ||
364 | { | ||
365 | char *model; | ||
366 | struct device_node *root; | ||
367 | |||
368 | /* ask the OF info if we're a chrp or pmac */ | ||
369 | root = find_path_device("/"); | ||
370 | if (root != 0) { | ||
371 | /* assume pmac unless proven to be chrp -- Cort */ | ||
372 | _machine = _MACH_Pmac; | ||
373 | model = get_property(root, "device_type", NULL); | ||
374 | if (model && !strncmp("chrp", model, 4)) | ||
375 | _machine = _MACH_chrp; | ||
376 | else { | ||
377 | model = get_property(root, "model", NULL); | ||
378 | if (model && !strncmp(model, "IBM", 3)) | ||
379 | _machine = _MACH_chrp; | ||
380 | } | ||
381 | } | ||
382 | } | ||
383 | #endif | ||
384 | |||
385 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
386 | /* | 321 | /* |
387 | * The PPC_MULTIPLATFORM version of platform_init... | 322 | * The PPC_PREP version of platform_init... |
388 | */ | 323 | */ |
389 | void __init | 324 | void __init |
390 | platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | 325 | platform_init(unsigned long r3, unsigned long r4, unsigned long r5, |
@@ -399,161 +334,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5, | |||
399 | 334 | ||
400 | parse_bootinfo(find_bootinfo()); | 335 | parse_bootinfo(find_bootinfo()); |
401 | 336 | ||
402 | /* if we didn't get any bootinfo telling us what we are... */ | 337 | prep_init(r3, r4, r5, r6, r7); |
403 | if (_machine == 0) { | ||
404 | /* prep boot loader tells us if we're prep or not */ | ||
405 | if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) ) | ||
406 | _machine = _MACH_prep; | ||
407 | } | ||
408 | |||
409 | #ifdef CONFIG_PPC_PREP | ||
410 | /* not much more to do here, if prep */ | ||
411 | if (_machine == _MACH_prep) { | ||
412 | prep_init(r3, r4, r5, r6, r7); | ||
413 | return; | ||
414 | } | ||
415 | #endif | ||
416 | |||
417 | #ifdef CONFIG_PPC_OF | ||
418 | have_of = 1; | ||
419 | |||
420 | /* prom_init has already been called from __start */ | ||
421 | if (boot_infos) | ||
422 | relocate_nodes(); | ||
423 | |||
424 | /* If we aren't PReP, we can find out if we're Pmac | ||
425 | * or CHRP with this. */ | ||
426 | if (_machine == 0) | ||
427 | intuit_machine_type(); | ||
428 | |||
429 | /* finish_device_tree may need _machine defined. */ | ||
430 | finish_device_tree(); | ||
431 | |||
432 | /* | ||
433 | * If we were booted via quik, r3 points to the physical | ||
434 | * address of the command-line parameters. | ||
435 | * If we were booted from an xcoff image (i.e. netbooted or | ||
436 | * booted from floppy), we get the command line from the | ||
437 | * bootargs property of the /chosen node. | ||
438 | * If an initial ramdisk is present, r3 and r4 | ||
439 | * are used for initrd_start and initrd_size, | ||
440 | * otherwise they contain 0xdeadbeef. | ||
441 | */ | ||
442 | if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) { | ||
443 | strlcpy(cmd_line, (char *)r3 + KERNELBASE, | ||
444 | sizeof(cmd_line)); | ||
445 | } else if (boot_infos != 0) { | ||
446 | /* booted by BootX - check for ramdisk */ | ||
447 | if (boot_infos->kernelParamsOffset != 0) | ||
448 | strlcpy(cmd_line, (char *) boot_infos | ||
449 | + boot_infos->kernelParamsOffset, | ||
450 | sizeof(cmd_line)); | ||
451 | #ifdef CONFIG_BLK_DEV_INITRD | ||
452 | if (boot_infos->ramDisk) { | ||
453 | initrd_start = (unsigned long) boot_infos | ||
454 | + boot_infos->ramDisk; | ||
455 | initrd_end = initrd_start + boot_infos->ramDiskSize; | ||
456 | initrd_below_start_ok = 1; | ||
457 | } | ||
458 | #endif | ||
459 | } else { | ||
460 | struct device_node *chosen; | ||
461 | char *p; | ||
462 | |||
463 | #ifdef CONFIG_BLK_DEV_INITRD | ||
464 | if (r3 && r4 && r4 != 0xdeadbeef) { | ||
465 | if (r3 < KERNELBASE) | ||
466 | r3 += KERNELBASE; | ||
467 | initrd_start = r3; | ||
468 | initrd_end = r3 + r4; | ||
469 | ROOT_DEV = Root_RAM0; | ||
470 | initrd_below_start_ok = 1; | ||
471 | } | ||
472 | #endif | ||
473 | chosen = find_devices("chosen"); | ||
474 | if (chosen != NULL) { | ||
475 | p = get_property(chosen, "bootargs", NULL); | ||
476 | if (p && *p) { | ||
477 | strlcpy(cmd_line, p, sizeof(cmd_line)); | ||
478 | } | ||
479 | } | ||
480 | } | ||
481 | #ifdef CONFIG_ADB | ||
482 | if (strstr(cmd_line, "adb_sync")) { | ||
483 | extern int __adb_probe_sync; | ||
484 | __adb_probe_sync = 1; | ||
485 | } | ||
486 | #endif /* CONFIG_ADB */ | ||
487 | |||
488 | switch (_machine) { | ||
489 | #ifdef CONFIG_PPC_CHRP | ||
490 | case _MACH_chrp: | ||
491 | chrp_init(r3, r4, r5, r6, r7); | ||
492 | break; | ||
493 | #endif | ||
494 | } | ||
495 | #endif /* CONFIG_PPC_OF */ | ||
496 | } | 338 | } |
497 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 339 | #endif /* CONFIG_PPC_PREP */ |
498 | |||
499 | #ifdef CONFIG_PPC_OF | ||
500 | #ifdef CONFIG_SERIAL_CORE_CONSOLE | ||
501 | extern char *of_stdout_device; | ||
502 | |||
503 | static int __init set_preferred_console(void) | ||
504 | { | ||
505 | struct device_node *prom_stdout; | ||
506 | char *name; | ||
507 | int offset = 0; | ||
508 | |||
509 | if (of_stdout_device == NULL) | ||
510 | return -ENODEV; | ||
511 | |||
512 | /* The user has requested a console so this is already set up. */ | ||
513 | if (strstr(saved_command_line, "console=")) | ||
514 | return -EBUSY; | ||
515 | |||
516 | prom_stdout = find_path_device(of_stdout_device); | ||
517 | if (!prom_stdout) | ||
518 | return -ENODEV; | ||
519 | |||
520 | name = (char *)get_property(prom_stdout, "name", NULL); | ||
521 | if (!name) | ||
522 | return -ENODEV; | ||
523 | |||
524 | if (strcmp(name, "serial") == 0) { | ||
525 | int i; | ||
526 | u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i); | ||
527 | if (i > 8) { | ||
528 | switch (reg[1]) { | ||
529 | case 0x3f8: | ||
530 | offset = 0; | ||
531 | break; | ||
532 | case 0x2f8: | ||
533 | offset = 1; | ||
534 | break; | ||
535 | case 0x898: | ||
536 | offset = 2; | ||
537 | break; | ||
538 | case 0x890: | ||
539 | offset = 3; | ||
540 | break; | ||
541 | default: | ||
542 | /* We dont recognise the serial port */ | ||
543 | return -ENODEV; | ||
544 | } | ||
545 | } | ||
546 | } else if (strcmp(name, "ch-a") == 0) | ||
547 | offset = 0; | ||
548 | else if (strcmp(name, "ch-b") == 0) | ||
549 | offset = 1; | ||
550 | else | ||
551 | return -ENODEV; | ||
552 | return add_preferred_console("ttyS", offset, NULL); | ||
553 | } | ||
554 | console_initcall(set_preferred_console); | ||
555 | #endif /* CONFIG_SERIAL_CORE_CONSOLE */ | ||
556 | #endif /* CONFIG_PPC_OF */ | ||
557 | 340 | ||
558 | struct bi_record *find_bootinfo(void) | 341 | struct bi_record *find_bootinfo(void) |
559 | { | 342 | { |
@@ -589,23 +372,6 @@ void parse_bootinfo(struct bi_record *rec) | |||
589 | initrd_end = data[0] + data[1] + KERNELBASE; | 372 | initrd_end = data[0] + data[1] + KERNELBASE; |
590 | break; | 373 | break; |
591 | #endif /* CONFIG_BLK_DEV_INITRD */ | 374 | #endif /* CONFIG_BLK_DEV_INITRD */ |
592 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
593 | case BI_MACHTYPE: | ||
594 | /* Machine types changed with the merge. Since the | ||
595 | * bootinfo are now deprecated, we can just hard code | ||
596 | * the appropriate conversion here for when we are | ||
597 | * called with yaboot which passes us a machine type | ||
598 | * this way. | ||
599 | */ | ||
600 | switch(data[0]) { | ||
601 | case 1: _machine = _MACH_prep; break; | ||
602 | case 2: _machine = _MACH_Pmac; break; | ||
603 | case 4: _machine = _MACH_chrp; break; | ||
604 | default: | ||
605 | _machine = data[0]; | ||
606 | } | ||
607 | break; | ||
608 | #endif | ||
609 | case BI_MEMSIZE: | 375 | case BI_MEMSIZE: |
610 | boot_mem_size = data[0]; | 376 | boot_mem_size = data[0]; |
611 | break; | 377 | break; |
@@ -631,9 +397,6 @@ machine_init(unsigned long r3, unsigned long r4, unsigned long r5, | |||
631 | #ifdef CONFIG_6xx | 397 | #ifdef CONFIG_6xx |
632 | ppc_md.power_save = ppc6xx_idle; | 398 | ppc_md.power_save = ppc6xx_idle; |
633 | #endif | 399 | #endif |
634 | #ifdef CONFIG_POWER4 | ||
635 | ppc_md.power_save = power4_idle; | ||
636 | #endif | ||
637 | 400 | ||
638 | platform_init(r3, r4, r5, r6, r7); | 401 | platform_init(r3, r4, r5, r6, r7); |
639 | 402 | ||
@@ -711,7 +474,7 @@ int __init ppc_init(void) | |||
711 | if ( ppc_md.progress ) ppc_md.progress(" ", 0xffff); | 474 | if ( ppc_md.progress ) ppc_md.progress(" ", 0xffff); |
712 | 475 | ||
713 | /* register CPU devices */ | 476 | /* register CPU devices */ |
714 | for_each_cpu(i) | 477 | for_each_possible_cpu(i) |
715 | register_cpu(&cpu_devices[i], i, NULL); | 478 | register_cpu(&cpu_devices[i], i, NULL); |
716 | 479 | ||
717 | /* call platform init */ | 480 | /* call platform init */ |
@@ -799,7 +562,4 @@ void __init setup_arch(char **cmdline_p) | |||
799 | if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab); | 562 | if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab); |
800 | 563 | ||
801 | paging_init(); | 564 | paging_init(); |
802 | |||
803 | /* this is for modules since _machine can be a define -- Cort */ | ||
804 | ppc_md.ppc_machine = _machine; | ||
805 | } | 565 | } |
diff --git a/arch/ppc/kernel/smp.c b/arch/ppc/kernel/smp.c index e55cdda6149a..f77795a64dae 100644 --- a/arch/ppc/kernel/smp.c +++ b/arch/ppc/kernel/smp.c | |||
@@ -311,7 +311,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
311 | /* Backup CPU 0 state */ | 311 | /* Backup CPU 0 state */ |
312 | __save_cpu_setup(); | 312 | __save_cpu_setup(); |
313 | 313 | ||
314 | for_each_cpu(cpu) { | 314 | for_each_possible_cpu(cpu) { |
315 | if (cpu == smp_processor_id()) | 315 | if (cpu == smp_processor_id()) |
316 | continue; | 316 | continue; |
317 | /* create a process for the processor */ | 317 | /* create a process for the processor */ |
diff --git a/arch/ppc/kernel/swsusp.S b/arch/ppc/kernel/swsusp.S deleted file mode 100644 index 69773cc1a85f..000000000000 --- a/arch/ppc/kernel/swsusp.S +++ /dev/null | |||
@@ -1,349 +0,0 @@ | |||
1 | #include <linux/config.h> | ||
2 | #include <linux/threads.h> | ||
3 | #include <asm/processor.h> | ||
4 | #include <asm/page.h> | ||
5 | #include <asm/cputable.h> | ||
6 | #include <asm/thread_info.h> | ||
7 | #include <asm/ppc_asm.h> | ||
8 | #include <asm/asm-offsets.h> | ||
9 | |||
10 | |||
11 | /* | ||
12 | * Structure for storing CPU registers on the save area. | ||
13 | */ | ||
14 | #define SL_SP 0 | ||
15 | #define SL_PC 4 | ||
16 | #define SL_MSR 8 | ||
17 | #define SL_SDR1 0xc | ||
18 | #define SL_SPRG0 0x10 /* 4 sprg's */ | ||
19 | #define SL_DBAT0 0x20 | ||
20 | #define SL_IBAT0 0x28 | ||
21 | #define SL_DBAT1 0x30 | ||
22 | #define SL_IBAT1 0x38 | ||
23 | #define SL_DBAT2 0x40 | ||
24 | #define SL_IBAT2 0x48 | ||
25 | #define SL_DBAT3 0x50 | ||
26 | #define SL_IBAT3 0x58 | ||
27 | #define SL_TB 0x60 | ||
28 | #define SL_R2 0x68 | ||
29 | #define SL_CR 0x6c | ||
30 | #define SL_LR 0x70 | ||
31 | #define SL_R12 0x74 /* r12 to r31 */ | ||
32 | #define SL_SIZE (SL_R12 + 80) | ||
33 | |||
34 | .section .data | ||
35 | .align 5 | ||
36 | |||
37 | _GLOBAL(swsusp_save_area) | ||
38 | .space SL_SIZE | ||
39 | |||
40 | |||
41 | .section .text | ||
42 | .align 5 | ||
43 | |||
44 | _GLOBAL(swsusp_arch_suspend) | ||
45 | |||
46 | lis r11,swsusp_save_area@h | ||
47 | ori r11,r11,swsusp_save_area@l | ||
48 | |||
49 | mflr r0 | ||
50 | stw r0,SL_LR(r11) | ||
51 | mfcr r0 | ||
52 | stw r0,SL_CR(r11) | ||
53 | stw r1,SL_SP(r11) | ||
54 | stw r2,SL_R2(r11) | ||
55 | stmw r12,SL_R12(r11) | ||
56 | |||
57 | /* Save MSR & SDR1 */ | ||
58 | mfmsr r4 | ||
59 | stw r4,SL_MSR(r11) | ||
60 | mfsdr1 r4 | ||
61 | stw r4,SL_SDR1(r11) | ||
62 | |||
63 | /* Get a stable timebase and save it */ | ||
64 | 1: mftbu r4 | ||
65 | stw r4,SL_TB(r11) | ||
66 | mftb r5 | ||
67 | stw r5,SL_TB+4(r11) | ||
68 | mftbu r3 | ||
69 | cmpw r3,r4 | ||
70 | bne 1b | ||
71 | |||
72 | /* Save SPRGs */ | ||
73 | mfsprg r4,0 | ||
74 | stw r4,SL_SPRG0(r11) | ||
75 | mfsprg r4,1 | ||
76 | stw r4,SL_SPRG0+4(r11) | ||
77 | mfsprg r4,2 | ||
78 | stw r4,SL_SPRG0+8(r11) | ||
79 | mfsprg r4,3 | ||
80 | stw r4,SL_SPRG0+12(r11) | ||
81 | |||
82 | /* Save BATs */ | ||
83 | mfdbatu r4,0 | ||
84 | stw r4,SL_DBAT0(r11) | ||
85 | mfdbatl r4,0 | ||
86 | stw r4,SL_DBAT0+4(r11) | ||
87 | mfdbatu r4,1 | ||
88 | stw r4,SL_DBAT1(r11) | ||
89 | mfdbatl r4,1 | ||
90 | stw r4,SL_DBAT1+4(r11) | ||
91 | mfdbatu r4,2 | ||
92 | stw r4,SL_DBAT2(r11) | ||
93 | mfdbatl r4,2 | ||
94 | stw r4,SL_DBAT2+4(r11) | ||
95 | mfdbatu r4,3 | ||
96 | stw r4,SL_DBAT3(r11) | ||
97 | mfdbatl r4,3 | ||
98 | stw r4,SL_DBAT3+4(r11) | ||
99 | mfibatu r4,0 | ||
100 | stw r4,SL_IBAT0(r11) | ||
101 | mfibatl r4,0 | ||
102 | stw r4,SL_IBAT0+4(r11) | ||
103 | mfibatu r4,1 | ||
104 | stw r4,SL_IBAT1(r11) | ||
105 | mfibatl r4,1 | ||
106 | stw r4,SL_IBAT1+4(r11) | ||
107 | mfibatu r4,2 | ||
108 | stw r4,SL_IBAT2(r11) | ||
109 | mfibatl r4,2 | ||
110 | stw r4,SL_IBAT2+4(r11) | ||
111 | mfibatu r4,3 | ||
112 | stw r4,SL_IBAT3(r11) | ||
113 | mfibatl r4,3 | ||
114 | stw r4,SL_IBAT3+4(r11) | ||
115 | |||
116 | #if 0 | ||
117 | /* Backup various CPU config stuffs */ | ||
118 | bl __save_cpu_setup | ||
119 | #endif | ||
120 | /* Call the low level suspend stuff (we should probably have made | ||
121 | * a stackframe... | ||
122 | */ | ||
123 | bl swsusp_save | ||
124 | |||
125 | /* Restore LR from the save area */ | ||
126 | lis r11,swsusp_save_area@h | ||
127 | ori r11,r11,swsusp_save_area@l | ||
128 | lwz r0,SL_LR(r11) | ||
129 | mtlr r0 | ||
130 | |||
131 | blr | ||
132 | |||
133 | |||
134 | /* Resume code */ | ||
135 | _GLOBAL(swsusp_arch_resume) | ||
136 | |||
137 | /* Stop pending alitvec streams and memory accesses */ | ||
138 | BEGIN_FTR_SECTION | ||
139 | DSSALL | ||
140 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
141 | sync | ||
142 | |||
143 | /* Disable MSR:DR to make sure we don't take a TLB or | ||
144 | * hash miss during the copy, as our hash table will | ||
145 | * for a while be unuseable. For .text, we assume we are | ||
146 | * covered by a BAT. This works only for non-G5 at this | ||
147 | * point. G5 will need a better approach, possibly using | ||
148 | * a small temporary hash table filled with large mappings, | ||
149 | * disabling the MMU completely isn't a good option for | ||
150 | * performance reasons. | ||
151 | * (Note that 750's may have the same performance issue as | ||
152 | * the G5 in this case, we should investigate using moving | ||
153 | * BATs for these CPUs) | ||
154 | */ | ||
155 | mfmsr r0 | ||
156 | sync | ||
157 | rlwinm r0,r0,0,28,26 /* clear MSR_DR */ | ||
158 | mtmsr r0 | ||
159 | sync | ||
160 | isync | ||
161 | |||
162 | /* Load ptr the list of pages to copy in r3 */ | ||
163 | lis r11,(pagedir_nosave - KERNELBASE)@h | ||
164 | ori r11,r11,pagedir_nosave@l | ||
165 | lwz r10,0(r11) | ||
166 | |||
167 | /* Copy the pages. This is a very basic implementation, to | ||
168 | * be replaced by something more cache efficient */ | ||
169 | 1: | ||
170 | tophys(r3,r10) | ||
171 | li r0,256 | ||
172 | mtctr r0 | ||
173 | lwz r11,pbe_address(r3) /* source */ | ||
174 | tophys(r5,r11) | ||
175 | lwz r10,pbe_orig_address(r3) /* destination */ | ||
176 | tophys(r6,r10) | ||
177 | 2: | ||
178 | lwz r8,0(r5) | ||
179 | lwz r9,4(r5) | ||
180 | lwz r10,8(r5) | ||
181 | lwz r11,12(r5) | ||
182 | addi r5,r5,16 | ||
183 | stw r8,0(r6) | ||
184 | stw r9,4(r6) | ||
185 | stw r10,8(r6) | ||
186 | stw r11,12(r6) | ||
187 | addi r6,r6,16 | ||
188 | bdnz 2b | ||
189 | lwz r10,pbe_next(r3) | ||
190 | cmpwi 0,r10,0 | ||
191 | bne 1b | ||
192 | |||
193 | /* Do a very simple cache flush/inval of the L1 to ensure | ||
194 | * coherency of the icache | ||
195 | */ | ||
196 | lis r3,0x0002 | ||
197 | mtctr r3 | ||
198 | li r3, 0 | ||
199 | 1: | ||
200 | lwz r0,0(r3) | ||
201 | addi r3,r3,0x0020 | ||
202 | bdnz 1b | ||
203 | isync | ||
204 | sync | ||
205 | |||
206 | /* Now flush those cache lines */ | ||
207 | lis r3,0x0002 | ||
208 | mtctr r3 | ||
209 | li r3, 0 | ||
210 | 1: | ||
211 | dcbf 0,r3 | ||
212 | addi r3,r3,0x0020 | ||
213 | bdnz 1b | ||
214 | sync | ||
215 | |||
216 | /* Ok, we are now running with the kernel data of the old | ||
217 | * kernel fully restored. We can get to the save area | ||
218 | * easily now. As for the rest of the code, it assumes the | ||
219 | * loader kernel and the booted one are exactly identical | ||
220 | */ | ||
221 | lis r11,swsusp_save_area@h | ||
222 | ori r11,r11,swsusp_save_area@l | ||
223 | tophys(r11,r11) | ||
224 | |||
225 | #if 0 | ||
226 | /* Restore various CPU config stuffs */ | ||
227 | bl __restore_cpu_setup | ||
228 | #endif | ||
229 | /* Restore the BATs, and SDR1. Then we can turn on the MMU. | ||
230 | * This is a bit hairy as we are running out of those BATs, | ||
231 | * but first, our code is probably in the icache, and we are | ||
232 | * writing the same value to the BAT, so that should be fine, | ||
233 | * though a better solution will have to be found long-term | ||
234 | */ | ||
235 | lwz r4,SL_SDR1(r11) | ||
236 | mtsdr1 r4 | ||
237 | lwz r4,SL_SPRG0(r11) | ||
238 | mtsprg 0,r4 | ||
239 | lwz r4,SL_SPRG0+4(r11) | ||
240 | mtsprg 1,r4 | ||
241 | lwz r4,SL_SPRG0+8(r11) | ||
242 | mtsprg 2,r4 | ||
243 | lwz r4,SL_SPRG0+12(r11) | ||
244 | mtsprg 3,r4 | ||
245 | |||
246 | #if 0 | ||
247 | lwz r4,SL_DBAT0(r11) | ||
248 | mtdbatu 0,r4 | ||
249 | lwz r4,SL_DBAT0+4(r11) | ||
250 | mtdbatl 0,r4 | ||
251 | lwz r4,SL_DBAT1(r11) | ||
252 | mtdbatu 1,r4 | ||
253 | lwz r4,SL_DBAT1+4(r11) | ||
254 | mtdbatl 1,r4 | ||
255 | lwz r4,SL_DBAT2(r11) | ||
256 | mtdbatu 2,r4 | ||
257 | lwz r4,SL_DBAT2+4(r11) | ||
258 | mtdbatl 2,r4 | ||
259 | lwz r4,SL_DBAT3(r11) | ||
260 | mtdbatu 3,r4 | ||
261 | lwz r4,SL_DBAT3+4(r11) | ||
262 | mtdbatl 3,r4 | ||
263 | lwz r4,SL_IBAT0(r11) | ||
264 | mtibatu 0,r4 | ||
265 | lwz r4,SL_IBAT0+4(r11) | ||
266 | mtibatl 0,r4 | ||
267 | lwz r4,SL_IBAT1(r11) | ||
268 | mtibatu 1,r4 | ||
269 | lwz r4,SL_IBAT1+4(r11) | ||
270 | mtibatl 1,r4 | ||
271 | lwz r4,SL_IBAT2(r11) | ||
272 | mtibatu 2,r4 | ||
273 | lwz r4,SL_IBAT2+4(r11) | ||
274 | mtibatl 2,r4 | ||
275 | lwz r4,SL_IBAT3(r11) | ||
276 | mtibatu 3,r4 | ||
277 | lwz r4,SL_IBAT3+4(r11) | ||
278 | mtibatl 3,r4 | ||
279 | #endif | ||
280 | |||
281 | BEGIN_FTR_SECTION | ||
282 | li r4,0 | ||
283 | mtspr SPRN_DBAT4U,r4 | ||
284 | mtspr SPRN_DBAT4L,r4 | ||
285 | mtspr SPRN_DBAT5U,r4 | ||
286 | mtspr SPRN_DBAT5L,r4 | ||
287 | mtspr SPRN_DBAT6U,r4 | ||
288 | mtspr SPRN_DBAT6L,r4 | ||
289 | mtspr SPRN_DBAT7U,r4 | ||
290 | mtspr SPRN_DBAT7L,r4 | ||
291 | mtspr SPRN_IBAT4U,r4 | ||
292 | mtspr SPRN_IBAT4L,r4 | ||
293 | mtspr SPRN_IBAT5U,r4 | ||
294 | mtspr SPRN_IBAT5L,r4 | ||
295 | mtspr SPRN_IBAT6U,r4 | ||
296 | mtspr SPRN_IBAT6L,r4 | ||
297 | mtspr SPRN_IBAT7U,r4 | ||
298 | mtspr SPRN_IBAT7L,r4 | ||
299 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_HIGH_BATS) | ||
300 | |||
301 | /* Flush all TLBs */ | ||
302 | lis r4,0x1000 | ||
303 | 1: addic. r4,r4,-0x1000 | ||
304 | tlbie r4 | ||
305 | blt 1b | ||
306 | sync | ||
307 | |||
308 | /* restore the MSR and turn on the MMU */ | ||
309 | lwz r3,SL_MSR(r11) | ||
310 | bl turn_on_mmu | ||
311 | tovirt(r11,r11) | ||
312 | |||
313 | /* Restore TB */ | ||
314 | li r3,0 | ||
315 | mttbl r3 | ||
316 | lwz r3,SL_TB(r11) | ||
317 | lwz r4,SL_TB+4(r11) | ||
318 | mttbu r3 | ||
319 | mttbl r4 | ||
320 | |||
321 | /* Kick decrementer */ | ||
322 | li r0,1 | ||
323 | mtdec r0 | ||
324 | |||
325 | /* Restore the callee-saved registers and return */ | ||
326 | lwz r0,SL_CR(r11) | ||
327 | mtcr r0 | ||
328 | lwz r2,SL_R2(r11) | ||
329 | lmw r12,SL_R12(r11) | ||
330 | lwz r1,SL_SP(r11) | ||
331 | lwz r0,SL_LR(r11) | ||
332 | mtlr r0 | ||
333 | |||
334 | // XXX Note: we don't really need to call swsusp_resume | ||
335 | |||
336 | li r3,0 | ||
337 | blr | ||
338 | |||
339 | /* FIXME:This construct is actually not useful since we don't shut | ||
340 | * down the instruction MMU, we could just flip back MSR-DR on. | ||
341 | */ | ||
342 | turn_on_mmu: | ||
343 | mflr r4 | ||
344 | mtsrr0 r4 | ||
345 | mtsrr1 r3 | ||
346 | sync | ||
347 | isync | ||
348 | rfi | ||
349 | |||
diff --git a/arch/ppc/kernel/temp.c b/arch/ppc/kernel/temp.c deleted file mode 100644 index 26bd8ea35a4e..000000000000 --- a/arch/ppc/kernel/temp.c +++ /dev/null | |||
@@ -1,271 +0,0 @@ | |||
1 | /* | ||
2 | * temp.c Thermal management for cpu's with Thermal Assist Units | ||
3 | * | ||
4 | * Written by Troy Benjegerdes <hozer@drgw.net> | ||
5 | * | ||
6 | * TODO: | ||
7 | * dynamic power management to limit peak CPU temp (using ICTC) | ||
8 | * calibration??? | ||
9 | * | ||
10 | * Silly, crazy ideas: use cpu load (from scheduler) and ICTC to extend battery | ||
11 | * life in portables, and add a 'performance/watt' metric somewhere in /proc | ||
12 | */ | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | #include <linux/errno.h> | ||
16 | #include <linux/jiffies.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/param.h> | ||
19 | #include <linux/string.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/init.h> | ||
23 | |||
24 | #include <asm/io.h> | ||
25 | #include <asm/reg.h> | ||
26 | #include <asm/nvram.h> | ||
27 | #include <asm/cache.h> | ||
28 | #include <asm/8xx_immap.h> | ||
29 | #include <asm/machdep.h> | ||
30 | |||
31 | static struct tau_temp | ||
32 | { | ||
33 | int interrupts; | ||
34 | unsigned char low; | ||
35 | unsigned char high; | ||
36 | unsigned char grew; | ||
37 | } tau[NR_CPUS]; | ||
38 | |||
39 | struct timer_list tau_timer; | ||
40 | |||
41 | #undef DEBUG | ||
42 | |||
43 | /* TODO: put these in a /proc interface, with some sanity checks, and maybe | ||
44 | * dynamic adjustment to minimize # of interrupts */ | ||
45 | /* configurable values for step size and how much to expand the window when | ||
46 | * we get an interrupt. These are based on the limit that was out of range */ | ||
47 | #define step_size 2 /* step size when temp goes out of range */ | ||
48 | #define window_expand 1 /* expand the window by this much */ | ||
49 | /* configurable values for shrinking the window */ | ||
50 | #define shrink_timer 2*HZ /* period between shrinking the window */ | ||
51 | #define min_window 2 /* minimum window size, degrees C */ | ||
52 | |||
53 | void set_thresholds(unsigned long cpu) | ||
54 | { | ||
55 | #ifdef CONFIG_TAU_INT | ||
56 | /* | ||
57 | * setup THRM1, | ||
58 | * threshold, valid bit, enable interrupts, interrupt when below threshold | ||
59 | */ | ||
60 | mtspr(SPRN_THRM1, THRM1_THRES(tau[cpu].low) | THRM1_V | THRM1_TIE | THRM1_TID); | ||
61 | |||
62 | /* setup THRM2, | ||
63 | * threshold, valid bit, enable interrupts, interrupt when above threshhold | ||
64 | */ | ||
65 | mtspr (SPRN_THRM2, THRM1_THRES(tau[cpu].high) | THRM1_V | THRM1_TIE); | ||
66 | #else | ||
67 | /* same thing but don't enable interrupts */ | ||
68 | mtspr(SPRN_THRM1, THRM1_THRES(tau[cpu].low) | THRM1_V | THRM1_TID); | ||
69 | mtspr(SPRN_THRM2, THRM1_THRES(tau[cpu].high) | THRM1_V); | ||
70 | #endif | ||
71 | } | ||
72 | |||
73 | void TAUupdate(int cpu) | ||
74 | { | ||
75 | unsigned thrm; | ||
76 | |||
77 | #ifdef DEBUG | ||
78 | printk("TAUupdate "); | ||
79 | #endif | ||
80 | |||
81 | /* if both thresholds are crossed, the step_sizes cancel out | ||
82 | * and the window winds up getting expanded twice. */ | ||
83 | if((thrm = mfspr(SPRN_THRM1)) & THRM1_TIV){ /* is valid? */ | ||
84 | if(thrm & THRM1_TIN){ /* crossed low threshold */ | ||
85 | if (tau[cpu].low >= step_size){ | ||
86 | tau[cpu].low -= step_size; | ||
87 | tau[cpu].high -= (step_size - window_expand); | ||
88 | } | ||
89 | tau[cpu].grew = 1; | ||
90 | #ifdef DEBUG | ||
91 | printk("low threshold crossed "); | ||
92 | #endif | ||
93 | } | ||
94 | } | ||
95 | if((thrm = mfspr(SPRN_THRM2)) & THRM1_TIV){ /* is valid? */ | ||
96 | if(thrm & THRM1_TIN){ /* crossed high threshold */ | ||
97 | if (tau[cpu].high <= 127-step_size){ | ||
98 | tau[cpu].low += (step_size - window_expand); | ||
99 | tau[cpu].high += step_size; | ||
100 | } | ||
101 | tau[cpu].grew = 1; | ||
102 | #ifdef DEBUG | ||
103 | printk("high threshold crossed "); | ||
104 | #endif | ||
105 | } | ||
106 | } | ||
107 | |||
108 | #ifdef DEBUG | ||
109 | printk("grew = %d\n", tau[cpu].grew); | ||
110 | #endif | ||
111 | |||
112 | #ifndef CONFIG_TAU_INT /* tau_timeout will do this if not using interrupts */ | ||
113 | set_thresholds(cpu); | ||
114 | #endif | ||
115 | |||
116 | } | ||
117 | |||
118 | #ifdef CONFIG_TAU_INT | ||
119 | /* | ||
120 | * TAU interrupts - called when we have a thermal assist unit interrupt | ||
121 | * with interrupts disabled | ||
122 | */ | ||
123 | |||
124 | void TAUException(struct pt_regs * regs) | ||
125 | { | ||
126 | int cpu = smp_processor_id(); | ||
127 | |||
128 | irq_enter(); | ||
129 | tau[cpu].interrupts++; | ||
130 | |||
131 | TAUupdate(cpu); | ||
132 | |||
133 | irq_exit(); | ||
134 | } | ||
135 | #endif /* CONFIG_TAU_INT */ | ||
136 | |||
137 | static void tau_timeout(void * info) | ||
138 | { | ||
139 | int cpu; | ||
140 | unsigned long flags; | ||
141 | int size; | ||
142 | int shrink; | ||
143 | |||
144 | /* disabling interrupts *should* be okay */ | ||
145 | local_irq_save(flags); | ||
146 | cpu = smp_processor_id(); | ||
147 | |||
148 | #ifndef CONFIG_TAU_INT | ||
149 | TAUupdate(cpu); | ||
150 | #endif | ||
151 | |||
152 | size = tau[cpu].high - tau[cpu].low; | ||
153 | if (size > min_window && ! tau[cpu].grew) { | ||
154 | /* do an exponential shrink of half the amount currently over size */ | ||
155 | shrink = (2 + size - min_window) / 4; | ||
156 | if (shrink) { | ||
157 | tau[cpu].low += shrink; | ||
158 | tau[cpu].high -= shrink; | ||
159 | } else { /* size must have been min_window + 1 */ | ||
160 | tau[cpu].low += 1; | ||
161 | #if 1 /* debug */ | ||
162 | if ((tau[cpu].high - tau[cpu].low) != min_window){ | ||
163 | printk(KERN_ERR "temp.c: line %d, logic error\n", __LINE__); | ||
164 | } | ||
165 | #endif | ||
166 | } | ||
167 | } | ||
168 | |||
169 | tau[cpu].grew = 0; | ||
170 | |||
171 | set_thresholds(cpu); | ||
172 | |||
173 | /* | ||
174 | * Do the enable every time, since otherwise a bunch of (relatively) | ||
175 | * complex sleep code needs to be added. One mtspr every time | ||
176 | * tau_timeout is called is probably not a big deal. | ||
177 | * | ||
178 | * Enable thermal sensor and set up sample interval timer | ||
179 | * need 20 us to do the compare.. until a nice 'cpu_speed' function | ||
180 | * call is implemented, just assume a 500 mhz clock. It doesn't really | ||
181 | * matter if we take too long for a compare since it's all interrupt | ||
182 | * driven anyway. | ||
183 | * | ||
184 | * use a extra long time.. (60 us @ 500 mhz) | ||
185 | */ | ||
186 | mtspr(SPRN_THRM3, THRM3_SITV(500*60) | THRM3_E); | ||
187 | |||
188 | local_irq_restore(flags); | ||
189 | } | ||
190 | |||
191 | static void tau_timeout_smp(unsigned long unused) | ||
192 | { | ||
193 | |||
194 | /* schedule ourselves to be run again */ | ||
195 | mod_timer(&tau_timer, jiffies + shrink_timer) ; | ||
196 | on_each_cpu(tau_timeout, NULL, 1, 0); | ||
197 | } | ||
198 | |||
199 | /* | ||
200 | * setup the TAU | ||
201 | * | ||
202 | * Set things up to use THRM1 as a temperature lower bound, and THRM2 as an upper bound. | ||
203 | * Start off at zero | ||
204 | */ | ||
205 | |||
206 | int tau_initialized = 0; | ||
207 | |||
208 | void __init TAU_init_smp(void * info) | ||
209 | { | ||
210 | unsigned long cpu = smp_processor_id(); | ||
211 | |||
212 | /* set these to a reasonable value and let the timer shrink the | ||
213 | * window */ | ||
214 | tau[cpu].low = 5; | ||
215 | tau[cpu].high = 120; | ||
216 | |||
217 | set_thresholds(cpu); | ||
218 | } | ||
219 | |||
220 | int __init TAU_init(void) | ||
221 | { | ||
222 | /* We assume in SMP that if one CPU has TAU support, they | ||
223 | * all have it --BenH | ||
224 | */ | ||
225 | if (!cpu_has_feature(CPU_FTR_TAU)) { | ||
226 | printk("Thermal assist unit not available\n"); | ||
227 | tau_initialized = 0; | ||
228 | return 1; | ||
229 | } | ||
230 | |||
231 | |||
232 | /* first, set up the window shrinking timer */ | ||
233 | init_timer(&tau_timer); | ||
234 | tau_timer.function = tau_timeout_smp; | ||
235 | tau_timer.expires = jiffies + shrink_timer; | ||
236 | add_timer(&tau_timer); | ||
237 | |||
238 | on_each_cpu(TAU_init_smp, NULL, 1, 0); | ||
239 | |||
240 | printk("Thermal assist unit "); | ||
241 | #ifdef CONFIG_TAU_INT | ||
242 | printk("using interrupts, "); | ||
243 | #else | ||
244 | printk("using timers, "); | ||
245 | #endif | ||
246 | printk("shrink_timer: %d jiffies\n", shrink_timer); | ||
247 | tau_initialized = 1; | ||
248 | |||
249 | return 0; | ||
250 | } | ||
251 | |||
252 | __initcall(TAU_init); | ||
253 | |||
254 | /* | ||
255 | * return current temp | ||
256 | */ | ||
257 | |||
258 | u32 cpu_temp_both(unsigned long cpu) | ||
259 | { | ||
260 | return ((tau[cpu].high << 16) | tau[cpu].low); | ||
261 | } | ||
262 | |||
263 | int cpu_temp(unsigned long cpu) | ||
264 | { | ||
265 | return ((tau[cpu].high + tau[cpu].low) / 2); | ||
266 | } | ||
267 | |||
268 | int tau_interrupts(unsigned long cpu) | ||
269 | { | ||
270 | return (tau[cpu].interrupts); | ||
271 | } | ||
diff --git a/arch/ppc/lib/strcase.c b/arch/ppc/lib/strcase.c index 36b521091bbc..3b0094cc2b52 100644 --- a/arch/ppc/lib/strcase.c +++ b/arch/ppc/lib/strcase.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/ctype.h> | 1 | #include <linux/ctype.h> |
2 | #include <linux/types.h> | ||
2 | 3 | ||
3 | int strcasecmp(const char *s1, const char *s2) | 4 | int strcasecmp(const char *s1, const char *s2) |
4 | { | 5 | { |
@@ -11,7 +12,7 @@ int strcasecmp(const char *s1, const char *s2) | |||
11 | return c1 - c2; | 12 | return c1 - c2; |
12 | } | 13 | } |
13 | 14 | ||
14 | int strncasecmp(const char *s1, const char *s2, int n) | 15 | int strncasecmp(const char *s1, const char *s2, size_t n) |
15 | { | 16 | { |
16 | int c1, c2; | 17 | int c1, c2; |
17 | 18 | ||
diff --git a/arch/ppc/math-emu/Makefile b/arch/ppc/math-emu/Makefile deleted file mode 100644 index 754143e8936b..000000000000 --- a/arch/ppc/math-emu/Makefile +++ /dev/null | |||
@@ -1,13 +0,0 @@ | |||
1 | |||
2 | obj-y := math.o fmr.o lfd.o stfd.o | ||
3 | |||
4 | obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \ | ||
5 | fctiw.o fctiwz.o fdiv.o fdivs.o \ | ||
6 | fmadd.o fmadds.o fmsub.o fmsubs.o \ | ||
7 | fmul.o fmuls.o fnabs.o fneg.o types.o \ | ||
8 | fnmadd.o fnmadds.o fnmsub.o fnmsubs.o \ | ||
9 | fres.o frsp.o frsqrte.o fsel.o lfs.o \ | ||
10 | fsqrt.o fsqrts.o fsub.o fsubs.o \ | ||
11 | mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ | ||
12 | mtfsf.o mtfsfi.o stfiwx.o stfs.o \ | ||
13 | udivmodti4.o | ||
diff --git a/arch/ppc/math-emu/double.h b/arch/ppc/math-emu/double.h deleted file mode 100644 index ffba8b67f059..000000000000 --- a/arch/ppc/math-emu/double.h +++ /dev/null | |||
@@ -1,129 +0,0 @@ | |||
1 | /* | ||
2 | * Definitions for IEEE Double Precision | ||
3 | */ | ||
4 | |||
5 | #if _FP_W_TYPE_SIZE < 32 | ||
6 | #error "Here's a nickel kid. Go buy yourself a real computer." | ||
7 | #endif | ||
8 | |||
9 | #if _FP_W_TYPE_SIZE < 64 | ||
10 | #define _FP_FRACTBITS_D (2 * _FP_W_TYPE_SIZE) | ||
11 | #else | ||
12 | #define _FP_FRACTBITS_D _FP_W_TYPE_SIZE | ||
13 | #endif | ||
14 | |||
15 | #define _FP_FRACBITS_D 53 | ||
16 | #define _FP_FRACXBITS_D (_FP_FRACTBITS_D - _FP_FRACBITS_D) | ||
17 | #define _FP_WFRACBITS_D (_FP_WORKBITS + _FP_FRACBITS_D) | ||
18 | #define _FP_WFRACXBITS_D (_FP_FRACTBITS_D - _FP_WFRACBITS_D) | ||
19 | #define _FP_EXPBITS_D 11 | ||
20 | #define _FP_EXPBIAS_D 1023 | ||
21 | #define _FP_EXPMAX_D 2047 | ||
22 | |||
23 | #define _FP_QNANBIT_D \ | ||
24 | ((_FP_W_TYPE)1 << ((_FP_FRACBITS_D-2) % _FP_W_TYPE_SIZE)) | ||
25 | #define _FP_IMPLBIT_D \ | ||
26 | ((_FP_W_TYPE)1 << ((_FP_FRACBITS_D-1) % _FP_W_TYPE_SIZE)) | ||
27 | #define _FP_OVERFLOW_D \ | ||
28 | ((_FP_W_TYPE)1 << (_FP_WFRACBITS_D % _FP_W_TYPE_SIZE)) | ||
29 | |||
30 | #if _FP_W_TYPE_SIZE < 64 | ||
31 | |||
32 | union _FP_UNION_D | ||
33 | { | ||
34 | double flt; | ||
35 | struct { | ||
36 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
37 | unsigned sign : 1; | ||
38 | unsigned exp : _FP_EXPBITS_D; | ||
39 | unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE; | ||
40 | unsigned frac0 : _FP_W_TYPE_SIZE; | ||
41 | #else | ||
42 | unsigned frac0 : _FP_W_TYPE_SIZE; | ||
43 | unsigned frac1 : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0) - _FP_W_TYPE_SIZE; | ||
44 | unsigned exp : _FP_EXPBITS_D; | ||
45 | unsigned sign : 1; | ||
46 | #endif | ||
47 | } bits __attribute__((packed)); | ||
48 | }; | ||
49 | |||
50 | #define FP_DECL_D(X) _FP_DECL(2,X) | ||
51 | #define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_2(D,X,val) | ||
52 | #define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_2(D,val,X) | ||
53 | |||
54 | #define FP_UNPACK_D(X,val) \ | ||
55 | do { \ | ||
56 | _FP_UNPACK_RAW_2(D,X,val); \ | ||
57 | _FP_UNPACK_CANONICAL(D,2,X); \ | ||
58 | } while (0) | ||
59 | |||
60 | #define FP_PACK_D(val,X) \ | ||
61 | do { \ | ||
62 | _FP_PACK_CANONICAL(D,2,X); \ | ||
63 | _FP_PACK_RAW_2(D,val,X); \ | ||
64 | } while (0) | ||
65 | |||
66 | #define FP_NEG_D(R,X) _FP_NEG(D,2,R,X) | ||
67 | #define FP_ADD_D(R,X,Y) _FP_ADD(D,2,R,X,Y) | ||
68 | #define FP_SUB_D(R,X,Y) _FP_SUB(D,2,R,X,Y) | ||
69 | #define FP_MUL_D(R,X,Y) _FP_MUL(D,2,R,X,Y) | ||
70 | #define FP_DIV_D(R,X,Y) _FP_DIV(D,2,R,X,Y) | ||
71 | #define FP_SQRT_D(R,X) _FP_SQRT(D,2,R,X) | ||
72 | |||
73 | #define FP_CMP_D(r,X,Y,un) _FP_CMP(D,2,r,X,Y,un) | ||
74 | #define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,2,r,X,Y) | ||
75 | |||
76 | #define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,2,r,X,rsz,rsg) | ||
77 | #define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,2,X,r,rs,rt) | ||
78 | |||
79 | #else | ||
80 | |||
81 | union _FP_UNION_D | ||
82 | { | ||
83 | double flt; | ||
84 | struct { | ||
85 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
86 | unsigned sign : 1; | ||
87 | unsigned exp : _FP_EXPBITS_D; | ||
88 | unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0); | ||
89 | #else | ||
90 | unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0); | ||
91 | unsigned exp : _FP_EXPBITS_D; | ||
92 | unsigned sign : 1; | ||
93 | #endif | ||
94 | } bits __attribute__((packed)); | ||
95 | }; | ||
96 | |||
97 | #define FP_DECL_D(X) _FP_DECL(1,X) | ||
98 | #define FP_UNPACK_RAW_D(X,val) _FP_UNPACK_RAW_1(D,X,val) | ||
99 | #define FP_PACK_RAW_D(val,X) _FP_PACK_RAW_1(D,val,X) | ||
100 | |||
101 | #define FP_UNPACK_D(X,val) \ | ||
102 | do { \ | ||
103 | _FP_UNPACK_RAW_1(D,X,val); \ | ||
104 | _FP_UNPACK_CANONICAL(D,1,X); \ | ||
105 | } while (0) | ||
106 | |||
107 | #define FP_PACK_D(val,X) \ | ||
108 | do { \ | ||
109 | _FP_PACK_CANONICAL(D,1,X); \ | ||
110 | _FP_PACK_RAW_1(D,val,X); \ | ||
111 | } while (0) | ||
112 | |||
113 | #define FP_NEG_D(R,X) _FP_NEG(D,1,R,X) | ||
114 | #define FP_ADD_D(R,X,Y) _FP_ADD(D,1,R,X,Y) | ||
115 | #define FP_SUB_D(R,X,Y) _FP_SUB(D,1,R,X,Y) | ||
116 | #define FP_MUL_D(R,X,Y) _FP_MUL(D,1,R,X,Y) | ||
117 | #define FP_DIV_D(R,X,Y) _FP_DIV(D,1,R,X,Y) | ||
118 | #define FP_SQRT_D(R,X) _FP_SQRT(D,1,R,X) | ||
119 | |||
120 | /* The implementation of _FP_MUL_D and _FP_DIV_D should be chosen by | ||
121 | the target machine. */ | ||
122 | |||
123 | #define FP_CMP_D(r,X,Y,un) _FP_CMP(D,1,r,X,Y,un) | ||
124 | #define FP_CMP_EQ_D(r,X,Y) _FP_CMP_EQ(D,1,r,X,Y) | ||
125 | |||
126 | #define FP_TO_INT_D(r,X,rsz,rsg) _FP_TO_INT(D,1,r,X,rsz,rsg) | ||
127 | #define FP_FROM_INT_D(X,r,rs,rt) _FP_FROM_INT(D,1,X,r,rs,rt) | ||
128 | |||
129 | #endif /* W_TYPE_SIZE < 64 */ | ||
diff --git a/arch/ppc/math-emu/fabs.c b/arch/ppc/math-emu/fabs.c deleted file mode 100644 index 41f0617f3d3a..000000000000 --- a/arch/ppc/math-emu/fabs.c +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | fabs(u32 *frD, u32 *frB) | ||
7 | { | ||
8 | frD[0] = frB[0] & 0x7fffffff; | ||
9 | frD[1] = frB[1]; | ||
10 | |||
11 | #ifdef DEBUG | ||
12 | printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB); | ||
13 | dump_double(frD); | ||
14 | printk("\n"); | ||
15 | #endif | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/arch/ppc/math-emu/fadd.c b/arch/ppc/math-emu/fadd.c deleted file mode 100644 index fc8836488b64..000000000000 --- a/arch/ppc/math-emu/fadd.c +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fadd(void *frD, void *frA, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | FP_DECL_D(B); | ||
13 | FP_DECL_D(R); | ||
14 | int ret = 0; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
18 | #endif | ||
19 | |||
20 | __FP_UNPACK_D(A, frA); | ||
21 | __FP_UNPACK_D(B, frB); | ||
22 | |||
23 | #ifdef DEBUG | ||
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
25 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
26 | #endif | ||
27 | |||
28 | if (A_s != B_s && A_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
29 | ret |= EFLAG_VXISI; | ||
30 | |||
31 | FP_ADD_D(R, A, B); | ||
32 | |||
33 | #ifdef DEBUG | ||
34 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
35 | #endif | ||
36 | |||
37 | return (ret | __FP_PACK_D(frD, R)); | ||
38 | } | ||
diff --git a/arch/ppc/math-emu/fadds.c b/arch/ppc/math-emu/fadds.c deleted file mode 100644 index 93025b6c8f3c..000000000000 --- a/arch/ppc/math-emu/fadds.c +++ /dev/null | |||
@@ -1,39 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fadds(void *frD, void *frA, void *frB) | ||
11 | { | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(R); | ||
15 | int ret = 0; | ||
16 | |||
17 | #ifdef DEBUG | ||
18 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
19 | #endif | ||
20 | |||
21 | __FP_UNPACK_D(A, frA); | ||
22 | __FP_UNPACK_D(B, frB); | ||
23 | |||
24 | #ifdef DEBUG | ||
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
26 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
27 | #endif | ||
28 | |||
29 | if (A_s != B_s && A_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
30 | ret |= EFLAG_VXISI; | ||
31 | |||
32 | FP_ADD_D(R, A, B); | ||
33 | |||
34 | #ifdef DEBUG | ||
35 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
36 | #endif | ||
37 | |||
38 | return (ret | __FP_PACK_DS(frD, R)); | ||
39 | } | ||
diff --git a/arch/ppc/math-emu/fcmpo.c b/arch/ppc/math-emu/fcmpo.c deleted file mode 100644 index 4efac394b4cb..000000000000 --- a/arch/ppc/math-emu/fcmpo.c +++ /dev/null | |||
@@ -1,46 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fcmpo(u32 *ccr, int crfD, void *frA, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | FP_DECL_D(B); | ||
13 | int code[4] = { (1 << 3), (1 << 1), (1 << 2), (1 << 0) }; | ||
14 | long cmp; | ||
15 | int ret = 0; | ||
16 | |||
17 | #ifdef DEBUG | ||
18 | printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crfD, frA, frB); | ||
19 | #endif | ||
20 | |||
21 | __FP_UNPACK_D(A, frA); | ||
22 | __FP_UNPACK_D(B, frB); | ||
23 | |||
24 | #ifdef DEBUG | ||
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
26 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
27 | #endif | ||
28 | |||
29 | if (A_c == FP_CLS_NAN || B_c == FP_CLS_NAN) | ||
30 | ret |= EFLAG_VXVC; | ||
31 | |||
32 | FP_CMP_D(cmp, A, B, 2); | ||
33 | cmp = code[(cmp + 1) & 3]; | ||
34 | |||
35 | __FPU_FPSCR &= ~(0x1f000); | ||
36 | __FPU_FPSCR |= (cmp << 12); | ||
37 | |||
38 | *ccr &= ~(15 << ((7 - crfD) << 2)); | ||
39 | *ccr |= (cmp << ((7 - crfD) << 2)); | ||
40 | |||
41 | #ifdef DEBUG | ||
42 | printk("CR: %08x\n", *ccr); | ||
43 | #endif | ||
44 | |||
45 | return ret; | ||
46 | } | ||
diff --git a/arch/ppc/math-emu/fcmpu.c b/arch/ppc/math-emu/fcmpu.c deleted file mode 100644 index b7e33176e618..000000000000 --- a/arch/ppc/math-emu/fcmpu.c +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fcmpu(u32 *ccr, int crfD, void *frA, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | FP_DECL_D(B); | ||
13 | int code[4] = { (1 << 3), (1 << 1), (1 << 2), (1 << 0) }; | ||
14 | long cmp; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crfD, frA, frB); | ||
18 | #endif | ||
19 | |||
20 | __FP_UNPACK_D(A, frA); | ||
21 | __FP_UNPACK_D(B, frB); | ||
22 | |||
23 | #ifdef DEBUG | ||
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
25 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
26 | #endif | ||
27 | |||
28 | FP_CMP_D(cmp, A, B, 2); | ||
29 | cmp = code[(cmp + 1) & 3]; | ||
30 | |||
31 | __FPU_FPSCR &= ~(0x1f000); | ||
32 | __FPU_FPSCR |= (cmp << 12); | ||
33 | |||
34 | *ccr &= ~(15 << ((7 - crfD) << 2)); | ||
35 | *ccr |= (cmp << ((7 - crfD) << 2)); | ||
36 | |||
37 | #ifdef DEBUG | ||
38 | printk("CR: %08x\n", *ccr); | ||
39 | #endif | ||
40 | |||
41 | return 0; | ||
42 | } | ||
diff --git a/arch/ppc/math-emu/fctiw.c b/arch/ppc/math-emu/fctiw.c deleted file mode 100644 index 3b3c98b840cf..000000000000 --- a/arch/ppc/math-emu/fctiw.c +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fctiw(u32 *frD, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(B); | ||
12 | unsigned int r; | ||
13 | |||
14 | __FP_UNPACK_D(B, frB); | ||
15 | FP_TO_INT_D(r, B, 32, 1); | ||
16 | frD[1] = r; | ||
17 | |||
18 | #ifdef DEBUG | ||
19 | printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB); | ||
20 | dump_double(frD); | ||
21 | printk("\n"); | ||
22 | #endif | ||
23 | |||
24 | return 0; | ||
25 | } | ||
diff --git a/arch/ppc/math-emu/fctiwz.c b/arch/ppc/math-emu/fctiwz.c deleted file mode 100644 index 7717eb6fcfb6..000000000000 --- a/arch/ppc/math-emu/fctiwz.c +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fctiwz(u32 *frD, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(B); | ||
12 | u32 fpscr; | ||
13 | unsigned int r; | ||
14 | |||
15 | fpscr = __FPU_FPSCR; | ||
16 | __FPU_FPSCR &= ~(3); | ||
17 | __FPU_FPSCR |= FP_RND_ZERO; | ||
18 | |||
19 | __FP_UNPACK_D(B, frB); | ||
20 | FP_TO_INT_D(r, B, 32, 1); | ||
21 | frD[1] = r; | ||
22 | |||
23 | __FPU_FPSCR = fpscr; | ||
24 | |||
25 | #ifdef DEBUG | ||
26 | printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB); | ||
27 | dump_double(frD); | ||
28 | printk("\n"); | ||
29 | #endif | ||
30 | |||
31 | return 0; | ||
32 | } | ||
diff --git a/arch/ppc/math-emu/fdiv.c b/arch/ppc/math-emu/fdiv.c deleted file mode 100644 index f2fba825b2d0..000000000000 --- a/arch/ppc/math-emu/fdiv.c +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fdiv(void *frD, void *frA, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | FP_DECL_D(B); | ||
13 | FP_DECL_D(R); | ||
14 | int ret = 0; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
18 | #endif | ||
19 | |||
20 | __FP_UNPACK_D(A, frA); | ||
21 | __FP_UNPACK_D(B, frB); | ||
22 | |||
23 | #ifdef DEBUG | ||
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
25 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
26 | #endif | ||
27 | |||
28 | if (A_c == FP_CLS_ZERO && B_c == FP_CLS_ZERO) { | ||
29 | ret |= EFLAG_VXZDZ; | ||
30 | #ifdef DEBUG | ||
31 | printk("%s: FPSCR_VXZDZ raised\n", __FUNCTION__); | ||
32 | #endif | ||
33 | } | ||
34 | if (A_c == FP_CLS_INF && B_c == FP_CLS_INF) { | ||
35 | ret |= EFLAG_VXIDI; | ||
36 | #ifdef DEBUG | ||
37 | printk("%s: FPSCR_VXIDI raised\n", __FUNCTION__); | ||
38 | #endif | ||
39 | } | ||
40 | |||
41 | if (B_c == FP_CLS_ZERO && A_c != FP_CLS_ZERO) { | ||
42 | ret |= EFLAG_DIVZERO; | ||
43 | if (__FPU_TRAP_P(EFLAG_DIVZERO)) | ||
44 | return ret; | ||
45 | } | ||
46 | FP_DIV_D(R, A, B); | ||
47 | |||
48 | #ifdef DEBUG | ||
49 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
50 | #endif | ||
51 | |||
52 | return (ret | __FP_PACK_D(frD, R)); | ||
53 | } | ||
diff --git a/arch/ppc/math-emu/fdivs.c b/arch/ppc/math-emu/fdivs.c deleted file mode 100644 index b971196e3175..000000000000 --- a/arch/ppc/math-emu/fdivs.c +++ /dev/null | |||
@@ -1,55 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fdivs(void *frD, void *frA, void *frB) | ||
11 | { | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(R); | ||
15 | int ret = 0; | ||
16 | |||
17 | #ifdef DEBUG | ||
18 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
19 | #endif | ||
20 | |||
21 | __FP_UNPACK_D(A, frA); | ||
22 | __FP_UNPACK_D(B, frB); | ||
23 | |||
24 | #ifdef DEBUG | ||
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
26 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
27 | #endif | ||
28 | |||
29 | if (A_c == FP_CLS_ZERO && B_c == FP_CLS_ZERO) { | ||
30 | ret |= EFLAG_VXZDZ; | ||
31 | #ifdef DEBUG | ||
32 | printk("%s: FPSCR_VXZDZ raised\n", __FUNCTION__); | ||
33 | #endif | ||
34 | } | ||
35 | if (A_c == FP_CLS_INF && B_c == FP_CLS_INF) { | ||
36 | ret |= EFLAG_VXIDI; | ||
37 | #ifdef DEBUG | ||
38 | printk("%s: FPSCR_VXIDI raised\n", __FUNCTION__); | ||
39 | #endif | ||
40 | } | ||
41 | |||
42 | if (B_c == FP_CLS_ZERO && A_c != FP_CLS_ZERO) { | ||
43 | ret |= EFLAG_DIVZERO; | ||
44 | if (__FPU_TRAP_P(EFLAG_DIVZERO)) | ||
45 | return ret; | ||
46 | } | ||
47 | |||
48 | FP_DIV_D(R, A, B); | ||
49 | |||
50 | #ifdef DEBUG | ||
51 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
52 | #endif | ||
53 | |||
54 | return (ret | __FP_PACK_DS(frD, R)); | ||
55 | } | ||
diff --git a/arch/ppc/math-emu/fmadd.c b/arch/ppc/math-emu/fmadd.c deleted file mode 100644 index 0a1dbce793e9..000000000000 --- a/arch/ppc/math-emu/fmadd.c +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fmadd(void *frD, void *frA, void *frB, void *frC) | ||
10 | { | ||
11 | FP_DECL_D(R); | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(C); | ||
15 | FP_DECL_D(T); | ||
16 | int ret = 0; | ||
17 | |||
18 | #ifdef DEBUG | ||
19 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
20 | #endif | ||
21 | |||
22 | __FP_UNPACK_D(A, frA); | ||
23 | __FP_UNPACK_D(B, frB); | ||
24 | __FP_UNPACK_D(C, frC); | ||
25 | |||
26 | #ifdef DEBUG | ||
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
28 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
29 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
30 | #endif | ||
31 | |||
32 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
33 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
34 | ret |= EFLAG_VXIMZ; | ||
35 | |||
36 | FP_MUL_D(T, A, C); | ||
37 | |||
38 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
39 | ret |= EFLAG_VXISI; | ||
40 | |||
41 | FP_ADD_D(R, T, B); | ||
42 | |||
43 | #ifdef DEBUG | ||
44 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
45 | #endif | ||
46 | |||
47 | return (ret | __FP_PACK_D(frD, R)); | ||
48 | } | ||
diff --git a/arch/ppc/math-emu/fmadds.c b/arch/ppc/math-emu/fmadds.c deleted file mode 100644 index 0f70bba9445e..000000000000 --- a/arch/ppc/math-emu/fmadds.c +++ /dev/null | |||
@@ -1,49 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fmadds(void *frD, void *frA, void *frB, void *frC) | ||
11 | { | ||
12 | FP_DECL_D(R); | ||
13 | FP_DECL_D(A); | ||
14 | FP_DECL_D(B); | ||
15 | FP_DECL_D(C); | ||
16 | FP_DECL_D(T); | ||
17 | int ret = 0; | ||
18 | |||
19 | #ifdef DEBUG | ||
20 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
21 | #endif | ||
22 | |||
23 | __FP_UNPACK_D(A, frA); | ||
24 | __FP_UNPACK_D(B, frB); | ||
25 | __FP_UNPACK_D(C, frC); | ||
26 | |||
27 | #ifdef DEBUG | ||
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
29 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
30 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
31 | #endif | ||
32 | |||
33 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
34 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
35 | ret |= EFLAG_VXIMZ; | ||
36 | |||
37 | FP_MUL_D(T, A, C); | ||
38 | |||
39 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
40 | ret |= EFLAG_VXISI; | ||
41 | |||
42 | FP_ADD_D(R, T, B); | ||
43 | |||
44 | #ifdef DEBUG | ||
45 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
46 | #endif | ||
47 | |||
48 | return (ret | __FP_PACK_DS(frD, R)); | ||
49 | } | ||
diff --git a/arch/ppc/math-emu/fmr.c b/arch/ppc/math-emu/fmr.c deleted file mode 100644 index 28df700c0c7e..000000000000 --- a/arch/ppc/math-emu/fmr.c +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | fmr(u32 *frD, u32 *frB) | ||
7 | { | ||
8 | frD[0] = frB[0]; | ||
9 | frD[1] = frB[1]; | ||
10 | |||
11 | #ifdef DEBUG | ||
12 | printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB); | ||
13 | dump_double(frD); | ||
14 | printk("\n"); | ||
15 | #endif | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/arch/ppc/math-emu/fmsub.c b/arch/ppc/math-emu/fmsub.c deleted file mode 100644 index 203fd48a6fec..000000000000 --- a/arch/ppc/math-emu/fmsub.c +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fmsub(void *frD, void *frA, void *frB, void *frC) | ||
10 | { | ||
11 | FP_DECL_D(R); | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(C); | ||
15 | FP_DECL_D(T); | ||
16 | int ret = 0; | ||
17 | |||
18 | #ifdef DEBUG | ||
19 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
20 | #endif | ||
21 | |||
22 | __FP_UNPACK_D(A, frA); | ||
23 | __FP_UNPACK_D(B, frB); | ||
24 | __FP_UNPACK_D(C, frC); | ||
25 | |||
26 | #ifdef DEBUG | ||
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
28 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
29 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
30 | #endif | ||
31 | |||
32 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
33 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
34 | ret |= EFLAG_VXIMZ; | ||
35 | |||
36 | FP_MUL_D(T, A, C); | ||
37 | |||
38 | if (B_c != FP_CLS_NAN) | ||
39 | B_s ^= 1; | ||
40 | |||
41 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
42 | ret |= EFLAG_VXISI; | ||
43 | |||
44 | FP_ADD_D(R, T, B); | ||
45 | |||
46 | #ifdef DEBUG | ||
47 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
48 | #endif | ||
49 | |||
50 | return (ret | __FP_PACK_D(frD, R)); | ||
51 | } | ||
diff --git a/arch/ppc/math-emu/fmsubs.c b/arch/ppc/math-emu/fmsubs.c deleted file mode 100644 index 8ce68624c189..000000000000 --- a/arch/ppc/math-emu/fmsubs.c +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fmsubs(void *frD, void *frA, void *frB, void *frC) | ||
11 | { | ||
12 | FP_DECL_D(R); | ||
13 | FP_DECL_D(A); | ||
14 | FP_DECL_D(B); | ||
15 | FP_DECL_D(C); | ||
16 | FP_DECL_D(T); | ||
17 | int ret = 0; | ||
18 | |||
19 | #ifdef DEBUG | ||
20 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
21 | #endif | ||
22 | |||
23 | __FP_UNPACK_D(A, frA); | ||
24 | __FP_UNPACK_D(B, frB); | ||
25 | __FP_UNPACK_D(C, frC); | ||
26 | |||
27 | #ifdef DEBUG | ||
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
29 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
30 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
31 | #endif | ||
32 | |||
33 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
34 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
35 | ret |= EFLAG_VXIMZ; | ||
36 | |||
37 | FP_MUL_D(T, A, C); | ||
38 | |||
39 | if (B_c != FP_CLS_NAN) | ||
40 | B_s ^= 1; | ||
41 | |||
42 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
43 | ret |= EFLAG_VXISI; | ||
44 | |||
45 | FP_ADD_D(R, T, B); | ||
46 | |||
47 | #ifdef DEBUG | ||
48 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
49 | #endif | ||
50 | |||
51 | return (ret | __FP_PACK_DS(frD, R)); | ||
52 | } | ||
diff --git a/arch/ppc/math-emu/fmul.c b/arch/ppc/math-emu/fmul.c deleted file mode 100644 index 66c7e79aae2e..000000000000 --- a/arch/ppc/math-emu/fmul.c +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fmul(void *frD, void *frA, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | FP_DECL_D(B); | ||
13 | FP_DECL_D(R); | ||
14 | int ret = 0; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
18 | #endif | ||
19 | |||
20 | __FP_UNPACK_D(A, frA); | ||
21 | __FP_UNPACK_D(B, frB); | ||
22 | |||
23 | #ifdef DEBUG | ||
24 | printk("A: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | ||
25 | A_s, A_f1, A_f0, A_e, A_c, A_f1, A_f0, A_e + 1023); | ||
26 | printk("B: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | ||
27 | B_s, B_f1, B_f0, B_e, B_c, B_f1, B_f0, B_e + 1023); | ||
28 | #endif | ||
29 | |||
30 | if ((A_c == FP_CLS_INF && B_c == FP_CLS_ZERO) || | ||
31 | (A_c == FP_CLS_ZERO && B_c == FP_CLS_INF)) | ||
32 | ret |= EFLAG_VXIMZ; | ||
33 | |||
34 | FP_MUL_D(R, A, B); | ||
35 | |||
36 | #ifdef DEBUG | ||
37 | printk("D: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | ||
38 | R_s, R_f1, R_f0, R_e, R_c, R_f1, R_f0, R_e + 1023); | ||
39 | #endif | ||
40 | |||
41 | return (ret | __FP_PACK_D(frD, R)); | ||
42 | } | ||
diff --git a/arch/ppc/math-emu/fmuls.c b/arch/ppc/math-emu/fmuls.c deleted file mode 100644 index 26bc4278271c..000000000000 --- a/arch/ppc/math-emu/fmuls.c +++ /dev/null | |||
@@ -1,43 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fmuls(void *frD, void *frA, void *frB) | ||
11 | { | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(R); | ||
15 | int ret = 0; | ||
16 | |||
17 | #ifdef DEBUG | ||
18 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
19 | #endif | ||
20 | |||
21 | __FP_UNPACK_D(A, frA); | ||
22 | __FP_UNPACK_D(B, frB); | ||
23 | |||
24 | #ifdef DEBUG | ||
25 | printk("A: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | ||
26 | A_s, A_f1, A_f0, A_e, A_c, A_f1, A_f0, A_e + 1023); | ||
27 | printk("B: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | ||
28 | B_s, B_f1, B_f0, B_e, B_c, B_f1, B_f0, B_e + 1023); | ||
29 | #endif | ||
30 | |||
31 | if ((A_c == FP_CLS_INF && B_c == FP_CLS_ZERO) || | ||
32 | (A_c == FP_CLS_ZERO && B_c == FP_CLS_INF)) | ||
33 | ret |= EFLAG_VXIMZ; | ||
34 | |||
35 | FP_MUL_D(R, A, B); | ||
36 | |||
37 | #ifdef DEBUG | ||
38 | printk("D: %ld %lu %lu %ld (%ld) [%08lx.%08lx %lx]\n", | ||
39 | R_s, R_f1, R_f0, R_e, R_c, R_f1, R_f0, R_e + 1023); | ||
40 | #endif | ||
41 | |||
42 | return (ret | __FP_PACK_DS(frD, R)); | ||
43 | } | ||
diff --git a/arch/ppc/math-emu/fnabs.c b/arch/ppc/math-emu/fnabs.c deleted file mode 100644 index c6b913d179e0..000000000000 --- a/arch/ppc/math-emu/fnabs.c +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | fnabs(u32 *frD, u32 *frB) | ||
7 | { | ||
8 | frD[0] = frB[0] | 0x80000000; | ||
9 | frD[1] = frB[1]; | ||
10 | |||
11 | #ifdef DEBUG | ||
12 | printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB); | ||
13 | dump_double(frD); | ||
14 | printk("\n"); | ||
15 | #endif | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/arch/ppc/math-emu/fneg.c b/arch/ppc/math-emu/fneg.c deleted file mode 100644 index fe9a98deff69..000000000000 --- a/arch/ppc/math-emu/fneg.c +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | fneg(u32 *frD, u32 *frB) | ||
7 | { | ||
8 | frD[0] = frB[0] ^ 0x80000000; | ||
9 | frD[1] = frB[1]; | ||
10 | |||
11 | #ifdef DEBUG | ||
12 | printk("%s: D %p, B %p: ", __FUNCTION__, frD, frB); | ||
13 | dump_double(frD); | ||
14 | printk("\n"); | ||
15 | #endif | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/arch/ppc/math-emu/fnmadd.c b/arch/ppc/math-emu/fnmadd.c deleted file mode 100644 index 7f312276d920..000000000000 --- a/arch/ppc/math-emu/fnmadd.c +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fnmadd(void *frD, void *frA, void *frB, void *frC) | ||
10 | { | ||
11 | FP_DECL_D(R); | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(C); | ||
15 | FP_DECL_D(T); | ||
16 | int ret = 0; | ||
17 | |||
18 | #ifdef DEBUG | ||
19 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
20 | #endif | ||
21 | |||
22 | __FP_UNPACK_D(A, frA); | ||
23 | __FP_UNPACK_D(B, frB); | ||
24 | __FP_UNPACK_D(C, frC); | ||
25 | |||
26 | #ifdef DEBUG | ||
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
28 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
29 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
30 | #endif | ||
31 | |||
32 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
33 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
34 | ret |= EFLAG_VXIMZ; | ||
35 | |||
36 | FP_MUL_D(T, A, C); | ||
37 | |||
38 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
39 | ret |= EFLAG_VXISI; | ||
40 | |||
41 | FP_ADD_D(R, T, B); | ||
42 | |||
43 | if (R_c != FP_CLS_NAN) | ||
44 | R_s ^= 1; | ||
45 | |||
46 | #ifdef DEBUG | ||
47 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
48 | #endif | ||
49 | |||
50 | return (ret | __FP_PACK_D(frD, R)); | ||
51 | } | ||
diff --git a/arch/ppc/math-emu/fnmadds.c b/arch/ppc/math-emu/fnmadds.c deleted file mode 100644 index 65454c9c70bc..000000000000 --- a/arch/ppc/math-emu/fnmadds.c +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fnmadds(void *frD, void *frA, void *frB, void *frC) | ||
11 | { | ||
12 | FP_DECL_D(R); | ||
13 | FP_DECL_D(A); | ||
14 | FP_DECL_D(B); | ||
15 | FP_DECL_D(C); | ||
16 | FP_DECL_D(T); | ||
17 | int ret = 0; | ||
18 | |||
19 | #ifdef DEBUG | ||
20 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
21 | #endif | ||
22 | |||
23 | __FP_UNPACK_D(A, frA); | ||
24 | __FP_UNPACK_D(B, frB); | ||
25 | __FP_UNPACK_D(C, frC); | ||
26 | |||
27 | #ifdef DEBUG | ||
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
29 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
30 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
31 | #endif | ||
32 | |||
33 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
34 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
35 | ret |= EFLAG_VXIMZ; | ||
36 | |||
37 | FP_MUL_D(T, A, C); | ||
38 | |||
39 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
40 | ret |= EFLAG_VXISI; | ||
41 | |||
42 | FP_ADD_D(R, T, B); | ||
43 | |||
44 | if (R_c != FP_CLS_NAN) | ||
45 | R_s ^= 1; | ||
46 | |||
47 | #ifdef DEBUG | ||
48 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
49 | #endif | ||
50 | |||
51 | return (ret | __FP_PACK_DS(frD, R)); | ||
52 | } | ||
diff --git a/arch/ppc/math-emu/fnmsub.c b/arch/ppc/math-emu/fnmsub.c deleted file mode 100644 index f1ca7482b5f0..000000000000 --- a/arch/ppc/math-emu/fnmsub.c +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fnmsub(void *frD, void *frA, void *frB, void *frC) | ||
10 | { | ||
11 | FP_DECL_D(R); | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(C); | ||
15 | FP_DECL_D(T); | ||
16 | int ret = 0; | ||
17 | |||
18 | #ifdef DEBUG | ||
19 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
20 | #endif | ||
21 | |||
22 | __FP_UNPACK_D(A, frA); | ||
23 | __FP_UNPACK_D(B, frB); | ||
24 | __FP_UNPACK_D(C, frC); | ||
25 | |||
26 | #ifdef DEBUG | ||
27 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
28 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
29 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
30 | #endif | ||
31 | |||
32 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
33 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
34 | ret |= EFLAG_VXIMZ; | ||
35 | |||
36 | FP_MUL_D(T, A, C); | ||
37 | |||
38 | if (B_c != FP_CLS_NAN) | ||
39 | B_s ^= 1; | ||
40 | |||
41 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
42 | ret |= EFLAG_VXISI; | ||
43 | |||
44 | FP_ADD_D(R, T, B); | ||
45 | |||
46 | if (R_c != FP_CLS_NAN) | ||
47 | R_s ^= 1; | ||
48 | |||
49 | #ifdef DEBUG | ||
50 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
51 | #endif | ||
52 | |||
53 | return (ret | __FP_PACK_D(frD, R)); | ||
54 | } | ||
diff --git a/arch/ppc/math-emu/fnmsubs.c b/arch/ppc/math-emu/fnmsubs.c deleted file mode 100644 index 5c9a09a87dc7..000000000000 --- a/arch/ppc/math-emu/fnmsubs.c +++ /dev/null | |||
@@ -1,55 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fnmsubs(void *frD, void *frA, void *frB, void *frC) | ||
11 | { | ||
12 | FP_DECL_D(R); | ||
13 | FP_DECL_D(A); | ||
14 | FP_DECL_D(B); | ||
15 | FP_DECL_D(C); | ||
16 | FP_DECL_D(T); | ||
17 | int ret = 0; | ||
18 | |||
19 | #ifdef DEBUG | ||
20 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
21 | #endif | ||
22 | |||
23 | __FP_UNPACK_D(A, frA); | ||
24 | __FP_UNPACK_D(B, frB); | ||
25 | __FP_UNPACK_D(C, frC); | ||
26 | |||
27 | #ifdef DEBUG | ||
28 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
29 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
30 | printk("C: %ld %lu %lu %ld (%ld)\n", C_s, C_f1, C_f0, C_e, C_c); | ||
31 | #endif | ||
32 | |||
33 | if ((A_c == FP_CLS_INF && C_c == FP_CLS_ZERO) || | ||
34 | (A_c == FP_CLS_ZERO && C_c == FP_CLS_INF)) | ||
35 | ret |= EFLAG_VXIMZ; | ||
36 | |||
37 | FP_MUL_D(T, A, C); | ||
38 | |||
39 | if (B_c != FP_CLS_NAN) | ||
40 | B_s ^= 1; | ||
41 | |||
42 | if (T_s != B_s && T_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
43 | ret |= EFLAG_VXISI; | ||
44 | |||
45 | FP_ADD_D(R, T, B); | ||
46 | |||
47 | if (R_c != FP_CLS_NAN) | ||
48 | R_s ^= 1; | ||
49 | |||
50 | #ifdef DEBUG | ||
51 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
52 | #endif | ||
53 | |||
54 | return (ret | __FP_PACK_DS(frD, R)); | ||
55 | } | ||
diff --git a/arch/ppc/math-emu/fres.c b/arch/ppc/math-emu/fres.c deleted file mode 100644 index ec11e46d20af..000000000000 --- a/arch/ppc/math-emu/fres.c +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | fres(void *frD, void *frB) | ||
7 | { | ||
8 | #ifdef DEBUG | ||
9 | printk("%s: %p %p\n", __FUNCTION__, frD, frB); | ||
10 | #endif | ||
11 | return -ENOSYS; | ||
12 | } | ||
diff --git a/arch/ppc/math-emu/frsp.c b/arch/ppc/math-emu/frsp.c deleted file mode 100644 index d879b2a3d0c9..000000000000 --- a/arch/ppc/math-emu/frsp.c +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | frsp(void *frD, void *frB) | ||
11 | { | ||
12 | FP_DECL_D(B); | ||
13 | |||
14 | #ifdef DEBUG | ||
15 | printk("%s: D %p, B %p\n", __FUNCTION__, frD, frB); | ||
16 | #endif | ||
17 | |||
18 | __FP_UNPACK_D(B, frB); | ||
19 | |||
20 | #ifdef DEBUG | ||
21 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
22 | #endif | ||
23 | |||
24 | return __FP_PACK_DS(frD, B); | ||
25 | } | ||
diff --git a/arch/ppc/math-emu/frsqrte.c b/arch/ppc/math-emu/frsqrte.c deleted file mode 100644 index a11ae1829850..000000000000 --- a/arch/ppc/math-emu/frsqrte.c +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | frsqrte(void *frD, void *frB) | ||
7 | { | ||
8 | #ifdef DEBUG | ||
9 | printk("%s: %p %p\n", __FUNCTION__, frD, frB); | ||
10 | #endif | ||
11 | return 0; | ||
12 | } | ||
diff --git a/arch/ppc/math-emu/fsel.c b/arch/ppc/math-emu/fsel.c deleted file mode 100644 index e36e6e72819a..000000000000 --- a/arch/ppc/math-emu/fsel.c +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fsel(u32 *frD, void *frA, u32 *frB, u32 *frC) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | |||
13 | #ifdef DEBUG | ||
14 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frA, frB, frC); | ||
15 | #endif | ||
16 | |||
17 | __FP_UNPACK_D(A, frA); | ||
18 | |||
19 | #ifdef DEBUG | ||
20 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
21 | printk("B: %08x %08x\n", frB[0], frB[1]); | ||
22 | printk("C: %08x %08x\n", frC[0], frC[1]); | ||
23 | #endif | ||
24 | |||
25 | if (A_c == FP_CLS_NAN || (A_c != FP_CLS_ZERO && A_s)) { | ||
26 | frD[0] = frB[0]; | ||
27 | frD[1] = frB[1]; | ||
28 | } else { | ||
29 | frD[0] = frC[0]; | ||
30 | frD[1] = frC[1]; | ||
31 | } | ||
32 | |||
33 | #ifdef DEBUG | ||
34 | printk("D: %08x.%08x\n", frD[0], frD[1]); | ||
35 | #endif | ||
36 | |||
37 | return 0; | ||
38 | } | ||
diff --git a/arch/ppc/math-emu/fsqrt.c b/arch/ppc/math-emu/fsqrt.c deleted file mode 100644 index 6f8319f64a8a..000000000000 --- a/arch/ppc/math-emu/fsqrt.c +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fsqrt(void *frD, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(B); | ||
12 | FP_DECL_D(R); | ||
13 | int ret = 0; | ||
14 | |||
15 | #ifdef DEBUG | ||
16 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frB); | ||
17 | #endif | ||
18 | |||
19 | __FP_UNPACK_D(B, frB); | ||
20 | |||
21 | #ifdef DEBUG | ||
22 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
23 | #endif | ||
24 | |||
25 | if (B_s && B_c != FP_CLS_ZERO) | ||
26 | ret |= EFLAG_VXSQRT; | ||
27 | if (B_c == FP_CLS_NAN) | ||
28 | ret |= EFLAG_VXSNAN; | ||
29 | |||
30 | FP_SQRT_D(R, B); | ||
31 | |||
32 | #ifdef DEBUG | ||
33 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
34 | #endif | ||
35 | |||
36 | return (ret | __FP_PACK_D(frD, R)); | ||
37 | } | ||
diff --git a/arch/ppc/math-emu/fsqrts.c b/arch/ppc/math-emu/fsqrts.c deleted file mode 100644 index 3b2b1cf55c12..000000000000 --- a/arch/ppc/math-emu/fsqrts.c +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fsqrts(void *frD, void *frB) | ||
11 | { | ||
12 | FP_DECL_D(B); | ||
13 | FP_DECL_D(R); | ||
14 | int ret = 0; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: %p %p %p %p\n", __FUNCTION__, frD, frB); | ||
18 | #endif | ||
19 | |||
20 | __FP_UNPACK_D(B, frB); | ||
21 | |||
22 | #ifdef DEBUG | ||
23 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
24 | #endif | ||
25 | |||
26 | if (B_s && B_c != FP_CLS_ZERO) | ||
27 | ret |= EFLAG_VXSQRT; | ||
28 | if (B_c == FP_CLS_NAN) | ||
29 | ret |= EFLAG_VXSNAN; | ||
30 | |||
31 | FP_SQRT_D(R, B); | ||
32 | |||
33 | #ifdef DEBUG | ||
34 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
35 | #endif | ||
36 | |||
37 | return (ret | __FP_PACK_DS(frD, R)); | ||
38 | } | ||
diff --git a/arch/ppc/math-emu/fsub.c b/arch/ppc/math-emu/fsub.c deleted file mode 100644 index 956679042bb2..000000000000 --- a/arch/ppc/math-emu/fsub.c +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | fsub(void *frD, void *frA, void *frB) | ||
10 | { | ||
11 | FP_DECL_D(A); | ||
12 | FP_DECL_D(B); | ||
13 | FP_DECL_D(R); | ||
14 | int ret = 0; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
18 | #endif | ||
19 | |||
20 | __FP_UNPACK_D(A, frA); | ||
21 | __FP_UNPACK_D(B, frB); | ||
22 | |||
23 | #ifdef DEBUG | ||
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
25 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
26 | #endif | ||
27 | |||
28 | if (B_c != FP_CLS_NAN) | ||
29 | B_s ^= 1; | ||
30 | |||
31 | if (A_s != B_s && A_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
32 | ret |= EFLAG_VXISI; | ||
33 | |||
34 | FP_ADD_D(R, A, B); | ||
35 | |||
36 | #ifdef DEBUG | ||
37 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
38 | #endif | ||
39 | |||
40 | return (ret | __FP_PACK_D(frD, R)); | ||
41 | } | ||
diff --git a/arch/ppc/math-emu/fsubs.c b/arch/ppc/math-emu/fsubs.c deleted file mode 100644 index 3428117dfe8c..000000000000 --- a/arch/ppc/math-emu/fsubs.c +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | fsubs(void *frD, void *frA, void *frB) | ||
11 | { | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_D(B); | ||
14 | FP_DECL_D(R); | ||
15 | int ret = 0; | ||
16 | |||
17 | #ifdef DEBUG | ||
18 | printk("%s: %p %p %p\n", __FUNCTION__, frD, frA, frB); | ||
19 | #endif | ||
20 | |||
21 | __FP_UNPACK_D(A, frA); | ||
22 | __FP_UNPACK_D(B, frB); | ||
23 | |||
24 | #ifdef DEBUG | ||
25 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
26 | printk("B: %ld %lu %lu %ld (%ld)\n", B_s, B_f1, B_f0, B_e, B_c); | ||
27 | #endif | ||
28 | |||
29 | if (B_c != FP_CLS_NAN) | ||
30 | B_s ^= 1; | ||
31 | |||
32 | if (A_s != B_s && A_c == FP_CLS_INF && B_c == FP_CLS_INF) | ||
33 | ret |= EFLAG_VXISI; | ||
34 | |||
35 | FP_ADD_D(R, A, B); | ||
36 | |||
37 | #ifdef DEBUG | ||
38 | printk("D: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
39 | #endif | ||
40 | |||
41 | return (ret | __FP_PACK_DS(frD, R)); | ||
42 | } | ||
diff --git a/arch/ppc/math-emu/lfd.c b/arch/ppc/math-emu/lfd.c deleted file mode 100644 index 7d38101c329b..000000000000 --- a/arch/ppc/math-emu/lfd.c +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "sfp-machine.h" | ||
6 | #include "double.h" | ||
7 | |||
8 | int | ||
9 | lfd(void *frD, void *ea) | ||
10 | { | ||
11 | if (copy_from_user(frD, ea, sizeof(double))) | ||
12 | return -EFAULT; | ||
13 | #ifdef DEBUG | ||
14 | printk("%s: D %p, ea %p: ", __FUNCTION__, frD, ea); | ||
15 | dump_double(frD); | ||
16 | printk("\n"); | ||
17 | #endif | ||
18 | return 0; | ||
19 | } | ||
diff --git a/arch/ppc/math-emu/lfs.c b/arch/ppc/math-emu/lfs.c deleted file mode 100644 index c86dee3d7655..000000000000 --- a/arch/ppc/math-emu/lfs.c +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | lfs(void *frD, void *ea) | ||
11 | { | ||
12 | FP_DECL_D(R); | ||
13 | FP_DECL_S(A); | ||
14 | float f; | ||
15 | |||
16 | #ifdef DEBUG | ||
17 | printk("%s: D %p, ea %p\n", __FUNCTION__, frD, ea); | ||
18 | #endif | ||
19 | |||
20 | if (copy_from_user(&f, ea, sizeof(float))) | ||
21 | return -EFAULT; | ||
22 | |||
23 | __FP_UNPACK_S(A, &f); | ||
24 | |||
25 | #ifdef DEBUG | ||
26 | printk("A: %ld %lu %ld (%ld) [%08lx]\n", A_s, A_f, A_e, A_c, | ||
27 | *(unsigned long *)&f); | ||
28 | #endif | ||
29 | |||
30 | FP_CONV(D, S, 2, 1, R, A); | ||
31 | |||
32 | #ifdef DEBUG | ||
33 | printk("R: %ld %lu %lu %ld (%ld)\n", R_s, R_f1, R_f0, R_e, R_c); | ||
34 | #endif | ||
35 | |||
36 | return __FP_PACK_D(frD, R); | ||
37 | } | ||
diff --git a/arch/ppc/math-emu/math.c b/arch/ppc/math-emu/math.c deleted file mode 100644 index 589153472761..000000000000 --- a/arch/ppc/math-emu/math.c +++ /dev/null | |||
@@ -1,483 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1999 Eddie C. Dost (ecd@atecom.com) | ||
3 | */ | ||
4 | |||
5 | #include <linux/config.h> | ||
6 | #include <linux/types.h> | ||
7 | #include <linux/sched.h> | ||
8 | |||
9 | #include <asm/uaccess.h> | ||
10 | #include <asm/reg.h> | ||
11 | |||
12 | #include "sfp-machine.h" | ||
13 | #include "double.h" | ||
14 | |||
15 | #define FLOATFUNC(x) extern int x(void *, void *, void *, void *) | ||
16 | |||
17 | FLOATFUNC(fadd); | ||
18 | FLOATFUNC(fadds); | ||
19 | FLOATFUNC(fdiv); | ||
20 | FLOATFUNC(fdivs); | ||
21 | FLOATFUNC(fmul); | ||
22 | FLOATFUNC(fmuls); | ||
23 | FLOATFUNC(fsub); | ||
24 | FLOATFUNC(fsubs); | ||
25 | |||
26 | FLOATFUNC(fmadd); | ||
27 | FLOATFUNC(fmadds); | ||
28 | FLOATFUNC(fmsub); | ||
29 | FLOATFUNC(fmsubs); | ||
30 | FLOATFUNC(fnmadd); | ||
31 | FLOATFUNC(fnmadds); | ||
32 | FLOATFUNC(fnmsub); | ||
33 | FLOATFUNC(fnmsubs); | ||
34 | |||
35 | FLOATFUNC(fctiw); | ||
36 | FLOATFUNC(fctiwz); | ||
37 | FLOATFUNC(frsp); | ||
38 | |||
39 | FLOATFUNC(fcmpo); | ||
40 | FLOATFUNC(fcmpu); | ||
41 | |||
42 | FLOATFUNC(mcrfs); | ||
43 | FLOATFUNC(mffs); | ||
44 | FLOATFUNC(mtfsb0); | ||
45 | FLOATFUNC(mtfsb1); | ||
46 | FLOATFUNC(mtfsf); | ||
47 | FLOATFUNC(mtfsfi); | ||
48 | |||
49 | FLOATFUNC(lfd); | ||
50 | FLOATFUNC(lfs); | ||
51 | |||
52 | FLOATFUNC(stfd); | ||
53 | FLOATFUNC(stfs); | ||
54 | FLOATFUNC(stfiwx); | ||
55 | |||
56 | FLOATFUNC(fabs); | ||
57 | FLOATFUNC(fmr); | ||
58 | FLOATFUNC(fnabs); | ||
59 | FLOATFUNC(fneg); | ||
60 | |||
61 | /* Optional */ | ||
62 | FLOATFUNC(fres); | ||
63 | FLOATFUNC(frsqrte); | ||
64 | FLOATFUNC(fsel); | ||
65 | FLOATFUNC(fsqrt); | ||
66 | FLOATFUNC(fsqrts); | ||
67 | |||
68 | |||
69 | #define OP31 0x1f /* 31 */ | ||
70 | #define LFS 0x30 /* 48 */ | ||
71 | #define LFSU 0x31 /* 49 */ | ||
72 | #define LFD 0x32 /* 50 */ | ||
73 | #define LFDU 0x33 /* 51 */ | ||
74 | #define STFS 0x34 /* 52 */ | ||
75 | #define STFSU 0x35 /* 53 */ | ||
76 | #define STFD 0x36 /* 54 */ | ||
77 | #define STFDU 0x37 /* 55 */ | ||
78 | #define OP59 0x3b /* 59 */ | ||
79 | #define OP63 0x3f /* 63 */ | ||
80 | |||
81 | /* Opcode 31: */ | ||
82 | /* X-Form: */ | ||
83 | #define LFSX 0x217 /* 535 */ | ||
84 | #define LFSUX 0x237 /* 567 */ | ||
85 | #define LFDX 0x257 /* 599 */ | ||
86 | #define LFDUX 0x277 /* 631 */ | ||
87 | #define STFSX 0x297 /* 663 */ | ||
88 | #define STFSUX 0x2b7 /* 695 */ | ||
89 | #define STFDX 0x2d7 /* 727 */ | ||
90 | #define STFDUX 0x2f7 /* 759 */ | ||
91 | #define STFIWX 0x3d7 /* 983 */ | ||
92 | |||
93 | /* Opcode 59: */ | ||
94 | /* A-Form: */ | ||
95 | #define FDIVS 0x012 /* 18 */ | ||
96 | #define FSUBS 0x014 /* 20 */ | ||
97 | #define FADDS 0x015 /* 21 */ | ||
98 | #define FSQRTS 0x016 /* 22 */ | ||
99 | #define FRES 0x018 /* 24 */ | ||
100 | #define FMULS 0x019 /* 25 */ | ||
101 | #define FMSUBS 0x01c /* 28 */ | ||
102 | #define FMADDS 0x01d /* 29 */ | ||
103 | #define FNMSUBS 0x01e /* 30 */ | ||
104 | #define FNMADDS 0x01f /* 31 */ | ||
105 | |||
106 | /* Opcode 63: */ | ||
107 | /* A-Form: */ | ||
108 | #define FDIV 0x012 /* 18 */ | ||
109 | #define FSUB 0x014 /* 20 */ | ||
110 | #define FADD 0x015 /* 21 */ | ||
111 | #define FSQRT 0x016 /* 22 */ | ||
112 | #define FSEL 0x017 /* 23 */ | ||
113 | #define FMUL 0x019 /* 25 */ | ||
114 | #define FRSQRTE 0x01a /* 26 */ | ||
115 | #define FMSUB 0x01c /* 28 */ | ||
116 | #define FMADD 0x01d /* 29 */ | ||
117 | #define FNMSUB 0x01e /* 30 */ | ||
118 | #define FNMADD 0x01f /* 31 */ | ||
119 | |||
120 | /* X-Form: */ | ||
121 | #define FCMPU 0x000 /* 0 */ | ||
122 | #define FRSP 0x00c /* 12 */ | ||
123 | #define FCTIW 0x00e /* 14 */ | ||
124 | #define FCTIWZ 0x00f /* 15 */ | ||
125 | #define FCMPO 0x020 /* 32 */ | ||
126 | #define MTFSB1 0x026 /* 38 */ | ||
127 | #define FNEG 0x028 /* 40 */ | ||
128 | #define MCRFS 0x040 /* 64 */ | ||
129 | #define MTFSB0 0x046 /* 70 */ | ||
130 | #define FMR 0x048 /* 72 */ | ||
131 | #define MTFSFI 0x086 /* 134 */ | ||
132 | #define FNABS 0x088 /* 136 */ | ||
133 | #define FABS 0x108 /* 264 */ | ||
134 | #define MFFS 0x247 /* 583 */ | ||
135 | #define MTFSF 0x2c7 /* 711 */ | ||
136 | |||
137 | |||
138 | #define AB 2 | ||
139 | #define AC 3 | ||
140 | #define ABC 4 | ||
141 | #define D 5 | ||
142 | #define DU 6 | ||
143 | #define X 7 | ||
144 | #define XA 8 | ||
145 | #define XB 9 | ||
146 | #define XCR 11 | ||
147 | #define XCRB 12 | ||
148 | #define XCRI 13 | ||
149 | #define XCRL 16 | ||
150 | #define XE 14 | ||
151 | #define XEU 15 | ||
152 | #define XFLB 10 | ||
153 | |||
154 | #ifdef CONFIG_MATH_EMULATION | ||
155 | static int | ||
156 | record_exception(struct pt_regs *regs, int eflag) | ||
157 | { | ||
158 | u32 fpscr; | ||
159 | |||
160 | fpscr = __FPU_FPSCR; | ||
161 | |||
162 | if (eflag) { | ||
163 | fpscr |= FPSCR_FX; | ||
164 | if (eflag & EFLAG_OVERFLOW) | ||
165 | fpscr |= FPSCR_OX; | ||
166 | if (eflag & EFLAG_UNDERFLOW) | ||
167 | fpscr |= FPSCR_UX; | ||
168 | if (eflag & EFLAG_DIVZERO) | ||
169 | fpscr |= FPSCR_ZX; | ||
170 | if (eflag & EFLAG_INEXACT) | ||
171 | fpscr |= FPSCR_XX; | ||
172 | if (eflag & EFLAG_VXSNAN) | ||
173 | fpscr |= FPSCR_VXSNAN; | ||
174 | if (eflag & EFLAG_VXISI) | ||
175 | fpscr |= FPSCR_VXISI; | ||
176 | if (eflag & EFLAG_VXIDI) | ||
177 | fpscr |= FPSCR_VXIDI; | ||
178 | if (eflag & EFLAG_VXZDZ) | ||
179 | fpscr |= FPSCR_VXZDZ; | ||
180 | if (eflag & EFLAG_VXIMZ) | ||
181 | fpscr |= FPSCR_VXIMZ; | ||
182 | if (eflag & EFLAG_VXVC) | ||
183 | fpscr |= FPSCR_VXVC; | ||
184 | if (eflag & EFLAG_VXSOFT) | ||
185 | fpscr |= FPSCR_VXSOFT; | ||
186 | if (eflag & EFLAG_VXSQRT) | ||
187 | fpscr |= FPSCR_VXSQRT; | ||
188 | if (eflag & EFLAG_VXCVI) | ||
189 | fpscr |= FPSCR_VXCVI; | ||
190 | } | ||
191 | |||
192 | fpscr &= ~(FPSCR_VX); | ||
193 | if (fpscr & (FPSCR_VXSNAN | FPSCR_VXISI | FPSCR_VXIDI | | ||
194 | FPSCR_VXZDZ | FPSCR_VXIMZ | FPSCR_VXVC | | ||
195 | FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI)) | ||
196 | fpscr |= FPSCR_VX; | ||
197 | |||
198 | fpscr &= ~(FPSCR_FEX); | ||
199 | if (((fpscr & FPSCR_VX) && (fpscr & FPSCR_VE)) || | ||
200 | ((fpscr & FPSCR_OX) && (fpscr & FPSCR_OE)) || | ||
201 | ((fpscr & FPSCR_UX) && (fpscr & FPSCR_UE)) || | ||
202 | ((fpscr & FPSCR_ZX) && (fpscr & FPSCR_ZE)) || | ||
203 | ((fpscr & FPSCR_XX) && (fpscr & FPSCR_XE))) | ||
204 | fpscr |= FPSCR_FEX; | ||
205 | |||
206 | __FPU_FPSCR = fpscr; | ||
207 | |||
208 | return (fpscr & FPSCR_FEX) ? 1 : 0; | ||
209 | } | ||
210 | #endif /* CONFIG_MATH_EMULATION */ | ||
211 | |||
212 | int | ||
213 | do_mathemu(struct pt_regs *regs) | ||
214 | { | ||
215 | void *op0 = 0, *op1 = 0, *op2 = 0, *op3 = 0; | ||
216 | unsigned long pc = regs->nip; | ||
217 | signed short sdisp; | ||
218 | u32 insn = 0; | ||
219 | int idx = 0; | ||
220 | #ifdef CONFIG_MATH_EMULATION | ||
221 | int (*func)(void *, void *, void *, void *); | ||
222 | int type = 0; | ||
223 | int eflag, trap; | ||
224 | #endif | ||
225 | |||
226 | if (get_user(insn, (u32 *)pc)) | ||
227 | return -EFAULT; | ||
228 | |||
229 | #ifndef CONFIG_MATH_EMULATION | ||
230 | switch (insn >> 26) { | ||
231 | case LFD: | ||
232 | idx = (insn >> 16) & 0x1f; | ||
233 | sdisp = (insn & 0xffff); | ||
234 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
235 | op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp); | ||
236 | lfd(op0, op1, op2, op3); | ||
237 | break; | ||
238 | case LFDU: | ||
239 | idx = (insn >> 16) & 0x1f; | ||
240 | sdisp = (insn & 0xffff); | ||
241 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
242 | op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp); | ||
243 | lfd(op0, op1, op2, op3); | ||
244 | regs->gpr[idx] = (unsigned long)op1; | ||
245 | break; | ||
246 | case STFD: | ||
247 | idx = (insn >> 16) & 0x1f; | ||
248 | sdisp = (insn & 0xffff); | ||
249 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
250 | op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp); | ||
251 | stfd(op0, op1, op2, op3); | ||
252 | break; | ||
253 | case STFDU: | ||
254 | idx = (insn >> 16) & 0x1f; | ||
255 | sdisp = (insn & 0xffff); | ||
256 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
257 | op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp); | ||
258 | stfd(op0, op1, op2, op3); | ||
259 | regs->gpr[idx] = (unsigned long)op1; | ||
260 | break; | ||
261 | case OP63: | ||
262 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
263 | op1 = (void *)¤t->thread.fpr[(insn >> 11) & 0x1f]; | ||
264 | fmr(op0, op1, op2, op3); | ||
265 | break; | ||
266 | default: | ||
267 | goto illegal; | ||
268 | } | ||
269 | #else /* CONFIG_MATH_EMULATION */ | ||
270 | switch (insn >> 26) { | ||
271 | case LFS: func = lfs; type = D; break; | ||
272 | case LFSU: func = lfs; type = DU; break; | ||
273 | case LFD: func = lfd; type = D; break; | ||
274 | case LFDU: func = lfd; type = DU; break; | ||
275 | case STFS: func = stfs; type = D; break; | ||
276 | case STFSU: func = stfs; type = DU; break; | ||
277 | case STFD: func = stfd; type = D; break; | ||
278 | case STFDU: func = stfd; type = DU; break; | ||
279 | |||
280 | case OP31: | ||
281 | switch ((insn >> 1) & 0x3ff) { | ||
282 | case LFSX: func = lfs; type = XE; break; | ||
283 | case LFSUX: func = lfs; type = XEU; break; | ||
284 | case LFDX: func = lfd; type = XE; break; | ||
285 | case LFDUX: func = lfd; type = XEU; break; | ||
286 | case STFSX: func = stfs; type = XE; break; | ||
287 | case STFSUX: func = stfs; type = XEU; break; | ||
288 | case STFDX: func = stfd; type = XE; break; | ||
289 | case STFDUX: func = stfd; type = XEU; break; | ||
290 | case STFIWX: func = stfiwx; type = XE; break; | ||
291 | default: | ||
292 | goto illegal; | ||
293 | } | ||
294 | break; | ||
295 | |||
296 | case OP59: | ||
297 | switch ((insn >> 1) & 0x1f) { | ||
298 | case FDIVS: func = fdivs; type = AB; break; | ||
299 | case FSUBS: func = fsubs; type = AB; break; | ||
300 | case FADDS: func = fadds; type = AB; break; | ||
301 | case FSQRTS: func = fsqrts; type = AB; break; | ||
302 | case FRES: func = fres; type = AB; break; | ||
303 | case FMULS: func = fmuls; type = AC; break; | ||
304 | case FMSUBS: func = fmsubs; type = ABC; break; | ||
305 | case FMADDS: func = fmadds; type = ABC; break; | ||
306 | case FNMSUBS: func = fnmsubs; type = ABC; break; | ||
307 | case FNMADDS: func = fnmadds; type = ABC; break; | ||
308 | default: | ||
309 | goto illegal; | ||
310 | } | ||
311 | break; | ||
312 | |||
313 | case OP63: | ||
314 | if (insn & 0x20) { | ||
315 | switch ((insn >> 1) & 0x1f) { | ||
316 | case FDIV: func = fdiv; type = AB; break; | ||
317 | case FSUB: func = fsub; type = AB; break; | ||
318 | case FADD: func = fadd; type = AB; break; | ||
319 | case FSQRT: func = fsqrt; type = AB; break; | ||
320 | case FSEL: func = fsel; type = ABC; break; | ||
321 | case FMUL: func = fmul; type = AC; break; | ||
322 | case FRSQRTE: func = frsqrte; type = AB; break; | ||
323 | case FMSUB: func = fmsub; type = ABC; break; | ||
324 | case FMADD: func = fmadd; type = ABC; break; | ||
325 | case FNMSUB: func = fnmsub; type = ABC; break; | ||
326 | case FNMADD: func = fnmadd; type = ABC; break; | ||
327 | default: | ||
328 | goto illegal; | ||
329 | } | ||
330 | break; | ||
331 | } | ||
332 | |||
333 | switch ((insn >> 1) & 0x3ff) { | ||
334 | case FCMPU: func = fcmpu; type = XCR; break; | ||
335 | case FRSP: func = frsp; type = XB; break; | ||
336 | case FCTIW: func = fctiw; type = XB; break; | ||
337 | case FCTIWZ: func = fctiwz; type = XB; break; | ||
338 | case FCMPO: func = fcmpo; type = XCR; break; | ||
339 | case MTFSB1: func = mtfsb1; type = XCRB; break; | ||
340 | case FNEG: func = fneg; type = XB; break; | ||
341 | case MCRFS: func = mcrfs; type = XCRL; break; | ||
342 | case MTFSB0: func = mtfsb0; type = XCRB; break; | ||
343 | case FMR: func = fmr; type = XB; break; | ||
344 | case MTFSFI: func = mtfsfi; type = XCRI; break; | ||
345 | case FNABS: func = fnabs; type = XB; break; | ||
346 | case FABS: func = fabs; type = XB; break; | ||
347 | case MFFS: func = mffs; type = X; break; | ||
348 | case MTFSF: func = mtfsf; type = XFLB; break; | ||
349 | default: | ||
350 | goto illegal; | ||
351 | } | ||
352 | break; | ||
353 | |||
354 | default: | ||
355 | goto illegal; | ||
356 | } | ||
357 | |||
358 | switch (type) { | ||
359 | case AB: | ||
360 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
361 | op1 = (void *)¤t->thread.fpr[(insn >> 16) & 0x1f]; | ||
362 | op2 = (void *)¤t->thread.fpr[(insn >> 11) & 0x1f]; | ||
363 | break; | ||
364 | |||
365 | case AC: | ||
366 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
367 | op1 = (void *)¤t->thread.fpr[(insn >> 16) & 0x1f]; | ||
368 | op2 = (void *)¤t->thread.fpr[(insn >> 6) & 0x1f]; | ||
369 | break; | ||
370 | |||
371 | case ABC: | ||
372 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
373 | op1 = (void *)¤t->thread.fpr[(insn >> 16) & 0x1f]; | ||
374 | op2 = (void *)¤t->thread.fpr[(insn >> 11) & 0x1f]; | ||
375 | op3 = (void *)¤t->thread.fpr[(insn >> 6) & 0x1f]; | ||
376 | break; | ||
377 | |||
378 | case D: | ||
379 | idx = (insn >> 16) & 0x1f; | ||
380 | sdisp = (insn & 0xffff); | ||
381 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
382 | op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp); | ||
383 | break; | ||
384 | |||
385 | case DU: | ||
386 | idx = (insn >> 16) & 0x1f; | ||
387 | if (!idx) | ||
388 | goto illegal; | ||
389 | |||
390 | sdisp = (insn & 0xffff); | ||
391 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
392 | op1 = (void *)(regs->gpr[idx] + sdisp); | ||
393 | break; | ||
394 | |||
395 | case X: | ||
396 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
397 | break; | ||
398 | |||
399 | case XA: | ||
400 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
401 | op1 = (void *)¤t->thread.fpr[(insn >> 16) & 0x1f]; | ||
402 | break; | ||
403 | |||
404 | case XB: | ||
405 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
406 | op1 = (void *)¤t->thread.fpr[(insn >> 11) & 0x1f]; | ||
407 | break; | ||
408 | |||
409 | case XE: | ||
410 | idx = (insn >> 16) & 0x1f; | ||
411 | if (!idx) | ||
412 | goto illegal; | ||
413 | |||
414 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
415 | op1 = (void *)(regs->gpr[idx] + regs->gpr[(insn >> 11) & 0x1f]); | ||
416 | break; | ||
417 | |||
418 | case XEU: | ||
419 | idx = (insn >> 16) & 0x1f; | ||
420 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
421 | op1 = (void *)((idx ? regs->gpr[idx] : 0) | ||
422 | + regs->gpr[(insn >> 11) & 0x1f]); | ||
423 | break; | ||
424 | |||
425 | case XCR: | ||
426 | op0 = (void *)®s->ccr; | ||
427 | op1 = (void *)((insn >> 23) & 0x7); | ||
428 | op2 = (void *)¤t->thread.fpr[(insn >> 16) & 0x1f]; | ||
429 | op3 = (void *)¤t->thread.fpr[(insn >> 11) & 0x1f]; | ||
430 | break; | ||
431 | |||
432 | case XCRL: | ||
433 | op0 = (void *)®s->ccr; | ||
434 | op1 = (void *)((insn >> 23) & 0x7); | ||
435 | op2 = (void *)((insn >> 18) & 0x7); | ||
436 | break; | ||
437 | |||
438 | case XCRB: | ||
439 | op0 = (void *)((insn >> 21) & 0x1f); | ||
440 | break; | ||
441 | |||
442 | case XCRI: | ||
443 | op0 = (void *)((insn >> 23) & 0x7); | ||
444 | op1 = (void *)((insn >> 12) & 0xf); | ||
445 | break; | ||
446 | |||
447 | case XFLB: | ||
448 | op0 = (void *)((insn >> 17) & 0xff); | ||
449 | op1 = (void *)¤t->thread.fpr[(insn >> 11) & 0x1f]; | ||
450 | break; | ||
451 | |||
452 | default: | ||
453 | goto illegal; | ||
454 | } | ||
455 | |||
456 | eflag = func(op0, op1, op2, op3); | ||
457 | |||
458 | if (insn & 1) { | ||
459 | regs->ccr &= ~(0x0f000000); | ||
460 | regs->ccr |= (__FPU_FPSCR >> 4) & 0x0f000000; | ||
461 | } | ||
462 | |||
463 | trap = record_exception(regs, eflag); | ||
464 | if (trap) | ||
465 | return 1; | ||
466 | |||
467 | switch (type) { | ||
468 | case DU: | ||
469 | case XEU: | ||
470 | regs->gpr[idx] = (unsigned long)op1; | ||
471 | break; | ||
472 | |||
473 | default: | ||
474 | break; | ||
475 | } | ||
476 | #endif /* CONFIG_MATH_EMULATION */ | ||
477 | |||
478 | regs->nip += 4; | ||
479 | return 0; | ||
480 | |||
481 | illegal: | ||
482 | return -ENOSYS; | ||
483 | } | ||
diff --git a/arch/ppc/math-emu/mcrfs.c b/arch/ppc/math-emu/mcrfs.c deleted file mode 100644 index 106dd912914b..000000000000 --- a/arch/ppc/math-emu/mcrfs.c +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | |||
7 | int | ||
8 | mcrfs(u32 *ccr, u32 crfD, u32 crfS) | ||
9 | { | ||
10 | u32 value, clear; | ||
11 | |||
12 | #ifdef DEBUG | ||
13 | printk("%s: %p (%08x) %d %d\n", __FUNCTION__, ccr, *ccr, crfD, crfS); | ||
14 | #endif | ||
15 | |||
16 | clear = 15 << ((7 - crfS) << 2); | ||
17 | if (!crfS) | ||
18 | clear = 0x90000000; | ||
19 | |||
20 | value = (__FPU_FPSCR >> ((7 - crfS) << 2)) & 15; | ||
21 | __FPU_FPSCR &= ~(clear); | ||
22 | |||
23 | *ccr &= ~(15 << ((7 - crfD) << 2)); | ||
24 | *ccr |= (value << ((7 - crfD) << 2)); | ||
25 | |||
26 | #ifdef DEBUG | ||
27 | printk("CR: %08x\n", __FUNCTION__, *ccr); | ||
28 | #endif | ||
29 | |||
30 | return 0; | ||
31 | } | ||
diff --git a/arch/ppc/math-emu/mffs.c b/arch/ppc/math-emu/mffs.c deleted file mode 100644 index f477c9170e75..000000000000 --- a/arch/ppc/math-emu/mffs.c +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | |||
7 | int | ||
8 | mffs(u32 *frD) | ||
9 | { | ||
10 | frD[1] = __FPU_FPSCR; | ||
11 | |||
12 | #ifdef DEBUG | ||
13 | printk("%s: frD %p: %08x.%08x\n", __FUNCTION__, frD, frD[0], frD[1]); | ||
14 | #endif | ||
15 | |||
16 | return 0; | ||
17 | } | ||
diff --git a/arch/ppc/math-emu/mtfsb0.c b/arch/ppc/math-emu/mtfsb0.c deleted file mode 100644 index 99bfd80f4af3..000000000000 --- a/arch/ppc/math-emu/mtfsb0.c +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | |||
7 | int | ||
8 | mtfsb0(int crbD) | ||
9 | { | ||
10 | if ((crbD != 1) && (crbD != 2)) | ||
11 | __FPU_FPSCR &= ~(1 << (31 - crbD)); | ||
12 | |||
13 | #ifdef DEBUG | ||
14 | printk("%s: %d %08lx\n", __FUNCTION__, crbD, __FPU_FPSCR); | ||
15 | #endif | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/arch/ppc/math-emu/mtfsb1.c b/arch/ppc/math-emu/mtfsb1.c deleted file mode 100644 index 3d9e7ed92d2b..000000000000 --- a/arch/ppc/math-emu/mtfsb1.c +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | |||
7 | int | ||
8 | mtfsb1(int crbD) | ||
9 | { | ||
10 | if ((crbD != 1) && (crbD != 2)) | ||
11 | __FPU_FPSCR |= (1 << (31 - crbD)); | ||
12 | |||
13 | #ifdef DEBUG | ||
14 | printk("%s: %d %08lx\n", __FUNCTION__, crbD, __FPU_FPSCR); | ||
15 | #endif | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/arch/ppc/math-emu/mtfsf.c b/arch/ppc/math-emu/mtfsf.c deleted file mode 100644 index d70cf714994c..000000000000 --- a/arch/ppc/math-emu/mtfsf.c +++ /dev/null | |||
@@ -1,45 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | |||
7 | int | ||
8 | mtfsf(unsigned int FM, u32 *frB) | ||
9 | { | ||
10 | u32 mask; | ||
11 | |||
12 | if (FM == 0) | ||
13 | return 0; | ||
14 | |||
15 | if (FM == 0xff) | ||
16 | mask = 0x9fffffff; | ||
17 | else { | ||
18 | mask = 0; | ||
19 | if (FM & (1 << 0)) | ||
20 | mask |= 0x90000000; | ||
21 | if (FM & (1 << 1)) | ||
22 | mask |= 0x0f000000; | ||
23 | if (FM & (1 << 2)) | ||
24 | mask |= 0x00f00000; | ||
25 | if (FM & (1 << 3)) | ||
26 | mask |= 0x000f0000; | ||
27 | if (FM & (1 << 4)) | ||
28 | mask |= 0x0000f000; | ||
29 | if (FM & (1 << 5)) | ||
30 | mask |= 0x00000f00; | ||
31 | if (FM & (1 << 6)) | ||
32 | mask |= 0x000000f0; | ||
33 | if (FM & (1 << 7)) | ||
34 | mask |= 0x0000000f; | ||
35 | } | ||
36 | |||
37 | __FPU_FPSCR &= ~(mask); | ||
38 | __FPU_FPSCR |= (frB[1] & mask); | ||
39 | |||
40 | #ifdef DEBUG | ||
41 | printk("%s: %02x %p: %08lx\n", __FUNCTION__, FM, frB, __FPU_FPSCR); | ||
42 | #endif | ||
43 | |||
44 | return 0; | ||
45 | } | ||
diff --git a/arch/ppc/math-emu/mtfsfi.c b/arch/ppc/math-emu/mtfsfi.c deleted file mode 100644 index 71df854baa7e..000000000000 --- a/arch/ppc/math-emu/mtfsfi.c +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | |||
7 | int | ||
8 | mtfsfi(unsigned int crfD, unsigned int IMM) | ||
9 | { | ||
10 | u32 mask = 0xf; | ||
11 | |||
12 | if (!crfD) | ||
13 | mask = 9; | ||
14 | |||
15 | __FPU_FPSCR &= ~(mask << ((7 - crfD) << 2)); | ||
16 | __FPU_FPSCR |= (IMM & 0xf) << ((7 - crfD) << 2); | ||
17 | |||
18 | #ifdef DEBUG | ||
19 | printk("%s: %d %x: %08lx\n", __FUNCTION__, crfD, IMM, __FPU_FPSCR); | ||
20 | #endif | ||
21 | |||
22 | return 0; | ||
23 | } | ||
diff --git a/arch/ppc/math-emu/op-1.h b/arch/ppc/math-emu/op-1.h deleted file mode 100644 index c92fa95f562e..000000000000 --- a/arch/ppc/math-emu/op-1.h +++ /dev/null | |||
@@ -1,245 +0,0 @@ | |||
1 | /* | ||
2 | * Basic one-word fraction declaration and manipulation. | ||
3 | */ | ||
4 | |||
5 | #define _FP_FRAC_DECL_1(X) _FP_W_TYPE X##_f | ||
6 | #define _FP_FRAC_COPY_1(D,S) (D##_f = S##_f) | ||
7 | #define _FP_FRAC_SET_1(X,I) (X##_f = I) | ||
8 | #define _FP_FRAC_HIGH_1(X) (X##_f) | ||
9 | #define _FP_FRAC_LOW_1(X) (X##_f) | ||
10 | #define _FP_FRAC_WORD_1(X,w) (X##_f) | ||
11 | |||
12 | #define _FP_FRAC_ADDI_1(X,I) (X##_f += I) | ||
13 | #define _FP_FRAC_SLL_1(X,N) \ | ||
14 | do { \ | ||
15 | if (__builtin_constant_p(N) && (N) == 1) \ | ||
16 | X##_f += X##_f; \ | ||
17 | else \ | ||
18 | X##_f <<= (N); \ | ||
19 | } while (0) | ||
20 | #define _FP_FRAC_SRL_1(X,N) (X##_f >>= N) | ||
21 | |||
22 | /* Right shift with sticky-lsb. */ | ||
23 | #define _FP_FRAC_SRS_1(X,N,sz) __FP_FRAC_SRS_1(X##_f, N, sz) | ||
24 | |||
25 | #define __FP_FRAC_SRS_1(X,N,sz) \ | ||
26 | (X = (X >> (N) | (__builtin_constant_p(N) && (N) == 1 \ | ||
27 | ? X & 1 : (X << (_FP_W_TYPE_SIZE - (N))) != 0))) | ||
28 | |||
29 | #define _FP_FRAC_ADD_1(R,X,Y) (R##_f = X##_f + Y##_f) | ||
30 | #define _FP_FRAC_SUB_1(R,X,Y) (R##_f = X##_f - Y##_f) | ||
31 | #define _FP_FRAC_CLZ_1(z, X) __FP_CLZ(z, X##_f) | ||
32 | |||
33 | /* Predicates */ | ||
34 | #define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE)X##_f < 0) | ||
35 | #define _FP_FRAC_ZEROP_1(X) (X##_f == 0) | ||
36 | #define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs) | ||
37 | #define _FP_FRAC_EQ_1(X, Y) (X##_f == Y##_f) | ||
38 | #define _FP_FRAC_GE_1(X, Y) (X##_f >= Y##_f) | ||
39 | #define _FP_FRAC_GT_1(X, Y) (X##_f > Y##_f) | ||
40 | |||
41 | #define _FP_ZEROFRAC_1 0 | ||
42 | #define _FP_MINFRAC_1 1 | ||
43 | |||
44 | /* | ||
45 | * Unpack the raw bits of a native fp value. Do not classify or | ||
46 | * normalize the data. | ||
47 | */ | ||
48 | |||
49 | #define _FP_UNPACK_RAW_1(fs, X, val) \ | ||
50 | do { \ | ||
51 | union _FP_UNION_##fs _flo; _flo.flt = (val); \ | ||
52 | \ | ||
53 | X##_f = _flo.bits.frac; \ | ||
54 | X##_e = _flo.bits.exp; \ | ||
55 | X##_s = _flo.bits.sign; \ | ||
56 | } while (0) | ||
57 | |||
58 | |||
59 | /* | ||
60 | * Repack the raw bits of a native fp value. | ||
61 | */ | ||
62 | |||
63 | #define _FP_PACK_RAW_1(fs, val, X) \ | ||
64 | do { \ | ||
65 | union _FP_UNION_##fs _flo; \ | ||
66 | \ | ||
67 | _flo.bits.frac = X##_f; \ | ||
68 | _flo.bits.exp = X##_e; \ | ||
69 | _flo.bits.sign = X##_s; \ | ||
70 | \ | ||
71 | (val) = _flo.flt; \ | ||
72 | } while (0) | ||
73 | |||
74 | |||
75 | /* | ||
76 | * Multiplication algorithms: | ||
77 | */ | ||
78 | |||
79 | /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the | ||
80 | multiplication immediately. */ | ||
81 | |||
82 | #define _FP_MUL_MEAT_1_imm(fs, R, X, Y) \ | ||
83 | do { \ | ||
84 | R##_f = X##_f * Y##_f; \ | ||
85 | /* Normalize since we know where the msb of the multiplicands \ | ||
86 | were (bit B), we know that the msb of the of the product is \ | ||
87 | at either 2B or 2B-1. */ \ | ||
88 | _FP_FRAC_SRS_1(R, _FP_WFRACBITS_##fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
89 | } while (0) | ||
90 | |||
91 | /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ | ||
92 | |||
93 | #define _FP_MUL_MEAT_1_wide(fs, R, X, Y, doit) \ | ||
94 | do { \ | ||
95 | _FP_W_TYPE _Z_f0, _Z_f1; \ | ||
96 | doit(_Z_f1, _Z_f0, X##_f, Y##_f); \ | ||
97 | /* Normalize since we know where the msb of the multiplicands \ | ||
98 | were (bit B), we know that the msb of the of the product is \ | ||
99 | at either 2B or 2B-1. */ \ | ||
100 | _FP_FRAC_SRS_2(_Z, _FP_WFRACBITS_##fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
101 | R##_f = _Z_f0; \ | ||
102 | } while (0) | ||
103 | |||
104 | /* Finally, a simple widening multiply algorithm. What fun! */ | ||
105 | |||
106 | #define _FP_MUL_MEAT_1_hard(fs, R, X, Y) \ | ||
107 | do { \ | ||
108 | _FP_W_TYPE _xh, _xl, _yh, _yl, _z_f0, _z_f1, _a_f0, _a_f1; \ | ||
109 | \ | ||
110 | /* split the words in half */ \ | ||
111 | _xh = X##_f >> (_FP_W_TYPE_SIZE/2); \ | ||
112 | _xl = X##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \ | ||
113 | _yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \ | ||
114 | _yl = Y##_f & (((_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2)) - 1); \ | ||
115 | \ | ||
116 | /* multiply the pieces */ \ | ||
117 | _z_f0 = _xl * _yl; \ | ||
118 | _a_f0 = _xh * _yl; \ | ||
119 | _a_f1 = _xl * _yh; \ | ||
120 | _z_f1 = _xh * _yh; \ | ||
121 | \ | ||
122 | /* reassemble into two full words */ \ | ||
123 | if ((_a_f0 += _a_f1) < _a_f1) \ | ||
124 | _z_f1 += (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE/2); \ | ||
125 | _a_f1 = _a_f0 >> (_FP_W_TYPE_SIZE/2); \ | ||
126 | _a_f0 = _a_f0 << (_FP_W_TYPE_SIZE/2); \ | ||
127 | _FP_FRAC_ADD_2(_z, _z, _a); \ | ||
128 | \ | ||
129 | /* normalize */ \ | ||
130 | _FP_FRAC_SRS_2(_z, _FP_WFRACBITS_##fs - 1, 2*_FP_WFRACBITS_##fs); \ | ||
131 | R##_f = _z_f0; \ | ||
132 | } while (0) | ||
133 | |||
134 | |||
135 | /* | ||
136 | * Division algorithms: | ||
137 | */ | ||
138 | |||
139 | /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the | ||
140 | division immediately. Give this macro either _FP_DIV_HELP_imm for | ||
141 | C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you | ||
142 | choose will depend on what the compiler does with divrem4. */ | ||
143 | |||
144 | #define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \ | ||
145 | do { \ | ||
146 | _FP_W_TYPE _q, _r; \ | ||
147 | X##_f <<= (X##_f < Y##_f \ | ||
148 | ? R##_e--, _FP_WFRACBITS_##fs \ | ||
149 | : _FP_WFRACBITS_##fs - 1); \ | ||
150 | doit(_q, _r, X##_f, Y##_f); \ | ||
151 | R##_f = _q | (_r != 0); \ | ||
152 | } while (0) | ||
153 | |||
154 | /* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd | ||
155 | that may be useful in this situation. This first is for a primitive | ||
156 | that requires normalization, the second for one that does not. Look | ||
157 | for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */ | ||
158 | |||
159 | #define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \ | ||
160 | do { \ | ||
161 | _FP_W_TYPE _nh, _nl, _q, _r; \ | ||
162 | \ | ||
163 | /* Normalize Y -- i.e. make the most significant bit set. */ \ | ||
164 | Y##_f <<= _FP_WFRACXBITS_##fs - 1; \ | ||
165 | \ | ||
166 | /* Shift X op correspondingly high, that is, up one full word. */ \ | ||
167 | if (X##_f <= Y##_f) \ | ||
168 | { \ | ||
169 | _nl = 0; \ | ||
170 | _nh = X##_f; \ | ||
171 | } \ | ||
172 | else \ | ||
173 | { \ | ||
174 | R##_e++; \ | ||
175 | _nl = X##_f << (_FP_W_TYPE_SIZE-1); \ | ||
176 | _nh = X##_f >> 1; \ | ||
177 | } \ | ||
178 | \ | ||
179 | udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \ | ||
180 | R##_f = _q | (_r != 0); \ | ||
181 | } while (0) | ||
182 | |||
183 | #define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \ | ||
184 | do { \ | ||
185 | _FP_W_TYPE _nh, _nl, _q, _r; \ | ||
186 | if (X##_f < Y##_f) \ | ||
187 | { \ | ||
188 | R##_e--; \ | ||
189 | _nl = X##_f << _FP_WFRACBITS_##fs; \ | ||
190 | _nh = X##_f >> _FP_WFRACXBITS_##fs; \ | ||
191 | } \ | ||
192 | else \ | ||
193 | { \ | ||
194 | _nl = X##_f << (_FP_WFRACBITS_##fs - 1); \ | ||
195 | _nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \ | ||
196 | } \ | ||
197 | udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \ | ||
198 | R##_f = _q | (_r != 0); \ | ||
199 | } while (0) | ||
200 | |||
201 | |||
202 | /* | ||
203 | * Square root algorithms: | ||
204 | * We have just one right now, maybe Newton approximation | ||
205 | * should be added for those machines where division is fast. | ||
206 | */ | ||
207 | |||
208 | #define _FP_SQRT_MEAT_1(R, S, T, X, q) \ | ||
209 | do { \ | ||
210 | while (q) \ | ||
211 | { \ | ||
212 | T##_f = S##_f + q; \ | ||
213 | if (T##_f <= X##_f) \ | ||
214 | { \ | ||
215 | S##_f = T##_f + q; \ | ||
216 | X##_f -= T##_f; \ | ||
217 | R##_f += q; \ | ||
218 | } \ | ||
219 | _FP_FRAC_SLL_1(X, 1); \ | ||
220 | q >>= 1; \ | ||
221 | } \ | ||
222 | } while (0) | ||
223 | |||
224 | /* | ||
225 | * Assembly/disassembly for converting to/from integral types. | ||
226 | * No shifting or overflow handled here. | ||
227 | */ | ||
228 | |||
229 | #define _FP_FRAC_ASSEMBLE_1(r, X, rsize) (r = X##_f) | ||
230 | #define _FP_FRAC_DISASSEMBLE_1(X, r, rsize) (X##_f = r) | ||
231 | |||
232 | |||
233 | /* | ||
234 | * Convert FP values between word sizes | ||
235 | */ | ||
236 | |||
237 | #define _FP_FRAC_CONV_1_1(dfs, sfs, D, S) \ | ||
238 | do { \ | ||
239 | D##_f = S##_f; \ | ||
240 | if (_FP_WFRACBITS_##sfs > _FP_WFRACBITS_##dfs) \ | ||
241 | _FP_FRAC_SRS_1(D, (_FP_WFRACBITS_##sfs-_FP_WFRACBITS_##dfs), \ | ||
242 | _FP_WFRACBITS_##sfs); \ | ||
243 | else \ | ||
244 | D##_f <<= _FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs; \ | ||
245 | } while (0) | ||
diff --git a/arch/ppc/math-emu/op-2.h b/arch/ppc/math-emu/op-2.h deleted file mode 100644 index b9b06b4c6ea1..000000000000 --- a/arch/ppc/math-emu/op-2.h +++ /dev/null | |||
@@ -1,433 +0,0 @@ | |||
1 | /* | ||
2 | * Basic two-word fraction declaration and manipulation. | ||
3 | */ | ||
4 | |||
5 | #define _FP_FRAC_DECL_2(X) _FP_W_TYPE X##_f0, X##_f1 | ||
6 | #define _FP_FRAC_COPY_2(D,S) (D##_f0 = S##_f0, D##_f1 = S##_f1) | ||
7 | #define _FP_FRAC_SET_2(X,I) __FP_FRAC_SET_2(X, I) | ||
8 | #define _FP_FRAC_HIGH_2(X) (X##_f1) | ||
9 | #define _FP_FRAC_LOW_2(X) (X##_f0) | ||
10 | #define _FP_FRAC_WORD_2(X,w) (X##_f##w) | ||
11 | |||
12 | #define _FP_FRAC_SLL_2(X,N) \ | ||
13 | do { \ | ||
14 | if ((N) < _FP_W_TYPE_SIZE) \ | ||
15 | { \ | ||
16 | if (__builtin_constant_p(N) && (N) == 1) \ | ||
17 | { \ | ||
18 | X##_f1 = X##_f1 + X##_f1 + (((_FP_WS_TYPE)(X##_f0)) < 0); \ | ||
19 | X##_f0 += X##_f0; \ | ||
20 | } \ | ||
21 | else \ | ||
22 | { \ | ||
23 | X##_f1 = X##_f1 << (N) | X##_f0 >> (_FP_W_TYPE_SIZE - (N)); \ | ||
24 | X##_f0 <<= (N); \ | ||
25 | } \ | ||
26 | } \ | ||
27 | else \ | ||
28 | { \ | ||
29 | X##_f1 = X##_f0 << ((N) - _FP_W_TYPE_SIZE); \ | ||
30 | X##_f0 = 0; \ | ||
31 | } \ | ||
32 | } while (0) | ||
33 | |||
34 | #define _FP_FRAC_SRL_2(X,N) \ | ||
35 | do { \ | ||
36 | if ((N) < _FP_W_TYPE_SIZE) \ | ||
37 | { \ | ||
38 | X##_f0 = X##_f0 >> (N) | X##_f1 << (_FP_W_TYPE_SIZE - (N)); \ | ||
39 | X##_f1 >>= (N); \ | ||
40 | } \ | ||
41 | else \ | ||
42 | { \ | ||
43 | X##_f0 = X##_f1 >> ((N) - _FP_W_TYPE_SIZE); \ | ||
44 | X##_f1 = 0; \ | ||
45 | } \ | ||
46 | } while (0) | ||
47 | |||
48 | /* Right shift with sticky-lsb. */ | ||
49 | #define _FP_FRAC_SRS_2(X,N,sz) \ | ||
50 | do { \ | ||
51 | if ((N) < _FP_W_TYPE_SIZE) \ | ||
52 | { \ | ||
53 | X##_f0 = (X##_f1 << (_FP_W_TYPE_SIZE - (N)) | X##_f0 >> (N) | \ | ||
54 | (__builtin_constant_p(N) && (N) == 1 \ | ||
55 | ? X##_f0 & 1 \ | ||
56 | : (X##_f0 << (_FP_W_TYPE_SIZE - (N))) != 0)); \ | ||
57 | X##_f1 >>= (N); \ | ||
58 | } \ | ||
59 | else \ | ||
60 | { \ | ||
61 | X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \ | ||
62 | (((X##_f1 << (sz - (N))) | X##_f0) != 0)); \ | ||
63 | X##_f1 = 0; \ | ||
64 | } \ | ||
65 | } while (0) | ||
66 | |||
67 | #define _FP_FRAC_ADDI_2(X,I) \ | ||
68 | __FP_FRAC_ADDI_2(X##_f1, X##_f0, I) | ||
69 | |||
70 | #define _FP_FRAC_ADD_2(R,X,Y) \ | ||
71 | __FP_FRAC_ADD_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0) | ||
72 | |||
73 | #define _FP_FRAC_SUB_2(R,X,Y) \ | ||
74 | __FP_FRAC_SUB_2(R##_f1, R##_f0, X##_f1, X##_f0, Y##_f1, Y##_f0) | ||
75 | |||
76 | #define _FP_FRAC_CLZ_2(R,X) \ | ||
77 | do { \ | ||
78 | if (X##_f1) \ | ||
79 | __FP_CLZ(R,X##_f1); \ | ||
80 | else \ | ||
81 | { \ | ||
82 | __FP_CLZ(R,X##_f0); \ | ||
83 | R += _FP_W_TYPE_SIZE; \ | ||
84 | } \ | ||
85 | } while(0) | ||
86 | |||
87 | /* Predicates */ | ||
88 | #define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE)X##_f1 < 0) | ||
89 | #define _FP_FRAC_ZEROP_2(X) ((X##_f1 | X##_f0) == 0) | ||
90 | #define _FP_FRAC_OVERP_2(fs,X) (X##_f1 & _FP_OVERFLOW_##fs) | ||
91 | #define _FP_FRAC_EQ_2(X, Y) (X##_f1 == Y##_f1 && X##_f0 == Y##_f0) | ||
92 | #define _FP_FRAC_GT_2(X, Y) \ | ||
93 | ((X##_f1 > Y##_f1) || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0)) | ||
94 | #define _FP_FRAC_GE_2(X, Y) \ | ||
95 | ((X##_f1 > Y##_f1) || (X##_f1 == Y##_f1 && X##_f0 >= Y##_f0)) | ||
96 | |||
97 | #define _FP_ZEROFRAC_2 0, 0 | ||
98 | #define _FP_MINFRAC_2 0, 1 | ||
99 | |||
100 | /* | ||
101 | * Internals | ||
102 | */ | ||
103 | |||
104 | #define __FP_FRAC_SET_2(X,I1,I0) (X##_f0 = I0, X##_f1 = I1) | ||
105 | |||
106 | #define __FP_CLZ_2(R, xh, xl) \ | ||
107 | do { \ | ||
108 | if (xh) \ | ||
109 | __FP_CLZ(R,xl); \ | ||
110 | else \ | ||
111 | { \ | ||
112 | __FP_CLZ(R,xl); \ | ||
113 | R += _FP_W_TYPE_SIZE; \ | ||
114 | } \ | ||
115 | } while(0) | ||
116 | |||
117 | #if 0 | ||
118 | |||
119 | #ifndef __FP_FRAC_ADDI_2 | ||
120 | #define __FP_FRAC_ADDI_2(xh, xl, i) \ | ||
121 | (xh += ((xl += i) < i)) | ||
122 | #endif | ||
123 | #ifndef __FP_FRAC_ADD_2 | ||
124 | #define __FP_FRAC_ADD_2(rh, rl, xh, xl, yh, yl) \ | ||
125 | (rh = xh + yh + ((rl = xl + yl) < xl)) | ||
126 | #endif | ||
127 | #ifndef __FP_FRAC_SUB_2 | ||
128 | #define __FP_FRAC_SUB_2(rh, rl, xh, xl, yh, yl) \ | ||
129 | (rh = xh - yh - ((rl = xl - yl) > xl)) | ||
130 | #endif | ||
131 | |||
132 | #else | ||
133 | |||
134 | #undef __FP_FRAC_ADDI_2 | ||
135 | #define __FP_FRAC_ADDI_2(xh, xl, i) add_ssaaaa(xh, xl, xh, xl, 0, i) | ||
136 | #undef __FP_FRAC_ADD_2 | ||
137 | #define __FP_FRAC_ADD_2 add_ssaaaa | ||
138 | #undef __FP_FRAC_SUB_2 | ||
139 | #define __FP_FRAC_SUB_2 sub_ddmmss | ||
140 | |||
141 | #endif | ||
142 | |||
143 | /* | ||
144 | * Unpack the raw bits of a native fp value. Do not classify or | ||
145 | * normalize the data. | ||
146 | */ | ||
147 | |||
148 | #define _FP_UNPACK_RAW_2(fs, X, val) \ | ||
149 | do { \ | ||
150 | union _FP_UNION_##fs _flo; _flo.flt = (val); \ | ||
151 | \ | ||
152 | X##_f0 = _flo.bits.frac0; \ | ||
153 | X##_f1 = _flo.bits.frac1; \ | ||
154 | X##_e = _flo.bits.exp; \ | ||
155 | X##_s = _flo.bits.sign; \ | ||
156 | } while (0) | ||
157 | |||
158 | |||
159 | /* | ||
160 | * Repack the raw bits of a native fp value. | ||
161 | */ | ||
162 | |||
163 | #define _FP_PACK_RAW_2(fs, val, X) \ | ||
164 | do { \ | ||
165 | union _FP_UNION_##fs _flo; \ | ||
166 | \ | ||
167 | _flo.bits.frac0 = X##_f0; \ | ||
168 | _flo.bits.frac1 = X##_f1; \ | ||
169 | _flo.bits.exp = X##_e; \ | ||
170 | _flo.bits.sign = X##_s; \ | ||
171 | \ | ||
172 | (val) = _flo.flt; \ | ||
173 | } while (0) | ||
174 | |||
175 | |||
176 | /* | ||
177 | * Multiplication algorithms: | ||
178 | */ | ||
179 | |||
180 | /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ | ||
181 | |||
182 | #define _FP_MUL_MEAT_2_wide(fs, R, X, Y, doit) \ | ||
183 | do { \ | ||
184 | _FP_FRAC_DECL_4(_z); _FP_FRAC_DECL_2(_b); _FP_FRAC_DECL_2(_c); \ | ||
185 | \ | ||
186 | doit(_FP_FRAC_WORD_4(_z,1), _FP_FRAC_WORD_4(_z,0), X##_f0, Y##_f0); \ | ||
187 | doit(_b_f1, _b_f0, X##_f0, Y##_f1); \ | ||
188 | doit(_c_f1, _c_f0, X##_f1, Y##_f0); \ | ||
189 | doit(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2), X##_f1, Y##_f1); \ | ||
190 | \ | ||
191 | __FP_FRAC_ADD_4(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
192 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0), \ | ||
193 | 0, _b_f1, _b_f0, 0, \ | ||
194 | _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
195 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0)); \ | ||
196 | __FP_FRAC_ADD_4(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
197 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0), \ | ||
198 | 0, _c_f1, _c_f0, 0, \ | ||
199 | _FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2), \ | ||
200 | _FP_FRAC_WORD_4(_z,1),_FP_FRAC_WORD_4(_z,0)); \ | ||
201 | \ | ||
202 | /* Normalize since we know where the msb of the multiplicands \ | ||
203 | were (bit B), we know that the msb of the of the product is \ | ||
204 | at either 2B or 2B-1. */ \ | ||
205 | _FP_FRAC_SRS_4(_z, _FP_WFRACBITS_##fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
206 | R##_f0 = _FP_FRAC_WORD_4(_z,0); \ | ||
207 | R##_f1 = _FP_FRAC_WORD_4(_z,1); \ | ||
208 | } while (0) | ||
209 | |||
210 | /* This next macro appears to be totally broken. Fortunately nowhere | ||
211 | * seems to use it :-> The problem is that we define _z[4] but | ||
212 | * then use it in _FP_FRAC_SRS_4, which will attempt to access | ||
213 | * _z_f[n] which will cause an error. The fix probably involves | ||
214 | * declaring it with _FP_FRAC_DECL_4, see previous macro. -- PMM 02/1998 | ||
215 | */ | ||
216 | #define _FP_MUL_MEAT_2_gmp(fs, R, X, Y) \ | ||
217 | do { \ | ||
218 | _FP_W_TYPE _x[2], _y[2], _z[4]; \ | ||
219 | _x[0] = X##_f0; _x[1] = X##_f1; \ | ||
220 | _y[0] = Y##_f0; _y[1] = Y##_f1; \ | ||
221 | \ | ||
222 | mpn_mul_n(_z, _x, _y, 2); \ | ||
223 | \ | ||
224 | /* Normalize since we know where the msb of the multiplicands \ | ||
225 | were (bit B), we know that the msb of the of the product is \ | ||
226 | at either 2B or 2B-1. */ \ | ||
227 | _FP_FRAC_SRS_4(_z, _FP_WFRACBITS##_fs-1, 2*_FP_WFRACBITS_##fs); \ | ||
228 | R##_f0 = _z[0]; \ | ||
229 | R##_f1 = _z[1]; \ | ||
230 | } while (0) | ||
231 | |||
232 | |||
233 | /* | ||
234 | * Division algorithms: | ||
235 | * This seems to be giving me difficulties -- PMM | ||
236 | * Look, NetBSD seems to be able to comment algorithms. Can't you? | ||
237 | * I've thrown printks at the problem. | ||
238 | * This now appears to work, but I still don't really know why. | ||
239 | * Also, I don't think the result is properly normalised... | ||
240 | */ | ||
241 | |||
242 | #define _FP_DIV_MEAT_2_udiv_64(fs, R, X, Y) \ | ||
243 | do { \ | ||
244 | extern void _fp_udivmodti4(_FP_W_TYPE q[2], _FP_W_TYPE r[2], \ | ||
245 | _FP_W_TYPE n1, _FP_W_TYPE n0, \ | ||
246 | _FP_W_TYPE d1, _FP_W_TYPE d0); \ | ||
247 | _FP_W_TYPE _n_f3, _n_f2, _n_f1, _n_f0, _r_f1, _r_f0; \ | ||
248 | _FP_W_TYPE _q_f1, _q_f0, _m_f1, _m_f0; \ | ||
249 | _FP_W_TYPE _rmem[2], _qmem[2]; \ | ||
250 | /* I think this check is to ensure that the result is normalised. \ | ||
251 | * Assuming X,Y normalised (ie in [1.0,2.0)) X/Y will be in \ | ||
252 | * [0.5,2.0). Furthermore, it will be less than 1.0 iff X < Y. \ | ||
253 | * In this case we tweak things. (this is based on comments in \ | ||
254 | * the NetBSD FPU emulation code. ) \ | ||
255 | * We know X,Y are normalised because we ensure this as part of \ | ||
256 | * the unpacking process. -- PMM \ | ||
257 | */ \ | ||
258 | if (_FP_FRAC_GT_2(X, Y)) \ | ||
259 | { \ | ||
260 | /* R##_e++; */ \ | ||
261 | _n_f3 = X##_f1 >> 1; \ | ||
262 | _n_f2 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1; \ | ||
263 | _n_f1 = X##_f0 << (_FP_W_TYPE_SIZE - 1); \ | ||
264 | _n_f0 = 0; \ | ||
265 | } \ | ||
266 | else \ | ||
267 | { \ | ||
268 | R##_e--; \ | ||
269 | _n_f3 = X##_f1; \ | ||
270 | _n_f2 = X##_f0; \ | ||
271 | _n_f1 = _n_f0 = 0; \ | ||
272 | } \ | ||
273 | \ | ||
274 | /* Normalize, i.e. make the most significant bit of the \ | ||
275 | denominator set. CHANGED: - 1 to nothing -- PMM */ \ | ||
276 | _FP_FRAC_SLL_2(Y, _FP_WFRACXBITS_##fs /* -1 */); \ | ||
277 | \ | ||
278 | /* Do the 256/128 bit division given the 128-bit _fp_udivmodtf4 \ | ||
279 | primitive snagged from libgcc2.c. */ \ | ||
280 | \ | ||
281 | _fp_udivmodti4(_qmem, _rmem, _n_f3, _n_f2, 0, Y##_f1); \ | ||
282 | _q_f1 = _qmem[0]; \ | ||
283 | umul_ppmm(_m_f1, _m_f0, _q_f1, Y##_f0); \ | ||
284 | _r_f1 = _rmem[0]; \ | ||
285 | _r_f0 = _n_f1; \ | ||
286 | if (_FP_FRAC_GT_2(_m, _r)) \ | ||
287 | { \ | ||
288 | _q_f1--; \ | ||
289 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
290 | if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r)) \ | ||
291 | { \ | ||
292 | _q_f1--; \ | ||
293 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
294 | } \ | ||
295 | } \ | ||
296 | _FP_FRAC_SUB_2(_r, _r, _m); \ | ||
297 | \ | ||
298 | _fp_udivmodti4(_qmem, _rmem, _r_f1, _r_f0, 0, Y##_f1); \ | ||
299 | _q_f0 = _qmem[0]; \ | ||
300 | umul_ppmm(_m_f1, _m_f0, _q_f0, Y##_f0); \ | ||
301 | _r_f1 = _rmem[0]; \ | ||
302 | _r_f0 = _n_f0; \ | ||
303 | if (_FP_FRAC_GT_2(_m, _r)) \ | ||
304 | { \ | ||
305 | _q_f0--; \ | ||
306 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
307 | if (_FP_FRAC_GE_2(_r, Y) && _FP_FRAC_GT_2(_m, _r)) \ | ||
308 | { \ | ||
309 | _q_f0--; \ | ||
310 | _FP_FRAC_ADD_2(_r, _r, Y); \ | ||
311 | } \ | ||
312 | } \ | ||
313 | _FP_FRAC_SUB_2(_r, _r, _m); \ | ||
314 | \ | ||
315 | R##_f1 = _q_f1; \ | ||
316 | R##_f0 = _q_f0 | ((_r_f1 | _r_f0) != 0); \ | ||
317 | /* adjust so answer is normalized again. I'm not sure what the \ | ||
318 | * final sz param should be. In practice it's never used since \ | ||
319 | * N is 1 which is always going to be < _FP_W_TYPE_SIZE... \ | ||
320 | */ \ | ||
321 | /* _FP_FRAC_SRS_2(R,1,_FP_WFRACBITS_##fs); */ \ | ||
322 | } while (0) | ||
323 | |||
324 | |||
325 | #define _FP_DIV_MEAT_2_gmp(fs, R, X, Y) \ | ||
326 | do { \ | ||
327 | _FP_W_TYPE _x[4], _y[2], _z[4]; \ | ||
328 | _y[0] = Y##_f0; _y[1] = Y##_f1; \ | ||
329 | _x[0] = _x[3] = 0; \ | ||
330 | if (_FP_FRAC_GT_2(X, Y)) \ | ||
331 | { \ | ||
332 | R##_e++; \ | ||
333 | _x[1] = (X##_f0 << (_FP_WFRACBITS-1 - _FP_W_TYPE_SIZE) | \ | ||
334 | X##_f1 >> (_FP_W_TYPE_SIZE - \ | ||
335 | (_FP_WFRACBITS-1 - _FP_W_TYPE_SIZE))); \ | ||
336 | _x[2] = X##_f1 << (_FP_WFRACBITS-1 - _FP_W_TYPE_SIZE); \ | ||
337 | } \ | ||
338 | else \ | ||
339 | { \ | ||
340 | _x[1] = (X##_f0 << (_FP_WFRACBITS - _FP_W_TYPE_SIZE) | \ | ||
341 | X##_f1 >> (_FP_W_TYPE_SIZE - \ | ||
342 | (_FP_WFRACBITS - _FP_W_TYPE_SIZE))); \ | ||
343 | _x[2] = X##_f1 << (_FP_WFRACBITS - _FP_W_TYPE_SIZE); \ | ||
344 | } \ | ||
345 | \ | ||
346 | (void) mpn_divrem (_z, 0, _x, 4, _y, 2); \ | ||
347 | R##_f1 = _z[1]; \ | ||
348 | R##_f0 = _z[0] | ((_x[0] | _x[1]) != 0); \ | ||
349 | } while (0) | ||
350 | |||
351 | |||
352 | /* | ||
353 | * Square root algorithms: | ||
354 | * We have just one right now, maybe Newton approximation | ||
355 | * should be added for those machines where division is fast. | ||
356 | */ | ||
357 | |||
358 | #define _FP_SQRT_MEAT_2(R, S, T, X, q) \ | ||
359 | do { \ | ||
360 | while (q) \ | ||
361 | { \ | ||
362 | T##_f1 = S##_f1 + q; \ | ||
363 | if (T##_f1 <= X##_f1) \ | ||
364 | { \ | ||
365 | S##_f1 = T##_f1 + q; \ | ||
366 | X##_f1 -= T##_f1; \ | ||
367 | R##_f1 += q; \ | ||
368 | } \ | ||
369 | _FP_FRAC_SLL_2(X, 1); \ | ||
370 | q >>= 1; \ | ||
371 | } \ | ||
372 | q = (_FP_W_TYPE)1 << (_FP_W_TYPE_SIZE - 1); \ | ||
373 | while (q) \ | ||
374 | { \ | ||
375 | T##_f0 = S##_f0 + q; \ | ||
376 | T##_f1 = S##_f1; \ | ||
377 | if (T##_f1 < X##_f1 || \ | ||
378 | (T##_f1 == X##_f1 && T##_f0 < X##_f0)) \ | ||
379 | { \ | ||
380 | S##_f0 = T##_f0 + q; \ | ||
381 | if (((_FP_WS_TYPE)T##_f0) < 0 && \ | ||
382 | ((_FP_WS_TYPE)S##_f0) >= 0) \ | ||
383 | S##_f1++; \ | ||
384 | _FP_FRAC_SUB_2(X, X, T); \ | ||
385 | R##_f0 += q; \ | ||
386 | } \ | ||
387 | _FP_FRAC_SLL_2(X, 1); \ | ||
388 | q >>= 1; \ | ||
389 | } \ | ||
390 | } while (0) | ||
391 | |||
392 | |||
393 | /* | ||
394 | * Assembly/disassembly for converting to/from integral types. | ||
395 | * No shifting or overflow handled here. | ||
396 | */ | ||
397 | |||
398 | #define _FP_FRAC_ASSEMBLE_2(r, X, rsize) \ | ||
399 | do { \ | ||
400 | if (rsize <= _FP_W_TYPE_SIZE) \ | ||
401 | r = X##_f0; \ | ||
402 | else \ | ||
403 | { \ | ||
404 | r = X##_f1; \ | ||
405 | r <<= _FP_W_TYPE_SIZE; \ | ||
406 | r += X##_f0; \ | ||
407 | } \ | ||
408 | } while (0) | ||
409 | |||
410 | #define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \ | ||
411 | do { \ | ||
412 | X##_f0 = r; \ | ||
413 | X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \ | ||
414 | } while (0) | ||
415 | |||
416 | /* | ||
417 | * Convert FP values between word sizes | ||
418 | */ | ||
419 | |||
420 | #define _FP_FRAC_CONV_1_2(dfs, sfs, D, S) \ | ||
421 | do { \ | ||
422 | _FP_FRAC_SRS_2(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \ | ||
423 | _FP_WFRACBITS_##sfs); \ | ||
424 | D##_f = S##_f0; \ | ||
425 | } while (0) | ||
426 | |||
427 | #define _FP_FRAC_CONV_2_1(dfs, sfs, D, S) \ | ||
428 | do { \ | ||
429 | D##_f0 = S##_f; \ | ||
430 | D##_f1 = 0; \ | ||
431 | _FP_FRAC_SLL_2(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \ | ||
432 | } while (0) | ||
433 | |||
diff --git a/arch/ppc/math-emu/op-4.h b/arch/ppc/math-emu/op-4.h deleted file mode 100644 index fcdd6d064c54..000000000000 --- a/arch/ppc/math-emu/op-4.h +++ /dev/null | |||
@@ -1,297 +0,0 @@ | |||
1 | /* | ||
2 | * Basic four-word fraction declaration and manipulation. | ||
3 | * | ||
4 | * When adding quadword support for 32 bit machines, we need | ||
5 | * to be a little careful as double multiply uses some of these | ||
6 | * macros: (in op-2.h) | ||
7 | * _FP_MUL_MEAT_2_wide() uses _FP_FRAC_DECL_4, _FP_FRAC_WORD_4, | ||
8 | * _FP_FRAC_ADD_4, _FP_FRAC_SRS_4 | ||
9 | * _FP_MUL_MEAT_2_gmp() uses _FP_FRAC_SRS_4 (and should use | ||
10 | * _FP_FRAC_DECL_4: it appears to be broken and is not used | ||
11 | * anywhere anyway. ) | ||
12 | * | ||
13 | * I've now fixed all the macros that were here from the sparc64 code. | ||
14 | * [*none* of the shift macros were correct!] -- PMM 02/1998 | ||
15 | * | ||
16 | * The only quadword stuff that remains to be coded is: | ||
17 | * 1) the conversion to/from ints, which requires | ||
18 | * that we check (in op-common.h) that the following do the right thing | ||
19 | * for quadwords: _FP_TO_INT(Q,4,r,X,rsz,rsg), _FP_FROM_INT(Q,4,X,r,rs,rt) | ||
20 | * 2) multiply, divide and sqrt, which require: | ||
21 | * _FP_MUL_MEAT_4_*(R,X,Y), _FP_DIV_MEAT_4_*(R,X,Y), _FP_SQRT_MEAT_4(R,S,T,X,q), | ||
22 | * This also needs _FP_MUL_MEAT_Q and _FP_DIV_MEAT_Q to be defined to | ||
23 | * some suitable _FP_MUL_MEAT_4_* macros in sfp-machine.h. | ||
24 | * [we're free to choose whatever FP_MUL_MEAT_4_* macros we need for | ||
25 | * these; they are used nowhere else. ] | ||
26 | */ | ||
27 | |||
28 | #define _FP_FRAC_DECL_4(X) _FP_W_TYPE X##_f[4] | ||
29 | #define _FP_FRAC_COPY_4(D,S) \ | ||
30 | (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1], \ | ||
31 | D##_f[2] = S##_f[2], D##_f[3] = S##_f[3]) | ||
32 | /* The _FP_FRAC_SET_n(X,I) macro is intended for use with another | ||
33 | * macro such as _FP_ZEROFRAC_n which returns n comma separated values. | ||
34 | * The result is that we get an expansion of __FP_FRAC_SET_n(X,I0,I1,I2,I3) | ||
35 | * which just assigns the In values to the array X##_f[]. | ||
36 | * This is why the number of parameters doesn't appear to match | ||
37 | * at first glance... -- PMM | ||
38 | */ | ||
39 | #define _FP_FRAC_SET_4(X,I) __FP_FRAC_SET_4(X, I) | ||
40 | #define _FP_FRAC_HIGH_4(X) (X##_f[3]) | ||
41 | #define _FP_FRAC_LOW_4(X) (X##_f[0]) | ||
42 | #define _FP_FRAC_WORD_4(X,w) (X##_f[w]) | ||
43 | |||
44 | #define _FP_FRAC_SLL_4(X,N) \ | ||
45 | do { \ | ||
46 | _FP_I_TYPE _up, _down, _skip, _i; \ | ||
47 | _skip = (N) / _FP_W_TYPE_SIZE; \ | ||
48 | _up = (N) % _FP_W_TYPE_SIZE; \ | ||
49 | _down = _FP_W_TYPE_SIZE - _up; \ | ||
50 | for (_i = 3; _i > _skip; --_i) \ | ||
51 | X##_f[_i] = X##_f[_i-_skip] << _up | X##_f[_i-_skip-1] >> _down; \ | ||
52 | /* bugfixed: was X##_f[_i] <<= _up; -- PMM 02/1998 */ \ | ||
53 | X##_f[_i] = X##_f[0] << _up; \ | ||
54 | for (--_i; _i >= 0; --_i) \ | ||
55 | X##_f[_i] = 0; \ | ||
56 | } while (0) | ||
57 | |||
58 | /* This one was broken too */ | ||
59 | #define _FP_FRAC_SRL_4(X,N) \ | ||
60 | do { \ | ||
61 | _FP_I_TYPE _up, _down, _skip, _i; \ | ||
62 | _skip = (N) / _FP_W_TYPE_SIZE; \ | ||
63 | _down = (N) % _FP_W_TYPE_SIZE; \ | ||
64 | _up = _FP_W_TYPE_SIZE - _down; \ | ||
65 | for (_i = 0; _i < 3-_skip; ++_i) \ | ||
66 | X##_f[_i] = X##_f[_i+_skip] >> _down | X##_f[_i+_skip+1] << _up; \ | ||
67 | X##_f[_i] = X##_f[3] >> _down; \ | ||
68 | for (++_i; _i < 4; ++_i) \ | ||
69 | X##_f[_i] = 0; \ | ||
70 | } while (0) | ||
71 | |||
72 | |||
73 | /* Right shift with sticky-lsb. | ||
74 | * What this actually means is that we do a standard right-shift, | ||
75 | * but that if any of the bits that fall off the right hand side | ||
76 | * were one then we always set the LSbit. | ||
77 | */ | ||
78 | #define _FP_FRAC_SRS_4(X,N,size) \ | ||
79 | do { \ | ||
80 | _FP_I_TYPE _up, _down, _skip, _i; \ | ||
81 | _FP_W_TYPE _s; \ | ||
82 | _skip = (N) / _FP_W_TYPE_SIZE; \ | ||
83 | _down = (N) % _FP_W_TYPE_SIZE; \ | ||
84 | _up = _FP_W_TYPE_SIZE - _down; \ | ||
85 | for (_s = _i = 0; _i < _skip; ++_i) \ | ||
86 | _s |= X##_f[_i]; \ | ||
87 | _s |= X##_f[_i] << _up; \ | ||
88 | /* s is now != 0 if we want to set the LSbit */ \ | ||
89 | for (_i = 0; _i < 3-_skip; ++_i) \ | ||
90 | X##_f[_i] = X##_f[_i+_skip] >> _down | X##_f[_i+_skip+1] << _up; \ | ||
91 | X##_f[_i] = X##_f[3] >> _down; \ | ||
92 | for (++_i; _i < 4; ++_i) \ | ||
93 | X##_f[_i] = 0; \ | ||
94 | /* don't fix the LSB until the very end when we're sure f[0] is stable */ \ | ||
95 | X##_f[0] |= (_s != 0); \ | ||
96 | } while (0) | ||
97 | |||
98 | #define _FP_FRAC_ADD_4(R,X,Y) \ | ||
99 | __FP_FRAC_ADD_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \ | ||
100 | X##_f[3], X##_f[2], X##_f[1], X##_f[0], \ | ||
101 | Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0]) | ||
102 | |||
103 | #define _FP_FRAC_SUB_4(R,X,Y) \ | ||
104 | __FP_FRAC_SUB_4(R##_f[3], R##_f[2], R##_f[1], R##_f[0], \ | ||
105 | X##_f[3], X##_f[2], X##_f[1], X##_f[0], \ | ||
106 | Y##_f[3], Y##_f[2], Y##_f[1], Y##_f[0]) | ||
107 | |||
108 | #define _FP_FRAC_ADDI_4(X,I) \ | ||
109 | __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I) | ||
110 | |||
111 | #define _FP_ZEROFRAC_4 0,0,0,0 | ||
112 | #define _FP_MINFRAC_4 0,0,0,1 | ||
113 | |||
114 | #define _FP_FRAC_ZEROP_4(X) ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0) | ||
115 | #define _FP_FRAC_NEGP_4(X) ((_FP_WS_TYPE)X##_f[3] < 0) | ||
116 | #define _FP_FRAC_OVERP_4(fs,X) (X##_f[0] & _FP_OVERFLOW_##fs) | ||
117 | |||
118 | #define _FP_FRAC_EQ_4(X,Y) \ | ||
119 | (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1] \ | ||
120 | && X##_f[2] == Y##_f[2] && X##_f[3] == Y##_f[3]) | ||
121 | |||
122 | #define _FP_FRAC_GT_4(X,Y) \ | ||
123 | (X##_f[3] > Y##_f[3] || \ | ||
124 | (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \ | ||
125 | (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \ | ||
126 | (X##_f[1] == Y##_f[1] && X##_f[0] > Y##_f[0]) \ | ||
127 | )) \ | ||
128 | )) \ | ||
129 | ) | ||
130 | |||
131 | #define _FP_FRAC_GE_4(X,Y) \ | ||
132 | (X##_f[3] > Y##_f[3] || \ | ||
133 | (X##_f[3] == Y##_f[3] && (X##_f[2] > Y##_f[2] || \ | ||
134 | (X##_f[2] == Y##_f[2] && (X##_f[1] > Y##_f[1] || \ | ||
135 | (X##_f[1] == Y##_f[1] && X##_f[0] >= Y##_f[0]) \ | ||
136 | )) \ | ||
137 | )) \ | ||
138 | ) | ||
139 | |||
140 | |||
141 | #define _FP_FRAC_CLZ_4(R,X) \ | ||
142 | do { \ | ||
143 | if (X##_f[3]) \ | ||
144 | { \ | ||
145 | __FP_CLZ(R,X##_f[3]); \ | ||
146 | } \ | ||
147 | else if (X##_f[2]) \ | ||
148 | { \ | ||
149 | __FP_CLZ(R,X##_f[2]); \ | ||
150 | R += _FP_W_TYPE_SIZE; \ | ||
151 | } \ | ||
152 | else if (X##_f[1]) \ | ||
153 | { \ | ||
154 | __FP_CLZ(R,X##_f[2]); \ | ||
155 | R += _FP_W_TYPE_SIZE*2; \ | ||
156 | } \ | ||
157 | else \ | ||
158 | { \ | ||
159 | __FP_CLZ(R,X##_f[0]); \ | ||
160 | R += _FP_W_TYPE_SIZE*3; \ | ||
161 | } \ | ||
162 | } while(0) | ||
163 | |||
164 | |||
165 | #define _FP_UNPACK_RAW_4(fs, X, val) \ | ||
166 | do { \ | ||
167 | union _FP_UNION_##fs _flo; _flo.flt = (val); \ | ||
168 | X##_f[0] = _flo.bits.frac0; \ | ||
169 | X##_f[1] = _flo.bits.frac1; \ | ||
170 | X##_f[2] = _flo.bits.frac2; \ | ||
171 | X##_f[3] = _flo.bits.frac3; \ | ||
172 | X##_e = _flo.bits.exp; \ | ||
173 | X##_s = _flo.bits.sign; \ | ||
174 | } while (0) | ||
175 | |||
176 | #define _FP_PACK_RAW_4(fs, val, X) \ | ||
177 | do { \ | ||
178 | union _FP_UNION_##fs _flo; \ | ||
179 | _flo.bits.frac0 = X##_f[0]; \ | ||
180 | _flo.bits.frac1 = X##_f[1]; \ | ||
181 | _flo.bits.frac2 = X##_f[2]; \ | ||
182 | _flo.bits.frac3 = X##_f[3]; \ | ||
183 | _flo.bits.exp = X##_e; \ | ||
184 | _flo.bits.sign = X##_s; \ | ||
185 | (val) = _flo.flt; \ | ||
186 | } while (0) | ||
187 | |||
188 | |||
189 | /* | ||
190 | * Internals | ||
191 | */ | ||
192 | |||
193 | #define __FP_FRAC_SET_4(X,I3,I2,I1,I0) \ | ||
194 | (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0) | ||
195 | |||
196 | #ifndef __FP_FRAC_ADD_4 | ||
197 | #define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \ | ||
198 | (r0 = x0 + y0, \ | ||
199 | r1 = x1 + y1 + (r0 < x0), \ | ||
200 | r2 = x2 + y2 + (r1 < x1), \ | ||
201 | r3 = x3 + y3 + (r2 < x2)) | ||
202 | #endif | ||
203 | |||
204 | #ifndef __FP_FRAC_SUB_4 | ||
205 | #define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \ | ||
206 | (r0 = x0 - y0, \ | ||
207 | r1 = x1 - y1 - (r0 > x0), \ | ||
208 | r2 = x2 - y2 - (r1 > x1), \ | ||
209 | r3 = x3 - y3 - (r2 > x2)) | ||
210 | #endif | ||
211 | |||
212 | #ifndef __FP_FRAC_ADDI_4 | ||
213 | /* I always wanted to be a lisp programmer :-> */ | ||
214 | #define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \ | ||
215 | (x3 += ((x2 += ((x1 += ((x0 += i) < x0)) < x1) < x2))) | ||
216 | #endif | ||
217 | |||
218 | /* Convert FP values between word sizes. This appears to be more | ||
219 | * complicated than I'd have expected it to be, so these might be | ||
220 | * wrong... These macros are in any case somewhat bogus because they | ||
221 | * use information about what various FRAC_n variables look like | ||
222 | * internally [eg, that 2 word vars are X_f0 and x_f1]. But so do | ||
223 | * the ones in op-2.h and op-1.h. | ||
224 | */ | ||
225 | #define _FP_FRAC_CONV_1_4(dfs, sfs, D, S) \ | ||
226 | do { \ | ||
227 | _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \ | ||
228 | _FP_WFRACBITS_##sfs); \ | ||
229 | D##_f = S##_f[0]; \ | ||
230 | } while (0) | ||
231 | |||
232 | #define _FP_FRAC_CONV_2_4(dfs, sfs, D, S) \ | ||
233 | do { \ | ||
234 | _FP_FRAC_SRS_4(S, (_FP_WFRACBITS_##sfs - _FP_WFRACBITS_##dfs), \ | ||
235 | _FP_WFRACBITS_##sfs); \ | ||
236 | D##_f0 = S##_f[0]; \ | ||
237 | D##_f1 = S##_f[1]; \ | ||
238 | } while (0) | ||
239 | |||
240 | /* Assembly/disassembly for converting to/from integral types. | ||
241 | * No shifting or overflow handled here. | ||
242 | */ | ||
243 | /* Put the FP value X into r, which is an integer of size rsize. */ | ||
244 | #define _FP_FRAC_ASSEMBLE_4(r, X, rsize) \ | ||
245 | do { \ | ||
246 | if (rsize <= _FP_W_TYPE_SIZE) \ | ||
247 | r = X##_f[0]; \ | ||
248 | else if (rsize <= 2*_FP_W_TYPE_SIZE) \ | ||
249 | { \ | ||
250 | r = X##_f[1]; \ | ||
251 | r <<= _FP_W_TYPE_SIZE; \ | ||
252 | r += X##_f[0]; \ | ||
253 | } \ | ||
254 | else \ | ||
255 | { \ | ||
256 | /* I'm feeling lazy so we deal with int == 3words (implausible)*/ \ | ||
257 | /* and int == 4words as a single case. */ \ | ||
258 | r = X##_f[3]; \ | ||
259 | r <<= _FP_W_TYPE_SIZE; \ | ||
260 | r += X##_f[2]; \ | ||
261 | r <<= _FP_W_TYPE_SIZE; \ | ||
262 | r += X##_f[1]; \ | ||
263 | r <<= _FP_W_TYPE_SIZE; \ | ||
264 | r += X##_f[0]; \ | ||
265 | } \ | ||
266 | } while (0) | ||
267 | |||
268 | /* "No disassemble Number Five!" */ | ||
269 | /* move an integer of size rsize into X's fractional part. We rely on | ||
270 | * the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid | ||
271 | * having to mask the values we store into it. | ||
272 | */ | ||
273 | #define _FP_FRAC_DISASSEMBLE_4(X, r, rsize) \ | ||
274 | do { \ | ||
275 | X##_f[0] = r; \ | ||
276 | X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \ | ||
277 | X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \ | ||
278 | X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \ | ||
279 | } while (0) | ||
280 | |||
281 | #define _FP_FRAC_CONV_4_1(dfs, sfs, D, S) \ | ||
282 | do { \ | ||
283 | D##_f[0] = S##_f; \ | ||
284 | D##_f[1] = D##_f[2] = D##_f[3] = 0; \ | ||
285 | _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \ | ||
286 | } while (0) | ||
287 | |||
288 | #define _FP_FRAC_CONV_4_2(dfs, sfs, D, S) \ | ||
289 | do { \ | ||
290 | D##_f[0] = S##_f0; \ | ||
291 | D##_f[1] = S##_f1; \ | ||
292 | D##_f[2] = D##_f[3] = 0; \ | ||
293 | _FP_FRAC_SLL_4(D, (_FP_WFRACBITS_##dfs - _FP_WFRACBITS_##sfs)); \ | ||
294 | } while (0) | ||
295 | |||
296 | /* FIXME! This has to be written */ | ||
297 | #define _FP_SQRT_MEAT_4(R, S, T, X, q) | ||
diff --git a/arch/ppc/math-emu/op-common.h b/arch/ppc/math-emu/op-common.h deleted file mode 100644 index afb82b6498ce..000000000000 --- a/arch/ppc/math-emu/op-common.h +++ /dev/null | |||
@@ -1,688 +0,0 @@ | |||
1 | #define _FP_DECL(wc, X) \ | ||
2 | _FP_I_TYPE X##_c, X##_s, X##_e; \ | ||
3 | _FP_FRAC_DECL_##wc(X) | ||
4 | |||
5 | /* | ||
6 | * Finish truely unpacking a native fp value by classifying the kind | ||
7 | * of fp value and normalizing both the exponent and the fraction. | ||
8 | */ | ||
9 | |||
10 | #define _FP_UNPACK_CANONICAL(fs, wc, X) \ | ||
11 | do { \ | ||
12 | switch (X##_e) \ | ||
13 | { \ | ||
14 | default: \ | ||
15 | _FP_FRAC_HIGH_##wc(X) |= _FP_IMPLBIT_##fs; \ | ||
16 | _FP_FRAC_SLL_##wc(X, _FP_WORKBITS); \ | ||
17 | X##_e -= _FP_EXPBIAS_##fs; \ | ||
18 | X##_c = FP_CLS_NORMAL; \ | ||
19 | break; \ | ||
20 | \ | ||
21 | case 0: \ | ||
22 | if (_FP_FRAC_ZEROP_##wc(X)) \ | ||
23 | X##_c = FP_CLS_ZERO; \ | ||
24 | else \ | ||
25 | { \ | ||
26 | /* a denormalized number */ \ | ||
27 | _FP_I_TYPE _shift; \ | ||
28 | _FP_FRAC_CLZ_##wc(_shift, X); \ | ||
29 | _shift -= _FP_FRACXBITS_##fs; \ | ||
30 | _FP_FRAC_SLL_##wc(X, (_shift+_FP_WORKBITS)); \ | ||
31 | X##_e -= _FP_EXPBIAS_##fs - 1 + _shift; \ | ||
32 | X##_c = FP_CLS_NORMAL; \ | ||
33 | } \ | ||
34 | break; \ | ||
35 | \ | ||
36 | case _FP_EXPMAX_##fs: \ | ||
37 | if (_FP_FRAC_ZEROP_##wc(X)) \ | ||
38 | X##_c = FP_CLS_INF; \ | ||
39 | else \ | ||
40 | /* we don't differentiate between signaling and quiet nans */ \ | ||
41 | X##_c = FP_CLS_NAN; \ | ||
42 | break; \ | ||
43 | } \ | ||
44 | } while (0) | ||
45 | |||
46 | |||
47 | /* | ||
48 | * Before packing the bits back into the native fp result, take care | ||
49 | * of such mundane things as rounding and overflow. Also, for some | ||
50 | * kinds of fp values, the original parts may not have been fully | ||
51 | * extracted -- but that is ok, we can regenerate them now. | ||
52 | */ | ||
53 | |||
54 | #define _FP_PACK_CANONICAL(fs, wc, X) \ | ||
55 | ({int __ret = 0; \ | ||
56 | switch (X##_c) \ | ||
57 | { \ | ||
58 | case FP_CLS_NORMAL: \ | ||
59 | X##_e += _FP_EXPBIAS_##fs; \ | ||
60 | if (X##_e > 0) \ | ||
61 | { \ | ||
62 | __ret |= _FP_ROUND(wc, X); \ | ||
63 | if (_FP_FRAC_OVERP_##wc(fs, X)) \ | ||
64 | { \ | ||
65 | _FP_FRAC_SRL_##wc(X, (_FP_WORKBITS+1)); \ | ||
66 | X##_e++; \ | ||
67 | } \ | ||
68 | else \ | ||
69 | _FP_FRAC_SRL_##wc(X, _FP_WORKBITS); \ | ||
70 | if (X##_e >= _FP_EXPMAX_##fs) \ | ||
71 | { \ | ||
72 | /* overflow to infinity */ \ | ||
73 | X##_e = _FP_EXPMAX_##fs; \ | ||
74 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
75 | __ret |= EFLAG_OVERFLOW; \ | ||
76 | } \ | ||
77 | } \ | ||
78 | else \ | ||
79 | { \ | ||
80 | /* we've got a denormalized number */ \ | ||
81 | X##_e = -X##_e + 1; \ | ||
82 | if (X##_e <= _FP_WFRACBITS_##fs) \ | ||
83 | { \ | ||
84 | _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs); \ | ||
85 | _FP_FRAC_SLL_##wc(X, 1); \ | ||
86 | if (_FP_FRAC_OVERP_##wc(fs, X)) \ | ||
87 | { \ | ||
88 | X##_e = 1; \ | ||
89 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
90 | } \ | ||
91 | else \ | ||
92 | { \ | ||
93 | X##_e = 0; \ | ||
94 | _FP_FRAC_SRL_##wc(X, _FP_WORKBITS+1); \ | ||
95 | __ret |= EFLAG_UNDERFLOW; \ | ||
96 | } \ | ||
97 | } \ | ||
98 | else \ | ||
99 | { \ | ||
100 | /* underflow to zero */ \ | ||
101 | X##_e = 0; \ | ||
102 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
103 | __ret |= EFLAG_UNDERFLOW; \ | ||
104 | } \ | ||
105 | } \ | ||
106 | break; \ | ||
107 | \ | ||
108 | case FP_CLS_ZERO: \ | ||
109 | X##_e = 0; \ | ||
110 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
111 | break; \ | ||
112 | \ | ||
113 | case FP_CLS_INF: \ | ||
114 | X##_e = _FP_EXPMAX_##fs; \ | ||
115 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
116 | break; \ | ||
117 | \ | ||
118 | case FP_CLS_NAN: \ | ||
119 | X##_e = _FP_EXPMAX_##fs; \ | ||
120 | if (!_FP_KEEPNANFRACP) \ | ||
121 | { \ | ||
122 | _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs); \ | ||
123 | X##_s = 0; \ | ||
124 | } \ | ||
125 | else \ | ||
126 | _FP_FRAC_HIGH_##wc(X) |= _FP_QNANBIT_##fs; \ | ||
127 | break; \ | ||
128 | } \ | ||
129 | __ret; \ | ||
130 | }) | ||
131 | |||
132 | |||
133 | /* | ||
134 | * Main addition routine. The input values should be cooked. | ||
135 | */ | ||
136 | |||
137 | #define _FP_ADD(fs, wc, R, X, Y) \ | ||
138 | do { \ | ||
139 | switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \ | ||
140 | { \ | ||
141 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \ | ||
142 | { \ | ||
143 | /* shift the smaller number so that its exponent matches the larger */ \ | ||
144 | _FP_I_TYPE diff = X##_e - Y##_e; \ | ||
145 | \ | ||
146 | if (diff < 0) \ | ||
147 | { \ | ||
148 | diff = -diff; \ | ||
149 | if (diff <= _FP_WFRACBITS_##fs) \ | ||
150 | _FP_FRAC_SRS_##wc(X, diff, _FP_WFRACBITS_##fs); \ | ||
151 | else if (!_FP_FRAC_ZEROP_##wc(X)) \ | ||
152 | _FP_FRAC_SET_##wc(X, _FP_MINFRAC_##wc); \ | ||
153 | else \ | ||
154 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
155 | R##_e = Y##_e; \ | ||
156 | } \ | ||
157 | else \ | ||
158 | { \ | ||
159 | if (diff > 0) \ | ||
160 | { \ | ||
161 | if (diff <= _FP_WFRACBITS_##fs) \ | ||
162 | _FP_FRAC_SRS_##wc(Y, diff, _FP_WFRACBITS_##fs); \ | ||
163 | else if (!_FP_FRAC_ZEROP_##wc(Y)) \ | ||
164 | _FP_FRAC_SET_##wc(Y, _FP_MINFRAC_##wc); \ | ||
165 | else \ | ||
166 | _FP_FRAC_SET_##wc(Y, _FP_ZEROFRAC_##wc); \ | ||
167 | } \ | ||
168 | R##_e = X##_e; \ | ||
169 | } \ | ||
170 | \ | ||
171 | R##_c = FP_CLS_NORMAL; \ | ||
172 | \ | ||
173 | if (X##_s == Y##_s) \ | ||
174 | { \ | ||
175 | R##_s = X##_s; \ | ||
176 | _FP_FRAC_ADD_##wc(R, X, Y); \ | ||
177 | if (_FP_FRAC_OVERP_##wc(fs, R)) \ | ||
178 | { \ | ||
179 | _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \ | ||
180 | R##_e++; \ | ||
181 | } \ | ||
182 | } \ | ||
183 | else \ | ||
184 | { \ | ||
185 | R##_s = X##_s; \ | ||
186 | _FP_FRAC_SUB_##wc(R, X, Y); \ | ||
187 | if (_FP_FRAC_ZEROP_##wc(R)) \ | ||
188 | { \ | ||
189 | /* return an exact zero */ \ | ||
190 | if (FP_ROUNDMODE == FP_RND_MINF) \ | ||
191 | R##_s |= Y##_s; \ | ||
192 | else \ | ||
193 | R##_s &= Y##_s; \ | ||
194 | R##_c = FP_CLS_ZERO; \ | ||
195 | } \ | ||
196 | else \ | ||
197 | { \ | ||
198 | if (_FP_FRAC_NEGP_##wc(R)) \ | ||
199 | { \ | ||
200 | _FP_FRAC_SUB_##wc(R, Y, X); \ | ||
201 | R##_s = Y##_s; \ | ||
202 | } \ | ||
203 | \ | ||
204 | /* renormalize after subtraction */ \ | ||
205 | _FP_FRAC_CLZ_##wc(diff, R); \ | ||
206 | diff -= _FP_WFRACXBITS_##fs; \ | ||
207 | if (diff) \ | ||
208 | { \ | ||
209 | R##_e -= diff; \ | ||
210 | _FP_FRAC_SLL_##wc(R, diff); \ | ||
211 | } \ | ||
212 | } \ | ||
213 | } \ | ||
214 | break; \ | ||
215 | } \ | ||
216 | \ | ||
217 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \ | ||
218 | _FP_CHOOSENAN(fs, wc, R, X, Y); \ | ||
219 | break; \ | ||
220 | \ | ||
221 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \ | ||
222 | R##_e = X##_e; \ | ||
223 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \ | ||
224 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \ | ||
225 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \ | ||
226 | _FP_FRAC_COPY_##wc(R, X); \ | ||
227 | R##_s = X##_s; \ | ||
228 | R##_c = X##_c; \ | ||
229 | break; \ | ||
230 | \ | ||
231 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \ | ||
232 | R##_e = Y##_e; \ | ||
233 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \ | ||
234 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \ | ||
235 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \ | ||
236 | _FP_FRAC_COPY_##wc(R, Y); \ | ||
237 | R##_s = Y##_s; \ | ||
238 | R##_c = Y##_c; \ | ||
239 | break; \ | ||
240 | \ | ||
241 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \ | ||
242 | if (X##_s != Y##_s) \ | ||
243 | { \ | ||
244 | /* +INF + -INF => NAN */ \ | ||
245 | _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \ | ||
246 | R##_s = X##_s ^ Y##_s; \ | ||
247 | R##_c = FP_CLS_NAN; \ | ||
248 | break; \ | ||
249 | } \ | ||
250 | /* FALLTHRU */ \ | ||
251 | \ | ||
252 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \ | ||
253 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \ | ||
254 | R##_s = X##_s; \ | ||
255 | R##_c = FP_CLS_INF; \ | ||
256 | break; \ | ||
257 | \ | ||
258 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \ | ||
259 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \ | ||
260 | R##_s = Y##_s; \ | ||
261 | R##_c = FP_CLS_INF; \ | ||
262 | break; \ | ||
263 | \ | ||
264 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \ | ||
265 | /* make sure the sign is correct */ \ | ||
266 | if (FP_ROUNDMODE == FP_RND_MINF) \ | ||
267 | R##_s = X##_s | Y##_s; \ | ||
268 | else \ | ||
269 | R##_s = X##_s & Y##_s; \ | ||
270 | R##_c = FP_CLS_ZERO; \ | ||
271 | break; \ | ||
272 | \ | ||
273 | default: \ | ||
274 | abort(); \ | ||
275 | } \ | ||
276 | } while (0) | ||
277 | |||
278 | |||
279 | /* | ||
280 | * Main negation routine. FIXME -- when we care about setting exception | ||
281 | * bits reliably, this will not do. We should examine all of the fp classes. | ||
282 | */ | ||
283 | |||
284 | #define _FP_NEG(fs, wc, R, X) \ | ||
285 | do { \ | ||
286 | _FP_FRAC_COPY_##wc(R, X); \ | ||
287 | R##_c = X##_c; \ | ||
288 | R##_e = X##_e; \ | ||
289 | R##_s = 1 ^ X##_s; \ | ||
290 | } while (0) | ||
291 | |||
292 | |||
293 | /* | ||
294 | * Main multiplication routine. The input values should be cooked. | ||
295 | */ | ||
296 | |||
297 | #define _FP_MUL(fs, wc, R, X, Y) \ | ||
298 | do { \ | ||
299 | R##_s = X##_s ^ Y##_s; \ | ||
300 | switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \ | ||
301 | { \ | ||
302 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \ | ||
303 | R##_c = FP_CLS_NORMAL; \ | ||
304 | R##_e = X##_e + Y##_e + 1; \ | ||
305 | \ | ||
306 | _FP_MUL_MEAT_##fs(R,X,Y); \ | ||
307 | \ | ||
308 | if (_FP_FRAC_OVERP_##wc(fs, R)) \ | ||
309 | _FP_FRAC_SRS_##wc(R, 1, _FP_WFRACBITS_##fs); \ | ||
310 | else \ | ||
311 | R##_e--; \ | ||
312 | break; \ | ||
313 | \ | ||
314 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \ | ||
315 | _FP_CHOOSENAN(fs, wc, R, X, Y); \ | ||
316 | break; \ | ||
317 | \ | ||
318 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \ | ||
319 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \ | ||
320 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \ | ||
321 | R##_s = X##_s; \ | ||
322 | \ | ||
323 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \ | ||
324 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \ | ||
325 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \ | ||
326 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \ | ||
327 | _FP_FRAC_COPY_##wc(R, X); \ | ||
328 | R##_c = X##_c; \ | ||
329 | break; \ | ||
330 | \ | ||
331 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \ | ||
332 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \ | ||
333 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \ | ||
334 | R##_s = Y##_s; \ | ||
335 | \ | ||
336 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \ | ||
337 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \ | ||
338 | _FP_FRAC_COPY_##wc(R, Y); \ | ||
339 | R##_c = Y##_c; \ | ||
340 | break; \ | ||
341 | \ | ||
342 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \ | ||
343 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \ | ||
344 | R##_c = FP_CLS_NAN; \ | ||
345 | _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \ | ||
346 | break; \ | ||
347 | \ | ||
348 | default: \ | ||
349 | abort(); \ | ||
350 | } \ | ||
351 | } while (0) | ||
352 | |||
353 | |||
354 | /* | ||
355 | * Main division routine. The input values should be cooked. | ||
356 | */ | ||
357 | |||
358 | #define _FP_DIV(fs, wc, R, X, Y) \ | ||
359 | do { \ | ||
360 | R##_s = X##_s ^ Y##_s; \ | ||
361 | switch (_FP_CLS_COMBINE(X##_c, Y##_c)) \ | ||
362 | { \ | ||
363 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL): \ | ||
364 | R##_c = FP_CLS_NORMAL; \ | ||
365 | R##_e = X##_e - Y##_e; \ | ||
366 | \ | ||
367 | _FP_DIV_MEAT_##fs(R,X,Y); \ | ||
368 | break; \ | ||
369 | \ | ||
370 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NAN): \ | ||
371 | _FP_CHOOSENAN(fs, wc, R, X, Y); \ | ||
372 | break; \ | ||
373 | \ | ||
374 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_NORMAL): \ | ||
375 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_INF): \ | ||
376 | case _FP_CLS_COMBINE(FP_CLS_NAN,FP_CLS_ZERO): \ | ||
377 | R##_s = X##_s; \ | ||
378 | _FP_FRAC_COPY_##wc(R, X); \ | ||
379 | R##_c = X##_c; \ | ||
380 | break; \ | ||
381 | \ | ||
382 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NAN): \ | ||
383 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NAN): \ | ||
384 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NAN): \ | ||
385 | R##_s = Y##_s; \ | ||
386 | _FP_FRAC_COPY_##wc(R, Y); \ | ||
387 | R##_c = Y##_c; \ | ||
388 | break; \ | ||
389 | \ | ||
390 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_INF): \ | ||
391 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_INF): \ | ||
392 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_NORMAL): \ | ||
393 | R##_c = FP_CLS_ZERO; \ | ||
394 | break; \ | ||
395 | \ | ||
396 | case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_ZERO): \ | ||
397 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_ZERO): \ | ||
398 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_NORMAL): \ | ||
399 | R##_c = FP_CLS_INF; \ | ||
400 | break; \ | ||
401 | \ | ||
402 | case _FP_CLS_COMBINE(FP_CLS_INF,FP_CLS_INF): \ | ||
403 | case _FP_CLS_COMBINE(FP_CLS_ZERO,FP_CLS_ZERO): \ | ||
404 | R##_c = FP_CLS_NAN; \ | ||
405 | _FP_FRAC_SET_##wc(R, _FP_NANFRAC_##fs); \ | ||
406 | break; \ | ||
407 | \ | ||
408 | default: \ | ||
409 | abort(); \ | ||
410 | } \ | ||
411 | } while (0) | ||
412 | |||
413 | |||
414 | /* | ||
415 | * Main differential comparison routine. The inputs should be raw not | ||
416 | * cooked. The return is -1,0,1 for normal values, 2 otherwise. | ||
417 | */ | ||
418 | |||
419 | #define _FP_CMP(fs, wc, ret, X, Y, un) \ | ||
420 | do { \ | ||
421 | /* NANs are unordered */ \ | ||
422 | if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \ | ||
423 | || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \ | ||
424 | { \ | ||
425 | ret = un; \ | ||
426 | } \ | ||
427 | else \ | ||
428 | { \ | ||
429 | int __x_zero = (!X##_e && _FP_FRAC_ZEROP_##wc(X)) ? 1 : 0; \ | ||
430 | int __y_zero = (!Y##_e && _FP_FRAC_ZEROP_##wc(Y)) ? 1 : 0; \ | ||
431 | \ | ||
432 | if (__x_zero && __y_zero) \ | ||
433 | ret = 0; \ | ||
434 | else if (__x_zero) \ | ||
435 | ret = Y##_s ? 1 : -1; \ | ||
436 | else if (__y_zero) \ | ||
437 | ret = X##_s ? -1 : 1; \ | ||
438 | else if (X##_s != Y##_s) \ | ||
439 | ret = X##_s ? -1 : 1; \ | ||
440 | else if (X##_e > Y##_e) \ | ||
441 | ret = X##_s ? -1 : 1; \ | ||
442 | else if (X##_e < Y##_e) \ | ||
443 | ret = X##_s ? 1 : -1; \ | ||
444 | else if (_FP_FRAC_GT_##wc(X, Y)) \ | ||
445 | ret = X##_s ? -1 : 1; \ | ||
446 | else if (_FP_FRAC_GT_##wc(Y, X)) \ | ||
447 | ret = X##_s ? 1 : -1; \ | ||
448 | else \ | ||
449 | ret = 0; \ | ||
450 | } \ | ||
451 | } while (0) | ||
452 | |||
453 | |||
454 | /* Simplification for strict equality. */ | ||
455 | |||
456 | #define _FP_CMP_EQ(fs, wc, ret, X, Y) \ | ||
457 | do { \ | ||
458 | /* NANs are unordered */ \ | ||
459 | if ((X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X)) \ | ||
460 | || (Y##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(Y))) \ | ||
461 | { \ | ||
462 | ret = 1; \ | ||
463 | } \ | ||
464 | else \ | ||
465 | { \ | ||
466 | ret = !(X##_e == Y##_e \ | ||
467 | && _FP_FRAC_EQ_##wc(X, Y) \ | ||
468 | && (X##_s == Y##_s || !X##_e && _FP_FRAC_ZEROP_##wc(X))); \ | ||
469 | } \ | ||
470 | } while (0) | ||
471 | |||
472 | /* | ||
473 | * Main square root routine. The input value should be cooked. | ||
474 | */ | ||
475 | |||
476 | #define _FP_SQRT(fs, wc, R, X) \ | ||
477 | do { \ | ||
478 | _FP_FRAC_DECL_##wc(T); _FP_FRAC_DECL_##wc(S); \ | ||
479 | _FP_W_TYPE q; \ | ||
480 | switch (X##_c) \ | ||
481 | { \ | ||
482 | case FP_CLS_NAN: \ | ||
483 | R##_s = 0; \ | ||
484 | R##_c = FP_CLS_NAN; \ | ||
485 | _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc); \ | ||
486 | break; \ | ||
487 | case FP_CLS_INF: \ | ||
488 | if (X##_s) \ | ||
489 | { \ | ||
490 | R##_s = 0; \ | ||
491 | R##_c = FP_CLS_NAN; /* sNAN */ \ | ||
492 | } \ | ||
493 | else \ | ||
494 | { \ | ||
495 | R##_s = 0; \ | ||
496 | R##_c = FP_CLS_INF; /* sqrt(+inf) = +inf */ \ | ||
497 | } \ | ||
498 | break; \ | ||
499 | case FP_CLS_ZERO: \ | ||
500 | R##_s = X##_s; \ | ||
501 | R##_c = FP_CLS_ZERO; /* sqrt(+-0) = +-0 */ \ | ||
502 | break; \ | ||
503 | case FP_CLS_NORMAL: \ | ||
504 | R##_s = 0; \ | ||
505 | if (X##_s) \ | ||
506 | { \ | ||
507 | R##_c = FP_CLS_NAN; /* sNAN */ \ | ||
508 | break; \ | ||
509 | } \ | ||
510 | R##_c = FP_CLS_NORMAL; \ | ||
511 | if (X##_e & 1) \ | ||
512 | _FP_FRAC_SLL_##wc(X, 1); \ | ||
513 | R##_e = X##_e >> 1; \ | ||
514 | _FP_FRAC_SET_##wc(S, _FP_ZEROFRAC_##wc); \ | ||
515 | _FP_FRAC_SET_##wc(R, _FP_ZEROFRAC_##wc); \ | ||
516 | q = _FP_OVERFLOW_##fs; \ | ||
517 | _FP_FRAC_SLL_##wc(X, 1); \ | ||
518 | _FP_SQRT_MEAT_##wc(R, S, T, X, q); \ | ||
519 | _FP_FRAC_SRL_##wc(R, 1); \ | ||
520 | } \ | ||
521 | } while (0) | ||
522 | |||
523 | /* | ||
524 | * Convert from FP to integer | ||
525 | */ | ||
526 | |||
527 | /* "When a NaN, infinity, large positive argument >= 2147483648.0, or | ||
528 | * large negative argument <= -2147483649.0 is converted to an integer, | ||
529 | * the invalid_current bit...should be set and fp_exception_IEEE_754 should | ||
530 | * be raised. If the floating point invalid trap is disabled, no trap occurs | ||
531 | * and a numerical result is generated: if the sign bit of the operand | ||
532 | * is 0, the result is 2147483647; if the sign bit of the operand is 1, | ||
533 | * the result is -2147483648." | ||
534 | * Similarly for conversion to extended ints, except that the boundaries | ||
535 | * are >= 2^63, <= -(2^63 + 1), and the results are 2^63 + 1 for s=0 and | ||
536 | * -2^63 for s=1. | ||
537 | * -- SPARC Architecture Manual V9, Appendix B, which specifies how | ||
538 | * SPARCs resolve implementation dependencies in the IEEE-754 spec. | ||
539 | * I don't believe that the code below follows this. I'm not even sure | ||
540 | * it's right! | ||
541 | * It doesn't cope with needing to convert to an n bit integer when there | ||
542 | * is no n bit integer type. Fortunately gcc provides long long so this | ||
543 | * isn't a problem for sparc32. | ||
544 | * I have, however, fixed its NaN handling to conform as above. | ||
545 | * -- PMM 02/1998 | ||
546 | * NB: rsigned is not 'is r declared signed?' but 'should the value stored | ||
547 | * in r be signed or unsigned?'. r is always(?) declared unsigned. | ||
548 | * Comments below are mine, BTW -- PMM | ||
549 | */ | ||
550 | #define _FP_TO_INT(fs, wc, r, X, rsize, rsigned) \ | ||
551 | do { \ | ||
552 | switch (X##_c) \ | ||
553 | { \ | ||
554 | case FP_CLS_NORMAL: \ | ||
555 | if (X##_e < 0) \ | ||
556 | { \ | ||
557 | /* case FP_CLS_NAN: see above! */ \ | ||
558 | case FP_CLS_ZERO: \ | ||
559 | r = 0; \ | ||
560 | } \ | ||
561 | else if (X##_e >= rsize - (rsigned != 0)) \ | ||
562 | { /* overflow */ \ | ||
563 | case FP_CLS_NAN: \ | ||
564 | case FP_CLS_INF: \ | ||
565 | if (rsigned) \ | ||
566 | { \ | ||
567 | r = 1; \ | ||
568 | r <<= rsize - 1; \ | ||
569 | r -= 1 - X##_s; \ | ||
570 | } \ | ||
571 | else \ | ||
572 | { \ | ||
573 | r = 0; \ | ||
574 | if (!X##_s) \ | ||
575 | r = ~r; \ | ||
576 | } \ | ||
577 | } \ | ||
578 | else \ | ||
579 | { \ | ||
580 | if (_FP_W_TYPE_SIZE*wc < rsize) \ | ||
581 | { \ | ||
582 | _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \ | ||
583 | r <<= X##_e - _FP_WFRACBITS_##fs; \ | ||
584 | } \ | ||
585 | else \ | ||
586 | { \ | ||
587 | if (X##_e >= _FP_WFRACBITS_##fs) \ | ||
588 | _FP_FRAC_SLL_##wc(X, (X##_e - _FP_WFRACBITS_##fs + 1));\ | ||
589 | else \ | ||
590 | _FP_FRAC_SRL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));\ | ||
591 | _FP_FRAC_ASSEMBLE_##wc(r, X, rsize); \ | ||
592 | } \ | ||
593 | if (rsigned && X##_s) \ | ||
594 | r = -r; \ | ||
595 | } \ | ||
596 | break; \ | ||
597 | } \ | ||
598 | } while (0) | ||
599 | |||
600 | #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype) \ | ||
601 | do { \ | ||
602 | if (r) \ | ||
603 | { \ | ||
604 | X##_c = FP_CLS_NORMAL; \ | ||
605 | \ | ||
606 | if ((X##_s = (r < 0))) \ | ||
607 | r = -r; \ | ||
608 | /* Note that `r' is now considered unsigned, so we don't have \ | ||
609 | to worry about the single signed overflow case. */ \ | ||
610 | \ | ||
611 | if (rsize <= _FP_W_TYPE_SIZE) \ | ||
612 | __FP_CLZ(X##_e, r); \ | ||
613 | else \ | ||
614 | __FP_CLZ_2(X##_e, (_FP_W_TYPE)(r >> _FP_W_TYPE_SIZE), \ | ||
615 | (_FP_W_TYPE)r); \ | ||
616 | if (rsize < _FP_W_TYPE_SIZE) \ | ||
617 | X##_e -= (_FP_W_TYPE_SIZE - rsize); \ | ||
618 | X##_e = rsize - X##_e - 1; \ | ||
619 | \ | ||
620 | if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e) \ | ||
621 | __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs), rsize); \ | ||
622 | r &= ~((_FP_W_TYPE)1 << X##_e); \ | ||
623 | _FP_FRAC_DISASSEMBLE_##wc(X, ((unsigned rtype)r), rsize); \ | ||
624 | _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1)); \ | ||
625 | } \ | ||
626 | else \ | ||
627 | { \ | ||
628 | X##_c = FP_CLS_ZERO, X##_s = 0; \ | ||
629 | } \ | ||
630 | } while (0) | ||
631 | |||
632 | |||
633 | #define FP_CONV(dfs,sfs,dwc,swc,D,S) \ | ||
634 | do { \ | ||
635 | _FP_FRAC_CONV_##dwc##_##swc(dfs, sfs, D, S); \ | ||
636 | D##_e = S##_e; \ | ||
637 | D##_c = S##_c; \ | ||
638 | D##_s = S##_s; \ | ||
639 | } while (0) | ||
640 | |||
641 | /* | ||
642 | * Helper primitives. | ||
643 | */ | ||
644 | |||
645 | /* Count leading zeros in a word. */ | ||
646 | |||
647 | #ifndef __FP_CLZ | ||
648 | #if _FP_W_TYPE_SIZE < 64 | ||
649 | /* this is just to shut the compiler up about shifts > word length -- PMM 02/1998 */ | ||
650 | #define __FP_CLZ(r, x) \ | ||
651 | do { \ | ||
652 | _FP_W_TYPE _t = (x); \ | ||
653 | r = _FP_W_TYPE_SIZE - 1; \ | ||
654 | if (_t > 0xffff) r -= 16; \ | ||
655 | if (_t > 0xffff) _t >>= 16; \ | ||
656 | if (_t > 0xff) r -= 8; \ | ||
657 | if (_t > 0xff) _t >>= 8; \ | ||
658 | if (_t & 0xf0) r -= 4; \ | ||
659 | if (_t & 0xf0) _t >>= 4; \ | ||
660 | if (_t & 0xc) r -= 2; \ | ||
661 | if (_t & 0xc) _t >>= 2; \ | ||
662 | if (_t & 0x2) r -= 1; \ | ||
663 | } while (0) | ||
664 | #else /* not _FP_W_TYPE_SIZE < 64 */ | ||
665 | #define __FP_CLZ(r, x) \ | ||
666 | do { \ | ||
667 | _FP_W_TYPE _t = (x); \ | ||
668 | r = _FP_W_TYPE_SIZE - 1; \ | ||
669 | if (_t > 0xffffffff) r -= 32; \ | ||
670 | if (_t > 0xffffffff) _t >>= 32; \ | ||
671 | if (_t > 0xffff) r -= 16; \ | ||
672 | if (_t > 0xffff) _t >>= 16; \ | ||
673 | if (_t > 0xff) r -= 8; \ | ||
674 | if (_t > 0xff) _t >>= 8; \ | ||
675 | if (_t & 0xf0) r -= 4; \ | ||
676 | if (_t & 0xf0) _t >>= 4; \ | ||
677 | if (_t & 0xc) r -= 2; \ | ||
678 | if (_t & 0xc) _t >>= 2; \ | ||
679 | if (_t & 0x2) r -= 1; \ | ||
680 | } while (0) | ||
681 | #endif /* not _FP_W_TYPE_SIZE < 64 */ | ||
682 | #endif /* ndef __FP_CLZ */ | ||
683 | |||
684 | #define _FP_DIV_HELP_imm(q, r, n, d) \ | ||
685 | do { \ | ||
686 | q = n / d, r = n % d; \ | ||
687 | } while (0) | ||
688 | |||
diff --git a/arch/ppc/math-emu/sfp-machine.h b/arch/ppc/math-emu/sfp-machine.h deleted file mode 100644 index 4b17d83cfcdd..000000000000 --- a/arch/ppc/math-emu/sfp-machine.h +++ /dev/null | |||
@@ -1,377 +0,0 @@ | |||
1 | /* Machine-dependent software floating-point definitions. PPC version. | ||
2 | Copyright (C) 1997 Free Software Foundation, Inc. | ||
3 | This file is part of the GNU C Library. | ||
4 | |||
5 | The GNU C Library is free software; you can redistribute it and/or | ||
6 | modify it under the terms of the GNU Library General Public License as | ||
7 | published by the Free Software Foundation; either version 2 of the | ||
8 | License, or (at your option) any later version. | ||
9 | |||
10 | The GNU C Library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Library General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Library General Public | ||
16 | License along with the GNU C Library; see the file COPYING.LIB. If | ||
17 | not, write to the Free Software Foundation, Inc., | ||
18 | 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | |||
20 | Actually, this is a PPC (32bit) version, written based on the | ||
21 | i386, sparc, and sparc64 versions, by me, | ||
22 | Peter Maydell (pmaydell@chiark.greenend.org.uk). | ||
23 | Comments are by and large also mine, although they may be inaccurate. | ||
24 | |||
25 | In picking out asm fragments I've gone with the lowest common | ||
26 | denominator, which also happens to be the hardware I have :-> | ||
27 | That is, a SPARC without hardware multiply and divide. | ||
28 | */ | ||
29 | |||
30 | /* basic word size definitions */ | ||
31 | #define _FP_W_TYPE_SIZE 32 | ||
32 | #define _FP_W_TYPE unsigned long | ||
33 | #define _FP_WS_TYPE signed long | ||
34 | #define _FP_I_TYPE long | ||
35 | |||
36 | #define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) | ||
37 | #define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) | ||
38 | #define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) | ||
39 | |||
40 | /* You can optionally code some things like addition in asm. For | ||
41 | * example, i386 defines __FP_FRAC_ADD_2 as asm. If you don't | ||
42 | * then you get a fragment of C code [if you change an #ifdef 0 | ||
43 | * in op-2.h] or a call to add_ssaaaa (see below). | ||
44 | * Good places to look for asm fragments to use are gcc and glibc. | ||
45 | * gcc's longlong.h is useful. | ||
46 | */ | ||
47 | |||
48 | /* We need to know how to multiply and divide. If the host word size | ||
49 | * is >= 2*fracbits you can use FP_MUL_MEAT_n_imm(t,R,X,Y) which | ||
50 | * codes the multiply with whatever gcc does to 'a * b'. | ||
51 | * _FP_MUL_MEAT_n_wide(t,R,X,Y,f) is used when you have an asm | ||
52 | * function that can multiply two 1W values and get a 2W result. | ||
53 | * Otherwise you're stuck with _FP_MUL_MEAT_n_hard(t,R,X,Y) which | ||
54 | * does bitshifting to avoid overflow. | ||
55 | * For division there is FP_DIV_MEAT_n_imm(t,R,X,Y,f) for word size | ||
56 | * >= 2*fracbits, where f is either _FP_DIV_HELP_imm or | ||
57 | * _FP_DIV_HELP_ldiv (see op-1.h). | ||
58 | * _FP_DIV_MEAT_udiv() is if you have asm to do 2W/1W => (1W, 1W). | ||
59 | * [GCC and glibc have longlong.h which has the asm macro udiv_qrnnd | ||
60 | * to do this.] | ||
61 | * In general, 'n' is the number of words required to hold the type, | ||
62 | * and 't' is either S, D or Q for single/double/quad. | ||
63 | * -- PMM | ||
64 | */ | ||
65 | /* Example: SPARC64: | ||
66 | * #define _FP_MUL_MEAT_S(R,X,Y) _FP_MUL_MEAT_1_imm(S,R,X,Y) | ||
67 | * #define _FP_MUL_MEAT_D(R,X,Y) _FP_MUL_MEAT_1_wide(D,R,X,Y,umul_ppmm) | ||
68 | * #define _FP_MUL_MEAT_Q(R,X,Y) _FP_MUL_MEAT_2_wide(Q,R,X,Y,umul_ppmm) | ||
69 | * | ||
70 | * #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) | ||
71 | * #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv(D,R,X,Y) | ||
72 | * #define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv_64(Q,R,X,Y) | ||
73 | * | ||
74 | * Example: i386: | ||
75 | * #define _FP_MUL_MEAT_S(R,X,Y) _FP_MUL_MEAT_1_wide(S,R,X,Y,_i386_mul_32_64) | ||
76 | * #define _FP_MUL_MEAT_D(R,X,Y) _FP_MUL_MEAT_2_wide(D,R,X,Y,_i386_mul_32_64) | ||
77 | * | ||
78 | * #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y,_i386_div_64_32) | ||
79 | * #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv_64(D,R,X,Y) | ||
80 | */ | ||
81 | |||
82 | #define _FP_MUL_MEAT_S(R,X,Y) _FP_MUL_MEAT_1_wide(S,R,X,Y,umul_ppmm) | ||
83 | #define _FP_MUL_MEAT_D(R,X,Y) _FP_MUL_MEAT_2_wide(D,R,X,Y,umul_ppmm) | ||
84 | |||
85 | #define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y) | ||
86 | #define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv_64(D,R,X,Y) | ||
87 | |||
88 | /* These macros define what NaN looks like. They're supposed to expand to | ||
89 | * a comma-separated set of 32bit unsigned ints that encode NaN. | ||
90 | */ | ||
91 | #define _FP_NANFRAC_S _FP_QNANBIT_S | ||
92 | #define _FP_NANFRAC_D _FP_QNANBIT_D, 0 | ||
93 | #define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0 | ||
94 | |||
95 | #define _FP_KEEPNANFRACP 1 | ||
96 | |||
97 | /* This macro appears to be called when both X and Y are NaNs, and | ||
98 | * has to choose one and copy it to R. i386 goes for the larger of the | ||
99 | * two, sparc64 just picks Y. I don't understand this at all so I'll | ||
100 | * go with sparc64 because it's shorter :-> -- PMM | ||
101 | */ | ||
102 | #define _FP_CHOOSENAN(fs, wc, R, X, Y) \ | ||
103 | do { \ | ||
104 | R##_s = Y##_s; \ | ||
105 | _FP_FRAC_COPY_##wc(R,Y); \ | ||
106 | R##_c = FP_CLS_NAN; \ | ||
107 | } while (0) | ||
108 | |||
109 | |||
110 | extern void fp_unpack_d(long *, unsigned long *, unsigned long *, | ||
111 | long *, long *, void *); | ||
112 | extern int fp_pack_d(void *, long, unsigned long, unsigned long, long, long); | ||
113 | extern int fp_pack_ds(void *, long, unsigned long, unsigned long, long, long); | ||
114 | |||
115 | #define __FP_UNPACK_RAW_1(fs, X, val) \ | ||
116 | do { \ | ||
117 | union _FP_UNION_##fs *_flo = \ | ||
118 | (union _FP_UNION_##fs *)val; \ | ||
119 | \ | ||
120 | X##_f = _flo->bits.frac; \ | ||
121 | X##_e = _flo->bits.exp; \ | ||
122 | X##_s = _flo->bits.sign; \ | ||
123 | } while (0) | ||
124 | |||
125 | #define __FP_UNPACK_RAW_2(fs, X, val) \ | ||
126 | do { \ | ||
127 | union _FP_UNION_##fs *_flo = \ | ||
128 | (union _FP_UNION_##fs *)val; \ | ||
129 | \ | ||
130 | X##_f0 = _flo->bits.frac0; \ | ||
131 | X##_f1 = _flo->bits.frac1; \ | ||
132 | X##_e = _flo->bits.exp; \ | ||
133 | X##_s = _flo->bits.sign; \ | ||
134 | } while (0) | ||
135 | |||
136 | #define __FP_UNPACK_S(X,val) \ | ||
137 | do { \ | ||
138 | __FP_UNPACK_RAW_1(S,X,val); \ | ||
139 | _FP_UNPACK_CANONICAL(S,1,X); \ | ||
140 | } while (0) | ||
141 | |||
142 | #define __FP_UNPACK_D(X,val) \ | ||
143 | fp_unpack_d(&X##_s, &X##_f1, &X##_f0, &X##_e, &X##_c, val) | ||
144 | |||
145 | #define __FP_PACK_RAW_1(fs, val, X) \ | ||
146 | do { \ | ||
147 | union _FP_UNION_##fs *_flo = \ | ||
148 | (union _FP_UNION_##fs *)val; \ | ||
149 | \ | ||
150 | _flo->bits.frac = X##_f; \ | ||
151 | _flo->bits.exp = X##_e; \ | ||
152 | _flo->bits.sign = X##_s; \ | ||
153 | } while (0) | ||
154 | |||
155 | #define __FP_PACK_RAW_2(fs, val, X) \ | ||
156 | do { \ | ||
157 | union _FP_UNION_##fs *_flo = \ | ||
158 | (union _FP_UNION_##fs *)val; \ | ||
159 | \ | ||
160 | _flo->bits.frac0 = X##_f0; \ | ||
161 | _flo->bits.frac1 = X##_f1; \ | ||
162 | _flo->bits.exp = X##_e; \ | ||
163 | _flo->bits.sign = X##_s; \ | ||
164 | } while (0) | ||
165 | |||
166 | #include <linux/kernel.h> | ||
167 | #include <linux/sched.h> | ||
168 | |||
169 | #define __FPU_FPSCR (current->thread.fpscr.val) | ||
170 | |||
171 | /* We only actually write to the destination register | ||
172 | * if exceptions signalled (if any) will not trap. | ||
173 | */ | ||
174 | #define __FPU_ENABLED_EXC \ | ||
175 | ({ \ | ||
176 | (__FPU_FPSCR >> 3) & 0x1f; \ | ||
177 | }) | ||
178 | |||
179 | #define __FPU_TRAP_P(bits) \ | ||
180 | ((__FPU_ENABLED_EXC & (bits)) != 0) | ||
181 | |||
182 | #define __FP_PACK_S(val,X) \ | ||
183 | ({ int __exc = _FP_PACK_CANONICAL(S,1,X); \ | ||
184 | if(!__exc || !__FPU_TRAP_P(__exc)) \ | ||
185 | __FP_PACK_RAW_1(S,val,X); \ | ||
186 | __exc; \ | ||
187 | }) | ||
188 | |||
189 | #define __FP_PACK_D(val,X) \ | ||
190 | fp_pack_d(val, X##_s, X##_f1, X##_f0, X##_e, X##_c) | ||
191 | |||
192 | #define __FP_PACK_DS(val,X) \ | ||
193 | fp_pack_ds(val, X##_s, X##_f1, X##_f0, X##_e, X##_c) | ||
194 | |||
195 | /* Obtain the current rounding mode. */ | ||
196 | #define FP_ROUNDMODE \ | ||
197 | ({ \ | ||
198 | __FPU_FPSCR & 0x3; \ | ||
199 | }) | ||
200 | |||
201 | /* the asm fragments go here: all these are taken from glibc-2.0.5's | ||
202 | * stdlib/longlong.h | ||
203 | */ | ||
204 | |||
205 | #include <linux/types.h> | ||
206 | #include <asm/byteorder.h> | ||
207 | |||
208 | /* add_ssaaaa is used in op-2.h and should be equivalent to | ||
209 | * #define add_ssaaaa(sh,sl,ah,al,bh,bl) (sh = ah+bh+ (( sl = al+bl) < al)) | ||
210 | * add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, | ||
211 | * high_addend_2, low_addend_2) adds two UWtype integers, composed by | ||
212 | * HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2 | ||
213 | * respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow | ||
214 | * (i.e. carry out) is not stored anywhere, and is lost. | ||
215 | */ | ||
216 | #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ | ||
217 | do { \ | ||
218 | if (__builtin_constant_p (bh) && (bh) == 0) \ | ||
219 | __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ | ||
220 | : "=r" ((USItype)(sh)), \ | ||
221 | "=&r" ((USItype)(sl)) \ | ||
222 | : "%r" ((USItype)(ah)), \ | ||
223 | "%r" ((USItype)(al)), \ | ||
224 | "rI" ((USItype)(bl))); \ | ||
225 | else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \ | ||
226 | __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ | ||
227 | : "=r" ((USItype)(sh)), \ | ||
228 | "=&r" ((USItype)(sl)) \ | ||
229 | : "%r" ((USItype)(ah)), \ | ||
230 | "%r" ((USItype)(al)), \ | ||
231 | "rI" ((USItype)(bl))); \ | ||
232 | else \ | ||
233 | __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ | ||
234 | : "=r" ((USItype)(sh)), \ | ||
235 | "=&r" ((USItype)(sl)) \ | ||
236 | : "%r" ((USItype)(ah)), \ | ||
237 | "r" ((USItype)(bh)), \ | ||
238 | "%r" ((USItype)(al)), \ | ||
239 | "rI" ((USItype)(bl))); \ | ||
240 | } while (0) | ||
241 | |||
242 | /* sub_ddmmss is used in op-2.h and udivmodti4.c and should be equivalent to | ||
243 | * #define sub_ddmmss(sh, sl, ah, al, bh, bl) (sh = ah-bh - ((sl = al-bl) > al)) | ||
244 | * sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend, | ||
245 | * high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers, | ||
246 | * composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and | ||
247 | * LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE | ||
248 | * and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, | ||
249 | * and is lost. | ||
250 | */ | ||
251 | #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ | ||
252 | do { \ | ||
253 | if (__builtin_constant_p (ah) && (ah) == 0) \ | ||
254 | __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ | ||
255 | : "=r" ((USItype)(sh)), \ | ||
256 | "=&r" ((USItype)(sl)) \ | ||
257 | : "r" ((USItype)(bh)), \ | ||
258 | "rI" ((USItype)(al)), \ | ||
259 | "r" ((USItype)(bl))); \ | ||
260 | else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0) \ | ||
261 | __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ | ||
262 | : "=r" ((USItype)(sh)), \ | ||
263 | "=&r" ((USItype)(sl)) \ | ||
264 | : "r" ((USItype)(bh)), \ | ||
265 | "rI" ((USItype)(al)), \ | ||
266 | "r" ((USItype)(bl))); \ | ||
267 | else if (__builtin_constant_p (bh) && (bh) == 0) \ | ||
268 | __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ | ||
269 | : "=r" ((USItype)(sh)), \ | ||
270 | "=&r" ((USItype)(sl)) \ | ||
271 | : "r" ((USItype)(ah)), \ | ||
272 | "rI" ((USItype)(al)), \ | ||
273 | "r" ((USItype)(bl))); \ | ||
274 | else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0) \ | ||
275 | __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ | ||
276 | : "=r" ((USItype)(sh)), \ | ||
277 | "=&r" ((USItype)(sl)) \ | ||
278 | : "r" ((USItype)(ah)), \ | ||
279 | "rI" ((USItype)(al)), \ | ||
280 | "r" ((USItype)(bl))); \ | ||
281 | else \ | ||
282 | __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ | ||
283 | : "=r" ((USItype)(sh)), \ | ||
284 | "=&r" ((USItype)(sl)) \ | ||
285 | : "r" ((USItype)(ah)), \ | ||
286 | "r" ((USItype)(bh)), \ | ||
287 | "rI" ((USItype)(al)), \ | ||
288 | "r" ((USItype)(bl))); \ | ||
289 | } while (0) | ||
290 | |||
291 | /* asm fragments for mul and div */ | ||
292 | |||
293 | /* umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two | ||
294 | * UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype | ||
295 | * word product in HIGH_PROD and LOW_PROD. | ||
296 | */ | ||
297 | #define umul_ppmm(ph, pl, m0, m1) \ | ||
298 | do { \ | ||
299 | USItype __m0 = (m0), __m1 = (m1); \ | ||
300 | __asm__ ("mulhwu %0,%1,%2" \ | ||
301 | : "=r" ((USItype)(ph)) \ | ||
302 | : "%r" (__m0), \ | ||
303 | "r" (__m1)); \ | ||
304 | (pl) = __m0 * __m1; \ | ||
305 | } while (0) | ||
306 | |||
307 | /* udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, | ||
308 | * denominator) divides a UDWtype, composed by the UWtype integers | ||
309 | * HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient | ||
310 | * in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less | ||
311 | * than DENOMINATOR for correct operation. If, in addition, the most | ||
312 | * significant bit of DENOMINATOR must be 1, then the pre-processor symbol | ||
313 | * UDIV_NEEDS_NORMALIZATION is defined to 1. | ||
314 | */ | ||
315 | #define udiv_qrnnd(q, r, n1, n0, d) \ | ||
316 | do { \ | ||
317 | UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \ | ||
318 | __d1 = __ll_highpart (d); \ | ||
319 | __d0 = __ll_lowpart (d); \ | ||
320 | \ | ||
321 | __r1 = (n1) % __d1; \ | ||
322 | __q1 = (n1) / __d1; \ | ||
323 | __m = (UWtype) __q1 * __d0; \ | ||
324 | __r1 = __r1 * __ll_B | __ll_highpart (n0); \ | ||
325 | if (__r1 < __m) \ | ||
326 | { \ | ||
327 | __q1--, __r1 += (d); \ | ||
328 | if (__r1 >= (d)) /* we didn't get carry when adding to __r1 */ \ | ||
329 | if (__r1 < __m) \ | ||
330 | __q1--, __r1 += (d); \ | ||
331 | } \ | ||
332 | __r1 -= __m; \ | ||
333 | \ | ||
334 | __r0 = __r1 % __d1; \ | ||
335 | __q0 = __r1 / __d1; \ | ||
336 | __m = (UWtype) __q0 * __d0; \ | ||
337 | __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ | ||
338 | if (__r0 < __m) \ | ||
339 | { \ | ||
340 | __q0--, __r0 += (d); \ | ||
341 | if (__r0 >= (d)) \ | ||
342 | if (__r0 < __m) \ | ||
343 | __q0--, __r0 += (d); \ | ||
344 | } \ | ||
345 | __r0 -= __m; \ | ||
346 | \ | ||
347 | (q) = (UWtype) __q1 * __ll_B | __q0; \ | ||
348 | (r) = __r0; \ | ||
349 | } while (0) | ||
350 | |||
351 | #define UDIV_NEEDS_NORMALIZATION 1 | ||
352 | |||
353 | #define abort() \ | ||
354 | return 0 | ||
355 | |||
356 | #ifdef __BIG_ENDIAN | ||
357 | #define __BYTE_ORDER __BIG_ENDIAN | ||
358 | #else | ||
359 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
360 | #endif | ||
361 | |||
362 | /* Exception flags. */ | ||
363 | #define EFLAG_INVALID (1 << (31 - 2)) | ||
364 | #define EFLAG_OVERFLOW (1 << (31 - 3)) | ||
365 | #define EFLAG_UNDERFLOW (1 << (31 - 4)) | ||
366 | #define EFLAG_DIVZERO (1 << (31 - 5)) | ||
367 | #define EFLAG_INEXACT (1 << (31 - 6)) | ||
368 | |||
369 | #define EFLAG_VXSNAN (1 << (31 - 7)) | ||
370 | #define EFLAG_VXISI (1 << (31 - 8)) | ||
371 | #define EFLAG_VXIDI (1 << (31 - 9)) | ||
372 | #define EFLAG_VXZDZ (1 << (31 - 10)) | ||
373 | #define EFLAG_VXIMZ (1 << (31 - 11)) | ||
374 | #define EFLAG_VXVC (1 << (31 - 12)) | ||
375 | #define EFLAG_VXSOFT (1 << (31 - 21)) | ||
376 | #define EFLAG_VXSQRT (1 << (31 - 22)) | ||
377 | #define EFLAG_VXCVI (1 << (31 - 23)) | ||
diff --git a/arch/ppc/math-emu/single.h b/arch/ppc/math-emu/single.h deleted file mode 100644 index f19d99451815..000000000000 --- a/arch/ppc/math-emu/single.h +++ /dev/null | |||
@@ -1,66 +0,0 @@ | |||
1 | /* | ||
2 | * Definitions for IEEE Single Precision | ||
3 | */ | ||
4 | |||
5 | #if _FP_W_TYPE_SIZE < 32 | ||
6 | #error "Here's a nickel kid. Go buy yourself a real computer." | ||
7 | #endif | ||
8 | |||
9 | #define _FP_FRACBITS_S 24 | ||
10 | #define _FP_FRACXBITS_S (_FP_W_TYPE_SIZE - _FP_FRACBITS_S) | ||
11 | #define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S) | ||
12 | #define _FP_WFRACXBITS_S (_FP_W_TYPE_SIZE - _FP_WFRACBITS_S) | ||
13 | #define _FP_EXPBITS_S 8 | ||
14 | #define _FP_EXPBIAS_S 127 | ||
15 | #define _FP_EXPMAX_S 255 | ||
16 | #define _FP_QNANBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-2)) | ||
17 | #define _FP_IMPLBIT_S ((_FP_W_TYPE)1 << (_FP_FRACBITS_S-1)) | ||
18 | #define _FP_OVERFLOW_S ((_FP_W_TYPE)1 << (_FP_WFRACBITS_S)) | ||
19 | |||
20 | /* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be | ||
21 | chosen by the target machine. */ | ||
22 | |||
23 | union _FP_UNION_S | ||
24 | { | ||
25 | float flt; | ||
26 | struct { | ||
27 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
28 | unsigned sign : 1; | ||
29 | unsigned exp : _FP_EXPBITS_S; | ||
30 | unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); | ||
31 | #else | ||
32 | unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0); | ||
33 | unsigned exp : _FP_EXPBITS_S; | ||
34 | unsigned sign : 1; | ||
35 | #endif | ||
36 | } bits __attribute__((packed)); | ||
37 | }; | ||
38 | |||
39 | #define FP_DECL_S(X) _FP_DECL(1,X) | ||
40 | #define FP_UNPACK_RAW_S(X,val) _FP_UNPACK_RAW_1(S,X,val) | ||
41 | #define FP_PACK_RAW_S(val,X) _FP_PACK_RAW_1(S,val,X) | ||
42 | |||
43 | #define FP_UNPACK_S(X,val) \ | ||
44 | do { \ | ||
45 | _FP_UNPACK_RAW_1(S,X,val); \ | ||
46 | _FP_UNPACK_CANONICAL(S,1,X); \ | ||
47 | } while (0) | ||
48 | |||
49 | #define FP_PACK_S(val,X) \ | ||
50 | do { \ | ||
51 | _FP_PACK_CANONICAL(S,1,X); \ | ||
52 | _FP_PACK_RAW_1(S,val,X); \ | ||
53 | } while (0) | ||
54 | |||
55 | #define FP_NEG_S(R,X) _FP_NEG(S,1,R,X) | ||
56 | #define FP_ADD_S(R,X,Y) _FP_ADD(S,1,R,X,Y) | ||
57 | #define FP_SUB_S(R,X,Y) _FP_SUB(S,1,R,X,Y) | ||
58 | #define FP_MUL_S(R,X,Y) _FP_MUL(S,1,R,X,Y) | ||
59 | #define FP_DIV_S(R,X,Y) _FP_DIV(S,1,R,X,Y) | ||
60 | #define FP_SQRT_S(R,X) _FP_SQRT(S,1,R,X) | ||
61 | |||
62 | #define FP_CMP_S(r,X,Y,un) _FP_CMP(S,1,r,X,Y,un) | ||
63 | #define FP_CMP_EQ_S(r,X,Y) _FP_CMP_EQ(S,1,r,X,Y) | ||
64 | |||
65 | #define FP_TO_INT_S(r,X,rsz,rsg) _FP_TO_INT(S,1,r,X,rsz,rsg) | ||
66 | #define FP_FROM_INT_S(X,r,rs,rt) _FP_FROM_INT(S,1,X,r,rs,rt) | ||
diff --git a/arch/ppc/math-emu/soft-fp.h b/arch/ppc/math-emu/soft-fp.h deleted file mode 100644 index cca39598f873..000000000000 --- a/arch/ppc/math-emu/soft-fp.h +++ /dev/null | |||
@@ -1,104 +0,0 @@ | |||
1 | #ifndef SOFT_FP_H | ||
2 | #define SOFT_FP_H | ||
3 | |||
4 | #include "sfp-machine.h" | ||
5 | |||
6 | #define _FP_WORKBITS 3 | ||
7 | #define _FP_WORK_LSB ((_FP_W_TYPE)1 << 3) | ||
8 | #define _FP_WORK_ROUND ((_FP_W_TYPE)1 << 2) | ||
9 | #define _FP_WORK_GUARD ((_FP_W_TYPE)1 << 1) | ||
10 | #define _FP_WORK_STICKY ((_FP_W_TYPE)1 << 0) | ||
11 | |||
12 | #ifndef FP_RND_NEAREST | ||
13 | # define FP_RND_NEAREST 0 | ||
14 | # define FP_RND_ZERO 1 | ||
15 | # define FP_RND_PINF 2 | ||
16 | # define FP_RND_MINF 3 | ||
17 | #ifndef FP_ROUNDMODE | ||
18 | # define FP_ROUNDMODE FP_RND_NEAREST | ||
19 | #endif | ||
20 | #endif | ||
21 | |||
22 | #define _FP_ROUND_NEAREST(wc, X) \ | ||
23 | ({ int __ret = 0; \ | ||
24 | int __frac = _FP_FRAC_LOW_##wc(X) & 15; \ | ||
25 | if (__frac & 7) { \ | ||
26 | __ret = EFLAG_INEXACT; \ | ||
27 | if ((__frac & 7) != _FP_WORK_ROUND) \ | ||
28 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \ | ||
29 | else if (__frac & _FP_WORK_LSB) \ | ||
30 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND); \ | ||
31 | } \ | ||
32 | __ret; \ | ||
33 | }) | ||
34 | |||
35 | #define _FP_ROUND_ZERO(wc, X) \ | ||
36 | ({ int __ret = 0; \ | ||
37 | if (_FP_FRAC_LOW_##wc(X) & 7) \ | ||
38 | __ret = EFLAG_INEXACT; \ | ||
39 | __ret; \ | ||
40 | }) | ||
41 | |||
42 | #define _FP_ROUND_PINF(wc, X) \ | ||
43 | ({ int __ret = EFLAG_INEXACT; \ | ||
44 | if (!X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \ | ||
45 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \ | ||
46 | else __ret = 0; \ | ||
47 | __ret; \ | ||
48 | }) | ||
49 | |||
50 | #define _FP_ROUND_MINF(wc, X) \ | ||
51 | ({ int __ret = EFLAG_INEXACT; \ | ||
52 | if (X##_s && (_FP_FRAC_LOW_##wc(X) & 7)) \ | ||
53 | _FP_FRAC_ADDI_##wc(X, _FP_WORK_LSB); \ | ||
54 | else __ret = 0; \ | ||
55 | __ret; \ | ||
56 | }) | ||
57 | |||
58 | #define _FP_ROUND(wc, X) \ | ||
59 | ({ int __ret = 0; \ | ||
60 | switch (FP_ROUNDMODE) \ | ||
61 | { \ | ||
62 | case FP_RND_NEAREST: \ | ||
63 | __ret |= _FP_ROUND_NEAREST(wc,X); \ | ||
64 | break; \ | ||
65 | case FP_RND_ZERO: \ | ||
66 | __ret |= _FP_ROUND_ZERO(wc,X); \ | ||
67 | break; \ | ||
68 | case FP_RND_PINF: \ | ||
69 | __ret |= _FP_ROUND_PINF(wc,X); \ | ||
70 | break; \ | ||
71 | case FP_RND_MINF: \ | ||
72 | __ret |= _FP_ROUND_MINF(wc,X); \ | ||
73 | break; \ | ||
74 | }; \ | ||
75 | __ret; \ | ||
76 | }) | ||
77 | |||
78 | #define FP_CLS_NORMAL 0 | ||
79 | #define FP_CLS_ZERO 1 | ||
80 | #define FP_CLS_INF 2 | ||
81 | #define FP_CLS_NAN 3 | ||
82 | |||
83 | #define _FP_CLS_COMBINE(x,y) (((x) << 2) | (y)) | ||
84 | |||
85 | #include "op-1.h" | ||
86 | #include "op-2.h" | ||
87 | #include "op-4.h" | ||
88 | #include "op-common.h" | ||
89 | |||
90 | /* Sigh. Silly things longlong.h needs. */ | ||
91 | #define UWtype _FP_W_TYPE | ||
92 | #define W_TYPE_SIZE _FP_W_TYPE_SIZE | ||
93 | |||
94 | typedef int SItype __attribute__((mode(SI))); | ||
95 | typedef int DItype __attribute__((mode(DI))); | ||
96 | typedef unsigned int USItype __attribute__((mode(SI))); | ||
97 | typedef unsigned int UDItype __attribute__((mode(DI))); | ||
98 | #if _FP_W_TYPE_SIZE == 32 | ||
99 | typedef unsigned int UHWtype __attribute__((mode(HI))); | ||
100 | #elif _FP_W_TYPE_SIZE == 64 | ||
101 | typedef USItype UHWtype; | ||
102 | #endif | ||
103 | |||
104 | #endif | ||
diff --git a/arch/ppc/math-emu/stfd.c b/arch/ppc/math-emu/stfd.c deleted file mode 100644 index 3f8c2558a9e8..000000000000 --- a/arch/ppc/math-emu/stfd.c +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | stfd(void *frS, void *ea) | ||
7 | { | ||
8 | #if 0 | ||
9 | #ifdef DEBUG | ||
10 | printk("%s: S %p, ea %p: ", __FUNCTION__, frS, ea); | ||
11 | dump_double(frS); | ||
12 | printk("\n"); | ||
13 | #endif | ||
14 | #endif | ||
15 | |||
16 | if (copy_to_user(ea, frS, sizeof(double))) | ||
17 | return -EFAULT; | ||
18 | |||
19 | return 0; | ||
20 | } | ||
diff --git a/arch/ppc/math-emu/stfiwx.c b/arch/ppc/math-emu/stfiwx.c deleted file mode 100644 index 95caaeec6a08..000000000000 --- a/arch/ppc/math-emu/stfiwx.c +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | int | ||
6 | stfiwx(u32 *frS, void *ea) | ||
7 | { | ||
8 | #ifdef DEBUG | ||
9 | printk("%s: %p %p\n", __FUNCTION__, frS, ea); | ||
10 | #endif | ||
11 | |||
12 | if (copy_to_user(ea, &frS[1], sizeof(frS[1]))) | ||
13 | return -EFAULT; | ||
14 | |||
15 | return 0; | ||
16 | } | ||
diff --git a/arch/ppc/math-emu/stfs.c b/arch/ppc/math-emu/stfs.c deleted file mode 100644 index e87ca23c6dc3..000000000000 --- a/arch/ppc/math-emu/stfs.c +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/errno.h> | ||
3 | #include <asm/uaccess.h> | ||
4 | |||
5 | #include "soft-fp.h" | ||
6 | #include "double.h" | ||
7 | #include "single.h" | ||
8 | |||
9 | int | ||
10 | stfs(void *frS, void *ea) | ||
11 | { | ||
12 | FP_DECL_D(A); | ||
13 | FP_DECL_S(R); | ||
14 | float f; | ||
15 | int err; | ||
16 | |||
17 | #ifdef DEBUG | ||
18 | printk("%s: S %p, ea %p\n", __FUNCTION__, frS, ea); | ||
19 | #endif | ||
20 | |||
21 | __FP_UNPACK_D(A, frS); | ||
22 | |||
23 | #ifdef DEBUG | ||
24 | printk("A: %ld %lu %lu %ld (%ld)\n", A_s, A_f1, A_f0, A_e, A_c); | ||
25 | #endif | ||
26 | |||
27 | FP_CONV(S, D, 1, 2, R, A); | ||
28 | |||
29 | #ifdef DEBUG | ||
30 | printk("R: %ld %lu %ld (%ld)\n", R_s, R_f, R_e, R_c); | ||
31 | #endif | ||
32 | |||
33 | err = _FP_PACK_CANONICAL(S, 1, R); | ||
34 | if (!err || !__FPU_TRAP_P(err)) { | ||
35 | __FP_PACK_RAW_1(S, &f, R); | ||
36 | if (copy_to_user(ea, &f, sizeof(float))) | ||
37 | return -EFAULT; | ||
38 | } | ||
39 | |||
40 | return err; | ||
41 | } | ||
diff --git a/arch/ppc/math-emu/types.c b/arch/ppc/math-emu/types.c deleted file mode 100644 index e1ed15d829db..000000000000 --- a/arch/ppc/math-emu/types.c +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | #include "soft-fp.h" | ||
2 | #include "double.h" | ||
3 | #include "single.h" | ||
4 | |||
5 | void | ||
6 | fp_unpack_d(long *_s, unsigned long *_f1, unsigned long *_f0, | ||
7 | long *_e, long *_c, void *val) | ||
8 | { | ||
9 | FP_DECL_D(X); | ||
10 | |||
11 | __FP_UNPACK_RAW_2(D, X, val); | ||
12 | |||
13 | _FP_UNPACK_CANONICAL(D, 2, X); | ||
14 | |||
15 | *_s = X_s; | ||
16 | *_f1 = X_f1; | ||
17 | *_f0 = X_f0; | ||
18 | *_e = X_e; | ||
19 | *_c = X_c; | ||
20 | } | ||
21 | |||
22 | int | ||
23 | fp_pack_d(void *val, long X_s, unsigned long X_f1, | ||
24 | unsigned long X_f0, long X_e, long X_c) | ||
25 | { | ||
26 | int exc; | ||
27 | |||
28 | exc = _FP_PACK_CANONICAL(D, 2, X); | ||
29 | if (!exc || !__FPU_TRAP_P(exc)) | ||
30 | __FP_PACK_RAW_2(D, val, X); | ||
31 | return exc; | ||
32 | } | ||
33 | |||
34 | int | ||
35 | fp_pack_ds(void *val, long X_s, unsigned long X_f1, | ||
36 | unsigned long X_f0, long X_e, long X_c) | ||
37 | { | ||
38 | FP_DECL_S(__X); | ||
39 | int exc; | ||
40 | |||
41 | FP_CONV(S, D, 1, 2, __X, X); | ||
42 | exc = _FP_PACK_CANONICAL(S, 1, __X); | ||
43 | if (!exc || !__FPU_TRAP_P(exc)) { | ||
44 | _FP_UNPACK_CANONICAL(S, 1, __X); | ||
45 | FP_CONV(D, S, 2, 1, X, __X); | ||
46 | exc |= _FP_PACK_CANONICAL(D, 2, X); | ||
47 | if (!exc || !__FPU_TRAP_P(exc)) | ||
48 | __FP_PACK_RAW_2(D, val, X); | ||
49 | } | ||
50 | return exc; | ||
51 | } | ||
diff --git a/arch/ppc/math-emu/udivmodti4.c b/arch/ppc/math-emu/udivmodti4.c deleted file mode 100644 index 7e112dc1e2f2..000000000000 --- a/arch/ppc/math-emu/udivmodti4.c +++ /dev/null | |||
@@ -1,191 +0,0 @@ | |||
1 | /* This has so very few changes over libgcc2's __udivmoddi4 it isn't funny. */ | ||
2 | |||
3 | #include "soft-fp.h" | ||
4 | |||
5 | #undef count_leading_zeros | ||
6 | #define count_leading_zeros __FP_CLZ | ||
7 | |||
8 | void | ||
9 | _fp_udivmodti4(_FP_W_TYPE q[2], _FP_W_TYPE r[2], | ||
10 | _FP_W_TYPE n1, _FP_W_TYPE n0, | ||
11 | _FP_W_TYPE d1, _FP_W_TYPE d0) | ||
12 | { | ||
13 | _FP_W_TYPE q0, q1, r0, r1; | ||
14 | _FP_I_TYPE b, bm; | ||
15 | |||
16 | if (d1 == 0) | ||
17 | { | ||
18 | #if !UDIV_NEEDS_NORMALIZATION | ||
19 | if (d0 > n1) | ||
20 | { | ||
21 | /* 0q = nn / 0D */ | ||
22 | |||
23 | udiv_qrnnd (q0, n0, n1, n0, d0); | ||
24 | q1 = 0; | ||
25 | |||
26 | /* Remainder in n0. */ | ||
27 | } | ||
28 | else | ||
29 | { | ||
30 | /* qq = NN / 0d */ | ||
31 | |||
32 | if (d0 == 0) | ||
33 | d0 = 1 / d0; /* Divide intentionally by zero. */ | ||
34 | |||
35 | udiv_qrnnd (q1, n1, 0, n1, d0); | ||
36 | udiv_qrnnd (q0, n0, n1, n0, d0); | ||
37 | |||
38 | /* Remainder in n0. */ | ||
39 | } | ||
40 | |||
41 | r0 = n0; | ||
42 | r1 = 0; | ||
43 | |||
44 | #else /* UDIV_NEEDS_NORMALIZATION */ | ||
45 | |||
46 | if (d0 > n1) | ||
47 | { | ||
48 | /* 0q = nn / 0D */ | ||
49 | |||
50 | count_leading_zeros (bm, d0); | ||
51 | |||
52 | if (bm != 0) | ||
53 | { | ||
54 | /* Normalize, i.e. make the most significant bit of the | ||
55 | denominator set. */ | ||
56 | |||
57 | d0 = d0 << bm; | ||
58 | n1 = (n1 << bm) | (n0 >> (_FP_W_TYPE_SIZE - bm)); | ||
59 | n0 = n0 << bm; | ||
60 | } | ||
61 | |||
62 | udiv_qrnnd (q0, n0, n1, n0, d0); | ||
63 | q1 = 0; | ||
64 | |||
65 | /* Remainder in n0 >> bm. */ | ||
66 | } | ||
67 | else | ||
68 | { | ||
69 | /* qq = NN / 0d */ | ||
70 | |||
71 | if (d0 == 0) | ||
72 | d0 = 1 / d0; /* Divide intentionally by zero. */ | ||
73 | |||
74 | count_leading_zeros (bm, d0); | ||
75 | |||
76 | if (bm == 0) | ||
77 | { | ||
78 | /* From (n1 >= d0) /\ (the most significant bit of d0 is set), | ||
79 | conclude (the most significant bit of n1 is set) /\ (the | ||
80 | leading quotient digit q1 = 1). | ||
81 | |||
82 | This special case is necessary, not an optimization. | ||
83 | (Shifts counts of SI_TYPE_SIZE are undefined.) */ | ||
84 | |||
85 | n1 -= d0; | ||
86 | q1 = 1; | ||
87 | } | ||
88 | else | ||
89 | { | ||
90 | _FP_W_TYPE n2; | ||
91 | |||
92 | /* Normalize. */ | ||
93 | |||
94 | b = _FP_W_TYPE_SIZE - bm; | ||
95 | |||
96 | d0 = d0 << bm; | ||
97 | n2 = n1 >> b; | ||
98 | n1 = (n1 << bm) | (n0 >> b); | ||
99 | n0 = n0 << bm; | ||
100 | |||
101 | udiv_qrnnd (q1, n1, n2, n1, d0); | ||
102 | } | ||
103 | |||
104 | /* n1 != d0... */ | ||
105 | |||
106 | udiv_qrnnd (q0, n0, n1, n0, d0); | ||
107 | |||
108 | /* Remainder in n0 >> bm. */ | ||
109 | } | ||
110 | |||
111 | r0 = n0 >> bm; | ||
112 | r1 = 0; | ||
113 | #endif /* UDIV_NEEDS_NORMALIZATION */ | ||
114 | } | ||
115 | else | ||
116 | { | ||
117 | if (d1 > n1) | ||
118 | { | ||
119 | /* 00 = nn / DD */ | ||
120 | |||
121 | q0 = 0; | ||
122 | q1 = 0; | ||
123 | |||
124 | /* Remainder in n1n0. */ | ||
125 | r0 = n0; | ||
126 | r1 = n1; | ||
127 | } | ||
128 | else | ||
129 | { | ||
130 | /* 0q = NN / dd */ | ||
131 | |||
132 | count_leading_zeros (bm, d1); | ||
133 | if (bm == 0) | ||
134 | { | ||
135 | /* From (n1 >= d1) /\ (the most significant bit of d1 is set), | ||
136 | conclude (the most significant bit of n1 is set) /\ (the | ||
137 | quotient digit q0 = 0 or 1). | ||
138 | |||
139 | This special case is necessary, not an optimization. */ | ||
140 | |||
141 | /* The condition on the next line takes advantage of that | ||
142 | n1 >= d1 (true due to program flow). */ | ||
143 | if (n1 > d1 || n0 >= d0) | ||
144 | { | ||
145 | q0 = 1; | ||
146 | sub_ddmmss (n1, n0, n1, n0, d1, d0); | ||
147 | } | ||
148 | else | ||
149 | q0 = 0; | ||
150 | |||
151 | q1 = 0; | ||
152 | |||
153 | r0 = n0; | ||
154 | r1 = n1; | ||
155 | } | ||
156 | else | ||
157 | { | ||
158 | _FP_W_TYPE m1, m0, n2; | ||
159 | |||
160 | /* Normalize. */ | ||
161 | |||
162 | b = _FP_W_TYPE_SIZE - bm; | ||
163 | |||
164 | d1 = (d1 << bm) | (d0 >> b); | ||
165 | d0 = d0 << bm; | ||
166 | n2 = n1 >> b; | ||
167 | n1 = (n1 << bm) | (n0 >> b); | ||
168 | n0 = n0 << bm; | ||
169 | |||
170 | udiv_qrnnd (q0, n1, n2, n1, d1); | ||
171 | umul_ppmm (m1, m0, q0, d0); | ||
172 | |||
173 | if (m1 > n1 || (m1 == n1 && m0 > n0)) | ||
174 | { | ||
175 | q0--; | ||
176 | sub_ddmmss (m1, m0, m1, m0, d1, d0); | ||
177 | } | ||
178 | |||
179 | q1 = 0; | ||
180 | |||
181 | /* Remainder in (n1n0 - m1m0) >> bm. */ | ||
182 | sub_ddmmss (n1, n0, n1, n0, m1, m0); | ||
183 | r0 = (n1 << b) | (n0 >> bm); | ||
184 | r1 = n1 >> bm; | ||
185 | } | ||
186 | } | ||
187 | } | ||
188 | |||
189 | q[0] = q0; q[1] = q1; | ||
190 | r[0] = r0, r[1] = r1; | ||
191 | } | ||
diff --git a/arch/ppc/mm/fault.c b/arch/ppc/mm/fault.c index 0217188ef465..8e08ca32531a 100644 --- a/arch/ppc/mm/fault.c +++ b/arch/ppc/mm/fault.c | |||
@@ -202,6 +202,7 @@ good_area: | |||
202 | /* an exec - 4xx/Book-E allows for per-page execute permission */ | 202 | /* an exec - 4xx/Book-E allows for per-page execute permission */ |
203 | } else if (TRAP(regs) == 0x400) { | 203 | } else if (TRAP(regs) == 0x400) { |
204 | pte_t *ptep; | 204 | pte_t *ptep; |
205 | pmd_t *pmdp; | ||
205 | 206 | ||
206 | #if 0 | 207 | #if 0 |
207 | /* It would be nice to actually enforce the VM execute | 208 | /* It would be nice to actually enforce the VM execute |
@@ -215,21 +216,24 @@ good_area: | |||
215 | /* Since 4xx/Book-E supports per-page execute permission, | 216 | /* Since 4xx/Book-E supports per-page execute permission, |
216 | * we lazily flush dcache to icache. */ | 217 | * we lazily flush dcache to icache. */ |
217 | ptep = NULL; | 218 | ptep = NULL; |
218 | if (get_pteptr(mm, address, &ptep) && pte_present(*ptep)) { | 219 | if (get_pteptr(mm, address, &ptep, &pmdp)) { |
219 | struct page *page = pte_page(*ptep); | 220 | spinlock_t *ptl = pte_lockptr(mm, pmdp); |
220 | 221 | spin_lock(ptl); | |
221 | if (! test_bit(PG_arch_1, &page->flags)) { | 222 | if (pte_present(*ptep)) { |
222 | flush_dcache_icache_page(page); | 223 | struct page *page = pte_page(*ptep); |
223 | set_bit(PG_arch_1, &page->flags); | 224 | |
225 | if (!test_bit(PG_arch_1, &page->flags)) { | ||
226 | flush_dcache_icache_page(page); | ||
227 | set_bit(PG_arch_1, &page->flags); | ||
228 | } | ||
229 | pte_update(ptep, 0, _PAGE_HWEXEC); | ||
230 | _tlbie(address); | ||
231 | pte_unmap_unlock(ptep, ptl); | ||
232 | up_read(&mm->mmap_sem); | ||
233 | return 0; | ||
224 | } | 234 | } |
225 | pte_update(ptep, 0, _PAGE_HWEXEC); | 235 | pte_unmap_unlock(ptep, ptl); |
226 | _tlbie(address); | ||
227 | pte_unmap(ptep); | ||
228 | up_read(&mm->mmap_sem); | ||
229 | return 0; | ||
230 | } | 236 | } |
231 | if (ptep != NULL) | ||
232 | pte_unmap(ptep); | ||
233 | #endif | 237 | #endif |
234 | /* a read */ | 238 | /* a read */ |
235 | } else { | 239 | } else { |
diff --git a/arch/ppc/mm/hashtable.S b/arch/ppc/mm/hashtable.S index f09fa88db35a..31d0a924317c 100644 --- a/arch/ppc/mm/hashtable.S +++ b/arch/ppc/mm/hashtable.S | |||
@@ -74,12 +74,6 @@ _GLOBAL(hash_page_sync) | |||
74 | */ | 74 | */ |
75 | .text | 75 | .text |
76 | _GLOBAL(hash_page) | 76 | _GLOBAL(hash_page) |
77 | #ifdef CONFIG_PPC64BRIDGE | ||
78 | mfmsr r0 | ||
79 | clrldi r0,r0,1 /* make sure it's in 32-bit mode */ | ||
80 | MTMSRD(r0) | ||
81 | isync | ||
82 | #endif | ||
83 | tophys(r7,0) /* gets -KERNELBASE into r7 */ | 77 | tophys(r7,0) /* gets -KERNELBASE into r7 */ |
84 | #ifdef CONFIG_SMP | 78 | #ifdef CONFIG_SMP |
85 | addis r8,r7,mmu_hash_lock@h | 79 | addis r8,r7,mmu_hash_lock@h |
@@ -303,7 +297,6 @@ Hash_base = 0xc0180000 | |||
303 | Hash_bits = 12 /* e.g. 256kB hash table */ | 297 | Hash_bits = 12 /* e.g. 256kB hash table */ |
304 | Hash_msk = (((1 << Hash_bits) - 1) * 64) | 298 | Hash_msk = (((1 << Hash_bits) - 1) * 64) |
305 | 299 | ||
306 | #ifndef CONFIG_PPC64BRIDGE | ||
307 | /* defines for the PTE format for 32-bit PPCs */ | 300 | /* defines for the PTE format for 32-bit PPCs */ |
308 | #define PTE_SIZE 8 | 301 | #define PTE_SIZE 8 |
309 | #define PTEG_SIZE 64 | 302 | #define PTEG_SIZE 64 |
@@ -317,21 +310,6 @@ Hash_msk = (((1 << Hash_bits) - 1) * 64) | |||
317 | #define SET_V(r) oris r,r,PTE_V@h | 310 | #define SET_V(r) oris r,r,PTE_V@h |
318 | #define CLR_V(r,t) rlwinm r,r,0,1,31 | 311 | #define CLR_V(r,t) rlwinm r,r,0,1,31 |
319 | 312 | ||
320 | #else | ||
321 | /* defines for the PTE format for 64-bit PPCs */ | ||
322 | #define PTE_SIZE 16 | ||
323 | #define PTEG_SIZE 128 | ||
324 | #define LG_PTEG_SIZE 7 | ||
325 | #define LDPTEu ldu | ||
326 | #define STPTE std | ||
327 | #define CMPPTE cmpd | ||
328 | #define PTE_H 2 | ||
329 | #define PTE_V 1 | ||
330 | #define TST_V(r) andi. r,r,PTE_V | ||
331 | #define SET_V(r) ori r,r,PTE_V | ||
332 | #define CLR_V(r,t) li t,PTE_V; andc r,r,t | ||
333 | #endif /* CONFIG_PPC64BRIDGE */ | ||
334 | |||
335 | #define HASH_LEFT 31-(LG_PTEG_SIZE+Hash_bits-1) | 313 | #define HASH_LEFT 31-(LG_PTEG_SIZE+Hash_bits-1) |
336 | #define HASH_RIGHT 31-LG_PTEG_SIZE | 314 | #define HASH_RIGHT 31-LG_PTEG_SIZE |
337 | 315 | ||
@@ -349,14 +327,8 @@ BEGIN_FTR_SECTION | |||
349 | END_FTR_SECTION_IFSET(CPU_FTR_NEED_COHERENT) | 327 | END_FTR_SECTION_IFSET(CPU_FTR_NEED_COHERENT) |
350 | 328 | ||
351 | /* Construct the high word of the PPC-style PTE (r5) */ | 329 | /* Construct the high word of the PPC-style PTE (r5) */ |
352 | #ifndef CONFIG_PPC64BRIDGE | ||
353 | rlwinm r5,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ | 330 | rlwinm r5,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ |
354 | rlwimi r5,r4,10,26,31 /* put in API (abbrev page index) */ | 331 | rlwimi r5,r4,10,26,31 /* put in API (abbrev page index) */ |
355 | #else /* CONFIG_PPC64BRIDGE */ | ||
356 | clrlwi r3,r3,8 /* reduce vsid to 24 bits */ | ||
357 | sldi r5,r3,12 /* shift vsid into position */ | ||
358 | rlwimi r5,r4,16,20,24 /* put in API (abbrev page index) */ | ||
359 | #endif /* CONFIG_PPC64BRIDGE */ | ||
360 | SET_V(r5) /* set V (valid) bit */ | 332 | SET_V(r5) /* set V (valid) bit */ |
361 | 333 | ||
362 | /* Get the address of the primary PTE group in the hash table (r3) */ | 334 | /* Get the address of the primary PTE group in the hash table (r3) */ |
@@ -540,14 +512,8 @@ _GLOBAL(flush_hash_pages) | |||
540 | add r3,r3,r0 /* note code below trims to 24 bits */ | 512 | add r3,r3,r0 /* note code below trims to 24 bits */ |
541 | 513 | ||
542 | /* Construct the high word of the PPC-style PTE (r11) */ | 514 | /* Construct the high word of the PPC-style PTE (r11) */ |
543 | #ifndef CONFIG_PPC64BRIDGE | ||
544 | rlwinm r11,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ | 515 | rlwinm r11,r3,7,1,24 /* put VSID in 0x7fffff80 bits */ |
545 | rlwimi r11,r4,10,26,31 /* put in API (abbrev page index) */ | 516 | rlwimi r11,r4,10,26,31 /* put in API (abbrev page index) */ |
546 | #else /* CONFIG_PPC64BRIDGE */ | ||
547 | clrlwi r3,r3,8 /* reduce vsid to 24 bits */ | ||
548 | sldi r11,r3,12 /* shift vsid into position */ | ||
549 | rlwimi r11,r4,16,20,24 /* put in API (abbrev page index) */ | ||
550 | #endif /* CONFIG_PPC64BRIDGE */ | ||
551 | SET_V(r11) /* set V (valid) bit */ | 517 | SET_V(r11) /* set V (valid) bit */ |
552 | 518 | ||
553 | #ifdef CONFIG_SMP | 519 | #ifdef CONFIG_SMP |
diff --git a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c index cb1c294fb932..386e000bcb73 100644 --- a/arch/ppc/mm/init.c +++ b/arch/ppc/mm/init.c | |||
@@ -412,14 +412,6 @@ void __init mem_init(void) | |||
412 | } | 412 | } |
413 | #endif /* CONFIG_BLK_DEV_INITRD */ | 413 | #endif /* CONFIG_BLK_DEV_INITRD */ |
414 | 414 | ||
415 | #ifdef CONFIG_PPC_OF | ||
416 | /* mark the RTAS pages as reserved */ | ||
417 | if ( rtas_data ) | ||
418 | for (addr = (ulong)__va(rtas_data); | ||
419 | addr < PAGE_ALIGN((ulong)__va(rtas_data)+rtas_size) ; | ||
420 | addr += PAGE_SIZE) | ||
421 | SetPageReserved(virt_to_page(addr)); | ||
422 | #endif | ||
423 | for (addr = PAGE_OFFSET; addr < (unsigned long)high_memory; | 415 | for (addr = PAGE_OFFSET; addr < (unsigned long)high_memory; |
424 | addr += PAGE_SIZE) { | 416 | addr += PAGE_SIZE) { |
425 | if (!PageReserved(virt_to_page(addr))) | 417 | if (!PageReserved(virt_to_page(addr))) |
@@ -494,11 +486,6 @@ set_phys_avail(unsigned long total_memory) | |||
494 | initrd_end - initrd_start, 1); | 486 | initrd_end - initrd_start, 1); |
495 | } | 487 | } |
496 | #endif /* CONFIG_BLK_DEV_INITRD */ | 488 | #endif /* CONFIG_BLK_DEV_INITRD */ |
497 | #ifdef CONFIG_PPC_OF | ||
498 | /* remove the RTAS pages from the available memory */ | ||
499 | if (rtas_data) | ||
500 | mem_pieces_remove(&phys_avail, rtas_data, rtas_size, 1); | ||
501 | #endif | ||
502 | } | 489 | } |
503 | 490 | ||
504 | /* Mark some memory as reserved by removing it from phys_avail. */ | 491 | /* Mark some memory as reserved by removing it from phys_avail. */ |
diff --git a/arch/ppc/mm/mmu_context.c b/arch/ppc/mm/mmu_context.c index a8816e0f6a86..b4a4b3f02a1c 100644 --- a/arch/ppc/mm/mmu_context.c +++ b/arch/ppc/mm/mmu_context.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * This file contains the routines for handling the MMU on those | 2 | * This file contains the routines for handling the MMU on those |
3 | * PowerPC implementations where the MMU substantially follows the | 3 | * PowerPC implementations where the MMU substantially follows the |
4 | * architecture specification. This includes the 6xx, 7xx, 7xxx, | 4 | * architecture specification. This includes the 6xx, 7xx, 7xxx, |
5 | * 8260, and POWER3 implementations but excludes the 8xx and 4xx. | 5 | * 8260, and 83xx implementations but excludes the 8xx and 4xx. |
6 | * -- paulus | 6 | * -- paulus |
7 | * | 7 | * |
8 | * Derived from arch/ppc/mm/init.c: | 8 | * Derived from arch/ppc/mm/init.c: |
diff --git a/arch/ppc/mm/pgtable.c b/arch/ppc/mm/pgtable.c index 6ea9185fd120..706bca8eb144 100644 --- a/arch/ppc/mm/pgtable.c +++ b/arch/ppc/mm/pgtable.c | |||
@@ -39,7 +39,7 @@ unsigned long ioremap_base; | |||
39 | unsigned long ioremap_bot; | 39 | unsigned long ioremap_bot; |
40 | int io_bat_index; | 40 | int io_bat_index; |
41 | 41 | ||
42 | #if defined(CONFIG_6xx) || defined(CONFIG_POWER3) | 42 | #if defined(CONFIG_6xx) |
43 | #define HAVE_BATS 1 | 43 | #define HAVE_BATS 1 |
44 | #endif | 44 | #endif |
45 | 45 | ||
@@ -368,7 +368,7 @@ void __init io_block_mapping(unsigned long virt, phys_addr_t phys, | |||
368 | * the PTE pointer is unmodified if PTE is not found. | 368 | * the PTE pointer is unmodified if PTE is not found. |
369 | */ | 369 | */ |
370 | int | 370 | int |
371 | get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep) | 371 | get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep, pmd_t **pmdp) |
372 | { | 372 | { |
373 | pgd_t *pgd; | 373 | pgd_t *pgd; |
374 | pmd_t *pmd; | 374 | pmd_t *pmd; |
@@ -383,6 +383,8 @@ get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep) | |||
383 | if (pte) { | 383 | if (pte) { |
384 | retval = 1; | 384 | retval = 1; |
385 | *ptep = pte; | 385 | *ptep = pte; |
386 | if (pmdp) | ||
387 | *pmdp = pmd; | ||
386 | /* XXX caller needs to do pte_unmap, yuck */ | 388 | /* XXX caller needs to do pte_unmap, yuck */ |
387 | } | 389 | } |
388 | } | 390 | } |
@@ -420,7 +422,7 @@ unsigned long iopa(unsigned long addr) | |||
420 | mm = &init_mm; | 422 | mm = &init_mm; |
421 | 423 | ||
422 | pa = 0; | 424 | pa = 0; |
423 | if (get_pteptr(mm, addr, &pte)) { | 425 | if (get_pteptr(mm, addr, &pte, NULL)) { |
424 | pa = (pte_val(*pte) & PAGE_MASK) | (addr & ~PAGE_MASK); | 426 | pa = (pte_val(*pte) & PAGE_MASK) | (addr & ~PAGE_MASK); |
425 | pte_unmap(pte); | 427 | pte_unmap(pte); |
426 | } | 428 | } |
diff --git a/arch/ppc/mm/ppc_mmu.c b/arch/ppc/mm/ppc_mmu.c index 9a381ed5eb21..25bb6f3347c1 100644 --- a/arch/ppc/mm/ppc_mmu.c +++ b/arch/ppc/mm/ppc_mmu.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * This file contains the routines for handling the MMU on those | 2 | * This file contains the routines for handling the MMU on those |
3 | * PowerPC implementations where the MMU substantially follows the | 3 | * PowerPC implementations where the MMU substantially follows the |
4 | * architecture specification. This includes the 6xx, 7xx, 7xxx, | 4 | * architecture specification. This includes the 6xx, 7xx, 7xxx, |
5 | * 8260, and POWER3 implementations but excludes the 8xx and 4xx. | 5 | * 8260, and 83xx implementations but excludes the 8xx and 4xx. |
6 | * -- paulus | 6 | * -- paulus |
7 | * | 7 | * |
8 | * Derived from arch/ppc/mm/init.c: | 8 | * Derived from arch/ppc/mm/init.c: |
@@ -42,11 +42,7 @@ unsigned long _SDR1; | |||
42 | 42 | ||
43 | union ubat { /* BAT register values to be loaded */ | 43 | union ubat { /* BAT register values to be loaded */ |
44 | BAT bat; | 44 | BAT bat; |
45 | #ifdef CONFIG_PPC64BRIDGE | ||
46 | u64 word[2]; | ||
47 | #else | ||
48 | u32 word[2]; | 45 | u32 word[2]; |
49 | #endif | ||
50 | } BATS[4][2]; /* 4 pairs of IBAT, DBAT */ | 46 | } BATS[4][2]; /* 4 pairs of IBAT, DBAT */ |
51 | 47 | ||
52 | struct batrange { /* stores address ranges mapped by BATs */ | 48 | struct batrange { /* stores address ranges mapped by BATs */ |
@@ -83,9 +79,6 @@ unsigned long p_mapped_by_bats(unsigned long pa) | |||
83 | 79 | ||
84 | unsigned long __init mmu_mapin_ram(void) | 80 | unsigned long __init mmu_mapin_ram(void) |
85 | { | 81 | { |
86 | #ifdef CONFIG_POWER4 | ||
87 | return 0; | ||
88 | #else | ||
89 | unsigned long tot, bl, done; | 82 | unsigned long tot, bl, done; |
90 | unsigned long max_size = (256<<20); | 83 | unsigned long max_size = (256<<20); |
91 | unsigned long align; | 84 | unsigned long align; |
@@ -122,7 +115,6 @@ unsigned long __init mmu_mapin_ram(void) | |||
122 | } | 115 | } |
123 | 116 | ||
124 | return done; | 117 | return done; |
125 | #endif | ||
126 | } | 118 | } |
127 | 119 | ||
128 | /* | 120 | /* |
@@ -205,27 +197,10 @@ void __init MMU_init_hw(void) | |||
205 | 197 | ||
206 | if ( ppc_md.progress ) ppc_md.progress("hash:enter", 0x105); | 198 | if ( ppc_md.progress ) ppc_md.progress("hash:enter", 0x105); |
207 | 199 | ||
208 | #ifdef CONFIG_PPC64BRIDGE | ||
209 | #define LG_HPTEG_SIZE 7 /* 128 bytes per HPTEG */ | ||
210 | #define SDR1_LOW_BITS (lg_n_hpteg - 11) | ||
211 | #define MIN_N_HPTEG 2048 /* min 256kB hash table */ | ||
212 | #else | ||
213 | #define LG_HPTEG_SIZE 6 /* 64 bytes per HPTEG */ | 200 | #define LG_HPTEG_SIZE 6 /* 64 bytes per HPTEG */ |
214 | #define SDR1_LOW_BITS ((n_hpteg - 1) >> 10) | 201 | #define SDR1_LOW_BITS ((n_hpteg - 1) >> 10) |
215 | #define MIN_N_HPTEG 1024 /* min 64kB hash table */ | 202 | #define MIN_N_HPTEG 1024 /* min 64kB hash table */ |
216 | #endif | ||
217 | |||
218 | #ifdef CONFIG_POWER4 | ||
219 | /* The hash table has already been allocated and initialized | ||
220 | in prom.c */ | ||
221 | n_hpteg = Hash_size >> LG_HPTEG_SIZE; | ||
222 | lg_n_hpteg = __ilog2(n_hpteg); | ||
223 | |||
224 | /* Remove the hash table from the available memory */ | ||
225 | if (Hash) | ||
226 | reserve_phys_mem(__pa(Hash), Hash_size); | ||
227 | 203 | ||
228 | #else /* CONFIG_POWER4 */ | ||
229 | /* | 204 | /* |
230 | * Allow 1 HPTE (1/8 HPTEG) for each page of memory. | 205 | * Allow 1 HPTE (1/8 HPTEG) for each page of memory. |
231 | * This is less than the recommended amount, but then | 206 | * This is less than the recommended amount, but then |
@@ -248,7 +223,6 @@ void __init MMU_init_hw(void) | |||
248 | Hash = mem_pieces_find(Hash_size, Hash_size); | 223 | Hash = mem_pieces_find(Hash_size, Hash_size); |
249 | cacheable_memzero(Hash, Hash_size); | 224 | cacheable_memzero(Hash, Hash_size); |
250 | _SDR1 = __pa(Hash) | SDR1_LOW_BITS; | 225 | _SDR1 = __pa(Hash) | SDR1_LOW_BITS; |
251 | #endif /* CONFIG_POWER4 */ | ||
252 | 226 | ||
253 | Hash_end = (PTE *) ((unsigned long)Hash + Hash_size); | 227 | Hash_end = (PTE *) ((unsigned long)Hash + Hash_size); |
254 | 228 | ||
diff --git a/arch/ppc/platforms/Makefile b/arch/ppc/platforms/Makefile index e8b91a33ce91..90c622294423 100644 --- a/arch/ppc/platforms/Makefile +++ b/arch/ppc/platforms/Makefile | |||
@@ -2,18 +2,10 @@ | |||
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | # Extra CFLAGS so we don't have to do relative includes | ||
6 | CFLAGS_chrp_setup.o += -Iarch/$(ARCH)/mm | ||
7 | |||
8 | obj-$(CONFIG_APUS) += apus_setup.o | 5 | obj-$(CONFIG_APUS) += apus_setup.o |
9 | ifeq ($(CONFIG_APUS),y) | 6 | ifeq ($(CONFIG_APUS),y) |
10 | obj-$(CONFIG_PCI) += apus_pci.o | 7 | obj-$(CONFIG_PCI) += apus_pci.o |
11 | endif | 8 | endif |
12 | obj-$(CONFIG_PPC_CHRP) += chrp_setup.o chrp_time.o chrp_pci.o \ | ||
13 | chrp_pegasos_eth.o | ||
14 | ifeq ($(CONFIG_PPC_CHRP),y) | ||
15 | obj-$(CONFIG_NVRAM) += chrp_nvram.o | ||
16 | endif | ||
17 | obj-$(CONFIG_PPC_PREP) += prep_pci.o prep_setup.o | 9 | obj-$(CONFIG_PPC_PREP) += prep_pci.o prep_setup.o |
18 | obj-$(CONFIG_PREP_RESIDUAL) += residual.o | 10 | obj-$(CONFIG_PREP_RESIDUAL) += residual.o |
19 | obj-$(CONFIG_PQ2ADS) += pq2ads.o | 11 | obj-$(CONFIG_PQ2ADS) += pq2ads.o |
@@ -40,7 +32,3 @@ obj-$(CONFIG_EV64360) += ev64360.o | |||
40 | obj-$(CONFIG_MPC86XADS) += mpc866ads_setup.o | 32 | obj-$(CONFIG_MPC86XADS) += mpc866ads_setup.o |
41 | obj-$(CONFIG_MPC885ADS) += mpc885ads_setup.o | 33 | obj-$(CONFIG_MPC885ADS) += mpc885ads_setup.o |
42 | obj-$(CONFIG_ADS8272) += mpc8272ads_setup.o | 34 | obj-$(CONFIG_ADS8272) += mpc8272ads_setup.o |
43 | |||
44 | ifeq ($(CONFIG_SMP),y) | ||
45 | obj-$(CONFIG_PPC_CHRP) += chrp_smp.o | ||
46 | endif | ||
diff --git a/arch/ppc/platforms/chrp_nvram.c b/arch/ppc/platforms/chrp_nvram.c deleted file mode 100644 index 465ba9b090ef..000000000000 --- a/arch/ppc/platforms/chrp_nvram.c +++ /dev/null | |||
@@ -1,83 +0,0 @@ | |||
1 | /* | ||
2 | * c 2001 PPC 64 Team, IBM Corp | ||
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 | * /dev/nvram driver for PPC | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/slab.h> | ||
16 | #include <linux/spinlock.h> | ||
17 | #include <asm/uaccess.h> | ||
18 | #include <asm/prom.h> | ||
19 | #include <asm/machdep.h> | ||
20 | |||
21 | static unsigned int nvram_size; | ||
22 | static unsigned char nvram_buf[4]; | ||
23 | static DEFINE_SPINLOCK(nvram_lock); | ||
24 | |||
25 | static unsigned char chrp_nvram_read(int addr) | ||
26 | { | ||
27 | unsigned long done, flags; | ||
28 | unsigned char ret; | ||
29 | |||
30 | if (addr >= nvram_size) { | ||
31 | printk(KERN_DEBUG "%s: read addr %d > nvram_size %u\n", | ||
32 | current->comm, addr, nvram_size); | ||
33 | return 0xff; | ||
34 | } | ||
35 | spin_lock_irqsave(&nvram_lock, flags); | ||
36 | if ((call_rtas("nvram-fetch", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done) | ||
37 | ret = 0xff; | ||
38 | else | ||
39 | ret = nvram_buf[0]; | ||
40 | spin_unlock_irqrestore(&nvram_lock, flags); | ||
41 | |||
42 | return ret; | ||
43 | } | ||
44 | |||
45 | static void chrp_nvram_write(int addr, unsigned char val) | ||
46 | { | ||
47 | unsigned long done, flags; | ||
48 | |||
49 | if (addr >= nvram_size) { | ||
50 | printk(KERN_DEBUG "%s: write addr %d > nvram_size %u\n", | ||
51 | current->comm, addr, nvram_size); | ||
52 | return; | ||
53 | } | ||
54 | spin_lock_irqsave(&nvram_lock, flags); | ||
55 | nvram_buf[0] = val; | ||
56 | if ((call_rtas("nvram-store", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done) | ||
57 | printk(KERN_DEBUG "rtas IO error storing 0x%02x at %d", val, addr); | ||
58 | spin_unlock_irqrestore(&nvram_lock, flags); | ||
59 | } | ||
60 | |||
61 | void __init chrp_nvram_init(void) | ||
62 | { | ||
63 | struct device_node *nvram; | ||
64 | unsigned int *nbytes_p, proplen; | ||
65 | |||
66 | nvram = of_find_node_by_type(NULL, "nvram"); | ||
67 | if (nvram == NULL) | ||
68 | return; | ||
69 | |||
70 | nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen); | ||
71 | if (nbytes_p == NULL || proplen != sizeof(unsigned int)) | ||
72 | return; | ||
73 | |||
74 | nvram_size = *nbytes_p; | ||
75 | |||
76 | printk(KERN_INFO "CHRP nvram contains %u bytes\n", nvram_size); | ||
77 | of_node_put(nvram); | ||
78 | |||
79 | ppc_md.nvram_read_val = chrp_nvram_read; | ||
80 | ppc_md.nvram_write_val = chrp_nvram_write; | ||
81 | |||
82 | return; | ||
83 | } | ||
diff --git a/arch/ppc/platforms/chrp_pci.c b/arch/ppc/platforms/chrp_pci.c deleted file mode 100644 index c7fe6182bb77..000000000000 --- a/arch/ppc/platforms/chrp_pci.c +++ /dev/null | |||
@@ -1,309 +0,0 @@ | |||
1 | /* | ||
2 | * CHRP pci routines. | ||
3 | */ | ||
4 | |||
5 | #include <linux/config.h> | ||
6 | #include <linux/kernel.h> | ||
7 | #include <linux/pci.h> | ||
8 | #include <linux/delay.h> | ||
9 | #include <linux/string.h> | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/ide.h> | ||
12 | |||
13 | #include <asm/io.h> | ||
14 | #include <asm/pgtable.h> | ||
15 | #include <asm/irq.h> | ||
16 | #include <asm/hydra.h> | ||
17 | #include <asm/prom.h> | ||
18 | #include <asm/gg2.h> | ||
19 | #include <asm/machdep.h> | ||
20 | #include <asm/sections.h> | ||
21 | #include <asm/pci-bridge.h> | ||
22 | #include <asm/open_pic.h> | ||
23 | |||
24 | /* LongTrail */ | ||
25 | void __iomem *gg2_pci_config_base; | ||
26 | |||
27 | /* | ||
28 | * The VLSI Golden Gate II has only 512K of PCI configuration space, so we | ||
29 | * limit the bus number to 3 bits | ||
30 | */ | ||
31 | |||
32 | int gg2_read_config(struct pci_bus *bus, unsigned int devfn, int off, | ||
33 | int len, u32 *val) | ||
34 | { | ||
35 | volatile void __iomem *cfg_data; | ||
36 | struct pci_controller *hose = bus->sysdata; | ||
37 | |||
38 | if (bus->number > 7) | ||
39 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
40 | /* | ||
41 | * Note: the caller has already checked that off is | ||
42 | * suitably aligned and that len is 1, 2 or 4. | ||
43 | */ | ||
44 | cfg_data = hose->cfg_data + ((bus->number<<16) | (devfn<<8) | off); | ||
45 | switch (len) { | ||
46 | case 1: | ||
47 | *val = in_8(cfg_data); | ||
48 | break; | ||
49 | case 2: | ||
50 | *val = in_le16(cfg_data); | ||
51 | break; | ||
52 | default: | ||
53 | *val = in_le32(cfg_data); | ||
54 | break; | ||
55 | } | ||
56 | return PCIBIOS_SUCCESSFUL; | ||
57 | } | ||
58 | |||
59 | int gg2_write_config(struct pci_bus *bus, unsigned int devfn, int off, | ||
60 | int len, u32 val) | ||
61 | { | ||
62 | volatile void __iomem *cfg_data; | ||
63 | struct pci_controller *hose = bus->sysdata; | ||
64 | |||
65 | if (bus->number > 7) | ||
66 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
67 | /* | ||
68 | * Note: the caller has already checked that off is | ||
69 | * suitably aligned and that len is 1, 2 or 4. | ||
70 | */ | ||
71 | cfg_data = hose->cfg_data + ((bus->number<<16) | (devfn<<8) | off); | ||
72 | switch (len) { | ||
73 | case 1: | ||
74 | out_8(cfg_data, val); | ||
75 | break; | ||
76 | case 2: | ||
77 | out_le16(cfg_data, val); | ||
78 | break; | ||
79 | default: | ||
80 | out_le32(cfg_data, val); | ||
81 | break; | ||
82 | } | ||
83 | return PCIBIOS_SUCCESSFUL; | ||
84 | } | ||
85 | |||
86 | static struct pci_ops gg2_pci_ops = | ||
87 | { | ||
88 | gg2_read_config, | ||
89 | gg2_write_config | ||
90 | }; | ||
91 | |||
92 | /* | ||
93 | * Access functions for PCI config space using RTAS calls. | ||
94 | */ | ||
95 | int | ||
96 | rtas_read_config(struct pci_bus *bus, unsigned int devfn, int offset, | ||
97 | int len, u32 *val) | ||
98 | { | ||
99 | struct pci_controller *hose = bus->sysdata; | ||
100 | unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8) | ||
101 | | (((bus->number - hose->first_busno) & 0xff) << 16) | ||
102 | | (hose->index << 24); | ||
103 | unsigned long ret = ~0UL; | ||
104 | int rval; | ||
105 | |||
106 | rval = call_rtas("read-pci-config", 2, 2, &ret, addr, len); | ||
107 | *val = ret; | ||
108 | return rval? PCIBIOS_DEVICE_NOT_FOUND: PCIBIOS_SUCCESSFUL; | ||
109 | } | ||
110 | |||
111 | int | ||
112 | rtas_write_config(struct pci_bus *bus, unsigned int devfn, int offset, | ||
113 | int len, u32 val) | ||
114 | { | ||
115 | struct pci_controller *hose = bus->sysdata; | ||
116 | unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8) | ||
117 | | (((bus->number - hose->first_busno) & 0xff) << 16) | ||
118 | | (hose->index << 24); | ||
119 | int rval; | ||
120 | |||
121 | rval = call_rtas("write-pci-config", 3, 1, NULL, addr, len, val); | ||
122 | return rval? PCIBIOS_DEVICE_NOT_FOUND: PCIBIOS_SUCCESSFUL; | ||
123 | } | ||
124 | |||
125 | static struct pci_ops rtas_pci_ops = | ||
126 | { | ||
127 | rtas_read_config, | ||
128 | rtas_write_config | ||
129 | }; | ||
130 | |||
131 | volatile struct Hydra __iomem *Hydra = NULL; | ||
132 | |||
133 | int __init | ||
134 | hydra_init(void) | ||
135 | { | ||
136 | struct device_node *np; | ||
137 | |||
138 | np = find_devices("mac-io"); | ||
139 | if (np == NULL || np->n_addrs == 0) | ||
140 | return 0; | ||
141 | Hydra = ioremap(np->addrs[0].address, np->addrs[0].size); | ||
142 | printk("Hydra Mac I/O at %x\n", np->addrs[0].address); | ||
143 | printk("Hydra Feature_Control was %x", | ||
144 | in_le32(&Hydra->Feature_Control)); | ||
145 | out_le32(&Hydra->Feature_Control, (HYDRA_FC_SCC_CELL_EN | | ||
146 | HYDRA_FC_SCSI_CELL_EN | | ||
147 | HYDRA_FC_SCCA_ENABLE | | ||
148 | HYDRA_FC_SCCB_ENABLE | | ||
149 | HYDRA_FC_ARB_BYPASS | | ||
150 | HYDRA_FC_MPIC_ENABLE | | ||
151 | HYDRA_FC_SLOW_SCC_PCLK | | ||
152 | HYDRA_FC_MPIC_IS_MASTER)); | ||
153 | printk(", now %x\n", in_le32(&Hydra->Feature_Control)); | ||
154 | return 1; | ||
155 | } | ||
156 | |||
157 | void __init | ||
158 | chrp_pcibios_fixup(void) | ||
159 | { | ||
160 | struct pci_dev *dev = NULL; | ||
161 | struct device_node *np; | ||
162 | |||
163 | /* PCI interrupts are controlled by the OpenPIC */ | ||
164 | for_each_pci_dev(dev) { | ||
165 | np = pci_device_to_OF_node(dev); | ||
166 | if ((np != 0) && (np->n_intrs > 0) && (np->intrs[0].line != 0)) | ||
167 | dev->irq = np->intrs[0].line; | ||
168 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | #define PRG_CL_RESET_VALID 0x00010000 | ||
173 | |||
174 | static void __init | ||
175 | setup_python(struct pci_controller *hose, struct device_node *dev) | ||
176 | { | ||
177 | u32 __iomem *reg; | ||
178 | u32 val; | ||
179 | unsigned long addr = dev->addrs[0].address; | ||
180 | |||
181 | setup_indirect_pci(hose, addr + 0xf8000, addr + 0xf8010); | ||
182 | |||
183 | /* Clear the magic go-slow bit */ | ||
184 | reg = ioremap(dev->addrs[0].address + 0xf6000, 0x40); | ||
185 | val = in_be32(®[12]); | ||
186 | if (val & PRG_CL_RESET_VALID) { | ||
187 | out_be32(®[12], val & ~PRG_CL_RESET_VALID); | ||
188 | in_be32(®[12]); | ||
189 | } | ||
190 | iounmap(reg); | ||
191 | } | ||
192 | |||
193 | /* Marvell Discovery II based Pegasos 2 */ | ||
194 | static void __init setup_peg2(struct pci_controller *hose, struct device_node *dev) | ||
195 | { | ||
196 | struct device_node *root = find_path_device("/"); | ||
197 | struct device_node *rtas; | ||
198 | |||
199 | rtas = of_find_node_by_name (root, "rtas"); | ||
200 | if (rtas) { | ||
201 | hose->ops = &rtas_pci_ops; | ||
202 | } else { | ||
203 | printk ("RTAS supporting Pegasos OF not found, please upgrade" | ||
204 | " your firmware\n"); | ||
205 | } | ||
206 | pci_assign_all_buses = 1; | ||
207 | } | ||
208 | |||
209 | void __init | ||
210 | chrp_find_bridges(void) | ||
211 | { | ||
212 | struct device_node *dev; | ||
213 | int *bus_range; | ||
214 | int len, index = -1; | ||
215 | struct pci_controller *hose; | ||
216 | unsigned int *dma; | ||
217 | char *model, *machine; | ||
218 | int is_longtrail = 0, is_mot = 0, is_pegasos = 0; | ||
219 | struct device_node *root = find_path_device("/"); | ||
220 | |||
221 | /* | ||
222 | * The PCI host bridge nodes on some machines don't have | ||
223 | * properties to adequately identify them, so we have to | ||
224 | * look at what sort of machine this is as well. | ||
225 | */ | ||
226 | machine = get_property(root, "model", NULL); | ||
227 | if (machine != NULL) { | ||
228 | is_longtrail = strncmp(machine, "IBM,LongTrail", 13) == 0; | ||
229 | is_mot = strncmp(machine, "MOT", 3) == 0; | ||
230 | if (strncmp(machine, "Pegasos2", 8) == 0) | ||
231 | is_pegasos = 2; | ||
232 | else if (strncmp(machine, "Pegasos", 7) == 0) | ||
233 | is_pegasos = 1; | ||
234 | } | ||
235 | for (dev = root->child; dev != NULL; dev = dev->sibling) { | ||
236 | if (dev->type == NULL || strcmp(dev->type, "pci") != 0) | ||
237 | continue; | ||
238 | ++index; | ||
239 | /* The GG2 bridge on the LongTrail doesn't have an address */ | ||
240 | if (dev->n_addrs < 1 && !is_longtrail) { | ||
241 | printk(KERN_WARNING "Can't use %s: no address\n", | ||
242 | dev->full_name); | ||
243 | continue; | ||
244 | } | ||
245 | bus_range = (int *) get_property(dev, "bus-range", &len); | ||
246 | if (bus_range == NULL || len < 2 * sizeof(int)) { | ||
247 | printk(KERN_WARNING "Can't get bus-range for %s\n", | ||
248 | dev->full_name); | ||
249 | continue; | ||
250 | } | ||
251 | if (bus_range[1] == bus_range[0]) | ||
252 | printk(KERN_INFO "PCI bus %d", bus_range[0]); | ||
253 | else | ||
254 | printk(KERN_INFO "PCI buses %d..%d", | ||
255 | bus_range[0], bus_range[1]); | ||
256 | printk(" controlled by %s", dev->type); | ||
257 | if (dev->n_addrs > 0) | ||
258 | printk(" at %x", dev->addrs[0].address); | ||
259 | printk("\n"); | ||
260 | |||
261 | hose = pcibios_alloc_controller(); | ||
262 | if (!hose) { | ||
263 | printk("Can't allocate PCI controller structure for %s\n", | ||
264 | dev->full_name); | ||
265 | continue; | ||
266 | } | ||
267 | hose->arch_data = dev; | ||
268 | hose->first_busno = bus_range[0]; | ||
269 | hose->last_busno = bus_range[1]; | ||
270 | |||
271 | model = get_property(dev, "model", NULL); | ||
272 | if (model == NULL) | ||
273 | model = "<none>"; | ||
274 | if (device_is_compatible(dev, "IBM,python")) { | ||
275 | setup_python(hose, dev); | ||
276 | } else if (is_mot | ||
277 | || strncmp(model, "Motorola, Grackle", 17) == 0) { | ||
278 | setup_indirect_pci(hose, 0xfec00000, 0xfee00000); | ||
279 | } else if (is_longtrail) { | ||
280 | void __iomem *p = ioremap(GG2_PCI_CONFIG_BASE, 0x80000); | ||
281 | hose->ops = &gg2_pci_ops; | ||
282 | hose->cfg_data = p; | ||
283 | gg2_pci_config_base = p; | ||
284 | } else if (is_pegasos == 1) { | ||
285 | setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc); | ||
286 | } else if (is_pegasos == 2) { | ||
287 | setup_peg2(hose, dev); | ||
288 | } else { | ||
289 | printk("No methods for %s (model %s), using RTAS\n", | ||
290 | dev->full_name, model); | ||
291 | hose->ops = &rtas_pci_ops; | ||
292 | } | ||
293 | |||
294 | pci_process_bridge_OF_ranges(hose, dev, index == 0); | ||
295 | |||
296 | /* check the first bridge for a property that we can | ||
297 | use to set pci_dram_offset */ | ||
298 | dma = (unsigned int *) | ||
299 | get_property(dev, "ibm,dma-ranges", &len); | ||
300 | if (index == 0 && dma != NULL && len >= 6 * sizeof(*dma)) { | ||
301 | pci_dram_offset = dma[2] - dma[3]; | ||
302 | printk("pci_dram_offset = %lx\n", pci_dram_offset); | ||
303 | } | ||
304 | } | ||
305 | |||
306 | /* Do not fixup interrupts from OF tree on pegasos */ | ||
307 | if (is_pegasos == 0) | ||
308 | ppc_md.pcibios_fixup = chrp_pcibios_fixup; | ||
309 | } | ||
diff --git a/arch/ppc/platforms/chrp_pegasos_eth.c b/arch/ppc/platforms/chrp_pegasos_eth.c deleted file mode 100644 index 9305c8aa1373..000000000000 --- a/arch/ppc/platforms/chrp_pegasos_eth.c +++ /dev/null | |||
@@ -1,211 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 Sven Luther <sl@bplan-gmbh.de> | ||
3 | * Thanks to : | ||
4 | * Dale Farnsworth <dale@farnsworth.org> | ||
5 | * Mark A. Greer <mgreer@mvista.com> | ||
6 | * Nicolas DET <nd@bplan-gmbh.de> | ||
7 | * Benjamin Herrenschmidt <benh@kernel.crashing.org> | ||
8 | * And anyone else who helped me on this. | ||
9 | */ | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/ioport.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/mv643xx.h> | ||
16 | #include <linux/pci.h> | ||
17 | |||
18 | #define PEGASOS2_MARVELL_REGBASE (0xf1000000) | ||
19 | #define PEGASOS2_MARVELL_REGSIZE (0x00004000) | ||
20 | #define PEGASOS2_SRAM_BASE (0xf2000000) | ||
21 | #define PEGASOS2_SRAM_SIZE (256*1024) | ||
22 | |||
23 | #define PEGASOS2_SRAM_BASE_ETH0 (PEGASOS2_SRAM_BASE) | ||
24 | #define PEGASOS2_SRAM_BASE_ETH1 (PEGASOS2_SRAM_BASE_ETH0 + (PEGASOS2_SRAM_SIZE / 2) ) | ||
25 | |||
26 | |||
27 | #define PEGASOS2_SRAM_RXRING_SIZE (PEGASOS2_SRAM_SIZE/4) | ||
28 | #define PEGASOS2_SRAM_TXRING_SIZE (PEGASOS2_SRAM_SIZE/4) | ||
29 | |||
30 | #undef BE_VERBOSE | ||
31 | |||
32 | static struct resource mv643xx_eth_shared_resources[] = { | ||
33 | [0] = { | ||
34 | .name = "ethernet shared base", | ||
35 | .start = 0xf1000000 + MV643XX_ETH_SHARED_REGS, | ||
36 | .end = 0xf1000000 + MV643XX_ETH_SHARED_REGS + | ||
37 | MV643XX_ETH_SHARED_REGS_SIZE - 1, | ||
38 | .flags = IORESOURCE_MEM, | ||
39 | }, | ||
40 | }; | ||
41 | |||
42 | static struct platform_device mv643xx_eth_shared_device = { | ||
43 | .name = MV643XX_ETH_SHARED_NAME, | ||
44 | .id = 0, | ||
45 | .num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources), | ||
46 | .resource = mv643xx_eth_shared_resources, | ||
47 | }; | ||
48 | |||
49 | static struct resource mv643xx_eth0_resources[] = { | ||
50 | [0] = { | ||
51 | .name = "eth0 irq", | ||
52 | .start = 9, | ||
53 | .end = 9, | ||
54 | .flags = IORESOURCE_IRQ, | ||
55 | }, | ||
56 | }; | ||
57 | |||
58 | |||
59 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
60 | .tx_sram_addr = PEGASOS2_SRAM_BASE_ETH0, | ||
61 | .tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE, | ||
62 | .tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16, | ||
63 | |||
64 | .rx_sram_addr = PEGASOS2_SRAM_BASE_ETH0 + PEGASOS2_SRAM_TXRING_SIZE, | ||
65 | .rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE, | ||
66 | .rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16, | ||
67 | }; | ||
68 | |||
69 | static struct platform_device eth0_device = { | ||
70 | .name = MV643XX_ETH_NAME, | ||
71 | .id = 0, | ||
72 | .num_resources = ARRAY_SIZE(mv643xx_eth0_resources), | ||
73 | .resource = mv643xx_eth0_resources, | ||
74 | .dev = { | ||
75 | .platform_data = ð0_pd, | ||
76 | }, | ||
77 | }; | ||
78 | |||
79 | static struct resource mv643xx_eth1_resources[] = { | ||
80 | [0] = { | ||
81 | .name = "eth1 irq", | ||
82 | .start = 9, | ||
83 | .end = 9, | ||
84 | .flags = IORESOURCE_IRQ, | ||
85 | }, | ||
86 | }; | ||
87 | |||
88 | static struct mv643xx_eth_platform_data eth1_pd = { | ||
89 | .tx_sram_addr = PEGASOS2_SRAM_BASE_ETH1, | ||
90 | .tx_sram_size = PEGASOS2_SRAM_TXRING_SIZE, | ||
91 | .tx_queue_size = PEGASOS2_SRAM_TXRING_SIZE/16, | ||
92 | |||
93 | .rx_sram_addr = PEGASOS2_SRAM_BASE_ETH1 + PEGASOS2_SRAM_TXRING_SIZE, | ||
94 | .rx_sram_size = PEGASOS2_SRAM_RXRING_SIZE, | ||
95 | .rx_queue_size = PEGASOS2_SRAM_RXRING_SIZE/16, | ||
96 | }; | ||
97 | |||
98 | static struct platform_device eth1_device = { | ||
99 | .name = MV643XX_ETH_NAME, | ||
100 | .id = 1, | ||
101 | .num_resources = ARRAY_SIZE(mv643xx_eth1_resources), | ||
102 | .resource = mv643xx_eth1_resources, | ||
103 | .dev = { | ||
104 | .platform_data = ð1_pd, | ||
105 | }, | ||
106 | }; | ||
107 | |||
108 | static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | ||
109 | &mv643xx_eth_shared_device, | ||
110 | ð0_device, | ||
111 | ð1_device, | ||
112 | }; | ||
113 | |||
114 | /***********/ | ||
115 | /***********/ | ||
116 | #define MV_READ(offset,val) { val = readl(mv643xx_reg_base + offset); } | ||
117 | #define MV_WRITE(offset,data) writel(data, mv643xx_reg_base + offset) | ||
118 | |||
119 | static void __iomem *mv643xx_reg_base; | ||
120 | |||
121 | static int Enable_SRAM(void) | ||
122 | { | ||
123 | u32 ALong; | ||
124 | |||
125 | if (mv643xx_reg_base == NULL) | ||
126 | mv643xx_reg_base = ioremap(PEGASOS2_MARVELL_REGBASE, | ||
127 | PEGASOS2_MARVELL_REGSIZE); | ||
128 | |||
129 | if (mv643xx_reg_base == NULL) | ||
130 | return -ENOMEM; | ||
131 | |||
132 | #ifdef BE_VERBOSE | ||
133 | printk("Pegasos II/Marvell MV64361: register remapped from %p to %p\n", | ||
134 | (void *)PEGASOS2_MARVELL_REGBASE, (void *)mv643xx_reg_base); | ||
135 | #endif | ||
136 | |||
137 | MV_WRITE(MV64340_SRAM_CONFIG, 0); | ||
138 | |||
139 | MV_WRITE(MV64340_INTEGRATED_SRAM_BASE_ADDR, PEGASOS2_SRAM_BASE >> 16); | ||
140 | |||
141 | MV_READ(MV64340_BASE_ADDR_ENABLE, ALong); | ||
142 | ALong &= ~(1 << 19); | ||
143 | MV_WRITE(MV64340_BASE_ADDR_ENABLE, ALong); | ||
144 | |||
145 | ALong = 0x02; | ||
146 | ALong |= PEGASOS2_SRAM_BASE & 0xffff0000; | ||
147 | MV_WRITE(MV643XX_ETH_BAR_4, ALong); | ||
148 | |||
149 | MV_WRITE(MV643XX_ETH_SIZE_REG_4, (PEGASOS2_SRAM_SIZE-1) & 0xffff0000); | ||
150 | |||
151 | MV_READ(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong); | ||
152 | ALong &= ~(1 << 4); | ||
153 | MV_WRITE(MV643XX_ETH_BASE_ADDR_ENABLE_REG, ALong); | ||
154 | |||
155 | #ifdef BE_VERBOSE | ||
156 | printk("Pegasos II/Marvell MV64361: register unmapped\n"); | ||
157 | printk("Pegasos II/Marvell MV64361: SRAM at %p, size=%x\n", (void*) PEGASOS2_SRAM_BASE, PEGASOS2_SRAM_SIZE); | ||
158 | #endif | ||
159 | |||
160 | iounmap(mv643xx_reg_base); | ||
161 | mv643xx_reg_base = NULL; | ||
162 | |||
163 | return 1; | ||
164 | } | ||
165 | |||
166 | |||
167 | /***********/ | ||
168 | /***********/ | ||
169 | int mv643xx_eth_add_pds(void) | ||
170 | { | ||
171 | int ret = 0; | ||
172 | static struct pci_device_id pci_marvell_mv64360[] = { | ||
173 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_MV64360) }, | ||
174 | { } | ||
175 | }; | ||
176 | |||
177 | #ifdef BE_VERBOSE | ||
178 | printk("Pegasos II/Marvell MV64361: init\n"); | ||
179 | #endif | ||
180 | |||
181 | if (pci_dev_present(pci_marvell_mv64360)) { | ||
182 | ret = platform_add_devices(mv643xx_eth_pd_devs, | ||
183 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
184 | |||
185 | if ( Enable_SRAM() < 0) | ||
186 | { | ||
187 | eth0_pd.tx_sram_addr = 0; | ||
188 | eth0_pd.tx_sram_size = 0; | ||
189 | eth0_pd.rx_sram_addr = 0; | ||
190 | eth0_pd.rx_sram_size = 0; | ||
191 | |||
192 | eth1_pd.tx_sram_addr = 0; | ||
193 | eth1_pd.tx_sram_size = 0; | ||
194 | eth1_pd.rx_sram_addr = 0; | ||
195 | eth1_pd.rx_sram_size = 0; | ||
196 | |||
197 | #ifdef BE_VERBOSE | ||
198 | printk("Pegasos II/Marvell MV64361: Can't enable the " | ||
199 | "SRAM\n"); | ||
200 | #endif | ||
201 | } | ||
202 | } | ||
203 | |||
204 | #ifdef BE_VERBOSE | ||
205 | printk("Pegasos II/Marvell MV64361: init is over\n"); | ||
206 | #endif | ||
207 | |||
208 | return ret; | ||
209 | } | ||
210 | |||
211 | device_initcall(mv643xx_eth_add_pds); | ||
diff --git a/arch/ppc/platforms/chrp_setup.c b/arch/ppc/platforms/chrp_setup.c deleted file mode 100644 index f9fd3f4f8e2e..000000000000 --- a/arch/ppc/platforms/chrp_setup.c +++ /dev/null | |||
@@ -1,669 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1995 Linus Torvalds | ||
3 | * Adapted from 'alpha' version by Gary Thomas | ||
4 | * Modified by Cort Dougan (cort@cs.nmt.edu) | ||
5 | */ | ||
6 | |||
7 | /* | ||
8 | * bootup setup stuff.. | ||
9 | */ | ||
10 | |||
11 | #include <linux/config.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/mm.h> | ||
16 | #include <linux/stddef.h> | ||
17 | #include <linux/unistd.h> | ||
18 | #include <linux/ptrace.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/user.h> | ||
21 | #include <linux/a.out.h> | ||
22 | #include <linux/tty.h> | ||
23 | #include <linux/major.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/reboot.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <linux/pci.h> | ||
28 | #include <linux/version.h> | ||
29 | #include <linux/adb.h> | ||
30 | #include <linux/module.h> | ||
31 | #include <linux/delay.h> | ||
32 | #include <linux/ide.h> | ||
33 | #include <linux/console.h> | ||
34 | #include <linux/seq_file.h> | ||
35 | #include <linux/root_dev.h> | ||
36 | #include <linux/initrd.h> | ||
37 | #include <linux/module.h> | ||
38 | |||
39 | #include <asm/io.h> | ||
40 | #include <asm/pgtable.h> | ||
41 | #include <asm/prom.h> | ||
42 | #include <asm/gg2.h> | ||
43 | #include <asm/pci-bridge.h> | ||
44 | #include <asm/dma.h> | ||
45 | #include <asm/machdep.h> | ||
46 | #include <asm/irq.h> | ||
47 | #include <asm/hydra.h> | ||
48 | #include <asm/sections.h> | ||
49 | #include <asm/time.h> | ||
50 | #include <asm/btext.h> | ||
51 | #include <asm/i8259.h> | ||
52 | #include <asm/open_pic.h> | ||
53 | #include <asm/xmon.h> | ||
54 | #include "mem_pieces.h" | ||
55 | |||
56 | unsigned long chrp_get_rtc_time(void); | ||
57 | int chrp_set_rtc_time(unsigned long nowtime); | ||
58 | void chrp_calibrate_decr(void); | ||
59 | long chrp_time_init(void); | ||
60 | |||
61 | void chrp_find_bridges(void); | ||
62 | void chrp_event_scan(void); | ||
63 | void rtas_display_progress(char *, unsigned short); | ||
64 | void rtas_indicator_progress(char *, unsigned short); | ||
65 | void btext_progress(char *, unsigned short); | ||
66 | |||
67 | extern int of_show_percpuinfo(struct seq_file *, int); | ||
68 | |||
69 | int _chrp_type; | ||
70 | EXPORT_SYMBOL(_chrp_type); | ||
71 | |||
72 | /* | ||
73 | * XXX this should be in xmon.h, but putting it there means xmon.h | ||
74 | * has to include <linux/interrupt.h> (to get irqreturn_t), which | ||
75 | * causes all sorts of problems. -- paulus | ||
76 | */ | ||
77 | extern irqreturn_t xmon_irq(int, void *, struct pt_regs *); | ||
78 | |||
79 | extern dev_t boot_dev; | ||
80 | |||
81 | extern PTE *Hash, *Hash_end; | ||
82 | extern unsigned long Hash_size, Hash_mask; | ||
83 | extern int probingmem; | ||
84 | extern unsigned long loops_per_jiffy; | ||
85 | static int max_width; | ||
86 | |||
87 | #ifdef CONFIG_SMP | ||
88 | extern struct smp_ops_t chrp_smp_ops; | ||
89 | #endif | ||
90 | |||
91 | static const char *gg2_memtypes[4] = { | ||
92 | "FPM", "SDRAM", "EDO", "BEDO" | ||
93 | }; | ||
94 | static const char *gg2_cachesizes[4] = { | ||
95 | "256 KB", "512 KB", "1 MB", "Reserved" | ||
96 | }; | ||
97 | static const char *gg2_cachetypes[4] = { | ||
98 | "Asynchronous", "Reserved", "Flow-Through Synchronous", | ||
99 | "Pipelined Synchronous" | ||
100 | }; | ||
101 | static const char *gg2_cachemodes[4] = { | ||
102 | "Disabled", "Write-Through", "Copy-Back", "Transparent Mode" | ||
103 | }; | ||
104 | |||
105 | int | ||
106 | chrp_show_cpuinfo(struct seq_file *m) | ||
107 | { | ||
108 | int i, sdramen; | ||
109 | unsigned int t; | ||
110 | struct device_node *root; | ||
111 | const char *model = ""; | ||
112 | |||
113 | root = find_path_device("/"); | ||
114 | if (root) | ||
115 | model = get_property(root, "model", NULL); | ||
116 | seq_printf(m, "machine\t\t: CHRP %s\n", model); | ||
117 | |||
118 | /* longtrail (goldengate) stuff */ | ||
119 | if (!strncmp(model, "IBM,LongTrail", 13)) { | ||
120 | /* VLSI VAS96011/12 `Golden Gate 2' */ | ||
121 | /* Memory banks */ | ||
122 | sdramen = (in_le32(gg2_pci_config_base + GG2_PCI_DRAM_CTRL) | ||
123 | >>31) & 1; | ||
124 | for (i = 0; i < (sdramen ? 4 : 6); i++) { | ||
125 | t = in_le32(gg2_pci_config_base+ | ||
126 | GG2_PCI_DRAM_BANK0+ | ||
127 | i*4); | ||
128 | if (!(t & 1)) | ||
129 | continue; | ||
130 | switch ((t>>8) & 0x1f) { | ||
131 | case 0x1f: | ||
132 | model = "4 MB"; | ||
133 | break; | ||
134 | case 0x1e: | ||
135 | model = "8 MB"; | ||
136 | break; | ||
137 | case 0x1c: | ||
138 | model = "16 MB"; | ||
139 | break; | ||
140 | case 0x18: | ||
141 | model = "32 MB"; | ||
142 | break; | ||
143 | case 0x10: | ||
144 | model = "64 MB"; | ||
145 | break; | ||
146 | case 0x00: | ||
147 | model = "128 MB"; | ||
148 | break; | ||
149 | default: | ||
150 | model = "Reserved"; | ||
151 | break; | ||
152 | } | ||
153 | seq_printf(m, "memory bank %d\t: %s %s\n", i, model, | ||
154 | gg2_memtypes[sdramen ? 1 : ((t>>1) & 3)]); | ||
155 | } | ||
156 | /* L2 cache */ | ||
157 | t = in_le32(gg2_pci_config_base+GG2_PCI_CC_CTRL); | ||
158 | seq_printf(m, "board l2\t: %s %s (%s)\n", | ||
159 | gg2_cachesizes[(t>>7) & 3], | ||
160 | gg2_cachetypes[(t>>2) & 3], | ||
161 | gg2_cachemodes[t & 3]); | ||
162 | } | ||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | /* | ||
167 | * Fixes for the National Semiconductor PC78308VUL SuperI/O | ||
168 | * | ||
169 | * Some versions of Open Firmware incorrectly initialize the IRQ settings | ||
170 | * for keyboard and mouse | ||
171 | */ | ||
172 | static inline void __init sio_write(u8 val, u8 index) | ||
173 | { | ||
174 | outb(index, 0x15c); | ||
175 | outb(val, 0x15d); | ||
176 | } | ||
177 | |||
178 | static inline u8 __init sio_read(u8 index) | ||
179 | { | ||
180 | outb(index, 0x15c); | ||
181 | return inb(0x15d); | ||
182 | } | ||
183 | |||
184 | static void __init sio_fixup_irq(const char *name, u8 device, u8 level, | ||
185 | u8 type) | ||
186 | { | ||
187 | u8 level0, type0, active; | ||
188 | |||
189 | /* select logical device */ | ||
190 | sio_write(device, 0x07); | ||
191 | active = sio_read(0x30); | ||
192 | level0 = sio_read(0x70); | ||
193 | type0 = sio_read(0x71); | ||
194 | if (level0 != level || type0 != type || !active) { | ||
195 | printk(KERN_WARNING "sio: %s irq level %d, type %d, %sactive: " | ||
196 | "remapping to level %d, type %d, active\n", | ||
197 | name, level0, type0, !active ? "in" : "", level, type); | ||
198 | sio_write(0x01, 0x30); | ||
199 | sio_write(level, 0x70); | ||
200 | sio_write(type, 0x71); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | static void __init sio_init(void) | ||
205 | { | ||
206 | struct device_node *root; | ||
207 | |||
208 | if ((root = find_path_device("/")) && | ||
209 | !strncmp(get_property(root, "model", NULL), "IBM,LongTrail", 13)) { | ||
210 | /* logical device 0 (KBC/Keyboard) */ | ||
211 | sio_fixup_irq("keyboard", 0, 1, 2); | ||
212 | /* select logical device 1 (KBC/Mouse) */ | ||
213 | sio_fixup_irq("mouse", 1, 12, 2); | ||
214 | } | ||
215 | } | ||
216 | |||
217 | |||
218 | static void __init pegasos_set_l2cr(void) | ||
219 | { | ||
220 | struct device_node *np; | ||
221 | |||
222 | /* On Pegasos, enable the l2 cache if needed, as the OF forgets it */ | ||
223 | if (_chrp_type != _CHRP_Pegasos) | ||
224 | return; | ||
225 | |||
226 | /* Enable L2 cache if needed */ | ||
227 | np = find_type_devices("cpu"); | ||
228 | if (np != NULL) { | ||
229 | unsigned int *l2cr = (unsigned int *) | ||
230 | get_property (np, "l2cr", NULL); | ||
231 | if (l2cr == NULL) { | ||
232 | printk ("Pegasos l2cr : no cpu l2cr property found\n"); | ||
233 | return; | ||
234 | } | ||
235 | if (!((*l2cr) & 0x80000000)) { | ||
236 | printk ("Pegasos l2cr : L2 cache was not active, " | ||
237 | "activating\n"); | ||
238 | _set_L2CR(0); | ||
239 | _set_L2CR((*l2cr) | 0x80000000); | ||
240 | } | ||
241 | } | ||
242 | } | ||
243 | |||
244 | void __init chrp_setup_arch(void) | ||
245 | { | ||
246 | struct device_node *device; | ||
247 | |||
248 | /* init to some ~sane value until calibrate_delay() runs */ | ||
249 | loops_per_jiffy = 50000000/HZ; | ||
250 | |||
251 | #ifdef CONFIG_BLK_DEV_INITRD | ||
252 | /* this is fine for chrp */ | ||
253 | initrd_below_start_ok = 1; | ||
254 | |||
255 | if (initrd_start) | ||
256 | ROOT_DEV = Root_RAM0; | ||
257 | else | ||
258 | #endif | ||
259 | ROOT_DEV = Root_SDA2; /* sda2 (sda1 is for the kernel) */ | ||
260 | |||
261 | /* On pegasos, enable the L2 cache if not already done by OF */ | ||
262 | pegasos_set_l2cr(); | ||
263 | |||
264 | /* Lookup PCI host bridges */ | ||
265 | chrp_find_bridges(); | ||
266 | |||
267 | #ifndef CONFIG_PPC64BRIDGE | ||
268 | /* | ||
269 | * Temporary fixes for PCI devices. | ||
270 | * -- Geert | ||
271 | */ | ||
272 | hydra_init(); /* Mac I/O */ | ||
273 | |||
274 | #endif /* CONFIG_PPC64BRIDGE */ | ||
275 | |||
276 | /* | ||
277 | * Fix the Super I/O configuration | ||
278 | */ | ||
279 | sio_init(); | ||
280 | |||
281 | /* Get the event scan rate for the rtas so we know how | ||
282 | * often it expects a heartbeat. -- Cort | ||
283 | */ | ||
284 | if ( rtas_data ) { | ||
285 | struct property *p; | ||
286 | device = find_devices("rtas"); | ||
287 | for ( p = device->properties; | ||
288 | p && strncmp(p->name, "rtas-event-scan-rate", 20); | ||
289 | p = p->next ) | ||
290 | /* nothing */ ; | ||
291 | if ( p && *(unsigned long *)p->value ) { | ||
292 | ppc_md.heartbeat = chrp_event_scan; | ||
293 | ppc_md.heartbeat_reset = (HZ/(*(unsigned long *)p->value)*30)-1; | ||
294 | ppc_md.heartbeat_count = 1; | ||
295 | printk("RTAS Event Scan Rate: %lu (%lu jiffies)\n", | ||
296 | *(unsigned long *)p->value, ppc_md.heartbeat_reset ); | ||
297 | } | ||
298 | } | ||
299 | |||
300 | pci_create_OF_bus_map(); | ||
301 | } | ||
302 | |||
303 | void | ||
304 | chrp_event_scan(void) | ||
305 | { | ||
306 | unsigned char log[1024]; | ||
307 | unsigned long ret = 0; | ||
308 | /* XXX: we should loop until the hardware says no more error logs -- Cort */ | ||
309 | call_rtas( "event-scan", 4, 1, &ret, 0xffffffff, 0, | ||
310 | __pa(log), 1024 ); | ||
311 | ppc_md.heartbeat_count = ppc_md.heartbeat_reset; | ||
312 | } | ||
313 | |||
314 | void | ||
315 | chrp_restart(char *cmd) | ||
316 | { | ||
317 | printk("RTAS system-reboot returned %d\n", | ||
318 | call_rtas("system-reboot", 0, 1, NULL)); | ||
319 | for (;;); | ||
320 | } | ||
321 | |||
322 | void | ||
323 | chrp_power_off(void) | ||
324 | { | ||
325 | /* allow power on only with power button press */ | ||
326 | printk("RTAS power-off returned %d\n", | ||
327 | call_rtas("power-off", 2, 1, NULL,0xffffffff,0xffffffff)); | ||
328 | for (;;); | ||
329 | } | ||
330 | |||
331 | void | ||
332 | chrp_halt(void) | ||
333 | { | ||
334 | chrp_power_off(); | ||
335 | } | ||
336 | |||
337 | /* | ||
338 | * Finds the open-pic node and sets OpenPIC_Addr based on its reg property. | ||
339 | * Then checks if it has an interrupt-ranges property. If it does then | ||
340 | * we have a distributed open-pic, so call openpic_set_sources to tell | ||
341 | * the openpic code where to find the interrupt source registers. | ||
342 | */ | ||
343 | static void __init chrp_find_openpic(void) | ||
344 | { | ||
345 | struct device_node *np; | ||
346 | int len, i; | ||
347 | unsigned int *iranges; | ||
348 | void __iomem *isu; | ||
349 | |||
350 | np = find_type_devices("open-pic"); | ||
351 | if (np == NULL || np->n_addrs == 0) | ||
352 | return; | ||
353 | printk(KERN_INFO "OpenPIC at %x (size %x)\n", | ||
354 | np->addrs[0].address, np->addrs[0].size); | ||
355 | OpenPIC_Addr = ioremap(np->addrs[0].address, 0x40000); | ||
356 | if (OpenPIC_Addr == NULL) { | ||
357 | printk(KERN_ERR "Failed to map OpenPIC!\n"); | ||
358 | return; | ||
359 | } | ||
360 | |||
361 | iranges = (unsigned int *) get_property(np, "interrupt-ranges", &len); | ||
362 | if (iranges == NULL || len < 2 * sizeof(unsigned int)) | ||
363 | return; /* not distributed */ | ||
364 | |||
365 | /* | ||
366 | * The first pair of cells in interrupt-ranges refers to the | ||
367 | * IDU; subsequent pairs refer to the ISUs. | ||
368 | */ | ||
369 | len /= 2 * sizeof(unsigned int); | ||
370 | if (np->n_addrs < len) { | ||
371 | printk(KERN_ERR "Insufficient addresses for distributed" | ||
372 | " OpenPIC (%d < %d)\n", np->n_addrs, len); | ||
373 | return; | ||
374 | } | ||
375 | if (iranges[1] != 0) { | ||
376 | printk(KERN_INFO "OpenPIC irqs %d..%d in IDU\n", | ||
377 | iranges[0], iranges[0] + iranges[1] - 1); | ||
378 | openpic_set_sources(iranges[0], iranges[1], NULL); | ||
379 | } | ||
380 | for (i = 1; i < len; ++i) { | ||
381 | iranges += 2; | ||
382 | printk(KERN_INFO "OpenPIC irqs %d..%d in ISU at %x (%x)\n", | ||
383 | iranges[0], iranges[0] + iranges[1] - 1, | ||
384 | np->addrs[i].address, np->addrs[i].size); | ||
385 | isu = ioremap(np->addrs[i].address, np->addrs[i].size); | ||
386 | if (isu != NULL) | ||
387 | openpic_set_sources(iranges[0], iranges[1], isu); | ||
388 | else | ||
389 | printk(KERN_ERR "Failed to map OpenPIC ISU at %x!\n", | ||
390 | np->addrs[i].address); | ||
391 | } | ||
392 | } | ||
393 | |||
394 | #if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON) | ||
395 | static struct irqaction xmon_irqaction = { | ||
396 | .handler = xmon_irq, | ||
397 | .mask = CPU_MASK_NONE, | ||
398 | .name = "XMON break", | ||
399 | }; | ||
400 | #endif | ||
401 | |||
402 | void __init chrp_init_IRQ(void) | ||
403 | { | ||
404 | struct device_node *np; | ||
405 | unsigned long chrp_int_ack = 0; | ||
406 | unsigned char init_senses[NR_IRQS - NUM_8259_INTERRUPTS]; | ||
407 | #if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON) | ||
408 | struct device_node *kbd; | ||
409 | #endif | ||
410 | |||
411 | for (np = find_devices("pci"); np != NULL; np = np->next) { | ||
412 | unsigned int *addrp = (unsigned int *) | ||
413 | get_property(np, "8259-interrupt-acknowledge", NULL); | ||
414 | |||
415 | if (addrp == NULL) | ||
416 | continue; | ||
417 | chrp_int_ack = addrp[prom_n_addr_cells(np)-1]; | ||
418 | break; | ||
419 | } | ||
420 | if (np == NULL) | ||
421 | printk(KERN_ERR "Cannot find PCI interrupt acknowledge address\n"); | ||
422 | |||
423 | chrp_find_openpic(); | ||
424 | |||
425 | if (OpenPIC_Addr) { | ||
426 | prom_get_irq_senses(init_senses, NUM_8259_INTERRUPTS, NR_IRQS); | ||
427 | OpenPIC_InitSenses = init_senses; | ||
428 | OpenPIC_NumInitSenses = NR_IRQS - NUM_8259_INTERRUPTS; | ||
429 | |||
430 | openpic_init(NUM_8259_INTERRUPTS); | ||
431 | /* We have a cascade on OpenPIC IRQ 0, Linux IRQ 16 */ | ||
432 | openpic_hookup_cascade(NUM_8259_INTERRUPTS, "82c59 cascade", | ||
433 | i8259_irq); | ||
434 | |||
435 | } | ||
436 | i8259_init(chrp_int_ack, 0); | ||
437 | |||
438 | #if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON) | ||
439 | /* see if there is a keyboard in the device tree | ||
440 | with a parent of type "adb" */ | ||
441 | for (kbd = find_devices("keyboard"); kbd; kbd = kbd->next) | ||
442 | if (kbd->parent && kbd->parent->type | ||
443 | && strcmp(kbd->parent->type, "adb") == 0) | ||
444 | break; | ||
445 | if (kbd) | ||
446 | setup_irq(HYDRA_INT_ADB_NMI, &xmon_irqaction); | ||
447 | #endif | ||
448 | } | ||
449 | |||
450 | void __init | ||
451 | chrp_init2(void) | ||
452 | { | ||
453 | #ifdef CONFIG_NVRAM | ||
454 | chrp_nvram_init(); | ||
455 | #endif | ||
456 | |||
457 | request_region(0x20,0x20,"pic1"); | ||
458 | request_region(0xa0,0x20,"pic2"); | ||
459 | request_region(0x00,0x20,"dma1"); | ||
460 | request_region(0x40,0x20,"timer"); | ||
461 | request_region(0x80,0x10,"dma page reg"); | ||
462 | request_region(0xc0,0x20,"dma2"); | ||
463 | |||
464 | if (ppc_md.progress) | ||
465 | ppc_md.progress(" Have fun! ", 0x7777); | ||
466 | } | ||
467 | |||
468 | static struct device_node *memory_node; | ||
469 | |||
470 | static int __init get_mem_prop(char *name, struct mem_pieces *mp) | ||
471 | { | ||
472 | struct reg_property *rp; | ||
473 | int i, s; | ||
474 | unsigned int *ip; | ||
475 | int nac = prom_n_addr_cells(memory_node); | ||
476 | int nsc = prom_n_size_cells(memory_node); | ||
477 | |||
478 | ip = (unsigned int *) get_property(memory_node, name, &s); | ||
479 | if (ip == NULL) { | ||
480 | printk(KERN_ERR "error: couldn't get %s property on /memory\n", | ||
481 | name); | ||
482 | return 0; | ||
483 | } | ||
484 | s /= (nsc + nac) * 4; | ||
485 | rp = mp->regions; | ||
486 | for (i = 0; i < s; ++i, ip += nac+nsc) { | ||
487 | if (nac >= 2 && ip[nac-2] != 0) | ||
488 | continue; | ||
489 | rp->address = ip[nac-1]; | ||
490 | if (nsc >= 2 && ip[nac+nsc-2] != 0) | ||
491 | rp->size = ~0U; | ||
492 | else | ||
493 | rp->size = ip[nac+nsc-1]; | ||
494 | ++rp; | ||
495 | } | ||
496 | mp->n_regions = rp - mp->regions; | ||
497 | |||
498 | /* Make sure the pieces are sorted. */ | ||
499 | mem_pieces_sort(mp); | ||
500 | mem_pieces_coalesce(mp); | ||
501 | return 1; | ||
502 | } | ||
503 | |||
504 | static unsigned long __init chrp_find_end_of_memory(void) | ||
505 | { | ||
506 | unsigned long a, total; | ||
507 | struct mem_pieces phys_mem; | ||
508 | |||
509 | /* | ||
510 | * Find out where physical memory is, and check that it | ||
511 | * starts at 0 and is contiguous. It seems that RAM is | ||
512 | * always physically contiguous on Power Macintoshes. | ||
513 | * | ||
514 | * Supporting discontiguous physical memory isn't hard, | ||
515 | * it just makes the virtual <-> physical mapping functions | ||
516 | * more complicated (or else you end up wasting space | ||
517 | * in mem_map). | ||
518 | */ | ||
519 | memory_node = find_devices("memory"); | ||
520 | if (memory_node == NULL || !get_mem_prop("reg", &phys_mem) | ||
521 | || phys_mem.n_regions == 0) | ||
522 | panic("No RAM??"); | ||
523 | a = phys_mem.regions[0].address; | ||
524 | if (a != 0) | ||
525 | panic("RAM doesn't start at physical address 0"); | ||
526 | total = phys_mem.regions[0].size; | ||
527 | |||
528 | if (phys_mem.n_regions > 1) { | ||
529 | printk("RAM starting at 0x%x is not contiguous\n", | ||
530 | phys_mem.regions[1].address); | ||
531 | printk("Using RAM from 0 to 0x%lx\n", total-1); | ||
532 | } | ||
533 | |||
534 | return total; | ||
535 | } | ||
536 | |||
537 | void __init | ||
538 | chrp_init(unsigned long r3, unsigned long r4, unsigned long r5, | ||
539 | unsigned long r6, unsigned long r7) | ||
540 | { | ||
541 | struct device_node *root = find_path_device ("/"); | ||
542 | char *machine = NULL; | ||
543 | |||
544 | #ifdef CONFIG_BLK_DEV_INITRD | ||
545 | /* take care of initrd if we have one */ | ||
546 | if ( r6 ) | ||
547 | { | ||
548 | initrd_start = r6 + KERNELBASE; | ||
549 | initrd_end = r6 + r7 + KERNELBASE; | ||
550 | } | ||
551 | #endif /* CONFIG_BLK_DEV_INITRD */ | ||
552 | |||
553 | ISA_DMA_THRESHOLD = ~0L; | ||
554 | DMA_MODE_READ = 0x44; | ||
555 | DMA_MODE_WRITE = 0x48; | ||
556 | isa_io_base = CHRP_ISA_IO_BASE; /* default value */ | ||
557 | ppc_do_canonicalize_irqs = 1; | ||
558 | |||
559 | if (root) | ||
560 | machine = get_property(root, "model", NULL); | ||
561 | if (machine && strncmp(machine, "Pegasos", 7) == 0) { | ||
562 | _chrp_type = _CHRP_Pegasos; | ||
563 | } else if (machine && strncmp(machine, "IBM", 3) == 0) { | ||
564 | _chrp_type = _CHRP_IBM; | ||
565 | } else if (machine && strncmp(machine, "MOT", 3) == 0) { | ||
566 | _chrp_type = _CHRP_Motorola; | ||
567 | } else { | ||
568 | /* Let's assume it is an IBM chrp if all else fails */ | ||
569 | _chrp_type = _CHRP_IBM; | ||
570 | } | ||
571 | |||
572 | ppc_md.setup_arch = chrp_setup_arch; | ||
573 | ppc_md.show_percpuinfo = of_show_percpuinfo; | ||
574 | ppc_md.show_cpuinfo = chrp_show_cpuinfo; | ||
575 | |||
576 | ppc_md.init_IRQ = chrp_init_IRQ; | ||
577 | if (_chrp_type == _CHRP_Pegasos) | ||
578 | ppc_md.get_irq = i8259_irq; | ||
579 | else | ||
580 | ppc_md.get_irq = openpic_get_irq; | ||
581 | |||
582 | ppc_md.init = chrp_init2; | ||
583 | |||
584 | ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot; | ||
585 | |||
586 | ppc_md.restart = chrp_restart; | ||
587 | ppc_md.power_off = chrp_power_off; | ||
588 | ppc_md.halt = chrp_halt; | ||
589 | |||
590 | ppc_md.time_init = chrp_time_init; | ||
591 | ppc_md.set_rtc_time = chrp_set_rtc_time; | ||
592 | ppc_md.get_rtc_time = chrp_get_rtc_time; | ||
593 | ppc_md.calibrate_decr = chrp_calibrate_decr; | ||
594 | |||
595 | ppc_md.find_end_of_memory = chrp_find_end_of_memory; | ||
596 | |||
597 | if (rtas_data) { | ||
598 | struct device_node *rtas; | ||
599 | unsigned int *p; | ||
600 | |||
601 | rtas = find_devices("rtas"); | ||
602 | if (rtas != NULL) { | ||
603 | if (get_property(rtas, "display-character", NULL)) { | ||
604 | ppc_md.progress = rtas_display_progress; | ||
605 | p = (unsigned int *) get_property | ||
606 | (rtas, "ibm,display-line-length", NULL); | ||
607 | if (p) | ||
608 | max_width = *p; | ||
609 | } else if (get_property(rtas, "set-indicator", NULL)) | ||
610 | ppc_md.progress = rtas_indicator_progress; | ||
611 | } | ||
612 | } | ||
613 | #ifdef CONFIG_BOOTX_TEXT | ||
614 | if (ppc_md.progress == NULL && boot_text_mapped) | ||
615 | ppc_md.progress = btext_progress; | ||
616 | #endif | ||
617 | |||
618 | #ifdef CONFIG_SMP | ||
619 | smp_ops = &chrp_smp_ops; | ||
620 | #endif /* CONFIG_SMP */ | ||
621 | |||
622 | /* | ||
623 | * Print the banner, then scroll down so boot progress | ||
624 | * can be printed. -- Cort | ||
625 | */ | ||
626 | if (ppc_md.progress) ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0x0); | ||
627 | } | ||
628 | |||
629 | void | ||
630 | rtas_display_progress(char *s, unsigned short hex) | ||
631 | { | ||
632 | int width; | ||
633 | char *os = s; | ||
634 | |||
635 | if ( call_rtas( "display-character", 1, 1, NULL, '\r' ) ) | ||
636 | return; | ||
637 | |||
638 | width = max_width; | ||
639 | while ( *os ) | ||
640 | { | ||
641 | if ( (*os == '\n') || (*os == '\r') ) | ||
642 | width = max_width; | ||
643 | else | ||
644 | width--; | ||
645 | call_rtas( "display-character", 1, 1, NULL, *os++ ); | ||
646 | /* if we overwrite the screen length */ | ||
647 | if ( width == 0 ) | ||
648 | while ( (*os != 0) && (*os != '\n') && (*os != '\r') ) | ||
649 | os++; | ||
650 | } | ||
651 | |||
652 | /*while ( width-- > 0 )*/ | ||
653 | call_rtas( "display-character", 1, 1, NULL, ' ' ); | ||
654 | } | ||
655 | |||
656 | void | ||
657 | rtas_indicator_progress(char *s, unsigned short hex) | ||
658 | { | ||
659 | call_rtas("set-indicator", 3, 1, NULL, 6, 0, hex); | ||
660 | } | ||
661 | |||
662 | #ifdef CONFIG_BOOTX_TEXT | ||
663 | void | ||
664 | btext_progress(char *s, unsigned short hex) | ||
665 | { | ||
666 | prom_print(s); | ||
667 | prom_print("\n"); | ||
668 | } | ||
669 | #endif /* CONFIG_BOOTX_TEXT */ | ||
diff --git a/arch/ppc/platforms/chrp_smp.c b/arch/ppc/platforms/chrp_smp.c deleted file mode 100644 index 97e539557ecb..000000000000 --- a/arch/ppc/platforms/chrp_smp.c +++ /dev/null | |||
@@ -1,99 +0,0 @@ | |||
1 | /* | ||
2 | * Smp support for CHRP machines. | ||
3 | * | ||
4 | * Written by Cort Dougan (cort@cs.nmt.edu) borrowing a great | ||
5 | * deal of code from the sparc and intel versions. | ||
6 | * | ||
7 | * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu> | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/config.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/smp.h> | ||
15 | #include <linux/smp_lock.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/kernel_stat.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/spinlock.h> | ||
21 | |||
22 | #include <asm/ptrace.h> | ||
23 | #include <asm/atomic.h> | ||
24 | #include <asm/irq.h> | ||
25 | #include <asm/page.h> | ||
26 | #include <asm/pgtable.h> | ||
27 | #include <asm/sections.h> | ||
28 | #include <asm/io.h> | ||
29 | #include <asm/prom.h> | ||
30 | #include <asm/smp.h> | ||
31 | #include <asm/residual.h> | ||
32 | #include <asm/time.h> | ||
33 | #include <asm/open_pic.h> | ||
34 | #include <asm/machdep.h> | ||
35 | |||
36 | extern unsigned long smp_chrp_cpu_nr; | ||
37 | |||
38 | static int __init | ||
39 | smp_chrp_probe(void) | ||
40 | { | ||
41 | if (smp_chrp_cpu_nr > 1) | ||
42 | openpic_request_IPIs(); | ||
43 | |||
44 | return smp_chrp_cpu_nr; | ||
45 | } | ||
46 | |||
47 | static void __devinit | ||
48 | smp_chrp_kick_cpu(int nr) | ||
49 | { | ||
50 | *(unsigned long *)KERNELBASE = nr; | ||
51 | asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory"); | ||
52 | } | ||
53 | |||
54 | static void __devinit | ||
55 | smp_chrp_setup_cpu(int cpu_nr) | ||
56 | { | ||
57 | if (OpenPIC_Addr) | ||
58 | do_openpic_setup_cpu(); | ||
59 | } | ||
60 | |||
61 | static DEFINE_SPINLOCK(timebase_lock); | ||
62 | static unsigned int timebase_upper = 0, timebase_lower = 0; | ||
63 | |||
64 | void __devinit | ||
65 | smp_chrp_give_timebase(void) | ||
66 | { | ||
67 | spin_lock(&timebase_lock); | ||
68 | call_rtas("freeze-time-base", 0, 1, NULL); | ||
69 | timebase_upper = get_tbu(); | ||
70 | timebase_lower = get_tbl(); | ||
71 | spin_unlock(&timebase_lock); | ||
72 | |||
73 | while (timebase_upper || timebase_lower) | ||
74 | barrier(); | ||
75 | call_rtas("thaw-time-base", 0, 1, NULL); | ||
76 | } | ||
77 | |||
78 | void __devinit | ||
79 | smp_chrp_take_timebase(void) | ||
80 | { | ||
81 | while (!(timebase_upper || timebase_lower)) | ||
82 | barrier(); | ||
83 | spin_lock(&timebase_lock); | ||
84 | set_tb(timebase_upper, timebase_lower); | ||
85 | timebase_upper = 0; | ||
86 | timebase_lower = 0; | ||
87 | spin_unlock(&timebase_lock); | ||
88 | printk("CPU %i taken timebase\n", smp_processor_id()); | ||
89 | } | ||
90 | |||
91 | /* CHRP with openpic */ | ||
92 | struct smp_ops_t chrp_smp_ops = { | ||
93 | .message_pass = smp_openpic_message_pass, | ||
94 | .probe = smp_chrp_probe, | ||
95 | .kick_cpu = smp_chrp_kick_cpu, | ||
96 | .setup_cpu = smp_chrp_setup_cpu, | ||
97 | .give_timebase = smp_chrp_give_timebase, | ||
98 | .take_timebase = smp_chrp_take_timebase, | ||
99 | }; | ||
diff --git a/arch/ppc/platforms/chrp_time.c b/arch/ppc/platforms/chrp_time.c deleted file mode 100644 index 51e06ad66168..000000000000 --- a/arch/ppc/platforms/chrp_time.c +++ /dev/null | |||
@@ -1,235 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1991, 1992, 1995 Linus Torvalds | ||
3 | * | ||
4 | * Adapted for PowerPC (PReP) by Gary Thomas | ||
5 | * Modified by Cort Dougan (cort@cs.nmt.edu). | ||
6 | * Copied and modified from arch/i386/kernel/time.c | ||
7 | * | ||
8 | */ | ||
9 | #include <linux/errno.h> | ||
10 | #include <linux/sched.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/param.h> | ||
13 | #include <linux/string.h> | ||
14 | #include <linux/mm.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/time.h> | ||
17 | #include <linux/timex.h> | ||
18 | #include <linux/kernel_stat.h> | ||
19 | #include <linux/mc146818rtc.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/bcd.h> | ||
22 | |||
23 | #include <asm/io.h> | ||
24 | #include <asm/nvram.h> | ||
25 | #include <asm/prom.h> | ||
26 | #include <asm/sections.h> | ||
27 | #include <asm/time.h> | ||
28 | |||
29 | extern spinlock_t rtc_lock; | ||
30 | |||
31 | static int nvram_as1 = NVRAM_AS1; | ||
32 | static int nvram_as0 = NVRAM_AS0; | ||
33 | static int nvram_data = NVRAM_DATA; | ||
34 | |||
35 | long __init chrp_time_init(void) | ||
36 | { | ||
37 | struct device_node *rtcs; | ||
38 | int base; | ||
39 | |||
40 | rtcs = find_compatible_devices("rtc", "pnpPNP,b00"); | ||
41 | if (rtcs == NULL) | ||
42 | rtcs = find_compatible_devices("rtc", "ds1385-rtc"); | ||
43 | if (rtcs == NULL || rtcs->addrs == NULL) | ||
44 | return 0; | ||
45 | base = rtcs->addrs[0].address; | ||
46 | nvram_as1 = 0; | ||
47 | nvram_as0 = base; | ||
48 | nvram_data = base + 1; | ||
49 | |||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | int chrp_cmos_clock_read(int addr) | ||
54 | { | ||
55 | if (nvram_as1 != 0) | ||
56 | outb(addr>>8, nvram_as1); | ||
57 | outb(addr, nvram_as0); | ||
58 | return (inb(nvram_data)); | ||
59 | } | ||
60 | |||
61 | void chrp_cmos_clock_write(unsigned long val, int addr) | ||
62 | { | ||
63 | if (nvram_as1 != 0) | ||
64 | outb(addr>>8, nvram_as1); | ||
65 | outb(addr, nvram_as0); | ||
66 | outb(val, nvram_data); | ||
67 | return; | ||
68 | } | ||
69 | |||
70 | /* | ||
71 | * Set the hardware clock. -- Cort | ||
72 | */ | ||
73 | int chrp_set_rtc_time(unsigned long nowtime) | ||
74 | { | ||
75 | unsigned char save_control, save_freq_select; | ||
76 | struct rtc_time tm; | ||
77 | |||
78 | spin_lock(&rtc_lock); | ||
79 | to_tm(nowtime, &tm); | ||
80 | |||
81 | save_control = chrp_cmos_clock_read(RTC_CONTROL); /* tell the clock it's being set */ | ||
82 | |||
83 | chrp_cmos_clock_write((save_control|RTC_SET), RTC_CONTROL); | ||
84 | |||
85 | save_freq_select = chrp_cmos_clock_read(RTC_FREQ_SELECT); /* stop and reset prescaler */ | ||
86 | |||
87 | chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT); | ||
88 | |||
89 | tm.tm_year -= 1900; | ||
90 | if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { | ||
91 | BIN_TO_BCD(tm.tm_sec); | ||
92 | BIN_TO_BCD(tm.tm_min); | ||
93 | BIN_TO_BCD(tm.tm_hour); | ||
94 | BIN_TO_BCD(tm.tm_mon); | ||
95 | BIN_TO_BCD(tm.tm_mday); | ||
96 | BIN_TO_BCD(tm.tm_year); | ||
97 | } | ||
98 | chrp_cmos_clock_write(tm.tm_sec,RTC_SECONDS); | ||
99 | chrp_cmos_clock_write(tm.tm_min,RTC_MINUTES); | ||
100 | chrp_cmos_clock_write(tm.tm_hour,RTC_HOURS); | ||
101 | chrp_cmos_clock_write(tm.tm_mon,RTC_MONTH); | ||
102 | chrp_cmos_clock_write(tm.tm_mday,RTC_DAY_OF_MONTH); | ||
103 | chrp_cmos_clock_write(tm.tm_year,RTC_YEAR); | ||
104 | |||
105 | /* The following flags have to be released exactly in this order, | ||
106 | * otherwise the DS12887 (popular MC146818A clone with integrated | ||
107 | * battery and quartz) will not reset the oscillator and will not | ||
108 | * update precisely 500 ms later. You won't find this mentioned in | ||
109 | * the Dallas Semiconductor data sheets, but who believes data | ||
110 | * sheets anyway ... -- Markus Kuhn | ||
111 | */ | ||
112 | chrp_cmos_clock_write(save_control, RTC_CONTROL); | ||
113 | chrp_cmos_clock_write(save_freq_select, RTC_FREQ_SELECT); | ||
114 | |||
115 | spin_unlock(&rtc_lock); | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | unsigned long chrp_get_rtc_time(void) | ||
120 | { | ||
121 | unsigned int year, mon, day, hour, min, sec; | ||
122 | |||
123 | do { | ||
124 | sec = chrp_cmos_clock_read(RTC_SECONDS); | ||
125 | min = chrp_cmos_clock_read(RTC_MINUTES); | ||
126 | hour = chrp_cmos_clock_read(RTC_HOURS); | ||
127 | day = chrp_cmos_clock_read(RTC_DAY_OF_MONTH); | ||
128 | mon = chrp_cmos_clock_read(RTC_MONTH); | ||
129 | year = chrp_cmos_clock_read(RTC_YEAR); | ||
130 | } while (sec != chrp_cmos_clock_read(RTC_SECONDS)); | ||
131 | |||
132 | if (!(chrp_cmos_clock_read(RTC_CONTROL) & RTC_DM_BINARY) | ||
133 | || RTC_ALWAYS_BCD) { | ||
134 | BCD_TO_BIN(sec); | ||
135 | BCD_TO_BIN(min); | ||
136 | BCD_TO_BIN(hour); | ||
137 | BCD_TO_BIN(day); | ||
138 | BCD_TO_BIN(mon); | ||
139 | BCD_TO_BIN(year); | ||
140 | } | ||
141 | |||
142 | year += 1900; | ||
143 | if (year < 1970) | ||
144 | year += 100; | ||
145 | return mktime(year, mon, day, hour, min, sec); | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | * Calibrate the decrementer frequency with the VIA timer 1. | ||
150 | */ | ||
151 | #define VIA_TIMER_FREQ_6 4700000 /* time 1 frequency * 6 */ | ||
152 | |||
153 | /* VIA registers */ | ||
154 | #define RS 0x200 /* skip between registers */ | ||
155 | #define T1CL (4*RS) /* Timer 1 ctr/latch (low 8 bits) */ | ||
156 | #define T1CH (5*RS) /* Timer 1 counter (high 8 bits) */ | ||
157 | #define T1LL (6*RS) /* Timer 1 latch (low 8 bits) */ | ||
158 | #define T1LH (7*RS) /* Timer 1 latch (high 8 bits) */ | ||
159 | #define ACR (11*RS) /* Auxiliary control register */ | ||
160 | #define IFR (13*RS) /* Interrupt flag register */ | ||
161 | |||
162 | /* Bits in ACR */ | ||
163 | #define T1MODE 0xc0 /* Timer 1 mode */ | ||
164 | #define T1MODE_CONT 0x40 /* continuous interrupts */ | ||
165 | |||
166 | /* Bits in IFR and IER */ | ||
167 | #define T1_INT 0x40 /* Timer 1 interrupt */ | ||
168 | |||
169 | static int __init chrp_via_calibrate_decr(void) | ||
170 | { | ||
171 | struct device_node *vias; | ||
172 | volatile unsigned char __iomem *via; | ||
173 | int count = VIA_TIMER_FREQ_6 / 100; | ||
174 | unsigned int dstart, dend; | ||
175 | |||
176 | vias = find_devices("via-cuda"); | ||
177 | if (vias == 0) | ||
178 | vias = find_devices("via"); | ||
179 | if (vias == 0 || vias->n_addrs == 0) | ||
180 | return 0; | ||
181 | via = ioremap(vias->addrs[0].address, vias->addrs[0].size); | ||
182 | |||
183 | /* set timer 1 for continuous interrupts */ | ||
184 | out_8(&via[ACR], (via[ACR] & ~T1MODE) | T1MODE_CONT); | ||
185 | /* set the counter to a small value */ | ||
186 | out_8(&via[T1CH], 2); | ||
187 | /* set the latch to `count' */ | ||
188 | out_8(&via[T1LL], count); | ||
189 | out_8(&via[T1LH], count >> 8); | ||
190 | /* wait until it hits 0 */ | ||
191 | while ((in_8(&via[IFR]) & T1_INT) == 0) | ||
192 | ; | ||
193 | dstart = get_dec(); | ||
194 | /* clear the interrupt & wait until it hits 0 again */ | ||
195 | in_8(&via[T1CL]); | ||
196 | while ((in_8(&via[IFR]) & T1_INT) == 0) | ||
197 | ; | ||
198 | dend = get_dec(); | ||
199 | |||
200 | tb_ticks_per_jiffy = (dstart - dend) / ((6 * HZ)/100); | ||
201 | tb_to_us = mulhwu_scale_factor(dstart - dend, 60000); | ||
202 | |||
203 | printk(KERN_INFO "via_calibrate_decr: ticks per jiffy = %u (%u ticks)\n", | ||
204 | tb_ticks_per_jiffy, dstart - dend); | ||
205 | |||
206 | iounmap(via); | ||
207 | |||
208 | return 1; | ||
209 | } | ||
210 | |||
211 | void __init chrp_calibrate_decr(void) | ||
212 | { | ||
213 | struct device_node *cpu; | ||
214 | unsigned int freq, *fp; | ||
215 | |||
216 | if (chrp_via_calibrate_decr()) | ||
217 | return; | ||
218 | |||
219 | /* | ||
220 | * The cpu node should have a timebase-frequency property | ||
221 | * to tell us the rate at which the decrementer counts. | ||
222 | */ | ||
223 | freq = 16666000; /* hardcoded default */ | ||
224 | cpu = find_type_devices("cpu"); | ||
225 | if (cpu != 0) { | ||
226 | fp = (unsigned int *) | ||
227 | get_property(cpu, "timebase-frequency", NULL); | ||
228 | if (fp != 0) | ||
229 | freq = *fp; | ||
230 | } | ||
231 | printk("time_init: decrementer frequency = %u.%.6u MHz\n", | ||
232 | freq/1000000, freq%1000000); | ||
233 | tb_ticks_per_jiffy = freq / HZ; | ||
234 | tb_to_us = mulhwu_scale_factor(freq, 1000000); | ||
235 | } | ||
diff --git a/arch/ppc/platforms/lite5200.c b/arch/ppc/platforms/lite5200.c index 5171b53bccb5..fecbe9adc9e0 100644 --- a/arch/ppc/platforms/lite5200.c +++ b/arch/ppc/platforms/lite5200.c | |||
@@ -34,8 +34,7 @@ | |||
34 | #include <asm/mpc52xx.h> | 34 | #include <asm/mpc52xx.h> |
35 | #include <asm/ppc_sys.h> | 35 | #include <asm/ppc_sys.h> |
36 | #include <asm/machdep.h> | 36 | #include <asm/machdep.h> |
37 | 37 | #include <asm/pci-bridge.h> | |
38 | #include <syslib/mpc52xx_pci.h> | ||
39 | 38 | ||
40 | 39 | ||
41 | extern int powersave_nap; | 40 | extern int powersave_nap; |
@@ -68,44 +67,53 @@ lite5200_show_cpuinfo(struct seq_file *m) | |||
68 | } | 67 | } |
69 | 68 | ||
70 | #ifdef CONFIG_PCI | 69 | #ifdef CONFIG_PCI |
70 | #ifdef CONFIG_LITE5200B | ||
71 | static int | ||
72 | lite5200_map_irq(struct pci_dev *dev, unsigned char idsel, | ||
73 | unsigned char pin) | ||
74 | { | ||
75 | static char pci_irq_table[][4] = | ||
76 | /* | ||
77 | * PCI IDSEL/INTPIN->INTLINE | ||
78 | * A B C D | ||
79 | */ | ||
80 | { | ||
81 | {MPC52xx_IRQ0, MPC52xx_IRQ1, MPC52xx_IRQ2, MPC52xx_IRQ3}, | ||
82 | {MPC52xx_IRQ1, MPC52xx_IRQ2, MPC52xx_IRQ3, MPC52xx_IRQ0}, | ||
83 | }; | ||
84 | |||
85 | const long min_idsel = 24, max_idsel = 25, irqs_per_slot = 4; | ||
86 | return PCI_IRQ_TABLE_LOOKUP; | ||
87 | } | ||
88 | #else /* Original Lite */ | ||
71 | static int | 89 | static int |
72 | lite5200_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) | 90 | lite5200_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) |
73 | { | 91 | { |
74 | return (pin == 1) && (idsel==24) ? MPC52xx_IRQ0 : -1; | 92 | return (pin == 1) && (idsel==24) ? MPC52xx_IRQ0 : -1; |
75 | } | 93 | } |
76 | #endif | 94 | #endif |
95 | #endif | ||
77 | 96 | ||
78 | static void __init | 97 | static void __init |
79 | lite5200_setup_cpu(void) | 98 | lite5200_setup_cpu(void) |
80 | { | 99 | { |
81 | struct mpc52xx_cdm __iomem *cdm; | ||
82 | struct mpc52xx_gpio __iomem *gpio; | 100 | struct mpc52xx_gpio __iomem *gpio; |
83 | struct mpc52xx_intr __iomem *intr; | 101 | struct mpc52xx_intr __iomem *intr; |
84 | struct mpc52xx_xlb __iomem *xlb; | ||
85 | 102 | ||
86 | u32 port_config; | 103 | u32 port_config; |
87 | u32 intr_ctrl; | 104 | u32 intr_ctrl; |
88 | 105 | ||
89 | /* Map zones */ | 106 | /* Map zones */ |
90 | cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE); | ||
91 | gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE); | 107 | gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE); |
92 | xlb = ioremap(MPC52xx_PA(MPC52xx_XLB_OFFSET), MPC52xx_XLB_SIZE); | ||
93 | intr = ioremap(MPC52xx_PA(MPC52xx_INTR_OFFSET), MPC52xx_INTR_SIZE); | 108 | intr = ioremap(MPC52xx_PA(MPC52xx_INTR_OFFSET), MPC52xx_INTR_SIZE); |
94 | 109 | ||
95 | if (!cdm || !gpio || !xlb || !intr) { | 110 | if (!gpio || !intr) { |
96 | printk("lite5200.c: Error while mapping CDM/GPIO/XLB/INTR during" | 111 | printk(KERN_ERR __FILE__ ": " |
97 | "lite5200_setup_cpu\n"); | 112 | "Error while mapping GPIO/INTR during " |
113 | "lite5200_setup_cpu\n"); | ||
98 | goto unmap_regs; | 114 | goto unmap_regs; |
99 | } | 115 | } |
100 | 116 | ||
101 | /* Use internal 48 Mhz */ | ||
102 | out_8(&cdm->ext_48mhz_en, 0x00); | ||
103 | out_8(&cdm->fd_enable, 0x01); | ||
104 | if (in_be32(&cdm->rstcfg) & 0x40) /* Assumes 33Mhz clock */ | ||
105 | out_be16(&cdm->fd_counters, 0x0001); | ||
106 | else | ||
107 | out_be16(&cdm->fd_counters, 0x5555); | ||
108 | |||
109 | /* Get port mux config */ | 117 | /* Get port mux config */ |
110 | port_config = in_be32(&gpio->port_config); | 118 | port_config = in_be32(&gpio->port_config); |
111 | 119 | ||
@@ -116,29 +124,29 @@ lite5200_setup_cpu(void) | |||
116 | port_config &= ~0x00007000; /* Differential mode - USB1 only */ | 124 | port_config &= ~0x00007000; /* Differential mode - USB1 only */ |
117 | port_config |= 0x00001000; | 125 | port_config |= 0x00001000; |
118 | 126 | ||
127 | /* ATA CS is on csb_4/5 */ | ||
128 | port_config &= ~0x03000000; | ||
129 | port_config |= 0x01000000; | ||
130 | |||
119 | /* Commit port config */ | 131 | /* Commit port config */ |
120 | out_be32(&gpio->port_config, port_config); | 132 | out_be32(&gpio->port_config, port_config); |
121 | 133 | ||
122 | /* Configure the XLB Arbiter */ | 134 | /* IRQ[0-3] setup */ |
123 | out_be32(&xlb->master_pri_enable, 0xff); | ||
124 | out_be32(&xlb->master_priority, 0x11111111); | ||
125 | |||
126 | /* Enable ram snooping for 1GB window */ | ||
127 | out_be32(&xlb->config, in_be32(&xlb->config) | MPC52xx_XLB_CFG_SNOOP); | ||
128 | out_be32(&xlb->snoop_window, MPC52xx_PCI_TARGET_MEM | 0x1d); | ||
129 | |||
130 | /* IRQ[0-3] setup : IRQ0 - Level Active Low */ | ||
131 | /* IRQ[1-3] - Level Active High */ | ||
132 | intr_ctrl = in_be32(&intr->ctrl); | 135 | intr_ctrl = in_be32(&intr->ctrl); |
133 | intr_ctrl &= ~0x00ff0000; | 136 | intr_ctrl &= ~0x00ff0000; |
134 | intr_ctrl |= 0x00c00000; | 137 | #ifdef CONFIG_LITE5200B |
138 | /* IRQ[0-3] Level Active Low */ | ||
139 | intr_ctrl |= 0x00ff0000; | ||
140 | #else | ||
141 | /* IRQ0 Level Active Low | ||
142 | * IRQ[1-3] Level Active High */ | ||
143 | intr_ctrl |= 0x00c00000; | ||
144 | #endif | ||
135 | out_be32(&intr->ctrl, intr_ctrl); | 145 | out_be32(&intr->ctrl, intr_ctrl); |
136 | 146 | ||
137 | /* Unmap reg zone */ | 147 | /* Unmap reg zone */ |
138 | unmap_regs: | 148 | unmap_regs: |
139 | if (cdm) iounmap(cdm); | ||
140 | if (gpio) iounmap(gpio); | 149 | if (gpio) iounmap(gpio); |
141 | if (xlb) iounmap(xlb); | ||
142 | if (intr) iounmap(intr); | 150 | if (intr) iounmap(intr); |
143 | } | 151 | } |
144 | 152 | ||
@@ -146,7 +154,8 @@ static void __init | |||
146 | lite5200_setup_arch(void) | 154 | lite5200_setup_arch(void) |
147 | { | 155 | { |
148 | /* CPU & Port mux setup */ | 156 | /* CPU & Port mux setup */ |
149 | lite5200_setup_cpu(); | 157 | mpc52xx_setup_cpu(); /* Generic */ |
158 | lite5200_setup_cpu(); /* Platform specific */ | ||
150 | 159 | ||
151 | #ifdef CONFIG_PCI | 160 | #ifdef CONFIG_PCI |
152 | /* PCI Bridge setup */ | 161 | /* PCI Bridge setup */ |
diff --git a/arch/ppc/platforms/prep_setup.c b/arch/ppc/platforms/prep_setup.c index d95c05d9824d..e86f6156d589 100644 --- a/arch/ppc/platforms/prep_setup.c +++ b/arch/ppc/platforms/prep_setup.c | |||
@@ -1067,15 +1067,13 @@ prep_map_io(void) | |||
1067 | static int __init | 1067 | static int __init |
1068 | prep_request_io(void) | 1068 | prep_request_io(void) |
1069 | { | 1069 | { |
1070 | if (_machine == _MACH_prep) { | ||
1071 | #ifdef CONFIG_NVRAM | 1070 | #ifdef CONFIG_NVRAM |
1072 | request_region(PREP_NVRAM_AS0, 0x8, "nvram"); | 1071 | request_region(PREP_NVRAM_AS0, 0x8, "nvram"); |
1073 | #endif | 1072 | #endif |
1074 | request_region(0x00,0x20,"dma1"); | 1073 | request_region(0x00,0x20,"dma1"); |
1075 | request_region(0x40,0x20,"timer"); | 1074 | request_region(0x40,0x20,"timer"); |
1076 | request_region(0x80,0x10,"dma page reg"); | 1075 | request_region(0x80,0x10,"dma page reg"); |
1077 | request_region(0xc0,0x20,"dma2"); | 1076 | request_region(0xc0,0x20,"dma2"); |
1078 | } | ||
1079 | 1077 | ||
1080 | return 0; | 1078 | return 0; |
1081 | } | 1079 | } |
diff --git a/arch/ppc/syslib/Makefile b/arch/ppc/syslib/Makefile index 5cb62c6a51c8..490749ca88f9 100644 --- a/arch/ppc/syslib/Makefile +++ b/arch/ppc/syslib/Makefile | |||
@@ -38,8 +38,6 @@ endif | |||
38 | obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o $(wdt-mpc8xx-y) \ | 38 | obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o $(wdt-mpc8xx-y) \ |
39 | ppc_sys.o mpc8xx_devices.o mpc8xx_sys.o | 39 | ppc_sys.o mpc8xx_devices.o mpc8xx_sys.o |
40 | obj-$(CONFIG_PCI_QSPAN) += qspan_pci.o | 40 | obj-$(CONFIG_PCI_QSPAN) += qspan_pci.o |
41 | obj-$(CONFIG_PPC_OF) += prom_init.o prom.o | ||
42 | obj-$(CONFIG_PPC_CHRP) += open_pic.o | ||
43 | obj-$(CONFIG_PPC_PREP) += open_pic.o todc_time.o | 41 | obj-$(CONFIG_PPC_PREP) += open_pic.o todc_time.o |
44 | obj-$(CONFIG_BAMBOO) += pci_auto.o todc_time.o | 42 | obj-$(CONFIG_BAMBOO) += pci_auto.o todc_time.o |
45 | obj-$(CONFIG_CPCI690) += todc_time.o pci_auto.o | 43 | obj-$(CONFIG_CPCI690) += todc_time.o pci_auto.o |
diff --git a/arch/ppc/syslib/mpc52xx_pci.c b/arch/ppc/syslib/mpc52xx_pci.c index 9ec525f9fe98..5a5a7a9cd248 100644 --- a/arch/ppc/syslib/mpc52xx_pci.c +++ b/arch/ppc/syslib/mpc52xx_pci.c | |||
@@ -225,7 +225,8 @@ mpc52xx_pci_fixup_resources(struct pci_dev *dev) | |||
225 | /* The PCI Host bridge of MPC52xx has a prefetch memory resource | 225 | /* The PCI Host bridge of MPC52xx has a prefetch memory resource |
226 | fixed to 1Gb. Doesn't fit in the resource system so we remove it */ | 226 | fixed to 1Gb. Doesn't fit in the resource system so we remove it */ |
227 | if ( (dev->vendor == PCI_VENDOR_ID_MOTOROLA) && | 227 | if ( (dev->vendor == PCI_VENDOR_ID_MOTOROLA) && |
228 | (dev->device == PCI_DEVICE_ID_MOTOROLA_MPC5200) ) { | 228 | ( dev->device == PCI_DEVICE_ID_MOTOROLA_MPC5200 |
229 | || dev->device == PCI_DEVICE_ID_MOTOROLA_MPC5200B) ) { | ||
229 | struct resource *res = &dev->resource[1]; | 230 | struct resource *res = &dev->resource[1]; |
230 | res->start = res->end = res->flags = 0; | 231 | res->start = res->end = res->flags = 0; |
231 | } | 232 | } |
diff --git a/arch/ppc/syslib/mpc52xx_setup.c b/arch/ppc/syslib/mpc52xx_setup.c index 2ee48ce0a517..ee6379bb415e 100644 --- a/arch/ppc/syslib/mpc52xx_setup.c +++ b/arch/ppc/syslib/mpc52xx_setup.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
25 | #include <asm/ppcboot.h> | 25 | #include <asm/ppcboot.h> |
26 | 26 | ||
27 | #include <syslib/mpc52xx_pci.h> | ||
28 | |||
27 | extern bd_t __res; | 29 | extern bd_t __res; |
28 | 30 | ||
29 | static int core_mult[] = { /* CPU Frequency multiplier, taken */ | 31 | static int core_mult[] = { /* CPU Frequency multiplier, taken */ |
@@ -216,6 +218,52 @@ mpc52xx_calibrate_decr(void) | |||
216 | tb_to_us = mulhwu_scale_factor(xlbfreq / divisor, 1000000); | 218 | tb_to_us = mulhwu_scale_factor(xlbfreq / divisor, 1000000); |
217 | } | 219 | } |
218 | 220 | ||
221 | |||
222 | void __init | ||
223 | mpc52xx_setup_cpu(void) | ||
224 | { | ||
225 | struct mpc52xx_cdm __iomem *cdm; | ||
226 | struct mpc52xx_xlb __iomem *xlb; | ||
227 | |||
228 | /* Map zones */ | ||
229 | cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE); | ||
230 | xlb = ioremap(MPC52xx_PA(MPC52xx_XLB_OFFSET), MPC52xx_XLB_SIZE); | ||
231 | |||
232 | if (!cdm || !xlb) { | ||
233 | printk(KERN_ERR __FILE__ ": " | ||
234 | "Error while mapping CDM/XLB during " | ||
235 | "mpc52xx_setup_cpu\n"); | ||
236 | goto unmap_regs; | ||
237 | } | ||
238 | |||
239 | /* Use internal 48 Mhz */ | ||
240 | out_8(&cdm->ext_48mhz_en, 0x00); | ||
241 | out_8(&cdm->fd_enable, 0x01); | ||
242 | if (in_be32(&cdm->rstcfg) & 0x40) /* Assumes 33Mhz clock */ | ||
243 | out_be16(&cdm->fd_counters, 0x0001); | ||
244 | else | ||
245 | out_be16(&cdm->fd_counters, 0x5555); | ||
246 | |||
247 | /* Configure the XLB Arbiter priorities */ | ||
248 | out_be32(&xlb->master_pri_enable, 0xff); | ||
249 | out_be32(&xlb->master_priority, 0x11111111); | ||
250 | |||
251 | /* Enable ram snooping for 1GB window */ | ||
252 | out_be32(&xlb->config, in_be32(&xlb->config) | MPC52xx_XLB_CFG_SNOOP); | ||
253 | out_be32(&xlb->snoop_window, MPC52xx_PCI_TARGET_MEM | 0x1d); | ||
254 | |||
255 | /* Disable XLB pipelining */ | ||
256 | /* (cfr errate 292. We could do this only just before ATA PIO | ||
257 | transaction and re-enable it after ...) */ | ||
258 | out_be32(&xlb->config, in_be32(&xlb->config) | MPC52xx_XLB_CFG_PLDIS); | ||
259 | |||
260 | /* Unmap reg zone */ | ||
261 | unmap_regs: | ||
262 | if (cdm) iounmap(cdm); | ||
263 | if (xlb) iounmap(xlb); | ||
264 | } | ||
265 | |||
266 | |||
219 | int mpc52xx_match_psc_function(int psc_idx, const char *func) | 267 | int mpc52xx_match_psc_function(int psc_idx, const char *func) |
220 | { | 268 | { |
221 | struct mpc52xx_psc_func *cf = mpc52xx_psc_functions; | 269 | struct mpc52xx_psc_func *cf = mpc52xx_psc_functions; |
diff --git a/arch/ppc/syslib/open_pic.c b/arch/ppc/syslib/open_pic.c index 38e5b93fbe41..70456c8f998c 100644 --- a/arch/ppc/syslib/open_pic.c +++ b/arch/ppc/syslib/open_pic.c | |||
@@ -216,7 +216,7 @@ static void openpic_safe_writefield(volatile u_int __iomem *addr, u_int mask, | |||
216 | u_int openpic_read_IPI(volatile u_int __iomem * addr) | 216 | u_int openpic_read_IPI(volatile u_int __iomem * addr) |
217 | { | 217 | { |
218 | u_int val = 0; | 218 | u_int val = 0; |
219 | #if defined(OPENPIC_BIG_ENDIAN) || defined(CONFIG_POWER3) | 219 | #if defined(OPENPIC_BIG_ENDIAN) |
220 | val = in_be32(addr); | 220 | val = in_be32(addr); |
221 | #else | 221 | #else |
222 | val = in_le32(addr); | 222 | val = in_le32(addr); |
diff --git a/arch/ppc/syslib/prom.c b/arch/ppc/syslib/prom.c deleted file mode 100644 index 482f837fd373..000000000000 --- a/arch/ppc/syslib/prom.c +++ /dev/null | |||
@@ -1,1429 +0,0 @@ | |||
1 | /* | ||
2 | * Procedures for interfacing to the Open Firmware PROM on | ||
3 | * Power Macintosh computers. | ||
4 | * | ||
5 | * In particular, we are interested in the device tree | ||
6 | * and in using some of its services (exit, write to stdout). | ||
7 | * | ||
8 | * Paul Mackerras August 1996. | ||
9 | * Copyright (C) 1996 Paul Mackerras. | ||
10 | */ | ||
11 | #include <stdarg.h> | ||
12 | #include <linux/config.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/string.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/threads.h> | ||
17 | #include <linux/spinlock.h> | ||
18 | #include <linux/ioport.h> | ||
19 | #include <linux/pci.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/bitops.h> | ||
22 | |||
23 | #include <asm/sections.h> | ||
24 | #include <asm/prom.h> | ||
25 | #include <asm/page.h> | ||
26 | #include <asm/processor.h> | ||
27 | #include <asm/irq.h> | ||
28 | #include <asm/io.h> | ||
29 | #include <asm/smp.h> | ||
30 | #include <asm/bootx.h> | ||
31 | #include <asm/system.h> | ||
32 | #include <asm/mmu.h> | ||
33 | #include <asm/pgtable.h> | ||
34 | #include <asm/bootinfo.h> | ||
35 | #include <asm/btext.h> | ||
36 | #include <asm/pci-bridge.h> | ||
37 | #include <asm/open_pic.h> | ||
38 | |||
39 | |||
40 | struct pci_address { | ||
41 | unsigned a_hi; | ||
42 | unsigned a_mid; | ||
43 | unsigned a_lo; | ||
44 | }; | ||
45 | |||
46 | struct pci_reg_property { | ||
47 | struct pci_address addr; | ||
48 | unsigned size_hi; | ||
49 | unsigned size_lo; | ||
50 | }; | ||
51 | |||
52 | struct isa_reg_property { | ||
53 | unsigned space; | ||
54 | unsigned address; | ||
55 | unsigned size; | ||
56 | }; | ||
57 | |||
58 | typedef unsigned long interpret_func(struct device_node *, unsigned long, | ||
59 | int, int); | ||
60 | static interpret_func interpret_pci_props; | ||
61 | static interpret_func interpret_dbdma_props; | ||
62 | static interpret_func interpret_isa_props; | ||
63 | static interpret_func interpret_macio_props; | ||
64 | static interpret_func interpret_root_props; | ||
65 | |||
66 | extern char *klimit; | ||
67 | |||
68 | /* Set for a newworld or CHRP machine */ | ||
69 | int use_of_interrupt_tree; | ||
70 | struct device_node *dflt_interrupt_controller; | ||
71 | int num_interrupt_controllers; | ||
72 | |||
73 | extern unsigned int rtas_entry; /* physical pointer */ | ||
74 | |||
75 | extern struct device_node *allnodes; | ||
76 | |||
77 | static unsigned long finish_node(struct device_node *, unsigned long, | ||
78 | interpret_func *, int, int); | ||
79 | static unsigned long finish_node_interrupts(struct device_node *, unsigned long); | ||
80 | static struct device_node *find_phandle(phandle); | ||
81 | |||
82 | extern void enter_rtas(void *); | ||
83 | void phys_call_rtas(int, int, int, ...); | ||
84 | |||
85 | extern char cmd_line[512]; /* XXX */ | ||
86 | extern boot_infos_t *boot_infos; | ||
87 | unsigned long dev_tree_size; | ||
88 | |||
89 | void | ||
90 | phys_call_rtas(int service, int nargs, int nret, ...) | ||
91 | { | ||
92 | va_list list; | ||
93 | union { | ||
94 | unsigned long words[16]; | ||
95 | double align; | ||
96 | } u; | ||
97 | void (*rtas)(void *, unsigned long); | ||
98 | int i; | ||
99 | |||
100 | u.words[0] = service; | ||
101 | u.words[1] = nargs; | ||
102 | u.words[2] = nret; | ||
103 | va_start(list, nret); | ||
104 | for (i = 0; i < nargs; ++i) | ||
105 | u.words[i+3] = va_arg(list, unsigned long); | ||
106 | va_end(list); | ||
107 | |||
108 | rtas = (void (*)(void *, unsigned long)) rtas_entry; | ||
109 | rtas(&u, rtas_data); | ||
110 | } | ||
111 | |||
112 | /* | ||
113 | * finish_device_tree is called once things are running normally | ||
114 | * (i.e. with text and data mapped to the address they were linked at). | ||
115 | * It traverses the device tree and fills in the name, type, | ||
116 | * {n_}addrs and {n_}intrs fields of each node. | ||
117 | */ | ||
118 | void __init | ||
119 | finish_device_tree(void) | ||
120 | { | ||
121 | unsigned long mem = (unsigned long) klimit; | ||
122 | struct device_node *np; | ||
123 | |||
124 | /* All CHRPs now use the interrupt tree */ | ||
125 | for (np = allnodes; np != NULL; np = np->allnext) { | ||
126 | if (get_property(np, "interrupt-parent", NULL)) { | ||
127 | use_of_interrupt_tree = 1; | ||
128 | break; | ||
129 | } | ||
130 | } | ||
131 | |||
132 | if (use_of_interrupt_tree) { | ||
133 | /* | ||
134 | * We want to find out here how many interrupt-controller | ||
135 | * nodes there are, and if we are booted from BootX, | ||
136 | * we need a pointer to the first (and hopefully only) | ||
137 | * such node. But we can't use find_devices here since | ||
138 | * np->name has not been set yet. -- paulus | ||
139 | */ | ||
140 | int n = 0; | ||
141 | char *name, *ic; | ||
142 | int iclen; | ||
143 | |||
144 | for (np = allnodes; np != NULL; np = np->allnext) { | ||
145 | ic = get_property(np, "interrupt-controller", &iclen); | ||
146 | name = get_property(np, "name", NULL); | ||
147 | /* checking iclen makes sure we don't get a false | ||
148 | match on /chosen.interrupt_controller */ | ||
149 | if ((name != NULL | ||
150 | && strcmp(name, "interrupt-controller") == 0) | ||
151 | || (ic != NULL && iclen == 0 && strcmp(name, "AppleKiwi"))) { | ||
152 | if (n == 0) | ||
153 | dflt_interrupt_controller = np; | ||
154 | ++n; | ||
155 | } | ||
156 | } | ||
157 | num_interrupt_controllers = n; | ||
158 | } | ||
159 | |||
160 | mem = finish_node(allnodes, mem, NULL, 1, 1); | ||
161 | dev_tree_size = mem - (unsigned long) allnodes; | ||
162 | klimit = (char *) mem; | ||
163 | } | ||
164 | |||
165 | static unsigned long __init | ||
166 | finish_node(struct device_node *np, unsigned long mem_start, | ||
167 | interpret_func *ifunc, int naddrc, int nsizec) | ||
168 | { | ||
169 | struct device_node *child; | ||
170 | int *ip; | ||
171 | |||
172 | np->name = get_property(np, "name", NULL); | ||
173 | np->type = get_property(np, "device_type", NULL); | ||
174 | |||
175 | if (!np->name) | ||
176 | np->name = "<NULL>"; | ||
177 | if (!np->type) | ||
178 | np->type = "<NULL>"; | ||
179 | |||
180 | /* get the device addresses and interrupts */ | ||
181 | if (ifunc != NULL) | ||
182 | mem_start = ifunc(np, mem_start, naddrc, nsizec); | ||
183 | |||
184 | if (use_of_interrupt_tree) | ||
185 | mem_start = finish_node_interrupts(np, mem_start); | ||
186 | |||
187 | /* Look for #address-cells and #size-cells properties. */ | ||
188 | ip = (int *) get_property(np, "#address-cells", NULL); | ||
189 | if (ip != NULL) | ||
190 | naddrc = *ip; | ||
191 | ip = (int *) get_property(np, "#size-cells", NULL); | ||
192 | if (ip != NULL) | ||
193 | nsizec = *ip; | ||
194 | |||
195 | if (np->parent == NULL) | ||
196 | ifunc = interpret_root_props; | ||
197 | else if (np->type == 0) | ||
198 | ifunc = NULL; | ||
199 | else if (!strcmp(np->type, "pci") || !strcmp(np->type, "vci")) | ||
200 | ifunc = interpret_pci_props; | ||
201 | else if (!strcmp(np->type, "dbdma")) | ||
202 | ifunc = interpret_dbdma_props; | ||
203 | else if (!strcmp(np->type, "mac-io") | ||
204 | || ifunc == interpret_macio_props) | ||
205 | ifunc = interpret_macio_props; | ||
206 | else if (!strcmp(np->type, "isa")) | ||
207 | ifunc = interpret_isa_props; | ||
208 | else if (!strcmp(np->name, "uni-n") || !strcmp(np->name, "u3")) | ||
209 | ifunc = interpret_root_props; | ||
210 | else if (!((ifunc == interpret_dbdma_props | ||
211 | || ifunc == interpret_macio_props) | ||
212 | && (!strcmp(np->type, "escc") | ||
213 | || !strcmp(np->type, "media-bay")))) | ||
214 | ifunc = NULL; | ||
215 | |||
216 | /* if we were booted from BootX, convert the full name */ | ||
217 | if (boot_infos | ||
218 | && strncmp(np->full_name, "Devices:device-tree", 19) == 0) { | ||
219 | if (np->full_name[19] == 0) { | ||
220 | strcpy(np->full_name, "/"); | ||
221 | } else if (np->full_name[19] == ':') { | ||
222 | char *p = np->full_name + 19; | ||
223 | np->full_name = p; | ||
224 | for (; *p; ++p) | ||
225 | if (*p == ':') | ||
226 | *p = '/'; | ||
227 | } | ||
228 | } | ||
229 | |||
230 | for (child = np->child; child != NULL; child = child->sibling) | ||
231 | mem_start = finish_node(child, mem_start, ifunc, | ||
232 | naddrc, nsizec); | ||
233 | |||
234 | return mem_start; | ||
235 | } | ||
236 | |||
237 | /* | ||
238 | * Find the interrupt parent of a node. | ||
239 | */ | ||
240 | static struct device_node * __init | ||
241 | intr_parent(struct device_node *p) | ||
242 | { | ||
243 | phandle *parp; | ||
244 | |||
245 | parp = (phandle *) get_property(p, "interrupt-parent", NULL); | ||
246 | if (parp == NULL) | ||
247 | return p->parent; | ||
248 | p = find_phandle(*parp); | ||
249 | if (p != NULL) | ||
250 | return p; | ||
251 | /* | ||
252 | * On a powermac booted with BootX, we don't get to know the | ||
253 | * phandles for any nodes, so find_phandle will return NULL. | ||
254 | * Fortunately these machines only have one interrupt controller | ||
255 | * so there isn't in fact any ambiguity. -- paulus | ||
256 | */ | ||
257 | if (num_interrupt_controllers == 1) | ||
258 | p = dflt_interrupt_controller; | ||
259 | return p; | ||
260 | } | ||
261 | |||
262 | /* | ||
263 | * Find out the size of each entry of the interrupts property | ||
264 | * for a node. | ||
265 | */ | ||
266 | static int __init | ||
267 | prom_n_intr_cells(struct device_node *np) | ||
268 | { | ||
269 | struct device_node *p; | ||
270 | unsigned int *icp; | ||
271 | |||
272 | for (p = np; (p = intr_parent(p)) != NULL; ) { | ||
273 | icp = (unsigned int *) | ||
274 | get_property(p, "#interrupt-cells", NULL); | ||
275 | if (icp != NULL) | ||
276 | return *icp; | ||
277 | if (get_property(p, "interrupt-controller", NULL) != NULL | ||
278 | || get_property(p, "interrupt-map", NULL) != NULL) { | ||
279 | printk("oops, node %s doesn't have #interrupt-cells\n", | ||
280 | p->full_name); | ||
281 | return 1; | ||
282 | } | ||
283 | } | ||
284 | printk("prom_n_intr_cells failed for %s\n", np->full_name); | ||
285 | return 1; | ||
286 | } | ||
287 | |||
288 | /* | ||
289 | * Map an interrupt from a device up to the platform interrupt | ||
290 | * descriptor. | ||
291 | */ | ||
292 | static int __init | ||
293 | map_interrupt(unsigned int **irq, struct device_node **ictrler, | ||
294 | struct device_node *np, unsigned int *ints, int nintrc) | ||
295 | { | ||
296 | struct device_node *p, *ipar; | ||
297 | unsigned int *imap, *imask, *ip; | ||
298 | int i, imaplen, match; | ||
299 | int newintrc = 1, newaddrc = 1; | ||
300 | unsigned int *reg; | ||
301 | int naddrc; | ||
302 | |||
303 | reg = (unsigned int *) get_property(np, "reg", NULL); | ||
304 | naddrc = prom_n_addr_cells(np); | ||
305 | p = intr_parent(np); | ||
306 | while (p != NULL) { | ||
307 | if (get_property(p, "interrupt-controller", NULL) != NULL) | ||
308 | /* this node is an interrupt controller, stop here */ | ||
309 | break; | ||
310 | imap = (unsigned int *) | ||
311 | get_property(p, "interrupt-map", &imaplen); | ||
312 | if (imap == NULL) { | ||
313 | p = intr_parent(p); | ||
314 | continue; | ||
315 | } | ||
316 | imask = (unsigned int *) | ||
317 | get_property(p, "interrupt-map-mask", NULL); | ||
318 | if (imask == NULL) { | ||
319 | printk("oops, %s has interrupt-map but no mask\n", | ||
320 | p->full_name); | ||
321 | return 0; | ||
322 | } | ||
323 | imaplen /= sizeof(unsigned int); | ||
324 | match = 0; | ||
325 | ipar = NULL; | ||
326 | while (imaplen > 0 && !match) { | ||
327 | /* check the child-interrupt field */ | ||
328 | match = 1; | ||
329 | for (i = 0; i < naddrc && match; ++i) | ||
330 | match = ((reg[i] ^ imap[i]) & imask[i]) == 0; | ||
331 | for (; i < naddrc + nintrc && match; ++i) | ||
332 | match = ((ints[i-naddrc] ^ imap[i]) & imask[i]) == 0; | ||
333 | imap += naddrc + nintrc; | ||
334 | imaplen -= naddrc + nintrc; | ||
335 | /* grab the interrupt parent */ | ||
336 | ipar = find_phandle((phandle) *imap++); | ||
337 | --imaplen; | ||
338 | if (ipar == NULL && num_interrupt_controllers == 1) | ||
339 | /* cope with BootX not giving us phandles */ | ||
340 | ipar = dflt_interrupt_controller; | ||
341 | if (ipar == NULL) { | ||
342 | printk("oops, no int parent %x in map of %s\n", | ||
343 | imap[-1], p->full_name); | ||
344 | return 0; | ||
345 | } | ||
346 | /* find the parent's # addr and intr cells */ | ||
347 | ip = (unsigned int *) | ||
348 | get_property(ipar, "#interrupt-cells", NULL); | ||
349 | if (ip == NULL) { | ||
350 | printk("oops, no #interrupt-cells on %s\n", | ||
351 | ipar->full_name); | ||
352 | return 0; | ||
353 | } | ||
354 | newintrc = *ip; | ||
355 | ip = (unsigned int *) | ||
356 | get_property(ipar, "#address-cells", NULL); | ||
357 | newaddrc = (ip == NULL)? 0: *ip; | ||
358 | imap += newaddrc + newintrc; | ||
359 | imaplen -= newaddrc + newintrc; | ||
360 | } | ||
361 | if (imaplen < 0) { | ||
362 | printk("oops, error decoding int-map on %s, len=%d\n", | ||
363 | p->full_name, imaplen); | ||
364 | return 0; | ||
365 | } | ||
366 | if (!match) { | ||
367 | printk("oops, no match in %s int-map for %s\n", | ||
368 | p->full_name, np->full_name); | ||
369 | return 0; | ||
370 | } | ||
371 | p = ipar; | ||
372 | naddrc = newaddrc; | ||
373 | nintrc = newintrc; | ||
374 | ints = imap - nintrc; | ||
375 | reg = ints - naddrc; | ||
376 | } | ||
377 | if (p == NULL) | ||
378 | printk("hmmm, int tree for %s doesn't have ctrler\n", | ||
379 | np->full_name); | ||
380 | *irq = ints; | ||
381 | *ictrler = p; | ||
382 | return nintrc; | ||
383 | } | ||
384 | |||
385 | /* | ||
386 | * New version of finish_node_interrupts. | ||
387 | */ | ||
388 | static unsigned long __init | ||
389 | finish_node_interrupts(struct device_node *np, unsigned long mem_start) | ||
390 | { | ||
391 | unsigned int *ints; | ||
392 | int intlen, intrcells; | ||
393 | int i, j, n, offset; | ||
394 | unsigned int *irq; | ||
395 | struct device_node *ic; | ||
396 | |||
397 | ints = (unsigned int *) get_property(np, "interrupts", &intlen); | ||
398 | if (ints == NULL) | ||
399 | return mem_start; | ||
400 | intrcells = prom_n_intr_cells(np); | ||
401 | intlen /= intrcells * sizeof(unsigned int); | ||
402 | np->n_intrs = intlen; | ||
403 | np->intrs = (struct interrupt_info *) mem_start; | ||
404 | mem_start += intlen * sizeof(struct interrupt_info); | ||
405 | |||
406 | for (i = 0; i < intlen; ++i) { | ||
407 | np->intrs[i].line = 0; | ||
408 | np->intrs[i].sense = 1; | ||
409 | n = map_interrupt(&irq, &ic, np, ints, intrcells); | ||
410 | if (n <= 0) | ||
411 | continue; | ||
412 | offset = 0; | ||
413 | /* | ||
414 | * On a CHRP we have an 8259 which is subordinate to | ||
415 | * the openpic in the interrupt tree, but we want the | ||
416 | * openpic's interrupt numbers offsetted, not the 8259's. | ||
417 | * So we apply the offset if the controller is at the | ||
418 | * root of the interrupt tree, i.e. has no interrupt-parent. | ||
419 | * This doesn't cope with the general case of multiple | ||
420 | * cascaded interrupt controllers, but then neither will | ||
421 | * irq.c at the moment either. -- paulus | ||
422 | * The G5 triggers that code, I add a machine test. On | ||
423 | * those machines, we want to offset interrupts from the | ||
424 | * second openpic by 128 -- BenH | ||
425 | */ | ||
426 | if (num_interrupt_controllers > 1 | ||
427 | && ic != NULL | ||
428 | && get_property(ic, "interrupt-parent", NULL) == NULL) | ||
429 | offset = 16; | ||
430 | |||
431 | np->intrs[i].line = irq[0] + offset; | ||
432 | if (n > 1) | ||
433 | np->intrs[i].sense = irq[1]; | ||
434 | if (n > 2) { | ||
435 | printk("hmmm, got %d intr cells for %s:", n, | ||
436 | np->full_name); | ||
437 | for (j = 0; j < n; ++j) | ||
438 | printk(" %d", irq[j]); | ||
439 | printk("\n"); | ||
440 | } | ||
441 | ints += intrcells; | ||
442 | } | ||
443 | |||
444 | return mem_start; | ||
445 | } | ||
446 | |||
447 | /* | ||
448 | * When BootX makes a copy of the device tree from the MacOS | ||
449 | * Name Registry, it is in the format we use but all of the pointers | ||
450 | * are offsets from the start of the tree. | ||
451 | * This procedure updates the pointers. | ||
452 | */ | ||
453 | void __init | ||
454 | relocate_nodes(void) | ||
455 | { | ||
456 | unsigned long base; | ||
457 | struct device_node *np; | ||
458 | struct property *pp; | ||
459 | |||
460 | #define ADDBASE(x) (x = (typeof (x))((x)? ((unsigned long)(x) + base): 0)) | ||
461 | |||
462 | base = (unsigned long) boot_infos + boot_infos->deviceTreeOffset; | ||
463 | allnodes = (struct device_node *)(base + 4); | ||
464 | for (np = allnodes; np != 0; np = np->allnext) { | ||
465 | ADDBASE(np->full_name); | ||
466 | ADDBASE(np->properties); | ||
467 | ADDBASE(np->parent); | ||
468 | ADDBASE(np->child); | ||
469 | ADDBASE(np->sibling); | ||
470 | ADDBASE(np->allnext); | ||
471 | for (pp = np->properties; pp != 0; pp = pp->next) { | ||
472 | ADDBASE(pp->name); | ||
473 | ADDBASE(pp->value); | ||
474 | ADDBASE(pp->next); | ||
475 | } | ||
476 | } | ||
477 | } | ||
478 | |||
479 | int | ||
480 | prom_n_addr_cells(struct device_node* np) | ||
481 | { | ||
482 | int* ip; | ||
483 | do { | ||
484 | if (np->parent) | ||
485 | np = np->parent; | ||
486 | ip = (int *) get_property(np, "#address-cells", NULL); | ||
487 | if (ip != NULL) | ||
488 | return *ip; | ||
489 | } while (np->parent); | ||
490 | /* No #address-cells property for the root node, default to 1 */ | ||
491 | return 1; | ||
492 | } | ||
493 | |||
494 | int | ||
495 | prom_n_size_cells(struct device_node* np) | ||
496 | { | ||
497 | int* ip; | ||
498 | do { | ||
499 | if (np->parent) | ||
500 | np = np->parent; | ||
501 | ip = (int *) get_property(np, "#size-cells", NULL); | ||
502 | if (ip != NULL) | ||
503 | return *ip; | ||
504 | } while (np->parent); | ||
505 | /* No #size-cells property for the root node, default to 1 */ | ||
506 | return 1; | ||
507 | } | ||
508 | |||
509 | static unsigned long __init | ||
510 | map_addr(struct device_node *np, unsigned long space, unsigned long addr) | ||
511 | { | ||
512 | int na; | ||
513 | unsigned int *ranges; | ||
514 | int rlen = 0; | ||
515 | unsigned int type; | ||
516 | |||
517 | type = (space >> 24) & 3; | ||
518 | if (type == 0) | ||
519 | return addr; | ||
520 | |||
521 | while ((np = np->parent) != NULL) { | ||
522 | if (strcmp(np->type, "pci") != 0) | ||
523 | continue; | ||
524 | /* PCI bridge: map the address through the ranges property */ | ||
525 | na = prom_n_addr_cells(np); | ||
526 | ranges = (unsigned int *) get_property(np, "ranges", &rlen); | ||
527 | while ((rlen -= (na + 5) * sizeof(unsigned int)) >= 0) { | ||
528 | if (((ranges[0] >> 24) & 3) == type | ||
529 | && ranges[2] <= addr | ||
530 | && addr - ranges[2] < ranges[na+4]) { | ||
531 | /* ok, this matches, translate it */ | ||
532 | addr += ranges[na+2] - ranges[2]; | ||
533 | break; | ||
534 | } | ||
535 | ranges += na + 5; | ||
536 | } | ||
537 | } | ||
538 | return addr; | ||
539 | } | ||
540 | |||
541 | static unsigned long __init | ||
542 | interpret_pci_props(struct device_node *np, unsigned long mem_start, | ||
543 | int naddrc, int nsizec) | ||
544 | { | ||
545 | struct address_range *adr; | ||
546 | struct pci_reg_property *pci_addrs; | ||
547 | int i, l, *ip; | ||
548 | |||
549 | pci_addrs = (struct pci_reg_property *) | ||
550 | get_property(np, "assigned-addresses", &l); | ||
551 | if (pci_addrs != 0 && l >= sizeof(struct pci_reg_property)) { | ||
552 | i = 0; | ||
553 | adr = (struct address_range *) mem_start; | ||
554 | while ((l -= sizeof(struct pci_reg_property)) >= 0) { | ||
555 | adr[i].space = pci_addrs[i].addr.a_hi; | ||
556 | adr[i].address = map_addr(np, pci_addrs[i].addr.a_hi, | ||
557 | pci_addrs[i].addr.a_lo); | ||
558 | adr[i].size = pci_addrs[i].size_lo; | ||
559 | ++i; | ||
560 | } | ||
561 | np->addrs = adr; | ||
562 | np->n_addrs = i; | ||
563 | mem_start += i * sizeof(struct address_range); | ||
564 | } | ||
565 | |||
566 | if (use_of_interrupt_tree) | ||
567 | return mem_start; | ||
568 | |||
569 | ip = (int *) get_property(np, "AAPL,interrupts", &l); | ||
570 | if (ip == 0 && np->parent) | ||
571 | ip = (int *) get_property(np->parent, "AAPL,interrupts", &l); | ||
572 | if (ip == 0) | ||
573 | ip = (int *) get_property(np, "interrupts", &l); | ||
574 | if (ip != 0) { | ||
575 | np->intrs = (struct interrupt_info *) mem_start; | ||
576 | np->n_intrs = l / sizeof(int); | ||
577 | mem_start += np->n_intrs * sizeof(struct interrupt_info); | ||
578 | for (i = 0; i < np->n_intrs; ++i) { | ||
579 | np->intrs[i].line = *ip++; | ||
580 | np->intrs[i].sense = 1; | ||
581 | } | ||
582 | } | ||
583 | |||
584 | return mem_start; | ||
585 | } | ||
586 | |||
587 | static unsigned long __init | ||
588 | interpret_dbdma_props(struct device_node *np, unsigned long mem_start, | ||
589 | int naddrc, int nsizec) | ||
590 | { | ||
591 | struct reg_property *rp; | ||
592 | struct address_range *adr; | ||
593 | unsigned long base_address; | ||
594 | int i, l, *ip; | ||
595 | struct device_node *db; | ||
596 | |||
597 | base_address = 0; | ||
598 | for (db = np->parent; db != NULL; db = db->parent) { | ||
599 | if (!strcmp(db->type, "dbdma") && db->n_addrs != 0) { | ||
600 | base_address = db->addrs[0].address; | ||
601 | break; | ||
602 | } | ||
603 | } | ||
604 | |||
605 | rp = (struct reg_property *) get_property(np, "reg", &l); | ||
606 | if (rp != 0 && l >= sizeof(struct reg_property)) { | ||
607 | i = 0; | ||
608 | adr = (struct address_range *) mem_start; | ||
609 | while ((l -= sizeof(struct reg_property)) >= 0) { | ||
610 | adr[i].space = 2; | ||
611 | adr[i].address = rp[i].address + base_address; | ||
612 | adr[i].size = rp[i].size; | ||
613 | ++i; | ||
614 | } | ||
615 | np->addrs = adr; | ||
616 | np->n_addrs = i; | ||
617 | mem_start += i * sizeof(struct address_range); | ||
618 | } | ||
619 | |||
620 | if (use_of_interrupt_tree) | ||
621 | return mem_start; | ||
622 | |||
623 | ip = (int *) get_property(np, "AAPL,interrupts", &l); | ||
624 | if (ip == 0) | ||
625 | ip = (int *) get_property(np, "interrupts", &l); | ||
626 | if (ip != 0) { | ||
627 | np->intrs = (struct interrupt_info *) mem_start; | ||
628 | np->n_intrs = l / sizeof(int); | ||
629 | mem_start += np->n_intrs * sizeof(struct interrupt_info); | ||
630 | for (i = 0; i < np->n_intrs; ++i) { | ||
631 | np->intrs[i].line = *ip++; | ||
632 | np->intrs[i].sense = 1; | ||
633 | } | ||
634 | } | ||
635 | |||
636 | return mem_start; | ||
637 | } | ||
638 | |||
639 | static unsigned long __init | ||
640 | interpret_macio_props(struct device_node *np, unsigned long mem_start, | ||
641 | int naddrc, int nsizec) | ||
642 | { | ||
643 | struct reg_property *rp; | ||
644 | struct address_range *adr; | ||
645 | unsigned long base_address; | ||
646 | int i, l, *ip; | ||
647 | struct device_node *db; | ||
648 | |||
649 | base_address = 0; | ||
650 | for (db = np->parent; db != NULL; db = db->parent) { | ||
651 | if (!strcmp(db->type, "mac-io") && db->n_addrs != 0) { | ||
652 | base_address = db->addrs[0].address; | ||
653 | break; | ||
654 | } | ||
655 | } | ||
656 | |||
657 | rp = (struct reg_property *) get_property(np, "reg", &l); | ||
658 | if (rp != 0 && l >= sizeof(struct reg_property)) { | ||
659 | i = 0; | ||
660 | adr = (struct address_range *) mem_start; | ||
661 | while ((l -= sizeof(struct reg_property)) >= 0) { | ||
662 | adr[i].space = 2; | ||
663 | adr[i].address = rp[i].address + base_address; | ||
664 | adr[i].size = rp[i].size; | ||
665 | ++i; | ||
666 | } | ||
667 | np->addrs = adr; | ||
668 | np->n_addrs = i; | ||
669 | mem_start += i * sizeof(struct address_range); | ||
670 | } | ||
671 | |||
672 | if (use_of_interrupt_tree) | ||
673 | return mem_start; | ||
674 | |||
675 | ip = (int *) get_property(np, "interrupts", &l); | ||
676 | if (ip == 0) | ||
677 | ip = (int *) get_property(np, "AAPL,interrupts", &l); | ||
678 | if (ip != 0) { | ||
679 | np->intrs = (struct interrupt_info *) mem_start; | ||
680 | np->n_intrs = l / sizeof(int); | ||
681 | for (i = 0; i < np->n_intrs; ++i) { | ||
682 | np->intrs[i].line = *ip++; | ||
683 | np->intrs[i].sense = 1; | ||
684 | } | ||
685 | mem_start += np->n_intrs * sizeof(struct interrupt_info); | ||
686 | } | ||
687 | |||
688 | return mem_start; | ||
689 | } | ||
690 | |||
691 | static unsigned long __init | ||
692 | interpret_isa_props(struct device_node *np, unsigned long mem_start, | ||
693 | int naddrc, int nsizec) | ||
694 | { | ||
695 | struct isa_reg_property *rp; | ||
696 | struct address_range *adr; | ||
697 | int i, l, *ip; | ||
698 | |||
699 | rp = (struct isa_reg_property *) get_property(np, "reg", &l); | ||
700 | if (rp != 0 && l >= sizeof(struct isa_reg_property)) { | ||
701 | i = 0; | ||
702 | adr = (struct address_range *) mem_start; | ||
703 | while ((l -= sizeof(struct reg_property)) >= 0) { | ||
704 | adr[i].space = rp[i].space; | ||
705 | adr[i].address = rp[i].address | ||
706 | + (adr[i].space? 0: _ISA_MEM_BASE); | ||
707 | adr[i].size = rp[i].size; | ||
708 | ++i; | ||
709 | } | ||
710 | np->addrs = adr; | ||
711 | np->n_addrs = i; | ||
712 | mem_start += i * sizeof(struct address_range); | ||
713 | } | ||
714 | |||
715 | if (use_of_interrupt_tree) | ||
716 | return mem_start; | ||
717 | |||
718 | ip = (int *) get_property(np, "interrupts", &l); | ||
719 | if (ip != 0) { | ||
720 | np->intrs = (struct interrupt_info *) mem_start; | ||
721 | np->n_intrs = l / (2 * sizeof(int)); | ||
722 | mem_start += np->n_intrs * sizeof(struct interrupt_info); | ||
723 | for (i = 0; i < np->n_intrs; ++i) { | ||
724 | np->intrs[i].line = *ip++; | ||
725 | np->intrs[i].sense = *ip++; | ||
726 | } | ||
727 | } | ||
728 | |||
729 | return mem_start; | ||
730 | } | ||
731 | |||
732 | static unsigned long __init | ||
733 | interpret_root_props(struct device_node *np, unsigned long mem_start, | ||
734 | int naddrc, int nsizec) | ||
735 | { | ||
736 | struct address_range *adr; | ||
737 | int i, l, *ip; | ||
738 | unsigned int *rp; | ||
739 | int rpsize = (naddrc + nsizec) * sizeof(unsigned int); | ||
740 | |||
741 | rp = (unsigned int *) get_property(np, "reg", &l); | ||
742 | if (rp != 0 && l >= rpsize) { | ||
743 | i = 0; | ||
744 | adr = (struct address_range *) mem_start; | ||
745 | while ((l -= rpsize) >= 0) { | ||
746 | adr[i].space = (naddrc >= 2? rp[naddrc-2]: 2); | ||
747 | adr[i].address = rp[naddrc - 1]; | ||
748 | adr[i].size = rp[naddrc + nsizec - 1]; | ||
749 | ++i; | ||
750 | rp += naddrc + nsizec; | ||
751 | } | ||
752 | np->addrs = adr; | ||
753 | np->n_addrs = i; | ||
754 | mem_start += i * sizeof(struct address_range); | ||
755 | } | ||
756 | |||
757 | if (use_of_interrupt_tree) | ||
758 | return mem_start; | ||
759 | |||
760 | ip = (int *) get_property(np, "AAPL,interrupts", &l); | ||
761 | if (ip == 0) | ||
762 | ip = (int *) get_property(np, "interrupts", &l); | ||
763 | if (ip != 0) { | ||
764 | np->intrs = (struct interrupt_info *) mem_start; | ||
765 | np->n_intrs = l / sizeof(int); | ||
766 | mem_start += np->n_intrs * sizeof(struct interrupt_info); | ||
767 | for (i = 0; i < np->n_intrs; ++i) { | ||
768 | np->intrs[i].line = *ip++; | ||
769 | np->intrs[i].sense = 1; | ||
770 | } | ||
771 | } | ||
772 | |||
773 | return mem_start; | ||
774 | } | ||
775 | |||
776 | /* | ||
777 | * Work out the sense (active-low level / active-high edge) | ||
778 | * of each interrupt from the device tree. | ||
779 | */ | ||
780 | void __init | ||
781 | prom_get_irq_senses(unsigned char *senses, int off, int max) | ||
782 | { | ||
783 | struct device_node *np; | ||
784 | int i, j; | ||
785 | |||
786 | /* default to level-triggered */ | ||
787 | memset(senses, 1, max - off); | ||
788 | if (!use_of_interrupt_tree) | ||
789 | return; | ||
790 | |||
791 | for (np = allnodes; np != 0; np = np->allnext) { | ||
792 | for (j = 0; j < np->n_intrs; j++) { | ||
793 | i = np->intrs[j].line; | ||
794 | if (i >= off && i < max) { | ||
795 | if (np->intrs[j].sense == 1) | ||
796 | senses[i-off] = (IRQ_SENSE_LEVEL | ||
797 | | IRQ_POLARITY_NEGATIVE); | ||
798 | else | ||
799 | senses[i-off] = (IRQ_SENSE_EDGE | ||
800 | | IRQ_POLARITY_POSITIVE); | ||
801 | } | ||
802 | } | ||
803 | } | ||
804 | } | ||
805 | |||
806 | /* | ||
807 | * Construct and return a list of the device_nodes with a given name. | ||
808 | */ | ||
809 | struct device_node * | ||
810 | find_devices(const char *name) | ||
811 | { | ||
812 | struct device_node *head, **prevp, *np; | ||
813 | |||
814 | prevp = &head; | ||
815 | for (np = allnodes; np != 0; np = np->allnext) { | ||
816 | if (np->name != 0 && strcasecmp(np->name, name) == 0) { | ||
817 | *prevp = np; | ||
818 | prevp = &np->next; | ||
819 | } | ||
820 | } | ||
821 | *prevp = NULL; | ||
822 | return head; | ||
823 | } | ||
824 | |||
825 | /* | ||
826 | * Construct and return a list of the device_nodes with a given type. | ||
827 | */ | ||
828 | struct device_node * | ||
829 | find_type_devices(const char *type) | ||
830 | { | ||
831 | struct device_node *head, **prevp, *np; | ||
832 | |||
833 | prevp = &head; | ||
834 | for (np = allnodes; np != 0; np = np->allnext) { | ||
835 | if (np->type != 0 && strcasecmp(np->type, type) == 0) { | ||
836 | *prevp = np; | ||
837 | prevp = &np->next; | ||
838 | } | ||
839 | } | ||
840 | *prevp = NULL; | ||
841 | return head; | ||
842 | } | ||
843 | |||
844 | /* | ||
845 | * Returns all nodes linked together | ||
846 | */ | ||
847 | struct device_node * | ||
848 | find_all_nodes(void) | ||
849 | { | ||
850 | struct device_node *head, **prevp, *np; | ||
851 | |||
852 | prevp = &head; | ||
853 | for (np = allnodes; np != 0; np = np->allnext) { | ||
854 | *prevp = np; | ||
855 | prevp = &np->next; | ||
856 | } | ||
857 | *prevp = NULL; | ||
858 | return head; | ||
859 | } | ||
860 | |||
861 | /* Checks if the given "compat" string matches one of the strings in | ||
862 | * the device's "compatible" property | ||
863 | */ | ||
864 | int | ||
865 | device_is_compatible(struct device_node *device, const char *compat) | ||
866 | { | ||
867 | const char* cp; | ||
868 | int cplen, l; | ||
869 | |||
870 | cp = (char *) get_property(device, "compatible", &cplen); | ||
871 | if (cp == NULL) | ||
872 | return 0; | ||
873 | while (cplen > 0) { | ||
874 | if (strncasecmp(cp, compat, strlen(compat)) == 0) | ||
875 | return 1; | ||
876 | l = strlen(cp) + 1; | ||
877 | cp += l; | ||
878 | cplen -= l; | ||
879 | } | ||
880 | |||
881 | return 0; | ||
882 | } | ||
883 | |||
884 | |||
885 | /* | ||
886 | * Indicates whether the root node has a given value in its | ||
887 | * compatible property. | ||
888 | */ | ||
889 | int | ||
890 | machine_is_compatible(const char *compat) | ||
891 | { | ||
892 | struct device_node *root; | ||
893 | |||
894 | root = find_path_device("/"); | ||
895 | if (root == 0) | ||
896 | return 0; | ||
897 | return device_is_compatible(root, compat); | ||
898 | } | ||
899 | |||
900 | /* | ||
901 | * Construct and return a list of the device_nodes with a given type | ||
902 | * and compatible property. | ||
903 | */ | ||
904 | struct device_node * | ||
905 | find_compatible_devices(const char *type, const char *compat) | ||
906 | { | ||
907 | struct device_node *head, **prevp, *np; | ||
908 | |||
909 | prevp = &head; | ||
910 | for (np = allnodes; np != 0; np = np->allnext) { | ||
911 | if (type != NULL | ||
912 | && !(np->type != 0 && strcasecmp(np->type, type) == 0)) | ||
913 | continue; | ||
914 | if (device_is_compatible(np, compat)) { | ||
915 | *prevp = np; | ||
916 | prevp = &np->next; | ||
917 | } | ||
918 | } | ||
919 | *prevp = NULL; | ||
920 | return head; | ||
921 | } | ||
922 | |||
923 | /* | ||
924 | * Find the device_node with a given full_name. | ||
925 | */ | ||
926 | struct device_node * | ||
927 | find_path_device(const char *path) | ||
928 | { | ||
929 | struct device_node *np; | ||
930 | |||
931 | for (np = allnodes; np != 0; np = np->allnext) | ||
932 | if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0) | ||
933 | return np; | ||
934 | return NULL; | ||
935 | } | ||
936 | |||
937 | /******* | ||
938 | * | ||
939 | * New implementation of the OF "find" APIs, return a refcounted | ||
940 | * object, call of_node_put() when done. Currently, still lacks | ||
941 | * locking as old implementation, this is beeing done for ppc64. | ||
942 | * | ||
943 | * Note that property management will need some locking as well, | ||
944 | * this isn't dealt with yet | ||
945 | * | ||
946 | *******/ | ||
947 | |||
948 | /** | ||
949 | * of_find_node_by_name - Find a node by it's "name" property | ||
950 | * @from: The node to start searching from or NULL, the node | ||
951 | * you pass will not be searched, only the next one | ||
952 | * will; typically, you pass what the previous call | ||
953 | * returned. of_node_put() will be called on it | ||
954 | * @name: The name string to match against | ||
955 | * | ||
956 | * Returns a node pointer with refcount incremented, use | ||
957 | * of_node_put() on it when done. | ||
958 | */ | ||
959 | struct device_node *of_find_node_by_name(struct device_node *from, | ||
960 | const char *name) | ||
961 | { | ||
962 | struct device_node *np = from ? from->allnext : allnodes; | ||
963 | |||
964 | for (; np != 0; np = np->allnext) | ||
965 | if (np->name != 0 && strcasecmp(np->name, name) == 0) | ||
966 | break; | ||
967 | if (from) | ||
968 | of_node_put(from); | ||
969 | return of_node_get(np); | ||
970 | } | ||
971 | |||
972 | /** | ||
973 | * of_find_node_by_type - Find a node by it's "device_type" property | ||
974 | * @from: The node to start searching from or NULL, the node | ||
975 | * you pass will not be searched, only the next one | ||
976 | * will; typically, you pass what the previous call | ||
977 | * returned. of_node_put() will be called on it | ||
978 | * @name: The type string to match against | ||
979 | * | ||
980 | * Returns a node pointer with refcount incremented, use | ||
981 | * of_node_put() on it when done. | ||
982 | */ | ||
983 | struct device_node *of_find_node_by_type(struct device_node *from, | ||
984 | const char *type) | ||
985 | { | ||
986 | struct device_node *np = from ? from->allnext : allnodes; | ||
987 | |||
988 | for (; np != 0; np = np->allnext) | ||
989 | if (np->type != 0 && strcasecmp(np->type, type) == 0) | ||
990 | break; | ||
991 | if (from) | ||
992 | of_node_put(from); | ||
993 | return of_node_get(np); | ||
994 | } | ||
995 | |||
996 | /** | ||
997 | * of_find_compatible_node - Find a node based on type and one of the | ||
998 | * tokens in it's "compatible" property | ||
999 | * @from: The node to start searching from or NULL, the node | ||
1000 | * you pass will not be searched, only the next one | ||
1001 | * will; typically, you pass what the previous call | ||
1002 | * returned. of_node_put() will be called on it | ||
1003 | * @type: The type string to match "device_type" or NULL to ignore | ||
1004 | * @compatible: The string to match to one of the tokens in the device | ||
1005 | * "compatible" list. | ||
1006 | * | ||
1007 | * Returns a node pointer with refcount incremented, use | ||
1008 | * of_node_put() on it when done. | ||
1009 | */ | ||
1010 | struct device_node *of_find_compatible_node(struct device_node *from, | ||
1011 | const char *type, const char *compatible) | ||
1012 | { | ||
1013 | struct device_node *np = from ? from->allnext : allnodes; | ||
1014 | |||
1015 | for (; np != 0; np = np->allnext) { | ||
1016 | if (type != NULL | ||
1017 | && !(np->type != 0 && strcasecmp(np->type, type) == 0)) | ||
1018 | continue; | ||
1019 | if (device_is_compatible(np, compatible)) | ||
1020 | break; | ||
1021 | } | ||
1022 | if (from) | ||
1023 | of_node_put(from); | ||
1024 | return of_node_get(np); | ||
1025 | } | ||
1026 | |||
1027 | /** | ||
1028 | * of_find_node_by_path - Find a node matching a full OF path | ||
1029 | * @path: The full path to match | ||
1030 | * | ||
1031 | * Returns a node pointer with refcount incremented, use | ||
1032 | * of_node_put() on it when done. | ||
1033 | */ | ||
1034 | struct device_node *of_find_node_by_path(const char *path) | ||
1035 | { | ||
1036 | struct device_node *np = allnodes; | ||
1037 | |||
1038 | for (; np != 0; np = np->allnext) | ||
1039 | if (np->full_name != 0 && strcasecmp(np->full_name, path) == 0) | ||
1040 | break; | ||
1041 | return of_node_get(np); | ||
1042 | } | ||
1043 | |||
1044 | /** | ||
1045 | * of_find_all_nodes - Get next node in global list | ||
1046 | * @prev: Previous node or NULL to start iteration | ||
1047 | * of_node_put() will be called on it | ||
1048 | * | ||
1049 | * Returns a node pointer with refcount incremented, use | ||
1050 | * of_node_put() on it when done. | ||
1051 | */ | ||
1052 | struct device_node *of_find_all_nodes(struct device_node *prev) | ||
1053 | { | ||
1054 | return of_node_get(prev ? prev->allnext : allnodes); | ||
1055 | } | ||
1056 | |||
1057 | /** | ||
1058 | * of_get_parent - Get a node's parent if any | ||
1059 | * @node: Node to get parent | ||
1060 | * | ||
1061 | * Returns a node pointer with refcount incremented, use | ||
1062 | * of_node_put() on it when done. | ||
1063 | */ | ||
1064 | struct device_node *of_get_parent(const struct device_node *node) | ||
1065 | { | ||
1066 | return node ? of_node_get(node->parent) : NULL; | ||
1067 | } | ||
1068 | |||
1069 | /** | ||
1070 | * of_get_next_child - Iterate a node childs | ||
1071 | * @node: parent node | ||
1072 | * @prev: previous child of the parent node, or NULL to get first | ||
1073 | * | ||
1074 | * Returns a node pointer with refcount incremented, use | ||
1075 | * of_node_put() on it when done. | ||
1076 | */ | ||
1077 | struct device_node *of_get_next_child(const struct device_node *node, | ||
1078 | struct device_node *prev) | ||
1079 | { | ||
1080 | struct device_node *next = prev ? prev->sibling : node->child; | ||
1081 | |||
1082 | for (; next != 0; next = next->sibling) | ||
1083 | if (of_node_get(next)) | ||
1084 | break; | ||
1085 | if (prev) | ||
1086 | of_node_put(prev); | ||
1087 | return next; | ||
1088 | } | ||
1089 | |||
1090 | /** | ||
1091 | * of_node_get - Increment refcount of a node | ||
1092 | * @node: Node to inc refcount, NULL is supported to | ||
1093 | * simplify writing of callers | ||
1094 | * | ||
1095 | * Returns the node itself or NULL if gone. Current implementation | ||
1096 | * does nothing as we don't yet do dynamic node allocation on ppc32 | ||
1097 | */ | ||
1098 | struct device_node *of_node_get(struct device_node *node) | ||
1099 | { | ||
1100 | return node; | ||
1101 | } | ||
1102 | |||
1103 | /** | ||
1104 | * of_node_put - Decrement refcount of a node | ||
1105 | * @node: Node to dec refcount, NULL is supported to | ||
1106 | * simplify writing of callers | ||
1107 | * | ||
1108 | * Current implementation does nothing as we don't yet do dynamic node | ||
1109 | * allocation on ppc32 | ||
1110 | */ | ||
1111 | void of_node_put(struct device_node *node) | ||
1112 | { | ||
1113 | } | ||
1114 | |||
1115 | /* | ||
1116 | * Find the device_node with a given phandle. | ||
1117 | */ | ||
1118 | static struct device_node * __init | ||
1119 | find_phandle(phandle ph) | ||
1120 | { | ||
1121 | struct device_node *np; | ||
1122 | |||
1123 | for (np = allnodes; np != 0; np = np->allnext) | ||
1124 | if (np->node == ph) | ||
1125 | return np; | ||
1126 | return NULL; | ||
1127 | } | ||
1128 | |||
1129 | /* | ||
1130 | * Find a property with a given name for a given node | ||
1131 | * and return the value. | ||
1132 | */ | ||
1133 | unsigned char * | ||
1134 | get_property(struct device_node *np, const char *name, int *lenp) | ||
1135 | { | ||
1136 | struct property *pp; | ||
1137 | |||
1138 | for (pp = np->properties; pp != 0; pp = pp->next) | ||
1139 | if (pp->name != NULL && strcmp(pp->name, name) == 0) { | ||
1140 | if (lenp != 0) | ||
1141 | *lenp = pp->length; | ||
1142 | return pp->value; | ||
1143 | } | ||
1144 | return NULL; | ||
1145 | } | ||
1146 | |||
1147 | /* | ||
1148 | * Add a property to a node | ||
1149 | */ | ||
1150 | int | ||
1151 | prom_add_property(struct device_node* np, struct property* prop) | ||
1152 | { | ||
1153 | struct property **next = &np->properties; | ||
1154 | |||
1155 | prop->next = NULL; | ||
1156 | while (*next) | ||
1157 | next = &(*next)->next; | ||
1158 | *next = prop; | ||
1159 | |||
1160 | return 0; | ||
1161 | } | ||
1162 | |||
1163 | /* I quickly hacked that one, check against spec ! */ | ||
1164 | static inline unsigned long | ||
1165 | bus_space_to_resource_flags(unsigned int bus_space) | ||
1166 | { | ||
1167 | u8 space = (bus_space >> 24) & 0xf; | ||
1168 | if (space == 0) | ||
1169 | space = 0x02; | ||
1170 | if (space == 0x02) | ||
1171 | return IORESOURCE_MEM; | ||
1172 | else if (space == 0x01) | ||
1173 | return IORESOURCE_IO; | ||
1174 | else { | ||
1175 | printk(KERN_WARNING "prom.c: bus_space_to_resource_flags(), space: %x\n", | ||
1176 | bus_space); | ||
1177 | return 0; | ||
1178 | } | ||
1179 | } | ||
1180 | |||
1181 | static struct resource* | ||
1182 | find_parent_pci_resource(struct pci_dev* pdev, struct address_range *range) | ||
1183 | { | ||
1184 | unsigned long mask; | ||
1185 | int i; | ||
1186 | |||
1187 | /* Check this one */ | ||
1188 | mask = bus_space_to_resource_flags(range->space); | ||
1189 | for (i=0; i<DEVICE_COUNT_RESOURCE; i++) { | ||
1190 | if ((pdev->resource[i].flags & mask) == mask && | ||
1191 | pdev->resource[i].start <= range->address && | ||
1192 | pdev->resource[i].end > range->address) { | ||
1193 | if ((range->address + range->size - 1) > pdev->resource[i].end) { | ||
1194 | /* Add better message */ | ||
1195 | printk(KERN_WARNING "PCI/OF resource overlap !\n"); | ||
1196 | return NULL; | ||
1197 | } | ||
1198 | break; | ||
1199 | } | ||
1200 | } | ||
1201 | if (i == DEVICE_COUNT_RESOURCE) | ||
1202 | return NULL; | ||
1203 | return &pdev->resource[i]; | ||
1204 | } | ||
1205 | |||
1206 | /* | ||
1207 | * Request an OF device resource. Currently handles child of PCI devices, | ||
1208 | * or other nodes attached to the root node. Ultimately, put some | ||
1209 | * link to resources in the OF node. | ||
1210 | */ | ||
1211 | struct resource* | ||
1212 | request_OF_resource(struct device_node* node, int index, const char* name_postfix) | ||
1213 | { | ||
1214 | struct pci_dev* pcidev; | ||
1215 | u8 pci_bus, pci_devfn; | ||
1216 | unsigned long iomask; | ||
1217 | struct device_node* nd; | ||
1218 | struct resource* parent; | ||
1219 | struct resource *res = NULL; | ||
1220 | int nlen, plen; | ||
1221 | |||
1222 | if (index >= node->n_addrs) | ||
1223 | goto fail; | ||
1224 | |||
1225 | /* Sanity check on bus space */ | ||
1226 | iomask = bus_space_to_resource_flags(node->addrs[index].space); | ||
1227 | if (iomask & IORESOURCE_MEM) | ||
1228 | parent = &iomem_resource; | ||
1229 | else if (iomask & IORESOURCE_IO) | ||
1230 | parent = &ioport_resource; | ||
1231 | else | ||
1232 | goto fail; | ||
1233 | |||
1234 | /* Find a PCI parent if any */ | ||
1235 | nd = node; | ||
1236 | pcidev = NULL; | ||
1237 | while(nd) { | ||
1238 | if (!pci_device_from_OF_node(nd, &pci_bus, &pci_devfn)) | ||
1239 | pcidev = pci_find_slot(pci_bus, pci_devfn); | ||
1240 | if (pcidev) break; | ||
1241 | nd = nd->parent; | ||
1242 | } | ||
1243 | if (pcidev) | ||
1244 | parent = find_parent_pci_resource(pcidev, &node->addrs[index]); | ||
1245 | if (!parent) { | ||
1246 | printk(KERN_WARNING "request_OF_resource(%s), parent not found\n", | ||
1247 | node->name); | ||
1248 | goto fail; | ||
1249 | } | ||
1250 | |||
1251 | res = __request_region(parent, node->addrs[index].address, node->addrs[index].size, NULL); | ||
1252 | if (!res) | ||
1253 | goto fail; | ||
1254 | nlen = strlen(node->name); | ||
1255 | plen = name_postfix ? strlen(name_postfix) : 0; | ||
1256 | res->name = (const char *)kmalloc(nlen+plen+1, GFP_KERNEL); | ||
1257 | if (res->name) { | ||
1258 | strcpy((char *)res->name, node->name); | ||
1259 | if (plen) | ||
1260 | strcpy((char *)res->name+nlen, name_postfix); | ||
1261 | } | ||
1262 | return res; | ||
1263 | fail: | ||
1264 | return NULL; | ||
1265 | } | ||
1266 | |||
1267 | int | ||
1268 | release_OF_resource(struct device_node* node, int index) | ||
1269 | { | ||
1270 | struct pci_dev* pcidev; | ||
1271 | u8 pci_bus, pci_devfn; | ||
1272 | unsigned long iomask, start, end; | ||
1273 | struct device_node* nd; | ||
1274 | struct resource* parent; | ||
1275 | struct resource *res = NULL; | ||
1276 | |||
1277 | if (index >= node->n_addrs) | ||
1278 | return -EINVAL; | ||
1279 | |||
1280 | /* Sanity check on bus space */ | ||
1281 | iomask = bus_space_to_resource_flags(node->addrs[index].space); | ||
1282 | if (iomask & IORESOURCE_MEM) | ||
1283 | parent = &iomem_resource; | ||
1284 | else if (iomask & IORESOURCE_IO) | ||
1285 | parent = &ioport_resource; | ||
1286 | else | ||
1287 | return -EINVAL; | ||
1288 | |||
1289 | /* Find a PCI parent if any */ | ||
1290 | nd = node; | ||
1291 | pcidev = NULL; | ||
1292 | while(nd) { | ||
1293 | if (!pci_device_from_OF_node(nd, &pci_bus, &pci_devfn)) | ||
1294 | pcidev = pci_find_slot(pci_bus, pci_devfn); | ||
1295 | if (pcidev) break; | ||
1296 | nd = nd->parent; | ||
1297 | } | ||
1298 | if (pcidev) | ||
1299 | parent = find_parent_pci_resource(pcidev, &node->addrs[index]); | ||
1300 | if (!parent) { | ||
1301 | printk(KERN_WARNING "release_OF_resource(%s), parent not found\n", | ||
1302 | node->name); | ||
1303 | return -ENODEV; | ||
1304 | } | ||
1305 | |||
1306 | /* Find us in the parent and its childs */ | ||
1307 | res = parent->child; | ||
1308 | start = node->addrs[index].address; | ||
1309 | end = start + node->addrs[index].size - 1; | ||
1310 | while (res) { | ||
1311 | if (res->start == start && res->end == end && | ||
1312 | (res->flags & IORESOURCE_BUSY)) | ||
1313 | break; | ||
1314 | if (res->start <= start && res->end >= end) | ||
1315 | res = res->child; | ||
1316 | else | ||
1317 | res = res->sibling; | ||
1318 | } | ||
1319 | if (!res) | ||
1320 | return -ENODEV; | ||
1321 | |||
1322 | kfree(res->name); | ||
1323 | res->name = NULL; | ||
1324 | release_resource(res); | ||
1325 | kfree(res); | ||
1326 | |||
1327 | return 0; | ||
1328 | } | ||
1329 | |||
1330 | #if 0 | ||
1331 | void | ||
1332 | print_properties(struct device_node *np) | ||
1333 | { | ||
1334 | struct property *pp; | ||
1335 | char *cp; | ||
1336 | int i, n; | ||
1337 | |||
1338 | for (pp = np->properties; pp != 0; pp = pp->next) { | ||
1339 | printk(KERN_INFO "%s", pp->name); | ||
1340 | for (i = strlen(pp->name); i < 16; ++i) | ||
1341 | printk(" "); | ||
1342 | cp = (char *) pp->value; | ||
1343 | for (i = pp->length; i > 0; --i, ++cp) | ||
1344 | if ((i > 1 && (*cp < 0x20 || *cp > 0x7e)) | ||
1345 | || (i == 1 && *cp != 0)) | ||
1346 | break; | ||
1347 | if (i == 0 && pp->length > 1) { | ||
1348 | /* looks like a string */ | ||
1349 | printk(" %s\n", (char *) pp->value); | ||
1350 | } else { | ||
1351 | /* dump it in hex */ | ||
1352 | n = pp->length; | ||
1353 | if (n > 64) | ||
1354 | n = 64; | ||
1355 | if (pp->length % 4 == 0) { | ||
1356 | unsigned int *p = (unsigned int *) pp->value; | ||
1357 | |||
1358 | n /= 4; | ||
1359 | for (i = 0; i < n; ++i) { | ||
1360 | if (i != 0 && (i % 4) == 0) | ||
1361 | printk("\n "); | ||
1362 | printk(" %08x", *p++); | ||
1363 | } | ||
1364 | } else { | ||
1365 | unsigned char *bp = pp->value; | ||
1366 | |||
1367 | for (i = 0; i < n; ++i) { | ||
1368 | if (i != 0 && (i % 16) == 0) | ||
1369 | printk("\n "); | ||
1370 | printk(" %02x", *bp++); | ||
1371 | } | ||
1372 | } | ||
1373 | printk("\n"); | ||
1374 | if (pp->length > 64) | ||
1375 | printk(" ... (length = %d)\n", | ||
1376 | pp->length); | ||
1377 | } | ||
1378 | } | ||
1379 | } | ||
1380 | #endif | ||
1381 | |||
1382 | static DEFINE_SPINLOCK(rtas_lock); | ||
1383 | |||
1384 | /* this can be called after setup -- Cort */ | ||
1385 | int | ||
1386 | call_rtas(const char *service, int nargs, int nret, | ||
1387 | unsigned long *outputs, ...) | ||
1388 | { | ||
1389 | va_list list; | ||
1390 | int i; | ||
1391 | unsigned long s; | ||
1392 | struct device_node *rtas; | ||
1393 | int *tokp; | ||
1394 | union { | ||
1395 | unsigned long words[16]; | ||
1396 | double align; | ||
1397 | } u; | ||
1398 | |||
1399 | rtas = find_devices("rtas"); | ||
1400 | if (rtas == NULL) | ||
1401 | return -1; | ||
1402 | tokp = (int *) get_property(rtas, service, NULL); | ||
1403 | if (tokp == NULL) { | ||
1404 | printk(KERN_ERR "No RTAS service called %s\n", service); | ||
1405 | return -1; | ||
1406 | } | ||
1407 | u.words[0] = *tokp; | ||
1408 | u.words[1] = nargs; | ||
1409 | u.words[2] = nret; | ||
1410 | va_start(list, outputs); | ||
1411 | for (i = 0; i < nargs; ++i) | ||
1412 | u.words[i+3] = va_arg(list, unsigned long); | ||
1413 | va_end(list); | ||
1414 | |||
1415 | /* | ||
1416 | * RTAS doesn't use floating point. | ||
1417 | * Or at least, according to the CHRP spec we enter RTAS | ||
1418 | * with FP disabled, and it doesn't change the FP registers. | ||
1419 | * -- paulus. | ||
1420 | */ | ||
1421 | spin_lock_irqsave(&rtas_lock, s); | ||
1422 | enter_rtas((void *)__pa(&u)); | ||
1423 | spin_unlock_irqrestore(&rtas_lock, s); | ||
1424 | |||
1425 | if (nret > 1 && outputs != NULL) | ||
1426 | for (i = 0; i < nret-1; ++i) | ||
1427 | outputs[i] = u.words[i+nargs+4]; | ||
1428 | return u.words[nargs+3]; | ||
1429 | } | ||
diff --git a/arch/ppc/syslib/prom_init.c b/arch/ppc/syslib/prom_init.c deleted file mode 100644 index df14422ae1c6..000000000000 --- a/arch/ppc/syslib/prom_init.c +++ /dev/null | |||
@@ -1,1011 +0,0 @@ | |||
1 | /* | ||
2 | * Note that prom_init() and anything called from prom_init() | ||
3 | * may be running at an address that is different from the address | ||
4 | * that it was linked at. References to static data items are | ||
5 | * handled by compiling this file with -mrelocatable-lib. | ||
6 | */ | ||
7 | |||
8 | #include <linux/config.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/string.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/threads.h> | ||
13 | #include <linux/spinlock.h> | ||
14 | #include <linux/ioport.h> | ||
15 | #include <linux/pci.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <linux/bitops.h> | ||
18 | |||
19 | #include <asm/sections.h> | ||
20 | #include <asm/prom.h> | ||
21 | #include <asm/page.h> | ||
22 | #include <asm/irq.h> | ||
23 | #include <asm/io.h> | ||
24 | #include <asm/smp.h> | ||
25 | #include <asm/bootx.h> | ||
26 | #include <asm/system.h> | ||
27 | #include <asm/mmu.h> | ||
28 | #include <asm/pgtable.h> | ||
29 | #include <asm/bootinfo.h> | ||
30 | #include <asm/btext.h> | ||
31 | #include <asm/pci-bridge.h> | ||
32 | #include <asm/open_pic.h> | ||
33 | #include <asm/cacheflush.h> | ||
34 | |||
35 | #ifdef CONFIG_LOGO_LINUX_CLUT224 | ||
36 | #include <linux/linux_logo.h> | ||
37 | extern const struct linux_logo logo_linux_clut224; | ||
38 | #endif | ||
39 | |||
40 | /* | ||
41 | * Properties whose value is longer than this get excluded from our | ||
42 | * copy of the device tree. This way we don't waste space storing | ||
43 | * things like "driver,AAPL,MacOS,PowerPC" properties. But this value | ||
44 | * does need to be big enough to ensure that we don't lose things | ||
45 | * like the interrupt-map property on a PCI-PCI bridge. | ||
46 | */ | ||
47 | #define MAX_PROPERTY_LENGTH 4096 | ||
48 | |||
49 | #ifndef FB_MAX /* avoid pulling in all of the fb stuff */ | ||
50 | #define FB_MAX 8 | ||
51 | #endif | ||
52 | |||
53 | #define ALIGNUL(x) (((x) + sizeof(unsigned long)-1) & -sizeof(unsigned long)) | ||
54 | |||
55 | typedef u32 prom_arg_t; | ||
56 | |||
57 | struct prom_args { | ||
58 | const char *service; | ||
59 | int nargs; | ||
60 | int nret; | ||
61 | prom_arg_t args[10]; | ||
62 | }; | ||
63 | |||
64 | struct pci_address { | ||
65 | unsigned a_hi; | ||
66 | unsigned a_mid; | ||
67 | unsigned a_lo; | ||
68 | }; | ||
69 | |||
70 | struct pci_reg_property { | ||
71 | struct pci_address addr; | ||
72 | unsigned size_hi; | ||
73 | unsigned size_lo; | ||
74 | }; | ||
75 | |||
76 | struct pci_range { | ||
77 | struct pci_address addr; | ||
78 | unsigned phys; | ||
79 | unsigned size_hi; | ||
80 | unsigned size_lo; | ||
81 | }; | ||
82 | |||
83 | struct isa_reg_property { | ||
84 | unsigned space; | ||
85 | unsigned address; | ||
86 | unsigned size; | ||
87 | }; | ||
88 | |||
89 | struct pci_intr_map { | ||
90 | struct pci_address addr; | ||
91 | unsigned dunno; | ||
92 | phandle int_ctrler; | ||
93 | unsigned intr; | ||
94 | }; | ||
95 | |||
96 | static void prom_exit(void); | ||
97 | static int call_prom(const char *service, int nargs, int nret, ...); | ||
98 | static int call_prom_ret(const char *service, int nargs, int nret, | ||
99 | prom_arg_t *rets, ...); | ||
100 | static void prom_print_hex(unsigned int v); | ||
101 | static int prom_set_color(ihandle ih, int i, int r, int g, int b); | ||
102 | static int prom_next_node(phandle *nodep); | ||
103 | static unsigned long check_display(unsigned long mem); | ||
104 | static void setup_disp_fake_bi(ihandle dp); | ||
105 | static unsigned long copy_device_tree(unsigned long mem_start, | ||
106 | unsigned long mem_end); | ||
107 | static unsigned long inspect_node(phandle node, struct device_node *dad, | ||
108 | unsigned long mem_start, unsigned long mem_end, | ||
109 | struct device_node ***allnextpp); | ||
110 | static void prom_hold_cpus(unsigned long mem); | ||
111 | static void prom_instantiate_rtas(void); | ||
112 | static void * early_get_property(unsigned long base, unsigned long node, | ||
113 | char *prop); | ||
114 | |||
115 | prom_entry prom __initdata; | ||
116 | ihandle prom_chosen __initdata; | ||
117 | ihandle prom_stdout __initdata; | ||
118 | |||
119 | static char *prom_display_paths[FB_MAX] __initdata; | ||
120 | static phandle prom_display_nodes[FB_MAX] __initdata; | ||
121 | static unsigned int prom_num_displays __initdata; | ||
122 | static ihandle prom_disp_node __initdata; | ||
123 | char *of_stdout_device __initdata; | ||
124 | |||
125 | unsigned int rtas_data; /* physical pointer */ | ||
126 | unsigned int rtas_entry; /* physical pointer */ | ||
127 | unsigned int rtas_size; | ||
128 | unsigned int old_rtas; | ||
129 | |||
130 | boot_infos_t *boot_infos; | ||
131 | char *bootpath; | ||
132 | char *bootdevice; | ||
133 | struct device_node *allnodes; | ||
134 | |||
135 | extern char *klimit; | ||
136 | |||
137 | static void __init | ||
138 | prom_exit(void) | ||
139 | { | ||
140 | struct prom_args args; | ||
141 | |||
142 | args.service = "exit"; | ||
143 | args.nargs = 0; | ||
144 | args.nret = 0; | ||
145 | prom(&args); | ||
146 | for (;;) /* should never get here */ | ||
147 | ; | ||
148 | } | ||
149 | |||
150 | static int __init | ||
151 | call_prom(const char *service, int nargs, int nret, ...) | ||
152 | { | ||
153 | va_list list; | ||
154 | int i; | ||
155 | struct prom_args prom_args; | ||
156 | |||
157 | prom_args.service = service; | ||
158 | prom_args.nargs = nargs; | ||
159 | prom_args.nret = nret; | ||
160 | va_start(list, nret); | ||
161 | for (i = 0; i < nargs; ++i) | ||
162 | prom_args.args[i] = va_arg(list, prom_arg_t); | ||
163 | va_end(list); | ||
164 | for (i = 0; i < nret; ++i) | ||
165 | prom_args.args[i + nargs] = 0; | ||
166 | prom(&prom_args); | ||
167 | return prom_args.args[nargs]; | ||
168 | } | ||
169 | |||
170 | static int __init | ||
171 | call_prom_ret(const char *service, int nargs, int nret, prom_arg_t *rets, ...) | ||
172 | { | ||
173 | va_list list; | ||
174 | int i; | ||
175 | struct prom_args prom_args; | ||
176 | |||
177 | prom_args.service = service; | ||
178 | prom_args.nargs = nargs; | ||
179 | prom_args.nret = nret; | ||
180 | va_start(list, rets); | ||
181 | for (i = 0; i < nargs; ++i) | ||
182 | prom_args.args[i] = va_arg(list, int); | ||
183 | va_end(list); | ||
184 | for (i = 0; i < nret; ++i) | ||
185 | prom_args.args[i + nargs] = 0; | ||
186 | prom(&prom_args); | ||
187 | for (i = 1; i < nret; ++i) | ||
188 | rets[i-1] = prom_args.args[nargs + i]; | ||
189 | return prom_args.args[nargs]; | ||
190 | } | ||
191 | |||
192 | void __init | ||
193 | prom_print(const char *msg) | ||
194 | { | ||
195 | const char *p, *q; | ||
196 | |||
197 | if (prom_stdout == 0) | ||
198 | return; | ||
199 | |||
200 | for (p = msg; *p != 0; p = q) { | ||
201 | for (q = p; *q != 0 && *q != '\n'; ++q) | ||
202 | ; | ||
203 | if (q > p) | ||
204 | call_prom("write", 3, 1, prom_stdout, p, q - p); | ||
205 | if (*q != 0) { | ||
206 | ++q; | ||
207 | call_prom("write", 3, 1, prom_stdout, "\r\n", 2); | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | static void __init | ||
213 | prom_print_hex(unsigned int v) | ||
214 | { | ||
215 | char buf[16]; | ||
216 | int i, c; | ||
217 | |||
218 | for (i = 0; i < 8; ++i) { | ||
219 | c = (v >> ((7-i)*4)) & 0xf; | ||
220 | c += (c >= 10)? ('a' - 10): '0'; | ||
221 | buf[i] = c; | ||
222 | } | ||
223 | buf[i] = ' '; | ||
224 | buf[i+1] = 0; | ||
225 | prom_print(buf); | ||
226 | } | ||
227 | |||
228 | static int __init | ||
229 | prom_set_color(ihandle ih, int i, int r, int g, int b) | ||
230 | { | ||
231 | return call_prom("call-method", 6, 1, "color!", ih, i, b, g, r); | ||
232 | } | ||
233 | |||
234 | static int __init | ||
235 | prom_next_node(phandle *nodep) | ||
236 | { | ||
237 | phandle node; | ||
238 | |||
239 | if ((node = *nodep) != 0 | ||
240 | && (*nodep = call_prom("child", 1, 1, node)) != 0) | ||
241 | return 1; | ||
242 | if ((*nodep = call_prom("peer", 1, 1, node)) != 0) | ||
243 | return 1; | ||
244 | for (;;) { | ||
245 | if ((node = call_prom("parent", 1, 1, node)) == 0) | ||
246 | return 0; | ||
247 | if ((*nodep = call_prom("peer", 1, 1, node)) != 0) | ||
248 | return 1; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | #ifdef CONFIG_POWER4 | ||
253 | /* | ||
254 | * Set up a hash table with a set of entries in it to map the | ||
255 | * first 64MB of RAM. This is used on 64-bit machines since | ||
256 | * some of them don't have BATs. | ||
257 | */ | ||
258 | |||
259 | static inline void make_pte(unsigned long htab, unsigned int hsize, | ||
260 | unsigned int va, unsigned int pa, int mode) | ||
261 | { | ||
262 | unsigned int *pteg; | ||
263 | unsigned int hash, i, vsid; | ||
264 | |||
265 | vsid = ((va >> 28) * 0x111) << 12; | ||
266 | hash = ((va ^ vsid) >> 5) & 0x7fff80; | ||
267 | pteg = (unsigned int *)(htab + (hash & (hsize - 1))); | ||
268 | for (i = 0; i < 8; ++i, pteg += 4) { | ||
269 | if ((pteg[1] & 1) == 0) { | ||
270 | pteg[1] = vsid | ((va >> 16) & 0xf80) | 1; | ||
271 | pteg[3] = pa | mode; | ||
272 | break; | ||
273 | } | ||
274 | } | ||
275 | } | ||
276 | |||
277 | extern unsigned long _SDR1; | ||
278 | extern PTE *Hash; | ||
279 | extern unsigned long Hash_size; | ||
280 | |||
281 | static void __init | ||
282 | prom_alloc_htab(void) | ||
283 | { | ||
284 | unsigned int hsize; | ||
285 | unsigned long htab; | ||
286 | unsigned int addr; | ||
287 | |||
288 | /* | ||
289 | * Because of OF bugs we can't use the "claim" client | ||
290 | * interface to allocate memory for the hash table. | ||
291 | * This code is only used on 64-bit PPCs, and the only | ||
292 | * 64-bit PPCs at the moment are RS/6000s, and their | ||
293 | * OF is based at 0xc00000 (the 12M point), so we just | ||
294 | * arbitrarily use the 0x800000 - 0xc00000 region for the | ||
295 | * hash table. | ||
296 | * -- paulus. | ||
297 | */ | ||
298 | hsize = 4 << 20; /* POWER4 has no BATs */ | ||
299 | htab = (8 << 20); | ||
300 | call_prom("claim", 3, 1, htab, hsize, 0); | ||
301 | Hash = (void *)(htab + KERNELBASE); | ||
302 | Hash_size = hsize; | ||
303 | _SDR1 = htab + __ilog2(hsize) - 18; | ||
304 | |||
305 | /* | ||
306 | * Put in PTEs for the first 64MB of RAM | ||
307 | */ | ||
308 | memset((void *)htab, 0, hsize); | ||
309 | for (addr = 0; addr < 0x4000000; addr += 0x1000) | ||
310 | make_pte(htab, hsize, addr + KERNELBASE, addr, | ||
311 | _PAGE_ACCESSED | _PAGE_COHERENT | PP_RWXX); | ||
312 | #if 0 /* DEBUG stuff mapping the SCC */ | ||
313 | make_pte(htab, hsize, 0x80013000, 0x80013000, | ||
314 | _PAGE_ACCESSED | _PAGE_NO_CACHE | _PAGE_GUARDED | PP_RWXX); | ||
315 | #endif | ||
316 | } | ||
317 | #endif /* CONFIG_POWER4 */ | ||
318 | |||
319 | |||
320 | /* | ||
321 | * If we have a display that we don't know how to drive, | ||
322 | * we will want to try to execute OF's open method for it | ||
323 | * later. However, OF will probably fall over if we do that | ||
324 | * we've taken over the MMU. | ||
325 | * So we check whether we will need to open the display, | ||
326 | * and if so, open it now. | ||
327 | */ | ||
328 | static unsigned long __init | ||
329 | check_display(unsigned long mem) | ||
330 | { | ||
331 | phandle node; | ||
332 | ihandle ih; | ||
333 | int i, j; | ||
334 | char type[16], *path; | ||
335 | static unsigned char default_colors[] = { | ||
336 | 0x00, 0x00, 0x00, | ||
337 | 0x00, 0x00, 0xaa, | ||
338 | 0x00, 0xaa, 0x00, | ||
339 | 0x00, 0xaa, 0xaa, | ||
340 | 0xaa, 0x00, 0x00, | ||
341 | 0xaa, 0x00, 0xaa, | ||
342 | 0xaa, 0xaa, 0x00, | ||
343 | 0xaa, 0xaa, 0xaa, | ||
344 | 0x55, 0x55, 0x55, | ||
345 | 0x55, 0x55, 0xff, | ||
346 | 0x55, 0xff, 0x55, | ||
347 | 0x55, 0xff, 0xff, | ||
348 | 0xff, 0x55, 0x55, | ||
349 | 0xff, 0x55, 0xff, | ||
350 | 0xff, 0xff, 0x55, | ||
351 | 0xff, 0xff, 0xff | ||
352 | }; | ||
353 | const unsigned char *clut; | ||
354 | |||
355 | prom_disp_node = 0; | ||
356 | |||
357 | for (node = 0; prom_next_node(&node); ) { | ||
358 | type[0] = 0; | ||
359 | call_prom("getprop", 4, 1, node, "device_type", | ||
360 | type, sizeof(type)); | ||
361 | if (strcmp(type, "display") != 0) | ||
362 | continue; | ||
363 | /* It seems OF doesn't null-terminate the path :-( */ | ||
364 | path = (char *) mem; | ||
365 | memset(path, 0, 256); | ||
366 | if (call_prom("package-to-path", 3, 1, node, path, 255) < 0) | ||
367 | continue; | ||
368 | |||
369 | /* | ||
370 | * If this display is the device that OF is using for stdout, | ||
371 | * move it to the front of the list. | ||
372 | */ | ||
373 | mem += strlen(path) + 1; | ||
374 | i = prom_num_displays++; | ||
375 | if (of_stdout_device != 0 && i > 0 | ||
376 | && strcmp(of_stdout_device, path) == 0) { | ||
377 | for (; i > 0; --i) { | ||
378 | prom_display_paths[i] | ||
379 | = prom_display_paths[i-1]; | ||
380 | prom_display_nodes[i] | ||
381 | = prom_display_nodes[i-1]; | ||
382 | } | ||
383 | } | ||
384 | prom_display_paths[i] = path; | ||
385 | prom_display_nodes[i] = node; | ||
386 | if (i == 0) | ||
387 | prom_disp_node = node; | ||
388 | if (prom_num_displays >= FB_MAX) | ||
389 | break; | ||
390 | } | ||
391 | |||
392 | for (j=0; j<prom_num_displays; j++) { | ||
393 | path = prom_display_paths[j]; | ||
394 | node = prom_display_nodes[j]; | ||
395 | prom_print("opening display "); | ||
396 | prom_print(path); | ||
397 | ih = call_prom("open", 1, 1, path); | ||
398 | if (ih == 0 || ih == (ihandle) -1) { | ||
399 | prom_print("... failed\n"); | ||
400 | for (i=j+1; i<prom_num_displays; i++) { | ||
401 | prom_display_paths[i-1] = prom_display_paths[i]; | ||
402 | prom_display_nodes[i-1] = prom_display_nodes[i]; | ||
403 | } | ||
404 | if (--prom_num_displays > 0) { | ||
405 | prom_disp_node = prom_display_nodes[j]; | ||
406 | j--; | ||
407 | } else | ||
408 | prom_disp_node = 0; | ||
409 | continue; | ||
410 | } else { | ||
411 | prom_print("... ok\n"); | ||
412 | call_prom("setprop", 4, 1, node, "linux,opened", 0, 0); | ||
413 | |||
414 | /* | ||
415 | * Setup a usable color table when the appropriate | ||
416 | * method is available. | ||
417 | * Should update this to use set-colors. | ||
418 | */ | ||
419 | clut = default_colors; | ||
420 | for (i = 0; i < 32; i++, clut += 3) | ||
421 | if (prom_set_color(ih, i, clut[0], clut[1], | ||
422 | clut[2]) != 0) | ||
423 | break; | ||
424 | |||
425 | #ifdef CONFIG_LOGO_LINUX_CLUT224 | ||
426 | clut = PTRRELOC(logo_linux_clut224.clut); | ||
427 | for (i = 0; i < logo_linux_clut224.clutsize; | ||
428 | i++, clut += 3) | ||
429 | if (prom_set_color(ih, i + 32, clut[0], | ||
430 | clut[1], clut[2]) != 0) | ||
431 | break; | ||
432 | #endif /* CONFIG_LOGO_LINUX_CLUT224 */ | ||
433 | } | ||
434 | } | ||
435 | |||
436 | if (prom_stdout) { | ||
437 | phandle p; | ||
438 | p = call_prom("instance-to-package", 1, 1, prom_stdout); | ||
439 | if (p && p != -1) { | ||
440 | type[0] = 0; | ||
441 | call_prom("getprop", 4, 1, p, "device_type", | ||
442 | type, sizeof(type)); | ||
443 | if (strcmp(type, "display") == 0) | ||
444 | call_prom("setprop", 4, 1, p, "linux,boot-display", | ||
445 | 0, 0); | ||
446 | } | ||
447 | } | ||
448 | |||
449 | return ALIGNUL(mem); | ||
450 | } | ||
451 | |||
452 | /* This function will enable the early boot text when doing OF booting. This | ||
453 | * way, xmon output should work too | ||
454 | */ | ||
455 | static void __init | ||
456 | setup_disp_fake_bi(ihandle dp) | ||
457 | { | ||
458 | #ifdef CONFIG_BOOTX_TEXT | ||
459 | int width = 640, height = 480, depth = 8, pitch; | ||
460 | unsigned address; | ||
461 | struct pci_reg_property addrs[8]; | ||
462 | int i, naddrs; | ||
463 | char name[32]; | ||
464 | char *getprop = "getprop"; | ||
465 | |||
466 | prom_print("Initializing fake screen: "); | ||
467 | |||
468 | memset(name, 0, sizeof(name)); | ||
469 | call_prom(getprop, 4, 1, dp, "name", name, sizeof(name)); | ||
470 | name[sizeof(name)-1] = 0; | ||
471 | prom_print(name); | ||
472 | prom_print("\n"); | ||
473 | call_prom(getprop, 4, 1, dp, "width", &width, sizeof(width)); | ||
474 | call_prom(getprop, 4, 1, dp, "height", &height, sizeof(height)); | ||
475 | call_prom(getprop, 4, 1, dp, "depth", &depth, sizeof(depth)); | ||
476 | pitch = width * ((depth + 7) / 8); | ||
477 | call_prom(getprop, 4, 1, dp, "linebytes", | ||
478 | &pitch, sizeof(pitch)); | ||
479 | if (pitch == 1) | ||
480 | pitch = 0x1000; /* for strange IBM display */ | ||
481 | address = 0; | ||
482 | call_prom(getprop, 4, 1, dp, "address", | ||
483 | &address, sizeof(address)); | ||
484 | if (address == 0) { | ||
485 | /* look for an assigned address with a size of >= 1MB */ | ||
486 | naddrs = call_prom(getprop, 4, 1, dp, "assigned-addresses", | ||
487 | addrs, sizeof(addrs)); | ||
488 | naddrs /= sizeof(struct pci_reg_property); | ||
489 | for (i = 0; i < naddrs; ++i) { | ||
490 | if (addrs[i].size_lo >= (1 << 20)) { | ||
491 | address = addrs[i].addr.a_lo; | ||
492 | /* use the BE aperture if possible */ | ||
493 | if (addrs[i].size_lo >= (16 << 20)) | ||
494 | address += (8 << 20); | ||
495 | break; | ||
496 | } | ||
497 | } | ||
498 | if (address == 0) { | ||
499 | prom_print("Failed to get address\n"); | ||
500 | return; | ||
501 | } | ||
502 | } | ||
503 | /* kludge for valkyrie */ | ||
504 | if (strcmp(name, "valkyrie") == 0) | ||
505 | address += 0x1000; | ||
506 | |||
507 | #ifdef CONFIG_POWER4 | ||
508 | #if CONFIG_TASK_SIZE > 0x80000000 | ||
509 | #error CONFIG_TASK_SIZE cannot be above 0x80000000 with BOOTX_TEXT on G5 | ||
510 | #endif | ||
511 | { | ||
512 | extern boot_infos_t disp_bi; | ||
513 | unsigned long va, pa, i, offset; | ||
514 | va = 0x90000000; | ||
515 | pa = address & 0xfffff000ul; | ||
516 | offset = address & 0x00000fff; | ||
517 | |||
518 | for (i=0; i<0x4000; i++) { | ||
519 | make_pte((unsigned long)Hash - KERNELBASE, Hash_size, va, pa, | ||
520 | _PAGE_ACCESSED | _PAGE_NO_CACHE | | ||
521 | _PAGE_GUARDED | PP_RWXX); | ||
522 | va += 0x1000; | ||
523 | pa += 0x1000; | ||
524 | } | ||
525 | btext_setup_display(width, height, depth, pitch, 0x90000000 | offset); | ||
526 | disp_bi.dispDeviceBase = (u8 *)address; | ||
527 | } | ||
528 | #else /* CONFIG_POWER4 */ | ||
529 | btext_setup_display(width, height, depth, pitch, address); | ||
530 | btext_prepare_BAT(); | ||
531 | #endif /* CONFIG_POWER4 */ | ||
532 | #endif /* CONFIG_BOOTX_TEXT */ | ||
533 | } | ||
534 | |||
535 | /* | ||
536 | * Make a copy of the device tree from the PROM. | ||
537 | */ | ||
538 | static unsigned long __init | ||
539 | copy_device_tree(unsigned long mem_start, unsigned long mem_end) | ||
540 | { | ||
541 | phandle root; | ||
542 | unsigned long new_start; | ||
543 | struct device_node **allnextp; | ||
544 | |||
545 | root = call_prom("peer", 1, 1, (phandle)0); | ||
546 | if (root == (phandle)0) { | ||
547 | prom_print("couldn't get device tree root\n"); | ||
548 | prom_exit(); | ||
549 | } | ||
550 | allnextp = &allnodes; | ||
551 | mem_start = ALIGNUL(mem_start); | ||
552 | new_start = inspect_node(root, NULL, mem_start, mem_end, &allnextp); | ||
553 | *allnextp = NULL; | ||
554 | return new_start; | ||
555 | } | ||
556 | |||
557 | static unsigned long __init | ||
558 | inspect_node(phandle node, struct device_node *dad, | ||
559 | unsigned long mem_start, unsigned long mem_end, | ||
560 | struct device_node ***allnextpp) | ||
561 | { | ||
562 | int l; | ||
563 | phandle child; | ||
564 | struct device_node *np; | ||
565 | struct property *pp, **prev_propp; | ||
566 | char *prev_name, *namep; | ||
567 | unsigned char *valp; | ||
568 | |||
569 | np = (struct device_node *) mem_start; | ||
570 | mem_start += sizeof(struct device_node); | ||
571 | memset(np, 0, sizeof(*np)); | ||
572 | np->node = node; | ||
573 | **allnextpp = PTRUNRELOC(np); | ||
574 | *allnextpp = &np->allnext; | ||
575 | if (dad != 0) { | ||
576 | np->parent = PTRUNRELOC(dad); | ||
577 | /* we temporarily use the `next' field as `last_child'. */ | ||
578 | if (dad->next == 0) | ||
579 | dad->child = PTRUNRELOC(np); | ||
580 | else | ||
581 | dad->next->sibling = PTRUNRELOC(np); | ||
582 | dad->next = np; | ||
583 | } | ||
584 | |||
585 | /* get and store all properties */ | ||
586 | prev_propp = &np->properties; | ||
587 | prev_name = ""; | ||
588 | for (;;) { | ||
589 | pp = (struct property *) mem_start; | ||
590 | namep = (char *) (pp + 1); | ||
591 | pp->name = PTRUNRELOC(namep); | ||
592 | if (call_prom("nextprop", 3, 1, node, prev_name, namep) <= 0) | ||
593 | break; | ||
594 | mem_start = ALIGNUL((unsigned long)namep + strlen(namep) + 1); | ||
595 | prev_name = namep; | ||
596 | valp = (unsigned char *) mem_start; | ||
597 | pp->value = PTRUNRELOC(valp); | ||
598 | pp->length = call_prom("getprop", 4, 1, node, namep, | ||
599 | valp, mem_end - mem_start); | ||
600 | if (pp->length < 0) | ||
601 | continue; | ||
602 | #ifdef MAX_PROPERTY_LENGTH | ||
603 | if (pp->length > MAX_PROPERTY_LENGTH) | ||
604 | continue; /* ignore this property */ | ||
605 | #endif | ||
606 | mem_start = ALIGNUL(mem_start + pp->length); | ||
607 | *prev_propp = PTRUNRELOC(pp); | ||
608 | prev_propp = &pp->next; | ||
609 | } | ||
610 | if (np->node != 0) { | ||
611 | /* Add a "linux,phandle" property" */ | ||
612 | pp = (struct property *) mem_start; | ||
613 | *prev_propp = PTRUNRELOC(pp); | ||
614 | prev_propp = &pp->next; | ||
615 | namep = (char *) (pp + 1); | ||
616 | pp->name = PTRUNRELOC(namep); | ||
617 | strcpy(namep, "linux,phandle"); | ||
618 | mem_start = ALIGNUL((unsigned long)namep + strlen(namep) + 1); | ||
619 | pp->value = (unsigned char *) PTRUNRELOC(&np->node); | ||
620 | pp->length = sizeof(np->node); | ||
621 | } | ||
622 | *prev_propp = NULL; | ||
623 | |||
624 | /* get the node's full name */ | ||
625 | l = call_prom("package-to-path", 3, 1, node, | ||
626 | mem_start, mem_end - mem_start); | ||
627 | if (l >= 0) { | ||
628 | char *p, *ep; | ||
629 | |||
630 | np->full_name = PTRUNRELOC((char *) mem_start); | ||
631 | *(char *)(mem_start + l) = 0; | ||
632 | /* Fixup an Apple bug where they have bogus \0 chars in the | ||
633 | * middle of the path in some properties | ||
634 | */ | ||
635 | for (p = (char *)mem_start, ep = p + l; p < ep; p++) | ||
636 | if ((*p) == '\0') { | ||
637 | memmove(p, p+1, ep - p); | ||
638 | ep--; | ||
639 | } | ||
640 | mem_start = ALIGNUL(mem_start + l + 1); | ||
641 | } | ||
642 | |||
643 | /* do all our children */ | ||
644 | child = call_prom("child", 1, 1, node); | ||
645 | while (child != 0) { | ||
646 | mem_start = inspect_node(child, np, mem_start, mem_end, | ||
647 | allnextpp); | ||
648 | child = call_prom("peer", 1, 1, child); | ||
649 | } | ||
650 | |||
651 | return mem_start; | ||
652 | } | ||
653 | |||
654 | unsigned long smp_chrp_cpu_nr __initdata = 0; | ||
655 | |||
656 | /* | ||
657 | * With CHRP SMP we need to use the OF to start the other | ||
658 | * processors so we can't wait until smp_boot_cpus (the OF is | ||
659 | * trashed by then) so we have to put the processors into | ||
660 | * a holding pattern controlled by the kernel (not OF) before | ||
661 | * we destroy the OF. | ||
662 | * | ||
663 | * This uses a chunk of high memory, puts some holding pattern | ||
664 | * code there and sends the other processors off to there until | ||
665 | * smp_boot_cpus tells them to do something. We do that by using | ||
666 | * physical address 0x0. The holding pattern checks that address | ||
667 | * until its cpu # is there, when it is that cpu jumps to | ||
668 | * __secondary_start(). smp_boot_cpus() takes care of setting those | ||
669 | * values. | ||
670 | * | ||
671 | * We also use physical address 0x4 here to tell when a cpu | ||
672 | * is in its holding pattern code. | ||
673 | * | ||
674 | * -- Cort | ||
675 | * | ||
676 | * Note that we have to do this if we have more than one CPU, | ||
677 | * even if this is a UP kernel. Otherwise when we trash OF | ||
678 | * the other CPUs will start executing some random instructions | ||
679 | * and crash the system. -- paulus | ||
680 | */ | ||
681 | static void __init | ||
682 | prom_hold_cpus(unsigned long mem) | ||
683 | { | ||
684 | extern void __secondary_hold(void); | ||
685 | unsigned long i; | ||
686 | int cpu; | ||
687 | phandle node; | ||
688 | char type[16], *path; | ||
689 | unsigned int reg; | ||
690 | |||
691 | /* | ||
692 | * XXX: hack to make sure we're chrp, assume that if we're | ||
693 | * chrp we have a device_type property -- Cort | ||
694 | */ | ||
695 | node = call_prom("finddevice", 1, 1, "/"); | ||
696 | if (call_prom("getprop", 4, 1, node, | ||
697 | "device_type", type, sizeof(type)) <= 0) | ||
698 | return; | ||
699 | |||
700 | /* copy the holding pattern code to someplace safe (0) */ | ||
701 | /* the holding pattern is now within the first 0x100 | ||
702 | bytes of the kernel image -- paulus */ | ||
703 | memcpy((void *)0, _stext, 0x100); | ||
704 | flush_icache_range(0, 0x100); | ||
705 | |||
706 | /* look for cpus */ | ||
707 | *(unsigned long *)(0x0) = 0; | ||
708 | asm volatile("dcbf 0,%0": : "r" (0) : "memory"); | ||
709 | for (node = 0; prom_next_node(&node); ) { | ||
710 | type[0] = 0; | ||
711 | call_prom("getprop", 4, 1, node, "device_type", | ||
712 | type, sizeof(type)); | ||
713 | if (strcmp(type, "cpu") != 0) | ||
714 | continue; | ||
715 | path = (char *) mem; | ||
716 | memset(path, 0, 256); | ||
717 | if (call_prom("package-to-path", 3, 1, node, path, 255) < 0) | ||
718 | continue; | ||
719 | reg = -1; | ||
720 | call_prom("getprop", 4, 1, node, "reg", ®, sizeof(reg)); | ||
721 | cpu = smp_chrp_cpu_nr++; | ||
722 | #ifdef CONFIG_SMP | ||
723 | smp_hw_index[cpu] = reg; | ||
724 | #endif /* CONFIG_SMP */ | ||
725 | /* XXX: hack - don't start cpu 0, this cpu -- Cort */ | ||
726 | if (cpu == 0) | ||
727 | continue; | ||
728 | prom_print("starting cpu "); | ||
729 | prom_print(path); | ||
730 | *(ulong *)(0x4) = 0; | ||
731 | call_prom("start-cpu", 3, 0, node, | ||
732 | (char *)__secondary_hold - _stext, cpu); | ||
733 | prom_print("..."); | ||
734 | for ( i = 0 ; (i < 10000) && (*(ulong *)(0x4) == 0); i++ ) | ||
735 | ; | ||
736 | if (*(ulong *)(0x4) == cpu) | ||
737 | prom_print("ok\n"); | ||
738 | else { | ||
739 | prom_print("failed: "); | ||
740 | prom_print_hex(*(ulong *)0x4); | ||
741 | prom_print("\n"); | ||
742 | } | ||
743 | } | ||
744 | } | ||
745 | |||
746 | static void __init | ||
747 | prom_instantiate_rtas(void) | ||
748 | { | ||
749 | ihandle prom_rtas; | ||
750 | prom_arg_t result; | ||
751 | |||
752 | prom_rtas = call_prom("finddevice", 1, 1, "/rtas"); | ||
753 | if (prom_rtas == -1) | ||
754 | return; | ||
755 | |||
756 | rtas_size = 0; | ||
757 | call_prom("getprop", 4, 1, prom_rtas, | ||
758 | "rtas-size", &rtas_size, sizeof(rtas_size)); | ||
759 | prom_print("instantiating rtas"); | ||
760 | if (rtas_size == 0) { | ||
761 | rtas_data = 0; | ||
762 | } else { | ||
763 | /* | ||
764 | * Ask OF for some space for RTAS. | ||
765 | * Actually OF has bugs so we just arbitrarily | ||
766 | * use memory at the 6MB point. | ||
767 | */ | ||
768 | rtas_data = 6 << 20; | ||
769 | prom_print(" at "); | ||
770 | prom_print_hex(rtas_data); | ||
771 | } | ||
772 | |||
773 | prom_rtas = call_prom("open", 1, 1, "/rtas"); | ||
774 | prom_print("..."); | ||
775 | rtas_entry = 0; | ||
776 | if (call_prom_ret("call-method", 3, 2, &result, | ||
777 | "instantiate-rtas", prom_rtas, rtas_data) == 0) | ||
778 | rtas_entry = result; | ||
779 | if ((rtas_entry == -1) || (rtas_entry == 0)) | ||
780 | prom_print(" failed\n"); | ||
781 | else | ||
782 | prom_print(" done\n"); | ||
783 | } | ||
784 | |||
785 | /* | ||
786 | * We enter here early on, when the Open Firmware prom is still | ||
787 | * handling exceptions and the MMU hash table for us. | ||
788 | */ | ||
789 | unsigned long __init | ||
790 | prom_init(int r3, int r4, prom_entry pp) | ||
791 | { | ||
792 | unsigned long mem; | ||
793 | ihandle prom_mmu; | ||
794 | unsigned long offset = reloc_offset(); | ||
795 | int i, l; | ||
796 | char *p, *d; | ||
797 | unsigned long phys; | ||
798 | prom_arg_t result[3]; | ||
799 | char model[32]; | ||
800 | phandle node; | ||
801 | int rc; | ||
802 | |||
803 | /* Default */ | ||
804 | phys = (unsigned long) &_stext; | ||
805 | |||
806 | /* First get a handle for the stdout device */ | ||
807 | prom = pp; | ||
808 | prom_chosen = call_prom("finddevice", 1, 1, "/chosen"); | ||
809 | if (prom_chosen == -1) | ||
810 | prom_exit(); | ||
811 | if (call_prom("getprop", 4, 1, prom_chosen, "stdout", | ||
812 | &prom_stdout, sizeof(prom_stdout)) <= 0) | ||
813 | prom_exit(); | ||
814 | |||
815 | /* Get the full OF pathname of the stdout device */ | ||
816 | mem = (unsigned long) klimit + offset; | ||
817 | p = (char *) mem; | ||
818 | memset(p, 0, 256); | ||
819 | call_prom("instance-to-path", 3, 1, prom_stdout, p, 255); | ||
820 | of_stdout_device = p; | ||
821 | mem += strlen(p) + 1; | ||
822 | |||
823 | /* Get the boot device and translate it to a full OF pathname. */ | ||
824 | p = (char *) mem; | ||
825 | l = call_prom("getprop", 4, 1, prom_chosen, "bootpath", p, 1<<20); | ||
826 | if (l > 0) { | ||
827 | p[l] = 0; /* should already be null-terminated */ | ||
828 | bootpath = PTRUNRELOC(p); | ||
829 | mem += l + 1; | ||
830 | d = (char *) mem; | ||
831 | *d = 0; | ||
832 | call_prom("canon", 3, 1, p, d, 1<<20); | ||
833 | bootdevice = PTRUNRELOC(d); | ||
834 | mem = ALIGNUL(mem + strlen(d) + 1); | ||
835 | } | ||
836 | |||
837 | prom_instantiate_rtas(); | ||
838 | |||
839 | #ifdef CONFIG_POWER4 | ||
840 | /* | ||
841 | * Find out how much memory we have and allocate a | ||
842 | * suitably-sized hash table. | ||
843 | */ | ||
844 | prom_alloc_htab(); | ||
845 | #endif | ||
846 | mem = check_display(mem); | ||
847 | |||
848 | prom_print("copying OF device tree..."); | ||
849 | mem = copy_device_tree(mem, mem + (1<<20)); | ||
850 | prom_print("done\n"); | ||
851 | |||
852 | prom_hold_cpus(mem); | ||
853 | |||
854 | klimit = (char *) (mem - offset); | ||
855 | |||
856 | node = call_prom("finddevice", 1, 1, "/"); | ||
857 | rc = call_prom("getprop", 4, 1, node, "model", model, sizeof(model)); | ||
858 | if (rc > 0 && !strncmp (model, "Pegasos", 7) | ||
859 | && strncmp (model, "Pegasos2", 8)) { | ||
860 | /* Pegasos 1 has a broken translate method in the OF, | ||
861 | * and furthermore the BATs are mapped 1:1 so the phys | ||
862 | * address calculated above is correct, so let's use | ||
863 | * it directly. | ||
864 | */ | ||
865 | } else if (offset == 0) { | ||
866 | /* If we are already running at 0xc0000000, we assume we were | ||
867 | * loaded by an OF bootloader which did set a BAT for us. | ||
868 | * This breaks OF translate so we force phys to be 0. | ||
869 | */ | ||
870 | prom_print("(already at 0xc0000000) phys=0\n"); | ||
871 | phys = 0; | ||
872 | } else if (call_prom("getprop", 4, 1, prom_chosen, "mmu", | ||
873 | &prom_mmu, sizeof(prom_mmu)) <= 0) { | ||
874 | prom_print(" no MMU found\n"); | ||
875 | } else if (call_prom_ret("call-method", 4, 4, result, "translate", | ||
876 | prom_mmu, &_stext, 1) != 0) { | ||
877 | prom_print(" (translate failed)\n"); | ||
878 | } else { | ||
879 | /* We assume the phys. address size is 3 cells */ | ||
880 | phys = result[2]; | ||
881 | } | ||
882 | |||
883 | if (prom_disp_node != 0) | ||
884 | setup_disp_fake_bi(prom_disp_node); | ||
885 | |||
886 | /* Use quiesce call to get OF to shut down any devices it's using */ | ||
887 | prom_print("Calling quiesce ...\n"); | ||
888 | call_prom("quiesce", 0, 0); | ||
889 | |||
890 | /* Relocate various pointers which will be used once the | ||
891 | kernel is running at the address it was linked at. */ | ||
892 | for (i = 0; i < prom_num_displays; ++i) | ||
893 | prom_display_paths[i] = PTRUNRELOC(prom_display_paths[i]); | ||
894 | |||
895 | #ifdef CONFIG_SERIAL_CORE_CONSOLE | ||
896 | /* Relocate the of stdout for console autodetection */ | ||
897 | of_stdout_device = PTRUNRELOC(of_stdout_device); | ||
898 | #endif | ||
899 | |||
900 | prom_print("returning 0x"); | ||
901 | prom_print_hex(phys); | ||
902 | prom_print("from prom_init\n"); | ||
903 | prom_stdout = 0; | ||
904 | |||
905 | return phys; | ||
906 | } | ||
907 | |||
908 | /* | ||
909 | * early_get_property is used to access the device tree image prepared | ||
910 | * by BootX very early on, before the pointers in it have been relocated. | ||
911 | */ | ||
912 | static void * __init | ||
913 | early_get_property(unsigned long base, unsigned long node, char *prop) | ||
914 | { | ||
915 | struct device_node *np = (struct device_node *)(base + node); | ||
916 | struct property *pp; | ||
917 | |||
918 | for (pp = np->properties; pp != 0; pp = pp->next) { | ||
919 | pp = (struct property *) (base + (unsigned long)pp); | ||
920 | if (strcmp((char *)((unsigned long)pp->name + base), | ||
921 | prop) == 0) { | ||
922 | return (void *)((unsigned long)pp->value + base); | ||
923 | } | ||
924 | } | ||
925 | return NULL; | ||
926 | } | ||
927 | |||
928 | /* Is boot-info compatible ? */ | ||
929 | #define BOOT_INFO_IS_COMPATIBLE(bi) ((bi)->compatible_version <= BOOT_INFO_VERSION) | ||
930 | #define BOOT_INFO_IS_V2_COMPATIBLE(bi) ((bi)->version >= 2) | ||
931 | #define BOOT_INFO_IS_V4_COMPATIBLE(bi) ((bi)->version >= 4) | ||
932 | |||
933 | void __init | ||
934 | bootx_init(unsigned long r4, unsigned long phys) | ||
935 | { | ||
936 | boot_infos_t *bi = (boot_infos_t *) r4; | ||
937 | unsigned long space; | ||
938 | unsigned long ptr, x; | ||
939 | char *model; | ||
940 | |||
941 | boot_infos = PTRUNRELOC(bi); | ||
942 | if (!BOOT_INFO_IS_V2_COMPATIBLE(bi)) | ||
943 | bi->logicalDisplayBase = NULL; | ||
944 | |||
945 | #ifdef CONFIG_BOOTX_TEXT | ||
946 | btext_init(bi); | ||
947 | |||
948 | /* | ||
949 | * Test if boot-info is compatible. Done only in config | ||
950 | * CONFIG_BOOTX_TEXT since there is nothing much we can do | ||
951 | * with an incompatible version, except display a message | ||
952 | * and eventually hang the processor... | ||
953 | * | ||
954 | * I'll try to keep enough of boot-info compatible in the | ||
955 | * future to always allow display of this message; | ||
956 | */ | ||
957 | if (!BOOT_INFO_IS_COMPATIBLE(bi)) { | ||
958 | btext_drawstring(" !!! WARNING - Incompatible version of BootX !!!\n\n\n"); | ||
959 | btext_flushscreen(); | ||
960 | } | ||
961 | #endif /* CONFIG_BOOTX_TEXT */ | ||
962 | |||
963 | /* New BootX enters kernel with MMU off, i/os are not allowed | ||
964 | here. This hack will have been done by the boostrap anyway. | ||
965 | */ | ||
966 | if (bi->version < 4) { | ||
967 | /* | ||
968 | * XXX If this is an iMac, turn off the USB controller. | ||
969 | */ | ||
970 | model = (char *) early_get_property | ||
971 | (r4 + bi->deviceTreeOffset, 4, "model"); | ||
972 | if (model | ||
973 | && (strcmp(model, "iMac,1") == 0 | ||
974 | || strcmp(model, "PowerMac1,1") == 0)) { | ||
975 | out_le32((unsigned *)0x80880008, 1); /* XXX */ | ||
976 | } | ||
977 | } | ||
978 | |||
979 | /* Move klimit to enclose device tree, args, ramdisk, etc... */ | ||
980 | if (bi->version < 5) { | ||
981 | space = bi->deviceTreeOffset + bi->deviceTreeSize; | ||
982 | if (bi->ramDisk) | ||
983 | space = bi->ramDisk + bi->ramDiskSize; | ||
984 | } else | ||
985 | space = bi->totalParamsSize; | ||
986 | klimit = PTRUNRELOC((char *) bi + space); | ||
987 | |||
988 | /* New BootX will have flushed all TLBs and enters kernel with | ||
989 | MMU switched OFF, so this should not be useful anymore. | ||
990 | */ | ||
991 | if (bi->version < 4) { | ||
992 | /* | ||
993 | * Touch each page to make sure the PTEs for them | ||
994 | * are in the hash table - the aim is to try to avoid | ||
995 | * getting DSI exceptions while copying the kernel image. | ||
996 | */ | ||
997 | for (ptr = ((unsigned long) &_stext) & PAGE_MASK; | ||
998 | ptr < (unsigned long)bi + space; ptr += PAGE_SIZE) | ||
999 | x = *(volatile unsigned long *)ptr; | ||
1000 | } | ||
1001 | |||
1002 | #ifdef CONFIG_BOOTX_TEXT | ||
1003 | /* | ||
1004 | * Note that after we call btext_prepare_BAT, we can't do | ||
1005 | * prom_draw*, flushscreen or clearscreen until we turn the MMU | ||
1006 | * on, since btext_prepare_BAT sets disp_bi.logicalDisplayBase | ||
1007 | * to a virtual address. | ||
1008 | */ | ||
1009 | btext_prepare_BAT(); | ||
1010 | #endif | ||
1011 | } | ||
diff --git a/arch/ppc/xmon/start.c b/arch/ppc/xmon/start.c index ff86b2d814cb..cfc2d6ad464d 100644 --- a/arch/ppc/xmon/start.c +++ b/arch/ppc/xmon/start.c | |||
@@ -58,7 +58,7 @@ static struct sysrq_key_op sysrq_xmon_op = | |||
58 | void | 58 | void |
59 | xmon_map_scc(void) | 59 | xmon_map_scc(void) |
60 | { | 60 | { |
61 | #ifdef CONFIG_PPC_MULTIPLATFORM | 61 | #ifdef CONFIG_PPC_PREP |
62 | volatile unsigned char *base; | 62 | volatile unsigned char *base; |
63 | 63 | ||
64 | #elif defined(CONFIG_GEMINI) | 64 | #elif defined(CONFIG_GEMINI) |