提交 a4936044 编写于 作者: L Linus Torvalds

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

...@@ -93,15 +93,12 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info) ...@@ -93,15 +93,12 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info)
static inline struct dmabounce_device_info * static inline struct dmabounce_device_info *
find_dmabounce_dev(struct device *dev) find_dmabounce_dev(struct device *dev)
{ {
struct list_head *entry; struct dmabounce_device_info *d;
list_for_each(entry, &dmabounce_devs) {
struct dmabounce_device_info *d =
list_entry(entry, struct dmabounce_device_info, node);
list_for_each_entry(d, &dmabounce_devs, node)
if (d->dev == dev) if (d->dev == dev)
return d; return d;
}
return NULL; return NULL;
} }
...@@ -172,15 +169,11 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr, ...@@ -172,15 +169,11 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
static inline struct safe_buffer * static inline struct safe_buffer *
find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr) find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr)
{ {
struct list_head *entry; struct safe_buffer *b;
list_for_each(entry, &device_info->safe_buffers) {
struct safe_buffer *b =
list_entry(entry, struct safe_buffer, node);
list_for_each_entry(b, &device_info->safe_buffers, node)
if (b->safe_dma_addr == safe_dma_addr) if (b->safe_dma_addr == safe_dma_addr)
return b; return b;
}
return NULL; return NULL;
} }
...@@ -301,7 +294,6 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, ...@@ -301,7 +294,6 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
__func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr),
buf->safe, (void *) buf->safe_dma_addr); buf->safe, (void *) buf->safe_dma_addr);
DO_STATS ( device_info->bounce_count++ ); DO_STATS ( device_info->bounce_count++ );
if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) { if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
......
...@@ -721,16 +721,17 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) ...@@ -721,16 +721,17 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
return ret; return ret;
} }
static int sa1111_remove_one(struct device *dev, void *data)
{
device_unregister(dev);
return 0;
}
static void __sa1111_remove(struct sa1111 *sachip) static void __sa1111_remove(struct sa1111 *sachip)
{ {
struct list_head *l, *n;
void __iomem *irqbase = sachip->base + SA1111_INTC; void __iomem *irqbase = sachip->base + SA1111_INTC;
list_for_each_safe(l, n, &sachip->dev->children) { device_for_each_child(sachip->dev, NULL, sa1111_remove_one);
struct device *d = list_to_dev(l);
device_unregister(d);
}
/* disable all IRQs */ /* disable all IRQs */
sa1111_writel(0, irqbase + SA1111_INTEN0); sa1111_writel(0, irqbase + SA1111_INTEN0);
......
...@@ -395,6 +395,20 @@ static void __init early_initrd(char **p) ...@@ -395,6 +395,20 @@ static void __init early_initrd(char **p)
} }
__early_param("initrd=", early_initrd); __early_param("initrd=", early_initrd);
static void __init add_memory(unsigned long start, unsigned long size)
{
/*
* Ensure that start/size are aligned to a page boundary.
* Size is appropriately rounded down, start is rounded up.
*/
size -= start & ~PAGE_MASK;
meminfo.bank[meminfo.nr_banks].start = PAGE_ALIGN(start);
meminfo.bank[meminfo.nr_banks].size = size & PAGE_MASK;
meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start);
meminfo.nr_banks += 1;
}
/* /*
* Pick out the memory size. We look for mem=size@start, * Pick out the memory size. We look for mem=size@start,
* where start and size are "size[KkMm]" * where start and size are "size[KkMm]"
...@@ -419,10 +433,7 @@ static void __init early_mem(char **p) ...@@ -419,10 +433,7 @@ static void __init early_mem(char **p)
if (**p == '@') if (**p == '@')
start = memparse(*p + 1, p); start = memparse(*p + 1, p);
meminfo.bank[meminfo.nr_banks].start = start; add_memory(start, size);
meminfo.bank[meminfo.nr_banks].size = size;
meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(start);
meminfo.nr_banks += 1;
} }
__early_param("mem=", early_mem); __early_param("mem=", early_mem);
...@@ -564,11 +575,7 @@ static int __init parse_tag_mem32(const struct tag *tag) ...@@ -564,11 +575,7 @@ static int __init parse_tag_mem32(const struct tag *tag)
tag->u.mem.start, tag->u.mem.size / 1024); tag->u.mem.start, tag->u.mem.size / 1024);
return -EINVAL; return -EINVAL;
} }
meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start; add_memory(tag->u.mem.start, tag->u.mem.size);
meminfo.bank[meminfo.nr_banks].size = tag->u.mem.size;
meminfo.bank[meminfo.nr_banks].node = PHYS_TO_NID(tag->u.mem.start);
meminfo.nr_banks += 1;
return 0; return 0;
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <asm/unistd.h> #include <asm/unistd.h>
#include "ptrace.h" #include "ptrace.h"
#include "signal.h"
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
...@@ -35,7 +36,7 @@ ...@@ -35,7 +36,7 @@
#define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE)) #define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE))
#define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE)) #define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
static const unsigned long retcodes[4] = { const unsigned long sigreturn_codes[4] = {
SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN,
SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN
}; };
...@@ -500,9 +501,16 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, ...@@ -500,9 +501,16 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
if (ka->sa.sa_flags & SA_SIGINFO) if (ka->sa.sa_flags & SA_SIGINFO)
idx += 2; idx += 2;
if (__put_user(retcodes[idx], rc)) if (__put_user(sigreturn_codes[idx], rc))
return 1; return 1;
if (cpsr & MODE32_BIT) {
/*
* 32-bit code can use the new high-page
* signal return code support.
*/
retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;
} else {
/* /*
* Ensure that the instruction cache sees * Ensure that the instruction cache sees
* the return code written onto the stack. * the return code written onto the stack.
...@@ -512,6 +520,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, ...@@ -512,6 +520,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
retcode = ((unsigned long)rc) + thumb; retcode = ((unsigned long)rc) + thumb;
} }
}
regs->ARM_r0 = usig; regs->ARM_r0 = usig;
regs->ARM_sp = (unsigned long)frame; regs->ARM_sp = (unsigned long)frame;
......
/*
* linux/arch/arm/kernel/signal.h
*
* Copyright (C) 2005 Russell King.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#define KERN_SIGRETURN_CODE 0xffff0500
extern const unsigned long sigreturn_codes[4];
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <asm/traps.h> #include <asm/traps.h>
#include "ptrace.h" #include "ptrace.h"
#include "signal.h"
const char *processor_modes[]= const char *processor_modes[]=
{ "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
...@@ -683,6 +684,14 @@ void __init trap_init(void) ...@@ -683,6 +684,14 @@ void __init trap_init(void)
memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz);
/*
* Copy signal return handlers into the vector page, and
* set sigreturn to be a pointer to these.
*/
memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes,
sizeof(sigreturn_codes));
flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
modify_domain(DOMAIN_USER, DOMAIN_CLIENT); modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
} }
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
unsigned int vram_size;
static void cl7500_ack_irq_a(unsigned int irq) static void cl7500_ack_irq_a(unsigned int irq)
{ {
unsigned int val, mask; unsigned int val, mask;
......
...@@ -32,10 +32,7 @@ ...@@ -32,10 +32,7 @@
extern void rpc_init_irq(void); extern void rpc_init_irq(void);
extern unsigned int vram_size; unsigned int vram_size;
#if 0
unsigned int memc_ctrl_reg; unsigned int memc_ctrl_reg;
unsigned int number_mfm_drives; unsigned int number_mfm_drives;
...@@ -63,8 +60,6 @@ static int __init parse_tag_acorn(const struct tag *tag) ...@@ -63,8 +60,6 @@ static int __init parse_tag_acorn(const struct tag *tag)
__tagtable(ATAG_ACORN, parse_tag_acorn); __tagtable(ATAG_ACORN, parse_tag_acorn);
#endif
static struct map_desc rpc_io_desc[] __initdata = { static struct map_desc rpc_io_desc[] __initdata = {
{ SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */ { SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */
{ (u32)IO_BASE, IO_START, IO_SIZE , MT_DEVICE }, /* IO space */ { (u32)IO_BASE, IO_START, IO_SIZE , MT_DEVICE }, /* IO space */
......
...@@ -93,14 +93,7 @@ struct node_info { ...@@ -93,14 +93,7 @@ struct node_info {
}; };
#define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT) #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT)
#define V_PFN_DOWN(x) O_PFN_DOWN(__pa(x))
#define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT) #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT)
#define V_PFN_UP(x) O_PFN_UP(__pa(x))
#define PFN_SIZE(x) ((x) >> PAGE_SHIFT)
#define PFN_RANGE(s,e) PFN_SIZE(PAGE_ALIGN((unsigned long)(e)) - \
(((unsigned long)(s)) & PAGE_MASK))
/* /*
* FIXME: We really want to avoid allocating the bootmap bitmap * FIXME: We really want to avoid allocating the bootmap bitmap
...@@ -113,7 +106,7 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages) ...@@ -113,7 +106,7 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
{ {
unsigned int start_pfn, bank, bootmap_pfn; unsigned int start_pfn, bank, bootmap_pfn;
start_pfn = V_PFN_UP(&_end); start_pfn = O_PFN_UP(__pa(&_end));
bootmap_pfn = 0; bootmap_pfn = 0;
for (bank = 0; bank < mi->nr_banks; bank ++) { for (bank = 0; bank < mi->nr_banks; bank ++) {
...@@ -122,9 +115,9 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages) ...@@ -122,9 +115,9 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
if (mi->bank[bank].node != node) if (mi->bank[bank].node != node)
continue; continue;
start = O_PFN_UP(mi->bank[bank].start); start = mi->bank[bank].start >> PAGE_SHIFT;
end = O_PFN_DOWN(mi->bank[bank].size + end = (mi->bank[bank].size +
mi->bank[bank].start); mi->bank[bank].start) >> PAGE_SHIFT;
if (end < start_pfn) if (end < start_pfn)
continue; continue;
...@@ -191,8 +184,8 @@ find_memend_and_nodes(struct meminfo *mi, struct node_info *np) ...@@ -191,8 +184,8 @@ find_memend_and_nodes(struct meminfo *mi, struct node_info *np)
/* /*
* Get the start and end pfns for this bank * Get the start and end pfns for this bank
*/ */
start = O_PFN_UP(mi->bank[i].start); start = mi->bank[i].start >> PAGE_SHIFT;
end = O_PFN_DOWN(mi->bank[i].start + mi->bank[i].size); end = (mi->bank[i].start + mi->bank[i].size) >> PAGE_SHIFT;
if (np[node].start > start) if (np[node].start > start)
np[node].start = start; np[node].start = start;
......
...@@ -89,6 +89,13 @@ static inline void pte_free(struct page *pte) ...@@ -89,6 +89,13 @@ static inline void pte_free(struct page *pte)
__free_page(pte); __free_page(pte);
} }
static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval)
{
pmdp[0] = __pmd(pmdval);
pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t));
flush_pmd_entry(pmdp);
}
/* /*
* Populate the pmdp entry with a pointer to the pte. This pmd is part * Populate the pmdp entry with a pointer to the pte. This pmd is part
* of the mm address space. * of the mm address space.
...@@ -99,32 +106,19 @@ static inline void ...@@ -99,32 +106,19 @@ static inline void
pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
{ {
unsigned long pte_ptr = (unsigned long)ptep; unsigned long pte_ptr = (unsigned long)ptep;
unsigned long pmdval;
BUG_ON(mm != &init_mm);
/* /*
* The pmd must be loaded with the physical * The pmd must be loaded with the physical
* address of the PTE table * address of the PTE table
*/ */
pte_ptr -= PTRS_PER_PTE * sizeof(void *); pte_ptr -= PTRS_PER_PTE * sizeof(void *);
pmdval = __pa(pte_ptr) | _PAGE_KERNEL_TABLE; __pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE);
pmdp[0] = __pmd(pmdval);
pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t));
flush_pmd_entry(pmdp);
} }
static inline void static inline void
pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep)
{ {
unsigned long pmdval; __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE);
BUG_ON(mm == &init_mm);
pmdval = page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE;
pmdp[0] = __pmd(pmdval);
pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t));
flush_pmd_entry(pmdp);
} }
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册