diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-02-23 00:40:54 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-02-23 00:40:54 +0000 |
commit | 529c593ece216e4aaffd36bd940cb94f1fa63129 (patch) | |
tree | 78f1c0b805f5656aa7b0417a043c5346f700a2cf /arch/sparc/mm | |
parent | 0bd079751d25808d1972baee5c4eaa1db2227257 (diff) |
Merge with 2.3.43. I did ignore all modifications to the qlogicisp.c
driver due to the Origin A64 hacks.
Diffstat (limited to 'arch/sparc/mm')
-rw-r--r-- | arch/sparc/mm/init.c | 7 | ||||
-rw-r--r-- | arch/sparc/mm/io-unit.c | 17 | ||||
-rw-r--r-- | arch/sparc/mm/iommu.c | 29 | ||||
-rw-r--r-- | arch/sparc/mm/loadmmu.c | 5 | ||||
-rw-r--r-- | arch/sparc/mm/srmmu.c | 4 | ||||
-rw-r--r-- | arch/sparc/mm/sun4c.c | 20 |
6 files changed, 64 insertions, 18 deletions
diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c index 9e9a225a5..6736dc9d3 100644 --- a/arch/sparc/mm/init.c +++ b/arch/sparc/mm/init.c @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.79 2000/01/29 01:09:06 anton Exp $ +/* $Id: init.c,v 1.80 2000/02/09 21:11:06 davem Exp $ * linux/arch/sparc/mm/init.c * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -33,8 +33,6 @@ #include <asm/pgtable.h> #include <asm/vaddrs.h> -extern void show_net_buffers(void); - unsigned long *sparc_valid_addr_bitmap; unsigned long phys_base; @@ -89,9 +87,6 @@ void show_mem(void) printk("%ld entries in page dir cache\n",pgd_cache_size); #endif show_buffers(); -#ifdef CONFIG_NET - show_net_buffers(); -#endif } extern pgprot_t protection_map[16]; diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c index 90b4aee69..a370ea2d4 100644 --- a/arch/sparc/mm/io-unit.c +++ b/arch/sparc/mm/io-unit.c @@ -1,4 +1,4 @@ -/* $Id: io-unit.c,v 1.20 2000/01/15 00:51:27 anton Exp $ +/* $Id: io-unit.c,v 1.21 2000/02/06 22:55:45 zaitcev Exp $ * io-unit.c: IO-UNIT specific routines for memory management. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -210,6 +210,20 @@ static void iounit_map_dma_area(unsigned long va, __u32 addr, int len) static void iounit_unmap_dma_area(unsigned long addr, int len) { + /* XXX Somebody please fill this in */ +} + +/* XXX We do not pass sbus device here, bad. */ +static unsigned long iounit_translate_dvma(unsigned long addr) +{ + struct sbus_bus *sbus = sbus_root; /* They are all the same */ + struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu; + int i; + iopte_t *iopte; + + i = ((addr - IOUNIT_DMA_BASE) >> PAGE_SHIFT); + iopte = (iopte_t *)(iounit->page_table + i); + return (iopte_val(*iopte) & 0xFFFFFFF0) << 4; /* XXX sun4d guru, help */ } #endif @@ -237,6 +251,7 @@ void __init ld_mmu_iounit(void) #ifdef CONFIG_SBUS BTFIXUPSET_CALL(mmu_map_dma_area, iounit_map_dma_area, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(mmu_unmap_dma_area, iounit_unmap_dma_area, BTFIXUPCALL_NORM); + BTFIXUPSET_CALL(mmu_translate_dvma, iounit_translate_dvma, BTFIXUPCALL_NORM); #endif } diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c index 5a8cc8c5b..5fde9a52a 100644 --- a/arch/sparc/mm/iommu.c +++ b/arch/sparc/mm/iommu.c @@ -1,4 +1,4 @@ -/* $Id: iommu.c,v 1.18 2000/01/15 00:51:27 anton Exp $ +/* $Id: iommu.c,v 1.19 2000/02/06 22:55:45 zaitcev Exp $ * iommu.c: IOMMU specific routines for memory management. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -289,8 +289,32 @@ static void iommu_map_dma_area(unsigned long va, __u32 addr, int len) iommu_invalidate(iommu->regs); } -static void iommu_unmap_dma_area(unsigned long addr, int len) +static void iommu_unmap_dma_area(unsigned long busa, int len) { + struct iommu_struct *iommu = sbus_root->iommu; + iopte_t *iopte = iommu->page_table; + unsigned long end; + + iopte += ((busa - iommu->start) >> PAGE_SHIFT); + end = PAGE_ALIGN((busa + len)); + while (busa < end) { + iopte_val(*iopte++) = 0; + busa += PAGE_SIZE; + } + flush_tlb_all(); /* P3: Hmm... it would not hurt. */ + iommu_invalidate(iommu->regs); +} + +static unsigned long iommu_translate_dvma(unsigned long busa) +{ + struct iommu_struct *iommu = sbus_root->iommu; + iopte_t *iopte = iommu->page_table; + unsigned long pa; + + iopte += ((busa - iommu->start) >> PAGE_SHIFT); + pa = pte_val(*iopte); + pa = (pa & 0xFFFFFFF0) << 4; /* Loose higher bits of 36 */ + return pa + PAGE_OFFSET; } #endif @@ -327,5 +351,6 @@ void __init ld_mmu_iommu(void) #ifdef CONFIG_SBUS BTFIXUPSET_CALL(mmu_map_dma_area, iommu_map_dma_area, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(mmu_unmap_dma_area, iommu_unmap_dma_area, BTFIXUPCALL_NORM); + BTFIXUPSET_CALL(mmu_translate_dvma, iommu_translate_dvma, BTFIXUPCALL_NORM); #endif } diff --git a/arch/sparc/mm/loadmmu.c b/arch/sparc/mm/loadmmu.c index ce0885679..e388c31f5 100644 --- a/arch/sparc/mm/loadmmu.c +++ b/arch/sparc/mm/loadmmu.c @@ -1,4 +1,4 @@ -/* $Id: loadmmu.c,v 1.54 2000/01/29 01:09:07 anton Exp $ +/* $Id: loadmmu.c,v 1.56 2000/02/08 20:24:21 davem Exp $ * loadmmu.c: This code loads up all the mm function pointers once the * machine type has been determined. It also sets the static * mmu values such as PAGE_NONE, etc. @@ -10,7 +10,6 @@ #include <linux/kernel.h> #include <linux/mm.h> #include <linux/init.h> -#include <linux/config.h> #include <asm/system.h> #include <asm/page.h> @@ -27,6 +26,7 @@ unsigned int pg_iobits; extern void ld_mmu_sun4c(void); extern void ld_mmu_srmmu(void); +extern void ioport_init(void); void __init load_mmu(void) { @@ -44,4 +44,5 @@ void __init load_mmu(void) prom_halt(); } btfixup(); + ioport_init(); } diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 10990f3ea..d46b45378 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -1,4 +1,4 @@ -/* $Id: srmmu.c,v 1.205 2000/01/21 17:59:46 anton Exp $ +/* $Id: srmmu.c,v 1.206 2000/02/08 07:45:59 davem Exp $ * srmmu.c: SRMMU specific routines for memory management. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -1304,7 +1304,7 @@ void __init srmmu_paging_init(void) sparc_context_init(num_contexts); { - unsigned int zones_size[MAX_NR_ZONES] = { 0, 0, 0}; + unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0}; zones_size[ZONE_DMA] = end_pfn; free_area_init(zones_size); diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c index e0bd738d6..715bdb864 100644 --- a/arch/sparc/mm/sun4c.c +++ b/arch/sparc/mm/sun4c.c @@ -1,4 +1,4 @@ -/* $Id: sun4c.c,v 1.185 2000/01/15 00:51:32 anton Exp $ +/* $Id: sun4c.c,v 1.187 2000/02/08 07:46:01 davem Exp $ * sun4c.c: Doing in software what should be done in hardware. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -584,15 +584,24 @@ static void sun4c_map_dma_area(unsigned long va, u32 addr, int len) } } -static void sun4c_unmap_dma_area(unsigned long addr, int len) +static unsigned long sun4c_translate_dvma(unsigned long busa) { + /* Fortunately for us, bus_addr == uncached_virt in sun4c. */ + unsigned long pte = sun4c_get_pte(busa); + return (pte << PAGE_SHIFT) + PAGE_OFFSET; } -static void sun4c_inval_dma_area(unsigned long addr, int len) +static unsigned long sun4c_unmap_dma_area(unsigned long busa, int len) { + /* Fortunately for us, bus_addr == uncached_virt in sun4c. */ + /* XXX Implement this */ } -static void sun4c_flush_dma_area(unsigned long addr, int len) +static void sun4c_inval_dma_area(unsigned long virt, int len) +{ +} + +static void sun4c_flush_dma_area(unsigned long virt, int len) { } @@ -2574,7 +2583,7 @@ void __init sun4c_paging_init(void) sparc_context_init(num_contexts); { - unsigned int zones_size[MAX_NR_ZONES] = { 0, 0, 0}; + unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0}; zones_size[ZONE_DMA] = end_pfn; free_area_init(zones_size); @@ -2721,6 +2730,7 @@ void __init ld_mmu_sun4c(void) BTFIXUPSET_CALL(mmu_map_dma_area, sun4c_map_dma_area, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(mmu_unmap_dma_area, sun4c_unmap_dma_area, BTFIXUPCALL_NORM); + BTFIXUPSET_CALL(mmu_translate_dvma, sun4c_translate_dvma, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(mmu_flush_dma_area, sun4c_flush_dma_area, BTFIXUPCALL_NOP); BTFIXUPSET_CALL(mmu_inval_dma_area, sun4c_inval_dma_area, BTFIXUPCALL_NORM); |