mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Merge master.kernel.org:/home/rmk/linux-2.6-arm
This commit is contained in:
		
						commit
						a493604400
					
				
					 10 changed files with 85 additions and 71 deletions
				
			
		| 
						 | 
				
			
			@ -93,15 +93,12 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info)
 | 
			
		|||
static inline struct dmabounce_device_info *
 | 
			
		||||
find_dmabounce_dev(struct device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *entry;
 | 
			
		||||
 | 
			
		||||
	list_for_each(entry, &dmabounce_devs) {
 | 
			
		||||
		struct dmabounce_device_info *d =
 | 
			
		||||
			list_entry(entry, struct dmabounce_device_info, node);
 | 
			
		||||
	struct dmabounce_device_info *d;
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(d, &dmabounce_devs, node)
 | 
			
		||||
		if (d->dev == dev)
 | 
			
		||||
			return d;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -172,15 +169,11 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
 | 
			
		|||
static inline struct safe_buffer *
 | 
			
		||||
find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr)
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *entry;
 | 
			
		||||
 | 
			
		||||
	list_for_each(entry, &device_info->safe_buffers) {
 | 
			
		||||
		struct safe_buffer *b =
 | 
			
		||||
			list_entry(entry, struct safe_buffer, node);
 | 
			
		||||
	struct safe_buffer *b;
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(b, &device_info->safe_buffers, node)
 | 
			
		||||
		if (b->safe_dma_addr == safe_dma_addr)
 | 
			
		||||
			return b;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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),
 | 
			
		||||
			buf->safe, (void *) buf->safe_dma_addr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		DO_STATS ( device_info->bounce_count++ );
 | 
			
		||||
 | 
			
		||||
		if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -721,16 +721,17 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
 | 
			
		|||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sa1111_remove_one(struct device *dev, void *data)
 | 
			
		||||
{
 | 
			
		||||
	device_unregister(dev);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __sa1111_remove(struct sa1111 *sachip)
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *l, *n;
 | 
			
		||||
	void __iomem *irqbase = sachip->base + SA1111_INTC;
 | 
			
		||||
 | 
			
		||||
	list_for_each_safe(l, n, &sachip->dev->children) {
 | 
			
		||||
		struct device *d = list_to_dev(l);
 | 
			
		||||
 | 
			
		||||
		device_unregister(d);
 | 
			
		||||
	}
 | 
			
		||||
	device_for_each_child(sachip->dev, NULL, sa1111_remove_one);
 | 
			
		||||
 | 
			
		||||
	/* disable all IRQs */
 | 
			
		||||
	sa1111_writel(0, irqbase + SA1111_INTEN0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -395,6 +395,20 @@ static void __init early_initrd(char **p)
 | 
			
		|||
}
 | 
			
		||||
__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,
 | 
			
		||||
 * where start and size are "size[KkMm]"
 | 
			
		||||
| 
						 | 
				
			
			@ -419,10 +433,7 @@ static void __init early_mem(char **p)
 | 
			
		|||
	if (**p == '@')
 | 
			
		||||
		start = memparse(*p + 1, p);
 | 
			
		||||
 | 
			
		||||
	meminfo.bank[meminfo.nr_banks].start = start;
 | 
			
		||||
	meminfo.bank[meminfo.nr_banks].size  = size;
 | 
			
		||||
	meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(start);
 | 
			
		||||
	meminfo.nr_banks += 1;
 | 
			
		||||
	add_memory(start, size);
 | 
			
		||||
}
 | 
			
		||||
__early_param("mem=", early_mem);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -564,11 +575,7 @@ static int __init parse_tag_mem32(const struct tag *tag)
 | 
			
		|||
			tag->u.mem.start, tag->u.mem.size / 1024);
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
	meminfo.bank[meminfo.nr_banks].start = tag->u.mem.start;
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
	add_memory(tag->u.mem.start, tag->u.mem.size);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
#include <asm/unistd.h>
 | 
			
		||||
 | 
			
		||||
#include "ptrace.h"
 | 
			
		||||
#include "signal.h"
 | 
			
		||||
 | 
			
		||||
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +36,7 @@
 | 
			
		|||
#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))
 | 
			
		||||
 | 
			
		||||
