diff options
Diffstat (limited to 'arch')
68 files changed, 717 insertions, 671 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 24efdfe277fc..3e2e540a0f2a 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -61,6 +61,9 @@ config ZONE_DMA | |||
61 | config NEED_DMA_MAP_STATE | 61 | config NEED_DMA_MAP_STATE |
62 | def_bool y | 62 | def_bool y |
63 | 63 | ||
64 | config NEED_SG_DMA_LENGTH | ||
65 | def_bool y | ||
66 | |||
64 | config GENERIC_ISA_DMA | 67 | config GENERIC_ISA_DMA |
65 | bool | 68 | bool |
66 | default y | 69 | default y |
diff --git a/arch/alpha/include/asm/scatterlist.h b/arch/alpha/include/asm/scatterlist.h index 440747ca6349..5728c52a7412 100644 --- a/arch/alpha/include/asm/scatterlist.h +++ b/arch/alpha/include/asm/scatterlist.h | |||
@@ -1,24 +1,7 @@ | |||
1 | #ifndef _ALPHA_SCATTERLIST_H | 1 | #ifndef _ALPHA_SCATTERLIST_H |
2 | #define _ALPHA_SCATTERLIST_H | 2 | #define _ALPHA_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/page.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | #include <asm/types.h> | ||
6 | |||
7 | struct scatterlist { | ||
8 | #ifdef CONFIG_DEBUG_SG | ||
9 | unsigned long sg_magic; | ||
10 | #endif | ||
11 | unsigned long page_link; | ||
12 | unsigned int offset; | ||
13 | |||
14 | unsigned int length; | ||
15 | |||
16 | dma_addr_t dma_address; | ||
17 | __u32 dma_length; | ||
18 | }; | ||
19 | |||
20 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
21 | #define sg_dma_len(sg) ((sg)->dma_length) | ||
22 | 5 | ||
23 | #define ISA_DMA_THRESHOLD (~0UL) | 6 | #define ISA_DMA_THRESHOLD (~0UL) |
24 | 7 | ||
diff --git a/arch/alpha/math-emu/sfp-util.h b/arch/alpha/math-emu/sfp-util.h index d4c6ae7fee47..f53707f77455 100644 --- a/arch/alpha/math-emu/sfp-util.h +++ b/arch/alpha/math-emu/sfp-util.h | |||
@@ -28,3 +28,8 @@ extern unsigned long __udiv_qrnnd (unsigned long *, unsigned long, | |||
28 | #define UDIV_NEEDS_NORMALIZATION 1 | 28 | #define UDIV_NEEDS_NORMALIZATION 1 |
29 | 29 | ||
30 | #define abort() goto bad_insn | 30 | #define abort() goto bad_insn |
31 | |||
32 | #ifndef __LITTLE_ENDIAN | ||
33 | #define __LITTLE_ENDIAN -1 | ||
34 | #endif | ||
35 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
diff --git a/arch/arm/include/asm/scatterlist.h b/arch/arm/include/asm/scatterlist.h index bcda59f39941..2f87870d9347 100644 --- a/arch/arm/include/asm/scatterlist.h +++ b/arch/arm/include/asm/scatterlist.h | |||
@@ -3,9 +3,6 @@ | |||
3 | 3 | ||
4 | #include <asm/memory.h> | 4 | #include <asm/memory.h> |
5 | #include <asm/types.h> | 5 | #include <asm/types.h> |
6 | |||
7 | #include <asm-generic/scatterlist.h> | 6 | #include <asm-generic/scatterlist.h> |
8 | 7 | ||
9 | #undef ARCH_HAS_SG_CHAIN | ||
10 | |||
11 | #endif /* _ASMARM_SCATTERLIST_H */ | 8 | #endif /* _ASMARM_SCATTERLIST_H */ |
diff --git a/arch/arm/mach-davinci/include/mach/mmc.h b/arch/arm/mach-davinci/include/mach/mmc.h index 5a85e24f3673..d4f1e9675069 100644 --- a/arch/arm/mach-davinci/include/mach/mmc.h +++ b/arch/arm/mach-davinci/include/mach/mmc.h | |||
@@ -22,6 +22,9 @@ struct davinci_mmc_config { | |||
22 | 22 | ||
23 | /* Version of the MMC/SD controller */ | 23 | /* Version of the MMC/SD controller */ |
24 | u8 version; | 24 | u8 version; |
25 | |||
26 | /* Number of sg segments */ | ||
27 | u8 nr_sg; | ||
25 | }; | 28 | }; |
26 | void davinci_setup_mmc(int module, struct davinci_mmc_config *config); | 29 | void davinci_setup_mmc(int module, struct davinci_mmc_config *config); |
27 | 30 | ||
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index e7d629b3c76a..f474a80b8867 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -137,9 +137,7 @@ static void ads7846_dev_init(void) | |||
137 | } | 137 | } |
138 | 138 | ||
139 | gpio_direction_input(ts_gpio); | 139 | gpio_direction_input(ts_gpio); |
140 | 140 | gpio_set_debounce(ts_gpio, 310); | |
141 | omap_set_gpio_debounce(ts_gpio, 1); | ||
142 | omap_set_gpio_debounce_time(ts_gpio, 0xa); | ||
143 | } | 141 | } |
144 | 142 | ||
145 | static int ads7846_get_pendown_state(void) | 143 | static int ads7846_get_pendown_state(void) |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 5fcb52e71298..fefd7e6e9779 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -209,8 +209,7 @@ static void ads7846_dev_init(void) | |||
209 | } | 209 | } |
210 | 210 | ||
211 | gpio_direction_input(ts_gpio); | 211 | gpio_direction_input(ts_gpio); |
212 | omap_set_gpio_debounce(ts_gpio, 1); | 212 | gpio_set_debounce(ts_gpio, 310); |
213 | omap_set_gpio_debounce_time(ts_gpio, 0xa); | ||
214 | } | 213 | } |
215 | 214 | ||
216 | static int ads7846_get_pendown_state(void) | 215 | static int ads7846_get_pendown_state(void) |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 81bba194b030..b95261013812 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -579,9 +579,7 @@ static void ads7846_dev_init(void) | |||
579 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); | 579 | printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); |
580 | 580 | ||
581 | gpio_direction_input(OMAP3_EVM_TS_GPIO); | 581 | gpio_direction_input(OMAP3_EVM_TS_GPIO); |
582 | 582 | gpio_set_debounce(OMAP3_EVM_TS_GPIO, 310); | |
583 | omap_set_gpio_debounce(OMAP3_EVM_TS_GPIO, 1); | ||
584 | omap_set_gpio_debounce_time(OMAP3_EVM_TS_GPIO, 0xa); | ||
585 | } | 583 | } |
586 | 584 | ||
587 | static int ads7846_get_pendown_state(void) | 585 | static int ads7846_get_pendown_state(void) |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 395d049bf010..db06dc910ba7 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -130,8 +130,8 @@ static struct platform_device pandora_keys_gpio = { | |||
130 | static void __init pandora_keys_gpio_init(void) | 130 | static void __init pandora_keys_gpio_init(void) |
131 | { | 131 | { |
132 | /* set debounce time for GPIO banks 4 and 6 */ | 132 | /* set debounce time for GPIO banks 4 and 6 */ |
133 | omap_set_gpio_debounce_time(32 * 3, GPIO_DEBOUNCE_TIME); | 133 | gpio_set_debounce(32 * 3, GPIO_DEBOUNCE_TIME); |
134 | omap_set_gpio_debounce_time(32 * 5, GPIO_DEBOUNCE_TIME); | 134 | gpio_set_debounce(32 * 5, GPIO_DEBOUNCE_TIME); |
135 | } | 135 | } |
136 | 136 | ||
137 | static int board_keymap[] = { | 137 | static int board_keymap[] = { |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 2504d41f923e..2f5f8233dd5b 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -328,8 +328,7 @@ static void __init omap3_ads7846_init(void) | |||
328 | } | 328 | } |
329 | 329 | ||
330 | gpio_direction_input(OMAP3_TS_GPIO); | 330 | gpio_direction_input(OMAP3_TS_GPIO); |
331 | omap_set_gpio_debounce(OMAP3_TS_GPIO, 1); | 331 | gpio_set_debounce(OMAP3_TS_GPIO, 310); |
332 | omap_set_gpio_debounce_time(OMAP3_TS_GPIO, 0xa); | ||
333 | } | 332 | } |
334 | 333 | ||
335 | static struct ads7846_platform_data ads7846_config = { | 334 | static struct ads7846_platform_data ads7846_config = { |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index dc2ac42d6319..393e9219a5b6 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -624,79 +624,58 @@ do { \ | |||
624 | __raw_writel(l, base + reg); \ | 624 | __raw_writel(l, base + reg); \ |
625 | } while(0) | 625 | } while(0) |
626 | 626 | ||
627 | void omap_set_gpio_debounce(int gpio, int enable) | 627 | /** |
628 | * _set_gpio_debounce - low level gpio debounce time | ||
629 | * @bank: the gpio bank we're acting upon | ||
630 | * @gpio: the gpio number on this @gpio | ||
631 | * @debounce: debounce time to use | ||
632 | * | ||
633 | * OMAP's debounce time is in 31us steps so we need | ||
634 | * to convert and round up to the closest unit. | ||
635 | */ | ||
636 | static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio, | ||
637 | unsigned debounce) | ||
628 | { | 638 | { |
629 | struct gpio_bank *bank; | 639 | void __iomem *reg = bank->base; |
630 | void __iomem *reg; | 640 | u32 val; |
631 | unsigned long flags; | 641 | u32 l; |
632 | u32 val, l = 1 << get_gpio_index(gpio); | 642 | |
643 | if (debounce < 32) | ||
644 | debounce = 0x01; | ||
645 | else if (debounce > 7936) | ||
646 | debounce = 0xff; | ||
647 | else | ||
648 | debounce = (debounce / 0x1f) - 1; | ||
633 | 649 | ||
634 | if (cpu_class_is_omap1()) | 650 | l = 1 << get_gpio_index(gpio); |
635 | return; | ||
636 | 651 | ||
637 | bank = get_gpio_bank(gpio); | 652 | if (cpu_is_omap44xx()) |
638 | reg = bank->base; | 653 | reg += OMAP4_GPIO_DEBOUNCINGTIME; |
654 | else | ||
655 | reg += OMAP24XX_GPIO_DEBOUNCE_VAL; | ||
656 | |||
657 | __raw_writel(debounce, reg); | ||
639 | 658 | ||
659 | reg = bank->base; | ||
640 | if (cpu_is_omap44xx()) | 660 | if (cpu_is_omap44xx()) |
641 | reg += OMAP4_GPIO_DEBOUNCENABLE; | 661 | reg += OMAP4_GPIO_DEBOUNCENABLE; |
642 | else | 662 | else |
643 | reg += OMAP24XX_GPIO_DEBOUNCE_EN; | 663 | reg += OMAP24XX_GPIO_DEBOUNCE_EN; |
644 | 664 | ||
645 | if (!(bank->mod_usage & l)) { | ||
646 | printk(KERN_ERR "GPIO %d not requested\n", gpio); | ||
647 | return; | ||
648 | } | ||
649 | |||
650 | spin_lock_irqsave(&bank->lock, flags); | ||
651 | val = __raw_readl(reg); | 665 | val = __raw_readl(reg); |
652 | 666 | ||
653 | if (enable && !(val & l)) | 667 | if (debounce) { |
654 | val |= l; | 668 | val |= l; |
655 | else if (!enable && (val & l)) | 669 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) |
656 | val &= ~l; | ||
657 | else | ||
658 | goto done; | ||
659 | |||
660 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) { | ||
661 | bank->dbck_enable_mask = val; | ||
662 | if (enable) | ||
663 | clk_enable(bank->dbck); | 670 | clk_enable(bank->dbck); |
664 | else | 671 | } else { |
672 | val &= ~l; | ||
673 | if (cpu_is_omap34xx() || cpu_is_omap44xx()) | ||
665 | clk_disable(bank->dbck); | 674 | clk_disable(bank->dbck); |
666 | } | 675 | } |
667 | 676 | ||
668 | __raw_writel(val, reg); | 677 | __raw_writel(val, reg); |
669 | done: | ||
670 | spin_unlock_irqrestore(&bank->lock, flags); | ||
671 | } | 678 | } |
672 | EXPORT_SYMBOL(omap_set_gpio_debounce); | ||
673 | |||
674 | void omap_set_gpio_debounce_time(int gpio, int enc_time) | ||
675 | { | ||
676 | struct gpio_bank *bank; | ||
677 | void __iomem *reg; | ||
678 | |||
679 | if (cpu_class_is_omap1()) | ||
680 | return; | ||
681 | |||
682 | bank = get_gpio_bank(gpio); | ||
683 | reg = bank->base; | ||
684 | |||
685 | if (!bank->mod_usage) { | ||
686 | printk(KERN_ERR "GPIO not requested\n"); | ||
687 | return; | ||
688 | } | ||
689 | |||
690 | enc_time &= 0xff; | ||
691 | |||
692 | if (cpu_is_omap44xx()) | ||
693 | reg += OMAP4_GPIO_DEBOUNCINGTIME; | ||
694 | else | ||
695 | reg += OMAP24XX_GPIO_DEBOUNCE_VAL; | ||
696 | |||
697 | __raw_writel(enc_time, reg); | ||
698 | } | ||
699 | EXPORT_SYMBOL(omap_set_gpio_debounce_time); | ||
700 | 679 | ||
701 | #ifdef CONFIG_ARCH_OMAP2PLUS | 680 | #ifdef CONFIG_ARCH_OMAP2PLUS |
702 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, | 681 | static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, |
@@ -1656,6 +1635,20 @@ static int gpio_output(struct gpio_chip *chip, unsigned offset, int value) | |||
1656 | return 0; | 1635 | return 0; |
1657 | } | 1636 | } |
1658 | 1637 | ||
1638 | static int gpio_debounce(struct gpio_chip *chip, unsigned offset, | ||
1639 | unsigned debounce) | ||
1640 | { | ||
1641 | struct gpio_bank *bank; | ||
1642 | unsigned long flags; | ||
1643 | |||
1644 | bank = container_of(chip, struct gpio_bank, chip); | ||
1645 | spin_lock_irqsave(&bank->lock, flags); | ||
1646 | _set_gpio_debounce(bank, offset, debounce); | ||
1647 | spin_unlock_irqrestore(&bank->lock, flags); | ||
1648 | |||
1649 | return 0; | ||
1650 | } | ||
1651 | |||
1659 | static void gpio_set(struct gpio_chip *chip, unsigned offset, int value) | 1652 | static void gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
1660 | { | 1653 | { |
1661 | struct gpio_bank *bank; | 1654 | struct gpio_bank *bank; |
@@ -1909,6 +1902,7 @@ static int __init _omap_gpio_init(void) | |||
1909 | bank->chip.direction_input = gpio_input; | 1902 | bank->chip.direction_input = gpio_input; |
1910 | bank->chip.get = gpio_get; | 1903 | bank->chip.get = gpio_get; |
1911 | bank->chip.direction_output = gpio_output; | 1904 | bank->chip.direction_output = gpio_output; |
1905 | bank->chip.set_debounce = gpio_debounce; | ||
1912 | bank->chip.set = gpio_set; | 1906 | bank->chip.set = gpio_set; |
1913 | bank->chip.to_irq = gpio_2irq; | 1907 | bank->chip.to_irq = gpio_2irq; |
1914 | if (bank_is_mpuio(bank)) { | 1908 | if (bank_is_mpuio(bank)) { |
diff --git a/arch/avr32/include/asm/scatterlist.h b/arch/avr32/include/asm/scatterlist.h index 377320e3bd17..06394e5ead6c 100644 --- a/arch/avr32/include/asm/scatterlist.h +++ b/arch/avr32/include/asm/scatterlist.h | |||
@@ -1,25 +1,7 @@ | |||
1 | #ifndef __ASM_AVR32_SCATTERLIST_H | 1 | #ifndef __ASM_AVR32_SCATTERLIST_H |
2 | #define __ASM_AVR32_SCATTERLIST_H | 2 | #define __ASM_AVR32_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | unsigned long page_link; | ||
11 | unsigned int offset; | ||
12 | dma_addr_t dma_address; | ||
13 | unsigned int length; | ||
14 | }; | ||
15 | |||
16 | /* These macros should be used after a pci_map_sg call has been done | ||
17 | * to get bus addresses of each of the SG entries and their lengths. | ||
18 | * You should only work with the number of sg entries pci_map_sg | ||
19 | * returns. | ||
20 | */ | ||
21 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
22 | #define sg_dma_len(sg) ((sg)->length) | ||
23 | 5 | ||
24 | #define ISA_DMA_THRESHOLD (0xffffffff) | 6 | #define ISA_DMA_THRESHOLD (0xffffffff) |
25 | 7 | ||
diff --git a/arch/blackfin/include/asm/scatterlist.h b/arch/blackfin/include/asm/scatterlist.h index 04f448711cd0..64d41d34ab0b 100644 --- a/arch/blackfin/include/asm/scatterlist.h +++ b/arch/blackfin/include/asm/scatterlist.h | |||
@@ -1,27 +1,7 @@ | |||
1 | #ifndef _BLACKFIN_SCATTERLIST_H | 1 | #ifndef _BLACKFIN_SCATTERLIST_H |
2 | #define _BLACKFIN_SCATTERLIST_H | 2 | #define _BLACKFIN_SCATTERLIST_H |
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | unsigned long page_link; | ||
11 | unsigned int offset; | ||
12 | dma_addr_t dma_address; | ||
13 | unsigned int length; | ||
14 | }; | ||
15 | |||
16 | /* | ||
17 | * These macros should be used after a pci_map_sg call has been done | ||
18 | * to get bus addresses of each of the SG entries and their lengths. | ||
19 | * You should only work with the number of sg entries pci_map_sg | ||
20 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
21 | * is 0. | ||
22 | */ | ||
23 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
24 | #define sg_dma_len(sg) ((sg)->length) | ||
25 | 5 | ||
26 | #define ISA_DMA_THRESHOLD (0xffffffff) | 6 | #define ISA_DMA_THRESHOLD (0xffffffff) |
27 | 7 | ||
diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c index 43eb969405d1..6ec77685df52 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c | |||
@@ -292,28 +292,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
292 | break; | 292 | break; |
293 | } | 293 | } |
294 | 294 | ||
295 | #ifdef CONFIG_BINFMT_ELF_FDPIC | ||
296 | case PTRACE_GETFDPIC: { | ||
297 | unsigned long tmp = 0; | ||
298 | |||
299 | switch (addr) { | ||
300 | case_PTRACE_GETFDPIC_EXEC: | ||
301 | case PTRACE_GETFDPIC_EXEC: | ||
302 | tmp = child->mm->context.exec_fdpic_loadmap; | ||
303 | break; | ||
304 | case_PTRACE_GETFDPIC_INTERP: | ||
305 | case PTRACE_GETFDPIC_INTERP: | ||
306 | tmp = child->mm->context.interp_fdpic_loadmap; | ||
307 | break; | ||
308 | default: | ||
309 | break; | ||
310 | } | ||
311 | |||
312 | ret = put_user(tmp, datap); | ||
313 | break; | ||
314 | } | ||
315 | #endif | ||
316 | |||
317 | /* when I and D space are separate, this will have to be fixed. */ | 295 | /* when I and D space are separate, this will have to be fixed. */ |
318 | case PTRACE_POKEDATA: | 296 | case PTRACE_POKEDATA: |
319 | pr_debug("ptrace: PTRACE_PEEKDATA\n"); | 297 | pr_debug("ptrace: PTRACE_PEEKDATA\n"); |
@@ -357,8 +335,14 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
357 | case PTRACE_PEEKUSR: | 335 | case PTRACE_PEEKUSR: |
358 | switch (addr) { | 336 | switch (addr) { |
359 | #ifdef CONFIG_BINFMT_ELF_FDPIC /* backwards compat */ | 337 | #ifdef CONFIG_BINFMT_ELF_FDPIC /* backwards compat */ |
360 | case PT_FDPIC_EXEC: goto case_PTRACE_GETFDPIC_EXEC; | 338 | case PT_FDPIC_EXEC: |
361 | case PT_FDPIC_INTERP: goto case_PTRACE_GETFDPIC_INTERP; | 339 | request = PTRACE_GETFDPIC; |
340 | addr = PTRACE_GETFDPIC_EXEC; | ||
341 | goto case_default; | ||
342 | case PT_FDPIC_INTERP: | ||
343 | request = PTRACE_GETFDPIC; | ||
344 | addr = PTRACE_GETFDPIC_INTERP; | ||
345 | goto case_default; | ||
362 | #endif | 346 | #endif |
363 | default: | 347 | default: |
364 | ret = get_reg(child, addr, datap); | 348 | ret = get_reg(child, addr, datap); |
@@ -385,6 +369,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
385 | 0, sizeof(struct pt_regs), | 369 | 0, sizeof(struct pt_regs), |
386 | (const void __user *)data); | 370 | (const void __user *)data); |
387 | 371 | ||
372 | case_default: | ||
388 | default: | 373 | default: |
389 | ret = ptrace_request(child, request, addr, data); | 374 | ret = ptrace_request(child, request, addr, data); |
390 | break; | 375 | break; |
diff --git a/arch/cris/include/asm/scatterlist.h b/arch/cris/include/asm/scatterlist.h index faff53ad1f96..249a7842ff5f 100644 --- a/arch/cris/include/asm/scatterlist.h +++ b/arch/cris/include/asm/scatterlist.h | |||
@@ -1,22 +1,7 @@ | |||
1 | #ifndef __ASM_CRIS_SCATTERLIST_H | 1 | #ifndef __ASM_CRIS_SCATTERLIST_H |
2 | #define __ASM_CRIS_SCATTERLIST_H | 2 | #define __ASM_CRIS_SCATTERLIST_H |
3 | 3 | ||
4 | struct scatterlist { | 4 | #include <asm-generic/scatterlist.h> |
5 | #ifdef CONFIG_DEBUG_SG | ||
6 | unsigned long sg_magic; | ||
7 | #endif | ||
8 | char * address; /* Location data is to be transferred to */ | ||
9 | unsigned int length; | ||
10 | |||
11 | /* The following is i386 highmem junk - not used by us */ | ||
12 | unsigned long page_link; | ||
13 | unsigned int offset;/* for highmem, page offset */ | ||
14 | |||
15 | }; | ||
16 | |||
17 | #define sg_dma_address(sg) ((sg)->address) | ||
18 | #define sg_dma_len(sg) ((sg)->length) | ||
19 | /* i386 junk */ | ||
20 | 5 | ||
21 | #define ISA_DMA_THRESHOLD (0x1fffffff) | 6 | #define ISA_DMA_THRESHOLD (0x1fffffff) |
22 | 7 | ||
diff --git a/arch/frv/include/asm/scatterlist.h b/arch/frv/include/asm/scatterlist.h index 4bca8a28546c..1614bfd7e3a4 100644 --- a/arch/frv/include/asm/scatterlist.h +++ b/arch/frv/include/asm/scatterlist.h | |||
@@ -1,45 +1,7 @@ | |||
1 | #ifndef _ASM_SCATTERLIST_H | 1 | #ifndef _ASM_SCATTERLIST_H |
2 | #define _ASM_SCATTERLIST_H | 2 | #define _ASM_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | /* | ||
7 | * Drivers must set either ->address or (preferred) page and ->offset | ||
8 | * to indicate where data must be transferred to/from. | ||
9 | * | ||
10 | * Using page is recommended since it handles highmem data as well as | ||
11 | * low mem. ->address is restricted to data which has a virtual mapping, and | ||
12 | * it will go away in the future. Updating to page can be automated very | ||
13 | * easily -- something like | ||
14 | * | ||
15 | * sg->address = some_ptr; | ||
16 | * | ||
17 | * can be rewritten as | ||
18 | * | ||
19 | * sg_set_buf(sg, some_ptr, length); | ||
20 | * | ||
21 | * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens | ||
22 | */ | ||
23 | struct scatterlist { | ||
24 | #ifdef CONFIG_DEBUG_SG | ||
25 | unsigned long sg_magic; | ||
26 | #endif | ||
27 | unsigned long page_link; | ||
28 | unsigned int offset; /* for highmem, page offset */ | ||
29 | |||
30 | dma_addr_t dma_address; | ||
31 | unsigned int length; | ||
32 | }; | ||
33 | |||
34 | /* | ||
35 | * These macros should be used after a pci_map_sg call has been done | ||
36 | * to get bus addresses of each of the SG entries and their lengths. | ||
37 | * You should only work with the number of sg entries pci_map_sg | ||
38 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
39 | * is 0. | ||
40 | */ | ||
41 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
42 | #define sg_dma_len(sg) ((sg)->length) | ||
43 | 5 | ||
44 | #define ISA_DMA_THRESHOLD (0xffffffffUL) | 6 | #define ISA_DMA_THRESHOLD (0xffffffffUL) |
45 | 7 | ||
diff --git a/arch/frv/kernel/ptrace.c b/arch/frv/kernel/ptrace.c index 60eeed3694c0..fac028936a04 100644 --- a/arch/frv/kernel/ptrace.c +++ b/arch/frv/kernel/ptrace.c | |||
@@ -344,26 +344,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
344 | 0, sizeof(child->thread.user->f), | 344 | 0, sizeof(child->thread.user->f), |
345 | (const void __user *)data); | 345 | (const void __user *)data); |
346 | 346 | ||
347 | case PTRACE_GETFDPIC: | ||
348 | tmp = 0; | ||
349 | switch (addr) { | ||
350 | case PTRACE_GETFDPIC_EXEC: | ||
351 | tmp = child->mm->context.exec_fdpic_loadmap; | ||
352 | break; | ||
353 | case PTRACE_GETFDPIC_INTERP: | ||
354 | tmp = child->mm->context.interp_fdpic_loadmap; | ||
355 | break; | ||
356 | default: | ||
357 | break; | ||
358 | } | ||
359 | |||
360 | ret = 0; | ||
361 | if (put_user(tmp, (unsigned long *) data)) { | ||
362 | ret = -EFAULT; | ||
363 | break; | ||
364 | } | ||
365 | break; | ||
366 | |||
367 | default: | 347 | default: |
368 | ret = ptrace_request(child, request, addr, data); | 348 | ret = ptrace_request(child, request, addr, data); |
369 | break; | 349 | break; |
diff --git a/arch/frv/kernel/sysctl.c b/arch/frv/kernel/sysctl.c index 71abd1510a59..6c155d69da29 100644 --- a/arch/frv/kernel/sysctl.c +++ b/arch/frv/kernel/sysctl.c | |||
@@ -46,8 +46,9 @@ static void frv_change_dcache_mode(unsigned long newmode) | |||
46 | /* | 46 | /* |
47 | * handle requests to dynamically switch the write caching mode delivered by /proc | 47 | * handle requests to dynamically switch the write caching mode delivered by /proc |
48 | */ | 48 | */ |
49 | static int procctl_frv_cachemode(ctl_table *table, int write, struct file *filp, | 49 | static int procctl_frv_cachemode(ctl_table *table, int write, |
50 | void __user *buffer, size_t *lenp, loff_t *ppos) | 50 | void __user *buffer, size_t *lenp, |
51 | loff_t *ppos) | ||
51 | { | 52 | { |
52 | unsigned long hsr0; | 53 | unsigned long hsr0; |
53 | char buff[8]; | 54 | char buff[8]; |
@@ -84,7 +85,7 @@ static int procctl_frv_cachemode(ctl_table *table, int write, struct file *filp, | |||
84 | } | 85 | } |
85 | 86 | ||
86 | /* read the state */ | 87 | /* read the state */ |
87 | if (filp->f_pos > 0) { | 88 | if (*ppos > 0) { |
88 | *lenp = 0; | 89 | *lenp = 0; |
89 | return 0; | 90 | return 0; |
90 | } | 91 | } |
@@ -110,7 +111,7 @@ static int procctl_frv_cachemode(ctl_table *table, int write, struct file *filp, | |||
110 | return -EFAULT; | 111 | return -EFAULT; |
111 | 112 | ||
112 | *lenp = len; | 113 | *lenp = len; |
113 | filp->f_pos = len; | 114 | *ppos = len; |
114 | return 0; | 115 | return 0; |
115 | 116 | ||
116 | } /* end procctl_frv_cachemode() */ | 117 | } /* end procctl_frv_cachemode() */ |
@@ -120,8 +121,9 @@ static int procctl_frv_cachemode(ctl_table *table, int write, struct file *filp, | |||
120 | * permit the mm_struct the nominated process is using have its MMU context ID pinned | 121 | * permit the mm_struct the nominated process is using have its MMU context ID pinned |
121 | */ | 122 | */ |
122 | #ifdef CONFIG_MMU | 123 | #ifdef CONFIG_MMU |
123 | static int procctl_frv_pin_cxnr(ctl_table *table, int write, struct file *filp, | 124 | static int procctl_frv_pin_cxnr(ctl_table *table, int write, |
124 | void __user *buffer, size_t *lenp, loff_t *ppos) | 125 | void __user *buffer, size_t *lenp, |
126 | loff_t *ppos) | ||
125 | { | 127 | { |
126 | pid_t pid; | 128 | pid_t pid; |
127 | char buff[16], *p; | 129 | char buff[16], *p; |
@@ -150,7 +152,7 @@ static int procctl_frv_pin_cxnr(ctl_table *table, int write, struct file *filp, | |||
150 | } | 152 | } |
151 | 153 | ||
152 | /* read the currently pinned CXN */ | 154 | /* read the currently pinned CXN */ |
153 | if (filp->f_pos > 0) { | 155 | if (*ppos > 0) { |
154 | *lenp = 0; | 156 | *lenp = 0; |
155 | return 0; | 157 | return 0; |
156 | } | 158 | } |
@@ -163,7 +165,7 @@ static int procctl_frv_pin_cxnr(ctl_table *table, int write, struct file *filp, | |||
163 | return -EFAULT; | 165 | return -EFAULT; |
164 | 166 | ||
165 | *lenp = len; | 167 | *lenp = len; |
166 | filp->f_pos = len; | 168 | *ppos = len; |
167 | return 0; | 169 | return 0; |
168 | 170 | ||
169 | } /* end procctl_frv_pin_cxnr() */ | 171 | } /* end procctl_frv_pin_cxnr() */ |
diff --git a/arch/h8300/include/asm/scatterlist.h b/arch/h8300/include/asm/scatterlist.h index d3ecdd87ac90..de08a4a2cc1c 100644 --- a/arch/h8300/include/asm/scatterlist.h +++ b/arch/h8300/include/asm/scatterlist.h | |||
@@ -1,17 +1,7 @@ | |||
1 | #ifndef _H8300_SCATTERLIST_H | 1 | #ifndef _H8300_SCATTERLIST_H |
2 | #define _H8300_SCATTERLIST_H | 2 | #define _H8300_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | unsigned long page_link; | ||
11 | unsigned int offset; | ||
12 | dma_addr_t dma_address; | ||
13 | unsigned int length; | ||
14 | }; | ||
15 | 5 | ||
16 | #define ISA_DMA_THRESHOLD (0xffffffff) | 6 | #define ISA_DMA_THRESHOLD (0xffffffff) |
17 | 7 | ||
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 9676100b83ee..95610820041e 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -56,6 +56,9 @@ config MMU | |||
56 | config NEED_DMA_MAP_STATE | 56 | config NEED_DMA_MAP_STATE |
57 | def_bool y | 57 | def_bool y |
58 | 58 | ||
59 | config NEED_SG_DMA_LENGTH | ||
60 | def_bool y | ||
61 | |||
59 | config SWIOTLB | 62 | config SWIOTLB |
60 | bool | 63 | bool |
61 | 64 | ||
@@ -495,6 +498,14 @@ config HAVE_ARCH_NODEDATA_EXTENSION | |||
495 | def_bool y | 498 | def_bool y |
496 | depends on NUMA | 499 | depends on NUMA |
497 | 500 | ||
501 | config USE_PERCPU_NUMA_NODE_ID | ||
502 | def_bool y | ||
503 | depends on NUMA | ||
504 | |||
505 | config HAVE_MEMORYLESS_NODES | ||
506 | def_bool y | ||
507 | depends on NUMA | ||
508 | |||
498 | config ARCH_PROC_KCORE_TEXT | 509 | config ARCH_PROC_KCORE_TEXT |
499 | def_bool y | 510 | def_bool y |
500 | depends on PROC_KCORE | 511 | depends on PROC_KCORE |
diff --git a/arch/ia64/include/asm/scatterlist.h b/arch/ia64/include/asm/scatterlist.h index d8e98961dec7..f299a4fb25c8 100644 --- a/arch/ia64/include/asm/scatterlist.h +++ b/arch/ia64/include/asm/scatterlist.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef _ASM_IA64_SCATTERLIST_H | 1 | #ifndef _ASM_IA64_SCATTERLIST_H |
2 | #define _ASM_IA64_SCATTERLIST_H | 2 | #define _ASM_IA64_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm-generic/scatterlist.h> | ||
4 | /* | 5 | /* |
5 | * It used to be that ISA_DMA_THRESHOLD had something to do with the | 6 | * It used to be that ISA_DMA_THRESHOLD had something to do with the |
6 | * DMA-limits of ISA-devices. Nowadays, its only remaining use (apart | 7 | * DMA-limits of ISA-devices. Nowadays, its only remaining use (apart |
@@ -10,7 +11,6 @@ | |||
10 | * that's 4GB - 1. | 11 | * that's 4GB - 1. |
11 | */ | 12 | */ |
12 | #define ISA_DMA_THRESHOLD 0xffffffff | 13 | #define ISA_DMA_THRESHOLD 0xffffffff |
13 | 14 | #define ARCH_HAS_SG_CHAIN | |
14 | #include <asm-generic/scatterlist.h> | ||
15 | 15 | ||
16 | #endif /* _ASM_IA64_SCATTERLIST_H */ | 16 | #endif /* _ASM_IA64_SCATTERLIST_H */ |
diff --git a/arch/ia64/include/asm/topology.h b/arch/ia64/include/asm/topology.h index d323071d0f91..09f646753d1a 100644 --- a/arch/ia64/include/asm/topology.h +++ b/arch/ia64/include/asm/topology.h | |||
@@ -26,11 +26,6 @@ | |||
26 | #define RECLAIM_DISTANCE 15 | 26 | #define RECLAIM_DISTANCE 15 |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * Returns the number of the node containing CPU 'cpu' | ||
30 | */ | ||
31 | #define cpu_to_node(cpu) (int)(cpu_to_node_map[cpu]) | ||
32 | |||
33 | /* | ||
34 | * Returns a bitmask of CPUs on Node 'node'. | 29 | * Returns a bitmask of CPUs on Node 'node'. |
35 | */ | 30 | */ |
36 | #define cpumask_of_node(node) ((node) == -1 ? \ | 31 | #define cpumask_of_node(node) ((node) == -1 ? \ |
diff --git a/arch/ia64/kernel/pci-swiotlb.c b/arch/ia64/kernel/pci-swiotlb.c index 3095654f9ab3..d9485d952ed0 100644 --- a/arch/ia64/kernel/pci-swiotlb.c +++ b/arch/ia64/kernel/pci-swiotlb.c | |||
@@ -31,8 +31,6 @@ struct dma_map_ops swiotlb_dma_ops = { | |||
31 | .unmap_sg = swiotlb_unmap_sg_attrs, | 31 | .unmap_sg = swiotlb_unmap_sg_attrs, |
32 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, | 32 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, |
33 | .sync_single_for_device = swiotlb_sync_single_for_device, | 33 | .sync_single_for_device = swiotlb_sync_single_for_device, |
34 | .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu, | ||
35 | .sync_single_range_for_device = swiotlb_sync_single_range_for_device, | ||
36 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, | 34 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, |
37 | .sync_sg_for_device = swiotlb_sync_sg_for_device, | 35 | .sync_sg_for_device = swiotlb_sync_sg_for_device, |
38 | .dma_supported = swiotlb_dma_supported, | 36 | .dma_supported = swiotlb_dma_supported, |
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 0dec7f702448..7c7909f9bc93 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c | |||
@@ -638,7 +638,7 @@ ptrace_attach_sync_user_rbs (struct task_struct *child) | |||
638 | */ | 638 | */ |
639 | 639 | ||
640 | read_lock(&tasklist_lock); | 640 | read_lock(&tasklist_lock); |
641 | if (child->signal) { | 641 | if (child->sighand) { |
642 | spin_lock_irq(&child->sighand->siglock); | 642 | spin_lock_irq(&child->sighand->siglock); |
643 | if (child->state == TASK_STOPPED && | 643 | if (child->state == TASK_STOPPED && |
644 | !test_and_set_tsk_thread_flag(child, TIF_RESTORE_RSE)) { | 644 | !test_and_set_tsk_thread_flag(child, TIF_RESTORE_RSE)) { |
@@ -662,7 +662,7 @@ ptrace_attach_sync_user_rbs (struct task_struct *child) | |||
662 | * job control stop, so that SIGCONT can be used to wake it up. | 662 | * job control stop, so that SIGCONT can be used to wake it up. |
663 | */ | 663 | */ |
664 | read_lock(&tasklist_lock); | 664 | read_lock(&tasklist_lock); |
665 | if (child->signal) { | 665 | if (child->sighand) { |
666 | spin_lock_irq(&child->sighand->siglock); | 666 | spin_lock_irq(&child->sighand->siglock); |
667 | if (child->state == TASK_TRACED && | 667 | if (child->state == TASK_TRACED && |
668 | (child->signal->flags & SIGNAL_STOP_STOPPED)) { | 668 | (child->signal->flags & SIGNAL_STOP_STOPPED)) { |
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index e5230b2ff2c5..518e876a410d 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
@@ -390,6 +390,12 @@ smp_callin (void) | |||
390 | 390 | ||
391 | fix_b0_for_bsp(); | 391 | fix_b0_for_bsp(); |
392 | 392 | ||
393 | /* | ||
394 | * numa_node_id() works after this. | ||
395 | */ | ||
396 | set_numa_node(cpu_to_node_map[cpuid]); | ||
397 | set_numa_mem(local_memory_node(cpu_to_node_map[cpuid])); | ||
398 | |||
393 | ipi_call_lock_irq(); | 399 | ipi_call_lock_irq(); |
394 | spin_lock(&vector_lock); | 400 | spin_lock(&vector_lock); |
395 | /* Setup the per cpu irq handling data structures */ | 401 | /* Setup the per cpu irq handling data structures */ |
@@ -632,6 +638,7 @@ void __devinit smp_prepare_boot_cpu(void) | |||
632 | { | 638 | { |
633 | cpu_set(smp_processor_id(), cpu_online_map); | 639 | cpu_set(smp_processor_id(), cpu_online_map); |
634 | cpu_set(smp_processor_id(), cpu_callin_map); | 640 | cpu_set(smp_processor_id(), cpu_callin_map); |
641 | set_numa_node(cpu_to_node_map[smp_processor_id()]); | ||
635 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 642 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
636 | paravirt_post_smp_prepare_boot_cpu(); | 643 | paravirt_post_smp_prepare_boot_cpu(); |
637 | } | 644 | } |
diff --git a/arch/m32r/include/asm/scatterlist.h b/arch/m32r/include/asm/scatterlist.h index 1ed372c73d0b..aeeddd8dac17 100644 --- a/arch/m32r/include/asm/scatterlist.h +++ b/arch/m32r/include/asm/scatterlist.h | |||
@@ -1,20 +1,7 @@ | |||
1 | #ifndef _ASM_M32R_SCATTERLIST_H | 1 | #ifndef _ASM_M32R_SCATTERLIST_H |
2 | #define _ASM_M32R_SCATTERLIST_H | 2 | #define _ASM_M32R_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | char * address; /* Location data is to be transferred to, NULL for | ||
11 | * highmem page */ | ||
12 | unsigned long page_link; | ||
13 | unsigned int offset;/* for highmem, page offset */ | ||
14 | |||
15 | dma_addr_t dma_address; | ||
16 | unsigned int length; | ||
17 | }; | ||
18 | 5 | ||
19 | #define ISA_DMA_THRESHOLD (0x1fffffff) | 6 | #define ISA_DMA_THRESHOLD (0x1fffffff) |
20 | 7 | ||
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index b5da298ba61d..2e3737b92ffc 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -7,6 +7,7 @@ config M68K | |||
7 | default y | 7 | default y |
8 | select HAVE_AOUT | 8 | select HAVE_AOUT |
9 | select HAVE_IDE | 9 | select HAVE_IDE |
10 | select GENERIC_ATOMIC64 | ||
10 | 11 | ||
11 | config MMU | 12 | config MMU |
12 | bool | 13 | bool |
diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index d2cc35d98532..b1577f741fa8 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c | |||
@@ -97,10 +97,6 @@ static void amiga_get_model(char *model); | |||
97 | static void amiga_get_hardware_list(struct seq_file *m); | 97 | static void amiga_get_hardware_list(struct seq_file *m); |
98 | /* amiga specific timer functions */ | 98 | /* amiga specific timer functions */ |
99 | static unsigned long amiga_gettimeoffset(void); | 99 | static unsigned long amiga_gettimeoffset(void); |
100 | static int a3000_hwclk(int, struct rtc_time *); | ||
101 | static int a2000_hwclk(int, struct rtc_time *); | ||
102 | static int amiga_set_clock_mmss(unsigned long); | ||
103 | static unsigned int amiga_get_ss(void); | ||
104 | extern void amiga_mksound(unsigned int count, unsigned int ticks); | 100 | extern void amiga_mksound(unsigned int count, unsigned int ticks); |
105 | static void amiga_reset(void); | 101 | static void amiga_reset(void); |
106 | extern void amiga_init_sound(void); | 102 | extern void amiga_init_sound(void); |
@@ -138,10 +134,6 @@ static struct { | |||
138 | } | 134 | } |
139 | }; | 135 | }; |
140 | 136 | ||
141 | static struct resource rtc_resource = { | ||
142 | .start = 0x00dc0000, .end = 0x00dcffff | ||
143 | }; | ||
144 | |||
145 | static struct resource ram_resource[NUM_MEMINFO]; | 137 | static struct resource ram_resource[NUM_MEMINFO]; |
146 | 138 | ||
147 | 139 | ||
@@ -387,15 +379,6 @@ void __init config_amiga(void) | |||
387 | mach_get_model = amiga_get_model; | 379 | mach_get_model = amiga_get_model; |
388 | mach_get_hardware_list = amiga_get_hardware_list; | 380 | mach_get_hardware_list = amiga_get_hardware_list; |
389 | mach_gettimeoffset = amiga_gettimeoffset; | 381 | mach_gettimeoffset = amiga_gettimeoffset; |
390 | if (AMIGAHW_PRESENT(A3000_CLK)) { | ||
391 | mach_hwclk = a3000_hwclk; | ||
392 | rtc_resource.name = "A3000 RTC"; | ||
393 | request_resource(&iomem_resource, &rtc_resource); | ||
394 | } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { | ||
395 | mach_hwclk = a2000_hwclk; | ||
396 | rtc_resource.name = "A2000 RTC"; | ||
397 | request_resource(&iomem_resource, &rtc_resource); | ||
398 | } | ||
399 | 382 | ||
400 | /* | 383 | /* |
401 | * default MAX_DMA=0xffffffff on all machines. If we don't do so, the SCSI | 384 | * default MAX_DMA=0xffffffff on all machines. If we don't do so, the SCSI |
@@ -404,8 +387,6 @@ void __init config_amiga(void) | |||
404 | */ | 387 | */ |
405 | mach_max_dma_address = 0xffffffff; | 388 | mach_max_dma_address = 0xffffffff; |
406 | 389 | ||
407 | mach_set_clock_mmss = amiga_set_clock_mmss; | ||
408 | mach_get_ss = amiga_get_ss; | ||
409 | mach_reset = amiga_reset; | 390 | mach_reset = amiga_reset; |
410 | #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) | 391 | #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) |
411 | mach_beep = amiga_mksound; | 392 | mach_beep = amiga_mksound; |
@@ -530,161 +511,6 @@ static unsigned long amiga_gettimeoffset(void) | |||
530 | return ticks + offset; | 511 | return ticks + offset; |
531 | } | 512 | } |
532 | 513 | ||
533 | static int a3000_hwclk(int op, struct rtc_time *t) | ||
534 | { | ||
535 | tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; | ||
536 | |||
537 | if (!op) { /* read */ | ||
538 | t->tm_sec = tod_3000.second1 * 10 + tod_3000.second2; | ||
539 | t->tm_min = tod_3000.minute1 * 10 + tod_3000.minute2; | ||
540 | t->tm_hour = tod_3000.hour1 * 10 + tod_3000.hour2; | ||
541 | t->tm_mday = tod_3000.day1 * 10 + tod_3000.day2; | ||
542 | t->tm_wday = tod_3000.weekday; | ||
543 | t->tm_mon = tod_3000.month1 * 10 + tod_3000.month2 - 1; | ||
544 | t->tm_year = tod_3000.year1 * 10 + tod_3000.year2; | ||
545 | if (t->tm_year <= 69) | ||
546 | t->tm_year += 100; | ||
547 | } else { | ||
548 | tod_3000.second1 = t->tm_sec / 10; | ||
549 | tod_3000.second2 = t->tm_sec % 10; | ||
550 | tod_3000.minute1 = t->tm_min / 10; | ||
551 | tod_3000.minute2 = t->tm_min % 10; | ||
552 | tod_3000.hour1 = t->tm_hour / 10; | ||
553 | tod_3000.hour2 = t->tm_hour % 10; | ||
554 | tod_3000.day1 = t->tm_mday / 10; | ||
555 | tod_3000.day2 = t->tm_mday % 10; | ||
556 | if (t->tm_wday != -1) | ||
557 | tod_3000.weekday = t->tm_wday; | ||
558 | tod_3000.month1 = (t->tm_mon + 1) / 10; | ||
559 | tod_3000.month2 = (t->tm_mon + 1) % 10; | ||
560 | if (t->tm_year >= 100) | ||
561 | t->tm_year -= 100; | ||
562 | tod_3000.year1 = t->tm_year / 10; | ||
563 | tod_3000.year2 = t->tm_year % 10; | ||
564 | } | ||
565 | |||
566 | tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
571 | static int a2000_hwclk(int op, struct rtc_time *t) | ||
572 | { | ||
573 | int cnt = 5; | ||
574 | |||
575 | tod_2000.cntrl1 = TOD2000_CNTRL1_HOLD; | ||
576 | |||
577 | while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) { | ||
578 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; | ||
579 | udelay(70); | ||
580 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; | ||
581 | --cnt; | ||
582 | } | ||
583 | |||
584 | if (!cnt) | ||
585 | printk(KERN_INFO "hwclk: timed out waiting for RTC (0x%x)\n", | ||
586 | tod_2000.cntrl1); | ||
587 | |||
588 | if (!op) { /* read */ | ||
589 | t->tm_sec = tod_2000.second1 * 10 + tod_2000.second2; | ||
590 | t->tm_min = tod_2000.minute1 * 10 + tod_2000.minute2; | ||
591 | t->tm_hour = (tod_2000.hour1 & 3) * 10 + tod_2000.hour2; | ||
592 | t->tm_mday = tod_2000.day1 * 10 + tod_2000.day2; | ||
593 | t->tm_wday = tod_2000.weekday; | ||
594 | t->tm_mon = tod_2000.month1 * 10 + tod_2000.month2 - 1; | ||
595 | t->tm_year = tod_2000.year1 * 10 + tod_2000.year2; | ||
596 | if (t->tm_year <= 69) | ||
597 | t->tm_year += 100; | ||
598 | |||
599 | if (!(tod_2000.cntrl3 & TOD2000_CNTRL3_24HMODE)) { | ||
600 | if (!(tod_2000.hour1 & TOD2000_HOUR1_PM) && t->tm_hour == 12) | ||
601 | t->tm_hour = 0; | ||
602 | else if ((tod_2000.hour1 & TOD2000_HOUR1_PM) && t->tm_hour != 12) | ||
603 | t->tm_hour += 12; | ||
604 | } | ||
605 | } else { | ||
606 | tod_2000.second1 = t->tm_sec / 10; | ||
607 | tod_2000.second2 = t->tm_sec % 10; | ||
608 | tod_2000.minute1 = t->tm_min / 10; | ||
609 | tod_2000.minute2 = t->tm_min % 10; | ||
610 | if (tod_2000.cntrl3 & TOD2000_CNTRL3_24HMODE) | ||
611 | tod_2000.hour1 = t->tm_hour / 10; | ||
612 | else if (t->tm_hour >= 12) | ||
613 | tod_2000.hour1 = TOD2000_HOUR1_PM + | ||
614 | (t->tm_hour - 12) / 10; | ||
615 | else | ||
616 | tod_2000.hour1 = t->tm_hour / 10; | ||
617 | tod_2000.hour2 = t->tm_hour % 10; | ||
618 | tod_2000.day1 = t->tm_mday / 10; | ||
619 | tod_2000.day2 = t->tm_mday % 10; | ||
620 | if (t->tm_wday != -1) | ||
621 | tod_2000.weekday = t->tm_wday; | ||
622 | tod_2000.month1 = (t->tm_mon + 1) / 10; | ||
623 | tod_2000.month2 = (t->tm_mon + 1) % 10; | ||
624 | if (t->tm_year >= 100) | ||
625 | t->tm_year -= 100; | ||
626 | tod_2000.year1 = t->tm_year / 10; | ||
627 | tod_2000.year2 = t->tm_year % 10; | ||
628 | } | ||
629 | |||
630 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; | ||
631 | |||
632 | return 0; | ||
633 | } | ||
634 | |||
635 | static int amiga_set_clock_mmss(unsigned long nowtime) | ||
636 | { | ||
637 | short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||
638 | |||
639 | if (AMIGAHW_PRESENT(A3000_CLK)) { | ||
640 | tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; | ||
641 | |||
642 | tod_3000.second1 = real_seconds / 10; | ||
643 | tod_3000.second2 = real_seconds % 10; | ||
644 | tod_3000.minute1 = real_minutes / 10; | ||
645 | tod_3000.minute2 = real_minutes % 10; | ||
646 | |||
647 | tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; | ||
648 | } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { | ||
649 | int cnt = 5; | ||
650 | |||
651 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; | ||
652 | |||
653 | while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) { | ||
654 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; | ||
655 | udelay(70); | ||
656 | tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; | ||
657 | --cnt; | ||
658 | } | ||
659 | |||
660 | if (!cnt) | ||
661 | printk(KERN_INFO "set_clock_mmss: timed out waiting for RTC (0x%x)\n", tod_2000.cntrl1); | ||
662 | |||
663 | tod_2000.second1 = real_seconds / 10; | ||
664 | tod_2000.second2 = real_seconds % 10; | ||
665 | tod_2000.minute1 = real_minutes / 10; | ||
666 | tod_2000.minute2 = real_minutes % 10; | ||
667 | |||
668 | tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; | ||
669 | } | ||
670 | |||
671 | return 0; | ||
672 | } | ||
673 | |||
674 | static unsigned int amiga_get_ss(void) | ||
675 | { | ||
676 | unsigned int s; | ||
677 | |||
678 | if (AMIGAHW_PRESENT(A3000_CLK)) { | ||
679 | tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; | ||
680 | s = tod_3000.second1 * 10 + tod_3000.second2; | ||
681 | tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; | ||
682 | } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { | ||
683 | s = tod_2000.second1 * 10 + tod_2000.second2; | ||
684 | } | ||
685 | return s; | ||
686 | } | ||
687 | |||
688 | static NORET_TYPE void amiga_reset(void) | 514 | static NORET_TYPE void amiga_reset(void) |
689 | ATTRIB_NORET; | 515 | ATTRIB_NORET; |
690 | 516 | ||
diff --git a/arch/m68k/amiga/platform.c b/arch/m68k/amiga/platform.c index 38f18bf14737..7fd8b41723ea 100644 --- a/arch/m68k/amiga/platform.c +++ b/arch/m68k/amiga/platform.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/zorro.h> | 11 | #include <linux/zorro.h> |
12 | 12 | ||
13 | #include <asm/amigahw.h> | 13 | #include <asm/amigahw.h> |
14 | #include <asm/amigayle.h> | ||
14 | 15 | ||
15 | 16 | ||
16 | #ifdef CONFIG_ZORRO | 17 | #ifdef CONFIG_ZORRO |
@@ -55,11 +56,77 @@ static int __init amiga_init_bus(void) | |||
55 | 56 | ||
56 | subsys_initcall(amiga_init_bus); | 57 | subsys_initcall(amiga_init_bus); |
57 | 58 | ||
58 | #endif /* CONFIG_ZORRO */ | 59 | |
60 | static int z_dev_present(zorro_id id) | ||
61 | { | ||
62 | unsigned int i; | ||
63 | |||
64 | for (i = 0; i < zorro_num_autocon; i++) | ||
65 | if (zorro_autocon[i].rom.er_Manufacturer == ZORRO_MANUF(id) && | ||
66 | zorro_autocon[i].rom.er_Product == ZORRO_PROD(id)) | ||
67 | return 1; | ||
68 | |||
69 | return 0; | ||
70 | } | ||
71 | |||
72 | #else /* !CONFIG_ZORRO */ | ||
73 | |||
74 | static inline int z_dev_present(zorro_id id) { return 0; } | ||
75 | |||
76 | #endif /* !CONFIG_ZORRO */ | ||
77 | |||
78 | |||
79 | static const struct resource a3000_scsi_resource __initconst = { | ||
80 | .start = 0xdd0000, | ||
81 | .end = 0xdd00ff, | ||
82 | .flags = IORESOURCE_MEM, | ||
83 | }; | ||
84 | |||
85 | |||
86 | static const struct resource a4000t_scsi_resource __initconst = { | ||
87 | .start = 0xdd0000, | ||
88 | .end = 0xdd0fff, | ||
89 | .flags = IORESOURCE_MEM, | ||
90 | }; | ||
91 | |||
92 | |||
93 | static const struct resource a1200_ide_resource __initconst = { | ||
94 | .start = 0xda0000, | ||
95 | .end = 0xda1fff, | ||
96 | .flags = IORESOURCE_MEM, | ||
97 | }; | ||
98 | |||
99 | static const struct gayle_ide_platform_data a1200_ide_pdata __initconst = { | ||
100 | .base = 0xda0000, | ||
101 | .irqport = 0xda9000, | ||
102 | .explicit_ack = 1, | ||
103 | }; | ||
104 | |||
105 | |||
106 | static const struct resource a4000_ide_resource __initconst = { | ||
107 | .start = 0xdd2000, | ||
108 | .end = 0xdd3fff, | ||
109 | .flags = IORESOURCE_MEM, | ||
110 | }; | ||
111 | |||
112 | static const struct gayle_ide_platform_data a4000_ide_pdata __initconst = { | ||
113 | .base = 0xdd2020, | ||
114 | .irqport = 0xdd3020, | ||
115 | .explicit_ack = 0, | ||
116 | }; | ||
117 | |||
118 | |||
119 | static const struct resource amiga_rtc_resource __initconst = { | ||
120 | .start = 0x00dc0000, | ||
121 | .end = 0x00dcffff, | ||
122 | .flags = IORESOURCE_MEM, | ||
123 | }; | ||
59 | 124 | ||
60 | 125 | ||
61 | static int __init amiga_init_devices(void) | 126 | static int __init amiga_init_devices(void) |
62 | { | 127 | { |
128 | struct platform_device *pdev; | ||
129 | |||
63 | if (!MACH_IS_AMIGA) | 130 | if (!MACH_IS_AMIGA) |
64 | return -ENODEV; | 131 | return -ENODEV; |
65 | 132 | ||
@@ -77,6 +144,53 @@ static int __init amiga_init_devices(void) | |||
77 | if (AMIGAHW_PRESENT(AMI_FLOPPY)) | 144 | if (AMIGAHW_PRESENT(AMI_FLOPPY)) |
78 | platform_device_register_simple("amiga-floppy", -1, NULL, 0); | 145 | platform_device_register_simple("amiga-floppy", -1, NULL, 0); |
79 | 146 | ||
147 | if (AMIGAHW_PRESENT(A3000_SCSI)) | ||
148 | platform_device_register_simple("amiga-a3000-scsi", -1, | ||
149 | &a3000_scsi_resource, 1); | ||
150 | |||
151 | if (AMIGAHW_PRESENT(A4000_SCSI)) | ||
152 | platform_device_register_simple("amiga-a4000t-scsi", -1, | ||
153 | &a4000t_scsi_resource, 1); | ||
154 | |||
155 | if (AMIGAHW_PRESENT(A1200_IDE) || | ||
156 | z_dev_present(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE)) { | ||
157 | pdev = platform_device_register_simple("amiga-gayle-ide", -1, | ||
158 | &a1200_ide_resource, 1); | ||
159 | platform_device_add_data(pdev, &a1200_ide_pdata, | ||
160 | sizeof(a1200_ide_pdata)); | ||
161 | } | ||
162 | |||
163 | if (AMIGAHW_PRESENT(A4000_IDE)) { | ||
164 | pdev = platform_device_register_simple("amiga-gayle-ide", -1, | ||
165 | &a4000_ide_resource, 1); | ||
166 | platform_device_add_data(pdev, &a4000_ide_pdata, | ||
167 | sizeof(a4000_ide_pdata)); | ||
168 | } | ||
169 | |||
170 | |||
171 | /* other I/O hardware */ | ||
172 | if (AMIGAHW_PRESENT(AMI_KEYBOARD)) | ||
173 | platform_device_register_simple("amiga-keyboard", -1, NULL, 0); | ||
174 | |||
175 | if (AMIGAHW_PRESENT(AMI_MOUSE)) | ||
176 | platform_device_register_simple("amiga-mouse", -1, NULL, 0); | ||
177 | |||
178 | if (AMIGAHW_PRESENT(AMI_SERIAL)) | ||
179 | platform_device_register_simple("amiga-serial", -1, NULL, 0); | ||
180 | |||
181 | if (AMIGAHW_PRESENT(AMI_PARALLEL)) | ||
182 | platform_device_register_simple("amiga-parallel", -1, NULL, 0); | ||
183 | |||
184 | |||
185 | /* real time clocks */ | ||
186 | if (AMIGAHW_PRESENT(A2000_CLK)) | ||
187 | platform_device_register_simple("rtc-msm6242", -1, | ||
188 | &amiga_rtc_resource, 1); | ||
189 | |||
190 | if (AMIGAHW_PRESENT(A3000_CLK)) | ||
191 | platform_device_register_simple("rtc-rp5c01", -1, | ||
192 | &amiga_rtc_resource, 1); | ||
193 | |||
80 | return 0; | 194 | return 0; |
81 | } | 195 | } |
82 | 196 | ||
diff --git a/arch/m68k/include/asm/amigayle.h b/arch/m68k/include/asm/amigayle.h index bb5a6aa329f3..a01453d9c231 100644 --- a/arch/m68k/include/asm/amigayle.h +++ b/arch/m68k/include/asm/amigayle.h | |||
@@ -104,4 +104,10 @@ struct GAYLE { | |||
104 | #define GAYLE_CFG_250NS 0x00 | 104 | #define GAYLE_CFG_250NS 0x00 |
105 | #define GAYLE_CFG_720NS 0x0c | 105 | #define GAYLE_CFG_720NS 0x0c |
106 | 106 | ||
107 | struct gayle_ide_platform_data { | ||
108 | unsigned long base; | ||
109 | unsigned long irqport; | ||
110 | int explicit_ack; /* A1200 IDE needs explicit ack */ | ||
111 | }; | ||
112 | |||
107 | #endif /* asm-m68k/amigayle.h */ | 113 | #endif /* asm-m68k/amigayle.h */ |
diff --git a/arch/m68k/include/asm/atomic.h b/arch/m68k/include/asm/atomic.h index 8d29145ebb27..eab36dcacf6c 100644 --- a/arch/m68k/include/asm/atomic.h +++ b/arch/m68k/include/asm/atomic.h | |||
@@ -3,3 +3,5 @@ | |||
3 | #else | 3 | #else |
4 | #include "atomic_mm.h" | 4 | #include "atomic_mm.h" |
5 | #endif | 5 | #endif |
6 | |||
7 | #include <asm-generic/atomic64.h> | ||
diff --git a/arch/m68k/include/asm/cache.h b/arch/m68k/include/asm/cache.h index fed3fd30de7e..ecafbe1718c3 100644 --- a/arch/m68k/include/asm/cache.h +++ b/arch/m68k/include/asm/cache.h | |||
@@ -8,4 +8,6 @@ | |||
8 | #define L1_CACHE_SHIFT 4 | 8 | #define L1_CACHE_SHIFT 4 |
9 | #define L1_CACHE_BYTES (1<< L1_CACHE_SHIFT) | 9 | #define L1_CACHE_BYTES (1<< L1_CACHE_SHIFT) |
10 | 10 | ||
11 | #define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES | ||
12 | |||
11 | #endif | 13 | #endif |
diff --git a/arch/m68k/include/asm/scatterlist.h b/arch/m68k/include/asm/scatterlist.h index e27ad902b1cf..175da06c6b95 100644 --- a/arch/m68k/include/asm/scatterlist.h +++ b/arch/m68k/include/asm/scatterlist.h | |||
@@ -1,23 +1,9 @@ | |||
1 | #ifndef _M68K_SCATTERLIST_H | 1 | #ifndef _M68K_SCATTERLIST_H |
2 | #define _M68K_SCATTERLIST_H | 2 | #define _M68K_SCATTERLIST_H |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | unsigned long page_link; | ||
11 | unsigned int offset; | ||
12 | unsigned int length; | ||
13 | |||
14 | dma_addr_t dma_address; /* A place to hang host-specific addresses at. */ | ||
15 | }; | ||
16 | 5 | ||
17 | /* This is bogus and should go away. */ | 6 | /* This is bogus and should go away. */ |
18 | #define ISA_DMA_THRESHOLD (0x00ffffff) | 7 | #define ISA_DMA_THRESHOLD (0x00ffffff) |
19 | 8 | ||
20 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
21 | #define sg_dma_len(sg) ((sg)->length) | ||
22 | |||
23 | #endif /* !(_M68K_SCATTERLIST_H) */ | 9 | #endif /* !(_M68K_SCATTERLIST_H) */ |
diff --git a/arch/microblaze/include/asm/scatterlist.h b/arch/microblaze/include/asm/scatterlist.h index 35d786fe93ae..dc4a8900cc80 100644 --- a/arch/microblaze/include/asm/scatterlist.h +++ b/arch/microblaze/include/asm/scatterlist.h | |||
@@ -1 +1,3 @@ | |||
1 | #include <asm-generic/scatterlist.h> | 1 | #include <asm-generic/scatterlist.h> |
2 | |||
3 | #define ISA_DMA_THRESHOLD (~0UL) | ||
diff --git a/arch/mips/include/asm/scatterlist.h b/arch/mips/include/asm/scatterlist.h index 83d69fe17c9f..9af65e79be36 100644 --- a/arch/mips/include/asm/scatterlist.h +++ b/arch/mips/include/asm/scatterlist.h | |||
@@ -1,27 +1,7 @@ | |||
1 | #ifndef __ASM_SCATTERLIST_H | 1 | #ifndef __ASM_SCATTERLIST_H |
2 | #define __ASM_SCATTERLIST_H | 2 | #define __ASM_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/types.h> | 4 | #include <asm-generic/scatterlist.h> |
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | unsigned long page_link; | ||
11 | unsigned int offset; | ||
12 | dma_addr_t dma_address; | ||
13 | unsigned int length; | ||
14 | }; | ||
15 | |||
16 | /* | ||
17 | * These macros should be used after a pci_map_sg call has been done | ||
18 | * to get bus addresses of each of the SG entries and their lengths. | ||
19 | * You should only work with the number of sg entries pci_map_sg | ||
20 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
21 | * is 0. | ||
22 | */ | ||
23 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
24 | #define sg_dma_len(sg) ((sg)->length) | ||
25 | 5 | ||
26 | #define ISA_DMA_THRESHOLD (0x00ffffffUL) | 6 | #define ISA_DMA_THRESHOLD (0x00ffffffUL) |
27 | 7 | ||
diff --git a/arch/mn10300/include/asm/scatterlist.h b/arch/mn10300/include/asm/scatterlist.h index 67535901b9ff..7bd00b9e030d 100644 --- a/arch/mn10300/include/asm/scatterlist.h +++ b/arch/mn10300/include/asm/scatterlist.h | |||
@@ -11,45 +11,8 @@ | |||
11 | #ifndef _ASM_SCATTERLIST_H | 11 | #ifndef _ASM_SCATTERLIST_H |
12 | #define _ASM_SCATTERLIST_H | 12 | #define _ASM_SCATTERLIST_H |
13 | 13 | ||
14 | #include <asm/types.h> | 14 | #include <asm-generic/scatterlist.h> |
15 | |||
16 | /* | ||
17 | * Drivers must set either ->address or (preferred) page and ->offset | ||
18 | * to indicate where data must be transferred to/from. | ||
19 | * | ||
20 | * Using page is recommended since it handles highmem data as well as | ||
21 | * low mem. ->address is restricted to data which has a virtual mapping, and | ||
22 | * it will go away in the future. Updating to page can be automated very | ||
23 | * easily -- something like | ||
24 | * | ||
25 | * sg->address = some_ptr; | ||
26 | * | ||
27 | * can be rewritten as | ||
28 | * | ||
29 | * sg_set_page(virt_to_page(some_ptr)); | ||
30 | * sg->offset = (unsigned long) some_ptr & ~PAGE_MASK; | ||
31 | * | ||
32 | * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens | ||
33 | */ | ||
34 | struct scatterlist { | ||
35 | #ifdef CONFIG_DEBUG_SG | ||
36 | unsigned long sg_magic; | ||
37 | #endif | ||
38 | unsigned long page_link; | ||
39 | unsigned int offset; /* for highmem, page offset */ | ||
40 | dma_addr_t dma_address; | ||
41 | unsigned int length; | ||
42 | }; | ||
43 | 15 | ||
44 | #define ISA_DMA_THRESHOLD (0x00ffffff) | 16 | #define ISA_DMA_THRESHOLD (0x00ffffff) |
45 | 17 | ||
46 | /* | ||
47 | * These macros should be used after a pci_map_sg call has been done | ||
48 | * to get bus addresses of each of the SG entries and their lengths. | ||
49 | * You should only work with the number of sg entries pci_map_sg | ||
50 | * returns. | ||
51 | */ | ||
52 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
53 | #define sg_dma_len(sg) ((sg)->length) | ||
54 | |||
55 | #endif /* _ASM_SCATTERLIST_H */ | 18 | #endif /* _ASM_SCATTERLIST_H */ |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 9c4da3d63bfb..05a366a5c4d5 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -98,6 +98,9 @@ config STACKTRACE_SUPPORT | |||
98 | config NEED_DMA_MAP_STATE | 98 | config NEED_DMA_MAP_STATE |
99 | def_bool y | 99 | def_bool y |
100 | 100 | ||
101 | config NEED_SG_DMA_LENGTH | ||
102 | def_bool y | ||
103 | |||
101 | config ISA_DMA_API | 104 | config ISA_DMA_API |
102 | bool | 105 | bool |
103 | 106 | ||
diff --git a/arch/parisc/include/asm/scatterlist.h b/arch/parisc/include/asm/scatterlist.h index 62269b31ebf4..2c3b79b54b28 100644 --- a/arch/parisc/include/asm/scatterlist.h +++ b/arch/parisc/include/asm/scatterlist.h | |||
@@ -3,25 +3,9 @@ | |||
3 | 3 | ||
4 | #include <asm/page.h> | 4 | #include <asm/page.h> |
5 | #include <asm/types.h> | 5 | #include <asm/types.h> |
6 | 6 | #include <asm-generic/scatterlist.h> | |
7 | struct scatterlist { | ||
8 | #ifdef CONFIG_DEBUG_SG | ||
9 | unsigned long sg_magic; | ||
10 | #endif | ||
11 | unsigned long page_link; | ||
12 | unsigned int offset; | ||
13 | |||
14 | unsigned int length; | ||
15 | |||
16 | /* an IOVA can be 64-bits on some PA-Risc platforms. */ | ||
17 | dma_addr_t iova; /* I/O Virtual Address */ | ||
18 | __u32 iova_length; /* bytes mapped */ | ||
19 | }; | ||
20 | |||
21 | #define sg_virt_addr(sg) ((unsigned long)sg_virt(sg)) | ||
22 | #define sg_dma_address(sg) ((sg)->iova) | ||
23 | #define sg_dma_len(sg) ((sg)->iova_length) | ||
24 | 7 | ||
25 | #define ISA_DMA_THRESHOLD (~0UL) | 8 | #define ISA_DMA_THRESHOLD (~0UL) |
9 | #define sg_virt_addr(sg) ((unsigned long)sg_virt(sg)) | ||
26 | 10 | ||
27 | #endif /* _ASM_PARISC_SCATTERLIST_H */ | 11 | #endif /* _ASM_PARISC_SCATTERLIST_H */ |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index c4c4549c22bb..66a315e06dce 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -663,6 +663,9 @@ config ZONE_DMA | |||
663 | config NEED_DMA_MAP_STATE | 663 | config NEED_DMA_MAP_STATE |
664 | def_bool (PPC64 || NOT_COHERENT_CACHE) | 664 | def_bool (PPC64 || NOT_COHERENT_CACHE) |
665 | 665 | ||
666 | config NEED_SG_DMA_LENGTH | ||
667 | def_bool y | ||
668 | |||
666 | config GENERIC_ISA_DMA | 669 | config GENERIC_ISA_DMA |
667 | bool | 670 | bool |
668 | depends on PPC64 || POWER4 || 6xx && !CPM2 | 671 | depends on PPC64 || POWER4 || 6xx && !CPM2 |
diff --git a/arch/powerpc/include/asm/scatterlist.h b/arch/powerpc/include/asm/scatterlist.h index 912bf597870f..34cc78fd0ef4 100644 --- a/arch/powerpc/include/asm/scatterlist.h +++ b/arch/powerpc/include/asm/scatterlist.h | |||
@@ -9,38 +9,12 @@ | |||
9 | * 2 of the License, or (at your option) any later version. | 9 | * 2 of the License, or (at your option) any later version. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #ifdef __KERNEL__ | ||
13 | #include <linux/types.h> | ||
14 | #include <asm/dma.h> | 12 | #include <asm/dma.h> |
15 | 13 | #include <asm-generic/scatterlist.h> | |
16 | struct scatterlist { | ||
17 | #ifdef CONFIG_DEBUG_SG | ||
18 | unsigned long sg_magic; | ||
19 | #endif | ||
20 | unsigned long page_link; | ||
21 | unsigned int offset; | ||
22 | unsigned int length; | ||
23 | |||
24 | /* For TCE or SWIOTLB support */ | ||
25 | dma_addr_t dma_address; | ||
26 | u32 dma_length; | ||
27 | }; | ||
28 | |||
29 | /* | ||
30 | * These macros should be used after a dma_map_sg call has been done | ||
31 | * to get bus addresses of each of the SG entries and their lengths. | ||
32 | * You should only work with the number of sg entries pci_map_sg | ||
33 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
34 | * is 0. | ||
35 | */ | ||
36 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
37 | #define sg_dma_len(sg) ((sg)->dma_length) | ||
38 | 14 | ||
39 | #ifdef __powerpc64__ | 15 | #ifdef __powerpc64__ |
40 | #define ISA_DMA_THRESHOLD (~0UL) | 16 | #define ISA_DMA_THRESHOLD (~0UL) |
41 | #endif | 17 | #endif |
42 | |||
43 | #define ARCH_HAS_SG_CHAIN | 18 | #define ARCH_HAS_SG_CHAIN |
44 | 19 | ||
45 | #endif /* __KERNEL__ */ | ||
46 | #endif /* _ASM_POWERPC_SCATTERLIST_H */ | 20 | #endif /* _ASM_POWERPC_SCATTERLIST_H */ |
diff --git a/arch/powerpc/include/asm/sfp-machine.h b/arch/powerpc/include/asm/sfp-machine.h index 8b8fab91ad1e..3a7a67a0d006 100644 --- a/arch/powerpc/include/asm/sfp-machine.h +++ b/arch/powerpc/include/asm/sfp-machine.h | |||
@@ -353,6 +353,12 @@ | |||
353 | #define abort() \ | 353 | #define abort() \ |
354 | return 0 | 354 | return 0 |
355 | 355 | ||
356 | #ifdef __BIG_ENDIAN | ||
357 | #define __BYTE_ORDER __BIG_ENDIAN | ||
358 | #else | ||
359 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
360 | #endif | ||
361 | |||
356 | /* Exception flags. */ | 362 | /* Exception flags. */ |
357 | #define EFLAG_INVALID (1 << (31 - 2)) | 363 | #define EFLAG_INVALID (1 << (31 - 2)) |
358 | #define EFLAG_OVERFLOW (1 << (31 - 3)) | 364 | #define EFLAG_OVERFLOW (1 << (31 - 3)) |
diff --git a/arch/powerpc/kernel/dma-swiotlb.c b/arch/powerpc/kernel/dma-swiotlb.c index 4ff4da2c238b..e7fe218b8697 100644 --- a/arch/powerpc/kernel/dma-swiotlb.c +++ b/arch/powerpc/kernel/dma-swiotlb.c | |||
@@ -39,8 +39,8 @@ struct dma_map_ops swiotlb_dma_ops = { | |||
39 | .dma_supported = swiotlb_dma_supported, | 39 | .dma_supported = swiotlb_dma_supported, |
40 | .map_page = swiotlb_map_page, | 40 | .map_page = swiotlb_map_page, |
41 | .unmap_page = swiotlb_unmap_page, | 41 | .unmap_page = swiotlb_unmap_page, |
42 | .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu, | 42 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, |
43 | .sync_single_range_for_device = swiotlb_sync_single_range_for_device, | 43 | .sync_single_for_device = swiotlb_sync_single_for_device, |
44 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, | 44 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, |
45 | .sync_sg_for_device = swiotlb_sync_sg_for_device, | 45 | .sync_sg_for_device = swiotlb_sync_sg_for_device, |
46 | .mapping_error = swiotlb_dma_mapping_error, | 46 | .mapping_error = swiotlb_dma_mapping_error, |
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index 6c1df5757cd6..8d1de6f31d5a 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c | |||
@@ -127,11 +127,11 @@ static inline void dma_direct_sync_sg(struct device *dev, | |||
127 | __dma_sync_page(sg_page(sg), sg->offset, sg->length, direction); | 127 | __dma_sync_page(sg_page(sg), sg->offset, sg->length, direction); |
128 | } | 128 | } |
129 | 129 | ||
130 | static inline void dma_direct_sync_single_range(struct device *dev, | 130 | static inline void dma_direct_sync_single(struct device *dev, |
131 | dma_addr_t dma_handle, unsigned long offset, size_t size, | 131 | dma_addr_t dma_handle, size_t size, |
132 | enum dma_data_direction direction) | 132 | enum dma_data_direction direction) |
133 | { | 133 | { |
134 | __dma_sync(bus_to_virt(dma_handle+offset), size, direction); | 134 | __dma_sync(bus_to_virt(dma_handle), size, direction); |
135 | } | 135 | } |
136 | #endif | 136 | #endif |
137 | 137 | ||
@@ -144,8 +144,8 @@ struct dma_map_ops dma_direct_ops = { | |||
144 | .map_page = dma_direct_map_page, | 144 | .map_page = dma_direct_map_page, |
145 | .unmap_page = dma_direct_unmap_page, | 145 | .unmap_page = dma_direct_unmap_page, |
146 | #ifdef CONFIG_NOT_COHERENT_CACHE | 146 | #ifdef CONFIG_NOT_COHERENT_CACHE |
147 | .sync_single_range_for_cpu = dma_direct_sync_single_range, | 147 | .sync_single_for_cpu = dma_direct_sync_single, |
148 | .sync_single_range_for_device = dma_direct_sync_single_range, | 148 | .sync_single_for_device = dma_direct_sync_single, |
149 | .sync_sg_for_cpu = dma_direct_sync_sg, | 149 | .sync_sg_for_cpu = dma_direct_sync_sg, |
150 | .sync_sg_for_device = dma_direct_sync_sg, | 150 | .sync_sg_for_device = dma_direct_sync_sg, |
151 | #endif | 151 | #endif |
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 6a1fde0d22b0..cd37e49e7034 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c | |||
@@ -1,6 +1,15 @@ | |||
1 | /* | 1 | /* |
2 | * Freescale MPC85xx/MPC86xx RapidIO support | 2 | * Freescale MPC85xx/MPC86xx RapidIO support |
3 | * | 3 | * |
4 | * Copyright 2009 Sysgo AG | ||
5 | * Thomas Moll <thomas.moll@sysgo.com> | ||
6 | * - fixed maintenance access routines, check for aligned access | ||
7 | * | ||
8 | * Copyright 2009 Integrated Device Technology, Inc. | ||
9 | * Alex Bounine <alexandre.bounine@idt.com> | ||
10 | * - Added Port-Write message handling | ||
11 | * - Added Machine Check exception handling | ||
12 | * | ||
4 | * Copyright (C) 2007, 2008 Freescale Semiconductor, Inc. | 13 | * Copyright (C) 2007, 2008 Freescale Semiconductor, Inc. |
5 | * Zhang Wei <wei.zhang@freescale.com> | 14 | * Zhang Wei <wei.zhang@freescale.com> |
6 | * | 15 | * |
@@ -24,19 +33,30 @@ | |||
24 | #include <linux/of_platform.h> | 33 | #include <linux/of_platform.h> |
25 | #include <linux/delay.h> | 34 | #include <linux/delay.h> |
26 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/kfifo.h> | ||
27 | 37 | ||
28 | #include <asm/io.h> | 38 | #include <asm/io.h> |
39 | #include <asm/machdep.h> | ||
40 | #include <asm/uaccess.h> | ||
41 | |||
42 | #undef DEBUG_PW /* Port-Write debugging */ | ||
29 | 43 | ||
30 | /* RapidIO definition irq, which read from OF-tree */ | 44 | /* RapidIO definition irq, which read from OF-tree */ |
31 | #define IRQ_RIO_BELL(m) (((struct rio_priv *)(m->priv))->bellirq) | 45 | #define IRQ_RIO_BELL(m) (((struct rio_priv *)(m->priv))->bellirq) |
32 | #define IRQ_RIO_TX(m) (((struct rio_priv *)(m->priv))->txirq) | 46 | #define IRQ_RIO_TX(m) (((struct rio_priv *)(m->priv))->txirq) |
33 | #define IRQ_RIO_RX(m) (((struct rio_priv *)(m->priv))->rxirq) | 47 | #define IRQ_RIO_RX(m) (((struct rio_priv *)(m->priv))->rxirq) |
48 | #define IRQ_RIO_PW(m) (((struct rio_priv *)(m->priv))->pwirq) | ||
34 | 49 | ||
35 | #define RIO_ATMU_REGS_OFFSET 0x10c00 | 50 | #define RIO_ATMU_REGS_OFFSET 0x10c00 |
36 | #define RIO_P_MSG_REGS_OFFSET 0x11000 | 51 | #define RIO_P_MSG_REGS_OFFSET 0x11000 |
37 | #define RIO_S_MSG_REGS_OFFSET 0x13000 | 52 | #define RIO_S_MSG_REGS_OFFSET 0x13000 |
38 | #define RIO_ESCSR 0x158 | 53 | #define RIO_ESCSR 0x158 |
39 | #define RIO_CCSR 0x15c | 54 | #define RIO_CCSR 0x15c |
55 | #define RIO_LTLEDCSR 0x0608 | ||
56 | #define RIO_LTLEDCSR_IER 0x80000000 | ||
57 | #define RIO_LTLEDCSR_PRT 0x01000000 | ||
58 | #define RIO_LTLEECSR 0x060c | ||
59 | #define RIO_EPWISR 0x10010 | ||
40 | #define RIO_ISR_AACR 0x10120 | 60 | #define RIO_ISR_AACR 0x10120 |
41 | #define RIO_ISR_AACR_AA 0x1 /* Accept All ID */ | 61 | #define RIO_ISR_AACR_AA 0x1 /* Accept All ID */ |
42 | #define RIO_MAINT_WIN_SIZE 0x400000 | 62 | #define RIO_MAINT_WIN_SIZE 0x400000 |
@@ -55,6 +75,18 @@ | |||
55 | #define RIO_MSG_ISR_QFI 0x00000010 | 75 | #define RIO_MSG_ISR_QFI 0x00000010 |
56 | #define RIO_MSG_ISR_DIQI 0x00000001 | 76 | #define RIO_MSG_ISR_DIQI 0x00000001 |
57 | 77 | ||
78 | #define RIO_IPWMR_SEN 0x00100000 | ||
79 | #define RIO_IPWMR_QFIE 0x00000100 | ||
80 | #define RIO_IPWMR_EIE 0x00000020 | ||
81 | #define RIO_IPWMR_CQ 0x00000002 | ||
82 | #define RIO_IPWMR_PWE 0x00000001 | ||
83 | |||
84 | #define RIO_IPWSR_QF 0x00100000 | ||
85 | #define RIO_IPWSR_TE 0x00000080 | ||
86 | #define RIO_IPWSR_QFI 0x00000010 | ||
87 | #define RIO_IPWSR_PWD 0x00000008 | ||
88 | #define RIO_IPWSR_PWB 0x00000004 | ||
89 | |||
58 | #define RIO_MSG_DESC_SIZE 32 | 90 | #define RIO_MSG_DESC_SIZE 32 |
59 | #define RIO_MSG_BUFFER_SIZE 4096 | 91 | #define RIO_MSG_BUFFER_SIZE 4096 |
60 | #define RIO_MIN_TX_RING_SIZE 2 | 92 | #define RIO_MIN_TX_RING_SIZE 2 |
@@ -121,7 +153,7 @@ struct rio_msg_regs { | |||
121 | u32 pad10[26]; | 153 | u32 pad10[26]; |
122 | u32 pwmr; | 154 | u32 pwmr; |
123 | u32 pwsr; | 155 | u32 pwsr; |
124 | u32 pad11; | 156 | u32 epwqbar; |
125 | u32 pwqbar; | 157 | u32 pwqbar; |
126 | }; | 158 | }; |
127 | 159 | ||
@@ -160,6 +192,14 @@ struct rio_msg_rx_ring { | |||
160 | void *dev_id; | 192 | void *dev_id; |
161 | }; | 193 | }; |
162 | 194 | ||
195 | struct rio_port_write_msg { | ||
196 | void *virt; | ||
197 | dma_addr_t phys; | ||
198 | u32 msg_count; | ||
199 | u32 err_count; | ||
200 | u32 discard_count; | ||
201 | }; | ||
202 | |||
163 | struct rio_priv { | 203 | struct rio_priv { |
164 | struct device *dev; | 204 | struct device *dev; |
165 | void __iomem *regs_win; | 205 | void __iomem *regs_win; |
@@ -172,11 +212,64 @@ struct rio_priv { | |||
172 | struct rio_dbell_ring dbell_ring; | 212 | struct rio_dbell_ring dbell_ring; |
173 | struct rio_msg_tx_ring msg_tx_ring; | 213 | struct rio_msg_tx_ring msg_tx_ring; |
174 | struct rio_msg_rx_ring msg_rx_ring; | 214 | struct rio_msg_rx_ring msg_rx_ring; |
215 | struct rio_port_write_msg port_write_msg; | ||
175 | int bellirq; | 216 | int bellirq; |
176 | int txirq; | 217 | int txirq; |
177 | int rxirq; | 218 | int rxirq; |
219 | int pwirq; | ||
220 | struct work_struct pw_work; | ||
221 | struct kfifo pw_fifo; | ||
222 | spinlock_t pw_fifo_lock; | ||
178 | }; | 223 | }; |
179 | 224 | ||
225 | #define __fsl_read_rio_config(x, addr, err, op) \ | ||
226 | __asm__ __volatile__( \ | ||
227 | "1: "op" %1,0(%2)\n" \ | ||
228 | " eieio\n" \ | ||
229 | "2:\n" \ | ||
230 | ".section .fixup,\"ax\"\n" \ | ||
231 | "3: li %1,-1\n" \ | ||
232 | " li %0,%3\n" \ | ||
233 | " b 2b\n" \ | ||
234 | ".section __ex_table,\"a\"\n" \ | ||
235 | " .align 2\n" \ | ||
236 | " .long 1b,3b\n" \ | ||
237 | ".text" \ | ||
238 | : "=r" (err), "=r" (x) \ | ||
239 | : "b" (addr), "i" (-EFAULT), "0" (err)) | ||
240 | |||
241 | static void __iomem *rio_regs_win; | ||
242 | |||
243 | static int (*saved_mcheck_exception)(struct pt_regs *regs); | ||
244 | |||
245 | static int fsl_rio_mcheck_exception(struct pt_regs *regs) | ||
246 | { | ||
247 | const struct exception_table_entry *entry = NULL; | ||
248 | unsigned long reason = (mfspr(SPRN_MCSR) & MCSR_MASK); | ||
249 | |||
250 | if (reason & MCSR_BUS_RBERR) { | ||
251 | reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR)); | ||
252 | if (reason & (RIO_LTLEDCSR_IER | RIO_LTLEDCSR_PRT)) { | ||
253 | /* Check if we are prepared to handle this fault */ | ||
254 | entry = search_exception_tables(regs->nip); | ||
255 | if (entry) { | ||
256 | pr_debug("RIO: %s - MC Exception handled\n", | ||
257 | __func__); | ||
258 | out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), | ||
259 | 0); | ||
260 | regs->msr |= MSR_RI; | ||
261 | regs->nip = entry->fixup; | ||
262 | return 1; | ||
263 | } | ||
264 | } | ||
265 | } | ||
266 | |||
267 | if (saved_mcheck_exception) | ||
268 | return saved_mcheck_exception(regs); | ||
269 | else | ||
270 | return cur_cpu_spec->machine_check(regs); | ||
271 | } | ||
272 | |||
180 | /** | 273 | /** |
181 | * fsl_rio_doorbell_send - Send a MPC85xx doorbell message | 274 | * fsl_rio_doorbell_send - Send a MPC85xx doorbell message |
182 | * @mport: RapidIO master port info | 275 | * @mport: RapidIO master port info |
@@ -277,27 +370,44 @@ fsl_rio_config_read(struct rio_mport *mport, int index, u16 destid, | |||
277 | { | 370 | { |
278 | struct rio_priv *priv = mport->priv; | 371 | struct rio_priv *priv = mport->priv; |
279 | u8 *data; | 372 | u8 *data; |
373 | u32 rval, err = 0; | ||
280 | 374 | ||
281 | pr_debug | 375 | pr_debug |
282 | ("fsl_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n", | 376 | ("fsl_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n", |
283 | index, destid, hopcount, offset, len); | 377 | index, destid, hopcount, offset, len); |
378 | |||
379 | /* 16MB maintenance window possible */ | ||
380 | /* allow only aligned access to maintenance registers */ | ||
381 | if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len)) | ||
382 | return -EINVAL; | ||
383 | |||
284 | out_be32(&priv->maint_atmu_regs->rowtar, | 384 | out_be32(&priv->maint_atmu_regs->rowtar, |
285 | (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9)); | 385 | (destid << 22) | (hopcount << 12) | (offset >> 12)); |
386 | out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10)); | ||
286 | 387 | ||
287 | data = (u8 *) priv->maint_win + offset; | 388 | data = (u8 *) priv->maint_win + (offset & (RIO_MAINT_WIN_SIZE - 1)); |
288 | switch (len) { | 389 | switch (len) { |
289 | case 1: | 390 | case 1: |
290 | *val = in_8((u8 *) data); | 391 | __fsl_read_rio_config(rval, data, err, "lbz"); |
291 | break; | 392 | break; |
292 | case 2: | 393 | case 2: |
293 | *val = in_be16((u16 *) data); | 394 | __fsl_read_rio_config(rval, data, err, "lhz"); |
294 | break; | 395 | break; |
295 | default: | 396 | case 4: |
296 | *val = in_be32((u32 *) data); | 397 | __fsl_read_rio_config(rval, data, err, "lwz"); |
297 | break; | 398 | break; |
399 | default: | ||
400 | return -EINVAL; | ||
298 | } | 401 | } |
299 | 402 | ||
300 | return 0; | 403 | if (err) { |
404 | pr_debug("RIO: cfg_read error %d for %x:%x:%x\n", | ||
405 | err, destid, hopcount, offset); | ||
406 | } | ||
407 | |||
408 | *val = rval; | ||
409 | |||
410 | return err; | ||
301 | } | 411 | } |
302 | 412 | ||
303 | /** | 413 | /** |
@@ -322,10 +432,17 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid, | |||
322 | pr_debug | 432 | pr_debug |
323 | ("fsl_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n", | 433 | ("fsl_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n", |
324 | index, destid, hopcount, offset, len, val); | 434 | index, destid, hopcount, offset, len, val); |
435 | |||
436 | /* 16MB maintenance windows possible */ | ||
437 | /* allow only aligned access to maintenance registers */ | ||
438 | if (offset > (0x1000000 - len) || !IS_ALIGNED(offset, len)) | ||
439 | return -EINVAL; | ||
440 | |||
325 | out_be32(&priv->maint_atmu_regs->rowtar, | 441 | out_be32(&priv->maint_atmu_regs->rowtar, |
326 | (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9)); | 442 | (destid << 22) | (hopcount << 12) | (offset >> 12)); |
443 | out_be32(&priv->maint_atmu_regs->rowtear, (destid >> 10)); | ||
327 | 444 | ||
328 | data = (u8 *) priv->maint_win + offset; | 445 | data = (u8 *) priv->maint_win + (offset & (RIO_MAINT_WIN_SIZE - 1)); |
329 | switch (len) { | 446 | switch (len) { |
330 | case 1: | 447 | case 1: |
331 | out_8((u8 *) data, val); | 448 | out_8((u8 *) data, val); |
@@ -333,9 +450,11 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid, | |||
333 | case 2: | 450 | case 2: |
334 | out_be16((u16 *) data, val); | 451 | out_be16((u16 *) data, val); |
335 | break; | 452 | break; |
336 | default: | 453 | case 4: |
337 | out_be32((u32 *) data, val); | 454 | out_be32((u32 *) data, val); |
338 | break; | 455 | break; |
456 | default: | ||
457 | return -EINVAL; | ||
339 | } | 458 | } |
340 | 459 | ||
341 | return 0; | 460 | return 0; |
@@ -930,6 +1049,223 @@ static int fsl_rio_doorbell_init(struct rio_mport *mport) | |||
930 | return rc; | 1049 | return rc; |
931 | } | 1050 | } |
932 | 1051 | ||
1052 | /** | ||
1053 | * fsl_rio_port_write_handler - MPC85xx port write interrupt handler | ||
1054 | * @irq: Linux interrupt number | ||
1055 | * @dev_instance: Pointer to interrupt-specific data | ||
1056 | * | ||
1057 | * Handles port write interrupts. Parses a list of registered | ||
1058 | * port write event handlers and executes a matching event handler. | ||
1059 | */ | ||
1060 | static irqreturn_t | ||
1061 | fsl_rio_port_write_handler(int irq, void *dev_instance) | ||
1062 | { | ||
1063 | u32 ipwmr, ipwsr; | ||
1064 | struct rio_mport *port = (struct rio_mport *)dev_instance; | ||
1065 | struct rio_priv *priv = port->priv; | ||
1066 | u32 epwisr, tmp; | ||
1067 | |||
1068 | ipwmr = in_be32(&priv->msg_regs->pwmr); | ||
1069 | ipwsr = in_be32(&priv->msg_regs->pwsr); | ||
1070 | |||
1071 | epwisr = in_be32(priv->regs_win + RIO_EPWISR); | ||
1072 | if (epwisr & 0x80000000) { | ||
1073 | tmp = in_be32(priv->regs_win + RIO_LTLEDCSR); | ||
1074 | pr_info("RIO_LTLEDCSR = 0x%x\n", tmp); | ||
1075 | out_be32(priv->regs_win + RIO_LTLEDCSR, 0); | ||
1076 | } | ||
1077 | |||
1078 | if (!(epwisr & 0x00000001)) | ||
1079 | return IRQ_HANDLED; | ||
1080 | |||
1081 | #ifdef DEBUG_PW | ||
1082 | pr_debug("PW Int->IPWMR: 0x%08x IPWSR: 0x%08x (", ipwmr, ipwsr); | ||
1083 | if (ipwsr & RIO_IPWSR_QF) | ||
1084 | pr_debug(" QF"); | ||
1085 | if (ipwsr & RIO_IPWSR_TE) | ||
1086 | pr_debug(" TE"); | ||
1087 | if (ipwsr & RIO_IPWSR_QFI) | ||
1088 | pr_debug(" QFI"); | ||
1089 | if (ipwsr & RIO_IPWSR_PWD) | ||
1090 | pr_debug(" PWD"); | ||
1091 | if (ipwsr & RIO_IPWSR_PWB) | ||
1092 | pr_debug(" PWB"); | ||
1093 | pr_debug(" )\n"); | ||
1094 | #endif | ||
1095 | out_be32(&priv->msg_regs->pwsr, | ||
1096 | ipwsr & (RIO_IPWSR_TE | RIO_IPWSR_QFI | RIO_IPWSR_PWD)); | ||
1097 | |||
1098 | if ((ipwmr & RIO_IPWMR_EIE) && (ipwsr & RIO_IPWSR_TE)) { | ||
1099 | priv->port_write_msg.err_count++; | ||
1100 | pr_info("RIO: Port-Write Transaction Err (%d)\n", | ||
1101 | priv->port_write_msg.err_count); | ||
1102 | } | ||
1103 | if (ipwsr & RIO_IPWSR_PWD) { | ||
1104 | priv->port_write_msg.discard_count++; | ||
1105 | pr_info("RIO: Port Discarded Port-Write Msg(s) (%d)\n", | ||
1106 | priv->port_write_msg.discard_count); | ||
1107 | } | ||
1108 | |||
1109 | /* Schedule deferred processing if PW was received */ | ||
1110 | if (ipwsr & RIO_IPWSR_QFI) { | ||
1111 | /* Save PW message (if there is room in FIFO), | ||
1112 | * otherwise discard it. | ||
1113 | */ | ||
1114 | if (kfifo_avail(&priv->pw_fifo) >= RIO_PW_MSG_SIZE) { | ||
1115 | priv->port_write_msg.msg_count++; | ||
1116 | kfifo_in(&priv->pw_fifo, priv->port_write_msg.virt, | ||
1117 | RIO_PW_MSG_SIZE); | ||
1118 | } else { | ||
1119 | priv->port_write_msg.discard_count++; | ||
1120 | pr_info("RIO: ISR Discarded Port-Write Msg(s) (%d)\n", | ||
1121 | priv->port_write_msg.discard_count); | ||
1122 | } | ||
1123 | schedule_work(&priv->pw_work); | ||
1124 | } | ||
1125 | |||
1126 | /* Issue Clear Queue command. This allows another | ||
1127 | * port-write to be received. | ||
1128 | */ | ||
1129 | out_be32(&priv->msg_regs->pwmr, ipwmr | RIO_IPWMR_CQ); | ||
1130 | |||
1131 | return IRQ_HANDLED; | ||
1132 | } | ||
1133 | |||
1134 | static void fsl_pw_dpc(struct work_struct *work) | ||
1135 | { | ||
1136 | struct rio_priv *priv = container_of(work, struct rio_priv, pw_work); | ||
1137 | unsigned long flags; | ||
1138 | u32 msg_buffer[RIO_PW_MSG_SIZE/sizeof(u32)]; | ||
1139 | |||
1140 | /* | ||
1141 | * Process port-write messages | ||
1142 | */ | ||
1143 | spin_lock_irqsave(&priv->pw_fifo_lock, flags); | ||
1144 | while (kfifo_out(&priv->pw_fifo, (unsigned char *)msg_buffer, | ||
1145 | RIO_PW_MSG_SIZE)) { | ||
1146 | /* Process one message */ | ||
1147 | spin_unlock_irqrestore(&priv->pw_fifo_lock, flags); | ||
1148 | #ifdef DEBUG_PW | ||
1149 | { | ||
1150 | u32 i; | ||
1151 | pr_debug("%s : Port-Write Message:", __func__); | ||
1152 | for (i = 0; i < RIO_PW_MSG_SIZE/sizeof(u32); i++) { | ||
1153 | if ((i%4) == 0) | ||
1154 | pr_debug("\n0x%02x: 0x%08x", i*4, | ||
1155 | msg_buffer[i]); | ||
1156 | else | ||
1157 | pr_debug(" 0x%08x", msg_buffer[i]); | ||
1158 | } | ||
1159 | pr_debug("\n"); | ||
1160 | } | ||
1161 | #endif | ||
1162 | /* Pass the port-write message to RIO core for processing */ | ||
1163 | rio_inb_pwrite_handler((union rio_pw_msg *)msg_buffer); | ||
1164 | spin_lock_irqsave(&priv->pw_fifo_lock, flags); | ||
1165 | } | ||
1166 | spin_unlock_irqrestore(&priv->pw_fifo_lock, flags); | ||
1167 | } | ||
1168 | |||
1169 | /** | ||
1170 | * fsl_rio_pw_enable - enable/disable port-write interface init | ||
1171 | * @mport: Master port implementing the port write unit | ||
1172 | * @enable: 1=enable; 0=disable port-write message handling | ||
1173 | */ | ||
1174 | static int fsl_rio_pw_enable(struct rio_mport *mport, int enable) | ||
1175 | { | ||
1176 | struct rio_priv *priv = mport->priv; | ||
1177 | u32 rval; | ||
1178 | |||
1179 | rval = in_be32(&priv->msg_regs->pwmr); | ||
1180 | |||
1181 | if (enable) | ||
1182 | rval |= RIO_IPWMR_PWE; | ||
1183 | else | ||
1184 | rval &= ~RIO_IPWMR_PWE; | ||
1185 | |||
1186 | out_be32(&priv->msg_regs->pwmr, rval); | ||
1187 | |||
1188 | return 0; | ||
1189 | } | ||
1190 | |||
1191 | /** | ||
1192 | * fsl_rio_port_write_init - MPC85xx port write interface init | ||
1193 | * @mport: Master port implementing the port write unit | ||
1194 | * | ||
1195 | * Initializes port write unit hardware and DMA buffer | ||
1196 | * ring. Called from fsl_rio_setup(). Returns %0 on success | ||
1197 | * or %-ENOMEM on failure. | ||
1198 | */ | ||
1199 | static int fsl_rio_port_write_init(struct rio_mport *mport) | ||
1200 | { | ||
1201 | struct rio_priv *priv = mport->priv; | ||
1202 | int rc = 0; | ||
1203 | |||
1204 | /* Following configurations require a disabled port write controller */ | ||
1205 | out_be32(&priv->msg_regs->pwmr, | ||
1206 | in_be32(&priv->msg_regs->pwmr) & ~RIO_IPWMR_PWE); | ||
1207 | |||
1208 | /* Initialize port write */ | ||
1209 | priv->port_write_msg.virt = dma_alloc_coherent(priv->dev, | ||
1210 | RIO_PW_MSG_SIZE, | ||
1211 | &priv->port_write_msg.phys, GFP_KERNEL); | ||
1212 | if (!priv->port_write_msg.virt) { | ||
1213 | pr_err("RIO: unable allocate port write queue\n"); | ||
1214 | return -ENOMEM; | ||
1215 | } | ||
1216 | |||
1217 | priv->port_write_msg.err_count = 0; | ||
1218 | priv->port_write_msg.discard_count = 0; | ||
1219 | |||
1220 | /* Point dequeue/enqueue pointers at first entry */ | ||
1221 | out_be32(&priv->msg_regs->epwqbar, 0); | ||
1222 | out_be32(&priv->msg_regs->pwqbar, (u32) priv->port_write_msg.phys); | ||
1223 | |||
1224 | pr_debug("EIPWQBAR: 0x%08x IPWQBAR: 0x%08x\n", | ||
1225 | in_be32(&priv->msg_regs->epwqbar), | ||
1226 | in_be32(&priv->msg_regs->pwqbar)); | ||
1227 | |||
1228 | /* Clear interrupt status IPWSR */ | ||
1229 | out_be32(&priv->msg_regs->pwsr, | ||
1230 | (RIO_IPWSR_TE | RIO_IPWSR_QFI | RIO_IPWSR_PWD)); | ||
1231 | |||
1232 | /* Configure port write contoller for snooping enable all reporting, | ||
1233 | clear queue full */ | ||
1234 | out_be32(&priv->msg_regs->pwmr, | ||
1235 | RIO_IPWMR_SEN | RIO_IPWMR_QFIE | RIO_IPWMR_EIE | RIO_IPWMR_CQ); | ||
1236 | |||
1237 | |||
1238 | /* Hook up port-write handler */ | ||
1239 | rc = request_irq(IRQ_RIO_PW(mport), fsl_rio_port_write_handler, 0, | ||
1240 | "port-write", (void *)mport); | ||
1241 | if (rc < 0) { | ||
1242 | pr_err("MPC85xx RIO: unable to request inbound doorbell irq"); | ||
1243 | goto err_out; | ||
1244 | } | ||
1245 | |||
1246 | INIT_WORK(&priv->pw_work, fsl_pw_dpc); | ||
1247 | spin_lock_init(&priv->pw_fifo_lock); | ||
1248 | if (kfifo_alloc(&priv->pw_fifo, RIO_PW_MSG_SIZE * 32, GFP_KERNEL)) { | ||
1249 | pr_err("FIFO allocation failed\n"); | ||
1250 | rc = -ENOMEM; | ||
1251 | goto err_out_irq; | ||
1252 | } | ||
1253 | |||
1254 | pr_debug("IPWMR: 0x%08x IPWSR: 0x%08x\n", | ||
1255 | in_be32(&priv->msg_regs->pwmr), | ||
1256 | in_be32(&priv->msg_regs->pwsr)); | ||
1257 | |||
1258 | return rc; | ||
1259 | |||
1260 | err_out_irq: | ||
1261 | free_irq(IRQ_RIO_PW(mport), (void *)mport); | ||
1262 | err_out: | ||
1263 | dma_free_coherent(priv->dev, RIO_PW_MSG_SIZE, | ||
1264 | priv->port_write_msg.virt, | ||
1265 | priv->port_write_msg.phys); | ||
1266 | return rc; | ||
1267 | } | ||
1268 | |||
933 | static char *cmdline = NULL; | 1269 | static char *cmdline = NULL; |
934 | 1270 | ||
935 | static int fsl_rio_get_hdid(int index) | 1271 | static int fsl_rio_get_hdid(int index) |
@@ -1057,7 +1393,7 @@ int fsl_rio_setup(struct of_device *dev) | |||
1057 | dev_info(&dev->dev, "LAW start 0x%016llx, size 0x%016llx.\n", | 1393 | dev_info(&dev->dev, "LAW start 0x%016llx, size 0x%016llx.\n", |
1058 | law_start, law_size); | 1394 | law_start, law_size); |
1059 | 1395 | ||
1060 | ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL); | 1396 | ops = kzalloc(sizeof(struct rio_ops), GFP_KERNEL); |
1061 | if (!ops) { | 1397 | if (!ops) { |
1062 | rc = -ENOMEM; | 1398 | rc = -ENOMEM; |
1063 | goto err_ops; | 1399 | goto err_ops; |
@@ -1067,6 +1403,7 @@ int fsl_rio_setup(struct of_device *dev) | |||
1067 | ops->cread = fsl_rio_config_read; | 1403 | ops->cread = fsl_rio_config_read; |
1068 | ops->cwrite = fsl_rio_config_write; | 1404 | ops->cwrite = fsl_rio_config_write; |
1069 | ops->dsend = fsl_rio_doorbell_send; | 1405 | ops->dsend = fsl_rio_doorbell_send; |
1406 | ops->pwenable = fsl_rio_pw_enable; | ||
1070 | 1407 | ||
1071 | port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); | 1408 | port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); |
1072 | if (!port) { | 1409 | if (!port) { |
@@ -1089,11 +1426,12 @@ int fsl_rio_setup(struct of_device *dev) | |||
1089 | port->iores.flags = IORESOURCE_MEM; | 1426 | port->iores.flags = IORESOURCE_MEM; |
1090 | port->iores.name = "rio_io_win"; | 1427 | port->iores.name = "rio_io_win"; |
1091 | 1428 | ||
1429 | priv->pwirq = irq_of_parse_and_map(dev->node, 0); | ||
1092 | priv->bellirq = irq_of_parse_and_map(dev->dev.of_node, 2); | 1430 | priv->bellirq = irq_of_parse_and_map(dev->dev.of_node, 2); |
1093 | priv->txirq = irq_of_parse_and_map(dev->dev.of_node, 3); | 1431 | priv->txirq = irq_of_parse_and_map(dev->dev.of_node, 3); |
1094 | priv->rxirq = irq_of_parse_and_map(dev->dev.of_node, 4); | 1432 | priv->rxirq = irq_of_parse_and_map(dev->dev.of_node, 4); |
1095 | dev_info(&dev->dev, "bellirq: %d, txirq: %d, rxirq %d\n", priv->bellirq, | 1433 | dev_info(&dev->dev, "pwirq: %d, bellirq: %d, txirq: %d, rxirq %d\n", |
1096 | priv->txirq, priv->rxirq); | 1434 | priv->pwirq, priv->bellirq, priv->txirq, priv->rxirq); |
1097 | 1435 | ||
1098 | rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff); | 1436 | rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff); |
1099 | rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0); | 1437 | rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0); |
@@ -1109,6 +1447,7 @@ int fsl_rio_setup(struct of_device *dev) | |||
1109 | rio_register_mport(port); | 1447 | rio_register_mport(port); |
1110 | 1448 | ||
1111 | priv->regs_win = ioremap(regs.start, regs.end - regs.start + 1); | 1449 | priv->regs_win = ioremap(regs.start, regs.end - regs.start + 1); |
1450 | rio_regs_win = priv->regs_win; | ||
1112 | 1451 | ||
1113 | /* Probe the master port phy type */ | 1452 | /* Probe the master port phy type */ |
1114 | ccsr = in_be32(priv->regs_win + RIO_CCSR); | 1453 | ccsr = in_be32(priv->regs_win + RIO_CCSR); |
@@ -1166,7 +1505,8 @@ int fsl_rio_setup(struct of_device *dev) | |||
1166 | 1505 | ||
1167 | /* Configure maintenance transaction window */ | 1506 | /* Configure maintenance transaction window */ |
1168 | out_be32(&priv->maint_atmu_regs->rowbar, law_start >> 12); | 1507 | out_be32(&priv->maint_atmu_regs->rowbar, law_start >> 12); |
1169 | out_be32(&priv->maint_atmu_regs->rowar, 0x80077015); /* 4M */ | 1508 | out_be32(&priv->maint_atmu_regs->rowar, |
1509 | 0x80077000 | (ilog2(RIO_MAINT_WIN_SIZE) - 1)); | ||
1170 | 1510 | ||
1171 | priv->maint_win = ioremap(law_start, RIO_MAINT_WIN_SIZE); | 1511 | priv->maint_win = ioremap(law_start, RIO_MAINT_WIN_SIZE); |
1172 | 1512 | ||
@@ -1175,6 +1515,12 @@ int fsl_rio_setup(struct of_device *dev) | |||
1175 | (law_start + RIO_MAINT_WIN_SIZE) >> 12); | 1515 | (law_start + RIO_MAINT_WIN_SIZE) >> 12); |
1176 | out_be32(&priv->dbell_atmu_regs->rowar, 0x8004200b); /* 4k */ | 1516 | out_be32(&priv->dbell_atmu_regs->rowar, 0x8004200b); /* 4k */ |
1177 | fsl_rio_doorbell_init(port); | 1517 | fsl_rio_doorbell_init(port); |
1518 | fsl_rio_port_write_init(port); | ||
1519 | |||
1520 | saved_mcheck_exception = ppc_md.machine_check_exception; | ||
1521 | ppc_md.machine_check_exception = fsl_rio_mcheck_exception; | ||
1522 | /* Ensure that RFXE is set */ | ||
1523 | mtspr(SPRN_HID1, (mfspr(SPRN_HID1) | 0x20000)); | ||
1178 | 1524 | ||
1179 | return 0; | 1525 | return 0; |
1180 | err: | 1526 | err: |
diff --git a/arch/s390/include/asm/scatterlist.h b/arch/s390/include/asm/scatterlist.h index 35d786fe93ae..be44d94cba54 100644 --- a/arch/s390/include/asm/scatterlist.h +++ b/arch/s390/include/asm/scatterlist.h | |||
@@ -1 +1,3 @@ | |||
1 | #define ISA_DMA_THRESHOLD (~0UL) | ||
2 | |||
1 | #include <asm-generic/scatterlist.h> | 3 | #include <asm-generic/scatterlist.h> |
diff --git a/arch/s390/include/asm/sfp-util.h b/arch/s390/include/asm/sfp-util.h index 7d43fee17e32..0addc6466d95 100644 --- a/arch/s390/include/asm/sfp-util.h +++ b/arch/s390/include/asm/sfp-util.h | |||
@@ -73,3 +73,5 @@ extern unsigned long __udiv_qrnnd (unsigned int *, unsigned int, | |||
73 | #define UDIV_NEEDS_NORMALIZATION 0 | 73 | #define UDIV_NEEDS_NORMALIZATION 0 |
74 | 74 | ||
75 | #define abort() return 0 | 75 | #define abort() return 0 |
76 | |||
77 | #define __BYTE_ORDER __BIG_ENDIAN | ||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index e4d98de83dd8..541053ed234e 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -944,21 +944,21 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self, | |||
944 | struct cpu *c = &per_cpu(cpu_devices, cpu); | 944 | struct cpu *c = &per_cpu(cpu_devices, cpu); |
945 | struct sys_device *s = &c->sysdev; | 945 | struct sys_device *s = &c->sysdev; |
946 | struct s390_idle_data *idle; | 946 | struct s390_idle_data *idle; |
947 | int err = 0; | ||
947 | 948 | ||
948 | switch (action) { | 949 | switch (action) { |
949 | case CPU_ONLINE: | 950 | case CPU_ONLINE: |
950 | case CPU_ONLINE_FROZEN: | 951 | case CPU_ONLINE_FROZEN: |
951 | idle = &per_cpu(s390_idle, cpu); | 952 | idle = &per_cpu(s390_idle, cpu); |
952 | memset(idle, 0, sizeof(struct s390_idle_data)); | 953 | memset(idle, 0, sizeof(struct s390_idle_data)); |
953 | if (sysfs_create_group(&s->kobj, &cpu_online_attr_group)) | 954 | err = sysfs_create_group(&s->kobj, &cpu_online_attr_group); |
954 | return NOTIFY_BAD; | ||
955 | break; | 955 | break; |
956 | case CPU_DEAD: | 956 | case CPU_DEAD: |
957 | case CPU_DEAD_FROZEN: | 957 | case CPU_DEAD_FROZEN: |
958 | sysfs_remove_group(&s->kobj, &cpu_online_attr_group); | 958 | sysfs_remove_group(&s->kobj, &cpu_online_attr_group); |
959 | break; | 959 | break; |
960 | } | 960 | } |
961 | return NOTIFY_OK; | 961 | return notifier_from_errno(err); |
962 | } | 962 | } |
963 | 963 | ||
964 | static struct notifier_block __cpuinitdata smp_cpu_nb = { | 964 | static struct notifier_block __cpuinitdata smp_cpu_nb = { |
diff --git a/arch/score/include/asm/scatterlist.h b/arch/score/include/asm/scatterlist.h index 9f533b8362c7..4fa1a6658215 100644 --- a/arch/score/include/asm/scatterlist.h +++ b/arch/score/include/asm/scatterlist.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _ASM_SCORE_SCATTERLIST_H | 1 | #ifndef _ASM_SCORE_SCATTERLIST_H |
2 | #define _ASM_SCORE_SCATTERLIST_H | 2 | #define _ASM_SCORE_SCATTERLIST_H |
3 | 3 | ||
4 | #define ISA_DMA_THRESHOLD (~0UL) | ||
5 | |||
4 | #include <asm-generic/scatterlist.h> | 6 | #include <asm-generic/scatterlist.h> |
5 | 7 | ||
6 | #endif /* _ASM_SCORE_SCATTERLIST_H */ | 8 | #endif /* _ASM_SCORE_SCATTERLIST_H */ |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 0e318c905eea..c5ee4ce60b57 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -186,6 +186,9 @@ config DMA_NONCOHERENT | |||
186 | config NEED_DMA_MAP_STATE | 186 | config NEED_DMA_MAP_STATE |
187 | def_bool DMA_NONCOHERENT | 187 | def_bool DMA_NONCOHERENT |
188 | 188 | ||
189 | config NEED_SG_DMA_LENGTH | ||
190 | def_bool y | ||
191 | |||
189 | source "init/Kconfig" | 192 | source "init/Kconfig" |
190 | 193 | ||
191 | source "kernel/Kconfig.freezer" | 194 | source "kernel/Kconfig.freezer" |
diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c index d4104ce9fe53..6c4bbba2a675 100644 --- a/arch/sh/kernel/ptrace_32.c +++ b/arch/sh/kernel/ptrace_32.c | |||
@@ -436,29 +436,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
436 | 0, sizeof(struct pt_dspregs), | 436 | 0, sizeof(struct pt_dspregs), |
437 | (const void __user *)data); | 437 | (const void __user *)data); |
438 | #endif | 438 | #endif |
439 | #ifdef CONFIG_BINFMT_ELF_FDPIC | ||
440 | case PTRACE_GETFDPIC: { | ||
441 | unsigned long tmp = 0; | ||
442 | |||
443 | switch (addr) { | ||
444 | case PTRACE_GETFDPIC_EXEC: | ||
445 | tmp = child->mm->context.exec_fdpic_loadmap; | ||
446 | break; | ||
447 | case PTRACE_GETFDPIC_INTERP: | ||
448 | tmp = child->mm->context.interp_fdpic_loadmap; | ||
449 | break; | ||
450 | default: | ||
451 | break; | ||
452 | } | ||
453 | |||
454 | ret = 0; | ||
455 | if (put_user(tmp, datap)) { | ||
456 | ret = -EFAULT; | ||
457 | break; | ||
458 | } | ||
459 | break; | ||
460 | } | ||
461 | #endif | ||
462 | default: | 439 | default: |
463 | ret = ptrace_request(child, request, addr, data); | 440 | ret = ptrace_request(child, request, addr, data); |
464 | break; | 441 | break; |
diff --git a/arch/sh/math-emu/sfp-util.h b/arch/sh/math-emu/sfp-util.h index e8526021892f..8ae1bd310ad0 100644 --- a/arch/sh/math-emu/sfp-util.h +++ b/arch/sh/math-emu/sfp-util.h | |||
@@ -66,3 +66,7 @@ | |||
66 | } while (0) | 66 | } while (0) |
67 | 67 | ||
68 | #define abort() return 0 | 68 | #define abort() return 0 |
69 | |||
70 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
71 | |||
72 | |||
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index d6781ce687e2..6f1470baa314 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -133,6 +133,9 @@ config ZONE_DMA | |||
133 | config NEED_DMA_MAP_STATE | 133 | config NEED_DMA_MAP_STATE |
134 | def_bool y | 134 | def_bool y |
135 | 135 | ||
136 | config NEED_SG_DMA_LENGTH | ||
137 | def_bool y | ||
138 | |||
136 | config GENERIC_ISA_DMA | 139 | config GENERIC_ISA_DMA |
137 | bool | 140 | bool |
138 | default y if SPARC32 | 141 | default y if SPARC32 |
diff --git a/arch/sparc/include/asm/scatterlist.h b/arch/sparc/include/asm/scatterlist.h index d1120257b033..433e45f05fd4 100644 --- a/arch/sparc/include/asm/scatterlist.h +++ b/arch/sparc/include/asm/scatterlist.h | |||
@@ -1,8 +1,9 @@ | |||
1 | #ifndef _SPARC_SCATTERLIST_H | 1 | #ifndef _SPARC_SCATTERLIST_H |
2 | #define _SPARC_SCATTERLIST_H | 2 | #define _SPARC_SCATTERLIST_H |
3 | 3 | ||
4 | #define sg_dma_len(sg) ((sg)->dma_length) | ||
5 | |||
6 | #include <asm-generic/scatterlist.h> | 4 | #include <asm-generic/scatterlist.h> |
7 | 5 | ||
6 | #define ISA_DMA_THRESHOLD (~0UL) | ||
7 | #define ARCH_HAS_SG_CHAIN | ||
8 | |||
8 | #endif /* !(_SPARC_SCATTERLIST_H) */ | 9 | #endif /* !(_SPARC_SCATTERLIST_H) */ |
diff --git a/arch/sparc/math-emu/sfp-util_32.h b/arch/sparc/math-emu/sfp-util_32.h index 0ea35afbb914..d1b2aff3c259 100644 --- a/arch/sparc/math-emu/sfp-util_32.h +++ b/arch/sparc/math-emu/sfp-util_32.h | |||
@@ -107,3 +107,9 @@ | |||
107 | 107 | ||
108 | #define abort() \ | 108 | #define abort() \ |
109 | return 0 | 109 | return 0 |
110 | |||
111 | #ifdef __BIG_ENDIAN | ||
112 | #define __BYTE_ORDER __BIG_ENDIAN | ||
113 | #else | ||
114 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
115 | #endif | ||
diff --git a/arch/sparc/math-emu/sfp-util_64.h b/arch/sparc/math-emu/sfp-util_64.h index d17c9bc72181..425d3cf01af4 100644 --- a/arch/sparc/math-emu/sfp-util_64.h +++ b/arch/sparc/math-emu/sfp-util_64.h | |||
@@ -112,3 +112,9 @@ | |||
112 | 112 | ||
113 | #define abort() \ | 113 | #define abort() \ |
114 | return 0 | 114 | return 0 |
115 | |||
116 | #ifdef __BIG_ENDIAN | ||
117 | #define __BYTE_ORDER __BIG_ENDIAN | ||
118 | #else | ||
119 | #define __BYTE_ORDER __LITTLE_ENDIAN | ||
120 | #endif | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e0c619c55b4e..dcb0593b4a66 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -109,6 +109,9 @@ config SBUS | |||
109 | config NEED_DMA_MAP_STATE | 109 | config NEED_DMA_MAP_STATE |
110 | def_bool (X86_64 || DMAR || DMA_API_DEBUG) | 110 | def_bool (X86_64 || DMAR || DMA_API_DEBUG) |
111 | 111 | ||
112 | config NEED_SG_DMA_LENGTH | ||
113 | def_bool y | ||
114 | |||
112 | config GENERIC_ISA_DMA | 115 | config GENERIC_ISA_DMA |
113 | def_bool y | 116 | def_bool y |
114 | 117 | ||
@@ -1703,6 +1706,10 @@ config HAVE_ARCH_EARLY_PFN_TO_NID | |||
1703 | def_bool X86_64 | 1706 | def_bool X86_64 |
1704 | depends on NUMA | 1707 | depends on NUMA |
1705 | 1708 | ||
1709 | config USE_PERCPU_NUMA_NODE_ID | ||
1710 | def_bool X86_64 | ||
1711 | depends on NUMA | ||
1712 | |||
1706 | menu "Power management and ACPI options" | 1713 | menu "Power management and ACPI options" |
1707 | 1714 | ||
1708 | config ARCH_HIBERNATION_HEADER | 1715 | config ARCH_HIBERNATION_HEADER |
diff --git a/arch/x86/boot/compressed/relocs.c b/arch/x86/boot/compressed/relocs.c index 7b1aaa20c7b5..89bbf4e4d05d 100644 --- a/arch/x86/boot/compressed/relocs.c +++ b/arch/x86/boot/compressed/relocs.c | |||
@@ -195,11 +195,11 @@ static const char *sym_name(const char *sym_strtab, Elf32_Sym *sym) | |||
195 | 195 | ||
196 | 196 | ||
197 | 197 | ||
198 | #if __BYTE_ORDER == __LITTLE_ENDIAN | 198 | #if BYTE_ORDER == LITTLE_ENDIAN |
199 | #define le16_to_cpu(val) (val) | 199 | #define le16_to_cpu(val) (val) |
200 | #define le32_to_cpu(val) (val) | 200 | #define le32_to_cpu(val) (val) |
201 | #endif | 201 | #endif |
202 | #if __BYTE_ORDER == __BIG_ENDIAN | 202 | #if BYTE_ORDER == BIG_ENDIAN |
203 | #define le16_to_cpu(val) bswap_16(val) | 203 | #define le16_to_cpu(val) bswap_16(val) |
204 | #define le32_to_cpu(val) bswap_32(val) | 204 | #define le32_to_cpu(val) bswap_32(val) |
205 | #endif | 205 | #endif |
diff --git a/arch/x86/include/asm/scatterlist.h b/arch/x86/include/asm/scatterlist.h index 75af592677ec..fb0b1874396f 100644 --- a/arch/x86/include/asm/scatterlist.h +++ b/arch/x86/include/asm/scatterlist.h | |||
@@ -1,8 +1,9 @@ | |||
1 | #ifndef _ASM_X86_SCATTERLIST_H | 1 | #ifndef _ASM_X86_SCATTERLIST_H |
2 | #define _ASM_X86_SCATTERLIST_H | 2 | #define _ASM_X86_SCATTERLIST_H |
3 | 3 | ||
4 | #define ISA_DMA_THRESHOLD (0x00ffffff) | ||
5 | |||
6 | #include <asm-generic/scatterlist.h> | 4 | #include <asm-generic/scatterlist.h> |
7 | 5 | ||
6 | #define ISA_DMA_THRESHOLD (0x00ffffff) | ||
7 | #define ARCH_HAS_SG_CHAIN | ||
8 | |||
8 | #endif /* _ASM_X86_SCATTERLIST_H */ | 9 | #endif /* _ASM_X86_SCATTERLIST_H */ |
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index c5087d796587..21899cc31e52 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h | |||
@@ -53,33 +53,29 @@ | |||
53 | extern int cpu_to_node_map[]; | 53 | extern int cpu_to_node_map[]; |
54 | 54 | ||
55 | /* Returns the number of the node containing CPU 'cpu' */ | 55 | /* Returns the number of the node containing CPU 'cpu' */ |
56 | static inline int cpu_to_node(int cpu) | 56 | static inline int __cpu_to_node(int cpu) |
57 | { | 57 | { |
58 | return cpu_to_node_map[cpu]; | 58 | return cpu_to_node_map[cpu]; |
59 | } | 59 | } |
60 | #define early_cpu_to_node(cpu) cpu_to_node(cpu) | 60 | #define early_cpu_to_node __cpu_to_node |
61 | #define cpu_to_node __cpu_to_node | ||
61 | 62 | ||
62 | #else /* CONFIG_X86_64 */ | 63 | #else /* CONFIG_X86_64 */ |
63 | 64 | ||
64 | /* Mappings between logical cpu number and node number */ | 65 | /* Mappings between logical cpu number and node number */ |
65 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); | 66 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); |
66 | 67 | ||
67 | /* Returns the number of the current Node. */ | ||
68 | DECLARE_PER_CPU(int, node_number); | ||
69 | #define numa_node_id() percpu_read(node_number) | ||
70 | |||
71 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | 68 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS |
72 | extern int cpu_to_node(int cpu); | 69 | /* |
70 | * override generic percpu implementation of cpu_to_node | ||
71 | */ | ||
72 | extern int __cpu_to_node(int cpu); | ||
73 | #define cpu_to_node __cpu_to_node | ||
74 | |||
73 | extern int early_cpu_to_node(int cpu); | 75 | extern int early_cpu_to_node(int cpu); |
74 | 76 | ||
75 | #else /* !CONFIG_DEBUG_PER_CPU_MAPS */ | 77 | #else /* !CONFIG_DEBUG_PER_CPU_MAPS */ |
76 | 78 | ||
77 | /* Returns the number of the node containing CPU 'cpu' */ | ||
78 | static inline int cpu_to_node(int cpu) | ||
79 | { | ||
80 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
81 | } | ||
82 | |||
83 | /* Same function but used if called before per_cpu areas are setup */ | 79 | /* Same function but used if called before per_cpu areas are setup */ |
84 | static inline int early_cpu_to_node(int cpu) | 80 | static inline int early_cpu_to_node(int cpu) |
85 | { | 81 | { |
@@ -170,6 +166,10 @@ static inline int numa_node_id(void) | |||
170 | { | 166 | { |
171 | return 0; | 167 | return 0; |
172 | } | 168 | } |
169 | /* | ||
170 | * indicate override: | ||
171 | */ | ||
172 | #define numa_node_id numa_node_id | ||
173 | 173 | ||
174 | static inline int early_cpu_to_node(int cpu) | 174 | static inline int early_cpu_to_node(int cpu) |
175 | { | 175 | { |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index cc83a002786e..68e4a6f2211e 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -1121,9 +1121,9 @@ void __cpuinit cpu_init(void) | |||
1121 | oist = &per_cpu(orig_ist, cpu); | 1121 | oist = &per_cpu(orig_ist, cpu); |
1122 | 1122 | ||
1123 | #ifdef CONFIG_NUMA | 1123 | #ifdef CONFIG_NUMA |
1124 | if (cpu != 0 && percpu_read(node_number) == 0 && | 1124 | if (cpu != 0 && percpu_read(numa_node) == 0 && |
1125 | cpu_to_node(cpu) != NUMA_NO_NODE) | 1125 | early_cpu_to_node(cpu) != NUMA_NO_NODE) |
1126 | percpu_write(node_number, cpu_to_node(cpu)); | 1126 | set_numa_node(early_cpu_to_node(cpu)); |
1127 | #endif | 1127 | #endif |
1128 | 1128 | ||
1129 | me = current; | 1129 | me = current; |
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c index 81c499eceb21..e1a0a3bf9716 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c | |||
@@ -190,7 +190,7 @@ thermal_throttle_cpu_callback(struct notifier_block *nfb, | |||
190 | mutex_unlock(&therm_cpu_lock); | 190 | mutex_unlock(&therm_cpu_lock); |
191 | break; | 191 | break; |
192 | } | 192 | } |
193 | return err ? NOTIFY_BAD : NOTIFY_OK; | 193 | return notifier_from_errno(err); |
194 | } | 194 | } |
195 | 195 | ||
196 | static struct notifier_block thermal_throttle_cpu_notifier __cpuinitdata = | 196 | static struct notifier_block thermal_throttle_cpu_notifier __cpuinitdata = |
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index 8b862d5900fe..1b7b31ab7d86 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
@@ -170,7 +170,7 @@ static int __cpuinit cpuid_class_cpu_callback(struct notifier_block *nfb, | |||
170 | cpuid_device_destroy(cpu); | 170 | cpuid_device_destroy(cpu); |
171 | break; | 171 | break; |
172 | } | 172 | } |
173 | return err ? NOTIFY_BAD : NOTIFY_OK; | 173 | return notifier_from_errno(err); |
174 | } | 174 | } |
175 | 175 | ||
176 | static struct notifier_block __refdata cpuid_class_cpu_notifier = | 176 | static struct notifier_block __refdata cpuid_class_cpu_notifier = |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 4d4468e9f47c..7bf2dc4c8f70 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -230,7 +230,7 @@ static int __cpuinit msr_class_cpu_callback(struct notifier_block *nfb, | |||
230 | msr_device_destroy(cpu); | 230 | msr_device_destroy(cpu); |
231 | break; | 231 | break; |
232 | } | 232 | } |
233 | return err ? NOTIFY_BAD : NOTIFY_OK; | 233 | return notifier_from_errno(err); |
234 | } | 234 | } |
235 | 235 | ||
236 | static struct notifier_block __refdata msr_class_cpu_notifier = { | 236 | static struct notifier_block __refdata msr_class_cpu_notifier = { |
diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c index 7d2829dde20e..a5bc528d4328 100644 --- a/arch/x86/kernel/pci-swiotlb.c +++ b/arch/x86/kernel/pci-swiotlb.c | |||
@@ -31,8 +31,6 @@ static struct dma_map_ops swiotlb_dma_ops = { | |||
31 | .free_coherent = swiotlb_free_coherent, | 31 | .free_coherent = swiotlb_free_coherent, |
32 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, | 32 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, |
33 | .sync_single_for_device = swiotlb_sync_single_for_device, | 33 | .sync_single_for_device = swiotlb_sync_single_for_device, |
34 | .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu, | ||
35 | .sync_single_range_for_device = swiotlb_sync_single_range_for_device, | ||
36 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, | 34 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, |
37 | .sync_sg_for_device = swiotlb_sync_sg_for_device, | 35 | .sync_sg_for_device = swiotlb_sync_sg_for_device, |
38 | .map_sg = swiotlb_map_sg_attrs, | 36 | .map_sg = swiotlb_map_sg_attrs, |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index ef6370b00e70..a867940a6dfc 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
@@ -265,10 +265,10 @@ void __init setup_per_cpu_areas(void) | |||
265 | 265 | ||
266 | #if defined(CONFIG_X86_64) && defined(CONFIG_NUMA) | 266 | #if defined(CONFIG_X86_64) && defined(CONFIG_NUMA) |
267 | /* | 267 | /* |
268 | * make sure boot cpu node_number is right, when boot cpu is on the | 268 | * make sure boot cpu numa_node is right, when boot cpu is on the |
269 | * node that doesn't have mem installed | 269 | * node that doesn't have mem installed |
270 | */ | 270 | */ |
271 | per_cpu(node_number, boot_cpu_id) = cpu_to_node(boot_cpu_id); | 271 | set_cpu_numa_node(boot_cpu_id, early_cpu_to_node(boot_cpu_id)); |
272 | #endif | 272 | #endif |
273 | 273 | ||
274 | /* Setup node to cpumask map */ | 274 | /* Setup node to cpumask map */ |
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 550df481accd..10c27bb1e95f 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c | |||
@@ -2,6 +2,7 @@ | |||
2 | #include <linux/topology.h> | 2 | #include <linux/topology.h> |
3 | #include <linux/module.h> | 3 | #include <linux/module.h> |
4 | #include <linux/bootmem.h> | 4 | #include <linux/bootmem.h> |
5 | #include <linux/random.h> | ||
5 | 6 | ||
6 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | 7 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS |
7 | # define DBG(x...) printk(KERN_DEBUG x) | 8 | # define DBG(x...) printk(KERN_DEBUG x) |
@@ -65,3 +66,19 @@ const struct cpumask *cpumask_of_node(int node) | |||
65 | } | 66 | } |
66 | EXPORT_SYMBOL(cpumask_of_node); | 67 | EXPORT_SYMBOL(cpumask_of_node); |
67 | #endif | 68 | #endif |
69 | |||
70 | /* | ||
71 | * Return the bit number of a random bit set in the nodemask. | ||
72 | * (returns -1 if nodemask is empty) | ||
73 | */ | ||
74 | int __node_random(const nodemask_t *maskp) | ||
75 | { | ||
76 | int w, bit = -1; | ||
77 | |||
78 | w = nodes_weight(*maskp); | ||
79 | if (w) | ||
80 | bit = bitmap_ord_to_pos(maskp->bits, | ||
81 | get_random_int() % w, MAX_NUMNODES); | ||
82 | return bit; | ||
83 | } | ||
84 | EXPORT_SYMBOL(__node_random); | ||
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 8948f47fde05..a7bcc23ef96c 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -33,9 +33,6 @@ int numa_off __initdata; | |||
33 | static unsigned long __initdata nodemap_addr; | 33 | static unsigned long __initdata nodemap_addr; |
34 | static unsigned long __initdata nodemap_size; | 34 | static unsigned long __initdata nodemap_size; |
35 | 35 | ||
36 | DEFINE_PER_CPU(int, node_number) = 0; | ||
37 | EXPORT_PER_CPU_SYMBOL(node_number); | ||
38 | |||
39 | /* | 36 | /* |
40 | * Map cpu index to node index | 37 | * Map cpu index to node index |
41 | */ | 38 | */ |
@@ -809,7 +806,7 @@ void __cpuinit numa_set_node(int cpu, int node) | |||
809 | per_cpu(x86_cpu_to_node_map, cpu) = node; | 806 | per_cpu(x86_cpu_to_node_map, cpu) = node; |
810 | 807 | ||
811 | if (node != NUMA_NO_NODE) | 808 | if (node != NUMA_NO_NODE) |
812 | per_cpu(node_number, cpu) = node; | 809 | set_cpu_numa_node(cpu, node); |
813 | } | 810 | } |
814 | 811 | ||
815 | void __cpuinit numa_clear_node(int cpu) | 812 | void __cpuinit numa_clear_node(int cpu) |
@@ -867,7 +864,7 @@ void __cpuinit numa_remove_cpu(int cpu) | |||
867 | numa_set_cpumask(cpu, 0); | 864 | numa_set_cpumask(cpu, 0); |
868 | } | 865 | } |
869 | 866 | ||
870 | int cpu_to_node(int cpu) | 867 | int __cpu_to_node(int cpu) |
871 | { | 868 | { |
872 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) { | 869 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) { |
873 | printk(KERN_WARNING | 870 | printk(KERN_WARNING |
@@ -877,7 +874,7 @@ int cpu_to_node(int cpu) | |||
877 | } | 874 | } |
878 | return per_cpu(x86_cpu_to_node_map, cpu); | 875 | return per_cpu(x86_cpu_to_node_map, cpu); |
879 | } | 876 | } |
880 | EXPORT_SYMBOL(cpu_to_node); | 877 | EXPORT_SYMBOL(__cpu_to_node); |
881 | 878 | ||
882 | /* | 879 | /* |
883 | * Same function as cpu_to_node() but used if called before the | 880 | * Same function as cpu_to_node() but used if called before the |
diff --git a/arch/xtensa/include/asm/scatterlist.h b/arch/xtensa/include/asm/scatterlist.h index 810080bb0a2b..b1f9fdc1d5ba 100644 --- a/arch/xtensa/include/asm/scatterlist.h +++ b/arch/xtensa/include/asm/scatterlist.h | |||
@@ -11,28 +11,7 @@ | |||
11 | #ifndef _XTENSA_SCATTERLIST_H | 11 | #ifndef _XTENSA_SCATTERLIST_H |
12 | #define _XTENSA_SCATTERLIST_H | 12 | #define _XTENSA_SCATTERLIST_H |
13 | 13 | ||
14 | #include <asm/types.h> | 14 | #include <asm-generic/scatterlist.h> |
15 | |||
16 | struct scatterlist { | ||
17 | #ifdef CONFIG_DEBUG_SG | ||
18 | unsigned long sg_magic; | ||
19 | #endif | ||
20 | unsigned long page_link; | ||
21 | unsigned int offset; | ||
22 | dma_addr_t dma_address; | ||
23 | unsigned int length; | ||
24 | }; | ||
25 | |||
26 | /* | ||
27 | * These macros should be used after a pci_map_sg call has been done | ||
28 | * to get bus addresses of each of the SG entries and their lengths. | ||
29 | * You should only work with the number of sg entries pci_map_sg | ||
30 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
31 | * is 0. | ||
32 | */ | ||
33 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
34 | #define sg_dma_len(sg) ((sg)->length) | ||
35 | |||
36 | 15 | ||
37 | #define ISA_DMA_THRESHOLD (~0UL) | 16 | #define ISA_DMA_THRESHOLD (~0UL) |
38 | 17 | ||