diff options
Diffstat (limited to 'arch')
48 files changed, 674 insertions, 285 deletions
diff --git a/arch/avr32/boards/atstk1000/setup.c b/arch/avr32/boards/atstk1000/setup.c index 191ab85de9a3..272c011802a7 100644 --- a/arch/avr32/boards/atstk1000/setup.c +++ b/arch/avr32/boards/atstk1000/setup.c | |||
@@ -21,15 +21,6 @@ struct tag *bootloader_tags __initdata; | |||
21 | 21 | ||
22 | struct lcdc_platform_data __initdata atstk1000_fb0_data; | 22 | struct lcdc_platform_data __initdata atstk1000_fb0_data; |
23 | 23 | ||
24 | asmlinkage void __init board_early_init(void) | ||
25 | { | ||
26 | extern void sdram_init(void); | ||
27 | |||
28 | #ifdef CONFIG_LOADER_STANDALONE | ||
29 | sdram_init(); | ||
30 | #endif | ||
31 | } | ||
32 | |||
33 | void __init board_setup_fbmem(unsigned long fbmem_start, | 24 | void __init board_setup_fbmem(unsigned long fbmem_start, |
34 | unsigned long fbmem_size) | 25 | unsigned long fbmem_size) |
35 | { | 26 | { |
diff --git a/arch/avr32/kernel/head.S b/arch/avr32/kernel/head.S index 773b7ad87be9..6163bd0acb95 100644 --- a/arch/avr32/kernel/head.S +++ b/arch/avr32/kernel/head.S | |||
@@ -30,9 +30,6 @@ kernel_entry: | |||
30 | mov r7, 0 | 30 | mov r7, 0 |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | /* Set up the PIO, SDRAM controller, early printk, etc. */ | ||
34 | rcall board_early_init | ||
35 | |||
36 | /* Start the show */ | 33 | /* Start the show */ |
37 | lddpc pc, kernel_start_addr | 34 | lddpc pc, kernel_start_addr |
38 | 35 | ||
diff --git a/arch/avr32/kernel/syscall-stubs.S b/arch/avr32/kernel/syscall-stubs.S index 7589a9b426cb..890286a1e62b 100644 --- a/arch/avr32/kernel/syscall-stubs.S +++ b/arch/avr32/kernel/syscall-stubs.S | |||
@@ -100,3 +100,12 @@ __sys_splice: | |||
100 | rcall sys_splice | 100 | rcall sys_splice |
101 | sub sp, -4 | 101 | sub sp, -4 |
102 | popm pc | 102 | popm pc |
103 | |||
104 | .global __sys_epoll_pwait | ||
105 | .type __sys_epoll_pwait,@function | ||
106 | __sys_epoll_pwait: | ||
107 | pushm lr | ||
108 | st.w --sp, ARG6 | ||
109 | rcall sys_epoll_pwait | ||
110 | sub sp, -4 | ||
111 | popm pc | ||
diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index 63b206965d05..db8f8b55ffdf 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S | |||
@@ -286,4 +286,5 @@ sys_call_table: | |||
286 | .long sys_sync_file_range | 286 | .long sys_sync_file_range |
287 | .long sys_tee | 287 | .long sys_tee |
288 | .long sys_vmsplice | 288 | .long sys_vmsplice |
289 | .long __sys_epoll_pwait /* 265 */ | ||
289 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ | 290 | .long sys_ni_syscall /* r8 is saturated at nr_syscalls */ |
diff --git a/arch/avr32/lib/findbit.S b/arch/avr32/lib/findbit.S index 2b4856f4bf7c..c6b91dee857c 100644 --- a/arch/avr32/lib/findbit.S +++ b/arch/avr32/lib/findbit.S | |||
@@ -136,6 +136,7 @@ ENTRY(generic_find_next_zero_le_bit) | |||
136 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ | 136 | /* offset is not word-aligned. Handle the first (32 - r10) bits */ |
137 | ldswp.w r8, r12[0] | 137 | ldswp.w r8, r12[0] |
138 | sub r12, -4 | 138 | sub r12, -4 |
139 | com r8 | ||
139 | lsr r8, r8, r10 | 140 | lsr r8, r8, r10 |
140 | brne .L_found | 141 | brne .L_found |
141 | 142 | ||
@@ -146,7 +147,7 @@ ENTRY(generic_find_next_zero_le_bit) | |||
146 | 147 | ||
147 | /* Main loop. offset must be word-aligned */ | 148 | /* Main loop. offset must be word-aligned */ |
148 | 1: ldswp.w r8, r12[0] | 149 | 1: ldswp.w r8, r12[0] |
149 | cp.w r8, 0 | 150 | com r8 |
150 | brne .L_found | 151 | brne .L_found |
151 | sub r12, -4 | 152 | sub r12, -4 |
152 | sub r9, 32 | 153 | sub r9, 32 |
diff --git a/arch/avr32/lib/io-readsb.S b/arch/avr32/lib/io-readsb.S index b319d5e71749..2be5da7ed26b 100644 --- a/arch/avr32/lib/io-readsb.S +++ b/arch/avr32/lib/io-readsb.S | |||
@@ -45,3 +45,5 @@ __raw_readsb: | |||
45 | sub r10, 1 | 45 | sub r10, 1 |
46 | st.b r11++, r8 | 46 | st.b r11++, r8 |
47 | brne 3b | 47 | brne 3b |
48 | |||
49 | retal r12 | ||
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index ab974ff97073..22e4c466e5a3 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -70,7 +70,7 @@ static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) { return | |||
70 | 70 | ||
71 | #define PREFIX "ACPI: " | 71 | #define PREFIX "ACPI: " |
72 | 72 | ||
73 | int acpi_noirq __initdata; /* skip ACPI IRQ initialization */ | 73 | int acpi_noirq; /* skip ACPI IRQ initialization */ |
74 | int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */ | 74 | int acpi_pci_disabled __initdata; /* skip ACPI PCI scan and IRQ initialization */ |
75 | int acpi_ht __initdata = 1; /* enable HT */ | 75 | int acpi_ht __initdata = 1; /* enable HT */ |
76 | 76 | ||
diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c index 6d5ace845e44..cdfcf971098b 100644 --- a/arch/i386/pci/common.c +++ b/arch/i386/pci/common.c | |||
@@ -343,7 +343,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
343 | 343 | ||
344 | void pcibios_disable_device (struct pci_dev *dev) | 344 | void pcibios_disable_device (struct pci_dev *dev) |
345 | { | 345 | { |
346 | pcibios_disable_resources(dev); | ||
347 | if (pcibios_disable_irq) | 346 | if (pcibios_disable_irq) |
348 | pcibios_disable_irq(dev); | 347 | pcibios_disable_irq(dev); |
349 | } | 348 | } |
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c index 10154a2cac68..98580292f0d4 100644 --- a/arch/i386/pci/i386.c +++ b/arch/i386/pci/i386.c | |||
@@ -242,15 +242,6 @@ int pcibios_enable_resources(struct pci_dev *dev, int mask) | |||
242 | return 0; | 242 | return 0; |
243 | } | 243 | } |
244 | 244 | ||
245 | void pcibios_disable_resources(struct pci_dev *dev) | ||
246 | { | ||
247 | u16 cmd; | ||
248 | |||
249 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
250 | cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY); | ||
251 | pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
252 | } | ||
253 | |||
254 | /* | 245 | /* |
255 | * If we set up a device for bus mastering, we need to check the latency | 246 | * If we set up a device for bus mastering, we need to check the latency |
256 | * timer as certain crappy BIOSes forget to set it properly. | 247 | * timer as certain crappy BIOSes forget to set it properly. |
diff --git a/arch/i386/pci/pci.h b/arch/i386/pci/pci.h index ad065cebd7b9..a0a25180b61a 100644 --- a/arch/i386/pci/pci.h +++ b/arch/i386/pci/pci.h | |||
@@ -43,7 +43,6 @@ extern unsigned int pcibios_max_latency; | |||
43 | 43 | ||
44 | void pcibios_resource_survey(void); | 44 | void pcibios_resource_survey(void); |
45 | int pcibios_enable_resources(struct pci_dev *, int); | 45 | int pcibios_enable_resources(struct pci_dev *, int); |
46 | void pcibios_disable_resources(struct pci_dev *); | ||
47 | 46 | ||
48 | /* pci-pc.c */ | 47 | /* pci-pc.c */ |
49 | 48 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 74ba76378113..1443024b1c7c 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -408,7 +408,7 @@ config MOMENCO_OCELOT_C | |||
408 | select SWAP_IO_SPACE | 408 | select SWAP_IO_SPACE |
409 | select SYS_HAS_CPU_RM7000 | 409 | select SYS_HAS_CPU_RM7000 |
410 | select SYS_SUPPORTS_32BIT_KERNEL | 410 | select SYS_SUPPORTS_32BIT_KERNEL |
411 | select SYS_SUPPORTS_64BIT_KERNEL if BROKEN | 411 | select SYS_SUPPORTS_64BIT_KERNEL |
412 | select SYS_SUPPORTS_BIG_ENDIAN | 412 | select SYS_SUPPORTS_BIG_ENDIAN |
413 | help | 413 | help |
414 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by | 414 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by |
@@ -425,9 +425,8 @@ config MOMENCO_OCELOT_G | |||
425 | select SWAP_IO_SPACE | 425 | select SWAP_IO_SPACE |
426 | select SYS_HAS_CPU_RM7000 | 426 | select SYS_HAS_CPU_RM7000 |
427 | select SYS_SUPPORTS_32BIT_KERNEL | 427 | select SYS_SUPPORTS_32BIT_KERNEL |
428 | select SYS_SUPPORTS_64BIT_KERNEL | 428 | select SYS_SUPPORTS_64BIT_KERNEL if BROKEN |
429 | select SYS_SUPPORTS_BIG_ENDIAN | 429 | select SYS_SUPPORTS_BIG_ENDIAN |
430 | select ARCH_SPARSEMEM_ENABLE | ||
431 | help | 430 | help |
432 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by | 431 | The Ocelot is a MIPS-based Single Board Computer (SBC) made by |
433 | Momentum Computer <http://www.momenco.com/>. | 432 | Momentum Computer <http://www.momenco.com/>. |
@@ -560,6 +559,7 @@ config SGI_IP27 | |||
560 | select SYS_SUPPORTS_64BIT_KERNEL | 559 | select SYS_SUPPORTS_64BIT_KERNEL |
561 | select SYS_SUPPORTS_BIG_ENDIAN | 560 | select SYS_SUPPORTS_BIG_ENDIAN |
562 | select SYS_SUPPORTS_NUMA | 561 | select SYS_SUPPORTS_NUMA |
562 | select SYS_SUPPORTS_SMP | ||
563 | help | 563 | help |
564 | This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics | 564 | This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics |
565 | workstations. To compile a Linux kernel that runs on these, say Y | 565 | workstations. To compile a Linux kernel that runs on these, say Y |
@@ -1633,9 +1633,6 @@ config ARCH_DISCONTIGMEM_ENABLE | |||
1633 | 1633 | ||
1634 | config ARCH_SPARSEMEM_ENABLE | 1634 | config ARCH_SPARSEMEM_ENABLE |
1635 | bool | 1635 | bool |
1636 | |||
1637 | config ARCH_SPARSEMEM_ENABLE | ||
1638 | bool | ||
1639 | select SPARSEMEM_STATIC | 1636 | select SPARSEMEM_STATIC |
1640 | 1637 | ||
1641 | config NUMA | 1638 | config NUMA |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 641aa30b3638..d580d46f967b 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -63,7 +63,9 @@ cflags-y += -mabi=64 | |||
63 | ifdef CONFIG_BUILD_ELF64 | 63 | ifdef CONFIG_BUILD_ELF64 |
64 | cflags-y += $(call cc-option,-mno-explicit-relocs) | 64 | cflags-y += $(call cc-option,-mno-explicit-relocs) |
65 | else | 65 | else |
66 | cflags-y += $(call cc-option,-msym32) | 66 | # -msym32 can not be used for modules since they are loaded into XKSEG |
67 | CFLAGS_MODULE += $(call cc-option,-mno-explicit-relocs) | ||
68 | CFLAGS_KERNEL += $(call cc-option,-msym32) | ||
67 | endif | 69 | endif |
68 | endif | 70 | endif |
69 | 71 | ||
diff --git a/arch/mips/gt64120/common/time.c b/arch/mips/gt64120/common/time.c index c83ae6acd601..c47eeb768192 100644 --- a/arch/mips/gt64120/common/time.c +++ b/arch/mips/gt64120/common/time.c | |||
@@ -64,14 +64,14 @@ static irqreturn_t gt64120_irq(int irq, void *dev_id) | |||
64 | * as *irq (=irq0 in ../kernel/time.c). We will do our own timer interrupt | 64 | * as *irq (=irq0 in ../kernel/time.c). We will do our own timer interrupt |
65 | * handling. | 65 | * handling. |
66 | */ | 66 | */ |
67 | void gt64120_time_init(void) | 67 | void __init plat_timer_setup(struct irqaction *irq) |
68 | { | 68 | { |
69 | static struct irqaction timer; | 69 | static struct irqaction timer; |
70 | 70 | ||
71 | /* Disable timer first */ | 71 | /* Disable timer first */ |
72 | GT_WRITE(GT_TC_CONTROL_OFS, 0); | 72 | GT_WRITE(GT_TC_CONTROL_OFS, 0); |
73 | /* Load timer value for 100 Hz */ | 73 | /* Load timer value for 100 Hz */ |
74 | GT_WRITE(GT_TC3_OFS, Sys_clock / 100); | 74 | GT_WRITE(GT_TC3_OFS, Sys_clock / HZ); |
75 | 75 | ||
76 | /* | 76 | /* |
77 | * Create the IRQ structure entry for the timer. Since we're too early | 77 | * Create the IRQ structure entry for the timer. Since we're too early |
diff --git a/arch/mips/gt64120/ev64120/setup.c b/arch/mips/gt64120/ev64120/setup.c index 91c2d3f41617..99c8d42212e2 100644 --- a/arch/mips/gt64120/ev64120/setup.c +++ b/arch/mips/gt64120/ev64120/setup.c | |||
@@ -68,7 +68,6 @@ unsigned long __init prom_free_prom_memory(void) | |||
68 | * Initializes basic routines and structures pointers, memory size (as | 68 | * Initializes basic routines and structures pointers, memory size (as |
69 | * given by the bios and saves the command line. | 69 | * given by the bios and saves the command line. |
70 | */ | 70 | */ |
71 | extern void gt64120_time_init(void); | ||
72 | 71 | ||
73 | void __init plat_mem_setup(void) | 72 | void __init plat_mem_setup(void) |
74 | { | 73 | { |
@@ -76,7 +75,6 @@ void __init plat_mem_setup(void) | |||
76 | _machine_halt = galileo_machine_halt; | 75 | _machine_halt = galileo_machine_halt; |
77 | pm_power_off = galileo_machine_power_off; | 76 | pm_power_off = galileo_machine_power_off; |
78 | 77 | ||
79 | board_time_init = gt64120_time_init; | ||
80 | set_io_port_base(KSEG1); | 78 | set_io_port_base(KSEG1); |
81 | } | 79 | } |
82 | 80 | ||
diff --git a/arch/mips/gt64120/momenco_ocelot/setup.c b/arch/mips/gt64120/momenco_ocelot/setup.c index 0e5bbee2d5b7..94f94ebbda6c 100644 --- a/arch/mips/gt64120/momenco_ocelot/setup.c +++ b/arch/mips/gt64120/momenco_ocelot/setup.c | |||
@@ -70,7 +70,6 @@ extern void momenco_ocelot_restart(char *command); | |||
70 | extern void momenco_ocelot_halt(void); | 70 | extern void momenco_ocelot_halt(void); |
71 | extern void momenco_ocelot_power_off(void); | 71 | extern void momenco_ocelot_power_off(void); |
72 | 72 | ||
73 | extern void gt64120_time_init(void); | ||
74 | extern void momenco_ocelot_irq_setup(void); | 73 | extern void momenco_ocelot_irq_setup(void); |
75 | 74 | ||
76 | static char reset_reason; | 75 | static char reset_reason; |
@@ -156,8 +155,6 @@ void __init plat_mem_setup(void) | |||
156 | void (*l3func)(unsigned long)=KSEG1ADDR(&setup_l3cache); | 155 | void (*l3func)(unsigned long)=KSEG1ADDR(&setup_l3cache); |
157 | unsigned int tmpword; | 156 | unsigned int tmpword; |
158 | 157 | ||
159 | board_time_init = gt64120_time_init; | ||
160 | |||
161 | _machine_restart = momenco_ocelot_restart; | 158 | _machine_restart = momenco_ocelot_restart; |
162 | _machine_halt = momenco_ocelot_halt; | 159 | _machine_halt = momenco_ocelot_halt; |
163 | pm_power_off = momenco_ocelot_power_off; | 160 | pm_power_off = momenco_ocelot_power_off; |
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index dd24434392b6..9b0e49d63d7b 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -26,6 +26,48 @@ | |||
26 | #include <asm/system.h> | 26 | #include <asm/system.h> |
27 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
28 | 28 | ||
29 | static unsigned long irq_map[NR_IRQS / BITS_PER_LONG]; | ||
30 | |||
31 | int __devinit allocate_irqno(void) | ||
32 | { | ||
33 | int irq; | ||
34 | |||
35 | again: | ||
36 | irq = find_first_zero_bit(irq_map, NR_IRQS); | ||
37 | |||
38 | if (irq >= NR_IRQS) | ||
39 | return -ENOSPC; | ||
40 | |||
41 | if (test_and_set_bit(irq, irq_map)) | ||
42 | goto again; | ||
43 | |||
44 | return irq; | ||
45 | } | ||
46 | |||
47 | EXPORT_SYMBOL_GPL(allocate_irqno); | ||
48 | |||
49 | /* | ||
50 | * Allocate the 16 legacy interrupts for i8259 devices. This happens early | ||
51 | * in the kernel initialization so treating allocation failure as BUG() is | ||
52 | * ok. | ||
53 | */ | ||
54 | void __init alloc_legacy_irqno(void) | ||
55 | { | ||
56 | int i; | ||
57 | |||
58 | for (i = 0; i <= 16; i++) | ||
59 | BUG_ON(test_and_set_bit(i, irq_map)); | ||
60 | } | ||
61 | |||
62 | void __devinit free_irqno(unsigned int irq) | ||
63 | { | ||
64 | smp_mb__before_clear_bit(); | ||
65 | clear_bit(irq, irq_map); | ||
66 | smp_mb__after_clear_bit(); | ||
67 | } | ||
68 | |||
69 | EXPORT_SYMBOL_GPL(free_irqno); | ||
70 | |||
29 | /* | 71 | /* |
30 | * 'what should we do if we get a hw irq event on an illegal vector'. | 72 | * 'what should we do if we get a hw irq event on an illegal vector'. |
31 | * each architecture has to answer this themselves. | 73 | * each architecture has to answer this themselves. |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index fdbb508661c5..8f6e89697ccf 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -223,7 +223,11 @@ disable: | |||
223 | 223 | ||
224 | #else /* !CONFIG_BLK_DEV_INITRD */ | 224 | #else /* !CONFIG_BLK_DEV_INITRD */ |
225 | 225 | ||
226 | #define init_initrd() 0 | 226 | static unsigned long __init init_initrd(void) |
227 | { | ||
228 | return 0; | ||
229 | } | ||
230 | |||
227 | #define finalize_initrd() do {} while (0) | 231 | #define finalize_initrd() do {} while (0) |
228 | 232 | ||
229 | #endif | 233 | #endif |
diff --git a/arch/mips/mm/c-sb1.c b/arch/mips/mm/c-sb1.c index ea49a775bf28..d0ddb4a768a5 100644 --- a/arch/mips/mm/c-sb1.c +++ b/arch/mips/mm/c-sb1.c | |||
@@ -505,5 +505,5 @@ void sb1_cache_init(void) | |||
505 | : | 505 | : |
506 | : "memory"); | 506 | : "memory"); |
507 | 507 | ||
508 | flush_cache_all(); | 508 | local_sb1___flush_cache_all(); |
509 | } | 509 | } |
diff --git a/arch/mips/momentum/ocelot_3/Makefile b/arch/mips/momentum/ocelot_3/Makefile index 8bcea64dd27b..d5a090a85a15 100644 --- a/arch/mips/momentum/ocelot_3/Makefile +++ b/arch/mips/momentum/ocelot_3/Makefile | |||
@@ -5,4 +5,4 @@ | |||
5 | # removes any old dependencies. DON'T put your own dependencies here | 5 | # removes any old dependencies. DON'T put your own dependencies here |
6 | # unless it's something special (ie not a .c file). | 6 | # unless it's something special (ie not a .c file). |
7 | # | 7 | # |
8 | obj-y += irq.o prom.o reset.o setup.o | 8 | obj-y += irq.o platform.o prom.o reset.o setup.o |
diff --git a/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h b/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h index 227e429fe720..5710a9029f1c 100644 --- a/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h +++ b/arch/mips/momentum/ocelot_3/ocelot_3_fpga.h | |||
@@ -51,7 +51,9 @@ | |||
51 | 51 | ||
52 | extern unsigned long ocelot_fpga_base; | 52 | extern unsigned long ocelot_fpga_base; |
53 | 53 | ||
54 | #define OCELOT_FPGA_WRITE(x, y) writeb(x, ocelot_fpga_base + OCELOT_3_REG_##y) | 54 | #define __FPGA_REG_TO_ADDR(reg) \ |
55 | #define OCELOT_FPGA_READ(x) readb(ocelot_fpga_base + OCELOT_3_REG_##x) | 55 | ((void *) ocelot_fpga_base + OCELOT_3_REG_##reg) |
56 | #define OCELOT_FPGA_WRITE(x, reg) writeb(x, __FPGA_REG_TO_ADDR(reg)) | ||
57 | #define OCELOT_FPGA_READ(reg) readb(__FPGA_REG_TO_ADDR(reg)) | ||
56 | 58 | ||
57 | #endif | 59 | #endif |
diff --git a/arch/mips/momentum/ocelot_3/platform.c b/arch/mips/momentum/ocelot_3/platform.c new file mode 100644 index 000000000000..eefe5841fbb2 --- /dev/null +++ b/arch/mips/momentum/ocelot_3/platform.c | |||
@@ -0,0 +1,235 @@ | |||
1 | #include <linux/delay.h> | ||
2 | #include <linux/if_ether.h> | ||
3 | #include <linux/ioport.h> | ||
4 | #include <linux/mv643xx.h> | ||
5 | #include <linux/platform_device.h> | ||
6 | |||
7 | #include "ocelot_3_fpga.h" | ||
8 | |||
9 | #if defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) | ||
10 | |||
11 | static struct resource mv643xx_eth_shared_resources[] = { | ||
12 | [0] = { | ||
13 | .name = "ethernet shared base", | ||
14 | .start = 0xf1000000 + MV643XX_ETH_SHARED_REGS, | ||
15 | .end = 0xf1000000 + MV643XX_ETH_SHARED_REGS + | ||
16 | MV643XX_ETH_SHARED_REGS_SIZE - 1, | ||
17 | .flags = IORESOURCE_MEM, | ||
18 | }, | ||
19 | }; | ||
20 | |||
21 | static struct platform_device mv643xx_eth_shared_device = { | ||
22 | .name = MV643XX_ETH_SHARED_NAME, | ||
23 | .id = 0, | ||
24 | .num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources), | ||
25 | .resource = mv643xx_eth_shared_resources, | ||
26 | }; | ||
27 | |||
28 | #define MV_SRAM_BASE 0xfe000000UL | ||
29 | #define MV_SRAM_SIZE (256 * 1024) | ||
30 | |||
31 | #define MV_SRAM_RXRING_SIZE (MV_SRAM_SIZE / 4) | ||
32 | #define MV_SRAM_TXRING_SIZE (MV_SRAM_SIZE / 4) | ||
33 | |||
34 | #define MV_SRAM_BASE_ETH0 MV_SRAM_BASE | ||
35 | #define MV_SRAM_BASE_ETH1 (MV_SRAM_BASE + (MV_SRAM_SIZE / 2)) | ||
36 | |||
37 | #define MV64x60_IRQ_ETH_0 48 | ||
38 | #define MV64x60_IRQ_ETH_1 49 | ||
39 | #define MV64x60_IRQ_ETH_2 50 | ||
40 | |||
41 | #ifdef CONFIG_MV643XX_ETH_0 | ||
42 | |||
43 | static struct resource mv64x60_eth0_resources[] = { | ||
44 | [0] = { | ||
45 | .name = "eth0 irq", | ||
46 | .start = MV64x60_IRQ_ETH_0, | ||
47 | .end = MV64x60_IRQ_ETH_0, | ||
48 | .flags = IORESOURCE_IRQ, | ||
49 | }, | ||
50 | }; | ||
51 | |||
52 | static char eth0_mac_addr[ETH_ALEN]; | ||
53 | |||
54 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
55 | .mac_addr = eth0_mac_addr, | ||
56 | |||
57 | .tx_sram_addr = MV_SRAM_BASE_ETH0, | ||
58 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
59 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
60 | |||
61 | .rx_sram_addr = MV_SRAM_BASE_ETH0 + MV_SRAM_TXRING_SIZE, | ||
62 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
63 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
64 | }; | ||
65 | |||
66 | static struct platform_device eth0_device = { | ||
67 | .name = MV643XX_ETH_NAME, | ||
68 | .id = 0, | ||
69 | .num_resources = ARRAY_SIZE(mv64x60_eth0_resources), | ||
70 | .resource = mv64x60_eth0_resources, | ||
71 | .dev = { | ||
72 | .platform_data = ð0_pd, | ||
73 | }, | ||
74 | }; | ||
75 | #endif /* CONFIG_MV643XX_ETH_0 */ | ||
76 | |||
77 | #ifdef CONFIG_MV643XX_ETH_1 | ||
78 | |||
79 | static struct resource mv64x60_eth1_resources[] = { | ||
80 | [0] = { | ||
81 | .name = "eth1 irq", | ||
82 | .start = MV64x60_IRQ_ETH_1, | ||
83 | .end = MV64x60_IRQ_ETH_1, | ||
84 | .flags = IORESOURCE_IRQ, | ||
85 | }, | ||
86 | }; | ||
87 | |||
88 | static char eth1_mac_addr[ETH_ALEN]; | ||
89 | |||
90 | static struct mv643xx_eth_platform_data eth1_pd = { | ||
91 | .mac_addr = eth1_mac_addr, | ||
92 | |||
93 | .tx_sram_addr = MV_SRAM_BASE_ETH1, | ||
94 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
95 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
96 | |||
97 | .rx_sram_addr = MV_SRAM_BASE_ETH1 + MV_SRAM_TXRING_SIZE, | ||
98 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
99 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
100 | }; | ||
101 | |||
102 | static struct platform_device eth1_device = { | ||
103 | .name = MV643XX_ETH_NAME, | ||
104 | .id = 1, | ||
105 | .num_resources = ARRAY_SIZE(mv64x60_eth1_resources), | ||
106 | .resource = mv64x60_eth1_resources, | ||
107 | .dev = { | ||
108 | .platform_data = ð1_pd, | ||
109 | }, | ||
110 | }; | ||
111 | #endif /* CONFIG_MV643XX_ETH_1 */ | ||
112 | |||
113 | #ifdef CONFIG_MV643XX_ETH_2 | ||
114 | |||
115 | static struct resource mv64x60_eth2_resources[] = { | ||
116 | [0] = { | ||
117 | .name = "eth2 irq", | ||
118 | .start = MV64x60_IRQ_ETH_2, | ||
119 | .end = MV64x60_IRQ_ETH_2, | ||
120 | .flags = IORESOURCE_IRQ, | ||
121 | }, | ||
122 | }; | ||
123 | |||
124 | static char eth2_mac_addr[ETH_ALEN]; | ||
125 | |||
126 | static struct mv643xx_eth_platform_data eth2_pd = { | ||
127 | .mac_addr = eth2_mac_addr, | ||
128 | }; | ||
129 | |||
130 | static struct platform_device eth2_device = { | ||
131 | .name = MV643XX_ETH_NAME, | ||
132 | .id = 1, | ||
133 | .num_resources = ARRAY_SIZE(mv64x60_eth2_resources), | ||
134 | .resource = mv64x60_eth2_resources, | ||
135 | .dev = { | ||
136 | .platform_data = ð2_pd, | ||
137 | }, | ||
138 | }; | ||
139 | #endif /* CONFIG_MV643XX_ETH_2 */ | ||
140 | |||
141 | static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | ||
142 | &mv643xx_eth_shared_device, | ||
143 | #ifdef CONFIG_MV643XX_ETH_0 | ||
144 | ð0_device, | ||
145 | #endif | ||
146 | #ifdef CONFIG_MV643XX_ETH_1 | ||
147 | ð1_device, | ||
148 | #endif | ||
149 | #ifdef CONFIG_MV643XX_ETH_2 | ||
150 | ð2_device, | ||
151 | #endif | ||
152 | }; | ||
153 | |||
154 | static u8 __init exchange_bit(u8 val, u8 cs) | ||
155 | { | ||
156 | /* place the data */ | ||
157 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
158 | udelay(1); | ||
159 | |||
160 | /* turn the clock on */ | ||
161 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
162 | udelay(1); | ||
163 | |||
164 | /* turn the clock off and read-strobe */ | ||
165 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
166 | |||
167 | /* return the data */ | ||
168 | return (OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1; | ||
169 | } | ||
170 | |||
171 | static void __init get_mac(char dest[6]) | ||
172 | { | ||
173 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
174 | int i,j; | ||
175 | |||
176 | for (i = 0; i < 12; i++) | ||
177 | exchange_bit(read_opcode[i], 1); | ||
178 | |||
179 | for (j = 0; j < 6; j++) { | ||
180 | dest[j] = 0; | ||
181 | for (i = 0; i < 8; i++) { | ||
182 | dest[j] <<= 1; | ||
183 | dest[j] |= exchange_bit(0, 1); | ||
184 | } | ||
185 | } | ||
186 | |||
187 | /* turn off CS */ | ||
188 | exchange_bit(0,0); | ||
189 | } | ||
190 | |||
191 | /* | ||
192 | * Copy and increment ethernet MAC address by a small value. | ||
193 | * | ||
194 | * This is useful for systems where the only one MAC address is stored in | ||
195 | * non-volatile memory for multiple ports. | ||
196 | */ | ||
197 | static inline void eth_mac_add(unsigned char *dst, unsigned char *src, | ||
198 | unsigned int add) | ||
199 | { | ||
200 | int i; | ||
201 | |||
202 | BUG_ON(add >= 256); | ||
203 | |||
204 | for (i = ETH_ALEN; i >= 0; i--) { | ||
205 | dst[i] = src[i] + add; | ||
206 | add = dst[i] < src[i]; /* compute carry */ | ||
207 | } | ||
208 | |||
209 | WARN_ON(add); | ||
210 | } | ||
211 | |||
212 | static int __init mv643xx_eth_add_pds(void) | ||
213 | { | ||
214 | unsigned char mac[ETH_ALEN]; | ||
215 | int ret; | ||
216 | |||
217 | get_mac(mac); | ||
218 | #ifdef CONFIG_MV643XX_ETH_0 | ||
219 | eth_mac_add(eth1_mac_addr, mac, 0); | ||
220 | #endif | ||
221 | #ifdef CONFIG_MV643XX_ETH_1 | ||
222 | eth_mac_add(eth1_mac_addr, mac, 1); | ||
223 | #endif | ||
224 | #ifdef CONFIG_MV643XX_ETH_2 | ||
225 | eth_mac_add(eth2_mac_addr, mac, 2); | ||
226 | #endif | ||
227 | ret = platform_add_devices(mv643xx_eth_pd_devs, | ||
228 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
229 | |||
230 | return ret; | ||
231 | } | ||
232 | |||
233 | device_initcall(mv643xx_eth_add_pds); | ||
234 | |||
235 | #endif /* defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) */ | ||
diff --git a/arch/mips/momentum/ocelot_3/prom.c b/arch/mips/momentum/ocelot_3/prom.c index 296d945bc248..6ce9b7fdb824 100644 --- a/arch/mips/momentum/ocelot_3/prom.c +++ b/arch/mips/momentum/ocelot_3/prom.c | |||
@@ -34,64 +34,11 @@ struct callvectors* debug_vectors; | |||
34 | extern unsigned long marvell_base; | 34 | extern unsigned long marvell_base; |
35 | extern unsigned long cpu_clock; | 35 | extern unsigned long cpu_clock; |
36 | 36 | ||
37 | #ifdef CONFIG_MV643XX_ETH | ||
38 | extern unsigned char prom_mac_addr_base[6]; | ||
39 | #endif | ||
40 | |||
41 | const char *get_system_type(void) | 37 | const char *get_system_type(void) |
42 | { | 38 | { |
43 | return "Momentum Ocelot-3"; | 39 | return "Momentum Ocelot-3"; |
44 | } | 40 | } |
45 | 41 | ||
46 | #ifdef CONFIG_MV643XX_ETH | ||
47 | void burn_clocks(void) | ||
48 | { | ||
49 | int i; | ||
50 | |||
51 | /* this loop should burn at least 1us -- this should be plenty */ | ||
52 | for (i = 0; i < 0x10000; i++) | ||
53 | ; | ||
54 | } | ||
55 | |||
56 | u8 exchange_bit(u8 val, u8 cs) | ||
57 | { | ||
58 | /* place the data */ | ||
59 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
60 | burn_clocks(); | ||
61 | |||
62 | /* turn the clock on */ | ||
63 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
64 | burn_clocks(); | ||
65 | |||
66 | /* turn the clock off and read-strobe */ | ||
67 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
68 | |||
69 | /* return the data */ | ||
70 | return ((OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1); | ||
71 | } | ||
72 | |||
73 | void get_mac(char dest[6]) | ||
74 | { | ||
75 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
76 | int i,j; | ||
77 | |||
78 | for (i = 0; i < 12; i++) | ||
79 | exchange_bit(read_opcode[i], 1); | ||
80 | |||
81 | for (j = 0; j < 6; j++) { | ||
82 | dest[j] = 0; | ||
83 | for (i = 0; i < 8; i++) { | ||
84 | dest[j] <<= 1; | ||
85 | dest[j] |= exchange_bit(0, 1); | ||
86 | } | ||
87 | } | ||
88 | |||
89 | /* turn off CS */ | ||
90 | exchange_bit(0,0); | ||
91 | } | ||
92 | #endif | ||
93 | |||
94 | |||
95 | #ifdef CONFIG_64BIT | 42 | #ifdef CONFIG_64BIT |
96 | 43 | ||
97 | unsigned long signext(unsigned long addr) | 44 | unsigned long signext(unsigned long addr) |
@@ -228,11 +175,6 @@ void __init prom_init(void) | |||
228 | mips_machgroup = MACH_GROUP_MOMENCO; | 175 | mips_machgroup = MACH_GROUP_MOMENCO; |
229 | mips_machtype = MACH_MOMENCO_OCELOT_3; | 176 | mips_machtype = MACH_MOMENCO_OCELOT_3; |
230 | 177 | ||
231 | #ifdef CONFIG_MV643XX_ETH | ||
232 | /* get the base MAC address for on-board ethernet ports */ | ||
233 | get_mac(prom_mac_addr_base); | ||
234 | #endif | ||
235 | |||
236 | #ifndef CONFIG_64BIT | 178 | #ifndef CONFIG_64BIT |
237 | debug_vectors->printf("Booting Linux kernel...\n"); | 179 | debug_vectors->printf("Booting Linux kernel...\n"); |
238 | #endif | 180 | #endif |
diff --git a/arch/mips/momentum/ocelot_3/setup.c b/arch/mips/momentum/ocelot_3/setup.c index 7d74f8c54129..ff0829f81116 100644 --- a/arch/mips/momentum/ocelot_3/setup.c +++ b/arch/mips/momentum/ocelot_3/setup.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * BRIEF MODULE DESCRIPTION | 4 | * BRIEF MODULE DESCRIPTION |
5 | * Momentum Computer Ocelot-3 board dependent boot routines | 5 | * Momentum Computer Ocelot-3 board dependent boot routines |
6 | * | 6 | * |
7 | * Copyright (C) 1996, 1997, 01, 05 Ralf Baechle | 7 | * Copyright (C) 1996, 1997, 01, 05 - 06 Ralf Baechle |
8 | * Copyright (C) 2000 RidgeRun, Inc. | 8 | * Copyright (C) 2000 RidgeRun, Inc. |
9 | * Copyright (C) 2001 Red Hat, Inc. | 9 | * Copyright (C) 2001 Red Hat, Inc. |
10 | * Copyright (C) 2002 Momentum Computer | 10 | * Copyright (C) 2002 Momentum Computer |
diff --git a/arch/mips/momentum/ocelot_c/Makefile b/arch/mips/momentum/ocelot_c/Makefile index 94802b4db472..d69161aa1675 100644 --- a/arch/mips/momentum/ocelot_c/Makefile +++ b/arch/mips/momentum/ocelot_c/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for Momentum Computer's Ocelot-C and -CS boards. | 2 | # Makefile for Momentum Computer's Ocelot-C and -CS boards. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += cpci-irq.o irq.o prom.o reset.o \ | 5 | obj-y += cpci-irq.o irq.o platform.o prom.o reset.o \ |
6 | setup.o uart-irq.o | 6 | setup.o uart-irq.o |
7 | 7 | ||
8 | obj-$(CONFIG_KGDB) += dbg_io.o | 8 | obj-$(CONFIG_KGDB) += dbg_io.o |
diff --git a/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h b/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h index 7228cd19e5ea..f0f5581dcb50 100644 --- a/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h +++ b/arch/mips/momentum/ocelot_c/ocelot_c_fpga.h | |||
@@ -53,7 +53,9 @@ | |||
53 | #define OCELOT_C_REG_INTSET 0xe | 53 | #define OCELOT_C_REG_INTSET 0xe |
54 | #define OCELOT_C_REG_INTCLR 0xf | 54 | #define OCELOT_C_REG_INTCLR 0xf |
55 | 55 | ||
56 | #define OCELOT_FPGA_WRITE(x, y) writeb(x, OCELOT_C_CS0_ADDR + OCELOT_C_REG_##y) | 56 | #define __FPGA_REG_TO_ADDR(reg) \ |
57 | #define OCELOT_FPGA_READ(x) readb(OCELOT_C_CS0_ADDR + OCELOT_C_REG_##x) | 57 | ((void *) OCELOT_C_CS0_ADDR + OCELOT_C_REG_##reg) |
58 | #define OCELOT_FPGA_WRITE(x, reg) writeb(x, __FPGA_REG_TO_ADDR(reg)) | ||
59 | #define OCELOT_FPGA_READ(reg) readb(__FPGA_REG_TO_ADDR(reg)) | ||
58 | 60 | ||
59 | #endif | 61 | #endif |
diff --git a/arch/mips/momentum/ocelot_c/platform.c b/arch/mips/momentum/ocelot_c/platform.c new file mode 100644 index 000000000000..6c495b2f1560 --- /dev/null +++ b/arch/mips/momentum/ocelot_c/platform.c | |||
@@ -0,0 +1,201 @@ | |||
1 | #include <linux/delay.h> | ||
2 | #include <linux/if_ether.h> | ||
3 | #include <linux/ioport.h> | ||
4 | #include <linux/mv643xx.h> | ||
5 | #include <linux/platform_device.h> | ||
6 | |||
7 | #include "ocelot_c_fpga.h" | ||
8 | |||
9 | #if defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) | ||
10 | |||
11 | static struct resource mv643xx_eth_shared_resources[] = { | ||
12 | [0] = { | ||
13 | .name = "ethernet shared base", | ||
14 | .start = 0xf1000000 + MV643XX_ETH_SHARED_REGS, | ||
15 | .end = 0xf1000000 + MV643XX_ETH_SHARED_REGS + | ||
16 | MV643XX_ETH_SHARED_REGS_SIZE - 1, | ||
17 | .flags = IORESOURCE_MEM, | ||
18 | }, | ||
19 | }; | ||
20 | |||
21 | static struct platform_device mv643xx_eth_shared_device = { | ||
22 | .name = MV643XX_ETH_SHARED_NAME, | ||
23 | .id = 0, | ||
24 | .num_resources = ARRAY_SIZE(mv643xx_eth_shared_resources), | ||
25 | .resource = mv643xx_eth_shared_resources, | ||
26 | }; | ||
27 | |||
28 | #define MV_SRAM_BASE 0xfe000000UL | ||
29 | #define MV_SRAM_SIZE (256 * 1024) | ||
30 | |||
31 | #define MV_SRAM_RXRING_SIZE (MV_SRAM_SIZE / 4) | ||
32 | #define MV_SRAM_TXRING_SIZE (MV_SRAM_SIZE / 4) | ||
33 | |||
34 | #define MV_SRAM_BASE_ETH0 MV_SRAM_BASE | ||
35 | #define MV_SRAM_BASE_ETH1 (MV_SRAM_BASE + (MV_SRAM_SIZE / 2)) | ||
36 | |||
37 | #define MV64x60_IRQ_ETH_0 48 | ||
38 | #define MV64x60_IRQ_ETH_1 49 | ||
39 | |||
40 | #ifdef CONFIG_MV643XX_ETH_0 | ||
41 | |||
42 | static struct resource mv64x60_eth0_resources[] = { | ||
43 | [0] = { | ||
44 | .name = "eth0 irq", | ||
45 | .start = MV64x60_IRQ_ETH_0, | ||
46 | .end = MV64x60_IRQ_ETH_0, | ||
47 | .flags = IORESOURCE_IRQ, | ||
48 | }, | ||
49 | }; | ||
50 | |||
51 | static char eth0_mac_addr[ETH_ALEN]; | ||
52 | |||
53 | static struct mv643xx_eth_platform_data eth0_pd = { | ||
54 | .mac_addr = eth0_mac_addr, | ||
55 | |||
56 | .tx_sram_addr = MV_SRAM_BASE_ETH0, | ||
57 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
58 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
59 | |||
60 | .rx_sram_addr = MV_SRAM_BASE_ETH0 + MV_SRAM_TXRING_SIZE, | ||
61 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
62 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
63 | }; | ||
64 | |||
65 | static struct platform_device eth0_device = { | ||
66 | .name = MV643XX_ETH_NAME, | ||
67 | .id = 0, | ||
68 | .num_resources = ARRAY_SIZE(mv64x60_eth0_resources), | ||
69 | .resource = mv64x60_eth0_resources, | ||
70 | .dev = { | ||
71 | .platform_data = ð0_pd, | ||
72 | }, | ||
73 | }; | ||
74 | #endif /* CONFIG_MV643XX_ETH_0 */ | ||
75 | |||
76 | #ifdef CONFIG_MV643XX_ETH_1 | ||
77 | |||
78 | static struct resource mv64x60_eth1_resources[] = { | ||
79 | [0] = { | ||
80 | .name = "eth1 irq", | ||
81 | .start = MV64x60_IRQ_ETH_1, | ||
82 | .end = MV64x60_IRQ_ETH_1, | ||
83 | .flags = IORESOURCE_IRQ, | ||
84 | }, | ||
85 | }; | ||
86 | |||
87 | static char eth1_mac_addr[ETH_ALEN]; | ||
88 | |||
89 | static struct mv643xx_eth_platform_data eth1_pd = { | ||
90 | .mac_addr = eth1_mac_addr, | ||
91 | |||
92 | .tx_sram_addr = MV_SRAM_BASE_ETH1, | ||
93 | .tx_sram_size = MV_SRAM_TXRING_SIZE, | ||
94 | .tx_queue_size = MV_SRAM_TXRING_SIZE / 16, | ||
95 | |||
96 | .rx_sram_addr = MV_SRAM_BASE_ETH1 + MV_SRAM_TXRING_SIZE, | ||
97 | .rx_sram_size = MV_SRAM_RXRING_SIZE, | ||
98 | .rx_queue_size = MV_SRAM_RXRING_SIZE / 16, | ||
99 | }; | ||
100 | |||
101 | static struct platform_device eth1_device = { | ||
102 | .name = MV643XX_ETH_NAME, | ||
103 | .id = 1, | ||
104 | .num_resources = ARRAY_SIZE(mv64x60_eth1_resources), | ||
105 | .resource = mv64x60_eth1_resources, | ||
106 | .dev = { | ||
107 | .platform_data = ð1_pd, | ||
108 | }, | ||
109 | }; | ||
110 | #endif /* CONFIG_MV643XX_ETH_1 */ | ||
111 | |||
112 | static struct platform_device *mv643xx_eth_pd_devs[] __initdata = { | ||
113 | &mv643xx_eth_shared_device, | ||
114 | #ifdef CONFIG_MV643XX_ETH_0 | ||
115 | ð0_device, | ||
116 | #endif | ||
117 | #ifdef CONFIG_MV643XX_ETH_1 | ||
118 | ð1_device, | ||
119 | #endif | ||
120 | /* The third port is not wired up on the Ocelot C */ | ||
121 | }; | ||
122 | |||
123 | static u8 __init exchange_bit(u8 val, u8 cs) | ||
124 | { | ||
125 | /* place the data */ | ||
126 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
127 | udelay(1); | ||
128 | |||
129 | /* turn the clock on */ | ||
130 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
131 | udelay(1); | ||
132 | |||
133 | /* turn the clock off and read-strobe */ | ||
134 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
135 | |||
136 | /* return the data */ | ||
137 | return (OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1; | ||
138 | } | ||
139 | |||
140 | static void __init get_mac(char dest[6]) | ||
141 | { | ||
142 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
143 | int i,j; | ||
144 | |||
145 | for (i = 0; i < 12; i++) | ||
146 | exchange_bit(read_opcode[i], 1); | ||
147 | |||
148 | for (j = 0; j < 6; j++) { | ||
149 | dest[j] = 0; | ||
150 | for (i = 0; i < 8; i++) { | ||
151 | dest[j] <<= 1; | ||
152 | dest[j] |= exchange_bit(0, 1); | ||
153 | } | ||
154 | } | ||
155 | |||
156 | /* turn off CS */ | ||
157 | exchange_bit(0,0); | ||
158 | } | ||
159 | |||
160 | /* | ||
161 | * Copy and increment ethernet MAC address by a small value. | ||
162 | * | ||
163 | * This is useful for systems where the only one MAC address is stored in | ||
164 | * non-volatile memory for multiple ports. | ||
165 | */ | ||
166 | static inline void eth_mac_add(unsigned char *dst, unsigned char *src, | ||
167 | unsigned int add) | ||
168 | { | ||
169 | int i; | ||
170 | |||
171 | BUG_ON(add >= 256); | ||
172 | |||
173 | for (i = ETH_ALEN; i >= 0; i--) { | ||
174 | dst[i] = src[i] + add; | ||
175 | add = dst[i] < src[i]; /* compute carry */ | ||
176 | } | ||
177 | |||
178 | WARN_ON(add); | ||
179 | } | ||
180 | |||
181 | static int __init mv643xx_eth_add_pds(void) | ||
182 | { | ||
183 | unsigned char mac[ETH_ALEN]; | ||
184 | int ret; | ||
185 | |||
186 | get_mac(mac); | ||
187 | #ifdef CONFIG_MV643XX_ETH_0 | ||
188 | eth_mac_add(eth1_mac_addr, mac, 0); | ||
189 | #endif | ||
190 | #ifdef CONFIG_MV643XX_ETH_1 | ||
191 | eth_mac_add(eth1_mac_addr, mac, 1); | ||
192 | #endif | ||
193 | ret = platform_add_devices(mv643xx_eth_pd_devs, | ||
194 | ARRAY_SIZE(mv643xx_eth_pd_devs)); | ||
195 | |||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | device_initcall(mv643xx_eth_add_pds); | ||
200 | |||
201 | #endif /* defined(CONFIG_MV643XX_ETH) || defined(CONFIG_MV643XX_ETH_MODULE) */ | ||
diff --git a/arch/mips/momentum/ocelot_c/prom.c b/arch/mips/momentum/ocelot_c/prom.c index 4c50a147f429..d0b77e101d74 100644 --- a/arch/mips/momentum/ocelot_c/prom.c +++ b/arch/mips/momentum/ocelot_c/prom.c | |||
@@ -29,11 +29,7 @@ | |||
29 | struct callvectors* debug_vectors; | 29 | struct callvectors* debug_vectors; |
30 | 30 | ||
31 | extern unsigned long marvell_base; | 31 | extern unsigned long marvell_base; |
32 | extern unsigned long cpu_clock; | 32 | extern unsigned int cpu_clock; |
33 | |||
34 | #ifdef CONFIG_MV643XX_ETH | ||
35 | extern unsigned char prom_mac_addr_base[6]; | ||
36 | #endif | ||
37 | 33 | ||
38 | const char *get_system_type(void) | 34 | const char *get_system_type(void) |
39 | { | 35 | { |
@@ -44,55 +40,6 @@ const char *get_system_type(void) | |||
44 | #endif | 40 | #endif |
45 | } | 41 | } |
46 | 42 | ||
47 | #ifdef CONFIG_MV643XX_ETH | ||
48 | static void burn_clocks(void) | ||
49 | { | ||
50 | int i; | ||
51 | |||
52 | /* this loop should burn at least 1us -- this should be plenty */ | ||
53 | for (i = 0; i < 0x10000; i++) | ||
54 | ; | ||
55 | } | ||
56 | |||
57 | static u8 exchange_bit(u8 val, u8 cs) | ||
58 | { | ||
59 | /* place the data */ | ||
60 | OCELOT_FPGA_WRITE((val << 2) | cs, EEPROM_MODE); | ||
61 | burn_clocks(); | ||
62 | |||
63 | /* turn the clock on */ | ||
64 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x2, EEPROM_MODE); | ||
65 | burn_clocks(); | ||
66 | |||
67 | /* turn the clock off and read-strobe */ | ||
68 | OCELOT_FPGA_WRITE((val << 2) | cs | 0x10, EEPROM_MODE); | ||
69 | |||
70 | /* return the data */ | ||
71 | return ((OCELOT_FPGA_READ(EEPROM_MODE) >> 3) & 0x1); | ||
72 | } | ||
73 | |||
74 | void get_mac(char dest[6]) | ||
75 | { | ||
76 | u8 read_opcode[12] = {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; | ||
77 | int i,j; | ||
78 | |||
79 | for (i = 0; i < 12; i++) | ||
80 | exchange_bit(read_opcode[i], 1); | ||
81 | |||
82 | for (j = 0; j < 6; j++) { | ||
83 | dest[j] = 0; | ||
84 | for (i = 0; i < 8; i++) { | ||
85 | dest[j] <<= 1; | ||
86 | dest[j] |= exchange_bit(0, 1); | ||
87 | } | ||
88 | } | ||
89 | |||
90 | /* turn off CS */ | ||
91 | exchange_bit(0,0); | ||
92 | } | ||
93 | #endif | ||
94 | |||
95 | |||
96 | #ifdef CONFIG_64BIT | 43 | #ifdef CONFIG_64BIT |
97 | 44 | ||
98 | unsigned long signext(unsigned long addr) | 45 | unsigned long signext(unsigned long addr) |
@@ -226,11 +173,6 @@ void __init prom_init(void) | |||
226 | mips_machgroup = MACH_GROUP_MOMENCO; | 173 | mips_machgroup = MACH_GROUP_MOMENCO; |
227 | mips_machtype = MACH_MOMENCO_OCELOT_C; | 174 | mips_machtype = MACH_MOMENCO_OCELOT_C; |
228 | 175 | ||
229 | #ifdef CONFIG_MV643XX_ETH | ||
230 | /* get the base MAC address for on-board ethernet ports */ | ||
231 | get_mac(prom_mac_addr_base); | ||
232 | #endif | ||
233 | |||
234 | #ifndef CONFIG_64BIT | 176 | #ifndef CONFIG_64BIT |
235 | debug_vectors->printf("Booting Linux kernel...\n"); | 177 | debug_vectors->printf("Booting Linux kernel...\n"); |
236 | #endif | 178 | #endif |
diff --git a/arch/mips/momentum/ocelot_c/setup.c b/arch/mips/momentum/ocelot_c/setup.c index 9c0c462af650..0b6b2338cfb4 100644 --- a/arch/mips/momentum/ocelot_c/setup.c +++ b/arch/mips/momentum/ocelot_c/setup.c | |||
@@ -69,8 +69,7 @@ | |||
69 | #include "ocelot_c_fpga.h" | 69 | #include "ocelot_c_fpga.h" |
70 | 70 | ||
71 | unsigned long marvell_base; | 71 | unsigned long marvell_base; |
72 | extern unsigned long mv64340_sram_base; | 72 | unsigned int cpu_clock; |
73 | unsigned long cpu_clock; | ||
74 | 73 | ||
75 | /* These functions are used for rebooting or halting the machine*/ | 74 | /* These functions are used for rebooting or halting the machine*/ |
76 | extern void momenco_ocelot_restart(char *command); | 75 | extern void momenco_ocelot_restart(char *command); |
@@ -119,7 +118,6 @@ void PMON_v2_setup(void) | |||
119 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfffffffffe000000, PM_16M); | 118 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfffffffffe000000, PM_16M); |
120 | 119 | ||
121 | marvell_base = 0xfffffffff4000000; | 120 | marvell_base = 0xfffffffff4000000; |
122 | mv64340_sram_base = 0xfffffffffe000000; | ||
123 | #else | 121 | #else |
124 | /* marvell and extra space */ | 122 | /* marvell and extra space */ |
125 | add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000), 0xf4000000, PM_64K); | 123 | add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000), 0xf4000000, PM_64K); |
@@ -129,7 +127,6 @@ void PMON_v2_setup(void) | |||
129 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfe000000, PM_16M); | 127 | add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfe000000, PM_16M); |
130 | 128 | ||
131 | marvell_base = 0xf4000000; | 129 | marvell_base = 0xf4000000; |
132 | mv64340_sram_base = 0xfe000000; | ||
133 | #endif | 130 | #endif |
134 | } | 131 | } |
135 | 132 | ||
@@ -346,22 +343,20 @@ void __init plat_mem_setup(void) | |||
346 | } | 343 | } |
347 | } | 344 | } |
348 | 345 | ||
349 | #ifndef CONFIG_64BIT | 346 | /* |
350 | /* This needs to be one of the first initcalls, because no I/O port access | 347 | * This needs to be one of the first initcalls, because no I/O port access |
351 | can work before this */ | 348 | * can work before this |
349 | */ | ||
352 | static int io_base_ioremap(void) | 350 | static int io_base_ioremap(void) |
353 | { | 351 | { |
354 | /* we're mapping PCI accesses from 0xc0000000 to 0xf0000000 */ | 352 | void __iomem * io_remap_range = ioremap(0xc0000000UL, 0x10000); |
355 | void *io_remap_range = ioremap(0xc0000000, 0x30000000); | ||
356 | 353 | ||
357 | if (!io_remap_range) { | 354 | if (!io_remap_range) |
358 | panic("Could not ioremap I/O port range"); | 355 | panic("Could not ioremap I/O port range"); |
359 | } | 356 | |
360 | printk("io_remap_range set at 0x%08x\n", (uint32_t)io_remap_range); | 357 | set_io_port_base((unsigned long) io_remap_range); |
361 | set_io_port_base(io_remap_range - 0xc0000000); | ||
362 | 358 | ||
363 | return 0; | 359 | return 0; |
364 | } | 360 | } |
365 | 361 | ||
366 | module_init(io_base_ioremap); | 362 | module_init(io_base_ioremap); |
367 | #endif | ||
diff --git a/arch/mips/momentum/ocelot_g/gt-irq.c b/arch/mips/momentum/ocelot_g/gt-irq.c index 7b5cc6648f7e..e5576bd50fa9 100644 --- a/arch/mips/momentum/ocelot_g/gt-irq.c +++ b/arch/mips/momentum/ocelot_g/gt-irq.c | |||
@@ -27,7 +27,7 @@ unsigned long bus_clock; | |||
27 | * be handled and ack'ed differently than other MIPS interrupts. | 27 | * be handled and ack'ed differently than other MIPS interrupts. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #if CURRENTLY_UNUSED | 30 | #if 0 |
31 | 31 | ||
32 | struct tq_struct irq_handlers[MAX_CAUSE_REGS][MAX_CAUSE_REG_WIDTH]; | 32 | struct tq_struct irq_handlers[MAX_CAUSE_REGS][MAX_CAUSE_REG_WIDTH]; |
33 | void hook_irq_handler(int int_cause, int bit_num, void *isr_ptr); | 33 | void hook_irq_handler(int int_cause, int bit_num, void *isr_ptr); |
@@ -95,7 +95,7 @@ int disable_galileo_irq(int int_cause, int bit_num) | |||
95 | return 0; | 95 | return 0; |
96 | return 1; | 96 | return 1; |
97 | } | 97 | } |
98 | #endif /* UNUSED */ | 98 | #endif /* 0 */ |
99 | 99 | ||
100 | /* | 100 | /* |
101 | * Interrupt handler for interrupts coming from the Galileo chip via P0_INT#. | 101 | * Interrupt handler for interrupts coming from the Galileo chip via P0_INT#. |
@@ -196,7 +196,7 @@ void gt64240_time_init(void) | |||
196 | 196 | ||
197 | void gt64240_irq_init(void) | 197 | void gt64240_irq_init(void) |
198 | { | 198 | { |
199 | #if CURRENTLY_UNUSED | 199 | #if 0 |
200 | int i, j; | 200 | int i, j; |
201 | 201 | ||
202 | /* Reset irq handlers pointers to NULL */ | 202 | /* Reset irq handlers pointers to NULL */ |
@@ -208,5 +208,5 @@ void gt64240_irq_init(void) | |||
208 | irq_handlers[i][j].data = NULL; | 208 | irq_handlers[i][j].data = NULL; |
209 | } | 209 | } |
210 | } | 210 | } |
211 | #endif | 211 | #endif /* 0 */ |
212 | } | 212 | } |
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile index 3cf0dd4ba548..70cb55b89df6 100644 --- a/arch/mips/pci/Makefile +++ b/arch/mips/pci/Makefile | |||
@@ -26,7 +26,7 @@ obj-$(CONFIG_DDB5477) += fixup-ddb5477.o pci-ddb5477.o ops-ddb5477.o | |||
26 | obj-$(CONFIG_LASAT) += pci-lasat.o | 26 | obj-$(CONFIG_LASAT) += pci-lasat.o |
27 | obj-$(CONFIG_MIPS_ATLAS) += fixup-atlas.o | 27 | obj-$(CONFIG_MIPS_ATLAS) += fixup-atlas.o |
28 | obj-$(CONFIG_MIPS_COBALT) += fixup-cobalt.o | 28 | obj-$(CONFIG_MIPS_COBALT) += fixup-cobalt.o |
29 | obj-$(CONFIG_MIPS_EV64120) += fixup-ev64120.o | 29 | obj-$(CONFIG_MIPS_EV64120) += pci-ev64120.o |
30 | obj-$(CONFIG_SOC_AU1500) += fixup-au1000.o ops-au1000.o | 30 | obj-$(CONFIG_SOC_AU1500) += fixup-au1000.o ops-au1000.o |
31 | obj-$(CONFIG_SOC_AU1550) += fixup-au1000.o ops-au1000.o | 31 | obj-$(CONFIG_SOC_AU1550) += fixup-au1000.o ops-au1000.o |
32 | obj-$(CONFIG_SOC_PNX8550) += fixup-pnx8550.o ops-pnx8550.o | 32 | obj-$(CONFIG_SOC_PNX8550) += fixup-pnx8550.o ops-pnx8550.o |
diff --git a/arch/mips/pci/fixup-ev64120.c b/arch/mips/pci/fixup-ev64120.c deleted file mode 100644 index 8dbb90d63f0a..000000000000 --- a/arch/mips/pci/fixup-ev64120.c +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | #include <linux/pci.h> | ||
2 | #include <linux/init.h> | ||
3 | |||
4 | int pci_range_ck(unsigned char bus, unsigned char dev) | ||
5 | { | ||
6 | if (((bus == 0) || (bus == 1)) && (dev >= 6) && (dev <= 8)) | ||
7 | return 0; | ||
8 | |||
9 | return -1; | ||
10 | } | ||
11 | |||
12 | /* | ||
13 | * After detecting all agents over the PCI , this function is called | ||
14 | * in order to give an interrupt number for each PCI device starting | ||
15 | * from IRQ 20. It does also enables master for each device. | ||
16 | */ | ||
17 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) | ||
18 | { | ||
19 | unsigned int irq = 20; | ||
20 | struct pci_bus *current_bus = bus; | ||
21 | struct pci_dev *dev; | ||
22 | struct list_head *devices_link; | ||
23 | |||
24 | list_for_each(devices_link, &(current_bus->devices)) { | ||
25 | dev = pci_dev_b(devices_link); | ||
26 | if (dev != NULL) { | ||
27 | dev->irq = irq++; | ||
28 | |||
29 | /* Assign an interrupt number for the device */ | ||
30 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | ||
31 | pcibios_set_master(dev); | ||
32 | } | ||
33 | } | ||
34 | } | ||
diff --git a/arch/mips/pci/pci-ev64120.c b/arch/mips/pci/pci-ev64120.c new file mode 100644 index 000000000000..9cd859ef1842 --- /dev/null +++ b/arch/mips/pci/pci-ev64120.c | |||
@@ -0,0 +1,21 @@ | |||
1 | #include <linux/pci.h> | ||
2 | |||
3 | int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
4 | { | ||
5 | int irq; | ||
6 | |||
7 | if (!pin) | ||
8 | return 0; | ||
9 | |||
10 | irq = allocate_irqno(); | ||
11 | if (irq < 0) | ||
12 | return 0; | ||
13 | |||
14 | return irq; | ||
15 | } | ||
16 | |||
17 | /* Do platform specific device initialization at pci_enable_device() time */ | ||
18 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
19 | { | ||
20 | return 0; | ||
21 | } | ||
diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c index f01ba1f90770..270ecd3e6b4a 100644 --- a/arch/mips/sgi-ip27/ip27-irq.c +++ b/arch/mips/sgi-ip27/ip27-irq.c | |||
@@ -354,29 +354,6 @@ static struct irq_chip bridge_irq_type = { | |||
354 | .end = end_bridge_irq, | 354 | .end = end_bridge_irq, |
355 | }; | 355 | }; |
356 | 356 | ||
357 | static unsigned long irq_map[NR_IRQS / BITS_PER_LONG]; | ||
358 | |||
359 | int allocate_irqno(void) | ||
360 | { | ||
361 | int irq; | ||
362 | |||
363 | again: | ||
364 | irq = find_first_zero_bit(irq_map, NR_IRQS); | ||
365 | |||
366 | if (irq >= NR_IRQS) | ||
367 | return -ENOSPC; | ||
368 | |||
369 | if (test_and_set_bit(irq, irq_map)) | ||
370 | goto again; | ||
371 | |||
372 | return irq; | ||
373 | } | ||
374 | |||
375 | void free_irqno(unsigned int irq) | ||
376 | { | ||
377 | clear_bit(irq, irq_map); | ||
378 | } | ||
379 | |||
380 | void __devinit register_bridge_irq(unsigned int irq) | 357 | void __devinit register_bridge_irq(unsigned int irq) |
381 | { | 358 | { |
382 | irq_desc[irq].status = IRQ_DISABLED; | 359 | irq_desc[irq].status = IRQ_DISABLED; |
diff --git a/arch/mips/sgi-ip27/ip27-timer.c b/arch/mips/sgi-ip27/ip27-timer.c index c965705f3427..5e82a268e3c9 100644 --- a/arch/mips/sgi-ip27/ip27-timer.c +++ b/arch/mips/sgi-ip27/ip27-timer.c | |||
@@ -214,8 +214,6 @@ static struct irqaction rt_irqaction = { | |||
214 | .name = "timer" | 214 | .name = "timer" |
215 | }; | 215 | }; |
216 | 216 | ||
217 | extern int allocate_irqno(void); | ||
218 | |||
219 | void __init plat_timer_setup(struct irqaction *irq) | 217 | void __init plat_timer_setup(struct irqaction *irq) |
220 | { | 218 | { |
221 | int irqno = allocate_irqno(); | 219 | int irqno = allocate_irqno(); |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 608193cfe43f..245b81bc7157 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -236,9 +236,6 @@ config WARN_STACK_SIZE | |||
236 | This allows you to specify the maximum frame size a function may | 236 | This allows you to specify the maximum frame size a function may |
237 | have without the compiler complaining about it. | 237 | have without the compiler complaining about it. |
238 | 238 | ||
239 | config ARCH_POPULATES_NODE_MAP | ||
240 | def_bool y | ||
241 | |||
242 | source "mm/Kconfig" | 239 | source "mm/Kconfig" |
243 | 240 | ||
244 | comment "I/O subsystem configuration" | 241 | comment "I/O subsystem configuration" |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index c313e9a9304f..7cd51e73e274 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -119,7 +119,6 @@ CONFIG_PACK_STACK=y | |||
119 | CONFIG_CHECK_STACK=y | 119 | CONFIG_CHECK_STACK=y |
120 | CONFIG_STACK_GUARD=256 | 120 | CONFIG_STACK_GUARD=256 |
121 | # CONFIG_WARN_STACK is not set | 121 | # CONFIG_WARN_STACK is not set |
122 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
123 | CONFIG_SELECT_MEMORY_MODEL=y | 122 | CONFIG_SELECT_MEMORY_MODEL=y |
124 | CONFIG_FLATMEM_MANUAL=y | 123 | CONFIG_FLATMEM_MANUAL=y |
125 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 124 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 49f2b68e32b1..2aa13e8e000a 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -70,6 +70,7 @@ struct { | |||
70 | #define CHUNK_READ_WRITE 0 | 70 | #define CHUNK_READ_WRITE 0 |
71 | #define CHUNK_READ_ONLY 1 | 71 | #define CHUNK_READ_ONLY 1 |
72 | volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ | 72 | volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ |
73 | unsigned long __initdata zholes_size[MAX_NR_ZONES]; | ||
73 | static unsigned long __initdata memory_end; | 74 | static unsigned long __initdata memory_end; |
74 | 75 | ||
75 | /* | 76 | /* |
@@ -357,6 +358,21 @@ void machine_power_off(void) | |||
357 | */ | 358 | */ |
358 | void (*pm_power_off)(void) = machine_power_off; | 359 | void (*pm_power_off)(void) = machine_power_off; |
359 | 360 | ||
361 | static void __init | ||
362 | add_memory_hole(unsigned long start, unsigned long end) | ||
363 | { | ||
364 | unsigned long dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT; | ||
365 | |||
366 | if (end <= dma_pfn) | ||
367 | zholes_size[ZONE_DMA] += end - start + 1; | ||
368 | else if (start > dma_pfn) | ||
369 | zholes_size[ZONE_NORMAL] += end - start + 1; | ||
370 | else { | ||
371 | zholes_size[ZONE_DMA] += dma_pfn - start + 1; | ||
372 | zholes_size[ZONE_NORMAL] += end - dma_pfn; | ||
373 | } | ||
374 | } | ||
375 | |||
360 | static int __init early_parse_mem(char *p) | 376 | static int __init early_parse_mem(char *p) |
361 | { | 377 | { |
362 | memory_end = memparse(p, &p); | 378 | memory_end = memparse(p, &p); |
@@ -434,7 +450,7 @@ setup_lowcore(void) | |||
434 | lc->extended_save_area_addr = (__u32) | 450 | lc->extended_save_area_addr = (__u32) |
435 | __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0); | 451 | __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0); |
436 | /* enable extended save area */ | 452 | /* enable extended save area */ |
437 | ctl_set_bit(14, 29); | 453 | __ctl_set_bit(14, 29); |
438 | } | 454 | } |
439 | #endif | 455 | #endif |
440 | set_prefix((u32)(unsigned long) lc); | 456 | set_prefix((u32)(unsigned long) lc); |
@@ -478,6 +494,7 @@ setup_memory(void) | |||
478 | { | 494 | { |
479 | unsigned long bootmap_size; | 495 | unsigned long bootmap_size; |
480 | unsigned long start_pfn, end_pfn, init_pfn; | 496 | unsigned long start_pfn, end_pfn, init_pfn; |
497 | unsigned long last_rw_end; | ||
481 | int i; | 498 | int i; |
482 | 499 | ||
483 | /* | 500 | /* |
@@ -533,27 +550,39 @@ setup_memory(void) | |||
533 | /* | 550 | /* |
534 | * Register RAM areas with the bootmem allocator. | 551 | * Register RAM areas with the bootmem allocator. |
535 | */ | 552 | */ |
553 | last_rw_end = start_pfn; | ||
536 | 554 | ||
537 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { | 555 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { |
538 | unsigned long start_chunk, end_chunk, pfn; | 556 | unsigned long start_chunk, end_chunk; |
539 | 557 | ||
540 | if (memory_chunk[i].type != CHUNK_READ_WRITE) | 558 | if (memory_chunk[i].type != CHUNK_READ_WRITE) |
541 | continue; | 559 | continue; |
542 | start_chunk = PFN_DOWN(memory_chunk[i].addr); | 560 | start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1); |
543 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1; | 561 | start_chunk >>= PAGE_SHIFT; |
544 | end_chunk = min(end_chunk, end_pfn); | 562 | end_chunk = (memory_chunk[i].addr + memory_chunk[i].size); |
545 | if (start_chunk >= end_chunk) | 563 | end_chunk >>= PAGE_SHIFT; |
546 | continue; | 564 | if (start_chunk < start_pfn) |
547 | add_active_range(0, start_chunk, end_chunk); | 565 | start_chunk = start_pfn; |
548 | pfn = max(start_chunk, start_pfn); | 566 | if (end_chunk > end_pfn) |
549 | for (; pfn <= end_chunk; pfn++) | 567 | end_chunk = end_pfn; |
550 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); | 568 | if (start_chunk < end_chunk) { |
569 | /* Initialize storage key for RAM pages */ | ||
570 | for (init_pfn = start_chunk ; init_pfn < end_chunk; | ||
571 | init_pfn++) | ||
572 | page_set_storage_key(init_pfn << PAGE_SHIFT, | ||
573 | PAGE_DEFAULT_KEY); | ||
574 | free_bootmem(start_chunk << PAGE_SHIFT, | ||
575 | (end_chunk - start_chunk) << PAGE_SHIFT); | ||
576 | if (last_rw_end < start_chunk) | ||
577 | add_memory_hole(last_rw_end, start_chunk - 1); | ||
578 | last_rw_end = end_chunk; | ||
579 | } | ||
551 | } | 580 | } |
552 | 581 | ||
553 | psw_set_key(PAGE_DEFAULT_KEY); | 582 | psw_set_key(PAGE_DEFAULT_KEY); |
554 | 583 | ||
555 | free_bootmem_with_active_regions(0, max_pfn); | 584 | if (last_rw_end < end_pfn - 1) |
556 | reserve_bootmem(0, PFN_PHYS(start_pfn)); | 585 | add_memory_hole(last_rw_end, end_pfn - 1); |
557 | 586 | ||
558 | /* | 587 | /* |
559 | * Reserve the bootmem bitmap itself as well. We do this in two | 588 | * Reserve the bootmem bitmap itself as well. We do this in two |
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index d99891718709..e1881c31b1cb 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -84,6 +84,7 @@ void show_mem(void) | |||
84 | printk("%d pages swap cached\n",cached); | 84 | printk("%d pages swap cached\n",cached); |
85 | } | 85 | } |
86 | 86 | ||
87 | extern unsigned long __initdata zholes_size[]; | ||
87 | /* | 88 | /* |
88 | * paging_init() sets up the page tables | 89 | * paging_init() sets up the page tables |
89 | */ | 90 | */ |
@@ -100,15 +101,16 @@ void __init paging_init(void) | |||
100 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | _KERNSEG_TABLE; | 101 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | _KERNSEG_TABLE; |
101 | static const int ssm_mask = 0x04000000L; | 102 | static const int ssm_mask = 0x04000000L; |
102 | unsigned long ro_start_pfn, ro_end_pfn; | 103 | unsigned long ro_start_pfn, ro_end_pfn; |
103 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 104 | unsigned long zones_size[MAX_NR_ZONES]; |
104 | 105 | ||
105 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); | 106 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); |
106 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); | 107 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); |
107 | 108 | ||
108 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 109 | memset(zones_size, 0, sizeof(zones_size)); |
109 | max_zone_pfns[ZONE_DMA] = max_low_pfn; | 110 | zones_size[ZONE_DMA] = max_low_pfn; |
110 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | 111 | free_area_init_node(0, &contig_page_data, zones_size, |
111 | free_area_init_nodes(max_zone_pfns); | 112 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, |
113 | zholes_size); | ||
112 | 114 | ||
113 | /* unmap whole virtual address space */ | 115 | /* unmap whole virtual address space */ |
114 | 116 | ||
@@ -168,16 +170,26 @@ void __init paging_init(void) | |||
168 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | | 170 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | |
169 | _KERN_REGION_TABLE; | 171 | _KERN_REGION_TABLE; |
170 | static const int ssm_mask = 0x04000000L; | 172 | static const int ssm_mask = 0x04000000L; |
173 | unsigned long zones_size[MAX_NR_ZONES]; | ||
174 | unsigned long dma_pfn, high_pfn; | ||
171 | unsigned long ro_start_pfn, ro_end_pfn; | 175 | unsigned long ro_start_pfn, ro_end_pfn; |
172 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | ||
173 | 176 | ||
177 | memset(zones_size, 0, sizeof(zones_size)); | ||
178 | dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT; | ||
179 | high_pfn = max_low_pfn; | ||
174 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); | 180 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); |
175 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); | 181 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); |
176 | 182 | ||
177 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 183 | if (dma_pfn > high_pfn) |
178 | max_zone_pfns[ZONE_DMA] = PFN_DOWN(MAX_DMA_ADDRESS); | 184 | zones_size[ZONE_DMA] = high_pfn; |
179 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | 185 | else { |
180 | free_area_init_nodes(max_zone_pfns); | 186 | zones_size[ZONE_DMA] = dma_pfn; |
187 | zones_size[ZONE_NORMAL] = high_pfn - dma_pfn; | ||
188 | } | ||
189 | |||
190 | /* Initialize mem_map[]. */ | ||
191 | free_area_init_node(0, &contig_page_data, zones_size, | ||
192 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, zholes_size); | ||
181 | 193 | ||
182 | /* | 194 | /* |
183 | * map whole physical memory to virtual memory (identity mapping) | 195 | * map whole physical memory to virtual memory (identity mapping) |
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index a4edff4c3be3..831f540251f8 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
@@ -32,13 +32,12 @@ | |||
32 | #include <asm/mxcc.h> | 32 | #include <asm/mxcc.h> |
33 | #include <asm/thread_info.h> | 33 | #include <asm/thread_info.h> |
34 | #include <asm/param.h> | 34 | #include <asm/param.h> |
35 | #include <asm/unistd.h> | ||
35 | 36 | ||
36 | #include <asm/asmmacro.h> | 37 | #include <asm/asmmacro.h> |
37 | 38 | ||
38 | #define curptr g6 | 39 | #define curptr g6 |
39 | 40 | ||
40 | #define NR_SYSCALLS 300 /* Each OS is different... */ | ||
41 | |||
42 | /* These are just handy. */ | 41 | /* These are just handy. */ |
43 | #define _SV save %sp, -STACKFRAME_SZ, %sp | 42 | #define _SV save %sp, -STACKFRAME_SZ, %sp |
44 | #define _RS restore | 43 | #define _RS restore |
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index 10df38eeae08..ea75ca569052 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
@@ -78,7 +78,7 @@ sys_call_table: | |||
78 | /*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 | 78 | /*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 |
79 | /*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 79 | /*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
80 | /*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare | 80 | /*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare |
81 | /*300*/ .long sys_set_robust_list, sys_get_robust_list | 81 | /*300*/ .long sys_set_robust_list, sys_get_robust_list, sys_migrate_pages |
82 | 82 | ||
83 | #ifdef CONFIG_SUNOS_EMUL | 83 | #ifdef CONFIG_SUNOS_EMUL |
84 | /* Now the SunOS syscall table. */ | 84 | /* Now the SunOS syscall table. */ |
@@ -190,6 +190,7 @@ sunos_sys_table: | |||
190 | /*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys | 190 | /*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys |
191 | .long sunos_nosys, sunos_nosys, sunos_nosys | 191 | .long sunos_nosys, sunos_nosys, sunos_nosys |
192 | .long sunos_nosys, sunos_nosys, sunos_nosys | 192 | .long sunos_nosys, sunos_nosys, sunos_nosys |
193 | .long sunos_nosys, sunos_nosys, sunos_nosys | 193 | .long sunos_nosys |
194 | /*300*/ .long sunos_nosys, sunos_nosys, sunos_nosys | ||
194 | 195 | ||
195 | #endif | 196 | #endif |
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 0aaa35fc5a9c..6f28bec0a9bf 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -22,11 +22,10 @@ | |||
22 | #include <asm/auxio.h> | 22 | #include <asm/auxio.h> |
23 | #include <asm/sfafsr.h> | 23 | #include <asm/sfafsr.h> |
24 | #include <asm/pil.h> | 24 | #include <asm/pil.h> |
25 | #include <asm/unistd.h> | ||
25 | 26 | ||
26 | #define curptr g6 | 27 | #define curptr g6 |
27 | 28 | ||
28 | #define NR_SYSCALLS 300 /* Each OS is different... */ | ||
29 | |||
30 | .text | 29 | .text |
31 | .align 32 | 30 | .align 32 |
32 | 31 | ||
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index 419a63fca172..9a8026797ac0 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -79,7 +79,7 @@ sys_call_table32: | |||
79 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 | 79 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 |
80 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 80 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
81 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare | 81 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare |
82 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list | 82 | /*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list, compat_sys_migrate_pages |
83 | 83 | ||
84 | #endif /* CONFIG_COMPAT */ | 84 | #endif /* CONFIG_COMPAT */ |
85 | 85 | ||
@@ -149,7 +149,7 @@ sys_call_table: | |||
149 | .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 | 149 | .word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64 |
150 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 150 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
151 | .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare | 151 | .word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare |
152 | /*300*/ .word sys_set_robust_list, sys_get_robust_list | 152 | /*300*/ .word sys_set_robust_list, sys_get_robust_list, sys_migrate_pages |
153 | 153 | ||
154 | #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ | 154 | #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ |
155 | defined(CONFIG_SOLARIS_EMUL_MODULE) | 155 | defined(CONFIG_SOLARIS_EMUL_MODULE) |
@@ -262,5 +262,7 @@ sunos_sys_table: | |||
262 | /*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys | 262 | /*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys |
263 | .word sunos_nosys, sunos_nosys, sunos_nosys | 263 | .word sunos_nosys, sunos_nosys, sunos_nosys |
264 | .word sunos_nosys, sunos_nosys, sunos_nosys | 264 | .word sunos_nosys, sunos_nosys, sunos_nosys |
265 | .word sunos_nosys, sunos_nosys, sunos_nosys | 265 | .word sunos_nosys |
266 | /*300*/ .word sunos_nosys, sunos_nosys, sunos_nosys | ||
267 | |||
266 | #endif | 268 | #endif |
diff --git a/arch/um/include/sysdep-i386/barrier.h b/arch/um/include/sysdep-i386/barrier.h new file mode 100644 index 000000000000..b58d52c5b2f4 --- /dev/null +++ b/arch/um/include/sysdep-i386/barrier.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef __SYSDEP_I386_BARRIER_H | ||
2 | #define __SYSDEP_I386_BARRIER_H | ||
3 | |||
4 | /* Copied from include/asm-i386 for use by userspace. i386 has the option | ||
5 | * of using mfence, but I'm just using this, which works everywhere, for now. | ||
6 | */ | ||
7 | #define mb() asm volatile("lock; addl $0,0(%esp)") | ||
8 | |||
9 | #endif | ||
diff --git a/arch/um/include/sysdep-x86_64/barrier.h b/arch/um/include/sysdep-x86_64/barrier.h new file mode 100644 index 000000000000..7b610befdc8f --- /dev/null +++ b/arch/um/include/sysdep-x86_64/barrier.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __SYSDEP_X86_64_BARRIER_H | ||
2 | #define __SYSDEP_X86_64_BARRIER_H | ||
3 | |||
4 | /* Copied from include/asm-x86_64 for use by userspace. */ | ||
5 | #define mb() asm volatile("mfence":::"memory") | ||
6 | |||
7 | #endif | ||
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 51f0893640a6..c692a192957a 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c | |||
@@ -7,7 +7,6 @@ | |||
7 | #include <stdio.h> | 7 | #include <stdio.h> |
8 | #include <errno.h> | 8 | #include <errno.h> |
9 | #include <signal.h> | 9 | #include <signal.h> |
10 | #include <linux/unistd.h> | ||
11 | #include <sys/mman.h> | 10 | #include <sys/mman.h> |
12 | #include <sys/wait.h> | 11 | #include <sys/wait.h> |
13 | #include <sys/mman.h> | 12 | #include <sys/mman.h> |
diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 6b81739279d1..b897e8592d77 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include "user.h" | 15 | #include "user.h" |
16 | #include "signal_kern.h" | 16 | #include "signal_kern.h" |
17 | #include "sysdep/sigcontext.h" | 17 | #include "sysdep/sigcontext.h" |
18 | #include "sysdep/barrier.h" | ||
18 | #include "sigcontext.h" | 19 | #include "sigcontext.h" |
19 | #include "mode.h" | 20 | #include "mode.h" |
20 | #include "os.h" | 21 | #include "os.h" |
@@ -34,8 +35,12 @@ | |||
34 | #define SIGALRM_BIT 2 | 35 | #define SIGALRM_BIT 2 |
35 | #define SIGALRM_MASK (1 << SIGALRM_BIT) | 36 | #define SIGALRM_MASK (1 << SIGALRM_BIT) |
36 | 37 | ||
37 | static int signals_enabled = 1; | 38 | /* These are used by both the signal handlers and |
38 | static int pending = 0; | 39 | * block/unblock_signals. I don't want modifications cached in a |
40 | * register - they must go straight to memory. | ||
41 | */ | ||
42 | static volatile int signals_enabled = 1; | ||
43 | static volatile int pending = 0; | ||
39 | 44 | ||
40 | void sig_handler(int sig, struct sigcontext *sc) | 45 | void sig_handler(int sig, struct sigcontext *sc) |
41 | { | 46 | { |
@@ -152,6 +157,12 @@ int change_sig(int signal, int on) | |||
152 | void block_signals(void) | 157 | void block_signals(void) |
153 | { | 158 | { |
154 | signals_enabled = 0; | 159 | signals_enabled = 0; |
160 | /* This must return with signals disabled, so this barrier | ||
161 | * ensures that writes are flushed out before the return. | ||
162 | * This might matter if gcc figures out how to inline this and | ||
163 | * decides to shuffle this code into the caller. | ||
164 | */ | ||
165 | mb(); | ||
155 | } | 166 | } |
156 | 167 | ||
157 | void unblock_signals(void) | 168 | void unblock_signals(void) |
@@ -171,9 +182,23 @@ void unblock_signals(void) | |||
171 | */ | 182 | */ |
172 | signals_enabled = 1; | 183 | signals_enabled = 1; |
173 | 184 | ||
185 | /* Setting signals_enabled and reading pending must | ||
186 | * happen in this order. | ||
187 | */ | ||
188 | mb(); | ||
189 | |||
174 | save_pending = pending; | 190 | save_pending = pending; |
175 | if(save_pending == 0) | 191 | if(save_pending == 0){ |
192 | /* This must return with signals enabled, so | ||
193 | * this barrier ensures that writes are | ||
194 | * flushed out before the return. This might | ||
195 | * matter if gcc figures out how to inline | ||
196 | * this (unlikely, given its size) and decides | ||
197 | * to shuffle this code into the caller. | ||
198 | */ | ||
199 | mb(); | ||
176 | return; | 200 | return; |
201 | } | ||
177 | 202 | ||
178 | pending = 0; | 203 | pending = 0; |
179 | 204 | ||
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index cb9ab54146cc..9b34fe65949a 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <sys/mman.h> | 14 | #include <sys/mman.h> |
15 | #include <sys/user.h> | 15 | #include <sys/user.h> |
16 | #include <sys/time.h> | 16 | #include <sys/time.h> |
17 | #include <asm/unistd.h> | 17 | #include <sys/syscall.h> |
18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
19 | #include "user.h" | 19 | #include "user.h" |
20 | #include "sysdep/ptrace.h" | 20 | #include "sysdep/ptrace.h" |
diff --git a/arch/um/os-Linux/tls.c b/arch/um/os-Linux/tls.c index 9f7999f27c77..16215b990804 100644 --- a/arch/um/os-Linux/tls.c +++ b/arch/um/os-Linux/tls.c | |||
@@ -1,7 +1,7 @@ | |||
1 | #include <errno.h> | 1 | #include <errno.h> |
2 | #include <unistd.h> | ||
2 | #include <sys/ptrace.h> | 3 | #include <sys/ptrace.h> |
3 | #include <sys/syscall.h> | 4 | #include <sys/syscall.h> |
4 | #include <unistd.h> | ||
5 | #include <asm/ldt.h> | 5 | #include <asm/ldt.h> |
6 | #include "sysdep/tls.h" | 6 | #include "sysdep/tls.h" |
7 | #include "uml-config.h" | 7 | #include "uml-config.h" |