diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-15 19:08:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-15 19:08:50 -0400 |
commit | 65a6ec0d72a07f16719e9b7a96e1c4bae044b591 (patch) | |
tree | 344e03a5039a44982c1b78d6113633b21b434820 /arch/arm/kernel | |
parent | 541010e4b8921cd781ff02ae68028501457045b6 (diff) | |
parent | 0181b61a988424b5cc44fe09e6968142359c815e (diff) |
Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (95 commits)
[ARM] 4578/1: CM-x270: PCMCIA support
[ARM] 4577/1: ITE 8152 PCI bridge support
[ARM] 4576/1: CM-X270 machine support
[ARM] pxa: Avoid pxa_gpio_mode() in gpio_direction_{in,out}put()
[ARM] pxa: move pxa_set_mode() from pxa2xx_mainstone.c to mainstone.c
[ARM] pxa: move pxa_set_mode() from pxa2xx_lubbock.c to lubbock.c
[ARM] pxa: Make cpu_is_pxaXXX dependent on configuration symbols
[ARM] pxa: PXA3xx base support
[NET] smc91x: fix PXA DMA support code
[SERIAL] Fix console initialisation ordering
[ARM] pxa: tidy up arch/arm/mach-pxa/Makefile
[ARM] Update arch/arm/Kconfig for drivers/Kconfig changes
[ARM] 4600/1: fix kernel build failure with build-id-supporting binutils
[ARM] 4599/1: Preserve ATAG list for use with kexec (2.6.23)
[ARM] Rename consistent_sync() as dma_cache_maint()
[ARM] 4572/1: ep93xx: add cirrus logic edb9307 support
[ARM] 4596/1: S3C2412: Correct IRQs for SDI+CF and add decoding support
[ARM] 4595/1: ns9xxx: define registers as void __iomem * instead of volatile u32
[ARM] 4594/1: ns9xxx: use the new gpio functions
[ARM] 4593/1: ns9xxx: implement generic clockevents
...
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/bios32.c | 28 | ||||
-rw-r--r-- | arch/arm/kernel/calls.S | 1 | ||||
-rw-r--r-- | arch/arm/kernel/relocate_kernel.S | 29 | ||||
-rw-r--r-- | arch/arm/kernel/setup.c | 51 |
4 files changed, 101 insertions, 8 deletions
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index a2dd930d11ef..e5747547b44c 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c | |||
@@ -279,6 +279,25 @@ static void __devinit pci_fixup_cy82c693(struct pci_dev *dev) | |||
279 | } | 279 | } |
280 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, pci_fixup_cy82c693); | 280 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, pci_fixup_cy82c693); |
281 | 281 | ||
282 | static void __init pci_fixup_it8152(struct pci_dev *dev) | ||
283 | { | ||
284 | int i; | ||
285 | /* fixup for ITE 8152 devices */ | ||
286 | /* FIXME: add defines for class 0x68000 and 0x80103 */ | ||
287 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_HOST || | ||
288 | dev->class == 0x68000 || | ||
289 | dev->class == 0x80103) { | ||
290 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
291 | dev->resource[i].start = 0; | ||
292 | dev->resource[i].end = 0; | ||
293 | dev->resource[i].flags = 0; | ||
294 | } | ||
295 | } | ||
296 | } | ||
297 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8152, pci_fixup_it8152); | ||
298 | |||
299 | |||
300 | |||
282 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | 301 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) |
283 | { | 302 | { |
284 | if (debug_pci) | 303 | if (debug_pci) |
@@ -292,9 +311,12 @@ void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | |||
292 | */ | 311 | */ |
293 | static inline int pdev_bad_for_parity(struct pci_dev *dev) | 312 | static inline int pdev_bad_for_parity(struct pci_dev *dev) |
294 | { | 313 | { |
295 | return (dev->vendor == PCI_VENDOR_ID_INTERG && | 314 | return ((dev->vendor == PCI_VENDOR_ID_INTERG && |
296 | (dev->device == PCI_DEVICE_ID_INTERG_2000 || | 315 | (dev->device == PCI_DEVICE_ID_INTERG_2000 || |
297 | dev->device == PCI_DEVICE_ID_INTERG_2010)); | 316 | dev->device == PCI_DEVICE_ID_INTERG_2010)) || |
317 | (dev->vendor == PCI_VENDOR_ID_ITE && | ||
318 | dev->device == PCI_DEVICE_ID_ITE_8152)); | ||
319 | |||
298 | } | 320 | } |
299 | 321 | ||
300 | /* | 322 | /* |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index a98d0c933db0..cecf658e3625 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -361,6 +361,7 @@ | |||
361 | CALL(sys_signalfd) | 361 | CALL(sys_signalfd) |
362 | /* 350 */ CALL(sys_timerfd) | 362 | /* 350 */ CALL(sys_timerfd) |
363 | CALL(sys_eventfd) | 363 | CALL(sys_eventfd) |
364 | CALL(sys_fallocate) | ||
364 | #ifndef syscalls_counted | 365 | #ifndef syscalls_counted |
365 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 366 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
366 | #define syscalls_counted | 367 | #define syscalls_counted |
diff --git a/arch/arm/kernel/relocate_kernel.S b/arch/arm/kernel/relocate_kernel.S index 7baadae7cb27..062c111c572f 100644 --- a/arch/arm/kernel/relocate_kernel.S +++ b/arch/arm/kernel/relocate_kernel.S | |||
@@ -7,6 +7,23 @@ | |||
7 | .globl relocate_new_kernel | 7 | .globl relocate_new_kernel |
8 | relocate_new_kernel: | 8 | relocate_new_kernel: |
9 | 9 | ||
10 | /* Move boot params back to where the kernel expects them */ | ||
11 | |||
12 | ldr r0,kexec_boot_params_address | ||
13 | teq r0,#0 | ||
14 | beq 8f | ||
15 | |||
16 | ldr r1,kexec_boot_params_copy | ||
17 | mov r6,#KEXEC_BOOT_PARAMS_SIZE/4 | ||
18 | 7: | ||
19 | ldr r5,[r1],#4 | ||
20 | str r5,[r0],#4 | ||
21 | subs r6,r6,#1 | ||
22 | bne 7b | ||
23 | |||
24 | 8: | ||
25 | /* Boot params moved, now go on with the kernel */ | ||
26 | |||
10 | ldr r0,kexec_indirection_page | 27 | ldr r0,kexec_indirection_page |
11 | ldr r1,kexec_start_address | 28 | ldr r1,kexec_start_address |
12 | 29 | ||
@@ -50,7 +67,7 @@ relocate_new_kernel: | |||
50 | mov lr,r1 | 67 | mov lr,r1 |
51 | mov r0,#0 | 68 | mov r0,#0 |
52 | ldr r1,kexec_mach_type | 69 | ldr r1,kexec_mach_type |
53 | mov r2,#0 | 70 | ldr r2,kexec_boot_params_address |
54 | mov pc,lr | 71 | mov pc,lr |
55 | 72 | ||
56 | .globl kexec_start_address | 73 | .globl kexec_start_address |
@@ -65,6 +82,16 @@ kexec_indirection_page: | |||
65 | kexec_mach_type: | 82 | kexec_mach_type: |
66 | .long 0x0 | 83 | .long 0x0 |
67 | 84 | ||
85 | /* phy addr where new kernel will expect to find boot params */ | ||
86 | .globl kexec_boot_params_address | ||
87 | kexec_boot_params_address: | ||
88 | .long 0x0 | ||
89 | |||
90 | /* phy addr where old kernel put a copy of orig boot params */ | ||
91 | .globl kexec_boot_params_copy | ||
92 | kexec_boot_params_copy: | ||
93 | .long 0x0 | ||
94 | |||
68 | relocate_new_kernel_end: | 95 | relocate_new_kernel_end: |
69 | 96 | ||
70 | .globl relocate_new_kernel_size | 97 | .globl relocate_new_kernel_size |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 4de432ec903a..bf56eb337df1 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/smp.h> | 25 | #include <linux/smp.h> |
26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
27 | #include <linux/kexec.h> | ||
27 | 28 | ||
28 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
29 | #include <asm/elf.h> | 30 | #include <asm/elf.h> |
@@ -304,10 +305,23 @@ int cpu_architecture(void) | |||
304 | cpu_arch = (processor_id >> 16) & 7; | 305 | cpu_arch = (processor_id >> 16) & 7; |
305 | if (cpu_arch) | 306 | if (cpu_arch) |
306 | cpu_arch += CPU_ARCH_ARMv3; | 307 | cpu_arch += CPU_ARCH_ARMv3; |
307 | } else { | 308 | } else if ((processor_id & 0x000f0000) == 0x000f0000) { |
308 | /* the revised CPUID */ | 309 | unsigned int mmfr0; |
309 | cpu_arch = ((processor_id >> 12) & 0xf) - 0xb + CPU_ARCH_ARMv6; | 310 | |
310 | } | 311 | /* Revised CPUID format. Read the Memory Model Feature |
312 | * Register 0 and check for VMSAv7 or PMSAv7 */ | ||
313 | asm("mrc p15, 0, %0, c0, c1, 4" | ||
314 | : "=r" (mmfr0)); | ||
315 | if ((mmfr0 & 0x0000000f) == 0x00000003 || | ||
316 | (mmfr0 & 0x000000f0) == 0x00000030) | ||
317 | cpu_arch = CPU_ARCH_ARMv7; | ||
318 | else if ((mmfr0 & 0x0000000f) == 0x00000002 || | ||
319 | (mmfr0 & 0x000000f0) == 0x00000020) | ||
320 | cpu_arch = CPU_ARCH_ARMv6; | ||
321 | else | ||
322 | cpu_arch = CPU_ARCH_UNKNOWN; | ||
323 | } else | ||
324 | cpu_arch = CPU_ARCH_UNKNOWN; | ||
311 | 325 | ||
312 | return cpu_arch; | 326 | return cpu_arch; |
313 | } | 327 | } |
@@ -770,6 +784,23 @@ static int __init customize_machine(void) | |||
770 | } | 784 | } |
771 | arch_initcall(customize_machine); | 785 | arch_initcall(customize_machine); |
772 | 786 | ||
787 | #ifdef CONFIG_KEXEC | ||
788 | |||
789 | /* Physical addr of where the boot params should be for this machine */ | ||
790 | extern unsigned long kexec_boot_params_address; | ||
791 | |||
792 | /* Physical addr of the buffer into which the boot params are copied */ | ||
793 | extern unsigned long kexec_boot_params_copy; | ||
794 | |||
795 | /* Pointer to the boot params buffer, for manipulation and display */ | ||
796 | unsigned long kexec_boot_params; | ||
797 | EXPORT_SYMBOL(kexec_boot_params); | ||
798 | |||
799 | /* The buffer itself - make sure it is sized correctly */ | ||
800 | static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4]; | ||
801 | |||
802 | #endif | ||
803 | |||
773 | void __init setup_arch(char **cmdline_p) | 804 | void __init setup_arch(char **cmdline_p) |
774 | { | 805 | { |
775 | struct tag *tags = (struct tag *)&init_tags; | 806 | struct tag *tags = (struct tag *)&init_tags; |
@@ -788,6 +819,18 @@ void __init setup_arch(char **cmdline_p) | |||
788 | else if (mdesc->boot_params) | 819 | else if (mdesc->boot_params) |
789 | tags = phys_to_virt(mdesc->boot_params); | 820 | tags = phys_to_virt(mdesc->boot_params); |
790 | 821 | ||
822 | #ifdef CONFIG_KEXEC | ||
823 | kexec_boot_params_copy = virt_to_phys(kexec_boot_params_buf); | ||
824 | kexec_boot_params = (unsigned long)kexec_boot_params_buf; | ||
825 | if (__atags_pointer) { | ||
826 | kexec_boot_params_address = __atags_pointer; | ||
827 | memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||
828 | } else if (mdesc->boot_params) { | ||
829 | kexec_boot_params_address = mdesc->boot_params; | ||
830 | memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||
831 | } | ||
832 | #endif | ||
833 | |||
791 | /* | 834 | /* |
792 | * If we have the old style parameters, convert them to | 835 | * If we have the old style parameters, convert them to |
793 | * a tag list. | 836 | * a tag list. |