static const unsigned long retcodes[4] = {
 | 
			
		||||
const unsigned long sigreturn_codes[4] = {
 | 
			
		||||
	SWI_SYS_SIGRETURN,	SWI_THUMB_SIGRETURN,
 | 
			
		||||
	SWI_SYS_RT_SIGRETURN,	SWI_THUMB_RT_SIGRETURN
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -500,17 +501,25 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
 | 
			
		|||
		if (ka->sa.sa_flags & SA_SIGINFO)
 | 
			
		||||
			idx += 2;
 | 
			
		||||
 | 
			
		||||
		if (__put_user(retcodes[idx], rc))
 | 
			
		||||
		if (__put_user(sigreturn_codes[idx], rc))
 | 
			
		||||
			return 1;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Ensure that the instruction cache sees
 | 
			
		||||
		 * the return code written onto the stack.
 | 
			
		||||
		 */
 | 
			
		||||
		flush_icache_range((unsigned long)rc,
 | 
			
		||||
				   (unsigned long)(rc + 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
 | 
			
		||||
			 * the return code written onto the stack.
 | 
			
		||||
			 */
 | 
			
		||||
			flush_icache_range((unsigned long)rc,
 | 
			
		||||
					   (unsigned long)(rc + 1));
 | 
			
		||||
 | 
			
		||||
		retcode = ((unsigned long)rc) + thumb;
 | 
			
		||||
			retcode = ((unsigned long)rc) + thumb;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	regs->ARM_r0 = usig;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								arch/arm/kernel/signal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								arch/arm/kernel/signal.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  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 @@
 | 
			
		|||
#include <asm/traps.h>
 | 
			
		||||
 | 
			
		||||
#include "ptrace.h"
 | 
			
		||||
#include "signal.h"
 | 
			
		||||
 | 
			
		||||
const char *processor_modes[]=
 | 
			
		||||
{ "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)
 | 
			
		|||
	memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
 | 
			
		||||
	memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
 | 
			
		||||
	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);
 | 
			
		||||
	modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,8 @@
 | 
			
		|||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
 | 
			
		||||
unsigned int vram_size;
 | 
			
		||||
 | 
			
		||||
static void cl7500_ack_irq_a(unsigned int irq)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int val, mask;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,10 +32,7 @@
 | 
			
		|||
 | 
			
		||||
extern void rpc_init_irq(void);
 | 
			
		||||
 | 
			
		||||
extern unsigned int vram_size;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
 | 
			
		||||
unsigned int vram_size;
 | 
			
		||||
unsigned int memc_ctrl_reg;
 | 
			
		||||
unsigned int number_mfm_drives;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -63,8 +60,6 @@ static int __init parse_tag_acorn(const struct tag *tag)
 | 
			
		|||
 | 
			
		||||
__tagtable(ATAG_ACORN, parse_tag_acorn);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static struct map_desc rpc_io_desc[] __initdata = {
 | 
			
		||||
 { SCREEN_BASE,	SCREEN_START,	2*1048576, MT_DEVICE }, /* VRAM		*/
 | 
			
		||||
 { (u32)IO_BASE, IO_START,	IO_SIZE	 , MT_DEVICE }, /* IO space	*/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -93,14 +93,7 @@ struct node_info {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
#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 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
 | 
			
		||||
| 
						 | 
				
			
			@ -113,7 +106,7 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
 | 
			
		|||
{
 | 
			
		||||
	unsigned int start_pfn, bank, bootmap_pfn;
 | 
			
		||||
 | 
			
		||||
	start_pfn   = V_PFN_UP(&_end);
 | 
			
		||||
	start_pfn   = O_PFN_UP(__pa(&_end));
 | 
			
		||||
	bootmap_pfn = 0;
 | 
			
		||||
 | 
			
		||||
	for (bank = 0; bank < mi->nr_banks; bank ++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -122,9 +115,9 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
 | 
			
		|||
		if (mi->bank[bank].node != node)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		start = O_PFN_UP(mi->bank[bank].start);
 | 
			
		||||
		end   = O_PFN_DOWN(mi->bank[bank].size +
 | 
			
		||||
				   mi->bank[bank].start);
 | 
			
		||||
		start = mi->bank[bank].start >> PAGE_SHIFT;
 | 
			
		||||
		end   = (mi->bank[bank].size +
 | 
			
		||||
			 mi->bank[bank].start) >> PAGE_SHIFT;
 | 
			
		||||
 | 
			
		||||
		if (end < start_pfn)
 | 
			
		||||
			continue;
 | 
			
		||||
| 
						 | 
				
			
			@ -191,8 +184,8 @@ find_memend_and_nodes(struct meminfo *mi, struct node_info *np)
 | 
			
		|||
		/*
 | 
			
		||||
		 * Get the start and end pfns for this bank
 | 
			
		||||
		 */
 | 
			
		||||
		start = O_PFN_UP(mi->bank[i].start);
 | 
			
		||||
		end   = O_PFN_DOWN(mi->bank[i].start + mi->bank[i].size);
 | 
			
		||||
		start = mi->bank[i].start >> PAGE_SHIFT;
 | 
			
		||||
		end   = (mi->bank[i].start + mi->bank[i].size) >> PAGE_SHIFT;
 | 
			
		||||
 | 
			
		||||
		if (np[node].start > start)
 | 
			
		||||
			np[node].start = start;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,6 +89,13 @@ static inline void pte_free(struct 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
 | 
			
		||||
 * of the mm address space.
 | 
			
		||||
| 
						 | 
				
			
			@ -99,32 +106,19 @@ static inline void
 | 
			
		|||
pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long pte_ptr = (unsigned long)ptep;
 | 
			
		||||
	unsigned long pmdval;
 | 
			
		||||
 | 
			
		||||
	BUG_ON(mm != &init_mm);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The pmd must be loaded with the physical
 | 
			
		||||
	 * address of the PTE table
 | 
			
		||||
	 */
 | 
			
		||||
	pte_ptr -= PTRS_PER_PTE * sizeof(void *);
 | 
			
		||||
	pmdval = __pa(pte_ptr) | _PAGE_KERNEL_TABLE;
 | 
			
		||||
	pmdp[0] = __pmd(pmdval);
 | 
			
		||||
	pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t));
 | 
			
		||||
	flush_pmd_entry(pmdp);
 | 
			
		||||
	__pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long pmdval;
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
	__pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue