diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-04-02 00:08:05 -0500 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-04-02 00:08:05 -0500 |
commit | 95d465fd750897ab32462a6702fbfe1b122cbbc0 (patch) | |
tree | 65c38b2f11c51bb6932e44dd6c92f15b0091abfe /arch/i386 | |
parent | 642fde17dceceb56c7ba2762733ac688666ae657 (diff) | |
parent | 683aa4012f53b2ada0f430487e05d37b0d94e90a (diff) |
Manual merge with Linus.
Conflicts:
arch/powerpc/kernel/setup-common.c
drivers/input/keyboard/hil_kbd.c
drivers/input/mouse/hil_ptr.c
Diffstat (limited to 'arch/i386')
81 files changed, 2506 insertions, 1403 deletions
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index 5b1a7d46d1d9..f17bd1d2707e 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
@@ -37,6 +37,10 @@ config GENERIC_IOMAP | |||
37 | bool | 37 | bool |
38 | default y | 38 | default y |
39 | 39 | ||
40 | config GENERIC_HWEIGHT | ||
41 | bool | ||
42 | default y | ||
43 | |||
40 | config ARCH_MAY_HAVE_PC_FDC | 44 | config ARCH_MAY_HAVE_PC_FDC |
41 | bool | 45 | bool |
42 | default y | 46 | default y |
@@ -80,6 +84,7 @@ config X86_VOYAGER | |||
80 | 84 | ||
81 | config X86_NUMAQ | 85 | config X86_NUMAQ |
82 | bool "NUMAQ (IBM/Sequent)" | 86 | bool "NUMAQ (IBM/Sequent)" |
87 | select SMP | ||
83 | select NUMA | 88 | select NUMA |
84 | help | 89 | help |
85 | This option is used for getting Linux to run on a (IBM/Sequent) NUMA | 90 | This option is used for getting Linux to run on a (IBM/Sequent) NUMA |
@@ -226,6 +231,15 @@ config SCHED_SMT | |||
226 | cost of slightly increased overhead in some places. If unsure say | 231 | cost of slightly increased overhead in some places. If unsure say |
227 | N here. | 232 | N here. |
228 | 233 | ||
234 | config SCHED_MC | ||
235 | bool "Multi-core scheduler support" | ||
236 | depends on SMP | ||
237 | default y | ||
238 | help | ||
239 | Multi-core scheduler support improves the CPU scheduler's decision | ||
240 | making when dealing with multi-core CPU chips at a cost of slightly | ||
241 | increased overhead in some places. If unsure say N here. | ||
242 | |||
229 | source "kernel/Kconfig.preempt" | 243 | source "kernel/Kconfig.preempt" |
230 | 244 | ||
231 | config X86_UP_APIC | 245 | config X86_UP_APIC |
@@ -400,6 +414,7 @@ choice | |||
400 | 414 | ||
401 | config NOHIGHMEM | 415 | config NOHIGHMEM |
402 | bool "off" | 416 | bool "off" |
417 | depends on !X86_NUMAQ | ||
403 | ---help--- | 418 | ---help--- |
404 | Linux can use up to 64 Gigabytes of physical memory on x86 systems. | 419 | Linux can use up to 64 Gigabytes of physical memory on x86 systems. |
405 | However, the address space of 32-bit x86 processors is only 4 | 420 | However, the address space of 32-bit x86 processors is only 4 |
@@ -436,6 +451,7 @@ config NOHIGHMEM | |||
436 | 451 | ||
437 | config HIGHMEM4G | 452 | config HIGHMEM4G |
438 | bool "4GB" | 453 | bool "4GB" |
454 | depends on !X86_NUMAQ | ||
439 | help | 455 | help |
440 | Select this if you have a 32-bit processor and between 1 and 4 | 456 | Select this if you have a 32-bit processor and between 1 and 4 |
441 | gigabytes of physical RAM. | 457 | gigabytes of physical RAM. |
@@ -503,10 +519,6 @@ config NUMA | |||
503 | default n if X86_PC | 519 | default n if X86_PC |
504 | default y if (X86_NUMAQ || X86_SUMMIT) | 520 | default y if (X86_NUMAQ || X86_SUMMIT) |
505 | 521 | ||
506 | # Need comments to help the hapless user trying to turn on NUMA support | ||
507 | comment "NUMA (NUMA-Q) requires SMP, 64GB highmem support" | ||
508 | depends on X86_NUMAQ && (!HIGHMEM64G || !SMP) | ||
509 | |||
510 | comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" | 522 | comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" |
511 | depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) | 523 | depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) |
512 | 524 | ||
@@ -660,13 +672,18 @@ config BOOT_IOREMAP | |||
660 | default y | 672 | default y |
661 | 673 | ||
662 | config REGPARM | 674 | config REGPARM |
663 | bool "Use register arguments (EXPERIMENTAL)" | 675 | bool "Use register arguments" |
664 | depends on EXPERIMENTAL | 676 | default y |
665 | default n | ||
666 | help | 677 | help |
667 | Compile the kernel with -mregparm=3. This uses a different ABI | 678 | Compile the kernel with -mregparm=3. This instructs gcc to use |
668 | and passes the first three arguments of a function call in registers. | 679 | a more efficient function call ABI which passes the first three |
669 | This will probably break binary only modules. | 680 | arguments of a function call via registers, which results in denser |
681 | and faster code. | ||
682 | |||
683 | If this option is disabled, then the default ABI of passing | ||
684 | arguments via the stack is used. | ||
685 | |||
686 | If unsure, say Y. | ||
670 | 687 | ||
671 | config SECCOMP | 688 | config SECCOMP |
672 | bool "Enable seccomp to safely compute untrusted bytecode" | 689 | bool "Enable seccomp to safely compute untrusted bytecode" |
@@ -733,7 +750,7 @@ config PHYSICAL_START | |||
733 | 750 | ||
734 | config HOTPLUG_CPU | 751 | config HOTPLUG_CPU |
735 | bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" | 752 | bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" |
736 | depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER | 753 | depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER && !X86_PC |
737 | ---help--- | 754 | ---help--- |
738 | Say Y here to experiment with turning CPUs off and on. CPUs | 755 | Say Y here to experiment with turning CPUs off and on. CPUs |
739 | can be controlled through /sys/devices/system/cpu. | 756 | can be controlled through /sys/devices/system/cpu. |
diff --git a/arch/i386/Kconfig.debug b/arch/i386/Kconfig.debug index bf32ecc9ad04..6e97df6979e8 100644 --- a/arch/i386/Kconfig.debug +++ b/arch/i386/Kconfig.debug | |||
@@ -31,12 +31,21 @@ config DEBUG_STACK_USAGE | |||
31 | 31 | ||
32 | This option will slow down process creation somewhat. | 32 | This option will slow down process creation somewhat. |
33 | 33 | ||
34 | config STACK_BACKTRACE_COLS | ||
35 | int "Stack backtraces per line" if DEBUG_KERNEL | ||
36 | range 1 3 | ||
37 | default 2 | ||
38 | help | ||
39 | Selects how many stack backtrace entries per line to display. | ||
40 | |||
41 | This can save screen space when displaying traces. | ||
42 | |||
34 | comment "Page alloc debug is incompatible with Software Suspend on i386" | 43 | comment "Page alloc debug is incompatible with Software Suspend on i386" |
35 | depends on DEBUG_KERNEL && SOFTWARE_SUSPEND | 44 | depends on DEBUG_KERNEL && SOFTWARE_SUSPEND |
36 | 45 | ||
37 | config DEBUG_PAGEALLOC | 46 | config DEBUG_PAGEALLOC |
38 | bool "Page alloc debugging" | 47 | bool "Debug page memory allocations" |
39 | depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND | 48 | depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND && !HUGETLBFS |
40 | help | 49 | help |
41 | Unmap pages from the kernel linear mapping after free_pages(). | 50 | Unmap pages from the kernel linear mapping after free_pages(). |
42 | This results in a large slowdown, but helps to find certain types | 51 | This results in a large slowdown, but helps to find certain types |
diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 36bef6543ac1..3e4adb1e2244 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile | |||
@@ -39,6 +39,9 @@ include $(srctree)/arch/i386/Makefile.cpu | |||
39 | 39 | ||
40 | cflags-$(CONFIG_REGPARM) += -mregparm=3 | 40 | cflags-$(CONFIG_REGPARM) += -mregparm=3 |
41 | 41 | ||
42 | # temporary until string.h is fixed | ||
43 | cflags-y += -ffreestanding | ||
44 | |||
42 | # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use | 45 | # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use |
43 | # a lot more stack due to the lack of sharing of stacklots: | 46 | # a lot more stack due to the lack of sharing of stacklots: |
44 | CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;) | 47 | CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;) |
@@ -99,8 +102,8 @@ AFLAGS += $(mflags-y) | |||
99 | 102 | ||
100 | boot := arch/i386/boot | 103 | boot := arch/i386/boot |
101 | 104 | ||
102 | .PHONY: zImage bzImage compressed zlilo bzlilo \ | 105 | PHONY += zImage bzImage compressed zlilo bzlilo \ |
103 | zdisk bzdisk fdimage fdimage144 fdimage288 install | 106 | zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install |
104 | 107 | ||
105 | all: bzImage | 108 | all: bzImage |
106 | 109 | ||
@@ -119,7 +122,7 @@ zlilo bzlilo: vmlinux | |||
119 | zdisk bzdisk: vmlinux | 122 | zdisk bzdisk: vmlinux |
120 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) zdisk | 123 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) zdisk |
121 | 124 | ||
122 | fdimage fdimage144 fdimage288: vmlinux | 125 | fdimage fdimage144 fdimage288 isoimage: vmlinux |
123 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ | 126 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ |
124 | 127 | ||
125 | install: | 128 | install: |
@@ -136,6 +139,9 @@ define archhelp | |||
136 | echo ' install to $$(INSTALL_PATH) and run lilo' | 139 | echo ' install to $$(INSTALL_PATH) and run lilo' |
137 | echo ' bzdisk - Create a boot floppy in /dev/fd0' | 140 | echo ' bzdisk - Create a boot floppy in /dev/fd0' |
138 | echo ' fdimage - Create a boot floppy image' | 141 | echo ' fdimage - Create a boot floppy image' |
142 | echo ' isoimage - Create a boot CD-ROM image' | ||
139 | endef | 143 | endef |
140 | 144 | ||
141 | CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf | 145 | CLEAN_FILES += arch/$(ARCH)/boot/fdimage \ |
146 | arch/$(ARCH)/boot/image.iso \ | ||
147 | arch/$(ARCH)/boot/mtools.conf | ||
diff --git a/arch/i386/Makefile.cpu b/arch/i386/Makefile.cpu index dcd936ef45db..a11befba26d5 100644 --- a/arch/i386/Makefile.cpu +++ b/arch/i386/Makefile.cpu | |||
@@ -39,3 +39,7 @@ cflags-$(CONFIG_X86_ELAN) += -march=i486 | |||
39 | # Geode GX1 support | 39 | # Geode GX1 support |
40 | cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx | 40 | cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx |
41 | 41 | ||
42 | # add at the end to overwrite eventual tuning options from earlier | ||
43 | # cpu entries | ||
44 | cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic) | ||
45 | |||
diff --git a/arch/i386/boot/Makefile b/arch/i386/boot/Makefile index f136752563b1..33e55476381b 100644 --- a/arch/i386/boot/Makefile +++ b/arch/i386/boot/Makefile | |||
@@ -62,8 +62,12 @@ $(obj)/setup $(obj)/bootsect: %: %.o FORCE | |||
62 | $(obj)/compressed/vmlinux: FORCE | 62 | $(obj)/compressed/vmlinux: FORCE |
63 | $(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@ | 63 | $(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@ |
64 | 64 | ||
65 | # Set this if you want to pass append arguments to the zdisk/fdimage kernel | 65 | # Set this if you want to pass append arguments to the zdisk/fdimage/isoimage kernel |
66 | FDARGS = | 66 | FDARGS = |
67 | # Set this if you want an initrd included with the zdisk/fdimage/isoimage kernel | ||
68 | FDINITRD = | ||
69 | |||
70 | image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,) | ||
67 | 71 | ||
68 | $(obj)/mtools.conf: $(src)/mtools.conf.in | 72 | $(obj)/mtools.conf: $(src)/mtools.conf.in |
69 | sed -e 's|@OBJ@|$(obj)|g' < $< > $@ | 73 | sed -e 's|@OBJ@|$(obj)|g' < $< > $@ |
@@ -72,8 +76,11 @@ $(obj)/mtools.conf: $(src)/mtools.conf.in | |||
72 | zdisk: $(BOOTIMAGE) $(obj)/mtools.conf | 76 | zdisk: $(BOOTIMAGE) $(obj)/mtools.conf |
73 | MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync | 77 | MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync |
74 | syslinux /dev/fd0 ; sync | 78 | syslinux /dev/fd0 ; sync |
75 | echo 'default linux $(FDARGS)' | \ | 79 | echo '$(image_cmdline)' | \ |
76 | MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg | 80 | MTOOLSRC=$(src)/mtools.conf mcopy - a:syslinux.cfg |
81 | if [ -f '$(FDINITRD)' ] ; then \ | ||
82 | MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \ | ||
83 | fi | ||
77 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) a:linux ; sync | 84 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) a:linux ; sync |
78 | 85 | ||
79 | # These require being root or having syslinux 2.02 or higher installed | 86 | # These require being root or having syslinux 2.02 or higher installed |
@@ -81,18 +88,39 @@ fdimage fdimage144: $(BOOTIMAGE) $(obj)/mtools.conf | |||
81 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440 | 88 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440 |
82 | MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync | 89 | MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync |
83 | syslinux $(obj)/fdimage ; sync | 90 | syslinux $(obj)/fdimage ; sync |
84 | echo 'default linux $(FDARGS)' | \ | 91 | echo '$(image_cmdline)' | \ |
85 | MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg | 92 | MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg |
93 | if [ -f '$(FDINITRD)' ] ; then \ | ||
94 | MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \ | ||
95 | fi | ||
86 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) v:linux ; sync | 96 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) v:linux ; sync |
87 | 97 | ||
88 | fdimage288: $(BOOTIMAGE) $(obj)/mtools.conf | 98 | fdimage288: $(BOOTIMAGE) $(obj)/mtools.conf |
89 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880 | 99 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880 |
90 | MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync | 100 | MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync |
91 | syslinux $(obj)/fdimage ; sync | 101 | syslinux $(obj)/fdimage ; sync |
92 | echo 'default linux $(FDARGS)' | \ | 102 | echo '$(image_cmdline)' | \ |
93 | MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg | 103 | MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg |
104 | if [ -f '$(FDINITRD)' ] ; then \ | ||
105 | MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \ | ||
106 | fi | ||
94 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux ; sync | 107 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux ; sync |
95 | 108 | ||
109 | isoimage: $(BOOTIMAGE) | ||
110 | -rm -rf $(obj)/isoimage | ||
111 | mkdir $(obj)/isoimage | ||
112 | cp `echo /usr/lib*/syslinux/isolinux.bin | awk '{ print $1; }'` \ | ||
113 | $(obj)/isoimage | ||
114 | cp $(BOOTIMAGE) $(obj)/isoimage/linux | ||
115 | echo '$(image_cmdline)' > $(obj)/isoimage/isolinux.cfg | ||
116 | if [ -f '$(FDINITRD)' ] ; then \ | ||
117 | cp '$(FDINITRD)' $(obj)/isoimage/initrd.img ; \ | ||
118 | fi | ||
119 | mkisofs -J -r -o $(obj)/image.iso -b isolinux.bin -c boot.cat \ | ||
120 | -no-emul-boot -boot-load-size 4 -boot-info-table \ | ||
121 | $(obj)/isoimage | ||
122 | rm -rf $(obj)/isoimage | ||
123 | |||
96 | zlilo: $(BOOTIMAGE) | 124 | zlilo: $(BOOTIMAGE) |
97 | if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi | 125 | if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi |
98 | if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi | 126 | if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi |
diff --git a/arch/i386/boot/edd.S b/arch/i386/boot/edd.S index d8d69f2b911d..4b84ea216f2b 100644 --- a/arch/i386/boot/edd.S +++ b/arch/i386/boot/edd.S | |||
@@ -76,6 +76,8 @@ edd_mbr_sig_read: | |||
76 | popw %es | 76 | popw %es |
77 | popw %bx | 77 | popw %bx |
78 | jc edd_mbr_sig_done # on failure, we're done. | 78 | jc edd_mbr_sig_done # on failure, we're done. |
79 | cmpb $0, %ah # some BIOSes do not set CF | ||
80 | jne edd_mbr_sig_done # on failure, we're done. | ||
79 | movl (EDDBUF+EDD_MBR_SIG_OFFSET), %eax # read sig out of the MBR | 81 | movl (EDDBUF+EDD_MBR_SIG_OFFSET), %eax # read sig out of the MBR |
80 | movl %eax, (%bx) # store success | 82 | movl %eax, (%bx) # store success |
81 | incb (EDD_MBR_SIG_NR_BUF) # note that we stored something | 83 | incb (EDD_MBR_SIG_NR_BUF) # note that we stored something |
diff --git a/arch/i386/boot/video.S b/arch/i386/boot/video.S index 2ac40c8244c4..0000a2674537 100644 --- a/arch/i386/boot/video.S +++ b/arch/i386/boot/video.S | |||
@@ -1924,6 +1924,7 @@ skip10: movb %ah, %al | |||
1924 | ret | 1924 | ret |
1925 | 1925 | ||
1926 | store_edid: | 1926 | store_edid: |
1927 | #ifdef CONFIG_FB_FIRMWARE_EDID | ||
1927 | pushw %es # just save all registers | 1928 | pushw %es # just save all registers |
1928 | pushw %ax | 1929 | pushw %ax |
1929 | pushw %bx | 1930 | pushw %bx |
@@ -1954,6 +1955,7 @@ store_edid: | |||
1954 | popw %bx | 1955 | popw %bx |
1955 | popw %ax | 1956 | popw %ax |
1956 | popw %es | 1957 | popw %es |
1958 | #endif | ||
1957 | ret | 1959 | ret |
1958 | 1960 | ||
1959 | # VIDEO_SELECT-only variables | 1961 | # VIDEO_SELECT-only variables |
diff --git a/arch/i386/defconfig b/arch/i386/defconfig index 3cbe6e9cb9fc..1629c3ac9bee 100644 --- a/arch/i386/defconfig +++ b/arch/i386/defconfig | |||
@@ -1,49 +1,87 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # | 3 | # |
4 | CONFIG_X86_32=y | ||
5 | CONFIG_SEMAPHORE_SLEEPERS=y | ||
4 | CONFIG_X86=y | 6 | CONFIG_X86=y |
5 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
6 | CONFIG_UID16=y | ||
7 | CONFIG_GENERIC_ISA_DMA=y | 8 | CONFIG_GENERIC_ISA_DMA=y |
9 | CONFIG_GENERIC_IOMAP=y | ||
10 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
11 | CONFIG_DMI=y | ||
8 | 12 | ||
9 | # | 13 | # |
10 | # Code maturity level options | 14 | # Code maturity level options |
11 | # | 15 | # |
12 | CONFIG_EXPERIMENTAL=y | 16 | CONFIG_EXPERIMENTAL=y |
13 | CONFIG_CLEAN_COMPILE=y | 17 | CONFIG_BROKEN_ON_SMP=y |
14 | CONFIG_STANDALONE=y | 18 | CONFIG_INIT_ENV_ARG_LIMIT=32 |
15 | 19 | ||
16 | # | 20 | # |
17 | # General setup | 21 | # General setup |
18 | # | 22 | # |
23 | CONFIG_LOCALVERSION="" | ||
24 | # CONFIG_LOCALVERSION_AUTO is not set | ||
19 | CONFIG_SWAP=y | 25 | CONFIG_SWAP=y |
20 | CONFIG_SYSVIPC=y | 26 | CONFIG_SYSVIPC=y |
21 | CONFIG_POSIX_MQUEUE=y | 27 | # CONFIG_POSIX_MQUEUE is not set |
22 | # CONFIG_BSD_PROCESS_ACCT is not set | 28 | # CONFIG_BSD_PROCESS_ACCT is not set |
23 | CONFIG_SYSCTL=y | 29 | CONFIG_SYSCTL=y |
24 | CONFIG_AUDIT=y | 30 | # CONFIG_AUDIT is not set |
25 | CONFIG_AUDITSYSCALL=y | 31 | CONFIG_IKCONFIG=y |
26 | CONFIG_LOG_BUF_SHIFT=15 | 32 | CONFIG_IKCONFIG_PROC=y |
27 | CONFIG_HOTPLUG=y | 33 | CONFIG_INITRAMFS_SOURCE="" |
28 | # CONFIG_IKCONFIG is not set | 34 | CONFIG_UID16=y |
35 | CONFIG_VM86=y | ||
36 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
29 | # CONFIG_EMBEDDED is not set | 37 | # CONFIG_EMBEDDED is not set |
30 | CONFIG_KALLSYMS=y | 38 | CONFIG_KALLSYMS=y |
39 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
40 | CONFIG_HOTPLUG=y | ||
41 | CONFIG_PRINTK=y | ||
42 | CONFIG_BUG=y | ||
43 | CONFIG_ELF_CORE=y | ||
44 | CONFIG_BASE_FULL=y | ||
31 | CONFIG_FUTEX=y | 45 | CONFIG_FUTEX=y |
32 | CONFIG_EPOLL=y | 46 | CONFIG_EPOLL=y |
33 | CONFIG_IOSCHED_NOOP=y | 47 | CONFIG_SHMEM=y |
34 | CONFIG_IOSCHED_AS=y | 48 | CONFIG_CC_ALIGN_FUNCTIONS=0 |
35 | CONFIG_IOSCHED_DEADLINE=y | 49 | CONFIG_CC_ALIGN_LABELS=0 |
36 | CONFIG_IOSCHED_CFQ=y | 50 | CONFIG_CC_ALIGN_LOOPS=0 |
37 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 51 | CONFIG_CC_ALIGN_JUMPS=0 |
52 | CONFIG_SLAB=y | ||
53 | # CONFIG_TINY_SHMEM is not set | ||
54 | CONFIG_BASE_SMALL=0 | ||
55 | # CONFIG_SLOB is not set | ||
38 | 56 | ||
39 | # | 57 | # |
40 | # Loadable module support | 58 | # Loadable module support |
41 | # | 59 | # |
42 | CONFIG_MODULES=y | 60 | CONFIG_MODULES=y |
43 | # CONFIG_MODULE_UNLOAD is not set | 61 | CONFIG_MODULE_UNLOAD=y |
62 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
44 | CONFIG_OBSOLETE_MODPARM=y | 63 | CONFIG_OBSOLETE_MODPARM=y |
45 | # CONFIG_MODVERSIONS is not set | 64 | # CONFIG_MODVERSIONS is not set |
46 | CONFIG_KMOD=y | 65 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
66 | # CONFIG_KMOD is not set | ||
67 | |||
68 | # | ||
69 | # Block layer | ||
70 | # | ||
71 | # CONFIG_LBD is not set | ||
72 | |||
73 | # | ||
74 | # IO Schedulers | ||
75 | # | ||
76 | CONFIG_IOSCHED_NOOP=y | ||
77 | # CONFIG_IOSCHED_AS is not set | ||
78 | # CONFIG_IOSCHED_DEADLINE is not set | ||
79 | CONFIG_IOSCHED_CFQ=y | ||
80 | # CONFIG_DEFAULT_AS is not set | ||
81 | # CONFIG_DEFAULT_DEADLINE is not set | ||
82 | CONFIG_DEFAULT_CFQ=y | ||
83 | # CONFIG_DEFAULT_NOOP is not set | ||
84 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
47 | 85 | ||
48 | # | 86 | # |
49 | # Processor type and features | 87 | # Processor type and features |
@@ -66,43 +104,50 @@ CONFIG_X86_PC=y | |||
66 | # CONFIG_MPENTIUMII is not set | 104 | # CONFIG_MPENTIUMII is not set |
67 | # CONFIG_MPENTIUMIII is not set | 105 | # CONFIG_MPENTIUMIII is not set |
68 | # CONFIG_MPENTIUMM is not set | 106 | # CONFIG_MPENTIUMM is not set |
69 | CONFIG_MPENTIUM4=y | 107 | # CONFIG_MPENTIUM4 is not set |
70 | # CONFIG_MK6 is not set | 108 | # CONFIG_MK6 is not set |
71 | # CONFIG_MK7 is not set | 109 | CONFIG_MK7=y |
72 | # CONFIG_MK8 is not set | 110 | # CONFIG_MK8 is not set |
73 | # CONFIG_MCRUSOE is not set | 111 | # CONFIG_MCRUSOE is not set |
74 | # CONFIG_MEFFICEON is not set | 112 | # CONFIG_MEFFICEON is not set |
75 | # CONFIG_MWINCHIPC6 is not set | 113 | # CONFIG_MWINCHIPC6 is not set |
76 | # CONFIG_MWINCHIP2 is not set | 114 | # CONFIG_MWINCHIP2 is not set |
77 | # CONFIG_MWINCHIP3D is not set | 115 | # CONFIG_MWINCHIP3D is not set |
116 | # CONFIG_MGEODEGX1 is not set | ||
117 | # CONFIG_MGEODE_LX is not set | ||
78 | # CONFIG_MCYRIXIII is not set | 118 | # CONFIG_MCYRIXIII is not set |
79 | # CONFIG_MVIAC3_2 is not set | 119 | # CONFIG_MVIAC3_2 is not set |
80 | # CONFIG_X86_GENERIC is not set | 120 | # CONFIG_X86_GENERIC is not set |
81 | CONFIG_X86_CMPXCHG=y | 121 | CONFIG_X86_CMPXCHG=y |
82 | CONFIG_X86_XADD=y | 122 | CONFIG_X86_XADD=y |
83 | CONFIG_X86_L1_CACHE_SHIFT=7 | 123 | CONFIG_X86_L1_CACHE_SHIFT=6 |
84 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 124 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
125 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
85 | CONFIG_X86_WP_WORKS_OK=y | 126 | CONFIG_X86_WP_WORKS_OK=y |
86 | CONFIG_X86_INVLPG=y | 127 | CONFIG_X86_INVLPG=y |
87 | CONFIG_X86_BSWAP=y | 128 | CONFIG_X86_BSWAP=y |
88 | CONFIG_X86_POPAD_OK=y | 129 | CONFIG_X86_POPAD_OK=y |
130 | CONFIG_X86_CMPXCHG64=y | ||
89 | CONFIG_X86_GOOD_APIC=y | 131 | CONFIG_X86_GOOD_APIC=y |
90 | CONFIG_X86_INTEL_USERCOPY=y | 132 | CONFIG_X86_INTEL_USERCOPY=y |
91 | CONFIG_X86_USE_PPRO_CHECKSUM=y | 133 | CONFIG_X86_USE_PPRO_CHECKSUM=y |
134 | CONFIG_X86_USE_3DNOW=y | ||
135 | CONFIG_X86_TSC=y | ||
92 | # CONFIG_HPET_TIMER is not set | 136 | # CONFIG_HPET_TIMER is not set |
93 | # CONFIG_HPET_EMULATE_RTC is not set | 137 | # CONFIG_SMP is not set |
94 | CONFIG_SMP=y | 138 | CONFIG_PREEMPT_NONE=y |
95 | CONFIG_NR_CPUS=8 | 139 | # CONFIG_PREEMPT_VOLUNTARY is not set |
96 | CONFIG_SCHED_SMT=y | 140 | # CONFIG_PREEMPT is not set |
97 | CONFIG_PREEMPT=y | 141 | CONFIG_X86_UP_APIC=y |
142 | CONFIG_X86_UP_IOAPIC=y | ||
98 | CONFIG_X86_LOCAL_APIC=y | 143 | CONFIG_X86_LOCAL_APIC=y |
99 | CONFIG_X86_IO_APIC=y | 144 | CONFIG_X86_IO_APIC=y |
100 | CONFIG_X86_TSC=y | ||
101 | CONFIG_X86_MCE=y | 145 | CONFIG_X86_MCE=y |
102 | CONFIG_X86_MCE_NONFATAL=y | 146 | CONFIG_X86_MCE_NONFATAL=y |
103 | CONFIG_X86_MCE_P4THERMAL=y | 147 | # CONFIG_X86_MCE_P4THERMAL is not set |
104 | # CONFIG_TOSHIBA is not set | 148 | # CONFIG_TOSHIBA is not set |
105 | # CONFIG_I8K is not set | 149 | # CONFIG_I8K is not set |
150 | # CONFIG_X86_REBOOTFIXUPS is not set | ||
106 | # CONFIG_MICROCODE is not set | 151 | # CONFIG_MICROCODE is not set |
107 | # CONFIG_X86_MSR is not set | 152 | # CONFIG_X86_MSR is not set |
108 | # CONFIG_X86_CPUID is not set | 153 | # CONFIG_X86_CPUID is not set |
@@ -111,41 +156,71 @@ CONFIG_X86_MCE_P4THERMAL=y | |||
111 | # Firmware Drivers | 156 | # Firmware Drivers |
112 | # | 157 | # |
113 | # CONFIG_EDD is not set | 158 | # CONFIG_EDD is not set |
159 | # CONFIG_DELL_RBU is not set | ||
160 | # CONFIG_DCDBAS is not set | ||
114 | CONFIG_NOHIGHMEM=y | 161 | CONFIG_NOHIGHMEM=y |
115 | # CONFIG_HIGHMEM4G is not set | 162 | # CONFIG_HIGHMEM4G is not set |
116 | # CONFIG_HIGHMEM64G is not set | 163 | # CONFIG_HIGHMEM64G is not set |
164 | CONFIG_VMSPLIT_3G=y | ||
165 | # CONFIG_VMSPLIT_3G_OPT is not set | ||
166 | # CONFIG_VMSPLIT_2G is not set | ||
167 | # CONFIG_VMSPLIT_1G is not set | ||
168 | CONFIG_PAGE_OFFSET=0xC0000000 | ||
169 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
170 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
171 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
172 | CONFIG_SELECT_MEMORY_MODEL=y | ||
173 | CONFIG_FLATMEM_MANUAL=y | ||
174 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
175 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
176 | CONFIG_FLATMEM=y | ||
177 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
178 | CONFIG_SPARSEMEM_STATIC=y | ||
179 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
117 | # CONFIG_MATH_EMULATION is not set | 180 | # CONFIG_MATH_EMULATION is not set |
118 | CONFIG_MTRR=y | 181 | CONFIG_MTRR=y |
119 | # CONFIG_EFI is not set | 182 | # CONFIG_EFI is not set |
120 | CONFIG_IRQBALANCE=y | 183 | CONFIG_REGPARM=y |
121 | CONFIG_HAVE_DEC_LOCK=y | 184 | # CONFIG_SECCOMP is not set |
122 | # CONFIG_REGPARM is not set | 185 | CONFIG_HZ_100=y |
186 | # CONFIG_HZ_250 is not set | ||
187 | # CONFIG_HZ_1000 is not set | ||
188 | CONFIG_HZ=100 | ||
189 | # CONFIG_KEXEC is not set | ||
190 | CONFIG_PHYSICAL_START=0x100000 | ||
191 | CONFIG_DOUBLEFAULT=y | ||
123 | 192 | ||
124 | # | 193 | # |
125 | # Power management options (ACPI, APM) | 194 | # Power management options (ACPI, APM) |
126 | # | 195 | # |
127 | CONFIG_PM=y | 196 | CONFIG_PM=y |
197 | # CONFIG_PM_LEGACY is not set | ||
198 | # CONFIG_PM_DEBUG is not set | ||
128 | CONFIG_SOFTWARE_SUSPEND=y | 199 | CONFIG_SOFTWARE_SUSPEND=y |
200 | CONFIG_PM_STD_PARTITION="/dev/hda2" | ||
129 | 201 | ||
130 | # | 202 | # |
131 | # ACPI (Advanced Configuration and Power Interface) Support | 203 | # ACPI (Advanced Configuration and Power Interface) Support |
132 | # | 204 | # |
133 | CONFIG_ACPI=y | 205 | CONFIG_ACPI=y |
134 | CONFIG_ACPI_SLEEP=y | 206 | # CONFIG_ACPI_SLEEP is not set |
135 | CONFIG_ACPI_SLEEP_PROC_FS=y | 207 | # CONFIG_ACPI_AC is not set |
136 | CONFIG_ACPI_AC=y | 208 | # CONFIG_ACPI_BATTERY is not set |
137 | CONFIG_ACPI_BATTERY=y | 209 | # CONFIG_ACPI_BUTTON is not set |
138 | CONFIG_ACPI_BUTTON=y | 210 | # CONFIG_ACPI_VIDEO is not set |
139 | CONFIG_ACPI_FAN=y | 211 | # CONFIG_ACPI_HOTKEY is not set |
140 | CONFIG_ACPI_PROCESSOR=y | 212 | # CONFIG_ACPI_FAN is not set |
141 | CONFIG_ACPI_THERMAL=y | 213 | # CONFIG_ACPI_PROCESSOR is not set |
142 | # CONFIG_ACPI_ASUS is not set | 214 | # CONFIG_ACPI_ASUS is not set |
215 | # CONFIG_ACPI_IBM is not set | ||
143 | # CONFIG_ACPI_TOSHIBA is not set | 216 | # CONFIG_ACPI_TOSHIBA is not set |
217 | CONFIG_ACPI_BLACKLIST_YEAR=0 | ||
144 | # CONFIG_ACPI_DEBUG is not set | 218 | # CONFIG_ACPI_DEBUG is not set |
145 | CONFIG_ACPI_EC=y | 219 | CONFIG_ACPI_EC=y |
146 | CONFIG_ACPI_POWER=y | 220 | CONFIG_ACPI_POWER=y |
147 | CONFIG_ACPI_SYSTEM=y | 221 | CONFIG_ACPI_SYSTEM=y |
148 | # CONFIG_X86_PM_TIMER is not set | 222 | # CONFIG_X86_PM_TIMER is not set |
223 | # CONFIG_ACPI_CONTAINER is not set | ||
149 | 224 | ||
150 | # | 225 | # |
151 | # APM (Advanced Power Management) BIOS Support | 226 | # APM (Advanced Power Management) BIOS Support |
@@ -168,19 +243,18 @@ CONFIG_PCI_GOANY=y | |||
168 | CONFIG_PCI_BIOS=y | 243 | CONFIG_PCI_BIOS=y |
169 | CONFIG_PCI_DIRECT=y | 244 | CONFIG_PCI_DIRECT=y |
170 | CONFIG_PCI_MMCONFIG=y | 245 | CONFIG_PCI_MMCONFIG=y |
171 | # CONFIG_PCI_USE_VECTOR is not set | 246 | # CONFIG_PCIEPORTBUS is not set |
172 | CONFIG_PCI_LEGACY_PROC=y | 247 | # CONFIG_PCI_MSI is not set |
173 | CONFIG_PCI_NAMES=y | 248 | # CONFIG_PCI_LEGACY_PROC is not set |
174 | CONFIG_ISA=y | 249 | CONFIG_ISA_DMA_API=y |
175 | # CONFIG_EISA is not set | 250 | # CONFIG_ISA is not set |
176 | # CONFIG_MCA is not set | 251 | # CONFIG_MCA is not set |
177 | # CONFIG_SCx200 is not set | 252 | # CONFIG_SCx200 is not set |
178 | 253 | ||
179 | # | 254 | # |
180 | # PCMCIA/CardBus support | 255 | # PCCARD (PCMCIA/CardBus) support |
181 | # | 256 | # |
182 | # CONFIG_PCMCIA is not set | 257 | # CONFIG_PCCARD is not set |
183 | CONFIG_PCMCIA_PROBE=y | ||
184 | 258 | ||
185 | # | 259 | # |
186 | # PCI Hotplug Support | 260 | # PCI Hotplug Support |
@@ -191,8 +265,147 @@ CONFIG_PCMCIA_PROBE=y | |||
191 | # Executable file formats | 265 | # Executable file formats |
192 | # | 266 | # |
193 | CONFIG_BINFMT_ELF=y | 267 | CONFIG_BINFMT_ELF=y |
194 | CONFIG_BINFMT_AOUT=y | 268 | # CONFIG_BINFMT_AOUT is not set |
195 | CONFIG_BINFMT_MISC=y | 269 | # CONFIG_BINFMT_MISC is not set |
270 | |||
271 | # | ||
272 | # Networking | ||
273 | # | ||
274 | CONFIG_NET=y | ||
275 | |||
276 | # | ||
277 | # Networking options | ||
278 | # | ||
279 | # CONFIG_NETDEBUG is not set | ||
280 | CONFIG_PACKET=y | ||
281 | CONFIG_PACKET_MMAP=y | ||
282 | CONFIG_UNIX=y | ||
283 | # CONFIG_NET_KEY is not set | ||
284 | CONFIG_INET=y | ||
285 | # CONFIG_IP_MULTICAST is not set | ||
286 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
287 | CONFIG_IP_FIB_HASH=y | ||
288 | # CONFIG_IP_PNP is not set | ||
289 | # CONFIG_NET_IPIP is not set | ||
290 | # CONFIG_NET_IPGRE is not set | ||
291 | # CONFIG_ARPD is not set | ||
292 | # CONFIG_SYN_COOKIES is not set | ||
293 | # CONFIG_INET_AH is not set | ||
294 | # CONFIG_INET_ESP is not set | ||
295 | # CONFIG_INET_IPCOMP is not set | ||
296 | # CONFIG_INET_TUNNEL is not set | ||
297 | # CONFIG_INET_DIAG is not set | ||
298 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
299 | CONFIG_TCP_CONG_BIC=y | ||
300 | |||
301 | # | ||
302 | # IP: Virtual Server Configuration | ||
303 | # | ||
304 | # CONFIG_IP_VS is not set | ||
305 | # CONFIG_IPV6 is not set | ||
306 | CONFIG_NETFILTER=y | ||
307 | # CONFIG_NETFILTER_DEBUG is not set | ||
308 | |||
309 | # | ||
310 | # Core Netfilter Configuration | ||
311 | # | ||
312 | # CONFIG_NETFILTER_NETLINK is not set | ||
313 | CONFIG_NETFILTER_XTABLES=y | ||
314 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
315 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
316 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
317 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
318 | # CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set | ||
319 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
320 | # CONFIG_NETFILTER_XT_MATCH_HELPER is not set | ||
321 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
322 | CONFIG_NETFILTER_XT_MATCH_LIMIT=y | ||
323 | CONFIG_NETFILTER_XT_MATCH_MAC=y | ||
324 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
325 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
326 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
327 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
328 | CONFIG_NETFILTER_XT_MATCH_STATE=y | ||
329 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
330 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
331 | |||
332 | # | ||
333 | # IP: Netfilter Configuration | ||
334 | # | ||
335 | CONFIG_IP_NF_CONNTRACK=y | ||
336 | # CONFIG_IP_NF_CT_ACCT is not set | ||
337 | # CONFIG_IP_NF_CONNTRACK_MARK is not set | ||
338 | # CONFIG_IP_NF_CONNTRACK_EVENTS is not set | ||
339 | # CONFIG_IP_NF_CT_PROTO_SCTP is not set | ||
340 | CONFIG_IP_NF_FTP=y | ||
341 | # CONFIG_IP_NF_IRC is not set | ||
342 | # CONFIG_IP_NF_NETBIOS_NS is not set | ||
343 | # CONFIG_IP_NF_TFTP is not set | ||
344 | # CONFIG_IP_NF_AMANDA is not set | ||
345 | # CONFIG_IP_NF_PPTP is not set | ||
346 | # CONFIG_IP_NF_QUEUE is not set | ||
347 | CONFIG_IP_NF_IPTABLES=y | ||
348 | # CONFIG_IP_NF_MATCH_IPRANGE is not set | ||
349 | # CONFIG_IP_NF_MATCH_MULTIPORT is not set | ||
350 | # CONFIG_IP_NF_MATCH_TOS is not set | ||
351 | # CONFIG_IP_NF_MATCH_RECENT is not set | ||
352 | # CONFIG_IP_NF_MATCH_ECN is not set | ||
353 | # CONFIG_IP_NF_MATCH_DSCP is not set | ||
354 | # CONFIG_IP_NF_MATCH_AH_ESP is not set | ||
355 | # CONFIG_IP_NF_MATCH_TTL is not set | ||
356 | # CONFIG_IP_NF_MATCH_OWNER is not set | ||
357 | # CONFIG_IP_NF_MATCH_ADDRTYPE is not set | ||
358 | # CONFIG_IP_NF_MATCH_HASHLIMIT is not set | ||
359 | CONFIG_IP_NF_FILTER=y | ||
360 | # CONFIG_IP_NF_TARGET_REJECT is not set | ||
361 | CONFIG_IP_NF_TARGET_LOG=y | ||
362 | # CONFIG_IP_NF_TARGET_ULOG is not set | ||
363 | # CONFIG_IP_NF_TARGET_TCPMSS is not set | ||
364 | # CONFIG_IP_NF_NAT is not set | ||
365 | # CONFIG_IP_NF_MANGLE is not set | ||
366 | # CONFIG_IP_NF_RAW is not set | ||
367 | # CONFIG_IP_NF_ARPTABLES is not set | ||
368 | |||
369 | # | ||
370 | # DCCP Configuration (EXPERIMENTAL) | ||
371 | # | ||
372 | # CONFIG_IP_DCCP is not set | ||
373 | |||
374 | # | ||
375 | # SCTP Configuration (EXPERIMENTAL) | ||
376 | # | ||
377 | # CONFIG_IP_SCTP is not set | ||
378 | |||
379 | # | ||
380 | # TIPC Configuration (EXPERIMENTAL) | ||
381 | # | ||
382 | # CONFIG_TIPC is not set | ||
383 | # CONFIG_ATM is not set | ||
384 | # CONFIG_BRIDGE is not set | ||
385 | # CONFIG_VLAN_8021Q is not set | ||
386 | # CONFIG_DECNET is not set | ||
387 | # CONFIG_LLC2 is not set | ||
388 | # CONFIG_IPX is not set | ||
389 | # CONFIG_ATALK is not set | ||
390 | # CONFIG_X25 is not set | ||
391 | # CONFIG_LAPB is not set | ||
392 | # CONFIG_NET_DIVERT is not set | ||
393 | # CONFIG_ECONET is not set | ||
394 | # CONFIG_WAN_ROUTER is not set | ||
395 | |||
396 | # | ||
397 | # QoS and/or fair queueing | ||
398 | # | ||
399 | # CONFIG_NET_SCHED is not set | ||
400 | |||
401 | # | ||
402 | # Network testing | ||
403 | # | ||
404 | # CONFIG_NET_PKTGEN is not set | ||
405 | # CONFIG_HAMRADIO is not set | ||
406 | # CONFIG_IRDA is not set | ||
407 | # CONFIG_BT is not set | ||
408 | # CONFIG_IEEE80211 is not set | ||
196 | 409 | ||
197 | # | 410 | # |
198 | # Device Drivers | 411 | # Device Drivers |
@@ -201,7 +414,14 @@ CONFIG_BINFMT_MISC=y | |||
201 | # | 414 | # |
202 | # Generic Driver Options | 415 | # Generic Driver Options |
203 | # | 416 | # |
204 | CONFIG_FW_LOADER=m | 417 | CONFIG_STANDALONE=y |
418 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
419 | # CONFIG_FW_LOADER is not set | ||
420 | |||
421 | # | ||
422 | # Connector - unified userspace <-> kernelspace linker | ||
423 | # | ||
424 | # CONFIG_CONNECTOR is not set | ||
205 | 425 | ||
206 | # | 426 | # |
207 | # Memory Technology Devices (MTD) | 427 | # Memory Technology Devices (MTD) |
@@ -213,40 +433,36 @@ CONFIG_FW_LOADER=m | |||
213 | # | 433 | # |
214 | CONFIG_PARPORT=y | 434 | CONFIG_PARPORT=y |
215 | CONFIG_PARPORT_PC=y | 435 | CONFIG_PARPORT_PC=y |
216 | CONFIG_PARPORT_PC_CML1=y | ||
217 | # CONFIG_PARPORT_SERIAL is not set | 436 | # CONFIG_PARPORT_SERIAL is not set |
218 | # CONFIG_PARPORT_PC_FIFO is not set | 437 | # CONFIG_PARPORT_PC_FIFO is not set |
219 | # CONFIG_PARPORT_PC_SUPERIO is not set | 438 | # CONFIG_PARPORT_PC_SUPERIO is not set |
220 | # CONFIG_PARPORT_OTHER is not set | 439 | # CONFIG_PARPORT_GSC is not set |
221 | # CONFIG_PARPORT_1284 is not set | 440 | CONFIG_PARPORT_1284=y |
222 | 441 | ||
223 | # | 442 | # |
224 | # Plug and Play support | 443 | # Plug and Play support |
225 | # | 444 | # |
226 | CONFIG_PNP=y | 445 | # CONFIG_PNP is not set |
227 | # CONFIG_PNP_DEBUG is not set | ||
228 | |||
229 | # | ||
230 | # Protocols | ||
231 | # | ||
232 | # CONFIG_ISAPNP is not set | ||
233 | # CONFIG_PNPBIOS is not set | ||
234 | 446 | ||
235 | # | 447 | # |
236 | # Block devices | 448 | # Block devices |
237 | # | 449 | # |
238 | CONFIG_BLK_DEV_FD=y | 450 | # CONFIG_BLK_DEV_FD is not set |
239 | # CONFIG_BLK_DEV_XD is not set | ||
240 | # CONFIG_PARIDE is not set | 451 | # CONFIG_PARIDE is not set |
241 | # CONFIG_BLK_CPQ_DA is not set | 452 | # CONFIG_BLK_CPQ_DA is not set |
242 | # CONFIG_BLK_CPQ_CISS_DA is not set | 453 | # CONFIG_BLK_CPQ_CISS_DA is not set |
243 | # CONFIG_BLK_DEV_DAC960 is not set | 454 | # CONFIG_BLK_DEV_DAC960 is not set |
244 | # CONFIG_BLK_DEV_UMEM is not set | 455 | # CONFIG_BLK_DEV_UMEM is not set |
245 | # CONFIG_BLK_DEV_LOOP is not set | 456 | # CONFIG_BLK_DEV_COW_COMMON is not set |
457 | CONFIG_BLK_DEV_LOOP=y | ||
458 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
246 | # CONFIG_BLK_DEV_NBD is not set | 459 | # CONFIG_BLK_DEV_NBD is not set |
247 | # CONFIG_BLK_DEV_CARMEL is not set | 460 | # CONFIG_BLK_DEV_SX8 is not set |
461 | # CONFIG_BLK_DEV_UB is not set | ||
248 | # CONFIG_BLK_DEV_RAM is not set | 462 | # CONFIG_BLK_DEV_RAM is not set |
249 | CONFIG_LBD=y | 463 | CONFIG_BLK_DEV_RAM_COUNT=16 |
464 | # CONFIG_CDROM_PKTCDVD is not set | ||
465 | # CONFIG_ATA_OVER_ETH is not set | ||
250 | 466 | ||
251 | # | 467 | # |
252 | # ATA/ATAPI/MFM/RLL support | 468 | # ATA/ATAPI/MFM/RLL support |
@@ -257,34 +473,31 @@ CONFIG_BLK_DEV_IDE=y | |||
257 | # | 473 | # |
258 | # Please see Documentation/ide.txt for help/info on IDE drives | 474 | # Please see Documentation/ide.txt for help/info on IDE drives |
259 | # | 475 | # |
476 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
260 | # CONFIG_BLK_DEV_HD_IDE is not set | 477 | # CONFIG_BLK_DEV_HD_IDE is not set |
261 | CONFIG_BLK_DEV_IDEDISK=y | 478 | CONFIG_BLK_DEV_IDEDISK=y |
262 | CONFIG_IDEDISK_MULTI_MODE=y | 479 | # CONFIG_IDEDISK_MULTI_MODE is not set |
263 | CONFIG_BLK_DEV_IDECD=y | 480 | CONFIG_BLK_DEV_IDECD=y |
264 | # CONFIG_BLK_DEV_IDETAPE is not set | 481 | # CONFIG_BLK_DEV_IDETAPE is not set |
265 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | 482 | # CONFIG_BLK_DEV_IDEFLOPPY is not set |
266 | # CONFIG_BLK_DEV_IDESCSI is not set | 483 | # CONFIG_BLK_DEV_IDESCSI is not set |
267 | # CONFIG_IDE_TASK_IOCTL is not set | 484 | # CONFIG_IDE_TASK_IOCTL is not set |
268 | CONFIG_IDE_TASKFILE_IO=y | ||
269 | 485 | ||
270 | # | 486 | # |
271 | # IDE chipset support/bugfixes | 487 | # IDE chipset support/bugfixes |
272 | # | 488 | # |
273 | CONFIG_IDE_GENERIC=y | 489 | # CONFIG_IDE_GENERIC is not set |
274 | CONFIG_BLK_DEV_CMD640=y | 490 | # CONFIG_BLK_DEV_CMD640 is not set |
275 | # CONFIG_BLK_DEV_CMD640_ENHANCED is not set | ||
276 | # CONFIG_BLK_DEV_IDEPNP is not set | ||
277 | CONFIG_BLK_DEV_IDEPCI=y | 491 | CONFIG_BLK_DEV_IDEPCI=y |
278 | CONFIG_IDEPCI_SHARE_IRQ=y | 492 | CONFIG_IDEPCI_SHARE_IRQ=y |
279 | # CONFIG_BLK_DEV_OFFBOARD is not set | 493 | # CONFIG_BLK_DEV_OFFBOARD is not set |
280 | CONFIG_BLK_DEV_GENERIC=y | 494 | # CONFIG_BLK_DEV_GENERIC is not set |
281 | # CONFIG_BLK_DEV_OPTI621 is not set | 495 | # CONFIG_BLK_DEV_OPTI621 is not set |
282 | CONFIG_BLK_DEV_RZ1000=y | 496 | # CONFIG_BLK_DEV_RZ1000 is not set |
283 | CONFIG_BLK_DEV_IDEDMA_PCI=y | 497 | CONFIG_BLK_DEV_IDEDMA_PCI=y |
284 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set | 498 | # CONFIG_BLK_DEV_IDEDMA_FORCED is not set |
285 | CONFIG_IDEDMA_PCI_AUTO=y | 499 | CONFIG_IDEDMA_PCI_AUTO=y |
286 | # CONFIG_IDEDMA_ONLYDISK is not set | 500 | # CONFIG_IDEDMA_ONLYDISK is not set |
287 | CONFIG_BLK_DEV_ADMA=y | ||
288 | # CONFIG_BLK_DEV_AEC62XX is not set | 501 | # CONFIG_BLK_DEV_AEC62XX is not set |
289 | # CONFIG_BLK_DEV_ALI15X3 is not set | 502 | # CONFIG_BLK_DEV_ALI15X3 is not set |
290 | # CONFIG_BLK_DEV_AMD74XX is not set | 503 | # CONFIG_BLK_DEV_AMD74XX is not set |
@@ -294,10 +507,12 @@ CONFIG_BLK_DEV_ADMA=y | |||
294 | # CONFIG_BLK_DEV_CY82C693 is not set | 507 | # CONFIG_BLK_DEV_CY82C693 is not set |
295 | # CONFIG_BLK_DEV_CS5520 is not set | 508 | # CONFIG_BLK_DEV_CS5520 is not set |
296 | # CONFIG_BLK_DEV_CS5530 is not set | 509 | # CONFIG_BLK_DEV_CS5530 is not set |
510 | # CONFIG_BLK_DEV_CS5535 is not set | ||
297 | # CONFIG_BLK_DEV_HPT34X is not set | 511 | # CONFIG_BLK_DEV_HPT34X is not set |
298 | # CONFIG_BLK_DEV_HPT366 is not set | 512 | # CONFIG_BLK_DEV_HPT366 is not set |
299 | # CONFIG_BLK_DEV_SC1200 is not set | 513 | # CONFIG_BLK_DEV_SC1200 is not set |
300 | CONFIG_BLK_DEV_PIIX=y | 514 | # CONFIG_BLK_DEV_PIIX is not set |
515 | # CONFIG_BLK_DEV_IT821X is not set | ||
301 | # CONFIG_BLK_DEV_NS87415 is not set | 516 | # CONFIG_BLK_DEV_NS87415 is not set |
302 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | 517 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set |
303 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set | 518 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set |
@@ -306,9 +521,8 @@ CONFIG_BLK_DEV_PIIX=y | |||
306 | # CONFIG_BLK_DEV_SIS5513 is not set | 521 | # CONFIG_BLK_DEV_SIS5513 is not set |
307 | # CONFIG_BLK_DEV_SLC90E66 is not set | 522 | # CONFIG_BLK_DEV_SLC90E66 is not set |
308 | # CONFIG_BLK_DEV_TRM290 is not set | 523 | # CONFIG_BLK_DEV_TRM290 is not set |
309 | # CONFIG_BLK_DEV_VIA82CXXX is not set | 524 | CONFIG_BLK_DEV_VIA82CXXX=y |
310 | # CONFIG_IDE_ARM is not set | 525 | # CONFIG_IDE_ARM is not set |
311 | # CONFIG_IDE_CHIPSETS is not set | ||
312 | CONFIG_BLK_DEV_IDEDMA=y | 526 | CONFIG_BLK_DEV_IDEDMA=y |
313 | # CONFIG_IDEDMA_IVB is not set | 527 | # CONFIG_IDEDMA_IVB is not set |
314 | CONFIG_IDEDMA_AUTO=y | 528 | CONFIG_IDEDMA_AUTO=y |
@@ -317,8 +531,9 @@ CONFIG_IDEDMA_AUTO=y | |||
317 | # | 531 | # |
318 | # SCSI device support | 532 | # SCSI device support |
319 | # | 533 | # |
534 | # CONFIG_RAID_ATTRS is not set | ||
320 | CONFIG_SCSI=y | 535 | CONFIG_SCSI=y |
321 | CONFIG_SCSI_PROC_FS=y | 536 | # CONFIG_SCSI_PROC_FS is not set |
322 | 537 | ||
323 | # | 538 | # |
324 | # SCSI support type (disk, tape, CD-ROM) | 539 | # SCSI support type (disk, tape, CD-ROM) |
@@ -327,7 +542,8 @@ CONFIG_BLK_DEV_SD=y | |||
327 | # CONFIG_CHR_DEV_ST is not set | 542 | # CONFIG_CHR_DEV_ST is not set |
328 | # CONFIG_CHR_DEV_OSST is not set | 543 | # CONFIG_CHR_DEV_OSST is not set |
329 | # CONFIG_BLK_DEV_SR is not set | 544 | # CONFIG_BLK_DEV_SR is not set |
330 | CONFIG_CHR_DEV_SG=y | 545 | # CONFIG_CHR_DEV_SG is not set |
546 | # CONFIG_CHR_DEV_SCH is not set | ||
331 | 547 | ||
332 | # | 548 | # |
333 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | 549 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs |
@@ -341,79 +557,47 @@ CONFIG_CHR_DEV_SG=y | |||
341 | # | 557 | # |
342 | # CONFIG_SCSI_SPI_ATTRS is not set | 558 | # CONFIG_SCSI_SPI_ATTRS is not set |
343 | # CONFIG_SCSI_FC_ATTRS is not set | 559 | # CONFIG_SCSI_FC_ATTRS is not set |
560 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
561 | # CONFIG_SCSI_SAS_ATTRS is not set | ||
344 | 562 | ||
345 | # | 563 | # |
346 | # SCSI low-level drivers | 564 | # SCSI low-level drivers |
347 | # | 565 | # |
566 | # CONFIG_ISCSI_TCP is not set | ||
348 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 567 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
349 | # CONFIG_SCSI_7000FASST is not set | 568 | # CONFIG_SCSI_3W_9XXX is not set |
350 | # CONFIG_SCSI_ACARD is not set | 569 | # CONFIG_SCSI_ACARD is not set |
351 | # CONFIG_SCSI_AHA152X is not set | ||
352 | # CONFIG_SCSI_AHA1542 is not set | ||
353 | # CONFIG_SCSI_AACRAID is not set | 570 | # CONFIG_SCSI_AACRAID is not set |
354 | # CONFIG_SCSI_AIC7XXX is not set | 571 | # CONFIG_SCSI_AIC7XXX is not set |
355 | # CONFIG_SCSI_AIC7XXX_OLD is not set | 572 | # CONFIG_SCSI_AIC7XXX_OLD is not set |
356 | # CONFIG_SCSI_AIC79XX is not set | 573 | # CONFIG_SCSI_AIC79XX is not set |
357 | CONFIG_SCSI_DPT_I2O=m | 574 | # CONFIG_SCSI_DPT_I2O is not set |
358 | # CONFIG_SCSI_ADVANSYS is not set | 575 | # CONFIG_MEGARAID_NEWGEN is not set |
359 | # CONFIG_SCSI_IN2000 is not set | 576 | # CONFIG_MEGARAID_LEGACY is not set |
360 | # CONFIG_SCSI_MEGARAID is not set | 577 | # CONFIG_MEGARAID_SAS is not set |
361 | CONFIG_SCSI_SATA=y | 578 | # CONFIG_SCSI_SATA is not set |
362 | # CONFIG_SCSI_SATA_SVW is not set | ||
363 | CONFIG_SCSI_ATA_PIIX=y | ||
364 | # CONFIG_SCSI_SATA_PROMISE is not set | ||
365 | CONFIG_SCSI_SATA_SX4=m | ||
366 | # CONFIG_SCSI_SATA_SIL is not set | ||
367 | CONFIG_SCSI_SATA_SIS=m | ||
368 | # CONFIG_SCSI_SATA_VIA is not set | ||
369 | # CONFIG_SCSI_SATA_VITESSE is not set | ||
370 | # CONFIG_SCSI_BUSLOGIC is not set | 579 | # CONFIG_SCSI_BUSLOGIC is not set |
371 | # CONFIG_SCSI_CPQFCTS is not set | ||
372 | # CONFIG_SCSI_DMX3191D is not set | 580 | # CONFIG_SCSI_DMX3191D is not set |
373 | # CONFIG_SCSI_DTC3280 is not set | ||
374 | # CONFIG_SCSI_EATA is not set | 581 | # CONFIG_SCSI_EATA is not set |
375 | # CONFIG_SCSI_EATA_PIO is not set | ||
376 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | 582 | # CONFIG_SCSI_FUTURE_DOMAIN is not set |
377 | # CONFIG_SCSI_GDTH is not set | 583 | # CONFIG_SCSI_GDTH is not set |
378 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
379 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
380 | # CONFIG_SCSI_IPS is not set | 584 | # CONFIG_SCSI_IPS is not set |
585 | # CONFIG_SCSI_INITIO is not set | ||
381 | # CONFIG_SCSI_INIA100 is not set | 586 | # CONFIG_SCSI_INIA100 is not set |
382 | # CONFIG_SCSI_PPA is not set | 587 | # CONFIG_SCSI_PPA is not set |
383 | # CONFIG_SCSI_IMM is not set | 588 | # CONFIG_SCSI_IMM is not set |
384 | # CONFIG_SCSI_NCR53C406A is not set | ||
385 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 589 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
386 | CONFIG_SCSI_IPR=m | 590 | # CONFIG_SCSI_IPR is not set |
387 | # CONFIG_SCSI_IPR_TRACE is not set | ||
388 | # CONFIG_SCSI_IPR_DUMP is not set | ||
389 | # CONFIG_SCSI_PAS16 is not set | ||
390 | # CONFIG_SCSI_PSI240I is not set | ||
391 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
392 | # CONFIG_SCSI_QLOGIC_ISP is not set | ||
393 | # CONFIG_SCSI_QLOGIC_FC is not set | 591 | # CONFIG_SCSI_QLOGIC_FC is not set |
394 | # CONFIG_SCSI_QLOGIC_1280 is not set | 592 | # CONFIG_SCSI_QLOGIC_1280 is not set |
395 | CONFIG_SCSI_QLA2XXX=y | 593 | # CONFIG_SCSI_QLA_FC is not set |
396 | # CONFIG_SCSI_QLA21XX is not set | 594 | # CONFIG_SCSI_LPFC is not set |
397 | # CONFIG_SCSI_QLA22XX is not set | ||
398 | # CONFIG_SCSI_QLA2300 is not set | ||
399 | # CONFIG_SCSI_QLA2322 is not set | ||
400 | # CONFIG_SCSI_QLA6312 is not set | ||
401 | # CONFIG_SCSI_QLA6322 is not set | ||
402 | # CONFIG_SCSI_SYM53C416 is not set | ||
403 | # CONFIG_SCSI_DC395x is not set | 595 | # CONFIG_SCSI_DC395x is not set |
404 | # CONFIG_SCSI_DC390T is not set | 596 | # CONFIG_SCSI_DC390T is not set |
405 | # CONFIG_SCSI_T128 is not set | ||
406 | # CONFIG_SCSI_U14_34F is not set | ||
407 | # CONFIG_SCSI_ULTRASTOR is not set | ||
408 | # CONFIG_SCSI_NSP32 is not set | 597 | # CONFIG_SCSI_NSP32 is not set |
409 | # CONFIG_SCSI_DEBUG is not set | 598 | # CONFIG_SCSI_DEBUG is not set |
410 | 599 | ||
411 | # | 600 | # |
412 | # Old CD-ROM drivers (not SCSI, not IDE) | ||
413 | # | ||
414 | # CONFIG_CD_NO_IDESCSI is not set | ||
415 | |||
416 | # | ||
417 | # Multi-device support (RAID and LVM) | 601 | # Multi-device support (RAID and LVM) |
418 | # | 602 | # |
419 | # CONFIG_MD is not set | 603 | # CONFIG_MD is not set |
@@ -422,37 +606,14 @@ CONFIG_SCSI_QLA2XXX=y | |||
422 | # Fusion MPT device support | 606 | # Fusion MPT device support |
423 | # | 607 | # |
424 | # CONFIG_FUSION is not set | 608 | # CONFIG_FUSION is not set |
609 | # CONFIG_FUSION_SPI is not set | ||
610 | # CONFIG_FUSION_FC is not set | ||
611 | # CONFIG_FUSION_SAS is not set | ||
425 | 612 | ||
426 | # | 613 | # |
427 | # IEEE 1394 (FireWire) support | 614 | # IEEE 1394 (FireWire) support |
428 | # | 615 | # |
429 | CONFIG_IEEE1394=y | 616 | # CONFIG_IEEE1394 is not set |
430 | |||
431 | # | ||
432 | # Subsystem Options | ||
433 | # | ||
434 | # CONFIG_IEEE1394_VERBOSEDEBUG is not set | ||
435 | # CONFIG_IEEE1394_OUI_DB is not set | ||
436 | # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set | ||
437 | |||
438 | # | ||
439 | # Device Drivers | ||
440 | # | ||
441 | |||
442 | # | ||
443 | # Texas Instruments PCILynx requires I2C | ||
444 | # | ||
445 | CONFIG_IEEE1394_OHCI1394=y | ||
446 | |||
447 | # | ||
448 | # Protocol Drivers | ||
449 | # | ||
450 | # CONFIG_IEEE1394_VIDEO1394 is not set | ||
451 | # CONFIG_IEEE1394_SBP2 is not set | ||
452 | # CONFIG_IEEE1394_ETH1394 is not set | ||
453 | # CONFIG_IEEE1394_DV1394 is not set | ||
454 | CONFIG_IEEE1394_RAWIO=y | ||
455 | # CONFIG_IEEE1394_CMP is not set | ||
456 | 617 | ||
457 | # | 618 | # |
458 | # I2O device support | 619 | # I2O device support |
@@ -460,130 +621,13 @@ CONFIG_IEEE1394_RAWIO=y | |||
460 | # CONFIG_I2O is not set | 621 | # CONFIG_I2O is not set |
461 | 622 | ||
462 | # | 623 | # |
463 | # Networking support | 624 | # Network device support |
464 | # | ||
465 | CONFIG_NET=y | ||
466 | |||
467 | # | ||
468 | # Networking options | ||
469 | # | ||
470 | CONFIG_PACKET=y | ||
471 | # CONFIG_PACKET_MMAP is not set | ||
472 | # CONFIG_NETLINK_DEV is not set | ||
473 | CONFIG_UNIX=y | ||
474 | # CONFIG_NET_KEY is not set | ||
475 | CONFIG_INET=y | ||
476 | CONFIG_IP_MULTICAST=y | ||
477 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
478 | # CONFIG_IP_PNP is not set | ||
479 | # CONFIG_NET_IPIP is not set | ||
480 | # CONFIG_NET_IPGRE is not set | ||
481 | # CONFIG_IP_MROUTE is not set | ||
482 | # CONFIG_ARPD is not set | ||
483 | # CONFIG_SYN_COOKIES is not set | ||
484 | # CONFIG_INET_AH is not set | ||
485 | # CONFIG_INET_ESP is not set | ||
486 | # CONFIG_INET_IPCOMP is not set | ||
487 | |||
488 | # | ||
489 | # IP: Virtual Server Configuration | ||
490 | # | ||
491 | # CONFIG_IP_VS is not set | ||
492 | # CONFIG_IPV6 is not set | ||
493 | CONFIG_NETFILTER=y | ||
494 | # CONFIG_NETFILTER_DEBUG is not set | ||
495 | |||
496 | # | ||
497 | # IP: Netfilter Configuration | ||
498 | # | 625 | # |
499 | CONFIG_IP_NF_CONNTRACK=y | ||
500 | # CONFIG_IP_NF_FTP is not set | ||
501 | # CONFIG_IP_NF_IRC is not set | ||
502 | # CONFIG_IP_NF_TFTP is not set | ||
503 | # CONFIG_IP_NF_AMANDA is not set | ||
504 | CONFIG_IP_NF_QUEUE=y | ||
505 | CONFIG_IP_NF_IPTABLES=y | ||
506 | CONFIG_IP_NF_MATCH_LIMIT=y | ||
507 | CONFIG_IP_NF_MATCH_IPRANGE=y | ||
508 | CONFIG_IP_NF_MATCH_MAC=y | ||
509 | CONFIG_IP_NF_MATCH_PKTTYPE=y | ||
510 | CONFIG_IP_NF_MATCH_MARK=y | ||
511 | CONFIG_IP_NF_MATCH_MULTIPORT=y | ||
512 | CONFIG_IP_NF_MATCH_TOS=y | ||
513 | CONFIG_IP_NF_MATCH_RECENT=y | ||
514 | CONFIG_IP_NF_MATCH_ECN=y | ||
515 | CONFIG_IP_NF_MATCH_DSCP=y | ||
516 | CONFIG_IP_NF_MATCH_AH_ESP=y | ||
517 | CONFIG_IP_NF_MATCH_LENGTH=y | ||
518 | CONFIG_IP_NF_MATCH_TTL=y | ||
519 | CONFIG_IP_NF_MATCH_TCPMSS=y | ||
520 | CONFIG_IP_NF_MATCH_HELPER=y | ||
521 | CONFIG_IP_NF_MATCH_STATE=y | ||
522 | CONFIG_IP_NF_MATCH_CONNTRACK=y | ||
523 | CONFIG_IP_NF_MATCH_OWNER=y | ||
524 | CONFIG_IP_NF_FILTER=y | ||
525 | CONFIG_IP_NF_TARGET_REJECT=y | ||
526 | CONFIG_IP_NF_NAT=y | ||
527 | CONFIG_IP_NF_NAT_NEEDED=y | ||
528 | CONFIG_IP_NF_TARGET_MASQUERADE=y | ||
529 | CONFIG_IP_NF_TARGET_REDIRECT=y | ||
530 | CONFIG_IP_NF_TARGET_NETMAP=y | ||
531 | CONFIG_IP_NF_TARGET_SAME=y | ||
532 | # CONFIG_IP_NF_NAT_SNMP_BASIC is not set | ||
533 | CONFIG_IP_NF_MANGLE=y | ||
534 | CONFIG_IP_NF_TARGET_TOS=y | ||
535 | CONFIG_IP_NF_TARGET_ECN=y | ||
536 | CONFIG_IP_NF_TARGET_DSCP=y | ||
537 | CONFIG_IP_NF_TARGET_MARK=y | ||
538 | CONFIG_IP_NF_TARGET_CLASSIFY=y | ||
539 | CONFIG_IP_NF_TARGET_LOG=y | ||
540 | CONFIG_IP_NF_TARGET_ULOG=y | ||
541 | CONFIG_IP_NF_TARGET_TCPMSS=y | ||
542 | CONFIG_IP_NF_ARPTABLES=y | ||
543 | CONFIG_IP_NF_ARPFILTER=y | ||
544 | CONFIG_IP_NF_ARP_MANGLE=y | ||
545 | CONFIG_IP_NF_TARGET_NOTRACK=m | ||
546 | CONFIG_IP_NF_RAW=m | ||
547 | |||
548 | # | ||
549 | # SCTP Configuration (EXPERIMENTAL) | ||
550 | # | ||
551 | # CONFIG_IP_SCTP is not set | ||
552 | # CONFIG_ATM is not set | ||
553 | # CONFIG_BRIDGE is not set | ||
554 | # CONFIG_VLAN_8021Q is not set | ||
555 | # CONFIG_DECNET is not set | ||
556 | # CONFIG_LLC2 is not set | ||
557 | # CONFIG_IPX is not set | ||
558 | # CONFIG_ATALK is not set | ||
559 | # CONFIG_X25 is not set | ||
560 | # CONFIG_LAPB is not set | ||
561 | # CONFIG_NET_DIVERT is not set | ||
562 | # CONFIG_ECONET is not set | ||
563 | # CONFIG_WAN_ROUTER is not set | ||
564 | # CONFIG_NET_FASTROUTE is not set | ||
565 | # CONFIG_NET_HW_FLOWCONTROL is not set | ||
566 | |||
567 | # | ||
568 | # QoS and/or fair queueing | ||
569 | # | ||
570 | # CONFIG_NET_SCHED is not set | ||
571 | |||
572 | # | ||
573 | # Network testing | ||
574 | # | ||
575 | # CONFIG_NET_PKTGEN is not set | ||
576 | # CONFIG_NETPOLL is not set | ||
577 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
578 | # CONFIG_HAMRADIO is not set | ||
579 | # CONFIG_IRDA is not set | ||
580 | # CONFIG_BT is not set | ||
581 | CONFIG_NETDEVICES=y | 626 | CONFIG_NETDEVICES=y |
582 | CONFIG_DUMMY=m | 627 | # CONFIG_DUMMY is not set |
583 | # CONFIG_BONDING is not set | 628 | # CONFIG_BONDING is not set |
584 | # CONFIG_EQUALIZER is not set | 629 | # CONFIG_EQUALIZER is not set |
585 | # CONFIG_TUN is not set | 630 | # CONFIG_TUN is not set |
586 | # CONFIG_NET_SB1000 is not set | ||
587 | 631 | ||
588 | # | 632 | # |
589 | # ARCnet devices | 633 | # ARCnet devices |
@@ -591,46 +635,39 @@ CONFIG_DUMMY=m | |||
591 | # CONFIG_ARCNET is not set | 635 | # CONFIG_ARCNET is not set |
592 | 636 | ||
593 | # | 637 | # |
638 | # PHY device support | ||
639 | # | ||
640 | # CONFIG_PHYLIB is not set | ||
641 | |||
642 | # | ||
594 | # Ethernet (10 or 100Mbit) | 643 | # Ethernet (10 or 100Mbit) |
595 | # | 644 | # |
596 | CONFIG_NET_ETHERNET=y | 645 | CONFIG_NET_ETHERNET=y |
597 | CONFIG_MII=y | 646 | CONFIG_MII=y |
598 | # CONFIG_HAPPYMEAL is not set | 647 | # CONFIG_HAPPYMEAL is not set |
599 | # CONFIG_SUNGEM is not set | 648 | # CONFIG_SUNGEM is not set |
649 | # CONFIG_CASSINI is not set | ||
600 | # CONFIG_NET_VENDOR_3COM is not set | 650 | # CONFIG_NET_VENDOR_3COM is not set |
601 | # CONFIG_LANCE is not set | ||
602 | # CONFIG_NET_VENDOR_SMC is not set | ||
603 | # CONFIG_NET_VENDOR_RACAL is not set | ||
604 | 651 | ||
605 | # | 652 | # |
606 | # Tulip family network device support | 653 | # Tulip family network device support |
607 | # | 654 | # |
608 | # CONFIG_NET_TULIP is not set | 655 | # CONFIG_NET_TULIP is not set |
609 | # CONFIG_AT1700 is not set | ||
610 | # CONFIG_DEPCA is not set | ||
611 | # CONFIG_HP100 is not set | 656 | # CONFIG_HP100 is not set |
612 | # CONFIG_NET_ISA is not set | ||
613 | CONFIG_NET_PCI=y | 657 | CONFIG_NET_PCI=y |
614 | # CONFIG_PCNET32 is not set | 658 | # CONFIG_PCNET32 is not set |
615 | # CONFIG_AMD8111_ETH is not set | 659 | # CONFIG_AMD8111_ETH is not set |
616 | # CONFIG_ADAPTEC_STARFIRE is not set | 660 | # CONFIG_ADAPTEC_STARFIRE is not set |
617 | # CONFIG_AC3200 is not set | ||
618 | # CONFIG_APRICOT is not set | ||
619 | # CONFIG_B44 is not set | 661 | # CONFIG_B44 is not set |
620 | # CONFIG_FORCEDETH is not set | 662 | # CONFIG_FORCEDETH is not set |
621 | # CONFIG_CS89x0 is not set | ||
622 | # CONFIG_DGRS is not set | 663 | # CONFIG_DGRS is not set |
623 | # CONFIG_EEPRO100 is not set | 664 | # CONFIG_EEPRO100 is not set |
624 | # CONFIG_E100 is not set | 665 | CONFIG_E100=y |
625 | # CONFIG_FEALNX is not set | 666 | # CONFIG_FEALNX is not set |
626 | # CONFIG_NATSEMI is not set | 667 | # CONFIG_NATSEMI is not set |
627 | # CONFIG_NE2K_PCI is not set | 668 | # CONFIG_NE2K_PCI is not set |
628 | # CONFIG_8139CP is not set | 669 | # CONFIG_8139CP is not set |
629 | CONFIG_8139TOO=y | 670 | # CONFIG_8139TOO is not set |
630 | CONFIG_8139TOO_PIO=y | ||
631 | # CONFIG_8139TOO_TUNE_TWISTER is not set | ||
632 | # CONFIG_8139TOO_8129 is not set | ||
633 | # CONFIG_8139_OLD_RX_RESET is not set | ||
634 | # CONFIG_SIS900 is not set | 671 | # CONFIG_SIS900 is not set |
635 | # CONFIG_EPIC100 is not set | 672 | # CONFIG_EPIC100 is not set |
636 | # CONFIG_SUNDANCE is not set | 673 | # CONFIG_SUNDANCE is not set |
@@ -644,21 +681,24 @@ CONFIG_8139TOO_PIO=y | |||
644 | # CONFIG_ACENIC is not set | 681 | # CONFIG_ACENIC is not set |
645 | # CONFIG_DL2K is not set | 682 | # CONFIG_DL2K is not set |
646 | # CONFIG_E1000 is not set | 683 | # CONFIG_E1000 is not set |
647 | # CONFIG_E1000_NAPI is not set | ||
648 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
649 | # CONFIG_NS83820 is not set | 684 | # CONFIG_NS83820 is not set |
650 | # CONFIG_HAMACHI is not set | 685 | # CONFIG_HAMACHI is not set |
651 | # CONFIG_YELLOWFIN is not set | 686 | # CONFIG_YELLOWFIN is not set |
652 | # CONFIG_R8169 is not set | 687 | # CONFIG_R8169 is not set |
688 | # CONFIG_SIS190 is not set | ||
689 | # CONFIG_SKGE is not set | ||
690 | # CONFIG_SKY2 is not set | ||
653 | # CONFIG_SK98LIN is not set | 691 | # CONFIG_SK98LIN is not set |
692 | # CONFIG_VIA_VELOCITY is not set | ||
654 | # CONFIG_TIGON3 is not set | 693 | # CONFIG_TIGON3 is not set |
694 | # CONFIG_BNX2 is not set | ||
655 | 695 | ||
656 | # | 696 | # |
657 | # Ethernet (10000 Mbit) | 697 | # Ethernet (10000 Mbit) |
658 | # | 698 | # |
699 | # CONFIG_CHELSIO_T1 is not set | ||
659 | # CONFIG_IXGB is not set | 700 | # CONFIG_IXGB is not set |
660 | CONFIG_S2IO=m | 701 | # CONFIG_S2IO is not set |
661 | # CONFIG_S2IO_NAPI is not set | ||
662 | 702 | ||
663 | # | 703 | # |
664 | # Token Ring devices | 704 | # Token Ring devices |
@@ -682,6 +722,8 @@ CONFIG_S2IO=m | |||
682 | # CONFIG_NET_FC is not set | 722 | # CONFIG_NET_FC is not set |
683 | # CONFIG_SHAPER is not set | 723 | # CONFIG_SHAPER is not set |
684 | # CONFIG_NETCONSOLE is not set | 724 | # CONFIG_NETCONSOLE is not set |
725 | # CONFIG_NETPOLL is not set | ||
726 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
685 | 727 | ||
686 | # | 728 | # |
687 | # ISDN subsystem | 729 | # ISDN subsystem |
@@ -703,26 +745,14 @@ CONFIG_INPUT=y | |||
703 | # | 745 | # |
704 | CONFIG_INPUT_MOUSEDEV=y | 746 | CONFIG_INPUT_MOUSEDEV=y |
705 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | 747 | CONFIG_INPUT_MOUSEDEV_PSAUX=y |
706 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | 748 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1280 |
707 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | 749 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1024 |
708 | # CONFIG_INPUT_JOYDEV is not set | 750 | # CONFIG_INPUT_JOYDEV is not set |
709 | # CONFIG_INPUT_TSDEV is not set | 751 | # CONFIG_INPUT_TSDEV is not set |
710 | # CONFIG_INPUT_EVDEV is not set | 752 | CONFIG_INPUT_EVDEV=y |
711 | # CONFIG_INPUT_EVBUG is not set | 753 | # CONFIG_INPUT_EVBUG is not set |
712 | 754 | ||
713 | # | 755 | # |
714 | # Input I/O drivers | ||
715 | # | ||
716 | # CONFIG_GAMEPORT is not set | ||
717 | CONFIG_SOUND_GAMEPORT=y | ||
718 | CONFIG_SERIO=y | ||
719 | CONFIG_SERIO_I8042=y | ||
720 | # CONFIG_SERIO_SERPORT is not set | ||
721 | # CONFIG_SERIO_CT82C710 is not set | ||
722 | # CONFIG_SERIO_PARKBD is not set | ||
723 | # CONFIG_SERIO_PCIPS2 is not set | ||
724 | |||
725 | # | ||
726 | # Input Device Drivers | 756 | # Input Device Drivers |
727 | # | 757 | # |
728 | CONFIG_INPUT_KEYBOARD=y | 758 | CONFIG_INPUT_KEYBOARD=y |
@@ -734,15 +764,25 @@ CONFIG_KEYBOARD_ATKBD=y | |||
734 | CONFIG_INPUT_MOUSE=y | 764 | CONFIG_INPUT_MOUSE=y |
735 | CONFIG_MOUSE_PS2=y | 765 | CONFIG_MOUSE_PS2=y |
736 | # CONFIG_MOUSE_SERIAL is not set | 766 | # CONFIG_MOUSE_SERIAL is not set |
737 | # CONFIG_MOUSE_INPORT is not set | ||
738 | # CONFIG_MOUSE_LOGIBM is not set | ||
739 | # CONFIG_MOUSE_PC110PAD is not set | ||
740 | # CONFIG_MOUSE_VSXXXAA is not set | 767 | # CONFIG_MOUSE_VSXXXAA is not set |
741 | # CONFIG_INPUT_JOYSTICK is not set | 768 | # CONFIG_INPUT_JOYSTICK is not set |
742 | # CONFIG_INPUT_TOUCHSCREEN is not set | 769 | # CONFIG_INPUT_TOUCHSCREEN is not set |
743 | # CONFIG_INPUT_MISC is not set | 770 | # CONFIG_INPUT_MISC is not set |
744 | 771 | ||
745 | # | 772 | # |
773 | # Hardware I/O ports | ||
774 | # | ||
775 | CONFIG_SERIO=y | ||
776 | CONFIG_SERIO_I8042=y | ||
777 | # CONFIG_SERIO_SERPORT is not set | ||
778 | # CONFIG_SERIO_CT82C710 is not set | ||
779 | # CONFIG_SERIO_PARKBD is not set | ||
780 | # CONFIG_SERIO_PCIPS2 is not set | ||
781 | CONFIG_SERIO_LIBPS2=y | ||
782 | # CONFIG_SERIO_RAW is not set | ||
783 | # CONFIG_GAMEPORT is not set | ||
784 | |||
785 | # | ||
746 | # Character devices | 786 | # Character devices |
747 | # | 787 | # |
748 | CONFIG_VT=y | 788 | CONFIG_VT=y |
@@ -757,12 +797,14 @@ CONFIG_SERIAL_8250=y | |||
757 | # CONFIG_SERIAL_8250_CONSOLE is not set | 797 | # CONFIG_SERIAL_8250_CONSOLE is not set |
758 | # CONFIG_SERIAL_8250_ACPI is not set | 798 | # CONFIG_SERIAL_8250_ACPI is not set |
759 | CONFIG_SERIAL_8250_NR_UARTS=4 | 799 | CONFIG_SERIAL_8250_NR_UARTS=4 |
800 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
760 | # CONFIG_SERIAL_8250_EXTENDED is not set | 801 | # CONFIG_SERIAL_8250_EXTENDED is not set |
761 | 802 | ||
762 | # | 803 | # |
763 | # Non-8250 serial port support | 804 | # Non-8250 serial port support |
764 | # | 805 | # |
765 | CONFIG_SERIAL_CORE=y | 806 | CONFIG_SERIAL_CORE=y |
807 | # CONFIG_SERIAL_JSM is not set | ||
766 | CONFIG_UNIX98_PTYS=y | 808 | CONFIG_UNIX98_PTYS=y |
767 | CONFIG_LEGACY_PTYS=y | 809 | CONFIG_LEGACY_PTYS=y |
768 | CONFIG_LEGACY_PTY_COUNT=256 | 810 | CONFIG_LEGACY_PTY_COUNT=256 |
@@ -770,7 +812,6 @@ CONFIG_PRINTER=y | |||
770 | # CONFIG_LP_CONSOLE is not set | 812 | # CONFIG_LP_CONSOLE is not set |
771 | # CONFIG_PPDEV is not set | 813 | # CONFIG_PPDEV is not set |
772 | # CONFIG_TIPAR is not set | 814 | # CONFIG_TIPAR is not set |
773 | # CONFIG_QIC02_TAPE is not set | ||
774 | 815 | ||
775 | # | 816 | # |
776 | # IPMI | 817 | # IPMI |
@@ -782,9 +823,8 @@ CONFIG_PRINTER=y | |||
782 | # | 823 | # |
783 | # CONFIG_WATCHDOG is not set | 824 | # CONFIG_WATCHDOG is not set |
784 | # CONFIG_HW_RANDOM is not set | 825 | # CONFIG_HW_RANDOM is not set |
785 | # CONFIG_NVRAM is not set | 826 | CONFIG_NVRAM=y |
786 | # CONFIG_RTC is not set | 827 | CONFIG_RTC=y |
787 | # CONFIG_GEN_RTC is not set | ||
788 | # CONFIG_DTLK is not set | 828 | # CONFIG_DTLK is not set |
789 | # CONFIG_R3964 is not set | 829 | # CONFIG_R3964 is not set |
790 | # CONFIG_APPLICOM is not set | 830 | # CONFIG_APPLICOM is not set |
@@ -793,34 +833,149 @@ CONFIG_PRINTER=y | |||
793 | # | 833 | # |
794 | # Ftape, the floppy tape device driver | 834 | # Ftape, the floppy tape device driver |
795 | # | 835 | # |
836 | # CONFIG_FTAPE is not set | ||
796 | CONFIG_AGP=y | 837 | CONFIG_AGP=y |
797 | # CONFIG_AGP_ALI is not set | 838 | # CONFIG_AGP_ALI is not set |
798 | # CONFIG_AGP_ATI is not set | 839 | # CONFIG_AGP_ATI is not set |
799 | # CONFIG_AGP_AMD is not set | 840 | # CONFIG_AGP_AMD is not set |
800 | # CONFIG_AGP_AMD64 is not set | 841 | # CONFIG_AGP_AMD64 is not set |
801 | CONFIG_AGP_INTEL=y | 842 | # CONFIG_AGP_INTEL is not set |
802 | # CONFIG_AGP_NVIDIA is not set | 843 | # CONFIG_AGP_NVIDIA is not set |
803 | # CONFIG_AGP_SIS is not set | 844 | # CONFIG_AGP_SIS is not set |
804 | # CONFIG_AGP_SWORKS is not set | 845 | # CONFIG_AGP_SWORKS is not set |
805 | # CONFIG_AGP_VIA is not set | 846 | CONFIG_AGP_VIA=y |
806 | # CONFIG_AGP_EFFICEON is not set | 847 | # CONFIG_AGP_EFFICEON is not set |
807 | CONFIG_DRM=y | 848 | CONFIG_DRM=y |
808 | # CONFIG_DRM_TDFX is not set | 849 | # CONFIG_DRM_TDFX is not set |
809 | # CONFIG_DRM_GAMMA is not set | ||
810 | # CONFIG_DRM_R128 is not set | 850 | # CONFIG_DRM_R128 is not set |
811 | # CONFIG_DRM_RADEON is not set | 851 | CONFIG_DRM_RADEON=y |
812 | # CONFIG_DRM_I810 is not set | ||
813 | CONFIG_DRM_I830=y | ||
814 | # CONFIG_DRM_MGA is not set | 852 | # CONFIG_DRM_MGA is not set |
815 | # CONFIG_DRM_SIS is not set | 853 | # CONFIG_DRM_SIS is not set |
854 | # CONFIG_DRM_VIA is not set | ||
855 | # CONFIG_DRM_SAVAGE is not set | ||
816 | # CONFIG_MWAVE is not set | 856 | # CONFIG_MWAVE is not set |
857 | # CONFIG_CS5535_GPIO is not set | ||
817 | # CONFIG_RAW_DRIVER is not set | 858 | # CONFIG_RAW_DRIVER is not set |
859 | # CONFIG_HPET is not set | ||
818 | # CONFIG_HANGCHECK_TIMER is not set | 860 | # CONFIG_HANGCHECK_TIMER is not set |
819 | 861 | ||
820 | # | 862 | # |
863 | # TPM devices | ||
864 | # | ||
865 | # CONFIG_TCG_TPM is not set | ||
866 | # CONFIG_TELCLOCK is not set | ||
867 | |||
868 | # | ||
821 | # I2C support | 869 | # I2C support |
822 | # | 870 | # |
823 | # CONFIG_I2C is not set | 871 | CONFIG_I2C=y |
872 | CONFIG_I2C_CHARDEV=y | ||
873 | |||
874 | # | ||
875 | # I2C Algorithms | ||
876 | # | ||
877 | CONFIG_I2C_ALGOBIT=y | ||
878 | # CONFIG_I2C_ALGOPCF is not set | ||
879 | # CONFIG_I2C_ALGOPCA is not set | ||
880 | |||
881 | # | ||
882 | # I2C Hardware Bus support | ||
883 | # | ||
884 | # CONFIG_I2C_ALI1535 is not set | ||
885 | # CONFIG_I2C_ALI1563 is not set | ||
886 | # CONFIG_I2C_ALI15X3 is not set | ||
887 | # CONFIG_I2C_AMD756 is not set | ||
888 | # CONFIG_I2C_AMD8111 is not set | ||
889 | # CONFIG_I2C_I801 is not set | ||
890 | # CONFIG_I2C_I810 is not set | ||
891 | # CONFIG_I2C_PIIX4 is not set | ||
892 | CONFIG_I2C_ISA=y | ||
893 | # CONFIG_I2C_NFORCE2 is not set | ||
894 | # CONFIG_I2C_PARPORT is not set | ||
895 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
896 | # CONFIG_I2C_PROSAVAGE is not set | ||
897 | # CONFIG_I2C_SAVAGE4 is not set | ||
898 | # CONFIG_SCx200_ACB is not set | ||
899 | # CONFIG_I2C_SIS5595 is not set | ||
900 | # CONFIG_I2C_SIS630 is not set | ||
901 | # CONFIG_I2C_SIS96X is not set | ||
902 | # CONFIG_I2C_STUB is not set | ||
903 | # CONFIG_I2C_VIA is not set | ||
904 | CONFIG_I2C_VIAPRO=y | ||
905 | # CONFIG_I2C_VOODOO3 is not set | ||
906 | # CONFIG_I2C_PCA_ISA is not set | ||
907 | |||
908 | # | ||
909 | # Miscellaneous I2C Chip support | ||
910 | # | ||
911 | # CONFIG_SENSORS_DS1337 is not set | ||
912 | # CONFIG_SENSORS_DS1374 is not set | ||
913 | # CONFIG_SENSORS_EEPROM is not set | ||
914 | # CONFIG_SENSORS_PCF8574 is not set | ||
915 | # CONFIG_SENSORS_PCA9539 is not set | ||
916 | # CONFIG_SENSORS_PCF8591 is not set | ||
917 | # CONFIG_SENSORS_RTC8564 is not set | ||
918 | # CONFIG_SENSORS_MAX6875 is not set | ||
919 | # CONFIG_RTC_X1205_I2C is not set | ||
920 | # CONFIG_I2C_DEBUG_CORE is not set | ||
921 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
922 | # CONFIG_I2C_DEBUG_BUS is not set | ||
923 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
924 | |||
925 | # | ||
926 | # SPI support | ||
927 | # | ||
928 | # CONFIG_SPI is not set | ||
929 | # CONFIG_SPI_MASTER is not set | ||
930 | |||
931 | # | ||
932 | # Dallas's 1-wire bus | ||
933 | # | ||
934 | # CONFIG_W1 is not set | ||
935 | |||
936 | # | ||
937 | # Hardware Monitoring support | ||
938 | # | ||
939 | CONFIG_HWMON=y | ||
940 | CONFIG_HWMON_VID=y | ||
941 | # CONFIG_SENSORS_ADM1021 is not set | ||
942 | # CONFIG_SENSORS_ADM1025 is not set | ||
943 | # CONFIG_SENSORS_ADM1026 is not set | ||
944 | # CONFIG_SENSORS_ADM1031 is not set | ||
945 | # CONFIG_SENSORS_ADM9240 is not set | ||
946 | # CONFIG_SENSORS_ASB100 is not set | ||
947 | # CONFIG_SENSORS_ATXP1 is not set | ||
948 | # CONFIG_SENSORS_DS1621 is not set | ||
949 | # CONFIG_SENSORS_F71805F is not set | ||
950 | # CONFIG_SENSORS_FSCHER is not set | ||
951 | # CONFIG_SENSORS_FSCPOS is not set | ||
952 | # CONFIG_SENSORS_GL518SM is not set | ||
953 | # CONFIG_SENSORS_GL520SM is not set | ||
954 | CONFIG_SENSORS_IT87=y | ||
955 | # CONFIG_SENSORS_LM63 is not set | ||
956 | # CONFIG_SENSORS_LM75 is not set | ||
957 | # CONFIG_SENSORS_LM77 is not set | ||
958 | # CONFIG_SENSORS_LM78 is not set | ||
959 | # CONFIG_SENSORS_LM80 is not set | ||
960 | # CONFIG_SENSORS_LM83 is not set | ||
961 | # CONFIG_SENSORS_LM85 is not set | ||
962 | # CONFIG_SENSORS_LM87 is not set | ||
963 | # CONFIG_SENSORS_LM90 is not set | ||
964 | # CONFIG_SENSORS_LM92 is not set | ||
965 | # CONFIG_SENSORS_MAX1619 is not set | ||
966 | # CONFIG_SENSORS_PC87360 is not set | ||
967 | # CONFIG_SENSORS_SIS5595 is not set | ||
968 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
969 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
970 | # CONFIG_SENSORS_VIA686A is not set | ||
971 | # CONFIG_SENSORS_VT8231 is not set | ||
972 | # CONFIG_SENSORS_W83781D is not set | ||
973 | # CONFIG_SENSORS_W83792D is not set | ||
974 | # CONFIG_SENSORS_W83L785TS is not set | ||
975 | # CONFIG_SENSORS_W83627HF is not set | ||
976 | # CONFIG_SENSORS_W83627EHF is not set | ||
977 | # CONFIG_SENSORS_HDAPS is not set | ||
978 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
824 | 979 | ||
825 | # | 980 | # |
826 | # Misc devices | 981 | # Misc devices |
@@ -828,27 +983,118 @@ CONFIG_DRM_I830=y | |||
828 | # CONFIG_IBM_ASM is not set | 983 | # CONFIG_IBM_ASM is not set |
829 | 984 | ||
830 | # | 985 | # |
986 | # Multimedia Capabilities Port drivers | ||
987 | # | ||
988 | |||
989 | # | ||
831 | # Multimedia devices | 990 | # Multimedia devices |
832 | # | 991 | # |
833 | # CONFIG_VIDEO_DEV is not set | 992 | CONFIG_VIDEO_DEV=y |
993 | |||
994 | # | ||
995 | # Video For Linux | ||
996 | # | ||
997 | |||
998 | # | ||
999 | # Video Adapters | ||
1000 | # | ||
1001 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
1002 | # CONFIG_VIDEO_BT848 is not set | ||
1003 | # CONFIG_VIDEO_BWQCAM is not set | ||
1004 | # CONFIG_VIDEO_CQCAM is not set | ||
1005 | # CONFIG_VIDEO_W9966 is not set | ||
1006 | # CONFIG_VIDEO_CPIA is not set | ||
1007 | # CONFIG_VIDEO_SAA5246A is not set | ||
1008 | # CONFIG_VIDEO_SAA5249 is not set | ||
1009 | # CONFIG_TUNER_3036 is not set | ||
1010 | # CONFIG_VIDEO_STRADIS is not set | ||
1011 | # CONFIG_VIDEO_ZORAN is not set | ||
1012 | CONFIG_VIDEO_SAA7134=y | ||
1013 | # CONFIG_VIDEO_SAA7134_ALSA is not set | ||
1014 | # CONFIG_VIDEO_MXB is not set | ||
1015 | # CONFIG_VIDEO_DPC is not set | ||
1016 | # CONFIG_VIDEO_HEXIUM_ORION is not set | ||
1017 | # CONFIG_VIDEO_HEXIUM_GEMINI is not set | ||
1018 | # CONFIG_VIDEO_CX88 is not set | ||
1019 | # CONFIG_VIDEO_EM28XX is not set | ||
1020 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
1021 | # CONFIG_VIDEO_AUDIO_DECODER is not set | ||
1022 | # CONFIG_VIDEO_DECODER is not set | ||
1023 | |||
1024 | # | ||
1025 | # Radio Adapters | ||
1026 | # | ||
1027 | # CONFIG_RADIO_GEMTEK_PCI is not set | ||
1028 | # CONFIG_RADIO_MAXIRADIO is not set | ||
1029 | # CONFIG_RADIO_MAESTRO is not set | ||
834 | 1030 | ||
835 | # | 1031 | # |
836 | # Digital Video Broadcasting Devices | 1032 | # Digital Video Broadcasting Devices |
837 | # | 1033 | # |
838 | # CONFIG_DVB is not set | 1034 | # CONFIG_DVB is not set |
1035 | CONFIG_VIDEO_TUNER=y | ||
1036 | CONFIG_VIDEO_BUF=y | ||
1037 | CONFIG_VIDEO_IR=y | ||
839 | 1038 | ||
840 | # | 1039 | # |
841 | # Graphics support | 1040 | # Graphics support |
842 | # | 1041 | # |
843 | # CONFIG_FB is not set | 1042 | CONFIG_FB=y |
844 | # CONFIG_VIDEO_SELECT is not set | 1043 | CONFIG_FB_CFB_FILLRECT=y |
1044 | CONFIG_FB_CFB_COPYAREA=y | ||
1045 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
1046 | # CONFIG_FB_MACMODES is not set | ||
1047 | CONFIG_FB_MODE_HELPERS=y | ||
1048 | # CONFIG_FB_TILEBLITTING is not set | ||
1049 | # CONFIG_FB_CIRRUS is not set | ||
1050 | # CONFIG_FB_PM2 is not set | ||
1051 | # CONFIG_FB_CYBER2000 is not set | ||
1052 | # CONFIG_FB_ARC is not set | ||
1053 | # CONFIG_FB_ASILIANT is not set | ||
1054 | # CONFIG_FB_IMSTT is not set | ||
1055 | # CONFIG_FB_VGA16 is not set | ||
1056 | # CONFIG_FB_VESA is not set | ||
1057 | CONFIG_VIDEO_SELECT=y | ||
1058 | # CONFIG_FB_HGA is not set | ||
1059 | # CONFIG_FB_S1D13XXX is not set | ||
1060 | # CONFIG_FB_NVIDIA is not set | ||
1061 | # CONFIG_FB_RIVA is not set | ||
1062 | # CONFIG_FB_I810 is not set | ||
1063 | # CONFIG_FB_INTEL is not set | ||
1064 | # CONFIG_FB_MATROX is not set | ||
1065 | # CONFIG_FB_RADEON_OLD is not set | ||
1066 | CONFIG_FB_RADEON=y | ||
1067 | CONFIG_FB_RADEON_I2C=y | ||
1068 | # CONFIG_FB_RADEON_DEBUG is not set | ||
1069 | # CONFIG_FB_ATY128 is not set | ||
1070 | # CONFIG_FB_ATY is not set | ||
1071 | # CONFIG_FB_SAVAGE is not set | ||
1072 | # CONFIG_FB_SIS is not set | ||
1073 | # CONFIG_FB_NEOMAGIC is not set | ||
1074 | # CONFIG_FB_KYRO is not set | ||
1075 | # CONFIG_FB_3DFX is not set | ||
1076 | # CONFIG_FB_VOODOO1 is not set | ||
1077 | # CONFIG_FB_CYBLA is not set | ||
1078 | # CONFIG_FB_TRIDENT is not set | ||
1079 | # CONFIG_FB_GEODE is not set | ||
1080 | # CONFIG_FB_VIRTUAL is not set | ||
845 | 1081 | ||
846 | # | 1082 | # |
847 | # Console display driver support | 1083 | # Console display driver support |
848 | # | 1084 | # |
849 | CONFIG_VGA_CONSOLE=y | 1085 | CONFIG_VGA_CONSOLE=y |
850 | # CONFIG_MDA_CONSOLE is not set | ||
851 | CONFIG_DUMMY_CONSOLE=y | 1086 | CONFIG_DUMMY_CONSOLE=y |
1087 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
1088 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
1089 | # CONFIG_FONTS is not set | ||
1090 | CONFIG_FONT_8x8=y | ||
1091 | CONFIG_FONT_8x16=y | ||
1092 | |||
1093 | # | ||
1094 | # Logo configuration | ||
1095 | # | ||
1096 | # CONFIG_LOGO is not set | ||
1097 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
852 | 1098 | ||
853 | # | 1099 | # |
854 | # Sound | 1100 | # Sound |
@@ -864,10 +1110,13 @@ CONFIG_SND_PCM=y | |||
864 | CONFIG_SND_RAWMIDI=y | 1110 | CONFIG_SND_RAWMIDI=y |
865 | CONFIG_SND_SEQUENCER=y | 1111 | CONFIG_SND_SEQUENCER=y |
866 | # CONFIG_SND_SEQ_DUMMY is not set | 1112 | # CONFIG_SND_SEQ_DUMMY is not set |
867 | CONFIG_SND_OSSEMUL=y | 1113 | # CONFIG_SND_MIXER_OSS is not set |
868 | CONFIG_SND_MIXER_OSS=y | 1114 | # CONFIG_SND_PCM_OSS is not set |
869 | CONFIG_SND_PCM_OSS=y | 1115 | # CONFIG_SND_SEQUENCER_OSS is not set |
870 | CONFIG_SND_SEQUENCER_OSS=y | 1116 | CONFIG_SND_RTCTIMER=y |
1117 | CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y | ||
1118 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
1119 | # CONFIG_SND_SUPPORT_OLD_API is not set | ||
871 | # CONFIG_SND_VERBOSE_PRINTK is not set | 1120 | # CONFIG_SND_VERBOSE_PRINTK is not set |
872 | # CONFIG_SND_DEBUG is not set | 1121 | # CONFIG_SND_DEBUG is not set |
873 | 1122 | ||
@@ -875,6 +1124,8 @@ CONFIG_SND_SEQUENCER_OSS=y | |||
875 | # Generic devices | 1124 | # Generic devices |
876 | # | 1125 | # |
877 | CONFIG_SND_MPU401_UART=y | 1126 | CONFIG_SND_MPU401_UART=y |
1127 | CONFIG_SND_AC97_CODEC=y | ||
1128 | CONFIG_SND_AC97_BUS=y | ||
878 | # CONFIG_SND_DUMMY is not set | 1129 | # CONFIG_SND_DUMMY is not set |
879 | # CONFIG_SND_VIRMIDI is not set | 1130 | # CONFIG_SND_VIRMIDI is not set |
880 | # CONFIG_SND_MTPAV is not set | 1131 | # CONFIG_SND_MTPAV is not set |
@@ -882,74 +1133,57 @@ CONFIG_SND_MPU401_UART=y | |||
882 | # CONFIG_SND_MPU401 is not set | 1133 | # CONFIG_SND_MPU401 is not set |
883 | 1134 | ||
884 | # | 1135 | # |
885 | # ISA devices | ||
886 | # | ||
887 | # CONFIG_SND_AD1848 is not set | ||
888 | # CONFIG_SND_CS4231 is not set | ||
889 | # CONFIG_SND_CS4232 is not set | ||
890 | # CONFIG_SND_CS4236 is not set | ||
891 | # CONFIG_SND_ES1688 is not set | ||
892 | # CONFIG_SND_ES18XX is not set | ||
893 | # CONFIG_SND_GUSCLASSIC is not set | ||
894 | # CONFIG_SND_GUSEXTREME is not set | ||
895 | # CONFIG_SND_GUSMAX is not set | ||
896 | # CONFIG_SND_INTERWAVE is not set | ||
897 | # CONFIG_SND_INTERWAVE_STB is not set | ||
898 | # CONFIG_SND_OPTI92X_AD1848 is not set | ||
899 | # CONFIG_SND_OPTI92X_CS4231 is not set | ||
900 | # CONFIG_SND_OPTI93X is not set | ||
901 | # CONFIG_SND_SB8 is not set | ||
902 | # CONFIG_SND_SB16 is not set | ||
903 | # CONFIG_SND_SBAWE is not set | ||
904 | # CONFIG_SND_WAVEFRONT is not set | ||
905 | # CONFIG_SND_CMI8330 is not set | ||
906 | # CONFIG_SND_OPL3SA2 is not set | ||
907 | # CONFIG_SND_SGALAXY is not set | ||
908 | # CONFIG_SND_SSCAPE is not set | ||
909 | |||
910 | # | ||
911 | # PCI devices | 1136 | # PCI devices |
912 | # | 1137 | # |
913 | CONFIG_SND_AC97_CODEC=y | 1138 | # CONFIG_SND_AD1889 is not set |
1139 | # CONFIG_SND_ALS4000 is not set | ||
914 | # CONFIG_SND_ALI5451 is not set | 1140 | # CONFIG_SND_ALI5451 is not set |
915 | # CONFIG_SND_ATIIXP is not set | 1141 | # CONFIG_SND_ATIIXP is not set |
1142 | # CONFIG_SND_ATIIXP_MODEM is not set | ||
916 | # CONFIG_SND_AU8810 is not set | 1143 | # CONFIG_SND_AU8810 is not set |
917 | # CONFIG_SND_AU8820 is not set | 1144 | # CONFIG_SND_AU8820 is not set |
918 | # CONFIG_SND_AU8830 is not set | 1145 | # CONFIG_SND_AU8830 is not set |
919 | # CONFIG_SND_AZT3328 is not set | 1146 | # CONFIG_SND_AZT3328 is not set |
920 | # CONFIG_SND_BT87X is not set | 1147 | # CONFIG_SND_BT87X is not set |
921 | # CONFIG_SND_CS46XX is not set | 1148 | # CONFIG_SND_CA0106 is not set |
1149 | # CONFIG_SND_CMIPCI is not set | ||
922 | # CONFIG_SND_CS4281 is not set | 1150 | # CONFIG_SND_CS4281 is not set |
1151 | # CONFIG_SND_CS46XX is not set | ||
1152 | # CONFIG_SND_CS5535AUDIO is not set | ||
923 | # CONFIG_SND_EMU10K1 is not set | 1153 | # CONFIG_SND_EMU10K1 is not set |
924 | # CONFIG_SND_KORG1212 is not set | 1154 | # CONFIG_SND_EMU10K1X is not set |
925 | # CONFIG_SND_MIXART is not set | ||
926 | # CONFIG_SND_NM256 is not set | ||
927 | # CONFIG_SND_RME32 is not set | ||
928 | # CONFIG_SND_RME96 is not set | ||
929 | # CONFIG_SND_RME9652 is not set | ||
930 | # CONFIG_SND_HDSP is not set | ||
931 | # CONFIG_SND_TRIDENT is not set | ||
932 | # CONFIG_SND_YMFPCI is not set | ||
933 | # CONFIG_SND_ALS4000 is not set | ||
934 | # CONFIG_SND_CMIPCI is not set | ||
935 | # CONFIG_SND_ENS1370 is not set | 1155 | # CONFIG_SND_ENS1370 is not set |
936 | # CONFIG_SND_ENS1371 is not set | 1156 | # CONFIG_SND_ENS1371 is not set |
937 | # CONFIG_SND_ES1938 is not set | 1157 | # CONFIG_SND_ES1938 is not set |
938 | # CONFIG_SND_ES1968 is not set | 1158 | # CONFIG_SND_ES1968 is not set |
939 | # CONFIG_SND_MAESTRO3 is not set | ||
940 | # CONFIG_SND_FM801 is not set | 1159 | # CONFIG_SND_FM801 is not set |
1160 | # CONFIG_SND_HDA_INTEL is not set | ||
1161 | # CONFIG_SND_HDSP is not set | ||
1162 | # CONFIG_SND_HDSPM is not set | ||
941 | # CONFIG_SND_ICE1712 is not set | 1163 | # CONFIG_SND_ICE1712 is not set |
942 | # CONFIG_SND_ICE1724 is not set | 1164 | # CONFIG_SND_ICE1724 is not set |
943 | CONFIG_SND_INTEL8X0=y | 1165 | # CONFIG_SND_INTEL8X0 is not set |
944 | # CONFIG_SND_INTEL8X0M is not set | 1166 | # CONFIG_SND_INTEL8X0M is not set |
1167 | # CONFIG_SND_KORG1212 is not set | ||
1168 | # CONFIG_SND_MAESTRO3 is not set | ||
1169 | # CONFIG_SND_MIXART is not set | ||
1170 | # CONFIG_SND_NM256 is not set | ||
1171 | # CONFIG_SND_PCXHR is not set | ||
1172 | # CONFIG_SND_RME32 is not set | ||
1173 | # CONFIG_SND_RME96 is not set | ||
1174 | # CONFIG_SND_RME9652 is not set | ||
945 | # CONFIG_SND_SONICVIBES is not set | 1175 | # CONFIG_SND_SONICVIBES is not set |
946 | # CONFIG_SND_VIA82XX is not set | 1176 | # CONFIG_SND_TRIDENT is not set |
1177 | CONFIG_SND_VIA82XX=y | ||
1178 | # CONFIG_SND_VIA82XX_MODEM is not set | ||
947 | # CONFIG_SND_VX222 is not set | 1179 | # CONFIG_SND_VX222 is not set |
1180 | # CONFIG_SND_YMFPCI is not set | ||
948 | 1181 | ||
949 | # | 1182 | # |
950 | # ALSA USB devices | 1183 | # USB devices |
951 | # | 1184 | # |
952 | # CONFIG_SND_USB_AUDIO is not set | 1185 | # CONFIG_SND_USB_AUDIO is not set |
1186 | # CONFIG_SND_USB_USX2Y is not set | ||
953 | 1187 | ||
954 | # | 1188 | # |
955 | # Open Sound System | 1189 | # Open Sound System |
@@ -959,6 +1193,8 @@ CONFIG_SND_INTEL8X0=y | |||
959 | # | 1193 | # |
960 | # USB support | 1194 | # USB support |
961 | # | 1195 | # |
1196 | CONFIG_USB_ARCH_HAS_HCD=y | ||
1197 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
962 | CONFIG_USB=y | 1198 | CONFIG_USB=y |
963 | # CONFIG_USB_DEBUG is not set | 1199 | # CONFIG_USB_DEBUG is not set |
964 | 1200 | ||
@@ -968,6 +1204,8 @@ CONFIG_USB=y | |||
968 | CONFIG_USB_DEVICEFS=y | 1204 | CONFIG_USB_DEVICEFS=y |
969 | # CONFIG_USB_BANDWIDTH is not set | 1205 | # CONFIG_USB_BANDWIDTH is not set |
970 | # CONFIG_USB_DYNAMIC_MINORS is not set | 1206 | # CONFIG_USB_DYNAMIC_MINORS is not set |
1207 | # CONFIG_USB_SUSPEND is not set | ||
1208 | # CONFIG_USB_OTG is not set | ||
971 | 1209 | ||
972 | # | 1210 | # |
973 | # USB Host Controller Drivers | 1211 | # USB Host Controller Drivers |
@@ -975,68 +1213,93 @@ CONFIG_USB_DEVICEFS=y | |||
975 | CONFIG_USB_EHCI_HCD=y | 1213 | CONFIG_USB_EHCI_HCD=y |
976 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | 1214 | # CONFIG_USB_EHCI_SPLIT_ISO is not set |
977 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1215 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
1216 | # CONFIG_USB_ISP116X_HCD is not set | ||
978 | # CONFIG_USB_OHCI_HCD is not set | 1217 | # CONFIG_USB_OHCI_HCD is not set |
979 | CONFIG_USB_UHCI_HCD=y | 1218 | CONFIG_USB_UHCI_HCD=y |
1219 | # CONFIG_USB_SL811_HCD is not set | ||
980 | 1220 | ||
981 | # | 1221 | # |
982 | # USB Device Class drivers | 1222 | # USB Device Class drivers |
983 | # | 1223 | # |
984 | # CONFIG_USB_AUDIO is not set | 1224 | # CONFIG_OBSOLETE_OSS_USB_DRIVER is not set |
985 | # CONFIG_USB_BLUETOOTH_TTY is not set | ||
986 | # CONFIG_USB_MIDI is not set | ||
987 | # CONFIG_USB_ACM is not set | 1225 | # CONFIG_USB_ACM is not set |
988 | CONFIG_USB_PRINTER=y | 1226 | # CONFIG_USB_PRINTER is not set |
1227 | |||
1228 | # | ||
1229 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
1230 | # | ||
1231 | |||
1232 | # | ||
1233 | # may also be needed; see USB_STORAGE Help for more information | ||
1234 | # | ||
989 | CONFIG_USB_STORAGE=y | 1235 | CONFIG_USB_STORAGE=y |
990 | # CONFIG_USB_STORAGE_DEBUG is not set | 1236 | # CONFIG_USB_STORAGE_DEBUG is not set |
991 | # CONFIG_USB_STORAGE_DATAFAB is not set | 1237 | # CONFIG_USB_STORAGE_DATAFAB is not set |
992 | # CONFIG_USB_STORAGE_FREECOM is not set | 1238 | # CONFIG_USB_STORAGE_FREECOM is not set |
993 | # CONFIG_USB_STORAGE_ISD200 is not set | 1239 | # CONFIG_USB_STORAGE_ISD200 is not set |
994 | # CONFIG_USB_STORAGE_DPCM is not set | 1240 | # CONFIG_USB_STORAGE_DPCM is not set |
995 | # CONFIG_USB_STORAGE_HP8200e is not set | 1241 | # CONFIG_USB_STORAGE_USBAT is not set |
996 | # CONFIG_USB_STORAGE_SDDR09 is not set | 1242 | # CONFIG_USB_STORAGE_SDDR09 is not set |
997 | # CONFIG_USB_STORAGE_SDDR55 is not set | 1243 | # CONFIG_USB_STORAGE_SDDR55 is not set |
998 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | 1244 | # CONFIG_USB_STORAGE_JUMPSHOT is not set |
1245 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
1246 | # CONFIG_USB_LIBUSUAL is not set | ||
999 | 1247 | ||
1000 | # | 1248 | # |
1001 | # USB Human Interface Devices (HID) | 1249 | # USB Input Devices |
1250 | # | ||
1251 | # CONFIG_USB_HID is not set | ||
1252 | |||
1002 | # | 1253 | # |
1003 | CONFIG_USB_HID=y | 1254 | # USB HID Boot Protocol drivers |
1004 | CONFIG_USB_HIDINPUT=y | 1255 | # |
1005 | # CONFIG_HID_FF is not set | 1256 | # CONFIG_USB_KBD is not set |
1006 | # CONFIG_USB_HIDDEV is not set | 1257 | # CONFIG_USB_MOUSE is not set |
1007 | # CONFIG_USB_AIPTEK is not set | 1258 | # CONFIG_USB_AIPTEK is not set |
1008 | # CONFIG_USB_WACOM is not set | 1259 | # CONFIG_USB_WACOM is not set |
1260 | # CONFIG_USB_ACECAD is not set | ||
1009 | # CONFIG_USB_KBTAB is not set | 1261 | # CONFIG_USB_KBTAB is not set |
1010 | # CONFIG_USB_POWERMATE is not set | 1262 | # CONFIG_USB_POWERMATE is not set |
1011 | # CONFIG_USB_MTOUCH is not set | 1263 | # CONFIG_USB_MTOUCH is not set |
1012 | CONFIG_USB_EGALAX=m | 1264 | # CONFIG_USB_ITMTOUCH is not set |
1265 | # CONFIG_USB_EGALAX is not set | ||
1266 | # CONFIG_USB_YEALINK is not set | ||
1013 | # CONFIG_USB_XPAD is not set | 1267 | # CONFIG_USB_XPAD is not set |
1014 | # CONFIG_USB_ATI_REMOTE is not set | 1268 | # CONFIG_USB_ATI_REMOTE is not set |
1269 | # CONFIG_USB_ATI_REMOTE2 is not set | ||
1270 | # CONFIG_USB_KEYSPAN_REMOTE is not set | ||
1271 | # CONFIG_USB_APPLETOUCH is not set | ||
1015 | 1272 | ||
1016 | # | 1273 | # |
1017 | # USB Imaging devices | 1274 | # USB Imaging devices |
1018 | # | 1275 | # |
1019 | # CONFIG_USB_MDC800 is not set | 1276 | # CONFIG_USB_MDC800 is not set |
1020 | # CONFIG_USB_MICROTEK is not set | 1277 | # CONFIG_USB_MICROTEK is not set |
1021 | # CONFIG_USB_HPUSBSCSI is not set | ||
1022 | 1278 | ||
1023 | # | 1279 | # |
1024 | # USB Multimedia devices | 1280 | # USB Multimedia devices |
1025 | # | 1281 | # |
1026 | # CONFIG_USB_DABUSB is not set | 1282 | # CONFIG_USB_DABUSB is not set |
1283 | # CONFIG_USB_VICAM is not set | ||
1284 | # CONFIG_USB_DSBR is not set | ||
1285 | # CONFIG_USB_ET61X251 is not set | ||
1286 | # CONFIG_USB_IBMCAM is not set | ||
1287 | # CONFIG_USB_KONICAWC is not set | ||
1288 | # CONFIG_USB_OV511 is not set | ||
1289 | # CONFIG_USB_SE401 is not set | ||
1290 | # CONFIG_USB_SN9C102 is not set | ||
1291 | # CONFIG_USB_STV680 is not set | ||
1292 | # CONFIG_USB_PWC is not set | ||
1027 | 1293 | ||
1028 | # | 1294 | # |
1029 | # Video4Linux support is needed for USB Multimedia device support | 1295 | # USB Network Adapters |
1030 | # | ||
1031 | |||
1032 | # | ||
1033 | # USB Network adaptors | ||
1034 | # | 1296 | # |
1035 | # CONFIG_USB_CATC is not set | 1297 | # CONFIG_USB_CATC is not set |
1036 | # CONFIG_USB_KAWETH is not set | 1298 | # CONFIG_USB_KAWETH is not set |
1037 | # CONFIG_USB_PEGASUS is not set | 1299 | # CONFIG_USB_PEGASUS is not set |
1038 | # CONFIG_USB_RTL8150 is not set | 1300 | # CONFIG_USB_RTL8150 is not set |
1039 | # CONFIG_USB_USBNET is not set | 1301 | # CONFIG_USB_USBNET is not set |
1302 | # CONFIG_USB_MON is not set | ||
1040 | 1303 | ||
1041 | # | 1304 | # |
1042 | # USB port drivers | 1305 | # USB port drivers |
@@ -1053,56 +1316,85 @@ CONFIG_USB_EGALAX=m | |||
1053 | # | 1316 | # |
1054 | # CONFIG_USB_EMI62 is not set | 1317 | # CONFIG_USB_EMI62 is not set |
1055 | # CONFIG_USB_EMI26 is not set | 1318 | # CONFIG_USB_EMI26 is not set |
1056 | # CONFIG_USB_TIGL is not set | ||
1057 | # CONFIG_USB_AUERSWALD is not set | 1319 | # CONFIG_USB_AUERSWALD is not set |
1058 | # CONFIG_USB_RIO500 is not set | 1320 | # CONFIG_USB_RIO500 is not set |
1059 | # CONFIG_USB_LEGOTOWER is not set | 1321 | # CONFIG_USB_LEGOTOWER is not set |
1060 | # CONFIG_USB_LCD is not set | 1322 | # CONFIG_USB_LCD is not set |
1061 | # CONFIG_USB_LED is not set | 1323 | # CONFIG_USB_LED is not set |
1062 | CONFIG_USB_CYTHERM=m | 1324 | # CONFIG_USB_CYTHERM is not set |
1063 | CONFIG_USB_PHIDGETSERVO=m | 1325 | # CONFIG_USB_PHIDGETKIT is not set |
1326 | # CONFIG_USB_PHIDGETSERVO is not set | ||
1327 | # CONFIG_USB_IDMOUSE is not set | ||
1328 | # CONFIG_USB_SISUSBVGA is not set | ||
1329 | # CONFIG_USB_LD is not set | ||
1064 | # CONFIG_USB_TEST is not set | 1330 | # CONFIG_USB_TEST is not set |
1065 | 1331 | ||
1066 | # | 1332 | # |
1333 | # USB DSL modem support | ||
1334 | # | ||
1335 | |||
1336 | # | ||
1067 | # USB Gadget Support | 1337 | # USB Gadget Support |
1068 | # | 1338 | # |
1069 | # CONFIG_USB_GADGET is not set | 1339 | # CONFIG_USB_GADGET is not set |
1070 | 1340 | ||
1071 | # | 1341 | # |
1342 | # MMC/SD Card support | ||
1343 | # | ||
1344 | # CONFIG_MMC is not set | ||
1345 | |||
1346 | # | ||
1347 | # InfiniBand support | ||
1348 | # | ||
1349 | # CONFIG_INFINIBAND is not set | ||
1350 | |||
1351 | # | ||
1352 | # SN Devices | ||
1353 | # | ||
1354 | |||
1355 | # | ||
1356 | # EDAC - error detection and reporting (RAS) | ||
1357 | # | ||
1358 | # CONFIG_EDAC is not set | ||
1359 | |||
1360 | # | ||
1072 | # File systems | 1361 | # File systems |
1073 | # | 1362 | # |
1074 | CONFIG_EXT2_FS=y | 1363 | CONFIG_EXT2_FS=y |
1075 | # CONFIG_EXT2_FS_XATTR is not set | 1364 | # CONFIG_EXT2_FS_XATTR is not set |
1076 | CONFIG_EXT3_FS=y | 1365 | # CONFIG_EXT2_FS_XIP is not set |
1077 | CONFIG_EXT3_FS_XATTR=y | 1366 | # CONFIG_EXT3_FS is not set |
1078 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1079 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1080 | CONFIG_JBD=y | ||
1081 | # CONFIG_JBD_DEBUG is not set | ||
1082 | CONFIG_FS_MBCACHE=y | ||
1083 | # CONFIG_REISERFS_FS is not set | 1367 | # CONFIG_REISERFS_FS is not set |
1084 | # CONFIG_JFS_FS is not set | 1368 | # CONFIG_JFS_FS is not set |
1369 | # CONFIG_FS_POSIX_ACL is not set | ||
1085 | # CONFIG_XFS_FS is not set | 1370 | # CONFIG_XFS_FS is not set |
1371 | # CONFIG_OCFS2_FS is not set | ||
1086 | # CONFIG_MINIX_FS is not set | 1372 | # CONFIG_MINIX_FS is not set |
1087 | # CONFIG_ROMFS_FS is not set | 1373 | # CONFIG_ROMFS_FS is not set |
1374 | # CONFIG_INOTIFY is not set | ||
1088 | # CONFIG_QUOTA is not set | 1375 | # CONFIG_QUOTA is not set |
1376 | CONFIG_DNOTIFY=y | ||
1089 | # CONFIG_AUTOFS_FS is not set | 1377 | # CONFIG_AUTOFS_FS is not set |
1090 | CONFIG_AUTOFS4_FS=y | 1378 | # CONFIG_AUTOFS4_FS is not set |
1379 | # CONFIG_FUSE_FS is not set | ||
1091 | 1380 | ||
1092 | # | 1381 | # |
1093 | # CD-ROM/DVD Filesystems | 1382 | # CD-ROM/DVD Filesystems |
1094 | # | 1383 | # |
1095 | CONFIG_ISO9660_FS=y | 1384 | CONFIG_ISO9660_FS=y |
1096 | CONFIG_JOLIET=y | 1385 | CONFIG_JOLIET=y |
1097 | # CONFIG_ZISOFS is not set | 1386 | CONFIG_ZISOFS=y |
1098 | CONFIG_UDF_FS=y | 1387 | CONFIG_ZISOFS_FS=y |
1388 | # CONFIG_UDF_FS is not set | ||
1099 | 1389 | ||
1100 | # | 1390 | # |
1101 | # DOS/FAT/NT Filesystems | 1391 | # DOS/FAT/NT Filesystems |
1102 | # | 1392 | # |
1103 | CONFIG_FAT_FS=y | 1393 | CONFIG_FAT_FS=y |
1104 | CONFIG_MSDOS_FS=y | 1394 | # CONFIG_MSDOS_FS is not set |
1105 | CONFIG_VFAT_FS=y | 1395 | CONFIG_VFAT_FS=y |
1396 | CONFIG_FAT_DEFAULT_CODEPAGE=850 | ||
1397 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1106 | # CONFIG_NTFS_FS is not set | 1398 | # CONFIG_NTFS_FS is not set |
1107 | 1399 | ||
1108 | # | 1400 | # |
@@ -1111,12 +1403,12 @@ CONFIG_VFAT_FS=y | |||
1111 | CONFIG_PROC_FS=y | 1403 | CONFIG_PROC_FS=y |
1112 | CONFIG_PROC_KCORE=y | 1404 | CONFIG_PROC_KCORE=y |
1113 | CONFIG_SYSFS=y | 1405 | CONFIG_SYSFS=y |
1114 | # CONFIG_DEVFS_FS is not set | ||
1115 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
1116 | CONFIG_TMPFS=y | 1406 | CONFIG_TMPFS=y |
1117 | # CONFIG_HUGETLBFS is not set | 1407 | # CONFIG_HUGETLBFS is not set |
1118 | # CONFIG_HUGETLB_PAGE is not set | 1408 | # CONFIG_HUGETLB_PAGE is not set |
1119 | CONFIG_RAMFS=y | 1409 | CONFIG_RAMFS=y |
1410 | # CONFIG_RELAYFS_FS is not set | ||
1411 | # CONFIG_CONFIGFS_FS is not set | ||
1120 | 1412 | ||
1121 | # | 1413 | # |
1122 | # Miscellaneous filesystems | 1414 | # Miscellaneous filesystems |
@@ -1138,38 +1430,48 @@ CONFIG_RAMFS=y | |||
1138 | # | 1430 | # |
1139 | # Network File Systems | 1431 | # Network File Systems |
1140 | # | 1432 | # |
1141 | CONFIG_NFS_FS=y | 1433 | # CONFIG_NFS_FS is not set |
1142 | # CONFIG_NFS_V3 is not set | 1434 | # CONFIG_NFSD is not set |
1143 | # CONFIG_NFS_V4 is not set | ||
1144 | # CONFIG_NFS_DIRECTIO is not set | ||
1145 | CONFIG_NFSD=y | ||
1146 | # CONFIG_NFSD_V3 is not set | ||
1147 | CONFIG_NFSD_TCP=y | ||
1148 | CONFIG_LOCKD=y | ||
1149 | CONFIG_EXPORTFS=y | ||
1150 | CONFIG_SUNRPC=y | ||
1151 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1152 | # CONFIG_SMB_FS is not set | 1435 | # CONFIG_SMB_FS is not set |
1153 | # CONFIG_CIFS is not set | 1436 | CONFIG_CIFS=y |
1437 | # CONFIG_CIFS_STATS is not set | ||
1438 | # CONFIG_CIFS_XATTR is not set | ||
1439 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
1154 | # CONFIG_NCP_FS is not set | 1440 | # CONFIG_NCP_FS is not set |
1155 | # CONFIG_CODA_FS is not set | 1441 | # CONFIG_CODA_FS is not set |
1156 | # CONFIG_AFS_FS is not set | 1442 | # CONFIG_AFS_FS is not set |
1443 | # CONFIG_9P_FS is not set | ||
1157 | 1444 | ||
1158 | # | 1445 | # |
1159 | # Partition Types | 1446 | # Partition Types |
1160 | # | 1447 | # |
1161 | # CONFIG_PARTITION_ADVANCED is not set | 1448 | CONFIG_PARTITION_ADVANCED=y |
1449 | # CONFIG_ACORN_PARTITION is not set | ||
1450 | # CONFIG_OSF_PARTITION is not set | ||
1451 | # CONFIG_AMIGA_PARTITION is not set | ||
1452 | # CONFIG_ATARI_PARTITION is not set | ||
1453 | # CONFIG_MAC_PARTITION is not set | ||
1162 | CONFIG_MSDOS_PARTITION=y | 1454 | CONFIG_MSDOS_PARTITION=y |
1455 | # CONFIG_BSD_DISKLABEL is not set | ||
1456 | # CONFIG_MINIX_SUBPARTITION is not set | ||
1457 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
1458 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
1459 | # CONFIG_LDM_PARTITION is not set | ||
1460 | # CONFIG_SGI_PARTITION is not set | ||
1461 | # CONFIG_ULTRIX_PARTITION is not set | ||
1462 | # CONFIG_SUN_PARTITION is not set | ||
1463 | # CONFIG_KARMA_PARTITION is not set | ||
1464 | # CONFIG_EFI_PARTITION is not set | ||
1163 | 1465 | ||
1164 | # | 1466 | # |
1165 | # Native Language Support | 1467 | # Native Language Support |
1166 | # | 1468 | # |
1167 | CONFIG_NLS=y | 1469 | CONFIG_NLS=y |
1168 | CONFIG_NLS_DEFAULT="iso8859-1" | 1470 | CONFIG_NLS_DEFAULT="iso8859-15" |
1169 | CONFIG_NLS_CODEPAGE_437=y | 1471 | # CONFIG_NLS_CODEPAGE_437 is not set |
1170 | # CONFIG_NLS_CODEPAGE_737 is not set | 1472 | # CONFIG_NLS_CODEPAGE_737 is not set |
1171 | # CONFIG_NLS_CODEPAGE_775 is not set | 1473 | # CONFIG_NLS_CODEPAGE_775 is not set |
1172 | # CONFIG_NLS_CODEPAGE_850 is not set | 1474 | CONFIG_NLS_CODEPAGE_850=y |
1173 | # CONFIG_NLS_CODEPAGE_852 is not set | 1475 | # CONFIG_NLS_CODEPAGE_852 is not set |
1174 | # CONFIG_NLS_CODEPAGE_855 is not set | 1476 | # CONFIG_NLS_CODEPAGE_855 is not set |
1175 | # CONFIG_NLS_CODEPAGE_857 is not set | 1477 | # CONFIG_NLS_CODEPAGE_857 is not set |
@@ -1189,6 +1491,7 @@ CONFIG_NLS_CODEPAGE_437=y | |||
1189 | # CONFIG_NLS_ISO8859_8 is not set | 1491 | # CONFIG_NLS_ISO8859_8 is not set |
1190 | # CONFIG_NLS_CODEPAGE_1250 is not set | 1492 | # CONFIG_NLS_CODEPAGE_1250 is not set |
1191 | # CONFIG_NLS_CODEPAGE_1251 is not set | 1493 | # CONFIG_NLS_CODEPAGE_1251 is not set |
1494 | # CONFIG_NLS_ASCII is not set | ||
1192 | CONFIG_NLS_ISO8859_1=y | 1495 | CONFIG_NLS_ISO8859_1=y |
1193 | # CONFIG_NLS_ISO8859_2 is not set | 1496 | # CONFIG_NLS_ISO8859_2 is not set |
1194 | # CONFIG_NLS_ISO8859_3 is not set | 1497 | # CONFIG_NLS_ISO8859_3 is not set |
@@ -1199,31 +1502,33 @@ CONFIG_NLS_ISO8859_1=y | |||
1199 | # CONFIG_NLS_ISO8859_9 is not set | 1502 | # CONFIG_NLS_ISO8859_9 is not set |
1200 | # CONFIG_NLS_ISO8859_13 is not set | 1503 | # CONFIG_NLS_ISO8859_13 is not set |
1201 | # CONFIG_NLS_ISO8859_14 is not set | 1504 | # CONFIG_NLS_ISO8859_14 is not set |
1202 | # CONFIG_NLS_ISO8859_15 is not set | 1505 | CONFIG_NLS_ISO8859_15=y |
1203 | # CONFIG_NLS_KOI8_R is not set | 1506 | # CONFIG_NLS_KOI8_R is not set |
1204 | # CONFIG_NLS_KOI8_U is not set | 1507 | # CONFIG_NLS_KOI8_U is not set |
1205 | # CONFIG_NLS_UTF8 is not set | 1508 | CONFIG_NLS_UTF8=y |
1206 | 1509 | ||
1207 | # | 1510 | # |
1208 | # Profiling support | 1511 | # Instrumentation Support |
1209 | # | 1512 | # |
1210 | CONFIG_PROFILING=y | 1513 | # CONFIG_PROFILING is not set |
1211 | CONFIG_OPROFILE=y | 1514 | # CONFIG_KPROBES is not set |
1212 | 1515 | ||
1213 | # | 1516 | # |
1214 | # Kernel hacking | 1517 | # Kernel hacking |
1215 | # | 1518 | # |
1519 | # CONFIG_PRINTK_TIME is not set | ||
1520 | CONFIG_MAGIC_SYSRQ=y | ||
1216 | # CONFIG_DEBUG_KERNEL is not set | 1521 | # CONFIG_DEBUG_KERNEL is not set |
1522 | CONFIG_LOG_BUF_SHIFT=14 | ||
1523 | CONFIG_DEBUG_BUGVERBOSE=y | ||
1217 | CONFIG_EARLY_PRINTK=y | 1524 | CONFIG_EARLY_PRINTK=y |
1218 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | ||
1219 | # CONFIG_FRAME_POINTER is not set | ||
1220 | CONFIG_4KSTACKS=y | ||
1221 | CONFIG_X86_FIND_SMP_CONFIG=y | 1525 | CONFIG_X86_FIND_SMP_CONFIG=y |
1222 | CONFIG_X86_MPPARSE=y | 1526 | CONFIG_X86_MPPARSE=y |
1223 | 1527 | ||
1224 | # | 1528 | # |
1225 | # Security options | 1529 | # Security options |
1226 | # | 1530 | # |
1531 | # CONFIG_KEYS is not set | ||
1227 | # CONFIG_SECURITY is not set | 1532 | # CONFIG_SECURITY is not set |
1228 | 1533 | ||
1229 | # | 1534 | # |
@@ -1232,13 +1537,18 @@ CONFIG_X86_MPPARSE=y | |||
1232 | # CONFIG_CRYPTO is not set | 1537 | # CONFIG_CRYPTO is not set |
1233 | 1538 | ||
1234 | # | 1539 | # |
1540 | # Hardware crypto devices | ||
1541 | # | ||
1542 | |||
1543 | # | ||
1235 | # Library routines | 1544 | # Library routines |
1236 | # | 1545 | # |
1546 | # CONFIG_CRC_CCITT is not set | ||
1547 | # CONFIG_CRC16 is not set | ||
1237 | CONFIG_CRC32=y | 1548 | CONFIG_CRC32=y |
1238 | CONFIG_LIBCRC32C=m | 1549 | # CONFIG_LIBCRC32C is not set |
1239 | CONFIG_X86_SMP=y | 1550 | CONFIG_ZLIB_INFLATE=y |
1240 | CONFIG_X86_HT=y | 1551 | CONFIG_GENERIC_HARDIRQS=y |
1552 | CONFIG_GENERIC_IRQ_PROBE=y | ||
1241 | CONFIG_X86_BIOS_REBOOT=y | 1553 | CONFIG_X86_BIOS_REBOOT=y |
1242 | CONFIG_X86_TRAMPOLINE=y | 1554 | CONFIG_KTIME_SCALAR=y |
1243 | CONFIG_X86_STD_RESOURCES=y | ||
1244 | CONFIG_PC=y | ||
diff --git a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile index 65656c033d70..5b9ed21216cf 100644 --- a/arch/i386/kernel/Makefile +++ b/arch/i386/kernel/Makefile | |||
@@ -7,7 +7,7 @@ extra-y := head.o init_task.o vmlinux.lds | |||
7 | obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ | 7 | obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ |
8 | ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ | 8 | ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ |
9 | pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ | 9 | pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ |
10 | quirks.o i8237.o topology.o | 10 | quirks.o i8237.o topology.o alternative.o |
11 | 11 | ||
12 | obj-y += cpu/ | 12 | obj-y += cpu/ |
13 | obj-y += timers/ | 13 | obj-y += timers/ |
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index f1a21945963d..033066176b3e 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -668,10 +668,10 @@ unsigned long __init acpi_find_rsdp(void) | |||
668 | unsigned long rsdp_phys = 0; | 668 | unsigned long rsdp_phys = 0; |
669 | 669 | ||
670 | if (efi_enabled) { | 670 | if (efi_enabled) { |
671 | if (efi.acpi20) | 671 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) |
672 | return __pa(efi.acpi20); | 672 | return efi.acpi20; |
673 | else if (efi.acpi) | 673 | else if (efi.acpi != EFI_INVALID_TABLE_ADDR) |
674 | return __pa(efi.acpi); | 674 | return efi.acpi; |
675 | } | 675 | } |
676 | /* | 676 | /* |
677 | * Scan memory looking for the RSDP signature. First search EBDA (low | 677 | * Scan memory looking for the RSDP signature. First search EBDA (low |
diff --git a/arch/i386/kernel/alternative.c b/arch/i386/kernel/alternative.c new file mode 100644 index 000000000000..5cbd6f99fb2a --- /dev/null +++ b/arch/i386/kernel/alternative.c | |||
@@ -0,0 +1,321 @@ | |||
1 | #include <linux/module.h> | ||
2 | #include <linux/spinlock.h> | ||
3 | #include <linux/list.h> | ||
4 | #include <asm/alternative.h> | ||
5 | #include <asm/sections.h> | ||
6 | |||
7 | #define DEBUG 0 | ||
8 | #if DEBUG | ||
9 | # define DPRINTK(fmt, args...) printk(fmt, args) | ||
10 | #else | ||
11 | # define DPRINTK(fmt, args...) | ||
12 | #endif | ||
13 | |||
14 | /* Use inline assembly to define this because the nops are defined | ||
15 | as inline assembly strings in the include files and we cannot | ||
16 | get them easily into strings. */ | ||
17 | asm("\t.data\nintelnops: " | ||
18 | GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6 | ||
19 | GENERIC_NOP7 GENERIC_NOP8); | ||
20 | asm("\t.data\nk8nops: " | ||
21 | K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6 | ||
22 | K8_NOP7 K8_NOP8); | ||
23 | asm("\t.data\nk7nops: " | ||
24 | K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6 | ||
25 | K7_NOP7 K7_NOP8); | ||
26 | |||
27 | extern unsigned char intelnops[], k8nops[], k7nops[]; | ||
28 | static unsigned char *intel_nops[ASM_NOP_MAX+1] = { | ||
29 | NULL, | ||
30 | intelnops, | ||
31 | intelnops + 1, | ||
32 | intelnops + 1 + 2, | ||
33 | intelnops + 1 + 2 + 3, | ||
34 | intelnops + 1 + 2 + 3 + 4, | ||
35 | intelnops + 1 + 2 + 3 + 4 + 5, | ||
36 | intelnops + 1 + 2 + 3 + 4 + 5 + 6, | ||
37 | intelnops + 1 + 2 + 3 + 4 + 5 + 6 + 7, | ||
38 | }; | ||
39 | static unsigned char *k8_nops[ASM_NOP_MAX+1] = { | ||
40 | NULL, | ||
41 | k8nops, | ||
42 | k8nops + 1, | ||
43 | k8nops + 1 + 2, | ||
44 | k8nops + 1 + 2 + 3, | ||
45 | k8nops + 1 + 2 + 3 + 4, | ||
46 | k8nops + 1 + 2 + 3 + 4 + 5, | ||
47 | k8nops + 1 + 2 + 3 + 4 + 5 + 6, | ||
48 | k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7, | ||
49 | }; | ||
50 | static unsigned char *k7_nops[ASM_NOP_MAX+1] = { | ||
51 | NULL, | ||
52 | k7nops, | ||
53 | k7nops + 1, | ||
54 | k7nops + 1 + 2, | ||
55 | k7nops + 1 + 2 + 3, | ||
56 | k7nops + 1 + 2 + 3 + 4, | ||
57 | k7nops + 1 + 2 + 3 + 4 + 5, | ||
58 | k7nops + 1 + 2 + 3 + 4 + 5 + 6, | ||
59 | k7nops + 1 + 2 + 3 + 4 + 5 + 6 + 7, | ||
60 | }; | ||
61 | static struct nop { | ||
62 | int cpuid; | ||
63 | unsigned char **noptable; | ||
64 | } noptypes[] = { | ||
65 | { X86_FEATURE_K8, k8_nops }, | ||
66 | { X86_FEATURE_K7, k7_nops }, | ||
67 | { -1, NULL } | ||
68 | }; | ||
69 | |||
70 | |||
71 | extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; | ||
72 | extern struct alt_instr __smp_alt_instructions[], __smp_alt_instructions_end[]; | ||
73 | extern u8 *__smp_locks[], *__smp_locks_end[]; | ||
74 | |||
75 | extern u8 __smp_alt_begin[], __smp_alt_end[]; | ||
76 | |||
77 | |||
78 | static unsigned char** find_nop_table(void) | ||
79 | { | ||
80 | unsigned char **noptable = intel_nops; | ||
81 | int i; | ||
82 | |||
83 | for (i = 0; noptypes[i].cpuid >= 0; i++) { | ||
84 | if (boot_cpu_has(noptypes[i].cpuid)) { | ||
85 | noptable = noptypes[i].noptable; | ||
86 | break; | ||
87 | } | ||
88 | } | ||
89 | return noptable; | ||
90 | } | ||
91 | |||
92 | /* Replace instructions with better alternatives for this CPU type. | ||
93 | This runs before SMP is initialized to avoid SMP problems with | ||
94 | self modifying code. This implies that assymetric systems where | ||
95 | APs have less capabilities than the boot processor are not handled. | ||
96 | Tough. Make sure you disable such features by hand. */ | ||
97 | |||
98 | void apply_alternatives(struct alt_instr *start, struct alt_instr *end) | ||
99 | { | ||
100 | unsigned char **noptable = find_nop_table(); | ||
101 | struct alt_instr *a; | ||
102 | int diff, i, k; | ||
103 | |||
104 | DPRINTK("%s: alt table %p -> %p\n", __FUNCTION__, start, end); | ||
105 | for (a = start; a < end; a++) { | ||
106 | BUG_ON(a->replacementlen > a->instrlen); | ||
107 | if (!boot_cpu_has(a->cpuid)) | ||
108 | continue; | ||
109 | memcpy(a->instr, a->replacement, a->replacementlen); | ||
110 | diff = a->instrlen - a->replacementlen; | ||
111 | /* Pad the rest with nops */ | ||
112 | for (i = a->replacementlen; diff > 0; diff -= k, i += k) { | ||
113 | k = diff; | ||
114 | if (k > ASM_NOP_MAX) | ||
115 | k = ASM_NOP_MAX; | ||
116 | memcpy(a->instr + i, noptable[k], k); | ||
117 | } | ||
118 | } | ||
119 | } | ||
120 | |||
121 | static void alternatives_smp_save(struct alt_instr *start, struct alt_instr *end) | ||
122 | { | ||
123 | struct alt_instr *a; | ||
124 | |||
125 | DPRINTK("%s: alt table %p-%p\n", __FUNCTION__, start, end); | ||
126 | for (a = start; a < end; a++) { | ||
127 | memcpy(a->replacement + a->replacementlen, | ||
128 | a->instr, | ||
129 | a->instrlen); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | static void alternatives_smp_apply(struct alt_instr *start, struct alt_instr *end) | ||
134 | { | ||
135 | struct alt_instr *a; | ||
136 | |||
137 | for (a = start; a < end; a++) { | ||
138 | memcpy(a->instr, | ||
139 | a->replacement + a->replacementlen, | ||
140 | a->instrlen); | ||
141 | } | ||
142 | } | ||
143 | |||
144 | static void alternatives_smp_lock(u8 **start, u8 **end, u8 *text, u8 *text_end) | ||
145 | { | ||
146 | u8 **ptr; | ||
147 | |||
148 | for (ptr = start; ptr < end; ptr++) { | ||
149 | if (*ptr < text) | ||
150 | continue; | ||
151 | if (*ptr > text_end) | ||
152 | continue; | ||
153 | **ptr = 0xf0; /* lock prefix */ | ||
154 | }; | ||
155 | } | ||
156 | |||
157 | static void alternatives_smp_unlock(u8 **start, u8 **end, u8 *text, u8 *text_end) | ||
158 | { | ||
159 | unsigned char **noptable = find_nop_table(); | ||
160 | u8 **ptr; | ||
161 | |||
162 | for (ptr = start; ptr < end; ptr++) { | ||
163 | if (*ptr < text) | ||
164 | continue; | ||
165 | if (*ptr > text_end) | ||
166 | continue; | ||
167 | **ptr = noptable[1][0]; | ||
168 | }; | ||
169 | } | ||
170 | |||
171 | struct smp_alt_module { | ||
172 | /* what is this ??? */ | ||
173 | struct module *mod; | ||
174 | char *name; | ||
175 | |||
176 | /* ptrs to lock prefixes */ | ||
177 | u8 **locks; | ||
178 | u8 **locks_end; | ||
179 | |||
180 | /* .text segment, needed to avoid patching init code ;) */ | ||
181 | u8 *text; | ||
182 | u8 *text_end; | ||
183 | |||
184 | struct list_head next; | ||
185 | }; | ||
186 | static LIST_HEAD(smp_alt_modules); | ||
187 | static DEFINE_SPINLOCK(smp_alt); | ||
188 | |||
189 | static int smp_alt_once = 0; | ||
190 | static int __init bootonly(char *str) | ||
191 | { | ||
192 | smp_alt_once = 1; | ||
193 | return 1; | ||
194 | } | ||
195 | __setup("smp-alt-boot", bootonly); | ||
196 | |||
197 | void alternatives_smp_module_add(struct module *mod, char *name, | ||
198 | void *locks, void *locks_end, | ||
199 | void *text, void *text_end) | ||
200 | { | ||
201 | struct smp_alt_module *smp; | ||
202 | unsigned long flags; | ||
203 | |||
204 | if (smp_alt_once) { | ||
205 | if (boot_cpu_has(X86_FEATURE_UP)) | ||
206 | alternatives_smp_unlock(locks, locks_end, | ||
207 | text, text_end); | ||
208 | return; | ||
209 | } | ||
210 | |||
211 | smp = kzalloc(sizeof(*smp), GFP_KERNEL); | ||
212 | if (NULL == smp) | ||
213 | return; /* we'll run the (safe but slow) SMP code then ... */ | ||
214 | |||
215 | smp->mod = mod; | ||
216 | smp->name = name; | ||
217 | smp->locks = locks; | ||
218 | smp->locks_end = locks_end; | ||
219 | smp->text = text; | ||
220 | smp->text_end = text_end; | ||
221 | DPRINTK("%s: locks %p -> %p, text %p -> %p, name %s\n", | ||
222 | __FUNCTION__, smp->locks, smp->locks_end, | ||
223 | smp->text, smp->text_end, smp->name); | ||
224 | |||
225 | spin_lock_irqsave(&smp_alt, flags); | ||
226 | list_add_tail(&smp->next, &smp_alt_modules); | ||
227 | if (boot_cpu_has(X86_FEATURE_UP)) | ||
228 | alternatives_smp_unlock(smp->locks, smp->locks_end, | ||
229 | smp->text, smp->text_end); | ||
230 | spin_unlock_irqrestore(&smp_alt, flags); | ||
231 | } | ||
232 | |||
233 | void alternatives_smp_module_del(struct module *mod) | ||
234 | { | ||
235 | struct smp_alt_module *item; | ||
236 | unsigned long flags; | ||
237 | |||
238 | if (smp_alt_once) | ||
239 | return; | ||
240 | |||
241 | spin_lock_irqsave(&smp_alt, flags); | ||
242 | list_for_each_entry(item, &smp_alt_modules, next) { | ||
243 | if (mod != item->mod) | ||
244 | continue; | ||
245 | list_del(&item->next); | ||
246 | spin_unlock_irqrestore(&smp_alt, flags); | ||
247 | DPRINTK("%s: %s\n", __FUNCTION__, item->name); | ||
248 | kfree(item); | ||
249 | return; | ||
250 | } | ||
251 | spin_unlock_irqrestore(&smp_alt, flags); | ||
252 | } | ||
253 | |||
254 | void alternatives_smp_switch(int smp) | ||
255 | { | ||
256 | struct smp_alt_module *mod; | ||
257 | unsigned long flags; | ||
258 | |||
259 | if (smp_alt_once) | ||
260 | return; | ||
261 | BUG_ON(!smp && (num_online_cpus() > 1)); | ||
262 | |||
263 | spin_lock_irqsave(&smp_alt, flags); | ||
264 | if (smp) { | ||
265 | printk(KERN_INFO "SMP alternatives: switching to SMP code\n"); | ||
266 | clear_bit(X86_FEATURE_UP, boot_cpu_data.x86_capability); | ||
267 | clear_bit(X86_FEATURE_UP, cpu_data[0].x86_capability); | ||
268 | alternatives_smp_apply(__smp_alt_instructions, | ||
269 | __smp_alt_instructions_end); | ||
270 | list_for_each_entry(mod, &smp_alt_modules, next) | ||
271 | alternatives_smp_lock(mod->locks, mod->locks_end, | ||
272 | mod->text, mod->text_end); | ||
273 | } else { | ||
274 | printk(KERN_INFO "SMP alternatives: switching to UP code\n"); | ||
275 | set_bit(X86_FEATURE_UP, boot_cpu_data.x86_capability); | ||
276 | set_bit(X86_FEATURE_UP, cpu_data[0].x86_capability); | ||
277 | apply_alternatives(__smp_alt_instructions, | ||
278 | __smp_alt_instructions_end); | ||
279 | list_for_each_entry(mod, &smp_alt_modules, next) | ||
280 | alternatives_smp_unlock(mod->locks, mod->locks_end, | ||
281 | mod->text, mod->text_end); | ||
282 | } | ||
283 | spin_unlock_irqrestore(&smp_alt, flags); | ||
284 | } | ||
285 | |||
286 | void __init alternative_instructions(void) | ||
287 | { | ||
288 | apply_alternatives(__alt_instructions, __alt_instructions_end); | ||
289 | |||
290 | /* switch to patch-once-at-boottime-only mode and free the | ||
291 | * tables in case we know the number of CPUs will never ever | ||
292 | * change */ | ||
293 | #ifdef CONFIG_HOTPLUG_CPU | ||
294 | if (num_possible_cpus() < 2) | ||
295 | smp_alt_once = 1; | ||
296 | #else | ||
297 | smp_alt_once = 1; | ||
298 | #endif | ||
299 | |||
300 | if (smp_alt_once) { | ||
301 | if (1 == num_possible_cpus()) { | ||
302 | printk(KERN_INFO "SMP alternatives: switching to UP code\n"); | ||
303 | set_bit(X86_FEATURE_UP, boot_cpu_data.x86_capability); | ||
304 | set_bit(X86_FEATURE_UP, cpu_data[0].x86_capability); | ||
305 | apply_alternatives(__smp_alt_instructions, | ||
306 | __smp_alt_instructions_end); | ||
307 | alternatives_smp_unlock(__smp_locks, __smp_locks_end, | ||
308 | _text, _etext); | ||
309 | } | ||
310 | free_init_pages("SMP alternatives", | ||
311 | (unsigned long)__smp_alt_begin, | ||
312 | (unsigned long)__smp_alt_end); | ||
313 | } else { | ||
314 | alternatives_smp_save(__smp_alt_instructions, | ||
315 | __smp_alt_instructions_end); | ||
316 | alternatives_smp_module_add(NULL, "core kernel", | ||
317 | __smp_locks, __smp_locks_end, | ||
318 | _text, _etext); | ||
319 | alternatives_smp_switch(0); | ||
320 | } | ||
321 | } | ||
diff --git a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c index f39e09ef64ec..6273bf74c203 100644 --- a/arch/i386/kernel/apic.c +++ b/arch/i386/kernel/apic.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/i8253.h> | 38 | #include <asm/i8253.h> |
39 | 39 | ||
40 | #include <mach_apic.h> | 40 | #include <mach_apic.h> |
41 | #include <mach_apicdef.h> | ||
41 | #include <mach_ipi.h> | 42 | #include <mach_ipi.h> |
42 | 43 | ||
43 | #include "io_ports.h" | 44 | #include "io_ports.h" |
@@ -414,6 +415,7 @@ void __init init_bsp_APIC(void) | |||
414 | void __devinit setup_local_APIC(void) | 415 | void __devinit setup_local_APIC(void) |
415 | { | 416 | { |
416 | unsigned long oldvalue, value, ver, maxlvt; | 417 | unsigned long oldvalue, value, ver, maxlvt; |
418 | int i, j; | ||
417 | 419 | ||
418 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ | 420 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ |
419 | if (esr_disable) { | 421 | if (esr_disable) { |
@@ -451,6 +453,25 @@ void __devinit setup_local_APIC(void) | |||
451 | apic_write_around(APIC_TASKPRI, value); | 453 | apic_write_around(APIC_TASKPRI, value); |
452 | 454 | ||
453 | /* | 455 | /* |
456 | * After a crash, we no longer service the interrupts and a pending | ||
457 | * interrupt from previous kernel might still have ISR bit set. | ||
458 | * | ||
459 | * Most probably by now CPU has serviced that pending interrupt and | ||
460 | * it might not have done the ack_APIC_irq() because it thought, | ||
461 | * interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it | ||
462 | * does not clear the ISR bit and cpu thinks it has already serivced | ||
463 | * the interrupt. Hence a vector might get locked. It was noticed | ||
464 | * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. | ||
465 | */ | ||
466 | for (i = APIC_ISR_NR - 1; i >= 0; i--) { | ||
467 | value = apic_read(APIC_ISR + i*0x10); | ||
468 | for (j = 31; j >= 0; j--) { | ||
469 | if (value & (1<<j)) | ||
470 | ack_APIC_irq(); | ||
471 | } | ||
472 | } | ||
473 | |||
474 | /* | ||
454 | * Now that we are all set up, enable the APIC | 475 | * Now that we are all set up, enable the APIC |
455 | */ | 476 | */ |
456 | value = apic_read(APIC_SPIV); | 477 | value = apic_read(APIC_SPIV); |
@@ -570,16 +591,18 @@ void __devinit setup_local_APIC(void) | |||
570 | */ | 591 | */ |
571 | void lapic_shutdown(void) | 592 | void lapic_shutdown(void) |
572 | { | 593 | { |
594 | unsigned long flags; | ||
595 | |||
573 | if (!cpu_has_apic) | 596 | if (!cpu_has_apic) |
574 | return; | 597 | return; |
575 | 598 | ||
576 | local_irq_disable(); | 599 | local_irq_save(flags); |
577 | clear_local_APIC(); | 600 | clear_local_APIC(); |
578 | 601 | ||
579 | if (enabled_via_apicbase) | 602 | if (enabled_via_apicbase) |
580 | disable_local_APIC(); | 603 | disable_local_APIC(); |
581 | 604 | ||
582 | local_irq_enable(); | 605 | local_irq_restore(flags); |
583 | } | 606 | } |
584 | 607 | ||
585 | #ifdef CONFIG_PM | 608 | #ifdef CONFIG_PM |
@@ -729,7 +752,7 @@ static int __init apic_set_verbosity(char *str) | |||
729 | printk(KERN_WARNING "APIC Verbosity level %s not recognised" | 752 | printk(KERN_WARNING "APIC Verbosity level %s not recognised" |
730 | " use apic=verbose or apic=debug\n", str); | 753 | " use apic=verbose or apic=debug\n", str); |
731 | 754 | ||
732 | return 0; | 755 | return 1; |
733 | } | 756 | } |
734 | 757 | ||
735 | __setup("apic=", apic_set_verbosity); | 758 | __setup("apic=", apic_set_verbosity); |
diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c index 05312a8abb8b..da30a374dd4e 100644 --- a/arch/i386/kernel/apm.c +++ b/arch/i386/kernel/apm.c | |||
@@ -824,8 +824,6 @@ static void apm_do_busy(void) | |||
824 | 824 | ||
825 | static void (*original_pm_idle)(void); | 825 | static void (*original_pm_idle)(void); |
826 | 826 | ||
827 | extern void default_idle(void); | ||
828 | |||
829 | /** | 827 | /** |
830 | * apm_cpu_idle - cpu idling for APM capable Linux | 828 | * apm_cpu_idle - cpu idling for APM capable Linux |
831 | * | 829 | * |
diff --git a/arch/i386/kernel/cpu/centaur.c b/arch/i386/kernel/cpu/centaur.c index f52669ecb93f..bd75629dd262 100644 --- a/arch/i386/kernel/cpu/centaur.c +++ b/arch/i386/kernel/cpu/centaur.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <asm/processor.h> | 4 | #include <asm/processor.h> |
5 | #include <asm/msr.h> | 5 | #include <asm/msr.h> |
6 | #include <asm/e820.h> | 6 | #include <asm/e820.h> |
7 | #include <asm/mtrr.h> | ||
7 | #include "cpu.h" | 8 | #include "cpu.h" |
8 | 9 | ||
9 | #ifdef CONFIG_X86_OOSTORE | 10 | #ifdef CONFIG_X86_OOSTORE |
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c index e6bd095ae108..a06a49075f10 100644 --- a/arch/i386/kernel/cpu/common.c +++ b/arch/i386/kernel/cpu/common.c | |||
@@ -25,9 +25,10 @@ EXPORT_PER_CPU_SYMBOL(cpu_gdt_descr); | |||
25 | DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]); | 25 | DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]); |
26 | EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack); | 26 | EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack); |
27 | 27 | ||
28 | static int cachesize_override __devinitdata = -1; | 28 | static int cachesize_override __cpuinitdata = -1; |
29 | static int disable_x86_fxsr __devinitdata = 0; | 29 | static int disable_x86_fxsr __cpuinitdata; |
30 | static int disable_x86_serial_nr __devinitdata = 1; | 30 | static int disable_x86_serial_nr __cpuinitdata = 1; |
31 | static int disable_x86_sep __cpuinitdata; | ||
31 | 32 | ||
32 | struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {}; | 33 | struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {}; |
33 | 34 | ||
@@ -59,7 +60,7 @@ static int __init cachesize_setup(char *str) | |||
59 | } | 60 | } |
60 | __setup("cachesize=", cachesize_setup); | 61 | __setup("cachesize=", cachesize_setup); |
61 | 62 | ||
62 | int __devinit get_model_name(struct cpuinfo_x86 *c) | 63 | int __cpuinit get_model_name(struct cpuinfo_x86 *c) |
63 | { | 64 | { |
64 | unsigned int *v; | 65 | unsigned int *v; |
65 | char *p, *q; | 66 | char *p, *q; |
@@ -89,7 +90,7 @@ int __devinit get_model_name(struct cpuinfo_x86 *c) | |||
89 | } | 90 | } |
90 | 91 | ||
91 | 92 | ||
92 | void __devinit display_cacheinfo(struct cpuinfo_x86 *c) | 93 | void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) |
93 | { | 94 | { |
94 | unsigned int n, dummy, ecx, edx, l2size; | 95 | unsigned int n, dummy, ecx, edx, l2size; |
95 | 96 | ||
@@ -130,7 +131,7 @@ void __devinit display_cacheinfo(struct cpuinfo_x86 *c) | |||
130 | /* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */ | 131 | /* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */ |
131 | 132 | ||
132 | /* Look up CPU names by table lookup. */ | 133 | /* Look up CPU names by table lookup. */ |
133 | static char __devinit *table_lookup_model(struct cpuinfo_x86 *c) | 134 | static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c) |
134 | { | 135 | { |
135 | struct cpu_model_info *info; | 136 | struct cpu_model_info *info; |
136 | 137 | ||
@@ -151,7 +152,7 @@ static char __devinit *table_lookup_model(struct cpuinfo_x86 *c) | |||
151 | } | 152 | } |
152 | 153 | ||
153 | 154 | ||
154 | static void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early) | 155 | static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c, int early) |
155 | { | 156 | { |
156 | char *v = c->x86_vendor_id; | 157 | char *v = c->x86_vendor_id; |
157 | int i; | 158 | int i; |
@@ -187,6 +188,14 @@ static int __init x86_fxsr_setup(char * s) | |||
187 | __setup("nofxsr", x86_fxsr_setup); | 188 | __setup("nofxsr", x86_fxsr_setup); |
188 | 189 | ||
189 | 190 | ||
191 | static int __init x86_sep_setup(char * s) | ||
192 | { | ||
193 | disable_x86_sep = 1; | ||
194 | return 1; | ||
195 | } | ||
196 | __setup("nosep", x86_sep_setup); | ||
197 | |||
198 | |||
190 | /* Standard macro to see if a specific flag is changeable */ | 199 | /* Standard macro to see if a specific flag is changeable */ |
191 | static inline int flag_is_changeable_p(u32 flag) | 200 | static inline int flag_is_changeable_p(u32 flag) |
192 | { | 201 | { |
@@ -210,7 +219,7 @@ static inline int flag_is_changeable_p(u32 flag) | |||
210 | 219 | ||
211 | 220 | ||
212 | /* Probe for the CPUID instruction */ | 221 | /* Probe for the CPUID instruction */ |
213 | static int __devinit have_cpuid_p(void) | 222 | static int __cpuinit have_cpuid_p(void) |
214 | { | 223 | { |
215 | return flag_is_changeable_p(X86_EFLAGS_ID); | 224 | return flag_is_changeable_p(X86_EFLAGS_ID); |
216 | } | 225 | } |
@@ -254,10 +263,10 @@ static void __init early_cpu_detect(void) | |||
254 | } | 263 | } |
255 | } | 264 | } |
256 | 265 | ||
257 | void __devinit generic_identify(struct cpuinfo_x86 * c) | 266 | void __cpuinit generic_identify(struct cpuinfo_x86 * c) |
258 | { | 267 | { |
259 | u32 tfms, xlvl; | 268 | u32 tfms, xlvl; |
260 | int junk; | 269 | int ebx; |
261 | 270 | ||
262 | if (have_cpuid_p()) { | 271 | if (have_cpuid_p()) { |
263 | /* Get vendor name */ | 272 | /* Get vendor name */ |
@@ -273,7 +282,7 @@ void __devinit generic_identify(struct cpuinfo_x86 * c) | |||
273 | /* Intel-defined flags: level 0x00000001 */ | 282 | /* Intel-defined flags: level 0x00000001 */ |
274 | if ( c->cpuid_level >= 0x00000001 ) { | 283 | if ( c->cpuid_level >= 0x00000001 ) { |
275 | u32 capability, excap; | 284 | u32 capability, excap; |
276 | cpuid(0x00000001, &tfms, &junk, &excap, &capability); | 285 | cpuid(0x00000001, &tfms, &ebx, &excap, &capability); |
277 | c->x86_capability[0] = capability; | 286 | c->x86_capability[0] = capability; |
278 | c->x86_capability[4] = excap; | 287 | c->x86_capability[4] = excap; |
279 | c->x86 = (tfms >> 8) & 15; | 288 | c->x86 = (tfms >> 8) & 15; |
@@ -283,6 +292,11 @@ void __devinit generic_identify(struct cpuinfo_x86 * c) | |||
283 | if (c->x86 >= 0x6) | 292 | if (c->x86 >= 0x6) |
284 | c->x86_model += ((tfms >> 16) & 0xF) << 4; | 293 | c->x86_model += ((tfms >> 16) & 0xF) << 4; |
285 | c->x86_mask = tfms & 15; | 294 | c->x86_mask = tfms & 15; |
295 | #ifdef CONFIG_SMP | ||
296 | c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0); | ||
297 | #else | ||
298 | c->apicid = (ebx >> 24) & 0xFF; | ||
299 | #endif | ||
286 | } else { | 300 | } else { |
287 | /* Have CPUID level 0 only - unheard of */ | 301 | /* Have CPUID level 0 only - unheard of */ |
288 | c->x86 = 4; | 302 | c->x86 = 4; |
@@ -307,7 +321,7 @@ void __devinit generic_identify(struct cpuinfo_x86 * c) | |||
307 | #endif | 321 | #endif |
308 | } | 322 | } |
309 | 323 | ||
310 | static void __devinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) | 324 | static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c) |
311 | { | 325 | { |
312 | if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) { | 326 | if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) { |
313 | /* Disable processor serial number */ | 327 | /* Disable processor serial number */ |
@@ -335,7 +349,7 @@ __setup("serialnumber", x86_serial_nr_setup); | |||
335 | /* | 349 | /* |
336 | * This does the hard work of actually picking apart the CPU stuff... | 350 | * This does the hard work of actually picking apart the CPU stuff... |
337 | */ | 351 | */ |
338 | void __devinit identify_cpu(struct cpuinfo_x86 *c) | 352 | void __cpuinit identify_cpu(struct cpuinfo_x86 *c) |
339 | { | 353 | { |
340 | int i; | 354 | int i; |
341 | 355 | ||
@@ -405,6 +419,10 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c) | |||
405 | clear_bit(X86_FEATURE_XMM, c->x86_capability); | 419 | clear_bit(X86_FEATURE_XMM, c->x86_capability); |
406 | } | 420 | } |
407 | 421 | ||
422 | /* SEP disabled? */ | ||
423 | if (disable_x86_sep) | ||
424 | clear_bit(X86_FEATURE_SEP, c->x86_capability); | ||
425 | |||
408 | if (disable_pse) | 426 | if (disable_pse) |
409 | clear_bit(X86_FEATURE_PSE, c->x86_capability); | 427 | clear_bit(X86_FEATURE_PSE, c->x86_capability); |
410 | 428 | ||
@@ -417,7 +435,7 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c) | |||
417 | else | 435 | else |
418 | /* Last resort... */ | 436 | /* Last resort... */ |
419 | sprintf(c->x86_model_id, "%02x/%02x", | 437 | sprintf(c->x86_model_id, "%02x/%02x", |
420 | c->x86_vendor, c->x86_model); | 438 | c->x86, c->x86_model); |
421 | } | 439 | } |
422 | 440 | ||
423 | /* Now the feature flags better reflect actual CPU features! */ | 441 | /* Now the feature flags better reflect actual CPU features! */ |
@@ -453,7 +471,7 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c) | |||
453 | } | 471 | } |
454 | 472 | ||
455 | #ifdef CONFIG_X86_HT | 473 | #ifdef CONFIG_X86_HT |
456 | void __devinit detect_ht(struct cpuinfo_x86 *c) | 474 | void __cpuinit detect_ht(struct cpuinfo_x86 *c) |
457 | { | 475 | { |
458 | u32 eax, ebx, ecx, edx; | 476 | u32 eax, ebx, ecx, edx; |
459 | int index_msb, core_bits; | 477 | int index_msb, core_bits; |
@@ -461,7 +479,6 @@ void __devinit detect_ht(struct cpuinfo_x86 *c) | |||
461 | 479 | ||
462 | cpuid(1, &eax, &ebx, &ecx, &edx); | 480 | cpuid(1, &eax, &ebx, &ecx, &edx); |
463 | 481 | ||
464 | c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0); | ||
465 | 482 | ||
466 | if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) | 483 | if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) |
467 | return; | 484 | return; |
@@ -500,7 +517,7 @@ void __devinit detect_ht(struct cpuinfo_x86 *c) | |||
500 | } | 517 | } |
501 | #endif | 518 | #endif |
502 | 519 | ||
503 | void __devinit print_cpu_info(struct cpuinfo_x86 *c) | 520 | void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) |
504 | { | 521 | { |
505 | char *vendor = NULL; | 522 | char *vendor = NULL; |
506 | 523 | ||
@@ -523,7 +540,7 @@ void __devinit print_cpu_info(struct cpuinfo_x86 *c) | |||
523 | printk("\n"); | 540 | printk("\n"); |
524 | } | 541 | } |
525 | 542 | ||
526 | cpumask_t cpu_initialized __devinitdata = CPU_MASK_NONE; | 543 | cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE; |
527 | 544 | ||
528 | /* This is hacky. :) | 545 | /* This is hacky. :) |
529 | * We're emulating future behavior. | 546 | * We're emulating future behavior. |
@@ -570,7 +587,7 @@ void __init early_cpu_init(void) | |||
570 | * and IDT. We reload them nevertheless, this function acts as a | 587 | * and IDT. We reload them nevertheless, this function acts as a |
571 | * 'CPU state barrier', nothing should get across. | 588 | * 'CPU state barrier', nothing should get across. |
572 | */ | 589 | */ |
573 | void __devinit cpu_init(void) | 590 | void __cpuinit cpu_init(void) |
574 | { | 591 | { |
575 | int cpu = smp_processor_id(); | 592 | int cpu = smp_processor_id(); |
576 | struct tss_struct * t = &per_cpu(init_tss, cpu); | 593 | struct tss_struct * t = &per_cpu(init_tss, cpu); |
@@ -670,7 +687,7 @@ void __devinit cpu_init(void) | |||
670 | } | 687 | } |
671 | 688 | ||
672 | #ifdef CONFIG_HOTPLUG_CPU | 689 | #ifdef CONFIG_HOTPLUG_CPU |
673 | void __devinit cpu_uninit(void) | 690 | void __cpuinit cpu_uninit(void) |
674 | { | 691 | { |
675 | int cpu = raw_smp_processor_id(); | 692 | int cpu = raw_smp_processor_id(); |
676 | cpu_clear(cpu, cpu_initialized); | 693 | cpu_clear(cpu, cpu_initialized); |
diff --git a/arch/i386/kernel/cpu/cpufreq/Kconfig b/arch/i386/kernel/cpu/cpufreq/Kconfig index 26892d2099b0..e44a4c6a4fe5 100644 --- a/arch/i386/kernel/cpu/cpufreq/Kconfig +++ b/arch/i386/kernel/cpu/cpufreq/Kconfig | |||
@@ -96,7 +96,6 @@ config X86_POWERNOW_K8_ACPI | |||
96 | 96 | ||
97 | config X86_GX_SUSPMOD | 97 | config X86_GX_SUSPMOD |
98 | tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation" | 98 | tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation" |
99 | depends on PCI | ||
100 | help | 99 | help |
101 | This add the CPUFreq driver for NatSemi Geode processors which | 100 | This add the CPUFreq driver for NatSemi Geode processors which |
102 | support suspend modulation. | 101 | support suspend modulation. |
@@ -115,9 +114,9 @@ config X86_SPEEDSTEP_CENTRINO | |||
115 | you also need to say Y to "Use ACPI tables to decode..." below | 114 | you also need to say Y to "Use ACPI tables to decode..." below |
116 | [which might imply enabling ACPI] if you want to use this driver | 115 | [which might imply enabling ACPI] if you want to use this driver |
117 | on non-Banias CPUs. | 116 | on non-Banias CPUs. |
118 | 117 | ||
119 | For details, take a look at <file:Documentation/cpu-freq/>. | 118 | For details, take a look at <file:Documentation/cpu-freq/>. |
120 | 119 | ||
121 | If in doubt, say N. | 120 | If in doubt, say N. |
122 | 121 | ||
123 | config X86_SPEEDSTEP_CENTRINO_ACPI | 122 | config X86_SPEEDSTEP_CENTRINO_ACPI |
@@ -148,7 +147,7 @@ config X86_SPEEDSTEP_ICH | |||
148 | help | 147 | help |
149 | This adds the CPUFreq driver for certain mobile Intel Pentium III | 148 | This adds the CPUFreq driver for certain mobile Intel Pentium III |
150 | (Coppermine), all mobile Intel Pentium III-M (Tualatin) and all | 149 | (Coppermine), all mobile Intel Pentium III-M (Tualatin) and all |
151 | mobile Intel Pentium 4 P4-M on systems which have an Intel ICH2, | 150 | mobile Intel Pentium 4 P4-M on systems which have an Intel ICH2, |
152 | ICH3 or ICH4 southbridge. | 151 | ICH3 or ICH4 southbridge. |
153 | 152 | ||
154 | For details, take a look at <file:Documentation/cpu-freq/>. | 153 | For details, take a look at <file:Documentation/cpu-freq/>. |
@@ -161,7 +160,7 @@ config X86_SPEEDSTEP_SMI | |||
161 | depends on EXPERIMENTAL | 160 | depends on EXPERIMENTAL |
162 | help | 161 | help |
163 | This adds the CPUFreq driver for certain mobile Intel Pentium III | 162 | This adds the CPUFreq driver for certain mobile Intel Pentium III |
164 | (Coppermine), all mobile Intel Pentium III-M (Tualatin) | 163 | (Coppermine), all mobile Intel Pentium III-M (Tualatin) |
165 | on systems which have an Intel 440BX/ZX/MX southbridge. | 164 | on systems which have an Intel 440BX/ZX/MX southbridge. |
166 | 165 | ||
167 | For details, take a look at <file:Documentation/cpu-freq/>. | 166 | For details, take a look at <file:Documentation/cpu-freq/>. |
@@ -203,9 +202,10 @@ config X86_LONGRUN | |||
203 | config X86_LONGHAUL | 202 | config X86_LONGHAUL |
204 | tristate "VIA Cyrix III Longhaul" | 203 | tristate "VIA Cyrix III Longhaul" |
205 | select CPU_FREQ_TABLE | 204 | select CPU_FREQ_TABLE |
205 | depends on BROKEN | ||
206 | help | 206 | help |
207 | This adds the CPUFreq driver for VIA Samuel/CyrixIII, | 207 | This adds the CPUFreq driver for VIA Samuel/CyrixIII, |
208 | VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T | 208 | VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T |
209 | processors. | 209 | processors. |
210 | 210 | ||
211 | For details, take a look at <file:Documentation/cpu-freq/>. | 211 | For details, take a look at <file:Documentation/cpu-freq/>. |
@@ -215,11 +215,11 @@ config X86_LONGHAUL | |||
215 | comment "shared options" | 215 | comment "shared options" |
216 | 216 | ||
217 | config X86_ACPI_CPUFREQ_PROC_INTF | 217 | config X86_ACPI_CPUFREQ_PROC_INTF |
218 | bool "/proc/acpi/processor/../performance interface (deprecated)" | 218 | bool "/proc/acpi/processor/../performance interface (deprecated)" |
219 | depends on PROC_FS | 219 | depends on PROC_FS |
220 | depends on X86_ACPI_CPUFREQ || X86_SPEEDSTEP_CENTRINO_ACPI || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI | 220 | depends on X86_ACPI_CPUFREQ || X86_SPEEDSTEP_CENTRINO_ACPI || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI |
221 | help | 221 | help |
222 | This enables the deprecated /proc/acpi/processor/../performance | 222 | This enables the deprecated /proc/acpi/processor/../performance |
223 | interface. While it is helpful for debugging, the generic, | 223 | interface. While it is helpful for debugging, the generic, |
224 | cross-architecture cpufreq interfaces should be used. | 224 | cross-architecture cpufreq interfaces should be used. |
225 | 225 | ||
@@ -233,9 +233,9 @@ config X86_SPEEDSTEP_RELAXED_CAP_CHECK | |||
233 | bool "Relaxed speedstep capability checks" | 233 | bool "Relaxed speedstep capability checks" |
234 | depends on (X86_SPEEDSTEP_SMI || X86_SPEEDSTEP_ICH) | 234 | depends on (X86_SPEEDSTEP_SMI || X86_SPEEDSTEP_ICH) |
235 | help | 235 | help |
236 | Don't perform all checks for a speedstep capable system which would | 236 | Don't perform all checks for a speedstep capable system which would |
237 | normally be done. Some ancient or strange systems, though speedstep | 237 | normally be done. Some ancient or strange systems, though speedstep |
238 | capable, don't always indicate that they are speedstep capable. This | 238 | capable, don't always indicate that they are speedstep capable. This |
239 | option lets the probing code bypass some of those checks if the | 239 | option lets the probing code bypass some of those checks if the |
240 | parameter "relaxed_check=1" is passed to the module. | 240 | parameter "relaxed_check=1" is passed to the module. |
241 | 241 | ||
diff --git a/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c b/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c index 2b62dee35c6c..f275e0d4aee5 100644 --- a/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c +++ b/arch/i386/kernel/cpu/cpufreq/cpufreq-nforce2.c | |||
@@ -39,7 +39,7 @@ static struct pci_dev *nforce2_chipset_dev; | |||
39 | static int fid = 0; | 39 | static int fid = 0; |
40 | 40 | ||
41 | /* min_fsb, max_fsb: | 41 | /* min_fsb, max_fsb: |
42 | * minimum and maximum FSB (= FSB at boot time) | 42 | * minimum and maximum FSB (= FSB at boot time) |
43 | */ | 43 | */ |
44 | static int min_fsb = 0; | 44 | static int min_fsb = 0; |
45 | static int max_fsb = 0; | 45 | static int max_fsb = 0; |
@@ -57,10 +57,10 @@ MODULE_PARM_DESC(min_fsb, | |||
57 | 57 | ||
58 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "cpufreq-nforce2", msg) | 58 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "cpufreq-nforce2", msg) |
59 | 59 | ||
60 | /* | 60 | /** |
61 | * nforce2_calc_fsb - calculate FSB | 61 | * nforce2_calc_fsb - calculate FSB |
62 | * @pll: PLL value | 62 | * @pll: PLL value |
63 | * | 63 | * |
64 | * Calculates FSB from PLL value | 64 | * Calculates FSB from PLL value |
65 | */ | 65 | */ |
66 | static int nforce2_calc_fsb(int pll) | 66 | static int nforce2_calc_fsb(int pll) |
@@ -76,10 +76,10 @@ static int nforce2_calc_fsb(int pll) | |||
76 | return 0; | 76 | return 0; |
77 | } | 77 | } |
78 | 78 | ||
79 | /* | 79 | /** |
80 | * nforce2_calc_pll - calculate PLL value | 80 | * nforce2_calc_pll - calculate PLL value |
81 | * @fsb: FSB | 81 | * @fsb: FSB |
82 | * | 82 | * |
83 | * Calculate PLL value for given FSB | 83 | * Calculate PLL value for given FSB |
84 | */ | 84 | */ |
85 | static int nforce2_calc_pll(unsigned int fsb) | 85 | static int nforce2_calc_pll(unsigned int fsb) |
@@ -106,10 +106,10 @@ static int nforce2_calc_pll(unsigned int fsb) | |||
106 | return NFORCE2_PLL(mul, div); | 106 | return NFORCE2_PLL(mul, div); |
107 | } | 107 | } |
108 | 108 | ||
109 | /* | 109 | /** |
110 | * nforce2_write_pll - write PLL value to chipset | 110 | * nforce2_write_pll - write PLL value to chipset |
111 | * @pll: PLL value | 111 | * @pll: PLL value |
112 | * | 112 | * |
113 | * Writes new FSB PLL value to chipset | 113 | * Writes new FSB PLL value to chipset |
114 | */ | 114 | */ |
115 | static void nforce2_write_pll(int pll) | 115 | static void nforce2_write_pll(int pll) |
@@ -121,15 +121,13 @@ static void nforce2_write_pll(int pll) | |||
121 | pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, temp); | 121 | pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, temp); |
122 | 122 | ||
123 | /* Now write the value in all 64 registers */ | 123 | /* Now write the value in all 64 registers */ |
124 | for (temp = 0; temp <= 0x3f; temp++) { | 124 | for (temp = 0; temp <= 0x3f; temp++) |
125 | pci_write_config_dword(nforce2_chipset_dev, | 125 | pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLREG, pll); |
126 | NFORCE2_PLLREG, pll); | ||
127 | } | ||
128 | 126 | ||
129 | return; | 127 | return; |
130 | } | 128 | } |
131 | 129 | ||
132 | /* | 130 | /** |
133 | * nforce2_fsb_read - Read FSB | 131 | * nforce2_fsb_read - Read FSB |
134 | * | 132 | * |
135 | * Read FSB from chipset | 133 | * Read FSB from chipset |
@@ -140,39 +138,32 @@ static unsigned int nforce2_fsb_read(int bootfsb) | |||
140 | struct pci_dev *nforce2_sub5; | 138 | struct pci_dev *nforce2_sub5; |
141 | u32 fsb, temp = 0; | 139 | u32 fsb, temp = 0; |
142 | 140 | ||
143 | |||
144 | /* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */ | 141 | /* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */ |
145 | nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, | 142 | nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, |
146 | 0x01EF, | 143 | 0x01EF,PCI_ANY_ID,PCI_ANY_ID,NULL); |
147 | PCI_ANY_ID, | ||
148 | PCI_ANY_ID, | ||
149 | NULL); | ||
150 | |||
151 | if (!nforce2_sub5) | 144 | if (!nforce2_sub5) |
152 | return 0; | 145 | return 0; |
153 | 146 | ||
154 | pci_read_config_dword(nforce2_sub5, NFORCE2_BOOTFSB, &fsb); | 147 | pci_read_config_dword(nforce2_sub5, NFORCE2_BOOTFSB, &fsb); |
155 | fsb /= 1000000; | 148 | fsb /= 1000000; |
156 | 149 | ||
157 | /* Check if PLL register is already set */ | 150 | /* Check if PLL register is already set */ |
158 | pci_read_config_byte(nforce2_chipset_dev, | 151 | pci_read_config_byte(nforce2_chipset_dev,NFORCE2_PLLENABLE, (u8 *)&temp); |
159 | NFORCE2_PLLENABLE, (u8 *)&temp); | 152 | |
160 | |||
161 | if(bootfsb || !temp) | 153 | if(bootfsb || !temp) |
162 | return fsb; | 154 | return fsb; |
163 | 155 | ||
164 | /* Use PLL register FSB value */ | 156 | /* Use PLL register FSB value */ |
165 | pci_read_config_dword(nforce2_chipset_dev, | 157 | pci_read_config_dword(nforce2_chipset_dev,NFORCE2_PLLREG, &temp); |
166 | NFORCE2_PLLREG, &temp); | ||
167 | fsb = nforce2_calc_fsb(temp); | 158 | fsb = nforce2_calc_fsb(temp); |
168 | 159 | ||
169 | return fsb; | 160 | return fsb; |
170 | } | 161 | } |
171 | 162 | ||
172 | /* | 163 | /** |
173 | * nforce2_set_fsb - set new FSB | 164 | * nforce2_set_fsb - set new FSB |
174 | * @fsb: New FSB | 165 | * @fsb: New FSB |
175 | * | 166 | * |
176 | * Sets new FSB | 167 | * Sets new FSB |
177 | */ | 168 | */ |
178 | static int nforce2_set_fsb(unsigned int fsb) | 169 | static int nforce2_set_fsb(unsigned int fsb) |
@@ -186,7 +177,7 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
186 | printk(KERN_ERR "cpufreq: FSB %d is out of range!\n", fsb); | 177 | printk(KERN_ERR "cpufreq: FSB %d is out of range!\n", fsb); |
187 | return -EINVAL; | 178 | return -EINVAL; |
188 | } | 179 | } |
189 | 180 | ||
190 | tfsb = nforce2_fsb_read(0); | 181 | tfsb = nforce2_fsb_read(0); |
191 | if (!tfsb) { | 182 | if (!tfsb) { |
192 | printk(KERN_ERR "cpufreq: Error while reading the FSB\n"); | 183 | printk(KERN_ERR "cpufreq: Error while reading the FSB\n"); |
@@ -194,8 +185,7 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
194 | } | 185 | } |
195 | 186 | ||
196 | /* First write? Then set actual value */ | 187 | /* First write? Then set actual value */ |
197 | pci_read_config_byte(nforce2_chipset_dev, | 188 | pci_read_config_byte(nforce2_chipset_dev,NFORCE2_PLLENABLE, (u8 *)&temp); |
198 | NFORCE2_PLLENABLE, (u8 *)&temp); | ||
199 | if (!temp) { | 189 | if (!temp) { |
200 | pll = nforce2_calc_pll(tfsb); | 190 | pll = nforce2_calc_pll(tfsb); |
201 | 191 | ||
@@ -223,7 +213,7 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
223 | /* Calculate the PLL reg. value */ | 213 | /* Calculate the PLL reg. value */ |
224 | if ((pll = nforce2_calc_pll(tfsb)) == -1) | 214 | if ((pll = nforce2_calc_pll(tfsb)) == -1) |
225 | return -EINVAL; | 215 | return -EINVAL; |
226 | 216 | ||
227 | nforce2_write_pll(pll); | 217 | nforce2_write_pll(pll); |
228 | #ifdef NFORCE2_DELAY | 218 | #ifdef NFORCE2_DELAY |
229 | mdelay(NFORCE2_DELAY); | 219 | mdelay(NFORCE2_DELAY); |
@@ -239,7 +229,7 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
239 | /** | 229 | /** |
240 | * nforce2_get - get the CPU frequency | 230 | * nforce2_get - get the CPU frequency |
241 | * @cpu: CPU number | 231 | * @cpu: CPU number |
242 | * | 232 | * |
243 | * Returns the CPU frequency | 233 | * Returns the CPU frequency |
244 | */ | 234 | */ |
245 | static unsigned int nforce2_get(unsigned int cpu) | 235 | static unsigned int nforce2_get(unsigned int cpu) |
@@ -354,10 +344,10 @@ static int nforce2_cpu_init(struct cpufreq_policy *policy) | |||
354 | 344 | ||
355 | printk(KERN_INFO "cpufreq: FSB currently at %i MHz, FID %d.%d\n", fsb, | 345 | printk(KERN_INFO "cpufreq: FSB currently at %i MHz, FID %d.%d\n", fsb, |
356 | fid / 10, fid % 10); | 346 | fid / 10, fid % 10); |
357 | 347 | ||
358 | /* Set maximum FSB to FSB at boot time */ | 348 | /* Set maximum FSB to FSB at boot time */ |
359 | max_fsb = nforce2_fsb_read(1); | 349 | max_fsb = nforce2_fsb_read(1); |
360 | 350 | ||
361 | if(!max_fsb) | 351 | if(!max_fsb) |
362 | return -EIO; | 352 | return -EIO; |
363 | 353 | ||
@@ -398,17 +388,15 @@ static struct cpufreq_driver nforce2_driver = { | |||
398 | * nforce2_detect_chipset - detect the Southbridge which contains FSB PLL logic | 388 | * nforce2_detect_chipset - detect the Southbridge which contains FSB PLL logic |
399 | * | 389 | * |
400 | * Detects nForce2 A2 and C1 stepping | 390 | * Detects nForce2 A2 and C1 stepping |
401 | * | 391 | * |
402 | */ | 392 | */ |
403 | static unsigned int nforce2_detect_chipset(void) | 393 | static unsigned int nforce2_detect_chipset(void) |
404 | { | 394 | { |
405 | u8 revision; | 395 | u8 revision; |
406 | 396 | ||
407 | nforce2_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, | 397 | nforce2_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, |
408 | PCI_DEVICE_ID_NVIDIA_NFORCE2, | 398 | PCI_DEVICE_ID_NVIDIA_NFORCE2, |
409 | PCI_ANY_ID, | 399 | PCI_ANY_ID, PCI_ANY_ID, NULL); |
410 | PCI_ANY_ID, | ||
411 | NULL); | ||
412 | 400 | ||
413 | if (nforce2_chipset_dev == NULL) | 401 | if (nforce2_chipset_dev == NULL) |
414 | return -ENODEV; | 402 | return -ENODEV; |
diff --git a/arch/i386/kernel/cpu/cpufreq/elanfreq.c b/arch/i386/kernel/cpu/cpufreq/elanfreq.c index 3f7caa4ae6d6..f317276afa7a 100644 --- a/arch/i386/kernel/cpu/cpufreq/elanfreq.c +++ b/arch/i386/kernel/cpu/cpufreq/elanfreq.c | |||
@@ -1,16 +1,16 @@ | |||
1 | /* | 1 | /* |
2 | * elanfreq: cpufreq driver for the AMD ELAN family | 2 | * elanfreq: cpufreq driver for the AMD ELAN family |
3 | * | 3 | * |
4 | * (c) Copyright 2002 Robert Schwebel <r.schwebel@pengutronix.de> | 4 | * (c) Copyright 2002 Robert Schwebel <r.schwebel@pengutronix.de> |
5 | * | 5 | * |
6 | * Parts of this code are (c) Sven Geggus <sven@geggus.net> | 6 | * Parts of this code are (c) Sven Geggus <sven@geggus.net> |
7 | * | 7 | * |
8 | * All Rights Reserved. | 8 | * All Rights Reserved. |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU General Public License | 11 | * modify it under the terms of the GNU General Public License |
12 | * as published by the Free Software Foundation; either version | 12 | * as published by the Free Software Foundation; either version |
13 | * 2 of the License, or (at your option) any later version. | 13 | * 2 of the License, or (at your option) any later version. |
14 | * | 14 | * |
15 | * 2002-02-13: - initial revision for 2.4.18-pre9 by Robert Schwebel | 15 | * 2002-02-13: - initial revision for 2.4.18-pre9 by Robert Schwebel |
16 | * | 16 | * |
@@ -28,7 +28,7 @@ | |||
28 | #include <asm/timex.h> | 28 | #include <asm/timex.h> |
29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
30 | 30 | ||
31 | #define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */ | 31 | #define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */ |
32 | #define REG_CSCDR 0x23 /* Chip Setup and Control Data Register */ | 32 | #define REG_CSCDR 0x23 /* Chip Setup and Control Data Register */ |
33 | 33 | ||
34 | /* Module parameter */ | 34 | /* Module parameter */ |
@@ -41,7 +41,7 @@ struct s_elan_multiplier { | |||
41 | }; | 41 | }; |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * It is important that the frequencies | 44 | * It is important that the frequencies |
45 | * are listed in ascending order here! | 45 | * are listed in ascending order here! |
46 | */ | 46 | */ |
47 | struct s_elan_multiplier elan_multiplier[] = { | 47 | struct s_elan_multiplier elan_multiplier[] = { |
@@ -72,78 +72,79 @@ static struct cpufreq_frequency_table elanfreq_table[] = { | |||
72 | * elanfreq_get_cpu_frequency: determine current cpu speed | 72 | * elanfreq_get_cpu_frequency: determine current cpu speed |
73 | * | 73 | * |
74 | * Finds out at which frequency the CPU of the Elan SOC runs | 74 | * Finds out at which frequency the CPU of the Elan SOC runs |
75 | * at the moment. Frequencies from 1 to 33 MHz are generated | 75 | * at the moment. Frequencies from 1 to 33 MHz are generated |
76 | * the normal way, 66 and 99 MHz are called "Hyperspeed Mode" | 76 | * the normal way, 66 and 99 MHz are called "Hyperspeed Mode" |
77 | * and have the rest of the chip running with 33 MHz. | 77 | * and have the rest of the chip running with 33 MHz. |
78 | */ | 78 | */ |
79 | 79 | ||
80 | static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu) | 80 | static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu) |
81 | { | 81 | { |
82 | u8 clockspeed_reg; /* Clock Speed Register */ | 82 | u8 clockspeed_reg; /* Clock Speed Register */ |
83 | 83 | ||
84 | local_irq_disable(); | 84 | local_irq_disable(); |
85 | outb_p(0x80,REG_CSCIR); | 85 | outb_p(0x80,REG_CSCIR); |
86 | clockspeed_reg = inb_p(REG_CSCDR); | 86 | clockspeed_reg = inb_p(REG_CSCDR); |
87 | local_irq_enable(); | 87 | local_irq_enable(); |
88 | 88 | ||
89 | if ((clockspeed_reg & 0xE0) == 0xE0) { return 0; } | 89 | if ((clockspeed_reg & 0xE0) == 0xE0) |
90 | return 0; | ||
90 | 91 | ||
91 | /* Are we in CPU clock multiplied mode (66/99 MHz)? */ | 92 | /* Are we in CPU clock multiplied mode (66/99 MHz)? */ |
92 | if ((clockspeed_reg & 0xE0) == 0xC0) { | 93 | if ((clockspeed_reg & 0xE0) == 0xC0) { |
93 | if ((clockspeed_reg & 0x01) == 0) { | 94 | if ((clockspeed_reg & 0x01) == 0) |
94 | return 66000; | 95 | return 66000; |
95 | } else { | 96 | else |
96 | return 99000; | 97 | return 99000; |
97 | } | 98 | } |
98 | } | ||
99 | 99 | ||
100 | /* 33 MHz is not 32 MHz... */ | 100 | /* 33 MHz is not 32 MHz... */ |
101 | if ((clockspeed_reg & 0xE0)==0xA0) | 101 | if ((clockspeed_reg & 0xE0)==0xA0) |
102 | return 33000; | 102 | return 33000; |
103 | 103 | ||
104 | return ((1<<((clockspeed_reg & 0xE0) >> 5)) * 1000); | 104 | return ((1<<((clockspeed_reg & 0xE0) >> 5)) * 1000); |
105 | } | 105 | } |
106 | 106 | ||
107 | 107 | ||
108 | /** | 108 | /** |
109 | * elanfreq_set_cpu_frequency: Change the CPU core frequency | 109 | * elanfreq_set_cpu_frequency: Change the CPU core frequency |
110 | * @cpu: cpu number | 110 | * @cpu: cpu number |
111 | * @freq: frequency in kHz | 111 | * @freq: frequency in kHz |
112 | * | 112 | * |
113 | * This function takes a frequency value and changes the CPU frequency | 113 | * This function takes a frequency value and changes the CPU frequency |
114 | * according to this. Note that the frequency has to be checked by | 114 | * according to this. Note that the frequency has to be checked by |
115 | * elanfreq_validatespeed() for correctness! | 115 | * elanfreq_validatespeed() for correctness! |
116 | * | 116 | * |
117 | * There is no return value. | 117 | * There is no return value. |
118 | */ | 118 | */ |
119 | 119 | ||
120 | static void elanfreq_set_cpu_state (unsigned int state) { | 120 | static void elanfreq_set_cpu_state (unsigned int state) |
121 | 121 | { | |
122 | struct cpufreq_freqs freqs; | 122 | struct cpufreq_freqs freqs; |
123 | 123 | ||
124 | freqs.old = elanfreq_get_cpu_frequency(0); | 124 | freqs.old = elanfreq_get_cpu_frequency(0); |
125 | freqs.new = elan_multiplier[state].clock; | 125 | freqs.new = elan_multiplier[state].clock; |
126 | freqs.cpu = 0; /* elanfreq.c is UP only driver */ | 126 | freqs.cpu = 0; /* elanfreq.c is UP only driver */ |
127 | 127 | ||
128 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 128 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
129 | 129 | ||
130 | printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n",elan_multiplier[state].clock); | 130 | printk(KERN_INFO "elanfreq: attempting to set frequency to %i kHz\n", |
131 | elan_multiplier[state].clock); | ||
131 | 132 | ||
132 | 133 | ||
133 | /* | 134 | /* |
134 | * Access to the Elan's internal registers is indexed via | 135 | * Access to the Elan's internal registers is indexed via |
135 | * 0x22: Chip Setup & Control Register Index Register (CSCI) | 136 | * 0x22: Chip Setup & Control Register Index Register (CSCI) |
136 | * 0x23: Chip Setup & Control Register Data Register (CSCD) | 137 | * 0x23: Chip Setup & Control Register Data Register (CSCD) |
137 | * | 138 | * |
138 | */ | 139 | */ |
139 | 140 | ||
140 | /* | 141 | /* |
141 | * 0x40 is the Power Management Unit's Force Mode Register. | 142 | * 0x40 is the Power Management Unit's Force Mode Register. |
142 | * Bit 6 enables Hyperspeed Mode (66/100 MHz core frequency) | 143 | * Bit 6 enables Hyperspeed Mode (66/100 MHz core frequency) |
143 | */ | 144 | */ |
144 | 145 | ||
145 | local_irq_disable(); | 146 | local_irq_disable(); |
146 | outb_p(0x40,REG_CSCIR); /* Disable hyperspeed mode */ | 147 | outb_p(0x40,REG_CSCIR); /* Disable hyperspeed mode */ |
147 | outb_p(0x00,REG_CSCDR); | 148 | outb_p(0x00,REG_CSCDR); |
148 | local_irq_enable(); /* wait till internal pipelines and */ | 149 | local_irq_enable(); /* wait till internal pipelines and */ |
149 | udelay(1000); /* buffers have cleaned up */ | 150 | udelay(1000); /* buffers have cleaned up */ |
@@ -166,10 +167,10 @@ static void elanfreq_set_cpu_state (unsigned int state) { | |||
166 | 167 | ||
167 | /** | 168 | /** |
168 | * elanfreq_validatespeed: test if frequency range is valid | 169 | * elanfreq_validatespeed: test if frequency range is valid |
169 | * @policy: the policy to validate | 170 | * @policy: the policy to validate |
170 | * | 171 | * |
171 | * This function checks if a given frequency range in kHz is valid | 172 | * This function checks if a given frequency range in kHz is valid |
172 | * for the hardware supported by the driver. | 173 | * for the hardware supported by the driver. |
173 | */ | 174 | */ |
174 | 175 | ||
175 | static int elanfreq_verify (struct cpufreq_policy *policy) | 176 | static int elanfreq_verify (struct cpufreq_policy *policy) |
@@ -177,11 +178,11 @@ static int elanfreq_verify (struct cpufreq_policy *policy) | |||
177 | return cpufreq_frequency_table_verify(policy, &elanfreq_table[0]); | 178 | return cpufreq_frequency_table_verify(policy, &elanfreq_table[0]); |
178 | } | 179 | } |
179 | 180 | ||
180 | static int elanfreq_target (struct cpufreq_policy *policy, | 181 | static int elanfreq_target (struct cpufreq_policy *policy, |
181 | unsigned int target_freq, | 182 | unsigned int target_freq, |
182 | unsigned int relation) | 183 | unsigned int relation) |
183 | { | 184 | { |
184 | unsigned int newstate = 0; | 185 | unsigned int newstate = 0; |
185 | 186 | ||
186 | if (cpufreq_frequency_table_target(policy, &elanfreq_table[0], target_freq, relation, &newstate)) | 187 | if (cpufreq_frequency_table_target(policy, &elanfreq_table[0], target_freq, relation, &newstate)) |
187 | return -EINVAL; | 188 | return -EINVAL; |
@@ -212,7 +213,7 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy) | |||
212 | max_freq = elanfreq_get_cpu_frequency(0); | 213 | max_freq = elanfreq_get_cpu_frequency(0); |
213 | 214 | ||
214 | /* table init */ | 215 | /* table init */ |
215 | for (i=0; (elanfreq_table[i].frequency != CPUFREQ_TABLE_END); i++) { | 216 | for (i=0; (elanfreq_table[i].frequency != CPUFREQ_TABLE_END); i++) { |
216 | if (elanfreq_table[i].frequency > max_freq) | 217 | if (elanfreq_table[i].frequency > max_freq) |
217 | elanfreq_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 218 | elanfreq_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
218 | } | 219 | } |
@@ -226,8 +227,7 @@ static int elanfreq_cpu_init(struct cpufreq_policy *policy) | |||
226 | if (result) | 227 | if (result) |
227 | return (result); | 228 | return (result); |
228 | 229 | ||
229 | cpufreq_frequency_table_get_attr(elanfreq_table, policy->cpu); | 230 | cpufreq_frequency_table_get_attr(elanfreq_table, policy->cpu); |
230 | |||
231 | return 0; | 231 | return 0; |
232 | } | 232 | } |
233 | 233 | ||
@@ -268,9 +268,9 @@ static struct freq_attr* elanfreq_attr[] = { | |||
268 | 268 | ||
269 | 269 | ||
270 | static struct cpufreq_driver elanfreq_driver = { | 270 | static struct cpufreq_driver elanfreq_driver = { |
271 | .get = elanfreq_get_cpu_frequency, | 271 | .get = elanfreq_get_cpu_frequency, |
272 | .verify = elanfreq_verify, | 272 | .verify = elanfreq_verify, |
273 | .target = elanfreq_target, | 273 | .target = elanfreq_target, |
274 | .init = elanfreq_cpu_init, | 274 | .init = elanfreq_cpu_init, |
275 | .exit = elanfreq_cpu_exit, | 275 | .exit = elanfreq_cpu_exit, |
276 | .name = "elanfreq", | 276 | .name = "elanfreq", |
@@ -279,23 +279,21 @@ static struct cpufreq_driver elanfreq_driver = { | |||
279 | }; | 279 | }; |
280 | 280 | ||
281 | 281 | ||
282 | static int __init elanfreq_init(void) | 282 | static int __init elanfreq_init(void) |
283 | { | 283 | { |
284 | struct cpuinfo_x86 *c = cpu_data; | 284 | struct cpuinfo_x86 *c = cpu_data; |
285 | 285 | ||
286 | /* Test if we have the right hardware */ | 286 | /* Test if we have the right hardware */ |
287 | if ((c->x86_vendor != X86_VENDOR_AMD) || | 287 | if ((c->x86_vendor != X86_VENDOR_AMD) || |
288 | (c->x86 != 4) || (c->x86_model!=10)) | 288 | (c->x86 != 4) || (c->x86_model!=10)) { |
289 | { | ||
290 | printk(KERN_INFO "elanfreq: error: no Elan processor found!\n"); | 289 | printk(KERN_INFO "elanfreq: error: no Elan processor found!\n"); |
291 | return -ENODEV; | 290 | return -ENODEV; |
292 | } | 291 | } |
293 | |||
294 | return cpufreq_register_driver(&elanfreq_driver); | 292 | return cpufreq_register_driver(&elanfreq_driver); |
295 | } | 293 | } |
296 | 294 | ||
297 | 295 | ||
298 | static void __exit elanfreq_exit(void) | 296 | static void __exit elanfreq_exit(void) |
299 | { | 297 | { |
300 | cpufreq_unregister_driver(&elanfreq_driver); | 298 | cpufreq_unregister_driver(&elanfreq_driver); |
301 | } | 299 | } |
@@ -309,4 +307,3 @@ MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs"); | |||
309 | 307 | ||
310 | module_init(elanfreq_init); | 308 | module_init(elanfreq_init); |
311 | module_exit(elanfreq_exit); | 309 | module_exit(elanfreq_exit); |
312 | |||
diff --git a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c index e86ea486c311..92afa3bc84f1 100644 --- a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c +++ b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c | |||
@@ -6,12 +6,12 @@ | |||
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
9 | * version 2 as published by the Free Software Foundation | 9 | * version 2 as published by the Free Software Foundation |
10 | * | 10 | * |
11 | * The author(s) of this software shall not be held liable for damages | 11 | * The author(s) of this software shall not be held liable for damages |
12 | * of any nature resulting due to the use of this software. This | 12 | * of any nature resulting due to the use of this software. This |
13 | * software is provided AS-IS with no warranties. | 13 | * software is provided AS-IS with no warranties. |
14 | * | 14 | * |
15 | * Theoritical note: | 15 | * Theoritical note: |
16 | * | 16 | * |
17 | * (see Geode(tm) CS5530 manual (rev.4.1) page.56) | 17 | * (see Geode(tm) CS5530 manual (rev.4.1) page.56) |
@@ -21,18 +21,18 @@ | |||
21 | * | 21 | * |
22 | * Suspend Modulation works by asserting and de-asserting the SUSP# pin | 22 | * Suspend Modulation works by asserting and de-asserting the SUSP# pin |
23 | * to CPU(GX1/GXLV) for configurable durations. When asserting SUSP# | 23 | * to CPU(GX1/GXLV) for configurable durations. When asserting SUSP# |
24 | * the CPU enters an idle state. GX1 stops its core clock when SUSP# is | 24 | * the CPU enters an idle state. GX1 stops its core clock when SUSP# is |
25 | * asserted then power consumption is reduced. | 25 | * asserted then power consumption is reduced. |
26 | * | 26 | * |
27 | * Suspend Modulation's OFF/ON duration are configurable | 27 | * Suspend Modulation's OFF/ON duration are configurable |
28 | * with 'Suspend Modulation OFF Count Register' | 28 | * with 'Suspend Modulation OFF Count Register' |
29 | * and 'Suspend Modulation ON Count Register'. | 29 | * and 'Suspend Modulation ON Count Register'. |
30 | * These registers are 8bit counters that represent the number of | 30 | * These registers are 8bit counters that represent the number of |
31 | * 32us intervals which the SUSP# pin is asserted(ON)/de-asserted(OFF) | 31 | * 32us intervals which the SUSP# pin is asserted(ON)/de-asserted(OFF) |
32 | * to the processor. | 32 | * to the processor. |
33 | * | 33 | * |
34 | * These counters define a ratio which is the effective frequency | 34 | * These counters define a ratio which is the effective frequency |
35 | * of operation of the system. | 35 | * of operation of the system. |
36 | * | 36 | * |
37 | * OFF Count | 37 | * OFF Count |
38 | * F_eff = Fgx * ---------------------- | 38 | * F_eff = Fgx * ---------------------- |
@@ -40,24 +40,24 @@ | |||
40 | * | 40 | * |
41 | * 0 <= On Count, Off Count <= 255 | 41 | * 0 <= On Count, Off Count <= 255 |
42 | * | 42 | * |
43 | * From these limits, we can get register values | 43 | * From these limits, we can get register values |
44 | * | 44 | * |
45 | * off_duration + on_duration <= MAX_DURATION | 45 | * off_duration + on_duration <= MAX_DURATION |
46 | * on_duration = off_duration * (stock_freq - freq) / freq | 46 | * on_duration = off_duration * (stock_freq - freq) / freq |
47 | * | 47 | * |
48 | * off_duration = (freq * DURATION) / stock_freq | 48 | * off_duration = (freq * DURATION) / stock_freq |
49 | * on_duration = DURATION - off_duration | 49 | * on_duration = DURATION - off_duration |
50 | * | 50 | * |
51 | * | 51 | * |
52 | *--------------------------------------------------------------------------- | 52 | *--------------------------------------------------------------------------- |
53 | * | 53 | * |
54 | * ChangeLog: | 54 | * ChangeLog: |
55 | * Dec. 12, 2003 Hiroshi Miura <miura@da-cha.org> | 55 | * Dec. 12, 2003 Hiroshi Miura <miura@da-cha.org> |
56 | * - fix on/off register mistake | 56 | * - fix on/off register mistake |
57 | * - fix cpu_khz calc when it stops cpu modulation. | 57 | * - fix cpu_khz calc when it stops cpu modulation. |
58 | * | 58 | * |
59 | * Dec. 11, 2002 Hiroshi Miura <miura@da-cha.org> | 59 | * Dec. 11, 2002 Hiroshi Miura <miura@da-cha.org> |
60 | * - rewrite for Cyrix MediaGX Cx5510/5520 and | 60 | * - rewrite for Cyrix MediaGX Cx5510/5520 and |
61 | * NatSemi Geode Cs5530(A). | 61 | * NatSemi Geode Cs5530(A). |
62 | * | 62 | * |
63 | * Jul. ??, 2002 Zwane Mwaikambo <zwane@commfireservices.com> | 63 | * Jul. ??, 2002 Zwane Mwaikambo <zwane@commfireservices.com> |
@@ -74,40 +74,40 @@ | |||
74 | ************************************************************************/ | 74 | ************************************************************************/ |
75 | 75 | ||
76 | #include <linux/kernel.h> | 76 | #include <linux/kernel.h> |
77 | #include <linux/module.h> | 77 | #include <linux/module.h> |
78 | #include <linux/init.h> | 78 | #include <linux/init.h> |
79 | #include <linux/smp.h> | 79 | #include <linux/smp.h> |
80 | #include <linux/cpufreq.h> | 80 | #include <linux/cpufreq.h> |
81 | #include <linux/pci.h> | 81 | #include <linux/pci.h> |
82 | #include <asm/processor.h> | 82 | #include <asm/processor.h> |
83 | #include <asm/errno.h> | 83 | #include <asm/errno.h> |
84 | 84 | ||
85 | /* PCI config registers, all at F0 */ | 85 | /* PCI config registers, all at F0 */ |
86 | #define PCI_PMER1 0x80 /* power management enable register 1 */ | 86 | #define PCI_PMER1 0x80 /* power management enable register 1 */ |
87 | #define PCI_PMER2 0x81 /* power management enable register 2 */ | 87 | #define PCI_PMER2 0x81 /* power management enable register 2 */ |
88 | #define PCI_PMER3 0x82 /* power management enable register 3 */ | 88 | #define PCI_PMER3 0x82 /* power management enable register 3 */ |
89 | #define PCI_IRQTC 0x8c /* irq speedup timer counter register:typical 2 to 4ms */ | 89 | #define PCI_IRQTC 0x8c /* irq speedup timer counter register:typical 2 to 4ms */ |
90 | #define PCI_VIDTC 0x8d /* video speedup timer counter register: typical 50 to 100ms */ | 90 | #define PCI_VIDTC 0x8d /* video speedup timer counter register: typical 50 to 100ms */ |
91 | #define PCI_MODOFF 0x94 /* suspend modulation OFF counter register, 1 = 32us */ | 91 | #define PCI_MODOFF 0x94 /* suspend modulation OFF counter register, 1 = 32us */ |
92 | #define PCI_MODON 0x95 /* suspend modulation ON counter register */ | 92 | #define PCI_MODON 0x95 /* suspend modulation ON counter register */ |
93 | #define PCI_SUSCFG 0x96 /* suspend configuration register */ | 93 | #define PCI_SUSCFG 0x96 /* suspend configuration register */ |
94 | 94 | ||
95 | /* PMER1 bits */ | 95 | /* PMER1 bits */ |
96 | #define GPM (1<<0) /* global power management */ | 96 | #define GPM (1<<0) /* global power management */ |
97 | #define GIT (1<<1) /* globally enable PM device idle timers */ | 97 | #define GIT (1<<1) /* globally enable PM device idle timers */ |
98 | #define GTR (1<<2) /* globally enable IO traps */ | 98 | #define GTR (1<<2) /* globally enable IO traps */ |
99 | #define IRQ_SPDUP (1<<3) /* disable clock throttle during interrupt handling */ | 99 | #define IRQ_SPDUP (1<<3) /* disable clock throttle during interrupt handling */ |
100 | #define VID_SPDUP (1<<4) /* disable clock throttle during vga video handling */ | 100 | #define VID_SPDUP (1<<4) /* disable clock throttle during vga video handling */ |
101 | 101 | ||
102 | /* SUSCFG bits */ | 102 | /* SUSCFG bits */ |
103 | #define SUSMOD (1<<0) /* enable/disable suspend modulation */ | 103 | #define SUSMOD (1<<0) /* enable/disable suspend modulation */ |
104 | /* the belows support only with cs5530 (after rev.1.2)/cs5530A */ | 104 | /* the belows support only with cs5530 (after rev.1.2)/cs5530A */ |
105 | #define SMISPDUP (1<<1) /* select how SMI re-enable suspend modulation: */ | 105 | #define SMISPDUP (1<<1) /* select how SMI re-enable suspend modulation: */ |
106 | /* IRQTC timer or read SMI speedup disable reg.(F1BAR[08-09h]) */ | 106 | /* IRQTC timer or read SMI speedup disable reg.(F1BAR[08-09h]) */ |
107 | #define SUSCFG (1<<2) /* enable powering down a GXLV processor. "Special 3Volt Suspend" mode */ | 107 | #define SUSCFG (1<<2) /* enable powering down a GXLV processor. "Special 3Volt Suspend" mode */ |
108 | /* the belows support only with cs5530A */ | 108 | /* the belows support only with cs5530A */ |
109 | #define PWRSVE_ISA (1<<3) /* stop ISA clock */ | 109 | #define PWRSVE_ISA (1<<3) /* stop ISA clock */ |
110 | #define PWRSVE (1<<4) /* active idle */ | 110 | #define PWRSVE (1<<4) /* active idle */ |
111 | 111 | ||
112 | struct gxfreq_params { | 112 | struct gxfreq_params { |
113 | u8 on_duration; | 113 | u8 on_duration; |
@@ -128,7 +128,7 @@ module_param (pci_busclk, int, 0444); | |||
128 | 128 | ||
129 | /* maximum duration for which the cpu may be suspended | 129 | /* maximum duration for which the cpu may be suspended |
130 | * (32us * MAX_DURATION). If no parameter is given, this defaults | 130 | * (32us * MAX_DURATION). If no parameter is given, this defaults |
131 | * to 255. | 131 | * to 255. |
132 | * Note that this leads to a maximum of 8 ms(!) where the CPU clock | 132 | * Note that this leads to a maximum of 8 ms(!) where the CPU clock |
133 | * is suspended -- processing power is just 0.39% of what it used to be, | 133 | * is suspended -- processing power is just 0.39% of what it used to be, |
134 | * though. 781.25 kHz(!) for a 200 MHz processor -- wow. */ | 134 | * though. 781.25 kHz(!) for a 200 MHz processor -- wow. */ |
@@ -144,17 +144,17 @@ module_param (max_duration, int, 0444); | |||
144 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "gx-suspmod", msg) | 144 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "gx-suspmod", msg) |
145 | 145 | ||
146 | /** | 146 | /** |
147 | * we can detect a core multipiler from dir0_lsb | 147 | * we can detect a core multipiler from dir0_lsb |
148 | * from GX1 datasheet p.56, | 148 | * from GX1 datasheet p.56, |
149 | * MULT[3:0]: | 149 | * MULT[3:0]: |
150 | * 0000 = SYSCLK multiplied by 4 (test only) | 150 | * 0000 = SYSCLK multiplied by 4 (test only) |
151 | * 0001 = SYSCLK multiplied by 10 | 151 | * 0001 = SYSCLK multiplied by 10 |
152 | * 0010 = SYSCLK multiplied by 4 | 152 | * 0010 = SYSCLK multiplied by 4 |
153 | * 0011 = SYSCLK multiplied by 6 | 153 | * 0011 = SYSCLK multiplied by 6 |
154 | * 0100 = SYSCLK multiplied by 9 | 154 | * 0100 = SYSCLK multiplied by 9 |
155 | * 0101 = SYSCLK multiplied by 5 | 155 | * 0101 = SYSCLK multiplied by 5 |
156 | * 0110 = SYSCLK multiplied by 7 | 156 | * 0110 = SYSCLK multiplied by 7 |
157 | * 0111 = SYSCLK multiplied by 8 | 157 | * 0111 = SYSCLK multiplied by 8 |
158 | * of 33.3MHz | 158 | * of 33.3MHz |
159 | **/ | 159 | **/ |
160 | static int gx_freq_mult[16] = { | 160 | static int gx_freq_mult[16] = { |
@@ -164,17 +164,17 @@ static int gx_freq_mult[16] = { | |||
164 | 164 | ||
165 | 165 | ||
166 | /**************************************************************** | 166 | /**************************************************************** |
167 | * Low Level chipset interface * | 167 | * Low Level chipset interface * |
168 | ****************************************************************/ | 168 | ****************************************************************/ |
169 | static struct pci_device_id gx_chipset_tbl[] __initdata = { | 169 | static struct pci_device_id gx_chipset_tbl[] __initdata = { |
170 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, PCI_ANY_ID, PCI_ANY_ID }, | 170 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, PCI_ANY_ID, PCI_ANY_ID }, |
171 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, PCI_ANY_ID, PCI_ANY_ID }, | 171 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, PCI_ANY_ID, PCI_ANY_ID }, |
172 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, PCI_ANY_ID, PCI_ANY_ID }, | 172 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, PCI_ANY_ID, PCI_ANY_ID }, |
173 | { 0, }, | 173 | { 0, }, |
174 | }; | 174 | }; |
175 | 175 | ||
176 | /** | 176 | /** |
177 | * gx_detect_chipset: | 177 | * gx_detect_chipset: |
178 | * | 178 | * |
179 | **/ | 179 | **/ |
180 | static __init struct pci_dev *gx_detect_chipset(void) | 180 | static __init struct pci_dev *gx_detect_chipset(void) |
@@ -182,17 +182,16 @@ static __init struct pci_dev *gx_detect_chipset(void) | |||
182 | struct pci_dev *gx_pci = NULL; | 182 | struct pci_dev *gx_pci = NULL; |
183 | 183 | ||
184 | /* check if CPU is a MediaGX or a Geode. */ | 184 | /* check if CPU is a MediaGX or a Geode. */ |
185 | if ((current_cpu_data.x86_vendor != X86_VENDOR_NSC) && | 185 | if ((current_cpu_data.x86_vendor != X86_VENDOR_NSC) && |
186 | (current_cpu_data.x86_vendor != X86_VENDOR_CYRIX)) { | 186 | (current_cpu_data.x86_vendor != X86_VENDOR_CYRIX)) { |
187 | dprintk("error: no MediaGX/Geode processor found!\n"); | 187 | dprintk("error: no MediaGX/Geode processor found!\n"); |
188 | return NULL; | 188 | return NULL; |
189 | } | 189 | } |
190 | 190 | ||
191 | /* detect which companion chip is used */ | 191 | /* detect which companion chip is used */ |
192 | while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) { | 192 | while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) { |
193 | if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL) { | 193 | if ((pci_match_id(gx_chipset_tbl, gx_pci)) != NULL) |
194 | return gx_pci; | 194 | return gx_pci; |
195 | } | ||
196 | } | 195 | } |
197 | 196 | ||
198 | dprintk("error: no supported chipset found!\n"); | 197 | dprintk("error: no supported chipset found!\n"); |
@@ -200,24 +199,24 @@ static __init struct pci_dev *gx_detect_chipset(void) | |||
200 | } | 199 | } |
201 | 200 | ||
202 | /** | 201 | /** |
203 | * gx_get_cpuspeed: | 202 | * gx_get_cpuspeed: |
204 | * | 203 | * |
205 | * Finds out at which efficient frequency the Cyrix MediaGX/NatSemi Geode CPU runs. | 204 | * Finds out at which efficient frequency the Cyrix MediaGX/NatSemi Geode CPU runs. |
206 | */ | 205 | */ |
207 | static unsigned int gx_get_cpuspeed(unsigned int cpu) | 206 | static unsigned int gx_get_cpuspeed(unsigned int cpu) |
208 | { | 207 | { |
209 | if ((gx_params->pci_suscfg & SUSMOD) == 0) | 208 | if ((gx_params->pci_suscfg & SUSMOD) == 0) |
210 | return stock_freq; | 209 | return stock_freq; |
211 | 210 | ||
212 | return (stock_freq * gx_params->off_duration) | 211 | return (stock_freq * gx_params->off_duration) |
213 | / (gx_params->on_duration + gx_params->off_duration); | 212 | / (gx_params->on_duration + gx_params->off_duration); |
214 | } | 213 | } |
215 | 214 | ||
216 | /** | 215 | /** |
217 | * gx_validate_speed: | 216 | * gx_validate_speed: |
218 | * determine current cpu speed | 217 | * determine current cpu speed |
219 | * | 218 | * |
220 | **/ | 219 | **/ |
221 | 220 | ||
222 | static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off_duration) | 221 | static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off_duration) |
223 | { | 222 | { |
@@ -230,7 +229,7 @@ static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off | |||
230 | *on_duration=0; | 229 | *on_duration=0; |
231 | 230 | ||
232 | for (i=max_duration; i>0; i--) { | 231 | for (i=max_duration; i>0; i--) { |
233 | tmp_off = ((khz * i) / stock_freq) & 0xff; | 232 | tmp_off = ((khz * i) / stock_freq) & 0xff; |
234 | tmp_on = i - tmp_off; | 233 | tmp_on = i - tmp_off; |
235 | tmp_freq = (stock_freq * tmp_off) / i; | 234 | tmp_freq = (stock_freq * tmp_off) / i; |
236 | /* if this relation is closer to khz, use this. If it's equal, | 235 | /* if this relation is closer to khz, use this. If it's equal, |
@@ -247,18 +246,17 @@ static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off | |||
247 | 246 | ||
248 | 247 | ||
249 | /** | 248 | /** |
250 | * gx_set_cpuspeed: | 249 | * gx_set_cpuspeed: |
251 | * set cpu speed in khz. | 250 | * set cpu speed in khz. |
252 | **/ | 251 | **/ |
253 | 252 | ||
254 | static void gx_set_cpuspeed(unsigned int khz) | 253 | static void gx_set_cpuspeed(unsigned int khz) |
255 | { | 254 | { |
256 | u8 suscfg, pmer1; | 255 | u8 suscfg, pmer1; |
257 | unsigned int new_khz; | 256 | unsigned int new_khz; |
258 | unsigned long flags; | 257 | unsigned long flags; |
259 | struct cpufreq_freqs freqs; | 258 | struct cpufreq_freqs freqs; |
260 | 259 | ||
261 | |||
262 | freqs.cpu = 0; | 260 | freqs.cpu = 0; |
263 | freqs.old = gx_get_cpuspeed(0); | 261 | freqs.old = gx_get_cpuspeed(0); |
264 | 262 | ||
@@ -303,18 +301,18 @@ static void gx_set_cpuspeed(unsigned int khz) | |||
303 | pci_write_config_byte(gx_params->cs55x0, PCI_MODOFF, gx_params->off_duration); | 301 | pci_write_config_byte(gx_params->cs55x0, PCI_MODOFF, gx_params->off_duration); |
304 | pci_write_config_byte(gx_params->cs55x0, PCI_MODON, gx_params->on_duration); | 302 | pci_write_config_byte(gx_params->cs55x0, PCI_MODON, gx_params->on_duration); |
305 | 303 | ||
306 | pci_write_config_byte(gx_params->cs55x0, PCI_SUSCFG, suscfg); | 304 | pci_write_config_byte(gx_params->cs55x0, PCI_SUSCFG, suscfg); |
307 | pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &suscfg); | 305 | pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &suscfg); |
308 | 306 | ||
309 | local_irq_restore(flags); | 307 | local_irq_restore(flags); |
310 | 308 | ||
311 | gx_params->pci_suscfg = suscfg; | 309 | gx_params->pci_suscfg = suscfg; |
312 | 310 | ||
313 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 311 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
314 | 312 | ||
315 | dprintk("suspend modulation w/ duration of ON:%d us, OFF:%d us\n", | 313 | dprintk("suspend modulation w/ duration of ON:%d us, OFF:%d us\n", |
316 | gx_params->on_duration * 32, gx_params->off_duration * 32); | 314 | gx_params->on_duration * 32, gx_params->off_duration * 32); |
317 | dprintk("suspend modulation w/ clock speed: %d kHz.\n", freqs.new); | 315 | dprintk("suspend modulation w/ clock speed: %d kHz.\n", freqs.new); |
318 | } | 316 | } |
319 | 317 | ||
320 | /**************************************************************** | 318 | /**************************************************************** |
@@ -322,10 +320,10 @@ static void gx_set_cpuspeed(unsigned int khz) | |||
322 | ****************************************************************/ | 320 | ****************************************************************/ |
323 | 321 | ||
324 | /* | 322 | /* |
325 | * cpufreq_gx_verify: test if frequency range is valid | 323 | * cpufreq_gx_verify: test if frequency range is valid |
326 | * | 324 | * |
327 | * This function checks if a given frequency range in kHz is valid | 325 | * This function checks if a given frequency range in kHz is valid |
328 | * for the hardware supported by the driver. | 326 | * for the hardware supported by the driver. |
329 | */ | 327 | */ |
330 | 328 | ||
331 | static int cpufreq_gx_verify(struct cpufreq_policy *policy) | 329 | static int cpufreq_gx_verify(struct cpufreq_policy *policy) |
@@ -333,8 +331,8 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) | |||
333 | unsigned int tmp_freq = 0; | 331 | unsigned int tmp_freq = 0; |
334 | u8 tmp1, tmp2; | 332 | u8 tmp1, tmp2; |
335 | 333 | ||
336 | if (!stock_freq || !policy) | 334 | if (!stock_freq || !policy) |
337 | return -EINVAL; | 335 | return -EINVAL; |
338 | 336 | ||
339 | policy->cpu = 0; | 337 | policy->cpu = 0; |
340 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); | 338 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); |
@@ -342,14 +340,14 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) | |||
342 | /* it needs to be assured that at least one supported frequency is | 340 | /* it needs to be assured that at least one supported frequency is |
343 | * within policy->min and policy->max. If it is not, policy->max | 341 | * within policy->min and policy->max. If it is not, policy->max |
344 | * needs to be increased until one freuqency is supported. | 342 | * needs to be increased until one freuqency is supported. |
345 | * policy->min may not be decreased, though. This way we guarantee a | 343 | * policy->min may not be decreased, though. This way we guarantee a |
346 | * specific processing capacity. | 344 | * specific processing capacity. |
347 | */ | 345 | */ |
348 | tmp_freq = gx_validate_speed(policy->min, &tmp1, &tmp2); | 346 | tmp_freq = gx_validate_speed(policy->min, &tmp1, &tmp2); |
349 | if (tmp_freq < policy->min) | 347 | if (tmp_freq < policy->min) |
350 | tmp_freq += stock_freq / max_duration; | 348 | tmp_freq += stock_freq / max_duration; |
351 | policy->min = tmp_freq; | 349 | policy->min = tmp_freq; |
352 | if (policy->min > policy->max) | 350 | if (policy->min > policy->max) |
353 | policy->max = tmp_freq; | 351 | policy->max = tmp_freq; |
354 | tmp_freq = gx_validate_speed(policy->max, &tmp1, &tmp2); | 352 | tmp_freq = gx_validate_speed(policy->max, &tmp1, &tmp2); |
355 | if (tmp_freq > policy->max) | 353 | if (tmp_freq > policy->max) |
@@ -358,12 +356,12 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) | |||
358 | if (policy->max < policy->min) | 356 | if (policy->max < policy->min) |
359 | policy->max = policy->min; | 357 | policy->max = policy->min; |
360 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); | 358 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); |
361 | 359 | ||
362 | return 0; | 360 | return 0; |
363 | } | 361 | } |
364 | 362 | ||
365 | /* | 363 | /* |
366 | * cpufreq_gx_target: | 364 | * cpufreq_gx_target: |
367 | * | 365 | * |
368 | */ | 366 | */ |
369 | static int cpufreq_gx_target(struct cpufreq_policy *policy, | 367 | static int cpufreq_gx_target(struct cpufreq_policy *policy, |
@@ -373,8 +371,8 @@ static int cpufreq_gx_target(struct cpufreq_policy *policy, | |||
373 | u8 tmp1, tmp2; | 371 | u8 tmp1, tmp2; |
374 | unsigned int tmp_freq; | 372 | unsigned int tmp_freq; |
375 | 373 | ||
376 | if (!stock_freq || !policy) | 374 | if (!stock_freq || !policy) |
377 | return -EINVAL; | 375 | return -EINVAL; |
378 | 376 | ||
379 | policy->cpu = 0; | 377 | policy->cpu = 0; |
380 | 378 | ||
@@ -431,7 +429,7 @@ static int cpufreq_gx_cpu_init(struct cpufreq_policy *policy) | |||
431 | return 0; | 429 | return 0; |
432 | } | 430 | } |
433 | 431 | ||
434 | /* | 432 | /* |
435 | * cpufreq_gx_init: | 433 | * cpufreq_gx_init: |
436 | * MediaGX/Geode GX initialize cpufreq driver | 434 | * MediaGX/Geode GX initialize cpufreq driver |
437 | */ | 435 | */ |
@@ -452,7 +450,7 @@ static int __init cpufreq_gx_init(void) | |||
452 | u32 class_rev; | 450 | u32 class_rev; |
453 | 451 | ||
454 | /* Test if we have the right hardware */ | 452 | /* Test if we have the right hardware */ |
455 | if ((gx_pci = gx_detect_chipset()) == NULL) | 453 | if ((gx_pci = gx_detect_chipset()) == NULL) |
456 | return -ENODEV; | 454 | return -ENODEV; |
457 | 455 | ||
458 | /* check whether module parameters are sane */ | 456 | /* check whether module parameters are sane */ |
@@ -461,10 +459,9 @@ static int __init cpufreq_gx_init(void) | |||
461 | 459 | ||
462 | dprintk("geode suspend modulation available.\n"); | 460 | dprintk("geode suspend modulation available.\n"); |
463 | 461 | ||
464 | params = kmalloc(sizeof(struct gxfreq_params), GFP_KERNEL); | 462 | params = kzalloc(sizeof(struct gxfreq_params), GFP_KERNEL); |
465 | if (params == NULL) | 463 | if (params == NULL) |
466 | return -ENOMEM; | 464 | return -ENOMEM; |
467 | memset(params, 0, sizeof(struct gxfreq_params)); | ||
468 | 465 | ||
469 | params->cs55x0 = gx_pci; | 466 | params->cs55x0 = gx_pci; |
470 | gx_params = params; | 467 | gx_params = params; |
@@ -478,7 +475,7 @@ static int __init cpufreq_gx_init(void) | |||
478 | pci_read_config_dword(params->cs55x0, PCI_CLASS_REVISION, &class_rev); | 475 | pci_read_config_dword(params->cs55x0, PCI_CLASS_REVISION, &class_rev); |
479 | params->pci_rev = class_rev && 0xff; | 476 | params->pci_rev = class_rev && 0xff; |
480 | 477 | ||
481 | if ((ret = cpufreq_register_driver(&gx_suspmod_driver))) { | 478 | if ((ret = cpufreq_register_driver(&gx_suspmod_driver))) { |
482 | kfree(params); | 479 | kfree(params); |
483 | return ret; /* register error! */ | 480 | return ret; /* register error! */ |
484 | } | 481 | } |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.h b/arch/i386/kernel/cpu/cpufreq/longhaul.h index 2a495c162ec7..d3a95d77ee85 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.h +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.h | |||
@@ -234,7 +234,7 @@ static int __initdata ezrat_eblcr[32] = { | |||
234 | 234 | ||
235 | /* | 235 | /* |
236 | * VIA C3 Nehemiah */ | 236 | * VIA C3 Nehemiah */ |
237 | 237 | ||
238 | static int __initdata nehemiah_a_clock_ratio[32] = { | 238 | static int __initdata nehemiah_a_clock_ratio[32] = { |
239 | 100, /* 0000 -> 10.0x */ | 239 | 100, /* 0000 -> 10.0x */ |
240 | 160, /* 0001 -> 16.0x */ | 240 | 160, /* 0001 -> 16.0x */ |
@@ -446,7 +446,7 @@ static int __initdata nehemiah_c_eblcr[32] = { | |||
446 | /* end of table */ | 446 | /* end of table */ |
447 | }; | 447 | }; |
448 | 448 | ||
449 | /* | 449 | /* |
450 | * Voltage scales. Div/Mod by 1000 to get actual voltage. | 450 | * Voltage scales. Div/Mod by 1000 to get actual voltage. |
451 | * Which scale to use depends on the VRM type in use. | 451 | * Which scale to use depends on the VRM type in use. |
452 | */ | 452 | */ |
diff --git a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c index cc73a7ae34bc..ab6504efd801 100644 --- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c | |||
@@ -14,7 +14,7 @@ | |||
14 | * The author(s) of this software shall not be held liable for damages | 14 | * The author(s) of this software shall not be held liable for damages |
15 | * of any nature resulting due to the use of this software. This | 15 | * of any nature resulting due to the use of this software. This |
16 | * software is provided AS-IS with no warranties. | 16 | * software is provided AS-IS with no warranties. |
17 | * | 17 | * |
18 | * Date Errata Description | 18 | * Date Errata Description |
19 | * 20020525 N44, O17 12.5% or 25% DC causes lockup | 19 | * 20020525 N44, O17 12.5% or 25% DC causes lockup |
20 | * | 20 | * |
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/config.h> | 23 | #include <linux/config.h> |
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/smp.h> | 27 | #include <linux/smp.h> |
28 | #include <linux/cpufreq.h> | 28 | #include <linux/cpufreq.h> |
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/cpumask.h> | 30 | #include <linux/cpumask.h> |
31 | #include <linux/sched.h> /* current / set_cpus_allowed() */ | 31 | #include <linux/sched.h> /* current / set_cpus_allowed() */ |
32 | 32 | ||
33 | #include <asm/processor.h> | 33 | #include <asm/processor.h> |
34 | #include <asm/msr.h> | 34 | #include <asm/msr.h> |
35 | #include <asm/timex.h> | 35 | #include <asm/timex.h> |
36 | 36 | ||
@@ -79,7 +79,7 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) | |||
79 | } else { | 79 | } else { |
80 | dprintk("CPU#%d setting duty cycle to %d%%\n", | 80 | dprintk("CPU#%d setting duty cycle to %d%%\n", |
81 | cpu, ((125 * newstate) / 10)); | 81 | cpu, ((125 * newstate) / 10)); |
82 | /* bits 63 - 5 : reserved | 82 | /* bits 63 - 5 : reserved |
83 | * bit 4 : enable/disable | 83 | * bit 4 : enable/disable |
84 | * bits 3-1 : duty cycle | 84 | * bits 3-1 : duty cycle |
85 | * bit 0 : reserved | 85 | * bit 0 : reserved |
@@ -132,7 +132,7 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
132 | } | 132 | } |
133 | 133 | ||
134 | /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software | 134 | /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software |
135 | * Developer's Manual, Volume 3 | 135 | * Developer's Manual, Volume 3 |
136 | */ | 136 | */ |
137 | cpus_allowed = current->cpus_allowed; | 137 | cpus_allowed = current->cpus_allowed; |
138 | 138 | ||
@@ -206,7 +206,7 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | |||
206 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); | 206 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); |
207 | } | 207 | } |
208 | 208 | ||
209 | 209 | ||
210 | 210 | ||
211 | static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | 211 | static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) |
212 | { | 212 | { |
@@ -234,7 +234,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
234 | dprintk("has errata -- disabling frequencies lower than 2ghz\n"); | 234 | dprintk("has errata -- disabling frequencies lower than 2ghz\n"); |
235 | break; | 235 | break; |
236 | } | 236 | } |
237 | 237 | ||
238 | /* get max frequency */ | 238 | /* get max frequency */ |
239 | stock_freq = cpufreq_p4_get_frequency(c); | 239 | stock_freq = cpufreq_p4_get_frequency(c); |
240 | if (!stock_freq) | 240 | if (!stock_freq) |
@@ -244,13 +244,13 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
244 | for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { | 244 | for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { |
245 | if ((i<2) && (has_N44_O17_errata[policy->cpu])) | 245 | if ((i<2) && (has_N44_O17_errata[policy->cpu])) |
246 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 246 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
247 | else if (has_N60_errata[policy->cpu] && p4clockmod_table[i].frequency < 2000000) | 247 | else if (has_N60_errata[policy->cpu] && ((stock_freq * i)/8) < 2000000) |
248 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 248 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
249 | else | 249 | else |
250 | p4clockmod_table[i].frequency = (stock_freq * i)/8; | 250 | p4clockmod_table[i].frequency = (stock_freq * i)/8; |
251 | } | 251 | } |
252 | cpufreq_frequency_table_get_attr(p4clockmod_table, policy->cpu); | 252 | cpufreq_frequency_table_get_attr(p4clockmod_table, policy->cpu); |
253 | 253 | ||
254 | /* cpuinfo and default policy values */ | 254 | /* cpuinfo and default policy values */ |
255 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; | 255 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; |
256 | policy->cpuinfo.transition_latency = 1000000; /* assumed */ | 256 | policy->cpuinfo.transition_latency = 1000000; /* assumed */ |
@@ -262,7 +262,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
262 | 262 | ||
263 | static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy) | 263 | static int cpufreq_p4_cpu_exit(struct cpufreq_policy *policy) |
264 | { | 264 | { |
265 | cpufreq_frequency_table_put_attr(policy->cpu); | 265 | cpufreq_frequency_table_put_attr(policy->cpu); |
266 | return 0; | 266 | return 0; |
267 | } | 267 | } |
268 | 268 | ||
@@ -298,7 +298,7 @@ static struct freq_attr* p4clockmod_attr[] = { | |||
298 | }; | 298 | }; |
299 | 299 | ||
300 | static struct cpufreq_driver p4clockmod_driver = { | 300 | static struct cpufreq_driver p4clockmod_driver = { |
301 | .verify = cpufreq_p4_verify, | 301 | .verify = cpufreq_p4_verify, |
302 | .target = cpufreq_p4_target, | 302 | .target = cpufreq_p4_target, |
303 | .init = cpufreq_p4_cpu_init, | 303 | .init = cpufreq_p4_cpu_init, |
304 | .exit = cpufreq_p4_cpu_exit, | 304 | .exit = cpufreq_p4_cpu_exit, |
@@ -310,12 +310,12 @@ static struct cpufreq_driver p4clockmod_driver = { | |||
310 | 310 | ||
311 | 311 | ||
312 | static int __init cpufreq_p4_init(void) | 312 | static int __init cpufreq_p4_init(void) |
313 | { | 313 | { |
314 | struct cpuinfo_x86 *c = cpu_data; | 314 | struct cpuinfo_x86 *c = cpu_data; |
315 | int ret; | 315 | int ret; |
316 | 316 | ||
317 | /* | 317 | /* |
318 | * THERM_CONTROL is architectural for IA32 now, so | 318 | * THERM_CONTROL is architectural for IA32 now, so |
319 | * we can rely on the capability checks | 319 | * we can rely on the capability checks |
320 | */ | 320 | */ |
321 | if (c->x86_vendor != X86_VENDOR_INTEL) | 321 | if (c->x86_vendor != X86_VENDOR_INTEL) |
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k6.c b/arch/i386/kernel/cpu/cpufreq/powernow-k6.c index 222f8cfe3c57..f89524051e4a 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k6.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k6.c | |||
@@ -8,7 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/cpufreq.h> | 13 | #include <linux/cpufreq.h> |
14 | #include <linux/ioport.h> | 14 | #include <linux/ioport.h> |
@@ -50,7 +50,7 @@ static int powernow_k6_get_cpu_multiplier(void) | |||
50 | { | 50 | { |
51 | u64 invalue = 0; | 51 | u64 invalue = 0; |
52 | u32 msrval; | 52 | u32 msrval; |
53 | 53 | ||
54 | msrval = POWERNOW_IOPORT + 0x1; | 54 | msrval = POWERNOW_IOPORT + 0x1; |
55 | wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ | 55 | wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ |
56 | invalue=inl(POWERNOW_IOPORT + 0x8); | 56 | invalue=inl(POWERNOW_IOPORT + 0x8); |
@@ -81,7 +81,7 @@ static void powernow_k6_set_state (unsigned int best_i) | |||
81 | freqs.old = busfreq * powernow_k6_get_cpu_multiplier(); | 81 | freqs.old = busfreq * powernow_k6_get_cpu_multiplier(); |
82 | freqs.new = busfreq * clock_ratio[best_i].index; | 82 | freqs.new = busfreq * clock_ratio[best_i].index; |
83 | freqs.cpu = 0; /* powernow-k6.c is UP only driver */ | 83 | freqs.cpu = 0; /* powernow-k6.c is UP only driver */ |
84 | 84 | ||
85 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 85 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
86 | 86 | ||
87 | /* we now need to transform best_i to the BVC format, see AMD#23446 */ | 87 | /* we now need to transform best_i to the BVC format, see AMD#23446 */ |
@@ -152,7 +152,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy) | |||
152 | busfreq = cpu_khz / max_multiplier; | 152 | busfreq = cpu_khz / max_multiplier; |
153 | 153 | ||
154 | /* table init */ | 154 | /* table init */ |
155 | for (i=0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { | 155 | for (i=0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { |
156 | if (clock_ratio[i].index > max_multiplier) | 156 | if (clock_ratio[i].index > max_multiplier) |
157 | clock_ratio[i].frequency = CPUFREQ_ENTRY_INVALID; | 157 | clock_ratio[i].frequency = CPUFREQ_ENTRY_INVALID; |
158 | else | 158 | else |
@@ -182,7 +182,7 @@ static int powernow_k6_cpu_exit(struct cpufreq_policy *policy) | |||
182 | powernow_k6_set_state(i); | 182 | powernow_k6_set_state(i); |
183 | } | 183 | } |
184 | cpufreq_frequency_table_put_attr(policy->cpu); | 184 | cpufreq_frequency_table_put_attr(policy->cpu); |
185 | return 0; | 185 | return 0; |
186 | } | 186 | } |
187 | 187 | ||
188 | static unsigned int powernow_k6_get(unsigned int cpu) | 188 | static unsigned int powernow_k6_get(unsigned int cpu) |
@@ -196,8 +196,8 @@ static struct freq_attr* powernow_k6_attr[] = { | |||
196 | }; | 196 | }; |
197 | 197 | ||
198 | static struct cpufreq_driver powernow_k6_driver = { | 198 | static struct cpufreq_driver powernow_k6_driver = { |
199 | .verify = powernow_k6_verify, | 199 | .verify = powernow_k6_verify, |
200 | .target = powernow_k6_target, | 200 | .target = powernow_k6_target, |
201 | .init = powernow_k6_cpu_init, | 201 | .init = powernow_k6_cpu_init, |
202 | .exit = powernow_k6_cpu_exit, | 202 | .exit = powernow_k6_cpu_exit, |
203 | .get = powernow_k6_get, | 203 | .get = powernow_k6_get, |
@@ -215,7 +215,7 @@ static struct cpufreq_driver powernow_k6_driver = { | |||
215 | * on success. | 215 | * on success. |
216 | */ | 216 | */ |
217 | static int __init powernow_k6_init(void) | 217 | static int __init powernow_k6_init(void) |
218 | { | 218 | { |
219 | struct cpuinfo_x86 *c = cpu_data; | 219 | struct cpuinfo_x86 *c = cpu_data; |
220 | 220 | ||
221 | if ((c->x86_vendor != X86_VENDOR_AMD) || (c->x86 != 5) || | 221 | if ((c->x86_vendor != X86_VENDOR_AMD) || (c->x86 != 5) || |
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c index edcd626001da..2bf4237cb94e 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c | |||
@@ -199,8 +199,8 @@ static int get_ranges (unsigned char *pst) | |||
199 | powernow_table[j].index |= (vid << 8); /* upper 8 bits */ | 199 | powernow_table[j].index |= (vid << 8); /* upper 8 bits */ |
200 | 200 | ||
201 | dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " | 201 | dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " |
202 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, | 202 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, |
203 | fid_codes[fid] % 10, speed/1000, vid, | 203 | fid_codes[fid] % 10, speed/1000, vid, |
204 | mobile_vid_table[vid]/1000, | 204 | mobile_vid_table[vid]/1000, |
205 | mobile_vid_table[vid]%1000); | 205 | mobile_vid_table[vid]%1000); |
206 | } | 206 | } |
@@ -368,8 +368,8 @@ static int powernow_acpi_init(void) | |||
368 | } | 368 | } |
369 | 369 | ||
370 | dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " | 370 | dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " |
371 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, | 371 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, |
372 | fid_codes[fid] % 10, speed/1000, vid, | 372 | fid_codes[fid] % 10, speed/1000, vid, |
373 | mobile_vid_table[vid]/1000, | 373 | mobile_vid_table[vid]/1000, |
374 | mobile_vid_table[vid]%1000); | 374 | mobile_vid_table[vid]%1000); |
375 | 375 | ||
@@ -460,7 +460,7 @@ static int powernow_decode_bios (int maxfid, int startvid) | |||
460 | (maxfid==pst->maxfid) && (startvid==pst->startvid)) | 460 | (maxfid==pst->maxfid) && (startvid==pst->startvid)) |
461 | { | 461 | { |
462 | dprintk ("PST:%d (@%p)\n", i, pst); | 462 | dprintk ("PST:%d (@%p)\n", i, pst); |
463 | dprintk (" cpuid: 0x%x fsb: %d maxFID: 0x%x startvid: 0x%x\n", | 463 | dprintk (" cpuid: 0x%x fsb: %d maxFID: 0x%x startvid: 0x%x\n", |
464 | pst->cpuid, pst->fsbspeed, pst->maxfid, pst->startvid); | 464 | pst->cpuid, pst->fsbspeed, pst->maxfid, pst->startvid); |
465 | 465 | ||
466 | ret = get_ranges ((char *) pst + sizeof (struct pst_s)); | 466 | ret = get_ranges ((char *) pst + sizeof (struct pst_s)); |
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c index e11a09207ec8..712a26bd4457 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c | |||
@@ -40,21 +40,22 @@ | |||
40 | 40 | ||
41 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | 41 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI |
42 | #include <linux/acpi.h> | 42 | #include <linux/acpi.h> |
43 | #include <linux/mutex.h> | ||
43 | #include <acpi/processor.h> | 44 | #include <acpi/processor.h> |
44 | #endif | 45 | #endif |
45 | 46 | ||
46 | #define PFX "powernow-k8: " | 47 | #define PFX "powernow-k8: " |
47 | #define BFX PFX "BIOS error: " | 48 | #define BFX PFX "BIOS error: " |
48 | #define VERSION "version 1.60.0" | 49 | #define VERSION "version 1.60.1" |
49 | #include "powernow-k8.h" | 50 | #include "powernow-k8.h" |
50 | 51 | ||
51 | /* serialize freq changes */ | 52 | /* serialize freq changes */ |
52 | static DECLARE_MUTEX(fidvid_sem); | 53 | static DEFINE_MUTEX(fidvid_mutex); |
53 | 54 | ||
54 | static struct powernow_k8_data *powernow_data[NR_CPUS]; | 55 | static struct powernow_k8_data *powernow_data[NR_CPUS]; |
55 | 56 | ||
56 | #ifndef CONFIG_SMP | 57 | #ifndef CONFIG_SMP |
57 | static cpumask_t cpu_core_map[1]; | 58 | static cpumask_t cpu_core_map[1] = { CPU_MASK_ALL }; |
58 | #endif | 59 | #endif |
59 | 60 | ||
60 | /* Return a frequency in MHz, given an input fid */ | 61 | /* Return a frequency in MHz, given an input fid */ |
@@ -83,11 +84,10 @@ static u32 find_millivolts_from_vid(struct powernow_k8_data *data, u32 vid) | |||
83 | */ | 84 | */ |
84 | static u32 convert_fid_to_vco_fid(u32 fid) | 85 | static u32 convert_fid_to_vco_fid(u32 fid) |
85 | { | 86 | { |
86 | if (fid < HI_FID_TABLE_BOTTOM) { | 87 | if (fid < HI_FID_TABLE_BOTTOM) |
87 | return 8 + (2 * fid); | 88 | return 8 + (2 * fid); |
88 | } else { | 89 | else |
89 | return fid; | 90 | return fid; |
90 | } | ||
91 | } | 91 | } |
92 | 92 | ||
93 | /* | 93 | /* |
@@ -177,7 +177,7 @@ static int write_new_fid(struct powernow_k8_data *data, u32 fid) | |||
177 | if (i++ > 100) { | 177 | if (i++ > 100) { |
178 | printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n"); | 178 | printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n"); |
179 | return 1; | 179 | return 1; |
180 | } | 180 | } |
181 | } while (query_current_values_with_pending_wait(data)); | 181 | } while (query_current_values_with_pending_wait(data)); |
182 | 182 | ||
183 | count_off_irt(data); | 183 | count_off_irt(data); |
@@ -474,8 +474,10 @@ static int check_supported_cpu(unsigned int cpu) | |||
474 | goto out; | 474 | goto out; |
475 | 475 | ||
476 | eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); | 476 | eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); |
477 | if ((eax & CPUID_XFAM) != CPUID_XFAM_K8) | ||
478 | goto out; | ||
479 | |||
477 | if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || | 480 | if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || |
478 | ((eax & CPUID_XFAM) != CPUID_XFAM_K8) || | ||
479 | ((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) { | 481 | ((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) { |
480 | printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); | 482 | printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); |
481 | goto out; | 483 | goto out; |
@@ -780,9 +782,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
780 | /* verify only 1 entry from the lo frequency table */ | 782 | /* verify only 1 entry from the lo frequency table */ |
781 | if (fid < HI_FID_TABLE_BOTTOM) { | 783 | if (fid < HI_FID_TABLE_BOTTOM) { |
782 | if (cntlofreq) { | 784 | if (cntlofreq) { |
783 | /* if both entries are the same, ignore this | 785 | /* if both entries are the same, ignore this one ... */ |
784 | * one... | ||
785 | */ | ||
786 | if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) || | 786 | if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) || |
787 | (powernow_table[i].index != powernow_table[cntlofreq].index)) { | 787 | (powernow_table[i].index != powernow_table[cntlofreq].index)) { |
788 | printk(KERN_ERR PFX "Too many lo freq table entries\n"); | 788 | printk(KERN_ERR PFX "Too many lo freq table entries\n"); |
@@ -854,7 +854,7 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde | |||
854 | dprintk("cpu %d transition to index %u\n", smp_processor_id(), index); | 854 | dprintk("cpu %d transition to index %u\n", smp_processor_id(), index); |
855 | 855 | ||
856 | /* fid are the lower 8 bits of the index we stored into | 856 | /* fid are the lower 8 bits of the index we stored into |
857 | * the cpufreq frequency table in find_psb_table, vid are | 857 | * the cpufreq frequency table in find_psb_table, vid are |
858 | * the upper 8 bits. | 858 | * the upper 8 bits. |
859 | */ | 859 | */ |
860 | 860 | ||
@@ -909,7 +909,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi | |||
909 | u32 checkvid = data->currvid; | 909 | u32 checkvid = data->currvid; |
910 | unsigned int newstate; | 910 | unsigned int newstate; |
911 | int ret = -EIO; | 911 | int ret = -EIO; |
912 | int i; | ||
913 | 912 | ||
914 | /* only run on specific CPU from here on */ | 913 | /* only run on specific CPU from here on */ |
915 | oldmask = current->cpus_allowed; | 914 | oldmask = current->cpus_allowed; |
@@ -945,23 +944,17 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi | |||
945 | if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate)) | 944 | if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate)) |
946 | goto err_out; | 945 | goto err_out; |
947 | 946 | ||
948 | down(&fidvid_sem); | 947 | mutex_lock(&fidvid_mutex); |
949 | 948 | ||
950 | powernow_k8_acpi_pst_values(data, newstate); | 949 | powernow_k8_acpi_pst_values(data, newstate); |
951 | 950 | ||
952 | if (transition_frequency(data, newstate)) { | 951 | if (transition_frequency(data, newstate)) { |
953 | printk(KERN_ERR PFX "transition frequency failed\n"); | 952 | printk(KERN_ERR PFX "transition frequency failed\n"); |
954 | ret = 1; | 953 | ret = 1; |
955 | up(&fidvid_sem); | 954 | mutex_unlock(&fidvid_mutex); |
956 | goto err_out; | 955 | goto err_out; |
957 | } | 956 | } |
958 | 957 | mutex_unlock(&fidvid_mutex); | |
959 | /* Update all the fid/vids of our siblings */ | ||
960 | for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { | ||
961 | powernow_data[i]->currvid = data->currvid; | ||
962 | powernow_data[i]->currfid = data->currfid; | ||
963 | } | ||
964 | up(&fidvid_sem); | ||
965 | 958 | ||
966 | pol->cur = find_khz_freq_from_fid(data->currfid); | 959 | pol->cur = find_khz_freq_from_fid(data->currfid); |
967 | ret = 0; | 960 | ret = 0; |
@@ -1048,7 +1041,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1048 | pol->governor = CPUFREQ_DEFAULT_GOVERNOR; | 1041 | pol->governor = CPUFREQ_DEFAULT_GOVERNOR; |
1049 | pol->cpus = cpu_core_map[pol->cpu]; | 1042 | pol->cpus = cpu_core_map[pol->cpu]; |
1050 | 1043 | ||
1051 | /* Take a crude guess here. | 1044 | /* Take a crude guess here. |
1052 | * That guess was in microseconds, so multiply with 1000 */ | 1045 | * That guess was in microseconds, so multiply with 1000 */ |
1053 | pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US) | 1046 | pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US) |
1054 | + (3 * (1 << data->irt) * 10)) * 1000; | 1047 | + (3 * (1 << data->irt) * 10)) * 1000; |
@@ -1070,9 +1063,8 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1070 | printk("cpu_init done, current fid 0x%x, vid 0x%x\n", | 1063 | printk("cpu_init done, current fid 0x%x, vid 0x%x\n", |
1071 | data->currfid, data->currvid); | 1064 | data->currfid, data->currvid); |
1072 | 1065 | ||
1073 | for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { | 1066 | for_each_cpu_mask(i, cpu_core_map[pol->cpu]) |
1074 | powernow_data[i] = data; | 1067 | powernow_data[i] = data; |
1075 | } | ||
1076 | 1068 | ||
1077 | return 0; | 1069 | return 0; |
1078 | 1070 | ||
@@ -1103,10 +1095,15 @@ static int __devexit powernowk8_cpu_exit (struct cpufreq_policy *pol) | |||
1103 | 1095 | ||
1104 | static unsigned int powernowk8_get (unsigned int cpu) | 1096 | static unsigned int powernowk8_get (unsigned int cpu) |
1105 | { | 1097 | { |
1106 | struct powernow_k8_data *data = powernow_data[cpu]; | 1098 | struct powernow_k8_data *data; |
1107 | cpumask_t oldmask = current->cpus_allowed; | 1099 | cpumask_t oldmask = current->cpus_allowed; |
1108 | unsigned int khz = 0; | 1100 | unsigned int khz = 0; |
1109 | 1101 | ||
1102 | data = powernow_data[first_cpu(cpu_core_map[cpu])]; | ||
1103 | |||
1104 | if (!data) | ||
1105 | return -EINVAL; | ||
1106 | |||
1110 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); | 1107 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); |
1111 | if (smp_processor_id() != cpu) { | 1108 | if (smp_processor_id() != cpu) { |
1112 | printk(KERN_ERR PFX "limiting to CPU %d failed in powernowk8_get\n", cpu); | 1109 | printk(KERN_ERR PFX "limiting to CPU %d failed in powernowk8_get\n", cpu); |
@@ -1145,16 +1142,14 @@ static int __cpuinit powernowk8_init(void) | |||
1145 | { | 1142 | { |
1146 | unsigned int i, supported_cpus = 0; | 1143 | unsigned int i, supported_cpus = 0; |
1147 | 1144 | ||
1148 | for (i=0; i<NR_CPUS; i++) { | 1145 | for_each_online_cpu(i) { |
1149 | if (!cpu_online(i)) | ||
1150 | continue; | ||
1151 | if (check_supported_cpu(i)) | 1146 | if (check_supported_cpu(i)) |
1152 | supported_cpus++; | 1147 | supported_cpus++; |
1153 | } | 1148 | } |
1154 | 1149 | ||
1155 | if (supported_cpus == num_online_cpus()) { | 1150 | if (supported_cpus == num_online_cpus()) { |
1156 | printk(KERN_INFO PFX "Found %d AMD Athlon 64 / Opteron processors (" VERSION ")\n", | 1151 | printk(KERN_INFO PFX "Found %d AMD Athlon 64 / Opteron " |
1157 | supported_cpus); | 1152 | "processors (" VERSION ")\n", supported_cpus); |
1158 | return cpufreq_register_driver(&cpufreq_amd64_driver); | 1153 | return cpufreq_register_driver(&cpufreq_amd64_driver); |
1159 | } | 1154 | } |
1160 | 1155 | ||
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h index d0de37d58e9a..79a7c5c87edc 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h | |||
@@ -63,7 +63,7 @@ struct powernow_k8_data { | |||
63 | #define MSR_C_LO_VID_SHIFT 8 | 63 | #define MSR_C_LO_VID_SHIFT 8 |
64 | 64 | ||
65 | /* Field definitions within the FID VID High Control MSR : */ | 65 | /* Field definitions within the FID VID High Control MSR : */ |
66 | #define MSR_C_HI_STP_GNT_TO 0x000fffff | 66 | #define MSR_C_HI_STP_GNT_TO 0x000fffff |
67 | 67 | ||
68 | /* Field definitions within the FID VID Low Status MSR : */ | 68 | /* Field definitions within the FID VID Low Status MSR : */ |
69 | #define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */ | 69 | #define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */ |
@@ -123,7 +123,7 @@ struct powernow_k8_data { | |||
123 | * Most values of interest are enocoded in a single field of the _PSS | 123 | * Most values of interest are enocoded in a single field of the _PSS |
124 | * entries: the "control" value. | 124 | * entries: the "control" value. |
125 | */ | 125 | */ |
126 | 126 | ||
127 | #define IRT_SHIFT 30 | 127 | #define IRT_SHIFT 30 |
128 | #define RVO_SHIFT 28 | 128 | #define RVO_SHIFT 28 |
129 | #define EXT_TYPE_SHIFT 27 | 129 | #define EXT_TYPE_SHIFT 27 |
@@ -182,10 +182,6 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid); | |||
182 | 182 | ||
183 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index); | 183 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index); |
184 | 184 | ||
185 | #ifndef for_each_cpu_mask | ||
186 | #define for_each_cpu_mask(i,mask) for (i=0;i<1;i++) | ||
187 | #endif | ||
188 | |||
189 | #ifdef CONFIG_SMP | 185 | #ifdef CONFIG_SMP |
190 | static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[]) | 186 | static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[]) |
191 | { | 187 | { |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c index c173c0fa117a..b0ff9075708c 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | |||
@@ -479,15 +479,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) | |||
479 | unsigned l, h; | 479 | unsigned l, h; |
480 | int ret; | 480 | int ret; |
481 | int i; | 481 | int i; |
482 | struct cpuinfo_x86 *c = &cpu_data[policy->cpu]; | ||
483 | 482 | ||
484 | /* Only Intel makes Enhanced Speedstep-capable CPUs */ | 483 | /* Only Intel makes Enhanced Speedstep-capable CPUs */ |
485 | if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) | 484 | if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) |
486 | return -ENODEV; | 485 | return -ENODEV; |
487 | 486 | ||
488 | if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { | 487 | if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC)) |
489 | centrino_driver.flags |= CPUFREQ_CONST_LOOPS; | 488 | centrino_driver.flags |= CPUFREQ_CONST_LOOPS; |
490 | } | ||
491 | 489 | ||
492 | if (centrino_cpu_init_acpi(policy)) { | 490 | if (centrino_cpu_init_acpi(policy)) { |
493 | if (policy->cpu != 0) | 491 | if (policy->cpu != 0) |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c index 7c47005a1805..4f46cac155c4 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c | |||
@@ -9,7 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/moduleparam.h> | 13 | #include <linux/moduleparam.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/cpufreq.h> | 15 | #include <linux/cpufreq.h> |
@@ -36,8 +36,8 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
36 | /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ | 36 | /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ |
37 | struct { | 37 | struct { |
38 | unsigned int ratio; /* Frequency Multiplier (x10) */ | 38 | unsigned int ratio; /* Frequency Multiplier (x10) */ |
39 | u8 bitmap; /* power on configuration bits | 39 | u8 bitmap; /* power on configuration bits |
40 | [27, 25:22] (in MSR 0x2a) */ | 40 | [27, 25:22] (in MSR 0x2a) */ |
41 | } msr_decode_mult [] = { | 41 | } msr_decode_mult [] = { |
42 | { 30, 0x01 }, | 42 | { 30, 0x01 }, |
43 | { 35, 0x05 }, | 43 | { 35, 0x05 }, |
@@ -58,9 +58,9 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
58 | 58 | ||
59 | /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ | 59 | /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ |
60 | struct { | 60 | struct { |
61 | unsigned int value; /* Front Side Bus speed in MHz */ | 61 | unsigned int value; /* Front Side Bus speed in MHz */ |
62 | u8 bitmap; /* power on configuration bits [18: 19] | 62 | u8 bitmap; /* power on configuration bits [18: 19] |
63 | (in MSR 0x2a) */ | 63 | (in MSR 0x2a) */ |
64 | } msr_decode_fsb [] = { | 64 | } msr_decode_fsb [] = { |
65 | { 66, 0x0 }, | 65 | { 66, 0x0 }, |
66 | { 100, 0x2 }, | 66 | { 100, 0x2 }, |
@@ -68,8 +68,8 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
68 | { 0, 0xff} | 68 | { 0, 0xff} |
69 | }; | 69 | }; |
70 | 70 | ||
71 | u32 msr_lo, msr_tmp; | 71 | u32 msr_lo, msr_tmp; |
72 | int i = 0, j = 0; | 72 | int i = 0, j = 0; |
73 | 73 | ||
74 | /* read MSR 0x2a - we only need the low 32 bits */ | 74 | /* read MSR 0x2a - we only need the low 32 bits */ |
75 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); | 75 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); |
@@ -106,7 +106,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
106 | 106 | ||
107 | static unsigned int pentiumM_get_frequency(void) | 107 | static unsigned int pentiumM_get_frequency(void) |
108 | { | 108 | { |
109 | u32 msr_lo, msr_tmp; | 109 | u32 msr_lo, msr_tmp; |
110 | 110 | ||
111 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); | 111 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); |
112 | dprintk("PM - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); | 112 | dprintk("PM - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); |
@@ -134,7 +134,7 @@ static unsigned int pentium4_get_frequency(void) | |||
134 | 134 | ||
135 | dprintk("P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); | 135 | dprintk("P4 - MSR_EBC_FREQUENCY_ID: 0x%x 0x%x\n", msr_lo, msr_hi); |
136 | 136 | ||
137 | /* decode the FSB: see IA-32 Intel (C) Architecture Software | 137 | /* decode the FSB: see IA-32 Intel (C) Architecture Software |
138 | * Developer's Manual, Volume 3: System Prgramming Guide, | 138 | * Developer's Manual, Volume 3: System Prgramming Guide, |
139 | * revision #12 in Table B-1: MSRs in the Pentium 4 and | 139 | * revision #12 in Table B-1: MSRs in the Pentium 4 and |
140 | * Intel Xeon Processors, on page B-4 and B-5. | 140 | * Intel Xeon Processors, on page B-4 and B-5. |
@@ -170,7 +170,7 @@ static unsigned int pentium4_get_frequency(void) | |||
170 | return (fsb * mult); | 170 | return (fsb * mult); |
171 | } | 171 | } |
172 | 172 | ||
173 | 173 | ||
174 | unsigned int speedstep_get_processor_frequency(unsigned int processor) | 174 | unsigned int speedstep_get_processor_frequency(unsigned int processor) |
175 | { | 175 | { |
176 | switch (processor) { | 176 | switch (processor) { |
@@ -198,11 +198,11 @@ EXPORT_SYMBOL_GPL(speedstep_get_processor_frequency); | |||
198 | unsigned int speedstep_detect_processor (void) | 198 | unsigned int speedstep_detect_processor (void) |
199 | { | 199 | { |
200 | struct cpuinfo_x86 *c = cpu_data; | 200 | struct cpuinfo_x86 *c = cpu_data; |
201 | u32 ebx, msr_lo, msr_hi; | 201 | u32 ebx, msr_lo, msr_hi; |
202 | 202 | ||
203 | dprintk("x86: %x, model: %x\n", c->x86, c->x86_model); | 203 | dprintk("x86: %x, model: %x\n", c->x86, c->x86_model); |
204 | 204 | ||
205 | if ((c->x86_vendor != X86_VENDOR_INTEL) || | 205 | if ((c->x86_vendor != X86_VENDOR_INTEL) || |
206 | ((c->x86 != 6) && (c->x86 != 0xF))) | 206 | ((c->x86 != 6) && (c->x86 != 0xF))) |
207 | return 0; | 207 | return 0; |
208 | 208 | ||
@@ -218,15 +218,15 @@ unsigned int speedstep_detect_processor (void) | |||
218 | dprintk("ebx value is %x, x86_mask is %x\n", ebx, c->x86_mask); | 218 | dprintk("ebx value is %x, x86_mask is %x\n", ebx, c->x86_mask); |
219 | 219 | ||
220 | switch (c->x86_mask) { | 220 | switch (c->x86_mask) { |
221 | case 4: | 221 | case 4: |
222 | /* | 222 | /* |
223 | * B-stepping [M-P4-M] | 223 | * B-stepping [M-P4-M] |
224 | * sample has ebx = 0x0f, production has 0x0e. | 224 | * sample has ebx = 0x0f, production has 0x0e. |
225 | */ | 225 | */ |
226 | if ((ebx == 0x0e) || (ebx == 0x0f)) | 226 | if ((ebx == 0x0e) || (ebx == 0x0f)) |
227 | return SPEEDSTEP_PROCESSOR_P4M; | 227 | return SPEEDSTEP_PROCESSOR_P4M; |
228 | break; | 228 | break; |
229 | case 7: | 229 | case 7: |
230 | /* | 230 | /* |
231 | * C-stepping [M-P4-M] | 231 | * C-stepping [M-P4-M] |
232 | * needs to have ebx=0x0e, else it's a celeron: | 232 | * needs to have ebx=0x0e, else it's a celeron: |
@@ -253,7 +253,7 @@ unsigned int speedstep_detect_processor (void) | |||
253 | * also, M-P4M HTs have ebx=0x8, too | 253 | * also, M-P4M HTs have ebx=0x8, too |
254 | * For now, they are distinguished by the model_id string | 254 | * For now, they are distinguished by the model_id string |
255 | */ | 255 | */ |
256 | if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) | 256 | if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) |
257 | return SPEEDSTEP_PROCESSOR_P4M; | 257 | return SPEEDSTEP_PROCESSOR_P4M; |
258 | break; | 258 | break; |
259 | default: | 259 | default: |
@@ -264,8 +264,7 @@ unsigned int speedstep_detect_processor (void) | |||
264 | 264 | ||
265 | switch (c->x86_model) { | 265 | switch (c->x86_model) { |
266 | case 0x0B: /* Intel PIII [Tualatin] */ | 266 | case 0x0B: /* Intel PIII [Tualatin] */ |
267 | /* cpuid_ebx(1) is 0x04 for desktop PIII, | 267 | /* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */ |
268 | 0x06 for mobile PIII-M */ | ||
269 | ebx = cpuid_ebx(0x00000001); | 268 | ebx = cpuid_ebx(0x00000001); |
270 | dprintk("ebx is %x\n", ebx); | 269 | dprintk("ebx is %x\n", ebx); |
271 | 270 | ||
@@ -275,9 +274,8 @@ unsigned int speedstep_detect_processor (void) | |||
275 | return 0; | 274 | return 0; |
276 | 275 | ||
277 | /* So far all PIII-M processors support SpeedStep. See | 276 | /* So far all PIII-M processors support SpeedStep. See |
278 | * Intel's 24540640.pdf of June 2003 | 277 | * Intel's 24540640.pdf of June 2003 |
279 | */ | 278 | */ |
280 | |||
281 | return SPEEDSTEP_PROCESSOR_PIII_T; | 279 | return SPEEDSTEP_PROCESSOR_PIII_T; |
282 | 280 | ||
283 | case 0x08: /* Intel PIII [Coppermine] */ | 281 | case 0x08: /* Intel PIII [Coppermine] */ |
@@ -399,7 +397,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
399 | } | 397 | } |
400 | } | 398 | } |
401 | 399 | ||
402 | out: | 400 | out: |
403 | local_irq_restore(flags); | 401 | local_irq_restore(flags); |
404 | return (ret); | 402 | return (ret); |
405 | } | 403 | } |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h index 6a727fd3a77e..b735429c50b4 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.h | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ | 15 | #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ |
16 | #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ | 16 | #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ |
17 | #define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ | 17 | #define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ |
18 | #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ | 18 | #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ |
19 | 19 | ||
20 | /* the following processors are not speedstep-capable and are not auto-detected | 20 | /* the following processors are not speedstep-capable and are not auto-detected |
@@ -25,8 +25,8 @@ | |||
25 | 25 | ||
26 | /* speedstep states -- only two of them */ | 26 | /* speedstep states -- only two of them */ |
27 | 27 | ||
28 | #define SPEEDSTEP_HIGH 0x00000000 | 28 | #define SPEEDSTEP_HIGH 0x00000000 |
29 | #define SPEEDSTEP_LOW 0x00000001 | 29 | #define SPEEDSTEP_LOW 0x00000001 |
30 | 30 | ||
31 | 31 | ||
32 | /* detect a speedstep-capable processor */ | 32 | /* detect a speedstep-capable processor */ |
@@ -36,13 +36,13 @@ extern unsigned int speedstep_detect_processor (void); | |||
36 | extern unsigned int speedstep_get_processor_frequency(unsigned int processor); | 36 | extern unsigned int speedstep_get_processor_frequency(unsigned int processor); |
37 | 37 | ||
38 | 38 | ||
39 | /* detect the low and high speeds of the processor. The callback | 39 | /* detect the low and high speeds of the processor. The callback |
40 | * set_state"'s first argument is either SPEEDSTEP_HIGH or | 40 | * set_state"'s first argument is either SPEEDSTEP_HIGH or |
41 | * SPEEDSTEP_LOW; the second argument is zero so that no | 41 | * SPEEDSTEP_LOW; the second argument is zero so that no |
42 | * cpufreq_notify_transition calls are initiated. | 42 | * cpufreq_notify_transition calls are initiated. |
43 | */ | 43 | */ |
44 | extern unsigned int speedstep_get_freqs(unsigned int processor, | 44 | extern unsigned int speedstep_get_freqs(unsigned int processor, |
45 | unsigned int *low_speed, | 45 | unsigned int *low_speed, |
46 | unsigned int *high_speed, | 46 | unsigned int *high_speed, |
47 | unsigned int *transition_latency, | 47 | unsigned int *transition_latency, |
48 | void (*set_state) (unsigned int state)); | 48 | void (*set_state) (unsigned int state)); |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c index 28cc5d524afc..c28333d53646 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c | |||
@@ -13,8 +13,8 @@ | |||
13 | *********************************************************************/ | 13 | *********************************************************************/ |
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/moduleparam.h> | 17 | #include <linux/moduleparam.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/cpufreq.h> | 19 | #include <linux/cpufreq.h> |
20 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
@@ -28,21 +28,21 @@ | |||
28 | * | 28 | * |
29 | * These parameters are got from IST-SMI BIOS call. | 29 | * These parameters are got from IST-SMI BIOS call. |
30 | * If user gives it, these are used. | 30 | * If user gives it, these are used. |
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | static int smi_port = 0; | 33 | static int smi_port = 0; |
34 | static int smi_cmd = 0; | 34 | static int smi_cmd = 0; |
35 | static unsigned int smi_sig = 0; | 35 | static unsigned int smi_sig = 0; |
36 | 36 | ||
37 | /* info about the processor */ | 37 | /* info about the processor */ |
38 | static unsigned int speedstep_processor = 0; | 38 | static unsigned int speedstep_processor = 0; |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * There are only two frequency states for each processor. Values | 41 | * There are only two frequency states for each processor. Values |
42 | * are in kHz for the time being. | 42 | * are in kHz for the time being. |
43 | */ | 43 | */ |
44 | static struct cpufreq_frequency_table speedstep_freqs[] = { | 44 | static struct cpufreq_frequency_table speedstep_freqs[] = { |
45 | {SPEEDSTEP_HIGH, 0}, | 45 | {SPEEDSTEP_HIGH, 0}, |
46 | {SPEEDSTEP_LOW, 0}, | 46 | {SPEEDSTEP_LOW, 0}, |
47 | {0, CPUFREQ_TABLE_END}, | 47 | {0, CPUFREQ_TABLE_END}, |
48 | }; | 48 | }; |
@@ -75,7 +75,9 @@ static int speedstep_smi_ownership (void) | |||
75 | __asm__ __volatile__( | 75 | __asm__ __volatile__( |
76 | "out %%al, (%%dx)\n" | 76 | "out %%al, (%%dx)\n" |
77 | : "=D" (result) | 77 | : "=D" (result) |
78 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "D" (0), "S" (magic) | 78 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), |
79 | "D" (0), "S" (magic) | ||
80 | : "memory" | ||
79 | ); | 81 | ); |
80 | 82 | ||
81 | dprintk("result is %x\n", result); | 83 | dprintk("result is %x\n", result); |
@@ -123,7 +125,7 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
123 | *low = low_mhz * 1000; | 125 | *low = low_mhz * 1000; |
124 | 126 | ||
125 | return result; | 127 | return result; |
126 | } | 128 | } |
127 | 129 | ||
128 | /** | 130 | /** |
129 | * speedstep_get_state - set the SpeedStep state | 131 | * speedstep_get_state - set the SpeedStep state |
@@ -204,7 +206,7 @@ static void speedstep_set_state (unsigned int state) | |||
204 | * speedstep_target - set a new CPUFreq policy | 206 | * speedstep_target - set a new CPUFreq policy |
205 | * @policy: new policy | 207 | * @policy: new policy |
206 | * @target_freq: new freq | 208 | * @target_freq: new freq |
207 | * @relation: | 209 | * @relation: |
208 | * | 210 | * |
209 | * Sets a new CPUFreq policy/freq. | 211 | * Sets a new CPUFreq policy/freq. |
210 | */ | 212 | */ |
@@ -283,7 +285,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
283 | state = speedstep_get_state(); | 285 | state = speedstep_get_state(); |
284 | speed = speedstep_freqs[state].frequency; | 286 | speed = speedstep_freqs[state].frequency; |
285 | 287 | ||
286 | dprintk("currently at %s speed setting - %i MHz\n", | 288 | dprintk("currently at %s speed setting - %i MHz\n", |
287 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", | 289 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", |
288 | (speed / 1000)); | 290 | (speed / 1000)); |
289 | 291 | ||
@@ -296,7 +298,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
296 | if (result) | 298 | if (result) |
297 | return (result); | 299 | return (result); |
298 | 300 | ||
299 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); | 301 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); |
300 | 302 | ||
301 | return 0; | 303 | return 0; |
302 | } | 304 | } |
@@ -332,8 +334,8 @@ static struct freq_attr* speedstep_attr[] = { | |||
332 | 334 | ||
333 | static struct cpufreq_driver speedstep_driver = { | 335 | static struct cpufreq_driver speedstep_driver = { |
334 | .name = "speedstep-smi", | 336 | .name = "speedstep-smi", |
335 | .verify = speedstep_verify, | 337 | .verify = speedstep_verify, |
336 | .target = speedstep_target, | 338 | .target = speedstep_target, |
337 | .init = speedstep_cpu_init, | 339 | .init = speedstep_cpu_init, |
338 | .exit = speedstep_cpu_exit, | 340 | .exit = speedstep_cpu_exit, |
339 | .get = speedstep_get, | 341 | .get = speedstep_get, |
@@ -370,13 +372,12 @@ static int __init speedstep_init(void) | |||
370 | return -ENODEV; | 372 | return -ENODEV; |
371 | } | 373 | } |
372 | 374 | ||
373 | dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n", | 375 | dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n", |
374 | ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level); | 376 | ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level); |
375 | 377 | ||
376 | 378 | /* Error if no IST-SMI BIOS or no PARM | |
377 | /* Error if no IST-SMI BIOS or no PARM | ||
378 | sig= 'ISGE' aka 'Intel Speedstep Gate E' */ | 379 | sig= 'ISGE' aka 'Intel Speedstep Gate E' */ |
379 | if ((ist_info.signature != 0x47534943) && ( | 380 | if ((ist_info.signature != 0x47534943) && ( |
380 | (smi_port == 0) || (smi_cmd == 0))) | 381 | (smi_port == 0) || (smi_cmd == 0))) |
381 | return -ENODEV; | 382 | return -ENODEV; |
382 | 383 | ||
@@ -386,17 +387,15 @@ static int __init speedstep_init(void) | |||
386 | smi_sig = ist_info.signature; | 387 | smi_sig = ist_info.signature; |
387 | 388 | ||
388 | /* setup smi_port from MODLULE_PARM or BIOS */ | 389 | /* setup smi_port from MODLULE_PARM or BIOS */ |
389 | if ((smi_port > 0xff) || (smi_port < 0)) { | 390 | if ((smi_port > 0xff) || (smi_port < 0)) |
390 | return -EINVAL; | 391 | return -EINVAL; |
391 | } else if (smi_port == 0) { | 392 | else if (smi_port == 0) |
392 | smi_port = ist_info.command & 0xff; | 393 | smi_port = ist_info.command & 0xff; |
393 | } | ||
394 | 394 | ||
395 | if ((smi_cmd > 0xff) || (smi_cmd < 0)) { | 395 | if ((smi_cmd > 0xff) || (smi_cmd < 0)) |
396 | return -EINVAL; | 396 | return -EINVAL; |
397 | } else if (smi_cmd == 0) { | 397 | else if (smi_cmd == 0) |
398 | smi_cmd = (ist_info.command >> 16) & 0xff; | 398 | smi_cmd = (ist_info.command >> 16) & 0xff; |
399 | } | ||
400 | 399 | ||
401 | return cpufreq_register_driver(&speedstep_driver); | 400 | return cpufreq_register_driver(&speedstep_driver); |
402 | } | 401 | } |
diff --git a/arch/i386/kernel/cpu/intel.c b/arch/i386/kernel/cpu/intel.c index 8c0120186b9f..5386b29bb5a5 100644 --- a/arch/i386/kernel/cpu/intel.c +++ b/arch/i386/kernel/cpu/intel.c | |||
@@ -29,7 +29,7 @@ extern int trap_init_f00f_bug(void); | |||
29 | struct movsl_mask movsl_mask __read_mostly; | 29 | struct movsl_mask movsl_mask __read_mostly; |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | void __devinit early_intel_workaround(struct cpuinfo_x86 *c) | 32 | void __cpuinit early_intel_workaround(struct cpuinfo_x86 *c) |
33 | { | 33 | { |
34 | if (c->x86_vendor != X86_VENDOR_INTEL) | 34 | if (c->x86_vendor != X86_VENDOR_INTEL) |
35 | return; | 35 | return; |
@@ -44,7 +44,7 @@ void __devinit early_intel_workaround(struct cpuinfo_x86 *c) | |||
44 | * This is called before we do cpu ident work | 44 | * This is called before we do cpu ident work |
45 | */ | 45 | */ |
46 | 46 | ||
47 | int __devinit ppro_with_ram_bug(void) | 47 | int __cpuinit ppro_with_ram_bug(void) |
48 | { | 48 | { |
49 | /* Uses data from early_cpu_detect now */ | 49 | /* Uses data from early_cpu_detect now */ |
50 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && | 50 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && |
@@ -62,7 +62,7 @@ int __devinit ppro_with_ram_bug(void) | |||
62 | * P4 Xeon errata 037 workaround. | 62 | * P4 Xeon errata 037 workaround. |
63 | * Hardware prefetcher may cause stale data to be loaded into the cache. | 63 | * Hardware prefetcher may cause stale data to be loaded into the cache. |
64 | */ | 64 | */ |
65 | static void __devinit Intel_errata_workarounds(struct cpuinfo_x86 *c) | 65 | static void __cpuinit Intel_errata_workarounds(struct cpuinfo_x86 *c) |
66 | { | 66 | { |
67 | unsigned long lo, hi; | 67 | unsigned long lo, hi; |
68 | 68 | ||
@@ -81,7 +81,7 @@ static void __devinit Intel_errata_workarounds(struct cpuinfo_x86 *c) | |||
81 | /* | 81 | /* |
82 | * find out the number of processor cores on the die | 82 | * find out the number of processor cores on the die |
83 | */ | 83 | */ |
84 | static int __devinit num_cpu_cores(struct cpuinfo_x86 *c) | 84 | static int __cpuinit num_cpu_cores(struct cpuinfo_x86 *c) |
85 | { | 85 | { |
86 | unsigned int eax, ebx, ecx, edx; | 86 | unsigned int eax, ebx, ecx, edx; |
87 | 87 | ||
@@ -96,7 +96,7 @@ static int __devinit num_cpu_cores(struct cpuinfo_x86 *c) | |||
96 | return 1; | 96 | return 1; |
97 | } | 97 | } |
98 | 98 | ||
99 | static void __devinit init_intel(struct cpuinfo_x86 *c) | 99 | static void __cpuinit init_intel(struct cpuinfo_x86 *c) |
100 | { | 100 | { |
101 | unsigned int l2 = 0; | 101 | unsigned int l2 = 0; |
102 | char *p = NULL; | 102 | char *p = NULL; |
@@ -205,7 +205,7 @@ static unsigned int intel_size_cache(struct cpuinfo_x86 * c, unsigned int size) | |||
205 | return size; | 205 | return size; |
206 | } | 206 | } |
207 | 207 | ||
208 | static struct cpu_dev intel_cpu_dev __devinitdata = { | 208 | static struct cpu_dev intel_cpu_dev __cpuinitdata = { |
209 | .c_vendor = "Intel", | 209 | .c_vendor = "Intel", |
210 | .c_ident = { "GenuineIntel" }, | 210 | .c_ident = { "GenuineIntel" }, |
211 | .c_models = { | 211 | .c_models = { |
diff --git a/arch/i386/kernel/cpu/intel_cacheinfo.c b/arch/i386/kernel/cpu/intel_cacheinfo.c index ffe58cee0c48..9df87b03612c 100644 --- a/arch/i386/kernel/cpu/intel_cacheinfo.c +++ b/arch/i386/kernel/cpu/intel_cacheinfo.c | |||
@@ -173,8 +173,12 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
173 | unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */ | 173 | unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */ |
174 | unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */ | 174 | unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */ |
175 | unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */ | 175 | unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */ |
176 | unsigned int l2_id = 0, l3_id = 0, num_threads_sharing, index_msb; | ||
177 | #ifdef CONFIG_SMP | ||
178 | unsigned int cpu = (c == &boot_cpu_data) ? 0 : (c - cpu_data); | ||
179 | #endif | ||
176 | 180 | ||
177 | if (c->cpuid_level > 4) { | 181 | if (c->cpuid_level > 3) { |
178 | static int is_initialized; | 182 | static int is_initialized; |
179 | 183 | ||
180 | if (is_initialized == 0) { | 184 | if (is_initialized == 0) { |
@@ -205,9 +209,15 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
205 | break; | 209 | break; |
206 | case 2: | 210 | case 2: |
207 | new_l2 = this_leaf.size/1024; | 211 | new_l2 = this_leaf.size/1024; |
212 | num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing; | ||
213 | index_msb = get_count_order(num_threads_sharing); | ||
214 | l2_id = c->apicid >> index_msb; | ||
208 | break; | 215 | break; |
209 | case 3: | 216 | case 3: |
210 | new_l3 = this_leaf.size/1024; | 217 | new_l3 = this_leaf.size/1024; |
218 | num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing; | ||
219 | index_msb = get_count_order(num_threads_sharing); | ||
220 | l3_id = c->apicid >> index_msb; | ||
211 | break; | 221 | break; |
212 | default: | 222 | default: |
213 | break; | 223 | break; |
@@ -215,11 +225,19 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
215 | } | 225 | } |
216 | } | 226 | } |
217 | } | 227 | } |
218 | if (c->cpuid_level > 1) { | 228 | /* |
229 | * Don't use cpuid2 if cpuid4 is supported. For P4, we use cpuid2 for | ||
230 | * trace cache | ||
231 | */ | ||
232 | if ((num_cache_leaves == 0 || c->x86 == 15) && c->cpuid_level > 1) { | ||
219 | /* supports eax=2 call */ | 233 | /* supports eax=2 call */ |
220 | int i, j, n; | 234 | int i, j, n; |
221 | int regs[4]; | 235 | int regs[4]; |
222 | unsigned char *dp = (unsigned char *)regs; | 236 | unsigned char *dp = (unsigned char *)regs; |
237 | int only_trace = 0; | ||
238 | |||
239 | if (num_cache_leaves != 0 && c->x86 == 15) | ||
240 | only_trace = 1; | ||
223 | 241 | ||
224 | /* Number of times to iterate */ | 242 | /* Number of times to iterate */ |
225 | n = cpuid_eax(2) & 0xFF; | 243 | n = cpuid_eax(2) & 0xFF; |
@@ -241,6 +259,8 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
241 | while (cache_table[k].descriptor != 0) | 259 | while (cache_table[k].descriptor != 0) |
242 | { | 260 | { |
243 | if (cache_table[k].descriptor == des) { | 261 | if (cache_table[k].descriptor == des) { |
262 | if (only_trace && cache_table[k].cache_type != LVL_TRACE) | ||
263 | break; | ||
244 | switch (cache_table[k].cache_type) { | 264 | switch (cache_table[k].cache_type) { |
245 | case LVL_1_INST: | 265 | case LVL_1_INST: |
246 | l1i += cache_table[k].size; | 266 | l1i += cache_table[k].size; |
@@ -266,34 +286,45 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
266 | } | 286 | } |
267 | } | 287 | } |
268 | } | 288 | } |
289 | } | ||
269 | 290 | ||
270 | if (new_l1d) | 291 | if (new_l1d) |
271 | l1d = new_l1d; | 292 | l1d = new_l1d; |
272 | 293 | ||
273 | if (new_l1i) | 294 | if (new_l1i) |
274 | l1i = new_l1i; | 295 | l1i = new_l1i; |
275 | 296 | ||
276 | if (new_l2) | 297 | if (new_l2) { |
277 | l2 = new_l2; | 298 | l2 = new_l2; |
299 | #ifdef CONFIG_SMP | ||
300 | cpu_llc_id[cpu] = l2_id; | ||
301 | #endif | ||
302 | } | ||
278 | 303 | ||
279 | if (new_l3) | 304 | if (new_l3) { |
280 | l3 = new_l3; | 305 | l3 = new_l3; |
306 | #ifdef CONFIG_SMP | ||
307 | cpu_llc_id[cpu] = l3_id; | ||
308 | #endif | ||
309 | } | ||
281 | 310 | ||
282 | if ( trace ) | 311 | if (trace) |
283 | printk (KERN_INFO "CPU: Trace cache: %dK uops", trace); | 312 | printk (KERN_INFO "CPU: Trace cache: %dK uops", trace); |
284 | else if ( l1i ) | 313 | else if ( l1i ) |
285 | printk (KERN_INFO "CPU: L1 I cache: %dK", l1i); | 314 | printk (KERN_INFO "CPU: L1 I cache: %dK", l1i); |
286 | if ( l1d ) | ||
287 | printk(", L1 D cache: %dK\n", l1d); | ||
288 | else | ||
289 | printk("\n"); | ||
290 | if ( l2 ) | ||
291 | printk(KERN_INFO "CPU: L2 cache: %dK\n", l2); | ||
292 | if ( l3 ) | ||
293 | printk(KERN_INFO "CPU: L3 cache: %dK\n", l3); | ||
294 | 315 | ||
295 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); | 316 | if (l1d) |
296 | } | 317 | printk(", L1 D cache: %dK\n", l1d); |
318 | else | ||
319 | printk("\n"); | ||
320 | |||
321 | if (l2) | ||
322 | printk(KERN_INFO "CPU: L2 cache: %dK\n", l2); | ||
323 | |||
324 | if (l3) | ||
325 | printk(KERN_INFO "CPU: L3 cache: %dK\n", l3); | ||
326 | |||
327 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); | ||
297 | 328 | ||
298 | return l2; | 329 | return l2; |
299 | } | 330 | } |
@@ -330,7 +361,7 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) | |||
330 | } | 361 | } |
331 | } | 362 | } |
332 | } | 363 | } |
333 | static void __devinit cache_remove_shared_cpu_map(unsigned int cpu, int index) | 364 | static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index) |
334 | { | 365 | { |
335 | struct _cpuid4_info *this_leaf, *sibling_leaf; | 366 | struct _cpuid4_info *this_leaf, *sibling_leaf; |
336 | int sibling; | 367 | int sibling; |
diff --git a/arch/i386/kernel/cpu/mcheck/mce.c b/arch/i386/kernel/cpu/mcheck/mce.c index 6170af3c271a..afa0888f9a1e 100644 --- a/arch/i386/kernel/cpu/mcheck/mce.c +++ b/arch/i386/kernel/cpu/mcheck/mce.c | |||
@@ -64,13 +64,13 @@ void mcheck_init(struct cpuinfo_x86 *c) | |||
64 | static int __init mcheck_disable(char *str) | 64 | static int __init mcheck_disable(char *str) |
65 | { | 65 | { |
66 | mce_disabled = 1; | 66 | mce_disabled = 1; |
67 | return 0; | 67 | return 1; |
68 | } | 68 | } |
69 | 69 | ||
70 | static int __init mcheck_enable(char *str) | 70 | static int __init mcheck_enable(char *str) |
71 | { | 71 | { |
72 | mce_disabled = -1; | 72 | mce_disabled = -1; |
73 | return 0; | 73 | return 1; |
74 | } | 74 | } |
75 | 75 | ||
76 | __setup("nomce", mcheck_disable); | 76 | __setup("nomce", mcheck_disable); |
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index 3b4618bed70d..fff90bda4733 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/pci.h> | 36 | #include <linux/pci.h> |
37 | #include <linux/smp.h> | 37 | #include <linux/smp.h> |
38 | #include <linux/cpu.h> | 38 | #include <linux/cpu.h> |
39 | #include <linux/mutex.h> | ||
39 | 40 | ||
40 | #include <asm/mtrr.h> | 41 | #include <asm/mtrr.h> |
41 | 42 | ||
@@ -47,7 +48,7 @@ | |||
47 | u32 num_var_ranges = 0; | 48 | u32 num_var_ranges = 0; |
48 | 49 | ||
49 | unsigned int *usage_table; | 50 | unsigned int *usage_table; |
50 | static DECLARE_MUTEX(mtrr_sem); | 51 | static DEFINE_MUTEX(mtrr_mutex); |
51 | 52 | ||
52 | u32 size_or_mask, size_and_mask; | 53 | u32 size_or_mask, size_and_mask; |
53 | 54 | ||
@@ -333,7 +334,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
333 | /* No CPU hotplug when we change MTRR entries */ | 334 | /* No CPU hotplug when we change MTRR entries */ |
334 | lock_cpu_hotplug(); | 335 | lock_cpu_hotplug(); |
335 | /* Search for existing MTRR */ | 336 | /* Search for existing MTRR */ |
336 | down(&mtrr_sem); | 337 | mutex_lock(&mtrr_mutex); |
337 | for (i = 0; i < num_var_ranges; ++i) { | 338 | for (i = 0; i < num_var_ranges; ++i) { |
338 | mtrr_if->get(i, &lbase, &lsize, <ype); | 339 | mtrr_if->get(i, &lbase, &lsize, <ype); |
339 | if (base >= lbase + lsize) | 340 | if (base >= lbase + lsize) |
@@ -371,7 +372,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
371 | printk(KERN_INFO "mtrr: no more MTRRs available\n"); | 372 | printk(KERN_INFO "mtrr: no more MTRRs available\n"); |
372 | error = i; | 373 | error = i; |
373 | out: | 374 | out: |
374 | up(&mtrr_sem); | 375 | mutex_unlock(&mtrr_mutex); |
375 | unlock_cpu_hotplug(); | 376 | unlock_cpu_hotplug(); |
376 | return error; | 377 | return error; |
377 | } | 378 | } |
@@ -464,7 +465,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
464 | max = num_var_ranges; | 465 | max = num_var_ranges; |
465 | /* No CPU hotplug when we change MTRR entries */ | 466 | /* No CPU hotplug when we change MTRR entries */ |
466 | lock_cpu_hotplug(); | 467 | lock_cpu_hotplug(); |
467 | down(&mtrr_sem); | 468 | mutex_lock(&mtrr_mutex); |
468 | if (reg < 0) { | 469 | if (reg < 0) { |
469 | /* Search for existing MTRR */ | 470 | /* Search for existing MTRR */ |
470 | for (i = 0; i < max; ++i) { | 471 | for (i = 0; i < max; ++i) { |
@@ -503,7 +504,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
503 | set_mtrr(reg, 0, 0, 0); | 504 | set_mtrr(reg, 0, 0, 0); |
504 | error = reg; | 505 | error = reg; |
505 | out: | 506 | out: |
506 | up(&mtrr_sem); | 507 | mutex_unlock(&mtrr_mutex); |
507 | unlock_cpu_hotplug(); | 508 | unlock_cpu_hotplug(); |
508 | return error; | 509 | return error; |
509 | } | 510 | } |
@@ -685,7 +686,7 @@ void mtrr_ap_init(void) | |||
685 | if (!mtrr_if || !use_intel()) | 686 | if (!mtrr_if || !use_intel()) |
686 | return; | 687 | return; |
687 | /* | 688 | /* |
688 | * Ideally we should hold mtrr_sem here to avoid mtrr entries changed, | 689 | * Ideally we should hold mtrr_mutex here to avoid mtrr entries changed, |
689 | * but this routine will be called in cpu boot time, holding the lock | 690 | * but this routine will be called in cpu boot time, holding the lock |
690 | * breaks it. This routine is called in two cases: 1.very earily time | 691 | * breaks it. This routine is called in two cases: 1.very earily time |
691 | * of software resume, when there absolutely isn't mtrr entry changes; | 692 | * of software resume, when there absolutely isn't mtrr entry changes; |
diff --git a/arch/i386/kernel/cpu/proc.c b/arch/i386/kernel/cpu/proc.c index 89a85af33d28..f94cdb7aca50 100644 --- a/arch/i386/kernel/cpu/proc.c +++ b/arch/i386/kernel/cpu/proc.c | |||
@@ -40,12 +40,12 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
40 | /* Other (Linux-defined) */ | 40 | /* Other (Linux-defined) */ |
41 | "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", | 41 | "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", |
42 | NULL, NULL, NULL, NULL, | 42 | NULL, NULL, NULL, NULL, |
43 | "constant_tsc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 43 | "constant_tsc", "up", NULL, NULL, NULL, NULL, NULL, NULL, |
44 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 44 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
45 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 45 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
46 | 46 | ||
47 | /* Intel-defined (#2) */ | 47 | /* Intel-defined (#2) */ |
48 | "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", NULL, "est", | 48 | "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est", |
49 | "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL, | 49 | "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL, |
50 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 50 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
51 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 51 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
diff --git a/arch/i386/kernel/crash.c b/arch/i386/kernel/crash.c index d49dbe8dc96b..e3c5fca0aa8a 100644 --- a/arch/i386/kernel/crash.c +++ b/arch/i386/kernel/crash.c | |||
@@ -105,7 +105,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu) | |||
105 | return 1; | 105 | return 1; |
106 | local_irq_disable(); | 106 | local_irq_disable(); |
107 | 107 | ||
108 | if (!user_mode(regs)) { | 108 | if (!user_mode_vm(regs)) { |
109 | crash_fixup_ss_esp(&fixed_regs, regs); | 109 | crash_fixup_ss_esp(&fixed_regs, regs); |
110 | regs = &fixed_regs; | 110 | regs = &fixed_regs; |
111 | } | 111 | } |
diff --git a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c index 6a93d75db431..5efceebc48dc 100644 --- a/arch/i386/kernel/dmi_scan.c +++ b/arch/i386/kernel/dmi_scan.c | |||
@@ -3,8 +3,10 @@ | |||
3 | #include <linux/init.h> | 3 | #include <linux/init.h> |
4 | #include <linux/module.h> | 4 | #include <linux/module.h> |
5 | #include <linux/dmi.h> | 5 | #include <linux/dmi.h> |
6 | #include <linux/efi.h> | ||
6 | #include <linux/bootmem.h> | 7 | #include <linux/bootmem.h> |
7 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
9 | #include <asm/dmi.h> | ||
8 | 10 | ||
9 | static char * __init dmi_string(struct dmi_header *dm, u8 s) | 11 | static char * __init dmi_string(struct dmi_header *dm, u8 s) |
10 | { | 12 | { |
@@ -106,7 +108,7 @@ static void __init dmi_save_devices(struct dmi_header *dm) | |||
106 | struct dmi_device *dev; | 108 | struct dmi_device *dev; |
107 | 109 | ||
108 | for (i = 0; i < count; i++) { | 110 | for (i = 0; i < count; i++) { |
109 | char *d = ((char *) dm) + (i * 2); | 111 | char *d = (char *)(dm + 1) + (i * 2); |
110 | 112 | ||
111 | /* Skip disabled device */ | 113 | /* Skip disabled device */ |
112 | if ((*d & 0x80) == 0) | 114 | if ((*d & 0x80) == 0) |
@@ -184,47 +186,72 @@ static void __init dmi_decode(struct dmi_header *dm) | |||
184 | } | 186 | } |
185 | } | 187 | } |
186 | 188 | ||
187 | void __init dmi_scan_machine(void) | 189 | static int __init dmi_present(char __iomem *p) |
188 | { | 190 | { |
189 | u8 buf[15]; | 191 | u8 buf[15]; |
190 | char __iomem *p, *q; | 192 | memcpy_fromio(buf, p, 15); |
193 | if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) { | ||
194 | u16 num = (buf[13] << 8) | buf[12]; | ||
195 | u16 len = (buf[7] << 8) | buf[6]; | ||
196 | u32 base = (buf[11] << 24) | (buf[10] << 16) | | ||
197 | (buf[9] << 8) | buf[8]; | ||
191 | 198 | ||
192 | /* | 199 | /* |
193 | * no iounmap() for that ioremap(); it would be a no-op, but it's | 200 | * DMI version 0.0 means that the real version is taken from |
194 | * so early in setup that sucker gets confused into doing what | 201 | * the SMBIOS version, which we don't know at this point. |
195 | * it shouldn't if we actually call it. | 202 | */ |
196 | */ | 203 | if (buf[14] != 0) |
197 | p = ioremap(0xF0000, 0x10000); | 204 | printk(KERN_INFO "DMI %d.%d present.\n", |
198 | if (p == NULL) | 205 | buf[14] >> 4, buf[14] & 0xF); |
199 | goto out; | 206 | else |
200 | 207 | printk(KERN_INFO "DMI present.\n"); | |
201 | for (q = p; q < p + 0x10000; q += 16) { | 208 | if (dmi_table(base,len, num, dmi_decode) == 0) |
202 | memcpy_fromio(buf, q, 15); | 209 | return 0; |
203 | if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) { | 210 | } |
204 | u16 num = (buf[13] << 8) | buf[12]; | 211 | return 1; |
205 | u16 len = (buf[7] << 8) | buf[6]; | 212 | } |
206 | u32 base = (buf[11] << 24) | (buf[10] << 16) | | 213 | |
207 | (buf[9] << 8) | buf[8]; | 214 | void __init dmi_scan_machine(void) |
208 | 215 | { | |
209 | /* | 216 | char __iomem *p, *q; |
210 | * DMI version 0.0 means that the real version is taken from | 217 | int rc; |
211 | * the SMBIOS version, which we don't know at this point. | 218 | |
212 | */ | 219 | if (efi_enabled) { |
213 | if (buf[14] != 0) | 220 | if (efi.smbios == EFI_INVALID_TABLE_ADDR) |
214 | printk(KERN_INFO "DMI %d.%d present.\n", | 221 | goto out; |
215 | buf[14] >> 4, buf[14] & 0xF); | 222 | |
216 | else | 223 | /* This is called as a core_initcall() because it isn't |
217 | printk(KERN_INFO "DMI present.\n"); | 224 | * needed during early boot. This also means we can |
225 | * iounmap the space when we're done with it. | ||
226 | */ | ||
227 | p = dmi_ioremap(efi.smbios, 32); | ||
228 | if (p == NULL) | ||
229 | goto out; | ||
230 | |||
231 | rc = dmi_present(p + 0x10); /* offset of _DMI_ string */ | ||
232 | dmi_iounmap(p, 32); | ||
233 | if (!rc) | ||
234 | return; | ||
235 | } | ||
236 | else { | ||
237 | /* | ||
238 | * no iounmap() for that ioremap(); it would be a no-op, but | ||
239 | * it's so early in setup that sucker gets confused into doing | ||
240 | * what it shouldn't if we actually call it. | ||
241 | */ | ||
242 | p = dmi_ioremap(0xF0000, 0x10000); | ||
243 | if (p == NULL) | ||
244 | goto out; | ||
218 | 245 | ||
219 | if (dmi_table(base,len, num, dmi_decode) == 0) | 246 | for (q = p; q < p + 0x10000; q += 16) { |
247 | rc = dmi_present(q); | ||
248 | if (!rc) | ||
220 | return; | 249 | return; |
221 | } | 250 | } |
222 | } | 251 | } |
223 | 252 | out: printk(KERN_INFO "DMI not present or invalid.\n"); | |
224 | out: printk(KERN_INFO "DMI not present or invalid.\n"); | ||
225 | } | 253 | } |
226 | 254 | ||
227 | |||
228 | /** | 255 | /** |
229 | * dmi_check_system - check system DMI data | 256 | * dmi_check_system - check system DMI data |
230 | * @list: array of dmi_system_id structures to match against | 257 | * @list: array of dmi_system_id structures to match against |
@@ -299,3 +326,33 @@ struct dmi_device * dmi_find_device(int type, const char *name, | |||
299 | return NULL; | 326 | return NULL; |
300 | } | 327 | } |
301 | EXPORT_SYMBOL(dmi_find_device); | 328 | EXPORT_SYMBOL(dmi_find_device); |
329 | |||
330 | /** | ||
331 | * dmi_get_year - Return year of a DMI date | ||
332 | * @field: data index (like dmi_get_system_info) | ||
333 | * | ||
334 | * Returns -1 when the field doesn't exist. 0 when it is broken. | ||
335 | */ | ||
336 | int dmi_get_year(int field) | ||
337 | { | ||
338 | int year; | ||
339 | char *s = dmi_get_system_info(field); | ||
340 | |||
341 | if (!s) | ||
342 | return -1; | ||
343 | if (*s == '\0') | ||
344 | return 0; | ||
345 | s = strrchr(s, '/'); | ||
346 | if (!s) | ||
347 | return 0; | ||
348 | |||
349 | s += 1; | ||
350 | year = simple_strtoul(s, NULL, 0); | ||
351 | if (year && year < 100) { /* 2-digit year */ | ||
352 | year += 1900; | ||
353 | if (year < 1996) /* no dates < spec 1.0 */ | ||
354 | year += 100; | ||
355 | } | ||
356 | |||
357 | return year; | ||
358 | } | ||
diff --git a/arch/i386/kernel/efi.c b/arch/i386/kernel/efi.c index c9cad7ba0d2d..9202b67c4b2e 100644 --- a/arch/i386/kernel/efi.c +++ b/arch/i386/kernel/efi.c | |||
@@ -115,7 +115,7 @@ static void efi_call_phys_epilog(void) | |||
115 | unsigned long cr4; | 115 | unsigned long cr4; |
116 | struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0); | 116 | struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0); |
117 | 117 | ||
118 | cpu_gdt_descr->address = __va(cpu_gdt_descr->address); | 118 | cpu_gdt_descr->address = (unsigned long)__va(cpu_gdt_descr->address); |
119 | load_gdt(cpu_gdt_descr); | 119 | load_gdt(cpu_gdt_descr); |
120 | 120 | ||
121 | cr4 = read_cr4(); | 121 | cr4 = read_cr4(); |
@@ -361,7 +361,7 @@ void __init efi_init(void) | |||
361 | */ | 361 | */ |
362 | c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2); | 362 | c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2); |
363 | if (c16) { | 363 | if (c16) { |
364 | for (i = 0; i < sizeof(vendor) && *c16; ++i) | 364 | for (i = 0; i < (sizeof(vendor) - 1) && *c16; ++i) |
365 | vendor[i] = *c16++; | 365 | vendor[i] = *c16++; |
366 | vendor[i] = '\0'; | 366 | vendor[i] = '\0'; |
367 | } else | 367 | } else |
@@ -381,29 +381,38 @@ void __init efi_init(void) | |||
381 | if (config_tables == NULL) | 381 | if (config_tables == NULL) |
382 | printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n"); | 382 | printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n"); |
383 | 383 | ||
384 | efi.mps = EFI_INVALID_TABLE_ADDR; | ||
385 | efi.acpi = EFI_INVALID_TABLE_ADDR; | ||
386 | efi.acpi20 = EFI_INVALID_TABLE_ADDR; | ||
387 | efi.smbios = EFI_INVALID_TABLE_ADDR; | ||
388 | efi.sal_systab = EFI_INVALID_TABLE_ADDR; | ||
389 | efi.boot_info = EFI_INVALID_TABLE_ADDR; | ||
390 | efi.hcdp = EFI_INVALID_TABLE_ADDR; | ||
391 | efi.uga = EFI_INVALID_TABLE_ADDR; | ||
392 | |||
384 | for (i = 0; i < num_config_tables; i++) { | 393 | for (i = 0; i < num_config_tables; i++) { |
385 | if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { | 394 | if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { |
386 | efi.mps = (void *)config_tables[i].table; | 395 | efi.mps = config_tables[i].table; |
387 | printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table); | 396 | printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table); |
388 | } else | 397 | } else |
389 | if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { | 398 | if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { |
390 | efi.acpi20 = __va(config_tables[i].table); | 399 | efi.acpi20 = config_tables[i].table; |
391 | printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table); | 400 | printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table); |
392 | } else | 401 | } else |
393 | if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { | 402 | if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { |
394 | efi.acpi = __va(config_tables[i].table); | 403 | efi.acpi = config_tables[i].table; |
395 | printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table); | 404 | printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table); |
396 | } else | 405 | } else |
397 | if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { | 406 | if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { |
398 | efi.smbios = (void *) config_tables[i].table; | 407 | efi.smbios = config_tables[i].table; |
399 | printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table); | 408 | printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table); |
400 | } else | 409 | } else |
401 | if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { | 410 | if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { |
402 | efi.hcdp = (void *)config_tables[i].table; | 411 | efi.hcdp = config_tables[i].table; |
403 | printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table); | 412 | printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table); |
404 | } else | 413 | } else |
405 | if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) { | 414 | if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) { |
406 | efi.uga = (void *)config_tables[i].table; | 415 | efi.uga = config_tables[i].table; |
407 | printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table); | 416 | printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table); |
408 | } | 417 | } |
409 | } | 418 | } |
@@ -543,7 +552,7 @@ efi_initialize_iomem_resources(struct resource *code_resource, | |||
543 | if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) > | 552 | if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) > |
544 | 0x100000000ULL) | 553 | 0x100000000ULL) |
545 | continue; | 554 | continue; |
546 | res = alloc_bootmem_low(sizeof(struct resource)); | 555 | res = kzalloc(sizeof(struct resource), GFP_ATOMIC); |
547 | switch (md->type) { | 556 | switch (md->type) { |
548 | case EFI_RESERVED_TYPE: | 557 | case EFI_RESERVED_TYPE: |
549 | res->name = "Reserved Memory"; | 558 | res->name = "Reserved Memory"; |
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index 4d704724b2f5..cfc683f153b9 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S | |||
@@ -226,6 +226,10 @@ ENTRY(system_call) | |||
226 | pushl %eax # save orig_eax | 226 | pushl %eax # save orig_eax |
227 | SAVE_ALL | 227 | SAVE_ALL |
228 | GET_THREAD_INFO(%ebp) | 228 | GET_THREAD_INFO(%ebp) |
229 | testl $TF_MASK,EFLAGS(%esp) | ||
230 | jz no_singlestep | ||
231 | orl $_TIF_SINGLESTEP,TI_flags(%ebp) | ||
232 | no_singlestep: | ||
229 | # system call tracing in operation / emulation | 233 | # system call tracing in operation / emulation |
230 | /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */ | 234 | /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */ |
231 | testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp) | 235 | testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp) |
diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S index e0b7c632efbc..3debc2e26542 100644 --- a/arch/i386/kernel/head.S +++ b/arch/i386/kernel/head.S | |||
@@ -450,7 +450,6 @@ int_msg: | |||
450 | 450 | ||
451 | .globl boot_gdt_descr | 451 | .globl boot_gdt_descr |
452 | .globl idt_descr | 452 | .globl idt_descr |
453 | .globl cpu_gdt_descr | ||
454 | 453 | ||
455 | ALIGN | 454 | ALIGN |
456 | # early boot GDT descriptor (must use 1:1 address mapping) | 455 | # early boot GDT descriptor (must use 1:1 address mapping) |
@@ -470,8 +469,6 @@ cpu_gdt_descr: | |||
470 | .word GDT_ENTRIES*8-1 | 469 | .word GDT_ENTRIES*8-1 |
471 | .long cpu_gdt_table | 470 | .long cpu_gdt_table |
472 | 471 | ||
473 | .fill NR_CPUS-1,8,0 # space for the other GDT descriptors | ||
474 | |||
475 | /* | 472 | /* |
476 | * The boot_gdt_table must mirror the equivalent in setup.S and is | 473 | * The boot_gdt_table must mirror the equivalent in setup.S and is |
477 | * used only for booting. | 474 | * used only for booting. |
@@ -485,7 +482,7 @@ ENTRY(boot_gdt_table) | |||
485 | /* | 482 | /* |
486 | * The Global Descriptor Table contains 28 quadwords, per-CPU. | 483 | * The Global Descriptor Table contains 28 quadwords, per-CPU. |
487 | */ | 484 | */ |
488 | .align PAGE_SIZE_asm | 485 | .align L1_CACHE_BYTES |
489 | ENTRY(cpu_gdt_table) | 486 | ENTRY(cpu_gdt_table) |
490 | .quad 0x0000000000000000 /* NULL descriptor */ | 487 | .quad 0x0000000000000000 /* NULL descriptor */ |
491 | .quad 0x0000000000000000 /* 0x0b reserved */ | 488 | .quad 0x0000000000000000 /* 0x0b reserved */ |
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index 39d9a5fa907e..f8f132aa5472 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
@@ -351,8 +351,8 @@ static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold) | |||
351 | { | 351 | { |
352 | int i, j; | 352 | int i, j; |
353 | Dprintk("Rotating IRQs among CPUs.\n"); | 353 | Dprintk("Rotating IRQs among CPUs.\n"); |
354 | for (i = 0; i < NR_CPUS; i++) { | 354 | for_each_online_cpu(i) { |
355 | for (j = 0; cpu_online(i) && (j < NR_IRQS); j++) { | 355 | for (j = 0; j < NR_IRQS; j++) { |
356 | if (!irq_desc[j].action) | 356 | if (!irq_desc[j].action) |
357 | continue; | 357 | continue; |
358 | /* Is it a significant load ? */ | 358 | /* Is it a significant load ? */ |
@@ -381,7 +381,7 @@ static void do_irq_balance(void) | |||
381 | unsigned long imbalance = 0; | 381 | unsigned long imbalance = 0; |
382 | cpumask_t allowed_mask, target_cpu_mask, tmp; | 382 | cpumask_t allowed_mask, target_cpu_mask, tmp; |
383 | 383 | ||
384 | for (i = 0; i < NR_CPUS; i++) { | 384 | for_each_possible_cpu(i) { |
385 | int package_index; | 385 | int package_index; |
386 | CPU_IRQ(i) = 0; | 386 | CPU_IRQ(i) = 0; |
387 | if (!cpu_online(i)) | 387 | if (!cpu_online(i)) |
@@ -422,9 +422,7 @@ static void do_irq_balance(void) | |||
422 | } | 422 | } |
423 | } | 423 | } |
424 | /* Find the least loaded processor package */ | 424 | /* Find the least loaded processor package */ |
425 | for (i = 0; i < NR_CPUS; i++) { | 425 | for_each_online_cpu(i) { |
426 | if (!cpu_online(i)) | ||
427 | continue; | ||
428 | if (i != CPU_TO_PACKAGEINDEX(i)) | 426 | if (i != CPU_TO_PACKAGEINDEX(i)) |
429 | continue; | 427 | continue; |
430 | if (min_cpu_irq > CPU_IRQ(i)) { | 428 | if (min_cpu_irq > CPU_IRQ(i)) { |
@@ -441,9 +439,7 @@ tryanothercpu: | |||
441 | */ | 439 | */ |
442 | tmp_cpu_irq = 0; | 440 | tmp_cpu_irq = 0; |
443 | tmp_loaded = -1; | 441 | tmp_loaded = -1; |
444 | for (i = 0; i < NR_CPUS; i++) { | 442 | for_each_online_cpu(i) { |
445 | if (!cpu_online(i)) | ||
446 | continue; | ||
447 | if (i != CPU_TO_PACKAGEINDEX(i)) | 443 | if (i != CPU_TO_PACKAGEINDEX(i)) |
448 | continue; | 444 | continue; |
449 | if (max_cpu_irq <= CPU_IRQ(i)) | 445 | if (max_cpu_irq <= CPU_IRQ(i)) |
@@ -619,9 +615,7 @@ static int __init balanced_irq_init(void) | |||
619 | if (smp_num_siblings > 1 && !cpus_empty(tmp)) | 615 | if (smp_num_siblings > 1 && !cpus_empty(tmp)) |
620 | physical_balance = 1; | 616 | physical_balance = 1; |
621 | 617 | ||
622 | for (i = 0; i < NR_CPUS; i++) { | 618 | for_each_online_cpu(i) { |
623 | if (!cpu_online(i)) | ||
624 | continue; | ||
625 | irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); | 619 | irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); |
626 | irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); | 620 | irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL); |
627 | if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) { | 621 | if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) { |
@@ -638,9 +632,11 @@ static int __init balanced_irq_init(void) | |||
638 | else | 632 | else |
639 | printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq"); | 633 | printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq"); |
640 | failed: | 634 | failed: |
641 | for (i = 0; i < NR_CPUS; i++) { | 635 | for_each_possible_cpu(i) { |
642 | kfree(irq_cpu_data[i].irq_delta); | 636 | kfree(irq_cpu_data[i].irq_delta); |
637 | irq_cpu_data[i].irq_delta = NULL; | ||
643 | kfree(irq_cpu_data[i].last_irq); | 638 | kfree(irq_cpu_data[i].last_irq); |
639 | irq_cpu_data[i].last_irq = NULL; | ||
644 | } | 640 | } |
645 | return 0; | 641 | return 0; |
646 | } | 642 | } |
@@ -648,7 +644,7 @@ failed: | |||
648 | int __init irqbalance_disable(char *str) | 644 | int __init irqbalance_disable(char *str) |
649 | { | 645 | { |
650 | irqbalance_disabled = 1; | 646 | irqbalance_disabled = 1; |
651 | return 0; | 647 | return 1; |
652 | } | 648 | } |
653 | 649 | ||
654 | __setup("noirqbalance", irqbalance_disable); | 650 | __setup("noirqbalance", irqbalance_disable); |
@@ -1761,7 +1757,8 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
1761 | * Don't check I/O APIC IDs for xAPIC systems. They have | 1757 | * Don't check I/O APIC IDs for xAPIC systems. They have |
1762 | * no meaning without the serial APIC bus. | 1758 | * no meaning without the serial APIC bus. |
1763 | */ | 1759 | */ |
1764 | if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 < 15)) | 1760 | if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) |
1761 | || APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) | ||
1765 | return; | 1762 | return; |
1766 | /* | 1763 | /* |
1767 | * This is broken; anything with a real cpu count has to | 1764 | * This is broken; anything with a real cpu count has to |
diff --git a/arch/i386/kernel/kprobes.c b/arch/i386/kernel/kprobes.c index 694a13997637..f19768789e8a 100644 --- a/arch/i386/kernel/kprobes.c +++ b/arch/i386/kernel/kprobes.c | |||
@@ -35,12 +35,56 @@ | |||
35 | #include <asm/cacheflush.h> | 35 | #include <asm/cacheflush.h> |
36 | #include <asm/kdebug.h> | 36 | #include <asm/kdebug.h> |
37 | #include <asm/desc.h> | 37 | #include <asm/desc.h> |
38 | #include <asm/uaccess.h> | ||
38 | 39 | ||
39 | void jprobe_return_end(void); | 40 | void jprobe_return_end(void); |
40 | 41 | ||
41 | DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; | 42 | DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; |
42 | DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | 43 | DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); |
43 | 44 | ||
45 | /* insert a jmp code */ | ||
46 | static inline void set_jmp_op(void *from, void *to) | ||
47 | { | ||
48 | struct __arch_jmp_op { | ||
49 | char op; | ||
50 | long raddr; | ||
51 | } __attribute__((packed)) *jop; | ||
52 | jop = (struct __arch_jmp_op *)from; | ||
53 | jop->raddr = (long)(to) - ((long)(from) + 5); | ||
54 | jop->op = RELATIVEJUMP_INSTRUCTION; | ||
55 | } | ||
56 | |||
57 | /* | ||
58 | * returns non-zero if opcodes can be boosted. | ||
59 | */ | ||
60 | static inline int can_boost(kprobe_opcode_t opcode) | ||
61 | { | ||
62 | switch (opcode & 0xf0 ) { | ||
63 | case 0x70: | ||
64 | return 0; /* can't boost conditional jump */ | ||
65 | case 0x90: | ||
66 | /* can't boost call and pushf */ | ||
67 | return opcode != 0x9a && opcode != 0x9c; | ||
68 | case 0xc0: | ||
69 | /* can't boost undefined opcodes and soft-interruptions */ | ||
70 | return (0xc1 < opcode && opcode < 0xc6) || | ||
71 | (0xc7 < opcode && opcode < 0xcc) || opcode == 0xcf; | ||
72 | case 0xd0: | ||
73 | /* can boost AA* and XLAT */ | ||
74 | return (opcode == 0xd4 || opcode == 0xd5 || opcode == 0xd7); | ||
75 | case 0xe0: | ||
76 | /* can boost in/out and (may be) jmps */ | ||
77 | return (0xe3 < opcode && opcode != 0xe8); | ||
78 | case 0xf0: | ||
79 | /* clear and set flags can be boost */ | ||
80 | return (opcode == 0xf5 || (0xf7 < opcode && opcode < 0xfe)); | ||
81 | default: | ||
82 | /* currently, can't boost 2 bytes opcodes */ | ||
83 | return opcode != 0x0f; | ||
84 | } | ||
85 | } | ||
86 | |||
87 | |||
44 | /* | 88 | /* |
45 | * returns non-zero if opcode modifies the interrupt flag. | 89 | * returns non-zero if opcode modifies the interrupt flag. |
46 | */ | 90 | */ |
@@ -65,6 +109,11 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) | |||
65 | 109 | ||
66 | memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); | 110 | memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); |
67 | p->opcode = *p->addr; | 111 | p->opcode = *p->addr; |
112 | if (can_boost(p->opcode)) { | ||
113 | p->ainsn.boostable = 0; | ||
114 | } else { | ||
115 | p->ainsn.boostable = -1; | ||
116 | } | ||
68 | return 0; | 117 | return 0; |
69 | } | 118 | } |
70 | 119 | ||
@@ -84,9 +133,9 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
84 | 133 | ||
85 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 134 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
86 | { | 135 | { |
87 | down(&kprobe_mutex); | 136 | mutex_lock(&kprobe_mutex); |
88 | free_insn_slot(p->ainsn.insn); | 137 | free_insn_slot(p->ainsn.insn); |
89 | up(&kprobe_mutex); | 138 | mutex_unlock(&kprobe_mutex); |
90 | } | 139 | } |
91 | 140 | ||
92 | static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) | 141 | static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) |
@@ -155,9 +204,13 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
155 | { | 204 | { |
156 | struct kprobe *p; | 205 | struct kprobe *p; |
157 | int ret = 0; | 206 | int ret = 0; |
158 | kprobe_opcode_t *addr = NULL; | 207 | kprobe_opcode_t *addr; |
159 | unsigned long *lp; | ||
160 | struct kprobe_ctlblk *kcb; | 208 | struct kprobe_ctlblk *kcb; |
209 | #ifdef CONFIG_PREEMPT | ||
210 | unsigned pre_preempt_count = preempt_count(); | ||
211 | #endif /* CONFIG_PREEMPT */ | ||
212 | |||
213 | addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t)); | ||
161 | 214 | ||
162 | /* | 215 | /* |
163 | * We don't want to be preempted for the entire | 216 | * We don't want to be preempted for the entire |
@@ -166,17 +219,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
166 | preempt_disable(); | 219 | preempt_disable(); |
167 | kcb = get_kprobe_ctlblk(); | 220 | kcb = get_kprobe_ctlblk(); |
168 | 221 | ||
169 | /* Check if the application is using LDT entry for its code segment and | ||
170 | * calculate the address by reading the base address from the LDT entry. | ||
171 | */ | ||
172 | if ((regs->xcs & 4) && (current->mm)) { | ||
173 | lp = (unsigned long *) ((unsigned long)((regs->xcs >> 3) * 8) | ||
174 | + (char *) current->mm->context.ldt); | ||
175 | addr = (kprobe_opcode_t *) (get_desc_base(lp) + regs->eip - | ||
176 | sizeof(kprobe_opcode_t)); | ||
177 | } else { | ||
178 | addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t)); | ||
179 | } | ||
180 | /* Check we're not actually recursing */ | 222 | /* Check we're not actually recursing */ |
181 | if (kprobe_running()) { | 223 | if (kprobe_running()) { |
182 | p = get_kprobe(addr); | 224 | p = get_kprobe(addr); |
@@ -252,6 +294,21 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
252 | /* handler has already set things up, so skip ss setup */ | 294 | /* handler has already set things up, so skip ss setup */ |
253 | return 1; | 295 | return 1; |
254 | 296 | ||
297 | if (p->ainsn.boostable == 1 && | ||
298 | #ifdef CONFIG_PREEMPT | ||
299 | !(pre_preempt_count) && /* | ||
300 | * This enables booster when the direct | ||
301 | * execution path aren't preempted. | ||
302 | */ | ||
303 | #endif /* CONFIG_PREEMPT */ | ||
304 | !p->post_handler && !p->break_handler ) { | ||
305 | /* Boost up -- we can execute copied instructions directly */ | ||
306 | reset_current_kprobe(); | ||
307 | regs->eip = (unsigned long)p->ainsn.insn; | ||
308 | preempt_enable_no_resched(); | ||
309 | return 1; | ||
310 | } | ||
311 | |||
255 | ss_probe: | 312 | ss_probe: |
256 | prepare_singlestep(p, regs); | 313 | prepare_singlestep(p, regs); |
257 | kcb->kprobe_status = KPROBE_HIT_SS; | 314 | kcb->kprobe_status = KPROBE_HIT_SS; |
@@ -267,17 +324,44 @@ no_kprobe: | |||
267 | * here. When a retprobed function returns, this probe is hit and | 324 | * here. When a retprobed function returns, this probe is hit and |
268 | * trampoline_probe_handler() runs, calling the kretprobe's handler. | 325 | * trampoline_probe_handler() runs, calling the kretprobe's handler. |
269 | */ | 326 | */ |
270 | void kretprobe_trampoline_holder(void) | 327 | void __kprobes kretprobe_trampoline_holder(void) |
271 | { | 328 | { |
272 | asm volatile ( ".global kretprobe_trampoline\n" | 329 | asm volatile ( ".global kretprobe_trampoline\n" |
273 | "kretprobe_trampoline: \n" | 330 | "kretprobe_trampoline: \n" |
274 | "nop\n"); | 331 | " pushf\n" |
275 | } | 332 | /* skip cs, eip, orig_eax, es, ds */ |
333 | " subl $20, %esp\n" | ||
334 | " pushl %eax\n" | ||
335 | " pushl %ebp\n" | ||
336 | " pushl %edi\n" | ||
337 | " pushl %esi\n" | ||
338 | " pushl %edx\n" | ||
339 | " pushl %ecx\n" | ||
340 | " pushl %ebx\n" | ||
341 | " movl %esp, %eax\n" | ||
342 | " call trampoline_handler\n" | ||
343 | /* move eflags to cs */ | ||
344 | " movl 48(%esp), %edx\n" | ||
345 | " movl %edx, 44(%esp)\n" | ||
346 | /* save true return address on eflags */ | ||
347 | " movl %eax, 48(%esp)\n" | ||
348 | " popl %ebx\n" | ||
349 | " popl %ecx\n" | ||
350 | " popl %edx\n" | ||
351 | " popl %esi\n" | ||
352 | " popl %edi\n" | ||
353 | " popl %ebp\n" | ||
354 | " popl %eax\n" | ||
355 | /* skip eip, orig_eax, es, ds */ | ||
356 | " addl $16, %esp\n" | ||
357 | " popf\n" | ||
358 | " ret\n"); | ||
359 | } | ||
276 | 360 | ||
277 | /* | 361 | /* |
278 | * Called when we hit the probe point at kretprobe_trampoline | 362 | * Called from kretprobe_trampoline |
279 | */ | 363 | */ |
280 | int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | 364 | fastcall void *__kprobes trampoline_handler(struct pt_regs *regs) |
281 | { | 365 | { |
282 | struct kretprobe_instance *ri = NULL; | 366 | struct kretprobe_instance *ri = NULL; |
283 | struct hlist_head *head; | 367 | struct hlist_head *head; |
@@ -306,8 +390,11 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
306 | /* another task is sharing our hash bucket */ | 390 | /* another task is sharing our hash bucket */ |
307 | continue; | 391 | continue; |
308 | 392 | ||
309 | if (ri->rp && ri->rp->handler) | 393 | if (ri->rp && ri->rp->handler){ |
394 | __get_cpu_var(current_kprobe) = &ri->rp->kp; | ||
310 | ri->rp->handler(ri, regs); | 395 | ri->rp->handler(ri, regs); |
396 | __get_cpu_var(current_kprobe) = NULL; | ||
397 | } | ||
311 | 398 | ||
312 | orig_ret_address = (unsigned long)ri->ret_addr; | 399 | orig_ret_address = (unsigned long)ri->ret_addr; |
313 | recycle_rp_inst(ri); | 400 | recycle_rp_inst(ri); |
@@ -322,18 +409,10 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
322 | } | 409 | } |
323 | 410 | ||
324 | BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address)); | 411 | BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address)); |
325 | regs->eip = orig_ret_address; | ||
326 | 412 | ||
327 | reset_current_kprobe(); | ||
328 | spin_unlock_irqrestore(&kretprobe_lock, flags); | 413 | spin_unlock_irqrestore(&kretprobe_lock, flags); |
329 | preempt_enable_no_resched(); | ||
330 | 414 | ||
331 | /* | 415 | return (void*)orig_ret_address; |
332 | * By returning a non-zero value, we are telling | ||
333 | * kprobe_handler() that we don't want the post_handler | ||
334 | * to run (and have re-enabled preemption) | ||
335 | */ | ||
336 | return 1; | ||
337 | } | 416 | } |
338 | 417 | ||
339 | /* | 418 | /* |
@@ -357,15 +436,17 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | |||
357 | * 2) If the single-stepped instruction was a call, the return address | 436 | * 2) If the single-stepped instruction was a call, the return address |
358 | * that is atop the stack is the address following the copied instruction. | 437 | * that is atop the stack is the address following the copied instruction. |
359 | * We need to make it the address following the original instruction. | 438 | * We need to make it the address following the original instruction. |
439 | * | ||
440 | * This function also checks instruction size for preparing direct execution. | ||
360 | */ | 441 | */ |
361 | static void __kprobes resume_execution(struct kprobe *p, | 442 | static void __kprobes resume_execution(struct kprobe *p, |
362 | struct pt_regs *regs, struct kprobe_ctlblk *kcb) | 443 | struct pt_regs *regs, struct kprobe_ctlblk *kcb) |
363 | { | 444 | { |
364 | unsigned long *tos = (unsigned long *)®s->esp; | 445 | unsigned long *tos = (unsigned long *)®s->esp; |
365 | unsigned long next_eip = 0; | ||
366 | unsigned long copy_eip = (unsigned long)p->ainsn.insn; | 446 | unsigned long copy_eip = (unsigned long)p->ainsn.insn; |
367 | unsigned long orig_eip = (unsigned long)p->addr; | 447 | unsigned long orig_eip = (unsigned long)p->addr; |
368 | 448 | ||
449 | regs->eflags &= ~TF_MASK; | ||
369 | switch (p->ainsn.insn[0]) { | 450 | switch (p->ainsn.insn[0]) { |
370 | case 0x9c: /* pushfl */ | 451 | case 0x9c: /* pushfl */ |
371 | *tos &= ~(TF_MASK | IF_MASK); | 452 | *tos &= ~(TF_MASK | IF_MASK); |
@@ -375,37 +456,51 @@ static void __kprobes resume_execution(struct kprobe *p, | |||
375 | case 0xcb: | 456 | case 0xcb: |
376 | case 0xc2: | 457 | case 0xc2: |
377 | case 0xca: | 458 | case 0xca: |
378 | regs->eflags &= ~TF_MASK; | 459 | case 0xea: /* jmp absolute -- eip is correct */ |
379 | /* eip is already adjusted, no more changes required*/ | 460 | /* eip is already adjusted, no more changes required */ |
380 | return; | 461 | p->ainsn.boostable = 1; |
462 | goto no_change; | ||
381 | case 0xe8: /* call relative - Fix return addr */ | 463 | case 0xe8: /* call relative - Fix return addr */ |
382 | *tos = orig_eip + (*tos - copy_eip); | 464 | *tos = orig_eip + (*tos - copy_eip); |
383 | break; | 465 | break; |
384 | case 0xff: | 466 | case 0xff: |
385 | if ((p->ainsn.insn[1] & 0x30) == 0x10) { | 467 | if ((p->ainsn.insn[1] & 0x30) == 0x10) { |
386 | /* call absolute, indirect */ | 468 | /* call absolute, indirect */ |
387 | /* Fix return addr; eip is correct. */ | 469 | /* |
388 | next_eip = regs->eip; | 470 | * Fix return addr; eip is correct. |
471 | * But this is not boostable | ||
472 | */ | ||
389 | *tos = orig_eip + (*tos - copy_eip); | 473 | *tos = orig_eip + (*tos - copy_eip); |
474 | goto no_change; | ||
390 | } else if (((p->ainsn.insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */ | 475 | } else if (((p->ainsn.insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */ |
391 | ((p->ainsn.insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */ | 476 | ((p->ainsn.insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */ |
392 | /* eip is correct. */ | 477 | /* eip is correct. And this is boostable */ |
393 | next_eip = regs->eip; | 478 | p->ainsn.boostable = 1; |
479 | goto no_change; | ||
394 | } | 480 | } |
395 | break; | ||
396 | case 0xea: /* jmp absolute -- eip is correct */ | ||
397 | next_eip = regs->eip; | ||
398 | break; | ||
399 | default: | 481 | default: |
400 | break; | 482 | break; |
401 | } | 483 | } |
402 | 484 | ||
403 | regs->eflags &= ~TF_MASK; | 485 | if (p->ainsn.boostable == 0) { |
404 | if (next_eip) { | 486 | if ((regs->eip > copy_eip) && |
405 | regs->eip = next_eip; | 487 | (regs->eip - copy_eip) + 5 < MAX_INSN_SIZE) { |
406 | } else { | 488 | /* |
407 | regs->eip = orig_eip + (regs->eip - copy_eip); | 489 | * These instructions can be executed directly if it |
490 | * jumps back to correct address. | ||
491 | */ | ||
492 | set_jmp_op((void *)regs->eip, | ||
493 | (void *)orig_eip + (regs->eip - copy_eip)); | ||
494 | p->ainsn.boostable = 1; | ||
495 | } else { | ||
496 | p->ainsn.boostable = -1; | ||
497 | } | ||
408 | } | 498 | } |
499 | |||
500 | regs->eip = orig_eip + (regs->eip - copy_eip); | ||
501 | |||
502 | no_change: | ||
503 | return; | ||
409 | } | 504 | } |
410 | 505 | ||
411 | /* | 506 | /* |
@@ -453,15 +548,57 @@ static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr) | |||
453 | struct kprobe *cur = kprobe_running(); | 548 | struct kprobe *cur = kprobe_running(); |
454 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 549 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
455 | 550 | ||
456 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | 551 | switch(kcb->kprobe_status) { |
457 | return 1; | 552 | case KPROBE_HIT_SS: |
458 | 553 | case KPROBE_REENTER: | |
459 | if (kcb->kprobe_status & KPROBE_HIT_SS) { | 554 | /* |
460 | resume_execution(cur, regs, kcb); | 555 | * We are here because the instruction being single |
556 | * stepped caused a page fault. We reset the current | ||
557 | * kprobe and the eip points back to the probe address | ||
558 | * and allow the page fault handler to continue as a | ||
559 | * normal page fault. | ||
560 | */ | ||
561 | regs->eip = (unsigned long)cur->addr; | ||
461 | regs->eflags |= kcb->kprobe_old_eflags; | 562 | regs->eflags |= kcb->kprobe_old_eflags; |
462 | 563 | if (kcb->kprobe_status == KPROBE_REENTER) | |
463 | reset_current_kprobe(); | 564 | restore_previous_kprobe(kcb); |
565 | else | ||
566 | reset_current_kprobe(); | ||
464 | preempt_enable_no_resched(); | 567 | preempt_enable_no_resched(); |
568 | break; | ||
569 | case KPROBE_HIT_ACTIVE: | ||
570 | case KPROBE_HIT_SSDONE: | ||
571 | /* | ||
572 | * We increment the nmissed count for accounting, | ||
573 | * we can also use npre/npostfault count for accouting | ||
574 | * these specific fault cases. | ||
575 | */ | ||
576 | kprobes_inc_nmissed_count(cur); | ||
577 | |||
578 | /* | ||
579 | * We come here because instructions in the pre/post | ||
580 | * handler caused the page_fault, this could happen | ||
581 | * if handler tries to access user space by | ||
582 | * copy_from_user(), get_user() etc. Let the | ||
583 | * user-specified handler try to fix it first. | ||
584 | */ | ||
585 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | ||
586 | return 1; | ||
587 | |||
588 | /* | ||
589 | * In case the user-specified fault handler returned | ||
590 | * zero, try to fix up. | ||
591 | */ | ||
592 | if (fixup_exception(regs)) | ||
593 | return 1; | ||
594 | |||
595 | /* | ||
596 | * fixup_exception() could not handle it, | ||
597 | * Let do_page_fault() fix it. | ||
598 | */ | ||
599 | break; | ||
600 | default: | ||
601 | break; | ||
465 | } | 602 | } |
466 | return 0; | 603 | return 0; |
467 | } | 604 | } |
@@ -475,6 +612,9 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
475 | struct die_args *args = (struct die_args *)data; | 612 | struct die_args *args = (struct die_args *)data; |
476 | int ret = NOTIFY_DONE; | 613 | int ret = NOTIFY_DONE; |
477 | 614 | ||
615 | if (args->regs && user_mode(args->regs)) | ||
616 | return ret; | ||
617 | |||
478 | switch (val) { | 618 | switch (val) { |
479 | case DIE_INT3: | 619 | case DIE_INT3: |
480 | if (kprobe_handler(args->regs)) | 620 | if (kprobe_handler(args->regs)) |
@@ -564,12 +704,7 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
564 | return 0; | 704 | return 0; |
565 | } | 705 | } |
566 | 706 | ||
567 | static struct kprobe trampoline_p = { | ||
568 | .addr = (kprobe_opcode_t *) &kretprobe_trampoline, | ||
569 | .pre_handler = trampoline_probe_handler | ||
570 | }; | ||
571 | |||
572 | int __init arch_init_kprobes(void) | 707 | int __init arch_init_kprobes(void) |
573 | { | 708 | { |
574 | return register_kprobe(&trampoline_p); | 709 | return 0; |
575 | } | 710 | } |
diff --git a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c index 5390b521aca0..e7c138f66c5a 100644 --- a/arch/i386/kernel/microcode.c +++ b/arch/i386/kernel/microcode.c | |||
@@ -81,6 +81,7 @@ | |||
81 | #include <linux/miscdevice.h> | 81 | #include <linux/miscdevice.h> |
82 | #include <linux/spinlock.h> | 82 | #include <linux/spinlock.h> |
83 | #include <linux/mm.h> | 83 | #include <linux/mm.h> |
84 | #include <linux/mutex.h> | ||
84 | 85 | ||
85 | #include <asm/msr.h> | 86 | #include <asm/msr.h> |
86 | #include <asm/uaccess.h> | 87 | #include <asm/uaccess.h> |
@@ -114,7 +115,7 @@ MODULE_LICENSE("GPL"); | |||
114 | static DEFINE_SPINLOCK(microcode_update_lock); | 115 | static DEFINE_SPINLOCK(microcode_update_lock); |
115 | 116 | ||
116 | /* no concurrent ->write()s are allowed on /dev/cpu/microcode */ | 117 | /* no concurrent ->write()s are allowed on /dev/cpu/microcode */ |
117 | static DECLARE_MUTEX(microcode_sem); | 118 | static DEFINE_MUTEX(microcode_mutex); |
118 | 119 | ||
119 | static void __user *user_buffer; /* user area microcode data buffer */ | 120 | static void __user *user_buffer; /* user area microcode data buffer */ |
120 | static unsigned int user_buffer_size; /* it's size */ | 121 | static unsigned int user_buffer_size; /* it's size */ |
@@ -202,8 +203,6 @@ static inline void mark_microcode_update (int cpu_num, microcode_header_t *mc_he | |||
202 | } else if (mc_header->rev == uci->rev) { | 203 | } else if (mc_header->rev == uci->rev) { |
203 | /* notify the caller of success on this cpu */ | 204 | /* notify the caller of success on this cpu */ |
204 | uci->err = MC_SUCCESS; | 205 | uci->err = MC_SUCCESS; |
205 | printk(KERN_ERR "microcode: CPU%d already at revision" | ||
206 | " 0x%x (current=0x%x)\n", cpu_num, mc_header->rev, uci->rev); | ||
207 | goto out; | 206 | goto out; |
208 | } | 207 | } |
209 | 208 | ||
@@ -369,7 +368,6 @@ static void do_update_one (void * unused) | |||
369 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; | 368 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num; |
370 | 369 | ||
371 | if (uci->mc == NULL) { | 370 | if (uci->mc == NULL) { |
372 | printk(KERN_INFO "microcode: No new microcode data for CPU%d\n", cpu_num); | ||
373 | return; | 371 | return; |
374 | } | 372 | } |
375 | 373 | ||
@@ -447,7 +445,7 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_ | |||
447 | return -EINVAL; | 445 | return -EINVAL; |
448 | } | 446 | } |
449 | 447 | ||
450 | down(µcode_sem); | 448 | mutex_lock(µcode_mutex); |
451 | 449 | ||
452 | user_buffer = (void __user *) buf; | 450 | user_buffer = (void __user *) buf; |
453 | user_buffer_size = (int) len; | 451 | user_buffer_size = (int) len; |
@@ -456,31 +454,14 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_ | |||
456 | if (!ret) | 454 | if (!ret) |
457 | ret = (ssize_t)len; | 455 | ret = (ssize_t)len; |
458 | 456 | ||
459 | up(µcode_sem); | 457 | mutex_unlock(µcode_mutex); |
460 | 458 | ||
461 | return ret; | 459 | return ret; |
462 | } | 460 | } |
463 | 461 | ||
464 | static int microcode_ioctl (struct inode *inode, struct file *file, | ||
465 | unsigned int cmd, unsigned long arg) | ||
466 | { | ||
467 | switch (cmd) { | ||
468 | /* | ||
469 | * XXX: will be removed after microcode_ctl | ||
470 | * is updated to ignore failure of this ioctl() | ||
471 | */ | ||
472 | case MICROCODE_IOCFREE: | ||
473 | return 0; | ||
474 | default: | ||
475 | return -EINVAL; | ||
476 | } | ||
477 | return -EINVAL; | ||
478 | } | ||
479 | |||
480 | static struct file_operations microcode_fops = { | 462 | static struct file_operations microcode_fops = { |
481 | .owner = THIS_MODULE, | 463 | .owner = THIS_MODULE, |
482 | .write = microcode_write, | 464 | .write = microcode_write, |
483 | .ioctl = microcode_ioctl, | ||
484 | .open = microcode_open, | 465 | .open = microcode_open, |
485 | }; | 466 | }; |
486 | 467 | ||
@@ -511,7 +492,6 @@ static int __init microcode_init (void) | |||
511 | static void __exit microcode_exit (void) | 492 | static void __exit microcode_exit (void) |
512 | { | 493 | { |
513 | misc_deregister(µcode_dev); | 494 | misc_deregister(µcode_dev); |
514 | printk(KERN_INFO "IA-32 Microcode Update Driver v" MICROCODE_VERSION " unregistered\n"); | ||
515 | } | 495 | } |
516 | 496 | ||
517 | module_init(microcode_init) | 497 | module_init(microcode_init) |
diff --git a/arch/i386/kernel/module.c b/arch/i386/kernel/module.c index 5149c8a621f0..470cf97e7cd3 100644 --- a/arch/i386/kernel/module.c +++ b/arch/i386/kernel/module.c | |||
@@ -104,26 +104,38 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
104 | return -ENOEXEC; | 104 | return -ENOEXEC; |
105 | } | 105 | } |
106 | 106 | ||
107 | extern void apply_alternatives(void *start, void *end); | ||
108 | |||
109 | int module_finalize(const Elf_Ehdr *hdr, | 107 | int module_finalize(const Elf_Ehdr *hdr, |
110 | const Elf_Shdr *sechdrs, | 108 | const Elf_Shdr *sechdrs, |
111 | struct module *me) | 109 | struct module *me) |
112 | { | 110 | { |
113 | const Elf_Shdr *s; | 111 | const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL; |
114 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 112 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
115 | 113 | ||
116 | /* look for .altinstructions to patch */ | ||
117 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { | 114 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { |
118 | void *seg; | 115 | if (!strcmp(".text", secstrings + s->sh_name)) |
119 | if (strcmp(".altinstructions", secstrings + s->sh_name)) | 116 | text = s; |
120 | continue; | 117 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) |
121 | seg = (void *)s->sh_addr; | 118 | alt = s; |
122 | apply_alternatives(seg, seg + s->sh_size); | 119 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) |
123 | } | 120 | locks= s; |
121 | } | ||
122 | |||
123 | if (alt) { | ||
124 | /* patch .altinstructions */ | ||
125 | void *aseg = (void *)alt->sh_addr; | ||
126 | apply_alternatives(aseg, aseg + alt->sh_size); | ||
127 | } | ||
128 | if (locks && text) { | ||
129 | void *lseg = (void *)locks->sh_addr; | ||
130 | void *tseg = (void *)text->sh_addr; | ||
131 | alternatives_smp_module_add(me, me->name, | ||
132 | lseg, lseg + locks->sh_size, | ||
133 | tseg, tseg + text->sh_size); | ||
134 | } | ||
124 | return 0; | 135 | return 0; |
125 | } | 136 | } |
126 | 137 | ||
127 | void module_arch_cleanup(struct module *mod) | 138 | void module_arch_cleanup(struct module *mod) |
128 | { | 139 | { |
140 | alternatives_smp_module_del(mod); | ||
129 | } | 141 | } |
diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index e6e2f43db85e..8d8aa9d1796d 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c | |||
@@ -828,6 +828,8 @@ void __init find_smp_config (void) | |||
828 | smp_scan_config(address, 0x400); | 828 | smp_scan_config(address, 0x400); |
829 | } | 829 | } |
830 | 830 | ||
831 | int es7000_plat; | ||
832 | |||
831 | /* -------------------------------------------------------------------------- | 833 | /* -------------------------------------------------------------------------- |
832 | ACPI-based MP Configuration | 834 | ACPI-based MP Configuration |
833 | -------------------------------------------------------------------------- */ | 835 | -------------------------------------------------------------------------- */ |
@@ -935,7 +937,8 @@ void __init mp_register_ioapic ( | |||
935 | mp_ioapics[idx].mpc_apicaddr = address; | 937 | mp_ioapics[idx].mpc_apicaddr = address; |
936 | 938 | ||
937 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 939 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
938 | if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 < 15)) | 940 | if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) |
941 | && !APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) | ||
939 | tmpid = io_apic_get_unique_id(idx, id); | 942 | tmpid = io_apic_get_unique_id(idx, id); |
940 | else | 943 | else |
941 | tmpid = id; | 944 | tmpid = id; |
@@ -1011,8 +1014,6 @@ void __init mp_override_legacy_irq ( | |||
1011 | return; | 1014 | return; |
1012 | } | 1015 | } |
1013 | 1016 | ||
1014 | int es7000_plat; | ||
1015 | |||
1016 | void __init mp_config_acpi_legacy_irqs (void) | 1017 | void __init mp_config_acpi_legacy_irqs (void) |
1017 | { | 1018 | { |
1018 | struct mpc_config_intsrc intsrc; | 1019 | struct mpc_config_intsrc intsrc; |
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c index be87c5e2ee95..d43b498ec745 100644 --- a/arch/i386/kernel/nmi.c +++ b/arch/i386/kernel/nmi.c | |||
@@ -138,12 +138,12 @@ static int __init check_nmi_watchdog(void) | |||
138 | if (nmi_watchdog == NMI_LOCAL_APIC) | 138 | if (nmi_watchdog == NMI_LOCAL_APIC) |
139 | smp_call_function(nmi_cpu_busy, (void *)&endflag, 0, 0); | 139 | smp_call_function(nmi_cpu_busy, (void *)&endflag, 0, 0); |
140 | 140 | ||
141 | for_each_cpu(cpu) | 141 | for_each_possible_cpu(cpu) |
142 | prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count; | 142 | prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count; |
143 | local_irq_enable(); | 143 | local_irq_enable(); |
144 | mdelay((10*1000)/nmi_hz); // wait 10 ticks | 144 | mdelay((10*1000)/nmi_hz); // wait 10 ticks |
145 | 145 | ||
146 | for (cpu = 0; cpu < NR_CPUS; cpu++) { | 146 | for_each_possible_cpu(cpu) { |
147 | #ifdef CONFIG_SMP | 147 | #ifdef CONFIG_SMP |
148 | /* Check cpu_callin_map here because that is set | 148 | /* Check cpu_callin_map here because that is set |
149 | after the timer is started. */ | 149 | after the timer is started. */ |
@@ -510,7 +510,7 @@ void touch_nmi_watchdog (void) | |||
510 | * Just reset the alert counters, (other CPUs might be | 510 | * Just reset the alert counters, (other CPUs might be |
511 | * spinning on locks we hold): | 511 | * spinning on locks we hold): |
512 | */ | 512 | */ |
513 | for (i = 0; i < NR_CPUS; i++) | 513 | for_each_possible_cpu(i) |
514 | alert_counter[i] = 0; | 514 | alert_counter[i] = 0; |
515 | 515 | ||
516 | /* | 516 | /* |
@@ -529,7 +529,8 @@ void nmi_watchdog_tick (struct pt_regs * regs) | |||
529 | * always switch the stack NMI-atomically, it's safe to use | 529 | * always switch the stack NMI-atomically, it's safe to use |
530 | * smp_processor_id(). | 530 | * smp_processor_id(). |
531 | */ | 531 | */ |
532 | int sum, cpu = smp_processor_id(); | 532 | unsigned int sum; |
533 | int cpu = smp_processor_id(); | ||
533 | 534 | ||
534 | sum = per_cpu(irq_stat, cpu).apic_timer_irqs; | 535 | sum = per_cpu(irq_stat, cpu).apic_timer_irqs; |
535 | 536 | ||
@@ -543,7 +544,7 @@ void nmi_watchdog_tick (struct pt_regs * regs) | |||
543 | /* | 544 | /* |
544 | * die_nmi will return ONLY if NOTIFY_STOP happens.. | 545 | * die_nmi will return ONLY if NOTIFY_STOP happens.. |
545 | */ | 546 | */ |
546 | die_nmi(regs, "NMI Watchdog detected LOCKUP"); | 547 | die_nmi(regs, "BUG: NMI Watchdog detected LOCKUP"); |
547 | } else { | 548 | } else { |
548 | last_irq_sums[cpu] = sum; | 549 | last_irq_sums[cpu] = sum; |
549 | alert_counter[cpu] = 0; | 550 | alert_counter[cpu] = 0; |
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index 0480454ebffa..6259afea46d1 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #include <linux/kallsyms.h> | 38 | #include <linux/kallsyms.h> |
39 | #include <linux/ptrace.h> | 39 | #include <linux/ptrace.h> |
40 | #include <linux/random.h> | 40 | #include <linux/random.h> |
41 | #include <linux/kprobes.h> | ||
42 | 41 | ||
43 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
44 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
@@ -295,7 +294,7 @@ void show_regs(struct pt_regs * regs) | |||
295 | printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id()); | 294 | printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id()); |
296 | print_symbol("EIP is at %s\n", regs->eip); | 295 | print_symbol("EIP is at %s\n", regs->eip); |
297 | 296 | ||
298 | if (user_mode(regs)) | 297 | if (user_mode_vm(regs)) |
299 | printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); | 298 | printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); |
300 | printk(" EFLAGS: %08lx %s (%s %.*s)\n", | 299 | printk(" EFLAGS: %08lx %s (%s %.*s)\n", |
301 | regs->eflags, print_tainted(), system_utsname.release, | 300 | regs->eflags, print_tainted(), system_utsname.release, |
@@ -364,13 +363,6 @@ void exit_thread(void) | |||
364 | struct task_struct *tsk = current; | 363 | struct task_struct *tsk = current; |
365 | struct thread_struct *t = &tsk->thread; | 364 | struct thread_struct *t = &tsk->thread; |
366 | 365 | ||
367 | /* | ||
368 | * Remove function-return probe instances associated with this task | ||
369 | * and put them back on the free list. Do not insert an exit probe for | ||
370 | * this function, it will be disabled by kprobe_flush_task if you do. | ||
371 | */ | ||
372 | kprobe_flush_task(tsk); | ||
373 | |||
374 | /* The process may have allocated an io port bitmap... nuke it. */ | 366 | /* The process may have allocated an io port bitmap... nuke it. */ |
375 | if (unlikely(NULL != t->io_bitmap_ptr)) { | 367 | if (unlikely(NULL != t->io_bitmap_ptr)) { |
376 | int cpu = get_cpu(); | 368 | int cpu = get_cpu(); |
@@ -789,7 +781,6 @@ unsigned long get_wchan(struct task_struct *p) | |||
789 | } while (count++ < 16); | 781 | } while (count++ < 16); |
790 | return 0; | 782 | return 0; |
791 | } | 783 | } |
792 | EXPORT_SYMBOL(get_wchan); | ||
793 | 784 | ||
794 | /* | 785 | /* |
795 | * sys_alloc_thread_area: get a yet unused TLS descriptor index. | 786 | * sys_alloc_thread_area: get a yet unused TLS descriptor index. |
diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c index 5c1fb6aada5b..506462ef36a0 100644 --- a/arch/i386/kernel/ptrace.c +++ b/arch/i386/kernel/ptrace.c | |||
@@ -34,10 +34,10 @@ | |||
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Determines which flags the user has access to [1 = access, 0 = no access]. | 36 | * Determines which flags the user has access to [1 = access, 0 = no access]. |
37 | * Prohibits changing ID(21), VIP(20), VIF(19), VM(17), IOPL(12-13), IF(9). | 37 | * Prohibits changing ID(21), VIP(20), VIF(19), VM(17), NT(14), IOPL(12-13), IF(9). |
38 | * Also masks reserved bits (31-22, 15, 5, 3, 1). | 38 | * Also masks reserved bits (31-22, 15, 5, 3, 1). |
39 | */ | 39 | */ |
40 | #define FLAG_MASK 0x00054dd5 | 40 | #define FLAG_MASK 0x00050dd5 |
41 | 41 | ||
42 | /* set's the trap flag. */ | 42 | /* set's the trap flag. */ |
43 | #define TRAP_FLAG 0x100 | 43 | #define TRAP_FLAG 0x100 |
diff --git a/arch/i386/kernel/semaphore.c b/arch/i386/kernel/semaphore.c index 7455ab643943..967dc74df9ee 100644 --- a/arch/i386/kernel/semaphore.c +++ b/arch/i386/kernel/semaphore.c | |||
@@ -110,11 +110,11 @@ asm( | |||
110 | ".align 4\n" | 110 | ".align 4\n" |
111 | ".globl __write_lock_failed\n" | 111 | ".globl __write_lock_failed\n" |
112 | "__write_lock_failed:\n\t" | 112 | "__write_lock_failed:\n\t" |
113 | LOCK "addl $" RW_LOCK_BIAS_STR ",(%eax)\n" | 113 | LOCK_PREFIX "addl $" RW_LOCK_BIAS_STR ",(%eax)\n" |
114 | "1: rep; nop\n\t" | 114 | "1: rep; nop\n\t" |
115 | "cmpl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" | 115 | "cmpl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" |
116 | "jne 1b\n\t" | 116 | "jne 1b\n\t" |
117 | LOCK "subl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" | 117 | LOCK_PREFIX "subl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" |
118 | "jnz __write_lock_failed\n\t" | 118 | "jnz __write_lock_failed\n\t" |
119 | "ret" | 119 | "ret" |
120 | ); | 120 | ); |
@@ -124,11 +124,11 @@ asm( | |||
124 | ".align 4\n" | 124 | ".align 4\n" |
125 | ".globl __read_lock_failed\n" | 125 | ".globl __read_lock_failed\n" |
126 | "__read_lock_failed:\n\t" | 126 | "__read_lock_failed:\n\t" |
127 | LOCK "incl (%eax)\n" | 127 | LOCK_PREFIX "incl (%eax)\n" |
128 | "1: rep; nop\n\t" | 128 | "1: rep; nop\n\t" |
129 | "cmpl $1,(%eax)\n\t" | 129 | "cmpl $1,(%eax)\n\t" |
130 | "js 1b\n\t" | 130 | "js 1b\n\t" |
131 | LOCK "decl (%eax)\n\t" | 131 | LOCK_PREFIX "decl (%eax)\n\t" |
132 | "js __read_lock_failed\n\t" | 132 | "js __read_lock_failed\n\t" |
133 | "ret" | 133 | "ret" |
134 | ); | 134 | ); |
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index a0b407585679..eacc3f0a2ea4 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <linux/kexec.h> | 47 | #include <linux/kexec.h> |
48 | #include <linux/crash_dump.h> | 48 | #include <linux/crash_dump.h> |
49 | #include <linux/dmi.h> | 49 | #include <linux/dmi.h> |
50 | #include <linux/pfn.h> | ||
50 | 51 | ||
51 | #include <video/edid.h> | 52 | #include <video/edid.h> |
52 | 53 | ||
@@ -1059,10 +1060,10 @@ static int __init | |||
1059 | free_available_memory(unsigned long start, unsigned long end, void *arg) | 1060 | free_available_memory(unsigned long start, unsigned long end, void *arg) |
1060 | { | 1061 | { |
1061 | /* check max_low_pfn */ | 1062 | /* check max_low_pfn */ |
1062 | if (start >= ((max_low_pfn + 1) << PAGE_SHIFT)) | 1063 | if (start >= (max_low_pfn << PAGE_SHIFT)) |
1063 | return 0; | 1064 | return 0; |
1064 | if (end >= ((max_low_pfn + 1) << PAGE_SHIFT)) | 1065 | if (end >= (max_low_pfn << PAGE_SHIFT)) |
1065 | end = (max_low_pfn + 1) << PAGE_SHIFT; | 1066 | end = max_low_pfn << PAGE_SHIFT; |
1066 | if (start < end) | 1067 | if (start < end) |
1067 | free_bootmem(start, end - start); | 1068 | free_bootmem(start, end - start); |
1068 | 1069 | ||
@@ -1287,9 +1288,7 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat | |||
1287 | probe_roms(); | 1288 | probe_roms(); |
1288 | for (i = 0; i < e820.nr_map; i++) { | 1289 | for (i = 0; i < e820.nr_map; i++) { |
1289 | struct resource *res; | 1290 | struct resource *res; |
1290 | if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL) | 1291 | res = kzalloc(sizeof(struct resource), GFP_ATOMIC); |
1291 | continue; | ||
1292 | res = alloc_bootmem_low(sizeof(struct resource)); | ||
1293 | switch (e820.map[i].type) { | 1292 | switch (e820.map[i].type) { |
1294 | case E820_RAM: res->name = "System RAM"; break; | 1293 | case E820_RAM: res->name = "System RAM"; break; |
1295 | case E820_ACPI: res->name = "ACPI Tables"; break; | 1294 | case E820_ACPI: res->name = "ACPI Tables"; break; |
@@ -1317,13 +1316,15 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat | |||
1317 | 1316 | ||
1318 | /* | 1317 | /* |
1319 | * Request address space for all standard resources | 1318 | * Request address space for all standard resources |
1319 | * | ||
1320 | * This is called just before pcibios_assign_resources(), which is also | ||
1321 | * an fs_initcall, but is linked in later (in arch/i386/pci/i386.c). | ||
1320 | */ | 1322 | */ |
1321 | static void __init register_memory(void) | 1323 | static int __init request_standard_resources(void) |
1322 | { | 1324 | { |
1323 | unsigned long gapstart, gapsize, round; | 1325 | int i; |
1324 | unsigned long long last; | ||
1325 | int i; | ||
1326 | 1326 | ||
1327 | printk("Setting up standard PCI resources\n"); | ||
1327 | if (efi_enabled) | 1328 | if (efi_enabled) |
1328 | efi_initialize_iomem_resources(&code_resource, &data_resource); | 1329 | efi_initialize_iomem_resources(&code_resource, &data_resource); |
1329 | else | 1330 | else |
@@ -1335,6 +1336,16 @@ static void __init register_memory(void) | |||
1335 | /* request I/O space for devices used on all i[345]86 PCs */ | 1336 | /* request I/O space for devices used on all i[345]86 PCs */ |
1336 | for (i = 0; i < STANDARD_IO_RESOURCES; i++) | 1337 | for (i = 0; i < STANDARD_IO_RESOURCES; i++) |
1337 | request_resource(&ioport_resource, &standard_io_resources[i]); | 1338 | request_resource(&ioport_resource, &standard_io_resources[i]); |
1339 | return 0; | ||
1340 | } | ||
1341 | |||
1342 | fs_initcall(request_standard_resources); | ||
1343 | |||
1344 | static void __init register_memory(void) | ||
1345 | { | ||
1346 | unsigned long gapstart, gapsize, round; | ||
1347 | unsigned long long last; | ||
1348 | int i; | ||
1338 | 1349 | ||
1339 | /* | 1350 | /* |
1340 | * Search for the bigest gap in the low 32 bits of the e820 | 1351 | * Search for the bigest gap in the low 32 bits of the e820 |
@@ -1378,101 +1389,6 @@ static void __init register_memory(void) | |||
1378 | pci_mem_start, gapstart, gapsize); | 1389 | pci_mem_start, gapstart, gapsize); |
1379 | } | 1390 | } |
1380 | 1391 | ||
1381 | /* Use inline assembly to define this because the nops are defined | ||
1382 | as inline assembly strings in the include files and we cannot | ||
1383 | get them easily into strings. */ | ||
1384 | asm("\t.data\nintelnops: " | ||
1385 | GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6 | ||
1386 | GENERIC_NOP7 GENERIC_NOP8); | ||
1387 | asm("\t.data\nk8nops: " | ||
1388 | K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6 | ||
1389 | K8_NOP7 K8_NOP8); | ||
1390 | asm("\t.data\nk7nops: " | ||
1391 | K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6 | ||
1392 | K7_NOP7 K7_NOP8); | ||
1393 | |||
1394 | extern unsigned char intelnops[], k8nops[], k7nops[]; | ||
1395 | static unsigned char *intel_nops[ASM_NOP_MAX+1] = { | ||
1396 | NULL, | ||
1397 | intelnops, | ||
1398 | intelnops + 1, | ||
1399 | intelnops + 1 + 2, | ||
1400 | intelnops + 1 + 2 + 3, | ||
1401 | intelnops + 1 + 2 + 3 + 4, | ||
1402 | intelnops + 1 + 2 + 3 + 4 + 5, | ||
1403 | intelnops + 1 + 2 + 3 + 4 + 5 + 6, | ||
1404 | intelnops + 1 + 2 + 3 + 4 + 5 + 6 + 7, | ||
1405 | }; | ||
1406 | static unsigned char *k8_nops[ASM_NOP_MAX+1] = { | ||
1407 | NULL, | ||
1408 | k8nops, | ||
1409 | k8nops + 1, | ||
1410 | k8nops + 1 + 2, | ||
1411 | k8nops + 1 + 2 + 3, | ||
1412 | k8nops + 1 + 2 + 3 + 4, | ||
1413 | k8nops + 1 + 2 + 3 + 4 + 5, | ||
1414 | k8nops + 1 + 2 + 3 + 4 + 5 + 6, | ||
1415 | k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7, | ||
1416 | }; | ||
1417 | static unsigned char *k7_nops[ASM_NOP_MAX+1] = { | ||
1418 | NULL, | ||
1419 | k7nops, | ||
1420 | k7nops + 1, | ||
1421 | k7nops + 1 + 2, | ||
1422 | k7nops + 1 + 2 + 3, | ||
1423 | k7nops + 1 + 2 + 3 + 4, | ||
1424 | k7nops + 1 + 2 + 3 + 4 + 5, | ||
1425 | k7nops + 1 + 2 + 3 + 4 + 5 + 6, | ||
1426 | k7nops + 1 + 2 + 3 + 4 + 5 + 6 + 7, | ||
1427 | }; | ||
1428 | static struct nop { | ||
1429 | int cpuid; | ||
1430 | unsigned char **noptable; | ||
1431 | } noptypes[] = { | ||
1432 | { X86_FEATURE_K8, k8_nops }, | ||
1433 | { X86_FEATURE_K7, k7_nops }, | ||
1434 | { -1, NULL } | ||
1435 | }; | ||
1436 | |||
1437 | /* Replace instructions with better alternatives for this CPU type. | ||
1438 | |||
1439 | This runs before SMP is initialized to avoid SMP problems with | ||
1440 | self modifying code. This implies that assymetric systems where | ||
1441 | APs have less capabilities than the boot processor are not handled. | ||
1442 | Tough. Make sure you disable such features by hand. */ | ||
1443 | void apply_alternatives(void *start, void *end) | ||
1444 | { | ||
1445 | struct alt_instr *a; | ||
1446 | int diff, i, k; | ||
1447 | unsigned char **noptable = intel_nops; | ||
1448 | for (i = 0; noptypes[i].cpuid >= 0; i++) { | ||
1449 | if (boot_cpu_has(noptypes[i].cpuid)) { | ||
1450 | noptable = noptypes[i].noptable; | ||
1451 | break; | ||
1452 | } | ||
1453 | } | ||
1454 | for (a = start; (void *)a < end; a++) { | ||
1455 | if (!boot_cpu_has(a->cpuid)) | ||
1456 | continue; | ||
1457 | BUG_ON(a->replacementlen > a->instrlen); | ||
1458 | memcpy(a->instr, a->replacement, a->replacementlen); | ||
1459 | diff = a->instrlen - a->replacementlen; | ||
1460 | /* Pad the rest with nops */ | ||
1461 | for (i = a->replacementlen; diff > 0; diff -= k, i += k) { | ||
1462 | k = diff; | ||
1463 | if (k > ASM_NOP_MAX) | ||
1464 | k = ASM_NOP_MAX; | ||
1465 | memcpy(a->instr + i, noptable[k], k); | ||
1466 | } | ||
1467 | } | ||
1468 | } | ||
1469 | |||
1470 | void __init alternative_instructions(void) | ||
1471 | { | ||
1472 | extern struct alt_instr __alt_instructions[], __alt_instructions_end[]; | ||
1473 | apply_alternatives(__alt_instructions, __alt_instructions_end); | ||
1474 | } | ||
1475 | |||
1476 | static char * __init machine_specific_memory_setup(void); | 1392 | static char * __init machine_specific_memory_setup(void); |
1477 | 1393 | ||
1478 | #ifdef CONFIG_MCA | 1394 | #ifdef CONFIG_MCA |
@@ -1555,6 +1471,16 @@ void __init setup_arch(char **cmdline_p) | |||
1555 | 1471 | ||
1556 | parse_cmdline_early(cmdline_p); | 1472 | parse_cmdline_early(cmdline_p); |
1557 | 1473 | ||
1474 | #ifdef CONFIG_EARLY_PRINTK | ||
1475 | { | ||
1476 | char *s = strstr(*cmdline_p, "earlyprintk="); | ||
1477 | if (s) { | ||
1478 | setup_early_printk(strchr(s, '=') + 1); | ||
1479 | printk("early console enabled\n"); | ||
1480 | } | ||
1481 | } | ||
1482 | #endif | ||
1483 | |||
1558 | max_low_pfn = setup_memory(); | 1484 | max_low_pfn = setup_memory(); |
1559 | 1485 | ||
1560 | /* | 1486 | /* |
@@ -1579,19 +1505,6 @@ void __init setup_arch(char **cmdline_p) | |||
1579 | * NOTE: at this point the bootmem allocator is fully available. | 1505 | * NOTE: at this point the bootmem allocator is fully available. |
1580 | */ | 1506 | */ |
1581 | 1507 | ||
1582 | #ifdef CONFIG_EARLY_PRINTK | ||
1583 | { | ||
1584 | char *s = strstr(*cmdline_p, "earlyprintk="); | ||
1585 | if (s) { | ||
1586 | extern void setup_early_printk(char *); | ||
1587 | |||
1588 | setup_early_printk(strchr(s, '=') + 1); | ||
1589 | printk("early console enabled\n"); | ||
1590 | } | ||
1591 | } | ||
1592 | #endif | ||
1593 | |||
1594 | |||
1595 | dmi_scan_machine(); | 1508 | dmi_scan_machine(); |
1596 | 1509 | ||
1597 | #ifdef CONFIG_X86_GENERICARCH | 1510 | #ifdef CONFIG_X86_GENERICARCH |
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c index 963616d364ec..5c352c3a9e7f 100644 --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c | |||
@@ -123,7 +123,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax | |||
123 | err |= __get_user(tmp, &sc->seg); \ | 123 | err |= __get_user(tmp, &sc->seg); \ |
124 | loadsegment(seg,tmp); } | 124 | loadsegment(seg,tmp); } |
125 | 125 | ||
126 | #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_OF | X86_EFLAGS_DF | \ | 126 | #define FIX_EFLAGS (X86_EFLAGS_AC | X86_EFLAGS_RF | \ |
127 | X86_EFLAGS_OF | X86_EFLAGS_DF | \ | ||
127 | X86_EFLAGS_TF | X86_EFLAGS_SF | X86_EFLAGS_ZF | \ | 128 | X86_EFLAGS_TF | X86_EFLAGS_SF | X86_EFLAGS_ZF | \ |
128 | X86_EFLAGS_AF | X86_EFLAGS_PF | X86_EFLAGS_CF) | 129 | X86_EFLAGS_AF | X86_EFLAGS_PF | X86_EFLAGS_CF) |
129 | 130 | ||
@@ -582,9 +583,6 @@ static void fastcall do_signal(struct pt_regs *regs) | |||
582 | if (!user_mode(regs)) | 583 | if (!user_mode(regs)) |
583 | return; | 584 | return; |
584 | 585 | ||
585 | if (try_to_freeze()) | ||
586 | goto no_signal; | ||
587 | |||
588 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 586 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
589 | oldset = ¤t->saved_sigmask; | 587 | oldset = ¤t->saved_sigmask; |
590 | else | 588 | else |
@@ -613,7 +611,6 @@ static void fastcall do_signal(struct pt_regs *regs) | |||
613 | return; | 611 | return; |
614 | } | 612 | } |
615 | 613 | ||
616 | no_signal: | ||
617 | /* Did we come from a system call? */ | 614 | /* Did we come from a system call? */ |
618 | if (regs->orig_eax >= 0) { | 615 | if (regs->orig_eax >= 0) { |
619 | /* Restart the system call - no handlers present */ | 616 | /* Restart the system call - no handlers present */ |
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c index 218d725a5a1e..d134e9643a58 100644 --- a/arch/i386/kernel/smp.c +++ b/arch/i386/kernel/smp.c | |||
@@ -504,27 +504,23 @@ void unlock_ipi_call_lock(void) | |||
504 | spin_unlock_irq(&call_lock); | 504 | spin_unlock_irq(&call_lock); |
505 | } | 505 | } |
506 | 506 | ||
507 | static struct call_data_struct * call_data; | 507 | static struct call_data_struct *call_data; |
508 | 508 | ||
509 | /* | 509 | /** |
510 | * this function sends a 'generic call function' IPI to all other CPUs | 510 | * smp_call_function(): Run a function on all other CPUs. |
511 | * in the system. | 511 | * @func: The function to run. This must be fast and non-blocking. |
512 | */ | 512 | * @info: An arbitrary pointer to pass to the function. |
513 | 513 | * @nonatomic: currently unused. | |
514 | int smp_call_function (void (*func) (void *info), void *info, int nonatomic, | 514 | * @wait: If true, wait (atomically) until function has completed on other CPUs. |
515 | int wait) | 515 | * |
516 | /* | 516 | * Returns 0 on success, else a negative status code. Does not return until |
517 | * [SUMMARY] Run a function on all other CPUs. | ||
518 | * <func> The function to run. This must be fast and non-blocking. | ||
519 | * <info> An arbitrary pointer to pass to the function. | ||
520 | * <nonatomic> currently unused. | ||
521 | * <wait> If true, wait (atomically) until function has completed on other CPUs. | ||
522 | * [RETURNS] 0 on success, else a negative status code. Does not return until | ||
523 | * remote CPUs are nearly ready to execute <<func>> or are or have executed. | 517 | * remote CPUs are nearly ready to execute <<func>> or are or have executed. |
524 | * | 518 | * |
525 | * You must not call this function with disabled interrupts or from a | 519 | * You must not call this function with disabled interrupts or from a |
526 | * hardware interrupt handler or from a bottom half handler. | 520 | * hardware interrupt handler or from a bottom half handler. |
527 | */ | 521 | */ |
522 | int smp_call_function (void (*func) (void *info), void *info, int nonatomic, | ||
523 | int wait) | ||
528 | { | 524 | { |
529 | struct call_data_struct data; | 525 | struct call_data_struct data; |
530 | int cpus; | 526 | int cpus; |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index eba7f53f8b4a..a6969903f2d6 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -72,6 +72,9 @@ int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID}; | |||
72 | /* Core ID of each logical CPU */ | 72 | /* Core ID of each logical CPU */ |
73 | int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID}; | 73 | int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID}; |
74 | 74 | ||
75 | /* Last level cache ID of each logical CPU */ | ||
76 | int cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID}; | ||
77 | |||
75 | /* representing HT siblings of each logical CPU */ | 78 | /* representing HT siblings of each logical CPU */ |
76 | cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly; | 79 | cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly; |
77 | EXPORT_SYMBOL(cpu_sibling_map); | 80 | EXPORT_SYMBOL(cpu_sibling_map); |
@@ -440,6 +443,18 @@ static void __devinit smp_callin(void) | |||
440 | 443 | ||
441 | static int cpucount; | 444 | static int cpucount; |
442 | 445 | ||
446 | /* maps the cpu to the sched domain representing multi-core */ | ||
447 | cpumask_t cpu_coregroup_map(int cpu) | ||
448 | { | ||
449 | struct cpuinfo_x86 *c = cpu_data + cpu; | ||
450 | /* | ||
451 | * For perf, we return last level cache shared map. | ||
452 | * TBD: when power saving sched policy is added, we will return | ||
453 | * cpu_core_map when power saving policy is enabled | ||
454 | */ | ||
455 | return c->llc_shared_map; | ||
456 | } | ||
457 | |||
443 | /* representing cpus for which sibling maps can be computed */ | 458 | /* representing cpus for which sibling maps can be computed */ |
444 | static cpumask_t cpu_sibling_setup_map; | 459 | static cpumask_t cpu_sibling_setup_map; |
445 | 460 | ||
@@ -459,12 +474,16 @@ set_cpu_sibling_map(int cpu) | |||
459 | cpu_set(cpu, cpu_sibling_map[i]); | 474 | cpu_set(cpu, cpu_sibling_map[i]); |
460 | cpu_set(i, cpu_core_map[cpu]); | 475 | cpu_set(i, cpu_core_map[cpu]); |
461 | cpu_set(cpu, cpu_core_map[i]); | 476 | cpu_set(cpu, cpu_core_map[i]); |
477 | cpu_set(i, c[cpu].llc_shared_map); | ||
478 | cpu_set(cpu, c[i].llc_shared_map); | ||
462 | } | 479 | } |
463 | } | 480 | } |
464 | } else { | 481 | } else { |
465 | cpu_set(cpu, cpu_sibling_map[cpu]); | 482 | cpu_set(cpu, cpu_sibling_map[cpu]); |
466 | } | 483 | } |
467 | 484 | ||
485 | cpu_set(cpu, c[cpu].llc_shared_map); | ||
486 | |||
468 | if (current_cpu_data.x86_max_cores == 1) { | 487 | if (current_cpu_data.x86_max_cores == 1) { |
469 | cpu_core_map[cpu] = cpu_sibling_map[cpu]; | 488 | cpu_core_map[cpu] = cpu_sibling_map[cpu]; |
470 | c[cpu].booted_cores = 1; | 489 | c[cpu].booted_cores = 1; |
@@ -472,6 +491,11 @@ set_cpu_sibling_map(int cpu) | |||
472 | } | 491 | } |
473 | 492 | ||
474 | for_each_cpu_mask(i, cpu_sibling_setup_map) { | 493 | for_each_cpu_mask(i, cpu_sibling_setup_map) { |
494 | if (cpu_llc_id[cpu] != BAD_APICID && | ||
495 | cpu_llc_id[cpu] == cpu_llc_id[i]) { | ||
496 | cpu_set(i, c[cpu].llc_shared_map); | ||
497 | cpu_set(cpu, c[i].llc_shared_map); | ||
498 | } | ||
475 | if (phys_proc_id[cpu] == phys_proc_id[i]) { | 499 | if (phys_proc_id[cpu] == phys_proc_id[i]) { |
476 | cpu_set(i, cpu_core_map[cpu]); | 500 | cpu_set(i, cpu_core_map[cpu]); |
477 | cpu_set(cpu, cpu_core_map[i]); | 501 | cpu_set(cpu, cpu_core_map[i]); |
@@ -899,6 +923,7 @@ static int __devinit do_boot_cpu(int apicid, int cpu) | |||
899 | unsigned short nmi_high = 0, nmi_low = 0; | 923 | unsigned short nmi_high = 0, nmi_low = 0; |
900 | 924 | ||
901 | ++cpucount; | 925 | ++cpucount; |
926 | alternatives_smp_switch(1); | ||
902 | 927 | ||
903 | /* | 928 | /* |
904 | * We can't use kernel_thread since we must avoid to | 929 | * We can't use kernel_thread since we must avoid to |
@@ -1002,7 +1027,6 @@ void cpu_exit_clear(void) | |||
1002 | 1027 | ||
1003 | cpu_clear(cpu, cpu_callout_map); | 1028 | cpu_clear(cpu, cpu_callout_map); |
1004 | cpu_clear(cpu, cpu_callin_map); | 1029 | cpu_clear(cpu, cpu_callin_map); |
1005 | cpu_clear(cpu, cpu_present_map); | ||
1006 | 1030 | ||
1007 | cpu_clear(cpu, smp_commenced_mask); | 1031 | cpu_clear(cpu, smp_commenced_mask); |
1008 | unmap_cpu_to_logical_apicid(cpu); | 1032 | unmap_cpu_to_logical_apicid(cpu); |
@@ -1014,21 +1038,20 @@ struct warm_boot_cpu_info { | |||
1014 | int cpu; | 1038 | int cpu; |
1015 | }; | 1039 | }; |
1016 | 1040 | ||
1017 | static void __devinit do_warm_boot_cpu(void *p) | 1041 | static void __cpuinit do_warm_boot_cpu(void *p) |
1018 | { | 1042 | { |
1019 | struct warm_boot_cpu_info *info = p; | 1043 | struct warm_boot_cpu_info *info = p; |
1020 | do_boot_cpu(info->apicid, info->cpu); | 1044 | do_boot_cpu(info->apicid, info->cpu); |
1021 | complete(info->complete); | 1045 | complete(info->complete); |
1022 | } | 1046 | } |
1023 | 1047 | ||
1024 | int __devinit smp_prepare_cpu(int cpu) | 1048 | static int __cpuinit __smp_prepare_cpu(int cpu) |
1025 | { | 1049 | { |
1026 | DECLARE_COMPLETION(done); | 1050 | DECLARE_COMPLETION(done); |
1027 | struct warm_boot_cpu_info info; | 1051 | struct warm_boot_cpu_info info; |
1028 | struct work_struct task; | 1052 | struct work_struct task; |
1029 | int apicid, ret; | 1053 | int apicid, ret; |
1030 | 1054 | ||
1031 | lock_cpu_hotplug(); | ||
1032 | apicid = x86_cpu_to_apicid[cpu]; | 1055 | apicid = x86_cpu_to_apicid[cpu]; |
1033 | if (apicid == BAD_APICID) { | 1056 | if (apicid == BAD_APICID) { |
1034 | ret = -ENODEV; | 1057 | ret = -ENODEV; |
@@ -1053,7 +1076,6 @@ int __devinit smp_prepare_cpu(int cpu) | |||
1053 | zap_low_mappings(); | 1076 | zap_low_mappings(); |
1054 | ret = 0; | 1077 | ret = 0; |
1055 | exit: | 1078 | exit: |
1056 | unlock_cpu_hotplug(); | ||
1057 | return ret; | 1079 | return ret; |
1058 | } | 1080 | } |
1059 | #endif | 1081 | #endif |
@@ -1358,6 +1380,8 @@ void __cpu_die(unsigned int cpu) | |||
1358 | /* They ack this in play_dead by setting CPU_DEAD */ | 1380 | /* They ack this in play_dead by setting CPU_DEAD */ |
1359 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { | 1381 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { |
1360 | printk ("CPU %d is now offline\n", cpu); | 1382 | printk ("CPU %d is now offline\n", cpu); |
1383 | if (1 == num_online_cpus()) | ||
1384 | alternatives_smp_switch(0); | ||
1361 | return; | 1385 | return; |
1362 | } | 1386 | } |
1363 | msleep(100); | 1387 | msleep(100); |
@@ -1379,6 +1403,22 @@ void __cpu_die(unsigned int cpu) | |||
1379 | 1403 | ||
1380 | int __devinit __cpu_up(unsigned int cpu) | 1404 | int __devinit __cpu_up(unsigned int cpu) |
1381 | { | 1405 | { |
1406 | #ifdef CONFIG_HOTPLUG_CPU | ||
1407 | int ret=0; | ||
1408 | |||
1409 | /* | ||
1410 | * We do warm boot only on cpus that had booted earlier | ||
1411 | * Otherwise cold boot is all handled from smp_boot_cpus(). | ||
1412 | * cpu_callin_map is set during AP kickstart process. Its reset | ||
1413 | * when a cpu is taken offline from cpu_exit_clear(). | ||
1414 | */ | ||
1415 | if (!cpu_isset(cpu, cpu_callin_map)) | ||
1416 | ret = __smp_prepare_cpu(cpu); | ||
1417 | |||
1418 | if (ret) | ||
1419 | return -EIO; | ||
1420 | #endif | ||
1421 | |||
1382 | /* In case one didn't come up */ | 1422 | /* In case one didn't come up */ |
1383 | if (!cpu_isset(cpu, cpu_callin_map)) { | 1423 | if (!cpu_isset(cpu, cpu_callin_map)) { |
1384 | printk(KERN_DEBUG "skipping cpu%d, didn't come online\n", cpu); | 1424 | printk(KERN_DEBUG "skipping cpu%d, didn't come online\n", cpu); |
diff --git a/arch/i386/kernel/sys_i386.c b/arch/i386/kernel/sys_i386.c index a4a61976ecb9..8fdb1fb17a5f 100644 --- a/arch/i386/kernel/sys_i386.c +++ b/arch/i386/kernel/sys_i386.c | |||
@@ -40,14 +40,13 @@ asmlinkage int sys_pipe(unsigned long __user * fildes) | |||
40 | return error; | 40 | return error; |
41 | } | 41 | } |
42 | 42 | ||
43 | /* common code for old and new mmaps */ | 43 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, |
44 | static inline long do_mmap2( | 44 | unsigned long prot, unsigned long flags, |
45 | unsigned long addr, unsigned long len, | 45 | unsigned long fd, unsigned long pgoff) |
46 | unsigned long prot, unsigned long flags, | ||
47 | unsigned long fd, unsigned long pgoff) | ||
48 | { | 46 | { |
49 | int error = -EBADF; | 47 | int error = -EBADF; |
50 | struct file * file = NULL; | 48 | struct file *file = NULL; |
49 | struct mm_struct *mm = current->mm; | ||
51 | 50 | ||
52 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | 51 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); |
53 | if (!(flags & MAP_ANONYMOUS)) { | 52 | if (!(flags & MAP_ANONYMOUS)) { |
@@ -56,9 +55,9 @@ static inline long do_mmap2( | |||
56 | goto out; | 55 | goto out; |
57 | } | 56 | } |
58 | 57 | ||
59 | down_write(¤t->mm->mmap_sem); | 58 | down_write(&mm->mmap_sem); |
60 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | 59 | error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); |
61 | up_write(¤t->mm->mmap_sem); | 60 | up_write(&mm->mmap_sem); |
62 | 61 | ||
63 | if (file) | 62 | if (file) |
64 | fput(file); | 63 | fput(file); |
@@ -66,13 +65,6 @@ out: | |||
66 | return error; | 65 | return error; |
67 | } | 66 | } |
68 | 67 | ||
69 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | ||
70 | unsigned long prot, unsigned long flags, | ||
71 | unsigned long fd, unsigned long pgoff) | ||
72 | { | ||
73 | return do_mmap2(addr, len, prot, flags, fd, pgoff); | ||
74 | } | ||
75 | |||
76 | /* | 68 | /* |
77 | * Perform the select(nd, in, out, ex, tv) and mmap() system | 69 | * Perform the select(nd, in, out, ex, tv) and mmap() system |
78 | * calls. Linux/i386 didn't use to be able to handle more than | 70 | * calls. Linux/i386 didn't use to be able to handle more than |
@@ -101,7 +93,8 @@ asmlinkage int old_mmap(struct mmap_arg_struct __user *arg) | |||
101 | if (a.offset & ~PAGE_MASK) | 93 | if (a.offset & ~PAGE_MASK) |
102 | goto out; | 94 | goto out; |
103 | 95 | ||
104 | err = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); | 96 | err = sys_mmap2(a.addr, a.len, a.prot, a.flags, |
97 | a.fd, a.offset >> PAGE_SHIFT); | ||
105 | out: | 98 | out: |
106 | return err; | 99 | return err; |
107 | } | 100 | } |
diff --git a/arch/i386/kernel/syscall_table.S b/arch/i386/kernel/syscall_table.S index ac687d00a1ce..4f58b9c0efe3 100644 --- a/arch/i386/kernel/syscall_table.S +++ b/arch/i386/kernel/syscall_table.S | |||
@@ -310,3 +310,7 @@ ENTRY(sys_call_table) | |||
310 | .long sys_pselect6 | 310 | .long sys_pselect6 |
311 | .long sys_ppoll | 311 | .long sys_ppoll |
312 | .long sys_unshare /* 310 */ | 312 | .long sys_unshare /* 310 */ |
313 | .long sys_set_robust_list | ||
314 | .long sys_get_robust_list | ||
315 | .long sys_splice | ||
316 | .long sys_sync_file_range | ||
diff --git a/arch/i386/kernel/timers/timer_hpet.c b/arch/i386/kernel/timers/timer_hpet.c index be242723c339..17a6fe7166e7 100644 --- a/arch/i386/kernel/timers/timer_hpet.c +++ b/arch/i386/kernel/timers/timer_hpet.c | |||
@@ -46,7 +46,7 @@ static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED; | |||
46 | * | 46 | * |
47 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" | 47 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" |
48 | */ | 48 | */ |
49 | static unsigned long cyc2ns_scale; | 49 | static unsigned long cyc2ns_scale __read_mostly; |
50 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ | 50 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ |
51 | 51 | ||
52 | static inline void set_cyc2ns_scale(unsigned long cpu_khz) | 52 | static inline void set_cyc2ns_scale(unsigned long cpu_khz) |
diff --git a/arch/i386/kernel/timers/timer_pm.c b/arch/i386/kernel/timers/timer_pm.c index 264edaaac315..144e94a04933 100644 --- a/arch/i386/kernel/timers/timer_pm.c +++ b/arch/i386/kernel/timers/timer_pm.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/pci.h> | ||
18 | #include <asm/types.h> | 19 | #include <asm/types.h> |
19 | #include <asm/timer.h> | 20 | #include <asm/timer.h> |
20 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
@@ -45,24 +46,31 @@ static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED; | |||
45 | 46 | ||
46 | #define ACPI_PM_MASK 0xFFFFFF /* limit it to 24 bits */ | 47 | #define ACPI_PM_MASK 0xFFFFFF /* limit it to 24 bits */ |
47 | 48 | ||
49 | static int pmtmr_need_workaround __read_mostly = 1; | ||
50 | |||
48 | /*helper function to safely read acpi pm timesource*/ | 51 | /*helper function to safely read acpi pm timesource*/ |
49 | static inline u32 read_pmtmr(void) | 52 | static inline u32 read_pmtmr(void) |
50 | { | 53 | { |
51 | u32 v1=0,v2=0,v3=0; | 54 | if (pmtmr_need_workaround) { |
52 | /* It has been reported that because of various broken | 55 | u32 v1, v2, v3; |
53 | * chipsets (ICH4, PIIX4 and PIIX4E) where the ACPI PM time | 56 | |
54 | * source is not latched, so you must read it multiple | 57 | /* It has been reported that because of various broken |
55 | * times to insure a safe value is read. | 58 | * chipsets (ICH4, PIIX4 and PIIX4E) where the ACPI PM time |
56 | */ | 59 | * source is not latched, so you must read it multiple |
57 | do { | 60 | * times to insure a safe value is read. |
58 | v1 = inl(pmtmr_ioport); | 61 | */ |
59 | v2 = inl(pmtmr_ioport); | 62 | do { |
60 | v3 = inl(pmtmr_ioport); | 63 | v1 = inl(pmtmr_ioport); |
61 | } while ((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1) | 64 | v2 = inl(pmtmr_ioport); |
62 | || (v3 > v1 && v3 < v2)); | 65 | v3 = inl(pmtmr_ioport); |
63 | 66 | } while ((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1) | |
64 | /* mask the output to 24 bits */ | 67 | || (v3 > v1 && v3 < v2)); |
65 | return v2 & ACPI_PM_MASK; | 68 | |
69 | /* mask the output to 24 bits */ | ||
70 | return v2 & ACPI_PM_MASK; | ||
71 | } | ||
72 | |||
73 | return inl(pmtmr_ioport) & ACPI_PM_MASK; | ||
66 | } | 74 | } |
67 | 75 | ||
68 | 76 | ||
@@ -263,6 +271,72 @@ struct init_timer_opts __initdata timer_pmtmr_init = { | |||
263 | .opts = &timer_pmtmr, | 271 | .opts = &timer_pmtmr, |
264 | }; | 272 | }; |
265 | 273 | ||
274 | #ifdef CONFIG_PCI | ||
275 | /* | ||
276 | * PIIX4 Errata: | ||
277 | * | ||
278 | * The power management timer may return improper results when read. | ||
279 | * Although the timer value settles properly after incrementing, | ||
280 | * while incrementing there is a 3 ns window every 69.8 ns where the | ||
281 | * timer value is indeterminate (a 4.2% chance that the data will be | ||
282 | * incorrect when read). As a result, the ACPI free running count up | ||
283 | * timer specification is violated due to erroneous reads. | ||
284 | */ | ||
285 | static int __init pmtmr_bug_check(void) | ||
286 | { | ||
287 | static struct pci_device_id gray_list[] __initdata = { | ||
288 | /* these chipsets may have bug. */ | ||
289 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, | ||
290 | PCI_DEVICE_ID_INTEL_82801DB_0) }, | ||
291 | { }, | ||
292 | }; | ||
293 | struct pci_dev *dev; | ||
294 | int pmtmr_has_bug = 0; | ||
295 | u8 rev; | ||
296 | |||
297 | if (cur_timer != &timer_pmtmr || !pmtmr_need_workaround) | ||
298 | return 0; | ||
299 | |||
300 | dev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
301 | PCI_DEVICE_ID_INTEL_82371AB_3, NULL); | ||
302 | if (dev) { | ||
303 | pci_read_config_byte(dev, PCI_REVISION_ID, &rev); | ||
304 | /* the bug has been fixed in PIIX4M */ | ||
305 | if (rev < 3) { | ||
306 | printk(KERN_WARNING "* Found PM-Timer Bug on this " | ||
307 | "chipset. Due to workarounds for a bug,\n" | ||
308 | "* this time source is slow. Consider trying " | ||
309 | "other time sources (clock=)\n"); | ||
310 | pmtmr_has_bug = 1; | ||
311 | } | ||
312 | pci_dev_put(dev); | ||
313 | } | ||
314 | |||
315 | if (pci_dev_present(gray_list)) { | ||
316 | printk(KERN_WARNING "* This chipset may have PM-Timer Bug. Due" | ||
317 | " to workarounds for a bug,\n" | ||
318 | "* this time source is slow. If you are sure your timer" | ||
319 | " does not have\n" | ||
320 | "* this bug, please use \"pmtmr_good\" to disable the " | ||
321 | "workaround\n"); | ||
322 | pmtmr_has_bug = 1; | ||
323 | } | ||
324 | |||
325 | if (!pmtmr_has_bug) | ||
326 | pmtmr_need_workaround = 0; | ||
327 | |||
328 | return 0; | ||
329 | } | ||
330 | device_initcall(pmtmr_bug_check); | ||
331 | #endif | ||
332 | |||
333 | static int __init pmtr_good_setup(char *__str) | ||
334 | { | ||
335 | pmtmr_need_workaround = 0; | ||
336 | return 1; | ||
337 | } | ||
338 | __setup("pmtmr_good", pmtr_good_setup); | ||
339 | |||
266 | MODULE_LICENSE("GPL"); | 340 | MODULE_LICENSE("GPL"); |
267 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); | 341 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); |
268 | MODULE_DESCRIPTION("Power Management Timer (PMTMR) as primary timing source for x86"); | 342 | MODULE_DESCRIPTION("Power Management Timer (PMTMR) as primary timing source for x86"); |
diff --git a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c index a7f5a2aceba2..5e41ee29c8cf 100644 --- a/arch/i386/kernel/timers/timer_tsc.c +++ b/arch/i386/kernel/timers/timer_tsc.c | |||
@@ -74,7 +74,7 @@ late_initcall(start_lost_tick_compensation); | |||
74 | * | 74 | * |
75 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" | 75 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" |
76 | */ | 76 | */ |
77 | static unsigned long cyc2ns_scale; | 77 | static unsigned long cyc2ns_scale __read_mostly; |
78 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ | 78 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ |
79 | 79 | ||
80 | static inline void set_cyc2ns_scale(unsigned long cpu_khz) | 80 | static inline void set_cyc2ns_scale(unsigned long cpu_khz) |
diff --git a/arch/i386/kernel/topology.c b/arch/i386/kernel/topology.c index 67a0e1baa28b..296355292c7c 100644 --- a/arch/i386/kernel/topology.c +++ b/arch/i386/kernel/topology.c | |||
@@ -41,6 +41,15 @@ int arch_register_cpu(int num){ | |||
41 | parent = &node_devices[node].node; | 41 | parent = &node_devices[node].node; |
42 | #endif /* CONFIG_NUMA */ | 42 | #endif /* CONFIG_NUMA */ |
43 | 43 | ||
44 | /* | ||
45 | * CPU0 cannot be offlined due to several | ||
46 | * restrictions and assumptions in kernel. This basically | ||
47 | * doesnt add a control file, one cannot attempt to offline | ||
48 | * BSP. | ||
49 | */ | ||
50 | if (!num) | ||
51 | cpu_devices[num].cpu.no_control = 1; | ||
52 | |||
44 | return register_cpu(&cpu_devices[num].cpu, num, parent); | 53 | return register_cpu(&cpu_devices[num].cpu, num, parent); |
45 | } | 54 | } |
46 | 55 | ||
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index b814dbdcc91e..e38527994590 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
@@ -92,32 +92,51 @@ asmlinkage void spurious_interrupt_bug(void); | |||
92 | asmlinkage void machine_check(void); | 92 | asmlinkage void machine_check(void); |
93 | 93 | ||
94 | static int kstack_depth_to_print = 24; | 94 | static int kstack_depth_to_print = 24; |
95 | struct notifier_block *i386die_chain; | 95 | ATOMIC_NOTIFIER_HEAD(i386die_chain); |
96 | static DEFINE_SPINLOCK(die_notifier_lock); | ||
97 | 96 | ||
98 | int register_die_notifier(struct notifier_block *nb) | 97 | int register_die_notifier(struct notifier_block *nb) |
99 | { | 98 | { |
100 | int err = 0; | 99 | vmalloc_sync_all(); |
101 | unsigned long flags; | 100 | return atomic_notifier_chain_register(&i386die_chain, nb); |
102 | spin_lock_irqsave(&die_notifier_lock, flags); | ||
103 | err = notifier_chain_register(&i386die_chain, nb); | ||
104 | spin_unlock_irqrestore(&die_notifier_lock, flags); | ||
105 | return err; | ||
106 | } | 101 | } |
107 | EXPORT_SYMBOL(register_die_notifier); | 102 | EXPORT_SYMBOL(register_die_notifier); |
108 | 103 | ||
104 | int unregister_die_notifier(struct notifier_block *nb) | ||
105 | { | ||
106 | return atomic_notifier_chain_unregister(&i386die_chain, nb); | ||
107 | } | ||
108 | EXPORT_SYMBOL(unregister_die_notifier); | ||
109 | |||
109 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) | 110 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) |
110 | { | 111 | { |
111 | return p > (void *)tinfo && | 112 | return p > (void *)tinfo && |
112 | p < (void *)tinfo + THREAD_SIZE - 3; | 113 | p < (void *)tinfo + THREAD_SIZE - 3; |
113 | } | 114 | } |
114 | 115 | ||
115 | static void print_addr_and_symbol(unsigned long addr, char *log_lvl) | 116 | /* |
117 | * Print CONFIG_STACK_BACKTRACE_COLS address/symbol entries per line. | ||
118 | */ | ||
119 | static inline int print_addr_and_symbol(unsigned long addr, char *log_lvl, | ||
120 | int printed) | ||
116 | { | 121 | { |
117 | printk(log_lvl); | 122 | if (!printed) |
123 | printk(log_lvl); | ||
124 | |||
125 | #if CONFIG_STACK_BACKTRACE_COLS == 1 | ||
118 | printk(" [<%08lx>] ", addr); | 126 | printk(" [<%08lx>] ", addr); |
127 | #else | ||
128 | printk(" <%08lx> ", addr); | ||
129 | #endif | ||
119 | print_symbol("%s", addr); | 130 | print_symbol("%s", addr); |
120 | printk("\n"); | 131 | |
132 | printed = (printed + 1) % CONFIG_STACK_BACKTRACE_COLS; | ||
133 | |||
134 | if (printed) | ||
135 | printk(" "); | ||
136 | else | ||
137 | printk("\n"); | ||
138 | |||
139 | return printed; | ||
121 | } | 140 | } |
122 | 141 | ||
123 | static inline unsigned long print_context_stack(struct thread_info *tinfo, | 142 | static inline unsigned long print_context_stack(struct thread_info *tinfo, |
@@ -125,20 +144,24 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo, | |||
125 | char *log_lvl) | 144 | char *log_lvl) |
126 | { | 145 | { |
127 | unsigned long addr; | 146 | unsigned long addr; |
147 | int printed = 0; /* nr of entries already printed on current line */ | ||
128 | 148 | ||
129 | #ifdef CONFIG_FRAME_POINTER | 149 | #ifdef CONFIG_FRAME_POINTER |
130 | while (valid_stack_ptr(tinfo, (void *)ebp)) { | 150 | while (valid_stack_ptr(tinfo, (void *)ebp)) { |
131 | addr = *(unsigned long *)(ebp + 4); | 151 | addr = *(unsigned long *)(ebp + 4); |
132 | print_addr_and_symbol(addr, log_lvl); | 152 | printed = print_addr_and_symbol(addr, log_lvl, printed); |
133 | ebp = *(unsigned long *)ebp; | 153 | ebp = *(unsigned long *)ebp; |
134 | } | 154 | } |
135 | #else | 155 | #else |
136 | while (valid_stack_ptr(tinfo, stack)) { | 156 | while (valid_stack_ptr(tinfo, stack)) { |
137 | addr = *stack++; | 157 | addr = *stack++; |
138 | if (__kernel_text_address(addr)) | 158 | if (__kernel_text_address(addr)) |
139 | print_addr_and_symbol(addr, log_lvl); | 159 | printed = print_addr_and_symbol(addr, log_lvl, printed); |
140 | } | 160 | } |
141 | #endif | 161 | #endif |
162 | if (printed) | ||
163 | printk("\n"); | ||
164 | |||
142 | return ebp; | 165 | return ebp; |
143 | } | 166 | } |
144 | 167 | ||
@@ -166,8 +189,7 @@ static void show_trace_log_lvl(struct task_struct *task, | |||
166 | stack = (unsigned long*)context->previous_esp; | 189 | stack = (unsigned long*)context->previous_esp; |
167 | if (!stack) | 190 | if (!stack) |
168 | break; | 191 | break; |
169 | printk(log_lvl); | 192 | printk("%s =======================\n", log_lvl); |
170 | printk(" =======================\n"); | ||
171 | } | 193 | } |
172 | } | 194 | } |
173 | 195 | ||
@@ -194,21 +216,17 @@ static void show_stack_log_lvl(struct task_struct *task, unsigned long *esp, | |||
194 | for(i = 0; i < kstack_depth_to_print; i++) { | 216 | for(i = 0; i < kstack_depth_to_print; i++) { |
195 | if (kstack_end(stack)) | 217 | if (kstack_end(stack)) |
196 | break; | 218 | break; |
197 | if (i && ((i % 8) == 0)) { | 219 | if (i && ((i % 8) == 0)) |
198 | printk("\n"); | 220 | printk("\n%s ", log_lvl); |
199 | printk(log_lvl); | ||
200 | printk(" "); | ||
201 | } | ||
202 | printk("%08lx ", *stack++); | 221 | printk("%08lx ", *stack++); |
203 | } | 222 | } |
204 | printk("\n"); | 223 | printk("\n%sCall Trace:\n", log_lvl); |
205 | printk(log_lvl); | ||
206 | printk("Call Trace:\n"); | ||
207 | show_trace_log_lvl(task, esp, log_lvl); | 224 | show_trace_log_lvl(task, esp, log_lvl); |
208 | } | 225 | } |
209 | 226 | ||
210 | void show_stack(struct task_struct *task, unsigned long *esp) | 227 | void show_stack(struct task_struct *task, unsigned long *esp) |
211 | { | 228 | { |
229 | printk(" "); | ||
212 | show_stack_log_lvl(task, esp, ""); | 230 | show_stack_log_lvl(task, esp, ""); |
213 | } | 231 | } |
214 | 232 | ||
@@ -233,7 +251,7 @@ void show_registers(struct pt_regs *regs) | |||
233 | 251 | ||
234 | esp = (unsigned long) (®s->esp); | 252 | esp = (unsigned long) (®s->esp); |
235 | savesegment(ss, ss); | 253 | savesegment(ss, ss); |
236 | if (user_mode(regs)) { | 254 | if (user_mode_vm(regs)) { |
237 | in_kernel = 0; | 255 | in_kernel = 0; |
238 | esp = regs->esp; | 256 | esp = regs->esp; |
239 | ss = regs->xss & 0xffff; | 257 | ss = regs->xss & 0xffff; |
@@ -333,6 +351,8 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
333 | static int die_counter; | 351 | static int die_counter; |
334 | unsigned long flags; | 352 | unsigned long flags; |
335 | 353 | ||
354 | oops_enter(); | ||
355 | |||
336 | if (die.lock_owner != raw_smp_processor_id()) { | 356 | if (die.lock_owner != raw_smp_processor_id()) { |
337 | console_verbose(); | 357 | console_verbose(); |
338 | spin_lock_irqsave(&die.lock, flags); | 358 | spin_lock_irqsave(&die.lock, flags); |
@@ -365,8 +385,12 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
365 | #endif | 385 | #endif |
366 | if (nl) | 386 | if (nl) |
367 | printk("\n"); | 387 | printk("\n"); |
368 | notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV); | 388 | if (notify_die(DIE_OOPS, str, regs, err, |
369 | show_registers(regs); | 389 | current->thread.trap_no, SIGSEGV) != |
390 | NOTIFY_STOP) | ||
391 | show_registers(regs); | ||
392 | else | ||
393 | regs = NULL; | ||
370 | } else | 394 | } else |
371 | printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); | 395 | printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); |
372 | 396 | ||
@@ -374,6 +398,9 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
374 | die.lock_owner = -1; | 398 | die.lock_owner = -1; |
375 | spin_unlock_irqrestore(&die.lock, flags); | 399 | spin_unlock_irqrestore(&die.lock, flags); |
376 | 400 | ||
401 | if (!regs) | ||
402 | return; | ||
403 | |||
377 | if (kexec_should_crash(current)) | 404 | if (kexec_should_crash(current)) |
378 | crash_kexec(regs); | 405 | crash_kexec(regs); |
379 | 406 | ||
@@ -385,6 +412,7 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
385 | ssleep(5); | 412 | ssleep(5); |
386 | panic("Fatal exception"); | 413 | panic("Fatal exception"); |
387 | } | 414 | } |
415 | oops_exit(); | ||
388 | do_exit(SIGSEGV); | 416 | do_exit(SIGSEGV); |
389 | } | 417 | } |
390 | 418 | ||
@@ -601,7 +629,7 @@ static DEFINE_SPINLOCK(nmi_print_lock); | |||
601 | 629 | ||
602 | void die_nmi (struct pt_regs *regs, const char *msg) | 630 | void die_nmi (struct pt_regs *regs, const char *msg) |
603 | { | 631 | { |
604 | if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 0, SIGINT) == | 632 | if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 2, SIGINT) == |
605 | NOTIFY_STOP) | 633 | NOTIFY_STOP) |
606 | return; | 634 | return; |
607 | 635 | ||
@@ -623,7 +651,7 @@ void die_nmi (struct pt_regs *regs, const char *msg) | |||
623 | /* If we are in kernel we are probably nested up pretty bad | 651 | /* If we are in kernel we are probably nested up pretty bad |
624 | * and might aswell get out now while we still can. | 652 | * and might aswell get out now while we still can. |
625 | */ | 653 | */ |
626 | if (!user_mode(regs)) { | 654 | if (!user_mode_vm(regs)) { |
627 | current->thread.trap_no = 2; | 655 | current->thread.trap_no = 2; |
628 | crash_kexec(regs); | 656 | crash_kexec(regs); |
629 | } | 657 | } |
@@ -640,7 +668,7 @@ static void default_do_nmi(struct pt_regs * regs) | |||
640 | reason = get_nmi_reason(); | 668 | reason = get_nmi_reason(); |
641 | 669 | ||
642 | if (!(reason & 0xc0)) { | 670 | if (!(reason & 0xc0)) { |
643 | if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 0, SIGINT) | 671 | if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT) |
644 | == NOTIFY_STOP) | 672 | == NOTIFY_STOP) |
645 | return; | 673 | return; |
646 | #ifdef CONFIG_X86_LOCAL_APIC | 674 | #ifdef CONFIG_X86_LOCAL_APIC |
@@ -656,7 +684,7 @@ static void default_do_nmi(struct pt_regs * regs) | |||
656 | unknown_nmi_error(reason, regs); | 684 | unknown_nmi_error(reason, regs); |
657 | return; | 685 | return; |
658 | } | 686 | } |
659 | if (notify_die(DIE_NMI, "nmi", regs, reason, 0, SIGINT) == NOTIFY_STOP) | 687 | if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP) |
660 | return; | 688 | return; |
661 | if (reason & 0x80) | 689 | if (reason & 0x80) |
662 | mem_parity_error(reason, regs); | 690 | mem_parity_error(reason, regs); |
@@ -694,6 +722,7 @@ fastcall void do_nmi(struct pt_regs * regs, long error_code) | |||
694 | 722 | ||
695 | void set_nmi_callback(nmi_callback_t callback) | 723 | void set_nmi_callback(nmi_callback_t callback) |
696 | { | 724 | { |
725 | vmalloc_sync_all(); | ||
697 | rcu_assign_pointer(nmi_callback, callback); | 726 | rcu_assign_pointer(nmi_callback, callback); |
698 | } | 727 | } |
699 | EXPORT_SYMBOL_GPL(set_nmi_callback); | 728 | EXPORT_SYMBOL_GPL(set_nmi_callback); |
@@ -1164,6 +1193,6 @@ void __init trap_init(void) | |||
1164 | static int __init kstack_setup(char *s) | 1193 | static int __init kstack_setup(char *s) |
1165 | { | 1194 | { |
1166 | kstack_depth_to_print = simple_strtoul(s, NULL, 0); | 1195 | kstack_depth_to_print = simple_strtoul(s, NULL, 0); |
1167 | return 0; | 1196 | return 1; |
1168 | } | 1197 | } |
1169 | __setup("kstack=", kstack_setup); | 1198 | __setup("kstack=", kstack_setup); |
diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index f51c894a7da5..aee14fafd13d 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/smp_lock.h> | 43 | #include <linux/smp_lock.h> |
44 | #include <linux/highmem.h> | 44 | #include <linux/highmem.h> |
45 | #include <linux/ptrace.h> | 45 | #include <linux/ptrace.h> |
46 | #include <linux/audit.h> | ||
46 | 47 | ||
47 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
48 | #include <asm/io.h> | 49 | #include <asm/io.h> |
@@ -252,6 +253,7 @@ out: | |||
252 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk) | 253 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk) |
253 | { | 254 | { |
254 | struct tss_struct *tss; | 255 | struct tss_struct *tss; |
256 | long eax; | ||
255 | /* | 257 | /* |
256 | * make sure the vm86() system call doesn't try to do anything silly | 258 | * make sure the vm86() system call doesn't try to do anything silly |
257 | */ | 259 | */ |
@@ -305,13 +307,19 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk | |||
305 | tsk->thread.screen_bitmap = info->screen_bitmap; | 307 | tsk->thread.screen_bitmap = info->screen_bitmap; |
306 | if (info->flags & VM86_SCREEN_BITMAP) | 308 | if (info->flags & VM86_SCREEN_BITMAP) |
307 | mark_screen_rdonly(tsk->mm); | 309 | mark_screen_rdonly(tsk->mm); |
310 | __asm__ __volatile__("xorl %eax,%eax; movl %eax,%fs; movl %eax,%gs\n\t"); | ||
311 | __asm__ __volatile__("movl %%eax, %0\n" :"=r"(eax)); | ||
312 | |||
313 | /*call audit_syscall_exit since we do not exit via the normal paths */ | ||
314 | if (unlikely(current->audit_context)) | ||
315 | audit_syscall_exit(current, AUDITSC_RESULT(eax), eax); | ||
316 | |||
308 | __asm__ __volatile__( | 317 | __asm__ __volatile__( |
309 | "xorl %%eax,%%eax; movl %%eax,%%fs; movl %%eax,%%gs\n\t" | ||
310 | "movl %0,%%esp\n\t" | 318 | "movl %0,%%esp\n\t" |
311 | "movl %1,%%ebp\n\t" | 319 | "movl %1,%%ebp\n\t" |
312 | "jmp resume_userspace" | 320 | "jmp resume_userspace" |
313 | : /* no outputs */ | 321 | : /* no outputs */ |
314 | :"r" (&info->regs), "r" (task_thread_info(tsk)) : "ax"); | 322 | :"r" (&info->regs), "r" (task_thread_info(tsk))); |
315 | /* we never return here */ | 323 | /* we never return here */ |
316 | } | 324 | } |
317 | 325 | ||
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S index 4710195b6b74..8831303a473f 100644 --- a/arch/i386/kernel/vmlinux.lds.S +++ b/arch/i386/kernel/vmlinux.lds.S | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <asm-generic/vmlinux.lds.h> | 7 | #include <asm-generic/vmlinux.lds.h> |
8 | #include <asm/thread_info.h> | 8 | #include <asm/thread_info.h> |
9 | #include <asm/page.h> | 9 | #include <asm/page.h> |
10 | #include <asm/cache.h> | ||
10 | 11 | ||
11 | OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") | 12 | OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") |
12 | OUTPUT_ARCH(i386) | 13 | OUTPUT_ARCH(i386) |
@@ -68,6 +69,26 @@ SECTIONS | |||
68 | *(.data.init_task) | 69 | *(.data.init_task) |
69 | } | 70 | } |
70 | 71 | ||
72 | /* might get freed after init */ | ||
73 | . = ALIGN(4096); | ||
74 | __smp_alt_begin = .; | ||
75 | __smp_alt_instructions = .; | ||
76 | .smp_altinstructions : AT(ADDR(.smp_altinstructions) - LOAD_OFFSET) { | ||
77 | *(.smp_altinstructions) | ||
78 | } | ||
79 | __smp_alt_instructions_end = .; | ||
80 | . = ALIGN(4); | ||
81 | __smp_locks = .; | ||
82 | .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { | ||
83 | *(.smp_locks) | ||
84 | } | ||
85 | __smp_locks_end = .; | ||
86 | .smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) { | ||
87 | *(.smp_altinstr_replacement) | ||
88 | } | ||
89 | . = ALIGN(4096); | ||
90 | __smp_alt_end = .; | ||
91 | |||
71 | /* will be freed after init */ | 92 | /* will be freed after init */ |
72 | . = ALIGN(4096); /* Init code and data */ | 93 | . = ALIGN(4096); /* Init code and data */ |
73 | __init_begin = .; | 94 | __init_begin = .; |
@@ -115,7 +136,7 @@ SECTIONS | |||
115 | __initramfs_start = .; | 136 | __initramfs_start = .; |
116 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) } | 137 | .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) } |
117 | __initramfs_end = .; | 138 | __initramfs_end = .; |
118 | . = ALIGN(32); | 139 | . = ALIGN(L1_CACHE_BYTES); |
119 | __per_cpu_start = .; | 140 | __per_cpu_start = .; |
120 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) } | 141 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) } |
121 | __per_cpu_end = .; | 142 | __per_cpu_end = .; |
diff --git a/arch/i386/kernel/vsyscall-sigreturn.S b/arch/i386/kernel/vsyscall-sigreturn.S index fadb5bc3c374..a92262f41659 100644 --- a/arch/i386/kernel/vsyscall-sigreturn.S +++ b/arch/i386/kernel/vsyscall-sigreturn.S | |||
@@ -44,7 +44,7 @@ __kernel_rt_sigreturn: | |||
44 | .LSTARTCIEDLSI1: | 44 | .LSTARTCIEDLSI1: |
45 | .long 0 /* CIE ID */ | 45 | .long 0 /* CIE ID */ |
46 | .byte 1 /* Version number */ | 46 | .byte 1 /* Version number */ |
47 | .string "zR" /* NUL-terminated augmentation string */ | 47 | .string "zRS" /* NUL-terminated augmentation string */ |
48 | .uleb128 1 /* Code alignment factor */ | 48 | .uleb128 1 /* Code alignment factor */ |
49 | .sleb128 -4 /* Data alignment factor */ | 49 | .sleb128 -4 /* Data alignment factor */ |
50 | .byte 8 /* Return address register column */ | 50 | .byte 8 /* Return address register column */ |
diff --git a/arch/i386/kernel/vsyscall-sysenter.S b/arch/i386/kernel/vsyscall-sysenter.S index 76b728159403..3b62baa6a371 100644 --- a/arch/i386/kernel/vsyscall-sysenter.S +++ b/arch/i386/kernel/vsyscall-sysenter.S | |||
@@ -21,6 +21,9 @@ | |||
21 | * instruction clobbers %esp, the user's %esp won't even survive entry | 21 | * instruction clobbers %esp, the user's %esp won't even survive entry |
22 | * into the kernel. We store %esp in %ebp. Code in entry.S must fetch | 22 | * into the kernel. We store %esp in %ebp. Code in entry.S must fetch |
23 | * arg6 from the stack. | 23 | * arg6 from the stack. |
24 | * | ||
25 | * You can not use this vsyscall for the clone() syscall because the | ||
26 | * three dwords on the parent stack do not get copied to the child. | ||
24 | */ | 27 | */ |
25 | .text | 28 | .text |
26 | .globl __kernel_vsyscall | 29 | .globl __kernel_vsyscall |
diff --git a/arch/i386/mach-es7000/es7000.h b/arch/i386/mach-es7000/es7000.h index f1e3204f5dec..80566ca4a80a 100644 --- a/arch/i386/mach-es7000/es7000.h +++ b/arch/i386/mach-es7000/es7000.h | |||
@@ -83,6 +83,7 @@ struct es7000_oem_table { | |||
83 | struct psai psai; | 83 | struct psai psai; |
84 | }; | 84 | }; |
85 | 85 | ||
86 | #ifdef CONFIG_ACPI | ||
86 | struct acpi_table_sdt { | 87 | struct acpi_table_sdt { |
87 | unsigned long pa; | 88 | unsigned long pa; |
88 | unsigned long count; | 89 | unsigned long count; |
@@ -99,6 +100,9 @@ struct oem_table { | |||
99 | u32 OEMTableSize; | 100 | u32 OEMTableSize; |
100 | }; | 101 | }; |
101 | 102 | ||
103 | extern int find_unisys_acpi_oem_table(unsigned long *oem_addr); | ||
104 | #endif | ||
105 | |||
102 | struct mip_reg { | 106 | struct mip_reg { |
103 | unsigned long long off_0; | 107 | unsigned long long off_0; |
104 | unsigned long long off_8; | 108 | unsigned long long off_8; |
@@ -114,7 +118,6 @@ struct mip_reg { | |||
114 | #define MIP_FUNC(VALUE) (VALUE & 0xff) | 118 | #define MIP_FUNC(VALUE) (VALUE & 0xff) |
115 | 119 | ||
116 | extern int parse_unisys_oem (char *oemptr); | 120 | extern int parse_unisys_oem (char *oemptr); |
117 | extern int find_unisys_acpi_oem_table(unsigned long *oem_addr); | ||
118 | extern void setup_unisys(void); | 121 | extern void setup_unisys(void); |
119 | extern int es7000_start_cpu(int cpu, unsigned long eip); | 122 | extern int es7000_start_cpu(int cpu, unsigned long eip); |
120 | extern void es7000_sw_apic(void); | 123 | extern void es7000_sw_apic(void); |
diff --git a/arch/i386/mach-es7000/es7000plat.c b/arch/i386/mach-es7000/es7000plat.c index a9ab0644f403..3d0fc853516d 100644 --- a/arch/i386/mach-es7000/es7000plat.c +++ b/arch/i386/mach-es7000/es7000plat.c | |||
@@ -51,8 +51,6 @@ struct mip_reg *host_reg; | |||
51 | int mip_port; | 51 | int mip_port; |
52 | unsigned long mip_addr, host_addr; | 52 | unsigned long mip_addr, host_addr; |
53 | 53 | ||
54 | #if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI) | ||
55 | |||
56 | /* | 54 | /* |
57 | * GSI override for ES7000 platforms. | 55 | * GSI override for ES7000 platforms. |
58 | */ | 56 | */ |
@@ -76,8 +74,6 @@ es7000_rename_gsi(int ioapic, int gsi) | |||
76 | return gsi; | 74 | return gsi; |
77 | } | 75 | } |
78 | 76 | ||
79 | #endif /* (CONFIG_X86_IO_APIC) && (CONFIG_ACPI) */ | ||
80 | |||
81 | void __init | 77 | void __init |
82 | setup_unisys(void) | 78 | setup_unisys(void) |
83 | { | 79 | { |
@@ -160,6 +156,7 @@ parse_unisys_oem (char *oemptr) | |||
160 | return es7000_plat; | 156 | return es7000_plat; |
161 | } | 157 | } |
162 | 158 | ||
159 | #ifdef CONFIG_ACPI | ||
163 | int __init | 160 | int __init |
164 | find_unisys_acpi_oem_table(unsigned long *oem_addr) | 161 | find_unisys_acpi_oem_table(unsigned long *oem_addr) |
165 | { | 162 | { |
@@ -212,6 +209,7 @@ find_unisys_acpi_oem_table(unsigned long *oem_addr) | |||
212 | } | 209 | } |
213 | return -1; | 210 | return -1; |
214 | } | 211 | } |
212 | #endif | ||
215 | 213 | ||
216 | static void | 214 | static void |
217 | es7000_spin(int n) | 215 | es7000_spin(int n) |
diff --git a/arch/i386/mach-visws/reboot.c b/arch/i386/mach-visws/reboot.c index 5d73e042ed0a..99332abfad42 100644 --- a/arch/i386/mach-visws/reboot.c +++ b/arch/i386/mach-visws/reboot.c | |||
@@ -1,7 +1,6 @@ | |||
1 | #include <linux/module.h> | 1 | #include <linux/module.h> |
2 | #include <linux/smp.h> | 2 | #include <linux/smp.h> |
3 | #include <linux/delay.h> | 3 | #include <linux/delay.h> |
4 | #include <linux/platform.h> | ||
5 | 4 | ||
6 | #include <asm/io.h> | 5 | #include <asm/io.h> |
7 | #include "piix4.h" | 6 | #include "piix4.h" |
diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c index 8165626a5c30..70e560a1b79a 100644 --- a/arch/i386/mach-voyager/voyager_smp.c +++ b/arch/i386/mach-voyager/voyager_smp.c | |||
@@ -1700,7 +1700,7 @@ after_handle_vic_irq(unsigned int irq) | |||
1700 | 1700 | ||
1701 | printk("VOYAGER SMP: CPU%d lost interrupt %d\n", | 1701 | printk("VOYAGER SMP: CPU%d lost interrupt %d\n", |
1702 | cpu, irq); | 1702 | cpu, irq); |
1703 | for_each_cpu(real_cpu, mask) { | 1703 | for_each_possible_cpu(real_cpu, mask) { |
1704 | 1704 | ||
1705 | outb(VIC_CPU_MASQUERADE_ENABLE | real_cpu, | 1705 | outb(VIC_CPU_MASQUERADE_ENABLE | real_cpu, |
1706 | VIC_PROCESSOR_ID); | 1706 | VIC_PROCESSOR_ID); |
diff --git a/arch/i386/mm/discontig.c b/arch/i386/mm/discontig.c index c4af9638dbfa..fe6eb901326e 100644 --- a/arch/i386/mm/discontig.c +++ b/arch/i386/mm/discontig.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/nodemask.h> | 31 | #include <linux/nodemask.h> |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/kexec.h> | 33 | #include <linux/kexec.h> |
34 | #include <linux/pfn.h> | ||
34 | 35 | ||
35 | #include <asm/e820.h> | 36 | #include <asm/e820.h> |
36 | #include <asm/setup.h> | 37 | #include <asm/setup.h> |
@@ -352,17 +353,6 @@ void __init zone_sizes_init(void) | |||
352 | { | 353 | { |
353 | int nid; | 354 | int nid; |
354 | 355 | ||
355 | /* | ||
356 | * Insert nodes into pgdat_list backward so they appear in order. | ||
357 | * Clobber node 0's links and NULL out pgdat_list before starting. | ||
358 | */ | ||
359 | pgdat_list = NULL; | ||
360 | for (nid = MAX_NUMNODES - 1; nid >= 0; nid--) { | ||
361 | if (!node_online(nid)) | ||
362 | continue; | ||
363 | NODE_DATA(nid)->pgdat_next = pgdat_list; | ||
364 | pgdat_list = NODE_DATA(nid); | ||
365 | } | ||
366 | 356 | ||
367 | for_each_online_node(nid) { | 357 | for_each_online_node(nid) { |
368 | unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; | 358 | unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; |
diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index cf572d9a3b6e..7f0fcf219a26 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c | |||
@@ -214,6 +214,68 @@ static noinline void force_sig_info_fault(int si_signo, int si_code, | |||
214 | 214 | ||
215 | fastcall void do_invalid_op(struct pt_regs *, unsigned long); | 215 | fastcall void do_invalid_op(struct pt_regs *, unsigned long); |
216 | 216 | ||
217 | static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) | ||
218 | { | ||
219 | unsigned index = pgd_index(address); | ||
220 | pgd_t *pgd_k; | ||
221 | pud_t *pud, *pud_k; | ||
222 | pmd_t *pmd, *pmd_k; | ||
223 | |||
224 | pgd += index; | ||
225 | pgd_k = init_mm.pgd + index; | ||
226 | |||
227 | if (!pgd_present(*pgd_k)) | ||
228 | return NULL; | ||
229 | |||
230 | /* | ||
231 | * set_pgd(pgd, *pgd_k); here would be useless on PAE | ||
232 | * and redundant with the set_pmd() on non-PAE. As would | ||
233 | * set_pud. | ||
234 | */ | ||
235 | |||
236 | pud = pud_offset(pgd, address); | ||
237 | pud_k = pud_offset(pgd_k, address); | ||
238 | if (!pud_present(*pud_k)) | ||
239 | return NULL; | ||
240 | |||
241 | pmd = pmd_offset(pud, address); | ||
242 | pmd_k = pmd_offset(pud_k, address); | ||
243 | if (!pmd_present(*pmd_k)) | ||
244 | return NULL; | ||
245 | if (!pmd_present(*pmd)) | ||
246 | set_pmd(pmd, *pmd_k); | ||
247 | else | ||
248 | BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k)); | ||
249 | return pmd_k; | ||
250 | } | ||
251 | |||
252 | /* | ||
253 | * Handle a fault on the vmalloc or module mapping area | ||
254 | * | ||
255 | * This assumes no large pages in there. | ||
256 | */ | ||
257 | static inline int vmalloc_fault(unsigned long address) | ||
258 | { | ||
259 | unsigned long pgd_paddr; | ||
260 | pmd_t *pmd_k; | ||
261 | pte_t *pte_k; | ||
262 | /* | ||
263 | * Synchronize this task's top level page-table | ||
264 | * with the 'reference' page table. | ||
265 | * | ||
266 | * Do _not_ use "current" here. We might be inside | ||
267 | * an interrupt in the middle of a task switch.. | ||
268 | */ | ||
269 | pgd_paddr = read_cr3(); | ||
270 | pmd_k = vmalloc_sync_one(__va(pgd_paddr), address); | ||
271 | if (!pmd_k) | ||
272 | return -1; | ||
273 | pte_k = pte_offset_kernel(pmd_k, address); | ||
274 | if (!pte_present(*pte_k)) | ||
275 | return -1; | ||
276 | return 0; | ||
277 | } | ||
278 | |||
217 | /* | 279 | /* |
218 | * This routine handles page faults. It determines the address, | 280 | * This routine handles page faults. It determines the address, |
219 | * and the problem, and then passes it off to one of the appropriate | 281 | * and the problem, and then passes it off to one of the appropriate |
@@ -223,6 +285,8 @@ fastcall void do_invalid_op(struct pt_regs *, unsigned long); | |||
223 | * bit 0 == 0 means no page found, 1 means protection fault | 285 | * bit 0 == 0 means no page found, 1 means protection fault |
224 | * bit 1 == 0 means read, 1 means write | 286 | * bit 1 == 0 means read, 1 means write |
225 | * bit 2 == 0 means kernel, 1 means user-mode | 287 | * bit 2 == 0 means kernel, 1 means user-mode |
288 | * bit 3 == 1 means use of reserved bit detected | ||
289 | * bit 4 == 1 means fault was an instruction fetch | ||
226 | */ | 290 | */ |
227 | fastcall void __kprobes do_page_fault(struct pt_regs *regs, | 291 | fastcall void __kprobes do_page_fault(struct pt_regs *regs, |
228 | unsigned long error_code) | 292 | unsigned long error_code) |
@@ -237,13 +301,6 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs, | |||
237 | /* get the address */ | 301 | /* get the address */ |
238 | address = read_cr2(); | 302 | address = read_cr2(); |
239 | 303 | ||
240 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | ||
241 | SIGSEGV) == NOTIFY_STOP) | ||
242 | return; | ||
243 | /* It's safe to allow irq's after cr2 has been saved */ | ||
244 | if (regs->eflags & (X86_EFLAGS_IF|VM_MASK)) | ||
245 | local_irq_enable(); | ||
246 | |||
247 | tsk = current; | 304 | tsk = current; |
248 | 305 | ||
249 | si_code = SEGV_MAPERR; | 306 | si_code = SEGV_MAPERR; |
@@ -259,17 +316,29 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs, | |||
259 | * | 316 | * |
260 | * This verifies that the fault happens in kernel space | 317 | * This verifies that the fault happens in kernel space |
261 | * (error_code & 4) == 0, and that the fault was not a | 318 | * (error_code & 4) == 0, and that the fault was not a |
262 | * protection error (error_code & 1) == 0. | 319 | * protection error (error_code & 9) == 0. |
263 | */ | 320 | */ |
264 | if (unlikely(address >= TASK_SIZE)) { | 321 | if (unlikely(address >= TASK_SIZE)) { |
265 | if (!(error_code & 5)) | 322 | if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0) |
266 | goto vmalloc_fault; | 323 | return; |
267 | /* | 324 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, |
325 | SIGSEGV) == NOTIFY_STOP) | ||
326 | return; | ||
327 | /* | ||
268 | * Don't take the mm semaphore here. If we fixup a prefetch | 328 | * Don't take the mm semaphore here. If we fixup a prefetch |
269 | * fault we could otherwise deadlock. | 329 | * fault we could otherwise deadlock. |
270 | */ | 330 | */ |
271 | goto bad_area_nosemaphore; | 331 | goto bad_area_nosemaphore; |
272 | } | 332 | } |
333 | |||
334 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | ||
335 | SIGSEGV) == NOTIFY_STOP) | ||
336 | return; | ||
337 | |||
338 | /* It's safe to allow irq's after cr2 has been saved and the vmalloc | ||
339 | fault has been handled. */ | ||
340 | if (regs->eflags & (X86_EFLAGS_IF|VM_MASK)) | ||
341 | local_irq_enable(); | ||
273 | 342 | ||
274 | mm = tsk->mm; | 343 | mm = tsk->mm; |
275 | 344 | ||
@@ -440,24 +509,31 @@ no_context: | |||
440 | 509 | ||
441 | bust_spinlocks(1); | 510 | bust_spinlocks(1); |
442 | 511 | ||
443 | #ifdef CONFIG_X86_PAE | 512 | if (oops_may_print()) { |
444 | if (error_code & 16) { | 513 | #ifdef CONFIG_X86_PAE |
445 | pte_t *pte = lookup_address(address); | 514 | if (error_code & 16) { |
515 | pte_t *pte = lookup_address(address); | ||
446 | 516 | ||
447 | if (pte && pte_present(*pte) && !pte_exec_kernel(*pte)) | 517 | if (pte && pte_present(*pte) && !pte_exec_kernel(*pte)) |
448 | printk(KERN_CRIT "kernel tried to execute NX-protected page - exploit attempt? (uid: %d)\n", current->uid); | 518 | printk(KERN_CRIT "kernel tried to execute " |
519 | "NX-protected page - exploit attempt? " | ||
520 | "(uid: %d)\n", current->uid); | ||
521 | } | ||
522 | #endif | ||
523 | if (address < PAGE_SIZE) | ||
524 | printk(KERN_ALERT "BUG: unable to handle kernel NULL " | ||
525 | "pointer dereference"); | ||
526 | else | ||
527 | printk(KERN_ALERT "BUG: unable to handle kernel paging" | ||
528 | " request"); | ||
529 | printk(" at virtual address %08lx\n",address); | ||
530 | printk(KERN_ALERT " printing eip:\n"); | ||
531 | printk("%08lx\n", regs->eip); | ||
449 | } | 532 | } |
450 | #endif | ||
451 | if (address < PAGE_SIZE) | ||
452 | printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); | ||
453 | else | ||
454 | printk(KERN_ALERT "Unable to handle kernel paging request"); | ||
455 | printk(" at virtual address %08lx\n",address); | ||
456 | printk(KERN_ALERT " printing eip:\n"); | ||
457 | printk("%08lx\n", regs->eip); | ||
458 | page = read_cr3(); | 533 | page = read_cr3(); |
459 | page = ((unsigned long *) __va(page))[address >> 22]; | 534 | page = ((unsigned long *) __va(page))[address >> 22]; |
460 | printk(KERN_ALERT "*pde = %08lx\n", page); | 535 | if (oops_may_print()) |
536 | printk(KERN_ALERT "*pde = %08lx\n", page); | ||
461 | /* | 537 | /* |
462 | * We must not directly access the pte in the highpte | 538 | * We must not directly access the pte in the highpte |
463 | * case, the page table might be allocated in highmem. | 539 | * case, the page table might be allocated in highmem. |
@@ -465,7 +541,7 @@ no_context: | |||
465 | * it's allocated already. | 541 | * it's allocated already. |
466 | */ | 542 | */ |
467 | #ifndef CONFIG_HIGHPTE | 543 | #ifndef CONFIG_HIGHPTE |
468 | if (page & 1) { | 544 | if ((page & 1) && oops_may_print()) { |
469 | page &= PAGE_MASK; | 545 | page &= PAGE_MASK; |
470 | address &= 0x003ff000; | 546 | address &= 0x003ff000; |
471 | page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; | 547 | page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; |
@@ -510,51 +586,41 @@ do_sigbus: | |||
510 | tsk->thread.error_code = error_code; | 586 | tsk->thread.error_code = error_code; |
511 | tsk->thread.trap_no = 14; | 587 | tsk->thread.trap_no = 14; |
512 | force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk); | 588 | force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk); |
513 | return; | 589 | } |
514 | |||
515 | vmalloc_fault: | ||
516 | { | ||
517 | /* | ||
518 | * Synchronize this task's top level page-table | ||
519 | * with the 'reference' page table. | ||
520 | * | ||
521 | * Do _not_ use "tsk" here. We might be inside | ||
522 | * an interrupt in the middle of a task switch.. | ||
523 | */ | ||
524 | int index = pgd_index(address); | ||
525 | unsigned long pgd_paddr; | ||
526 | pgd_t *pgd, *pgd_k; | ||
527 | pud_t *pud, *pud_k; | ||
528 | pmd_t *pmd, *pmd_k; | ||
529 | pte_t *pte_k; | ||
530 | |||
531 | pgd_paddr = read_cr3(); | ||
532 | pgd = index + (pgd_t *)__va(pgd_paddr); | ||
533 | pgd_k = init_mm.pgd + index; | ||
534 | |||
535 | if (!pgd_present(*pgd_k)) | ||
536 | goto no_context; | ||
537 | |||
538 | /* | ||
539 | * set_pgd(pgd, *pgd_k); here would be useless on PAE | ||
540 | * and redundant with the set_pmd() on non-PAE. As would | ||
541 | * set_pud. | ||
542 | */ | ||
543 | 590 | ||
544 | pud = pud_offset(pgd, address); | 591 | #ifndef CONFIG_X86_PAE |
545 | pud_k = pud_offset(pgd_k, address); | 592 | void vmalloc_sync_all(void) |
546 | if (!pud_present(*pud_k)) | 593 | { |
547 | goto no_context; | 594 | /* |
548 | 595 | * Note that races in the updates of insync and start aren't | |
549 | pmd = pmd_offset(pud, address); | 596 | * problematic: insync can only get set bits added, and updates to |
550 | pmd_k = pmd_offset(pud_k, address); | 597 | * start are only improving performance (without affecting correctness |
551 | if (!pmd_present(*pmd_k)) | 598 | * if undone). |
552 | goto no_context; | 599 | */ |
553 | set_pmd(pmd, *pmd_k); | 600 | static DECLARE_BITMAP(insync, PTRS_PER_PGD); |
601 | static unsigned long start = TASK_SIZE; | ||
602 | unsigned long address; | ||
554 | 603 | ||
555 | pte_k = pte_offset_kernel(pmd_k, address); | 604 | BUILD_BUG_ON(TASK_SIZE & ~PGDIR_MASK); |
556 | if (!pte_present(*pte_k)) | 605 | for (address = start; address >= TASK_SIZE; address += PGDIR_SIZE) { |
557 | goto no_context; | 606 | if (!test_bit(pgd_index(address), insync)) { |
558 | return; | 607 | unsigned long flags; |
608 | struct page *page; | ||
609 | |||
610 | spin_lock_irqsave(&pgd_lock, flags); | ||
611 | for (page = pgd_list; page; page = | ||
612 | (struct page *)page->index) | ||
613 | if (!vmalloc_sync_one(page_address(page), | ||
614 | address)) { | ||
615 | BUG_ON(page != pgd_list); | ||
616 | break; | ||
617 | } | ||
618 | spin_unlock_irqrestore(&pgd_lock, flags); | ||
619 | if (!page) | ||
620 | set_bit(pgd_index(address), insync); | ||
621 | } | ||
622 | if (address == start && test_bit(pgd_index(address), insync)) | ||
623 | start = address + PGDIR_SIZE; | ||
559 | } | 624 | } |
560 | } | 625 | } |
626 | #endif | ||
diff --git a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c index d524127c9afc..a7d891585411 100644 --- a/arch/i386/mm/hugetlbpage.c +++ b/arch/i386/mm/hugetlbpage.c | |||
@@ -48,18 +48,6 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) | |||
48 | return (pte_t *) pmd; | 48 | return (pte_t *) pmd; |
49 | } | 49 | } |
50 | 50 | ||
51 | /* | ||
52 | * This function checks for proper alignment of input addr and len parameters. | ||
53 | */ | ||
54 | int is_aligned_hugepage_range(unsigned long addr, unsigned long len) | ||
55 | { | ||
56 | if (len & ~HPAGE_MASK) | ||
57 | return -EINVAL; | ||
58 | if (addr & ~HPAGE_MASK) | ||
59 | return -EINVAL; | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | #if 0 /* This is just for testing */ | 51 | #if 0 /* This is just for testing */ |
64 | struct page * | 52 | struct page * |
65 | follow_huge_addr(struct mm_struct *mm, unsigned long address, int write) | 53 | follow_huge_addr(struct mm_struct *mm, unsigned long address, int write) |
diff --git a/arch/i386/mm/init.c b/arch/i386/mm/init.c index 2700f01994ba..9f66ac582a8b 100644 --- a/arch/i386/mm/init.c +++ b/arch/i386/mm/init.c | |||
@@ -270,7 +270,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base) | |||
270 | 270 | ||
271 | static void __meminit free_new_highpage(struct page *page) | 271 | static void __meminit free_new_highpage(struct page *page) |
272 | { | 272 | { |
273 | set_page_count(page, 1); | 273 | init_page_count(page); |
274 | __free_page(page); | 274 | __free_page(page); |
275 | totalhigh_pages++; | 275 | totalhigh_pages++; |
276 | } | 276 | } |
@@ -720,21 +720,6 @@ static int noinline do_test_wp_bit(void) | |||
720 | return flag; | 720 | return flag; |
721 | } | 721 | } |
722 | 722 | ||
723 | void free_initmem(void) | ||
724 | { | ||
725 | unsigned long addr; | ||
726 | |||
727 | addr = (unsigned long)(&__init_begin); | ||
728 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { | ||
729 | ClearPageReserved(virt_to_page(addr)); | ||
730 | set_page_count(virt_to_page(addr), 1); | ||
731 | memset((void *)addr, 0xcc, PAGE_SIZE); | ||
732 | free_page(addr); | ||
733 | totalram_pages++; | ||
734 | } | ||
735 | printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (__init_end - __init_begin) >> 10); | ||
736 | } | ||
737 | |||
738 | #ifdef CONFIG_DEBUG_RODATA | 723 | #ifdef CONFIG_DEBUG_RODATA |
739 | 724 | ||
740 | extern char __start_rodata, __end_rodata; | 725 | extern char __start_rodata, __end_rodata; |
@@ -758,17 +743,31 @@ void mark_rodata_ro(void) | |||
758 | } | 743 | } |
759 | #endif | 744 | #endif |
760 | 745 | ||
746 | void free_init_pages(char *what, unsigned long begin, unsigned long end) | ||
747 | { | ||
748 | unsigned long addr; | ||
749 | |||
750 | for (addr = begin; addr < end; addr += PAGE_SIZE) { | ||
751 | ClearPageReserved(virt_to_page(addr)); | ||
752 | init_page_count(virt_to_page(addr)); | ||
753 | memset((void *)addr, 0xcc, PAGE_SIZE); | ||
754 | free_page(addr); | ||
755 | totalram_pages++; | ||
756 | } | ||
757 | printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); | ||
758 | } | ||
759 | |||
760 | void free_initmem(void) | ||
761 | { | ||
762 | free_init_pages("unused kernel memory", | ||
763 | (unsigned long)(&__init_begin), | ||
764 | (unsigned long)(&__init_end)); | ||
765 | } | ||
761 | 766 | ||
762 | #ifdef CONFIG_BLK_DEV_INITRD | 767 | #ifdef CONFIG_BLK_DEV_INITRD |
763 | void free_initrd_mem(unsigned long start, unsigned long end) | 768 | void free_initrd_mem(unsigned long start, unsigned long end) |
764 | { | 769 | { |
765 | if (start < end) | 770 | free_init_pages("initrd memory", start, end); |
766 | printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | ||
767 | for (; start < end; start += PAGE_SIZE) { | ||
768 | ClearPageReserved(virt_to_page(start)); | ||
769 | set_page_count(virt_to_page(start), 1); | ||
770 | free_page(start); | ||
771 | totalram_pages++; | ||
772 | } | ||
773 | } | 771 | } |
774 | #endif | 772 | #endif |
773 | |||
diff --git a/arch/i386/mm/pageattr.c b/arch/i386/mm/pageattr.c index d0cadb33b54c..92c3d9f0e731 100644 --- a/arch/i386/mm/pageattr.c +++ b/arch/i386/mm/pageattr.c | |||
@@ -51,6 +51,13 @@ static struct page *split_large_page(unsigned long address, pgprot_t prot, | |||
51 | if (!base) | 51 | if (!base) |
52 | return NULL; | 52 | return NULL; |
53 | 53 | ||
54 | /* | ||
55 | * page_private is used to track the number of entries in | ||
56 | * the page table page that have non standard attributes. | ||
57 | */ | ||
58 | SetPagePrivate(base); | ||
59 | page_private(base) = 0; | ||
60 | |||
54 | address = __pa(address); | 61 | address = __pa(address); |
55 | addr = address & LARGE_PAGE_MASK; | 62 | addr = address & LARGE_PAGE_MASK; |
56 | pbase = (pte_t *)page_address(base); | 63 | pbase = (pte_t *)page_address(base); |
@@ -143,11 +150,12 @@ __change_page_attr(struct page *page, pgprot_t prot) | |||
143 | return -ENOMEM; | 150 | return -ENOMEM; |
144 | set_pmd_pte(kpte,address,mk_pte(split, ref_prot)); | 151 | set_pmd_pte(kpte,address,mk_pte(split, ref_prot)); |
145 | kpte_page = split; | 152 | kpte_page = split; |
146 | } | 153 | } |
147 | get_page(kpte_page); | 154 | page_private(kpte_page)++; |
148 | } else if ((pte_val(*kpte) & _PAGE_PSE) == 0) { | 155 | } else if ((pte_val(*kpte) & _PAGE_PSE) == 0) { |
149 | set_pte_atomic(kpte, mk_pte(page, PAGE_KERNEL)); | 156 | set_pte_atomic(kpte, mk_pte(page, PAGE_KERNEL)); |
150 | __put_page(kpte_page); | 157 | BUG_ON(page_private(kpte_page) == 0); |
158 | page_private(kpte_page)--; | ||
151 | } else | 159 | } else |
152 | BUG(); | 160 | BUG(); |
153 | 161 | ||
@@ -157,10 +165,8 @@ __change_page_attr(struct page *page, pgprot_t prot) | |||
157 | * replace it with a largepage. | 165 | * replace it with a largepage. |
158 | */ | 166 | */ |
159 | if (!PageReserved(kpte_page)) { | 167 | if (!PageReserved(kpte_page)) { |
160 | /* memleak and potential failed 2M page regeneration */ | 168 | if (cpu_has_pse && (page_private(kpte_page) == 0)) { |
161 | BUG_ON(!page_count(kpte_page)); | 169 | ClearPagePrivate(kpte_page); |
162 | |||
163 | if (cpu_has_pse && (page_count(kpte_page) == 1)) { | ||
164 | list_add(&kpte_page->lru, &df_list); | 170 | list_add(&kpte_page->lru, &df_list); |
165 | revert_page(kpte_page, address); | 171 | revert_page(kpte_page, address); |
166 | } | 172 | } |
diff --git a/arch/i386/mm/pgtable.c b/arch/i386/mm/pgtable.c index 9db3242103be..2889567e21a1 100644 --- a/arch/i386/mm/pgtable.c +++ b/arch/i386/mm/pgtable.c | |||
@@ -36,7 +36,7 @@ void show_mem(void) | |||
36 | printk(KERN_INFO "Mem-info:\n"); | 36 | printk(KERN_INFO "Mem-info:\n"); |
37 | show_free_areas(); | 37 | show_free_areas(); |
38 | printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 38 | printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
39 | for_each_pgdat(pgdat) { | 39 | for_each_online_pgdat(pgdat) { |
40 | pgdat_resize_lock(pgdat, &flags); | 40 | pgdat_resize_lock(pgdat, &flags); |
41 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { | 41 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { |
42 | page = pgdat_page_nr(pgdat, i); | 42 | page = pgdat_page_nr(pgdat, i); |
diff --git a/arch/i386/oprofile/nmi_int.c b/arch/i386/oprofile/nmi_int.c index 0493e8b8ec49..1a2076ce6f6a 100644 --- a/arch/i386/oprofile/nmi_int.c +++ b/arch/i386/oprofile/nmi_int.c | |||
@@ -122,7 +122,7 @@ static void nmi_save_registers(void * dummy) | |||
122 | static void free_msrs(void) | 122 | static void free_msrs(void) |
123 | { | 123 | { |
124 | int i; | 124 | int i; |
125 | for (i = 0; i < NR_CPUS; ++i) { | 125 | for_each_possible_cpu(i) { |
126 | kfree(cpu_msrs[i].counters); | 126 | kfree(cpu_msrs[i].counters); |
127 | cpu_msrs[i].counters = NULL; | 127 | cpu_msrs[i].counters = NULL; |
128 | kfree(cpu_msrs[i].controls); | 128 | kfree(cpu_msrs[i].controls); |
@@ -138,10 +138,7 @@ static int allocate_msrs(void) | |||
138 | size_t counters_size = sizeof(struct op_msr) * model->num_counters; | 138 | size_t counters_size = sizeof(struct op_msr) * model->num_counters; |
139 | 139 | ||
140 | int i; | 140 | int i; |
141 | for (i = 0; i < NR_CPUS; ++i) { | 141 | for_each_online_cpu(i) { |
142 | if (!cpu_online(i)) | ||
143 | continue; | ||
144 | |||
145 | cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL); | 142 | cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL); |
146 | if (!cpu_msrs[i].counters) { | 143 | if (!cpu_msrs[i].counters) { |
147 | success = 0; | 144 | success = 0; |
diff --git a/arch/i386/pci/Makefile b/arch/i386/pci/Makefile index 5461d4d5ea1e..62ad75c57e6a 100644 --- a/arch/i386/pci/Makefile +++ b/arch/i386/pci/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | obj-y := i386.o | 1 | obj-y := i386.o init.o |
2 | 2 | ||
3 | obj-$(CONFIG_PCI_BIOS) += pcbios.o | 3 | obj-$(CONFIG_PCI_BIOS) += pcbios.o |
4 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o | 4 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o |
diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c index f6bc48da4d2a..dbece776c5b2 100644 --- a/arch/i386/pci/common.c +++ b/arch/i386/pci/common.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/pci.h> | 8 | #include <linux/pci.h> |
9 | #include <linux/ioport.h> | 9 | #include <linux/ioport.h> |
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | #include <linux/dmi.h> | ||
11 | 12 | ||
12 | #include <asm/acpi.h> | 13 | #include <asm/acpi.h> |
13 | #include <asm/segment.h> | 14 | #include <asm/segment.h> |
@@ -120,11 +121,42 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b) | |||
120 | pci_read_bridge_bases(b); | 121 | pci_read_bridge_bases(b); |
121 | } | 122 | } |
122 | 123 | ||
124 | /* | ||
125 | * Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus) | ||
126 | */ | ||
127 | #ifdef __i386__ | ||
128 | static int __devinit assign_all_busses(struct dmi_system_id *d) | ||
129 | { | ||
130 | pci_probe |= PCI_ASSIGN_ALL_BUSSES; | ||
131 | printk(KERN_INFO "%s detected: enabling PCI bus# renumbering" | ||
132 | " (pci=assign-busses)\n", d->ident); | ||
133 | return 0; | ||
134 | } | ||
135 | #endif | ||
136 | |||
137 | /* | ||
138 | * Laptops which need pci=assign-busses to see Cardbus cards | ||
139 | */ | ||
140 | static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = { | ||
141 | #ifdef __i386__ | ||
142 | { | ||
143 | .callback = assign_all_busses, | ||
144 | .ident = "Samsung X20 Laptop", | ||
145 | .matches = { | ||
146 | DMI_MATCH(DMI_SYS_VENDOR, "Samsung Electronics"), | ||
147 | DMI_MATCH(DMI_PRODUCT_NAME, "SX20S"), | ||
148 | }, | ||
149 | }, | ||
150 | #endif /* __i386__ */ | ||
151 | {} | ||
152 | }; | ||
123 | 153 | ||
124 | struct pci_bus * __devinit pcibios_scan_root(int busnum) | 154 | struct pci_bus * __devinit pcibios_scan_root(int busnum) |
125 | { | 155 | { |
126 | struct pci_bus *bus = NULL; | 156 | struct pci_bus *bus = NULL; |
127 | 157 | ||
158 | dmi_check_system(pciprobe_dmi_table); | ||
159 | |||
128 | while ((bus = pci_find_next_bus(bus)) != NULL) { | 160 | while ((bus = pci_find_next_bus(bus)) != NULL) { |
129 | if (bus->number == busnum) { | 161 | if (bus->number == busnum) { |
130 | /* Already scanned */ | 162 | /* Already scanned */ |
diff --git a/arch/i386/pci/direct.c b/arch/i386/pci/direct.c index e3ac502bf2fb..99012b93bd12 100644 --- a/arch/i386/pci/direct.c +++ b/arch/i386/pci/direct.c | |||
@@ -245,7 +245,7 @@ static int __init pci_check_type2(void) | |||
245 | return works; | 245 | return works; |
246 | } | 246 | } |
247 | 247 | ||
248 | static int __init pci_direct_init(void) | 248 | void __init pci_direct_init(void) |
249 | { | 249 | { |
250 | struct resource *region, *region2; | 250 | struct resource *region, *region2; |
251 | 251 | ||
@@ -258,16 +258,16 @@ static int __init pci_direct_init(void) | |||
258 | if (pci_check_type1()) { | 258 | if (pci_check_type1()) { |
259 | printk(KERN_INFO "PCI: Using configuration type 1\n"); | 259 | printk(KERN_INFO "PCI: Using configuration type 1\n"); |
260 | raw_pci_ops = &pci_direct_conf1; | 260 | raw_pci_ops = &pci_direct_conf1; |
261 | return 0; | 261 | return; |
262 | } | 262 | } |
263 | release_resource(region); | 263 | release_resource(region); |
264 | 264 | ||
265 | type2: | 265 | type2: |
266 | if ((pci_probe & PCI_PROBE_CONF2) == 0) | 266 | if ((pci_probe & PCI_PROBE_CONF2) == 0) |
267 | goto out; | 267 | return; |
268 | region = request_region(0xCF8, 4, "PCI conf2"); | 268 | region = request_region(0xCF8, 4, "PCI conf2"); |
269 | if (!region) | 269 | if (!region) |
270 | goto out; | 270 | return; |
271 | region2 = request_region(0xC000, 0x1000, "PCI conf2"); | 271 | region2 = request_region(0xC000, 0x1000, "PCI conf2"); |
272 | if (!region2) | 272 | if (!region2) |
273 | goto fail2; | 273 | goto fail2; |
@@ -275,15 +275,10 @@ static int __init pci_direct_init(void) | |||
275 | if (pci_check_type2()) { | 275 | if (pci_check_type2()) { |
276 | printk(KERN_INFO "PCI: Using configuration type 2\n"); | 276 | printk(KERN_INFO "PCI: Using configuration type 2\n"); |
277 | raw_pci_ops = &pci_direct_conf2; | 277 | raw_pci_ops = &pci_direct_conf2; |
278 | return 0; | 278 | return; |
279 | } | 279 | } |
280 | 280 | ||
281 | release_resource(region2); | 281 | release_resource(region2); |
282 | fail2: | 282 | fail2: |
283 | release_resource(region); | 283 | release_resource(region); |
284 | |||
285 | out: | ||
286 | return 0; | ||
287 | } | 284 | } |
288 | |||
289 | arch_initcall(pci_direct_init); | ||
diff --git a/arch/i386/pci/init.c b/arch/i386/pci/init.c new file mode 100644 index 000000000000..f9156d3ac723 --- /dev/null +++ b/arch/i386/pci/init.c | |||
@@ -0,0 +1,25 @@ | |||
1 | #include <linux/config.h> | ||
2 | #include <linux/pci.h> | ||
3 | #include <linux/init.h> | ||
4 | #include "pci.h" | ||
5 | |||
6 | /* arch_initcall has too random ordering, so call the initializers | ||
7 | in the right sequence from here. */ | ||
8 | static __init int pci_access_init(void) | ||
9 | { | ||
10 | #ifdef CONFIG_PCI_MMCONFIG | ||
11 | pci_mmcfg_init(); | ||
12 | #endif | ||
13 | if (raw_pci_ops) | ||
14 | return 0; | ||
15 | #ifdef CONFIG_PCI_BIOS | ||
16 | pci_pcbios_init(); | ||
17 | #endif | ||
18 | if (raw_pci_ops) | ||
19 | return 0; | ||
20 | #ifdef CONFIG_PCI_DIRECT | ||
21 | pci_direct_init(); | ||
22 | #endif | ||
23 | return 0; | ||
24 | } | ||
25 | arch_initcall(pci_access_init); | ||
diff --git a/arch/i386/pci/mmconfig.c b/arch/i386/pci/mmconfig.c index 0ee8a983708c..613789071f30 100644 --- a/arch/i386/pci/mmconfig.c +++ b/arch/i386/pci/mmconfig.c | |||
@@ -172,25 +172,20 @@ static __init void unreachable_devices(void) | |||
172 | } | 172 | } |
173 | } | 173 | } |
174 | 174 | ||
175 | static int __init pci_mmcfg_init(void) | 175 | void __init pci_mmcfg_init(void) |
176 | { | 176 | { |
177 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) | 177 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) |
178 | goto out; | 178 | return; |
179 | 179 | ||
180 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); | 180 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); |
181 | if ((pci_mmcfg_config_num == 0) || | 181 | if ((pci_mmcfg_config_num == 0) || |
182 | (pci_mmcfg_config == NULL) || | 182 | (pci_mmcfg_config == NULL) || |
183 | (pci_mmcfg_config[0].base_address == 0)) | 183 | (pci_mmcfg_config[0].base_address == 0)) |
184 | goto out; | 184 | return; |
185 | 185 | ||
186 | printk(KERN_INFO "PCI: Using MMCONFIG\n"); | 186 | printk(KERN_INFO "PCI: Using MMCONFIG\n"); |
187 | raw_pci_ops = &pci_mmcfg; | 187 | raw_pci_ops = &pci_mmcfg; |
188 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 188 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
189 | 189 | ||
190 | unreachable_devices(); | 190 | unreachable_devices(); |
191 | |||
192 | out: | ||
193 | return 0; | ||
194 | } | 191 | } |
195 | |||
196 | arch_initcall(pci_mmcfg_init); | ||
diff --git a/arch/i386/pci/pcbios.c b/arch/i386/pci/pcbios.c index b9d65f0bc2d1..1eec0868f4b3 100644 --- a/arch/i386/pci/pcbios.c +++ b/arch/i386/pci/pcbios.c | |||
@@ -476,14 +476,12 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq) | |||
476 | } | 476 | } |
477 | EXPORT_SYMBOL(pcibios_set_irq_routing); | 477 | EXPORT_SYMBOL(pcibios_set_irq_routing); |
478 | 478 | ||
479 | static int __init pci_pcbios_init(void) | 479 | void __init pci_pcbios_init(void) |
480 | { | 480 | { |
481 | if ((pci_probe & PCI_PROBE_BIOS) | 481 | if ((pci_probe & PCI_PROBE_BIOS) |
482 | && ((raw_pci_ops = pci_find_bios()))) { | 482 | && ((raw_pci_ops = pci_find_bios()))) { |
483 | pci_probe |= PCI_BIOS_SORT; | 483 | pci_probe |= PCI_BIOS_SORT; |
484 | pci_bios_present = 1; | 484 | pci_bios_present = 1; |
485 | } | 485 | } |
486 | return 0; | ||
487 | } | 486 | } |
488 | 487 | ||
489 | arch_initcall(pci_pcbios_init); | ||
diff --git a/arch/i386/pci/pci.h b/arch/i386/pci/pci.h index f550781ec310..12035e29108b 100644 --- a/arch/i386/pci/pci.h +++ b/arch/i386/pci/pci.h | |||
@@ -80,4 +80,7 @@ extern int pci_conf1_write(unsigned int seg, unsigned int bus, | |||
80 | extern int pci_conf1_read(unsigned int seg, unsigned int bus, | 80 | extern int pci_conf1_read(unsigned int seg, unsigned int bus, |
81 | unsigned int devfn, int reg, int len, u32 *value); | 81 | unsigned int devfn, int reg, int len, u32 *value); |
82 | 82 | ||
83 | extern void pci_direct_init(void); | ||
84 | extern void pci_pcbios_init(void); | ||
85 | extern void pci_mmcfg_init(void); | ||
83 | 86 | ||