diff options
| -rw-r--r-- | arch/sparc/kernel/ioport.c | 6 | ||||
| -rw-r--r-- | arch/sparc/mm/srmmu.c | 1 | ||||
| -rw-r--r-- | arch/sparc64/defconfig | 18 | ||||
| -rw-r--r-- | arch/sparc64/kernel/entry.S | 2 | ||||
| -rw-r--r-- | arch/sparc64/kernel/process.c | 11 | ||||
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 32 | ||||
| -rw-r--r-- | drivers/net/sunlance.c | 4 | ||||
| -rw-r--r-- | include/asm-i386/tlb.h | 4 | ||||
| -rw-r--r-- | include/asm-sparc/pgalloc.h | 1 | ||||
| -rw-r--r-- | include/asm-sparc/sbus.h | 6 | ||||
| -rw-r--r-- | include/asm-sparc64/tlb.h | 17 | ||||
| -rw-r--r-- | include/asm-sparc64/tlbflush.h | 36 | ||||
| -rw-r--r-- | mm/memory.c | 5 |
13 files changed, 96 insertions, 47 deletions
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index e7ff970205b5..8199e8ae33e9 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -351,7 +351,7 @@ void sbus_free_consistent(struct sbus_dev *sdev, long n, void *p, u32 ba) * CPU view of this memory may be inconsistent with * a device view and explicit flushing is necessary. */ -u32 sbus_map_single(struct sbus_dev *sdev, void *va, long len, int direction) +dma_addr_t sbus_map_single(struct sbus_dev *sdev, void *va, size_t len, int direction) { #if 0 /* This is the version that abuses consistent space */ unsigned long len_total = (len + PAGE_SIZE-1) & PAGE_MASK; @@ -398,7 +398,7 @@ u32 sbus_map_single(struct sbus_dev *sdev, void *va, long len, int direction) #endif } -void sbus_unmap_single(struct sbus_dev *sdev, u32 ba, long n, int direction) +void sbus_unmap_single(struct sbus_dev *sdev, dma_addr_t ba, size_t n, int direction) { #if 0 /* This is the version that abuses consistent space */ struct resource *res; @@ -445,7 +445,7 @@ void sbus_unmap_sg(struct sbus_dev *sdev, struct scatterlist *sg, int n, int dir /* */ -void sbus_dma_sync_single(struct sbus_dev *sdev, u32 ba, long size, int direction) +void sbus_dma_sync_single(struct sbus_dev *sdev, dma_addr_t ba, size_t size, int direction) { #if 0 unsigned long va; diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index f35497690859..020b25a19bde 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -394,7 +394,6 @@ static pte_t *srmmu_pte_alloc_one_fast(struct mm_struct *mm, unsigned long addre static pte_t *srmmu_pte_alloc_one(struct mm_struct *mm, unsigned long address) { - BUG(); return NULL; } diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index d118a2fcec6c..2045cf924c55 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/defconfig @@ -272,12 +272,16 @@ CONFIG_BLK_DEV_IDECD=y # CONFIG_BLK_DEV_IDESCSI is not set # -# ATA host chipset support +# ATA host chip set support # # CONFIG_BLK_DEV_CMD640 is not set # CONFIG_BLK_DEV_CMD640_ENHANCED is not set # CONFIG_BLK_DEV_ISAPNP is not set # CONFIG_BLK_DEV_RZ1000 is not set + +# +# PCI host chip set support +# # CONFIG_BLK_DEV_OFFBOARD is not set # CONFIG_IDEPCI_SHARE_IRQ is not set CONFIG_BLK_DEV_IDEDMA_PCI=y @@ -383,7 +387,6 @@ CONFIG_SCSI_FCAL=m # Fusion MPT device support # CONFIG_FUSION=m -# CONFIG_FUSION_BOOT is not set # # (ability to boot linux kernel from Fusion device is DISABLED!) @@ -612,6 +615,9 @@ CONFIG_SOUND_GAMEPORT=y # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set +# CONFIG_QIFACE_COMPAT is not set CONFIG_AUTOFS_FS=m CONFIG_AUTOFS4_FS=m # CONFIG_REISERFS_FS is not set @@ -772,10 +778,11 @@ CONFIG_USB_DEVICEFS=y # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=m -# CONFIG_USB_OHCI_HCD is not set +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_UHCI_HCD=m +# CONFIG_USB_UHCI_HCD_ALT is not set CONFIG_USB_UHCI=y # CONFIG_USB_UHCI_ALT is not set -CONFIG_USB_OHCI=y # # USB Device Class drivers @@ -792,6 +799,7 @@ CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y CONFIG_USB_STORAGE_HP8200e=y CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y # CONFIG_USB_STORAGE_JUMPSHOT is not set # @@ -799,7 +807,7 @@ CONFIG_USB_STORAGE_SDDR09=y # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y -# CONFIG_USB_HIDDEV is not set +CONFIG_USB_HIDDEV=y CONFIG_USB_WACOM=m # diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 5989903c8d38..49cfc654d8a4 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S @@ -1429,7 +1429,7 @@ sys_fork: clr %o1 sys_clone: flushw movrz %o1, %fp, %o1 mov 0, %o3 - ba,pt %xcc, do_fork_FIXME_NOW_RETURNS_TASK_STRUCT + ba,pt %xcc, sparc_do_fork add %sp, STACK_BIAS + REGWIN_SZ, %o2 ret_from_syscall: /* Clear SPARC_FLAG_NEWCHILD, switch_to leaves thread.flags in diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index f6e0ab087bd8..12600914e6c9 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c @@ -582,6 +582,17 @@ barf: do_exit(SIGILL); } +asmlinkage int sparc_do_fork(unsigned long clone_flags, + unsigned long stack_start, + struct pt_regs *regs, + unsigned long stack_size) +{ + struct task_struct *p = do_fork(clone_flags, stack_start, + regs, stack_size); + + return IS_ERR(p) ? PTR_ERR(p) : p->pid; +} + /* Copy a Sparc thread. The fork() return value conventions * under SunOS are nothing short of bletcherous: * Parent --> %o0 == childs pid, %o1 == 0 diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 9575623d8194..7024df48fa36 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c @@ -824,30 +824,26 @@ void smp_flush_tlb_mm(struct mm_struct *mm) } } -void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, +void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) { - struct mm_struct *mm = vma->vm_mm; - - { - u32 ctx = CTX_HWBITS(mm->context); - int cpu = smp_processor_id(); + u32 ctx = CTX_HWBITS(mm->context); + int cpu = smp_processor_id(); - start &= PAGE_MASK; - end = PAGE_ALIGN(end); + start &= PAGE_MASK; + end = PAGE_ALIGN(end); - if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) { - mm->cpu_vm_mask = (1UL << cpu); - goto local_flush_and_out; - } + if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) { + mm->cpu_vm_mask = (1UL << cpu); + goto local_flush_and_out; + } - smp_cross_call_masked(&xcall_flush_tlb_range, - ctx, start, end, - mm->cpu_vm_mask); + smp_cross_call_masked(&xcall_flush_tlb_range, + ctx, start, end, + mm->cpu_vm_mask); - local_flush_and_out: - __flush_tlb_range(ctx, start, SECONDARY_CONTEXT, end, PAGE_SIZE, (end-start)); - } + local_flush_and_out: + __flush_tlb_range(ctx, start, SECONDARY_CONTEXT, end, PAGE_SIZE, (end-start)); } void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end) diff --git a/drivers/net/sunlance.c b/drivers/net/sunlance.c index 0a109f7cce3c..22f5cefb23d5 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c @@ -258,7 +258,7 @@ struct lance_private { void (*tx)(struct net_device *); char *name; - __u32 init_block_dvma; + dma_addr_t init_block_dvma; struct net_device *dev; /* Backpointer */ struct lance_private *next_module; struct sbus_dev *sdev; @@ -320,7 +320,7 @@ static void lance_init_ring_dvma(struct net_device *dev) { struct lance_private *lp = (struct lance_private *) dev->priv; volatile struct lance_init_block *ib = lp->init_block; - __u32 aib = lp->init_block_dvma; + dma_addr_t aib = lp->init_block_dvma; __u32 leptr; int i; diff --git a/include/asm-i386/tlb.h b/include/asm-i386/tlb.h index 844c3d4c9aaa..b91e6abd1fd4 100644 --- a/include/asm-i386/tlb.h +++ b/include/asm-i386/tlb.h @@ -5,8 +5,8 @@ * x86 doesn't need any special per-pte or * per-vma handling.. */ -#define tlb_start_vma(tlb, vma) do { } while (0) -#define tlb_end_vma(tlb, vma) do { } while (0) +#define tlb_start_vma(tlb, vma, start, end) do { } while (0) +#define tlb_end_vma(tlb, vma, start, end) do { } while (0) #define tlb_remove_tlb_entry(tlb, pte, address) do { } while (0) /* diff --git a/include/asm-sparc/pgalloc.h b/include/asm-sparc/pgalloc.h index f55ef69a3d88..0a620fbbeb69 100644 --- a/include/asm-sparc/pgalloc.h +++ b/include/asm-sparc/pgalloc.h @@ -117,7 +117,6 @@ BTFIXUPDEF_CALL(void, free_pgd_fast, pgd_t *) static __inline__ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) { - BUG(); return 0; } diff --git a/include/asm-sparc/sbus.h b/include/asm-sparc/sbus.h index d26fd0326a03..6a95593c2d52 100644 --- a/include/asm-sparc/sbus.h +++ b/include/asm-sparc/sbus.h @@ -112,13 +112,13 @@ extern void sbus_free_consistent(struct sbus_dev *, long, void *, u32); #define SBUS_DMA_NONE 3 /* All the rest use streaming mode mappings. */ -extern u32 sbus_map_single(struct sbus_dev *, void *, long, int); -extern void sbus_unmap_single(struct sbus_dev *, u32, long, int); +extern dma_addr_t sbus_map_single(struct sbus_dev *, void *, size_t, int); +extern void sbus_unmap_single(struct sbus_dev *, dma_addr_t, size_t, int); extern int sbus_map_sg(struct sbus_dev *, struct scatterlist *, int, int); extern void sbus_unmap_sg(struct sbus_dev *, struct scatterlist *, int, int); /* Finally, allow explicit synchronization of streamable mappings. */ -extern void sbus_dma_sync_single(struct sbus_dev *, u32, long, int); +extern void sbus_dma_sync_single(struct sbus_dev *, dma_addr_t, size_t, int); extern void sbus_dma_sync_sg(struct sbus_dev *, struct scatterlist *, int, int); #endif /* !(_SPARC_SBUS_H) */ diff --git a/include/asm-sparc64/tlb.h b/include/asm-sparc64/tlb.h index 69c0faa93194..f0e011119b40 100644 --- a/include/asm-sparc64/tlb.h +++ b/include/asm-sparc64/tlb.h @@ -1 +1,18 @@ +#ifndef _SPARC64_TLB_H +#define _SPARC64_TLB_H + +#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) + +#define tlb_start_vma(tlb, vma, start, end) \ + flush_cache_range(vma, start, end) +#define tlb_end_vma(tlb, vma, start, end) \ + flush_tlb_range(vma, start, end) + +#define tlb_remove_tlb_entry(tlb, pte, address) do { } while (0) + #include <asm-generic/tlb.h> + +#define pmd_free_tlb(tlb, pmd) pmd_free(pmd) +#define pte_free_tlb(tlb, pte) pte_free(pte) + +#endif /* _SPARC64_TLB_H */ diff --git a/include/asm-sparc64/tlbflush.h b/include/asm-sparc64/tlbflush.h index 4b0241d94e40..e618167d79f3 100644 --- a/include/asm-sparc64/tlbflush.h +++ b/include/asm-sparc64/tlbflush.h @@ -36,6 +36,16 @@ do { if(CTX_VALID((__vma)->vm_mm->context)) { \ } \ } while(0) +#define flush_tlb_vpte_range(__mm, start, end) \ +do { if(CTX_VALID((__mm)->context)) { \ + unsigned long __start = (start)&PAGE_MASK; \ + unsigned long __end = PAGE_ALIGN(end); \ + __flush_tlb_range(CTX_HWBITS((__mm)->context), __start, \ + SECONDARY_CONTEXT, __end, PAGE_SIZE, \ + (__end - __start)); \ + } \ +} while(0) + #define flush_tlb_page(vma, page) \ do { struct mm_struct *__mm = (vma)->vm_mm; \ if(CTX_VALID(__mm->context)) \ @@ -43,11 +53,18 @@ do { struct mm_struct *__mm = (vma)->vm_mm; \ SECONDARY_CONTEXT); \ } while(0) +#define flush_tlb_vpte_page(mm, addr) \ +do { struct mm_struct *__mm = (mm); \ + if(CTX_VALID(__mm->context)) \ + __flush_tlb_page(CTX_HWBITS(__mm->context), (addr)&PAGE_MASK, \ + SECONDARY_CONTEXT); \ +} while(0) + #else /* CONFIG_SMP */ extern void smp_flush_tlb_all(void); extern void smp_flush_tlb_mm(struct mm_struct *mm); -extern void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, +extern void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end); extern void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page); @@ -56,11 +73,15 @@ extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page); #define flush_tlb_all() smp_flush_tlb_all() #define flush_tlb_mm(mm) smp_flush_tlb_mm(mm) #define flush_tlb_range(vma, start, end) \ - smp_flush_tlb_range(vma, start, end) + smp_flush_tlb_range((vma)->vm_mm, start, end) +#define flush_tlb_vpte_range(mm, start, end) \ + smp_flush_tlb_range(mm, start, end) #define flush_tlb_kernel_range(start, end) \ smp_flush_tlb_kernel_range(start, end) #define flush_tlb_page(vma, page) \ smp_flush_tlb_page((vma)->vm_mm, page) +#define flush_tlb_vpte_page(mm, page) \ + smp_flush_tlb_page((mm), page) #endif /* ! CONFIG_SMP */ @@ -81,13 +102,10 @@ static __inline__ void flush_tlb_pgtables(struct mm_struct *mm, unsigned long st vpte_base = (tlb_type == spitfire ? VPTE_BASE_SPITFIRE : VPTE_BASE_CHEETAH); - { - struct vm_area_struct vma; - vma.vm_mm = mm; - flush_tlb_range(&vma, - vpte_base + (s >> (PAGE_SHIFT - 3)), - vpte_base + (e >> (PAGE_SHIFT - 3))); - } + + flush_tlb_vpte_range(mm, + vpte_base + (s >> (PAGE_SHIFT - 3)), + vpte_base + (e >> (PAGE_SHIFT - 3))); } #endif /* _SPARC64_TLBFLUSH_H */ diff --git a/mm/memory.c b/mm/memory.c index 280c4964bbc9..0b15a0042600 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -387,18 +387,19 @@ static void zap_pmd_range(mmu_gather_t *tlb, pgd_t * dir, unsigned long address, void unmap_page_range(mmu_gather_t *tlb, struct vm_area_struct *vma, unsigned long address, unsigned long end) { + unsigned long start = address; pgd_t * dir; if (address >= end) BUG(); dir = pgd_offset(vma->vm_mm, address); - tlb_start_vma(tlb, vma); + tlb_start_vma(tlb, vma, start, end); do { zap_pmd_range(tlb, dir, address, end - address); address = (address + PGDIR_SIZE) & PGDIR_MASK; dir++; } while (address && (address < end)); - tlb_end_vma(tlb, vma); + tlb_end_vma(tlb, vma, start, end); } /* |
