Merge master.kernel.org:/home/rmk/linux-2.6-arm

+85 -71
+5 -13
arch/arm/common/dmabounce.c
··· 93 static inline struct dmabounce_device_info * 94 find_dmabounce_dev(struct device *dev) 95 { 96 - struct list_head *entry; 97 98 - list_for_each(entry, &dmabounce_devs) { 99 - struct dmabounce_device_info *d = 100 - list_entry(entry, struct dmabounce_device_info, node); 101 - 102 if (d->dev == dev) 103 return d; 104 - } 105 return NULL; 106 } 107 ··· 169 static inline struct safe_buffer * 170 find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr) 171 { 172 - struct list_head *entry; 173 174 - list_for_each(entry, &device_info->safe_buffers) { 175 - struct safe_buffer *b = 176 - list_entry(entry, struct safe_buffer, node); 177 - 178 if (b->safe_dma_addr == safe_dma_addr) 179 return b; 180 - } 181 182 return NULL; 183 } ··· 293 "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", 294 __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), 295 buf->safe, (void *) buf->safe_dma_addr); 296 - 297 298 DO_STATS ( device_info->bounce_count++ ); 299
··· 93 static inline struct dmabounce_device_info * 94 find_dmabounce_dev(struct device *dev) 95 { 96 + struct dmabounce_device_info *d; 97 98 + list_for_each_entry(d, &dmabounce_devs, node) 99 if (d->dev == dev) 100 return d; 101 + 102 return NULL; 103 } 104 ··· 172 static inline struct safe_buffer * 173 find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr) 174 { 175 + struct safe_buffer *b; 176 177 + list_for_each_entry(b, &device_info->safe_buffers, node) 178 if (b->safe_dma_addr == safe_dma_addr) 179 return b; 180 181 return NULL; 182 } ··· 300 "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", 301 __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), 302 buf->safe, (void *) buf->safe_dma_addr); 303 304 DO_STATS ( device_info->bounce_count++ ); 305
+7 -6
arch/arm/common/sa1111.c
··· 721 return ret; 722 } 723 724 static void __sa1111_remove(struct sa1111 *sachip) 725 { 726 - struct list_head *l, *n; 727 void __iomem *irqbase = sachip->base + SA1111_INTC; 728 729 - list_for_each_safe(l, n, &sachip->dev->children) { 730 - struct device *d = list_to_dev(l); 731 - 732 - device_unregister(d); 733 - } 734 735 /* disable all IRQs */ 736 sa1111_writel(0, irqbase + SA1111_INTEN0);
··· 721 return ret; 722 } 723 724 + static int sa1111_remove_one(struct device *dev, void *data) 725 + { 726 + device_unregister(dev); 727 + return 0; 728 + } 729 + 730 static void __sa1111_remove(struct sa1111 *sachip) 731 { 732 void __iomem *irqbase = sachip->base + SA1111_INTC; 733 734 + device_for_each_child(sachip->dev, NULL, sa1111_remove_one); 735 736 /* disable all IRQs */ 737 sa1111_writel(0, irqbase + SA1111_INTEN0);
+16 -9
arch/arm/kernel/setup.c
··· 395 } 396 __early_param("initrd=", early_initrd); 397 398 /* 399 * Pick out the memory size. We look for mem=size@start, 400 * where start and size are "size[KkMm]" ··· 433 if (**p == '@') 434 start = memparse(*p + 1, p); 435 436 - meminfo.bank[meminfo.nr_banks].start = start; 437 - meminfo.bank[meminfo.nr_banks].size = size; 438 - meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start); 439 - meminfo.nr_banks += 1; 440 } 441 __early_param("mem=", early_mem); 442 ··· 575 tag->u.mem.start, tag->u.mem.size / 1024); 576 return -EINVAL; 577 } 578 - meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start; 579 - meminfo.bank[meminfo.nr_banks].size = tag->u.mem.size; 580 - meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(tag->u.mem.start); 581 - meminfo.nr_banks += 1; 582 - 583 return 0; 584 } 585
··· 395 } 396 __early_param("initrd=", early_initrd); 397 398 + static void __init add_memory(unsigned long start, unsigned long size) 399 + { 400 + /* 401 + * Ensure that start/size are aligned to a page boundary. 402 + * Size is appropriately rounded down, start is rounded up. 403 + */ 404 + size -= start & ~PAGE_MASK; 405 + 406 + meminfo.bank[meminfo.nr_banks].start = PAGE_ALIGN(start); 407 + meminfo.bank[meminfo.nr_banks].size = size & PAGE_MASK; 408 + meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start); 409 + meminfo.nr_banks += 1; 410 + } 411 + 412 /* 413 * Pick out the memory size. We look for mem=size@start, 414 * where start and size are "size[KkMm]" ··· 419 if (**p == '@') 420 start = memparse(*p + 1, p); 421 422 + add_memory(start, size); 423 } 424 __early_param("mem=", early_mem); 425 ··· 564 tag->u.mem.start, tag->u.mem.size / 1024); 565 return -EINVAL; 566 } 567 + add_memory(tag->u.mem.start, tag->u.mem.size); 568 return 0; 569 } 570
+18 -9
arch/arm/kernel/signal.c
··· 19 #include <asm/unistd.h> 20 21 #include "ptrace.h" 22 23 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 24 ··· 36 #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE)) 37 #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE)) 38 39 - static const unsigned long retcodes[4] = { 40 SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, 41 SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN 42 }; ··· 501 if (ka->sa.sa_flags & SA_SIGINFO) 502 idx += 2; 503 504 - if (__put_user(retcodes[idx], rc)) 505 return 1; 506 507 - /* 508 - * Ensure that the instruction cache sees 509 - * the return code written onto the stack. 510 - */ 511 - flush_icache_range((unsigned long)rc, 512 - (unsigned long)(rc + 1)); 513 514 - retcode = ((unsigned long)rc) + thumb; 515 } 516 517 regs->ARM_r0 = usig;
··· 19 #include <asm/unistd.h> 20 21 #include "ptrace.h" 22 + #include "signal.h" 23 24 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 25 ··· 35 #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE)) 36 #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE)) 37 38 + const unsigned long sigreturn_codes[4] = { 39 SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, 40 SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN 41 }; ··· 500 if (ka->sa.sa_flags & SA_SIGINFO) 501 idx += 2; 502 503 + if (__put_user(sigreturn_codes[idx], rc)) 504 return 1; 505 506 + if (cpsr & MODE32_BIT) { 507 + /* 508 + * 32-bit code can use the new high-page 509 + * signal return code support. 510 + */ 511 + retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb; 512 + } else { 513 + /* 514 + * Ensure that the instruction cache sees 515 + * the return code written onto the stack. 516 + */ 517 + flush_icache_range((unsigned long)rc, 518 + (unsigned long)(rc + 1)); 519 520 + retcode = ((unsigned long)rc) + thumb; 521 + } 522 } 523 524 regs->ARM_r0 = usig;
+12
arch/arm/kernel/signal.h
···
··· 1 + /* 2 + * linux/arch/arm/kernel/signal.h 3 + * 4 + * Copyright (C) 2005 Russell King. 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License version 2 as 8 + * published by the Free Software Foundation. 9 + */ 10 + #define KERN_SIGRETURN_CODE 0xffff0500 11 + 12 + extern const unsigned long sigreturn_codes[4];
+9
arch/arm/kernel/traps.c
··· 30 #include <asm/traps.h> 31 32 #include "ptrace.h" 33 34 const char *processor_modes[]= 35 { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , ··· 684 memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); 685 memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); 686 memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); 687 flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); 688 modify_domain(DOMAIN_USER, DOMAIN_CLIENT); 689 }
··· 30 #include <asm/traps.h> 31 32 #include "ptrace.h" 33 + #include "signal.h" 34 35 const char *processor_modes[]= 36 { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , ··· 683 memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); 684 memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); 685 memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); 686 + 687 + /* 688 + * Copy signal return handlers into the vector page, and 689 + * set sigreturn to be a pointer to these. 690 + */ 691 + memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, 692 + sizeof(sigreturn_codes)); 693 + 694 flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); 695 modify_domain(DOMAIN_USER, DOMAIN_CLIENT); 696 }
+2
arch/arm/mach-clps7500/core.c
··· 26 #include <asm/irq.h> 27 #include <asm/mach-types.h> 28 29 static void cl7500_ack_irq_a(unsigned int irq) 30 { 31 unsigned int val, mask;
··· 26 #include <asm/irq.h> 27 #include <asm/mach-types.h> 28 29 + unsigned int vram_size; 30 + 31 static void cl7500_ack_irq_a(unsigned int irq) 32 { 33 unsigned int val, mask;
+1 -6
arch/arm/mach-rpc/riscpc.c
··· 32 33 extern void rpc_init_irq(void); 34 35 - extern unsigned int vram_size; 36 - 37 - #if 0 38 - 39 unsigned int memc_ctrl_reg; 40 unsigned int number_mfm_drives; 41 ··· 59 } 60 61 __tagtable(ATAG_ACORN, parse_tag_acorn); 62 - 63 - #endif 64 65 static struct map_desc rpc_io_desc[] __initdata = { 66 { SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */
··· 32 33 extern void rpc_init_irq(void); 34 35 + unsigned int vram_size; 36 unsigned int memc_ctrl_reg; 37 unsigned int number_mfm_drives; 38 ··· 62 } 63 64 __tagtable(ATAG_ACORN, parse_tag_acorn); 65 66 static struct map_desc rpc_io_desc[] __initdata = { 67 { SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */
+6 -13
arch/arm/mm/init.c
··· 93 }; 94 95 #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT) 96 - #define V_PFN_DOWN(x) O_PFN_DOWN(__pa(x)) 97 - 98 #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) 99 - #define V_PFN_UP(x) O_PFN_UP(__pa(x)) 100 - 101 - #define PFN_SIZE(x) ((x) >> PAGE_SHIFT) 102 - #define PFN_RANGE(s,e) PFN_SIZE(PAGE_ALIGN((unsigned long)(e)) - \ 103 - (((unsigned long)(s)) & PAGE_MASK)) 104 105 /* 106 * FIXME: We really want to avoid allocating the bootmap bitmap ··· 106 { 107 unsigned int start_pfn, bank, bootmap_pfn; 108 109 - start_pfn = V_PFN_UP(&_end); 110 bootmap_pfn = 0; 111 112 for (bank = 0; bank < mi->nr_banks; bank ++) { ··· 115 if (mi->bank[bank].node != node) 116 continue; 117 118 - start = O_PFN_UP(mi->bank[bank].start); 119 - end = O_PFN_DOWN(mi->bank[bank].size + 120 - mi->bank[bank].start); 121 122 if (end < start_pfn) 123 continue; ··· 184 /* 185 * Get the start and end pfns for this bank 186 */ 187 - start = O_PFN_UP(mi->bank[i].start); 188 - end = O_PFN_DOWN(mi->bank[i].start + mi->bank[i].size); 189 190 if (np[node].start > start) 191 np[node].start = start;
··· 93 }; 94 95 #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT) 96 #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) 97 98 /* 99 * FIXME: We really want to avoid allocating the bootmap bitmap ··· 113 { 114 unsigned int start_pfn, bank, bootmap_pfn; 115 116 + start_pfn = O_PFN_UP(__pa(&_end)); 117 bootmap_pfn = 0; 118 119 for (bank = 0; bank < mi->nr_banks; bank ++) { ··· 122 if (mi->bank[bank].node != node) 123 continue; 124 125 + start = mi->bank[bank].start >> PAGE_SHIFT; 126 + end = (mi->bank[bank].size + 127 + mi->bank[bank].start) >> PAGE_SHIFT; 128 129 if (end < start_pfn) 130 continue; ··· 191 /* 192 * Get the start and end pfns for this bank 193 */ 194 + start = mi->bank[i].start >> PAGE_SHIFT; 195 + end = (mi->bank[i].start + mi->bank[i].size) >> PAGE_SHIFT; 196 197 if (np[node].start > start) 198 np[node].start = start;
+9 -15
include/asm-arm/pgalloc.h
··· 89 __free_page(pte); 90 } 91 92 /* 93 * Populate the pmdp entry with a pointer to the pte. This pmd is part 94 * of the mm address space. ··· 106 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) 107 { 108 unsigned long pte_ptr = (unsigned long)ptep; 109 - unsigned long pmdval; 110 - 111 - BUG_ON(mm != &init_mm); 112 113 /* 114 * The pmd must be loaded with the physical 115 * address of the PTE table 116 */ 117 pte_ptr -= PTRS_PER_PTE * sizeof(void *); 118 - pmdval = __pa(pte_ptr) | _PAGE_KERNEL_TABLE; 119 - pmdp[0] = __pmd(pmdval); 120 - pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); 121 - flush_pmd_entry(pmdp); 122 } 123 124 static inline void 125 pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) 126 { 127 - unsigned long pmdval; 128 - 129 - BUG_ON(mm == &init_mm); 130 - 131 - pmdval = page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE; 132 - pmdp[0] = __pmd(pmdval); 133 - pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); 134 - flush_pmd_entry(pmdp); 135 } 136 137 #endif
··· 89 __free_page(pte); 90 } 91 92 + static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval) 93 + { 94 + pmdp[0] = __pmd(pmdval); 95 + pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); 96 + flush_pmd_entry(pmdp); 97 + } 98 + 99 /* 100 * Populate the pmdp entry with a pointer to the pte. This pmd is part 101 * of the mm address space. ··· 99 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) 100 { 101 unsigned long pte_ptr = (unsigned long)ptep; 102 103 /* 104 * The pmd must be loaded with the physical 105 * address of the PTE table 106 */ 107 pte_ptr -= PTRS_PER_PTE * sizeof(void *); 108 + __pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE); 109 } 110 111 static inline void 112 pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) 113 { 114 + __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); 115 } 116 117 #endif