Messages in this thread Patch in this message | | | From | Al Viro <> | Subject | [POC][PATCH 80/83] [sun3] try to sort dvma types out | Date | Mon, 21 Dec 2015 23:47:53 +0000 |
| |
From: Al Viro <viro@zeniv.linux.org.uk>
[I've pretty much zero confidence in that one - if anything, it would need to be split]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> --- arch/m68k/include/asm/dvma.h | 21 +++++-------- arch/m68k/sun3/dvma.c | 31 ++++++++----------- arch/m68k/sun3/sun3dvma.c | 52 ++++++++++++++------------------ arch/m68k/sun3x/dvma.c | 15 +++------ drivers/net/ethernet/i825xx/sun3_82586.c | 13 ++++---- drivers/scsi/sun3_scsi.c | 23 ++++++-------- 6 files changed, 64 insertions(+), 91 deletions(-)
diff --git a/arch/m68k/include/asm/dvma.h b/arch/m68k/include/asm/dvma.h index 890bbf7..1fa85e5 100644 --- a/arch/m68k/include/asm/dvma.h +++ b/arch/m68k/include/asm/dvma.h @@ -16,18 +16,16 @@ #define DVMA_PAGE_ALIGN(addr) ALIGN(addr, DVMA_PAGE_SIZE) extern void dvma_init(void); -extern int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, - int len); +extern int dvma_map_iommu(void *kaddr, unsigned long baddr, int len); #define dvma_malloc(x) dvma_malloc_align(x, 0) #define dvma_map(x, y) dvma_map_align(x, y, 0) #define dvma_map_vme(x, y) (dvma_map(x, y) & 0xfffff) #define dvma_map_align_vme(x, y, z) (dvma_map_align (x, y, z) & 0xfffff) -extern unsigned long dvma_map_align(unsigned long kaddr, int len, - int align); +extern unsigned long dvma_map_align(void *kaddr, int len, int align); extern void *dvma_malloc_align(unsigned long len, unsigned long align); -extern void dvma_unmap(void *baddr); +extern void dvma_unmap(unsigned long); extern void dvma_free(void *vaddr); @@ -51,14 +49,13 @@ extern void dvma_free(void *vaddr); /* virt <-> phys conversions */ #define dvma_vtop(x) ((unsigned long)(x) & 0xffffff) -#define dvma_ptov(x) ((unsigned long)(x) | 0xf000000) +#define dvma_ptov(x) ((void *)((unsigned long)(x) | 0xf000000)) #define dvma_vtovme(x) ((unsigned long)(x) & 0x00fffff) -#define dvma_vmetov(x) ((unsigned long)(x) | 0xff00000) +#define dvma_vmetov(x) ((void*)((unsigned long)(x) | 0xff00000)) #define dvma_vtob(x) dvma_vtop(x) #define dvma_btov(x) dvma_ptov(x) -static inline int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr, - int len) +static inline int dvma_map_cpu(void *kaddr, void *vaddr, int len) { return 0; } @@ -75,11 +72,9 @@ static inline int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr, #define IOMMU_ENTRIES (IOMMU_TOTAL_ENTRIES - 0x80) #define dvma_vtob(x) ((unsigned long)(x) & 0x00ffffff) -#define dvma_btov(x) ((unsigned long)(x) | 0xff000000) - -extern int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr, int len); - +#define dvma_btov(x) ((void *)((unsigned long)(x) | 0xff000000)) +extern int dvma_map_cpu(void *kaddr, void *vaddr, int len); /* everything below this line is specific to dma used for the onboard ESP scsi on sun3x */ diff --git a/arch/m68k/sun3/dvma.c b/arch/m68k/sun3/dvma.c index d95506e..0b0d352 100644 --- a/arch/m68k/sun3/dvma.c +++ b/arch/m68k/sun3/dvma.c @@ -20,47 +20,42 @@ static unsigned long ptelist[120]; -static unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr) +static void *dvma_page(void *kaddr, void *vaddr) { unsigned long pte; unsigned long j; pte_t ptep; + int idx; j = *(volatile unsigned long *)kaddr; *(volatile unsigned long *)kaddr = j; ptep = pfn_pte(virt_to_pfn(kaddr), PAGE_KERNEL); pte = pte_val(ptep); -// printk("dvma_remap: addr %lx -> %lx pte %08lx len %x\n", +// printk("dvma_remap: addr %p -> %lx pte %08lx len %x\n", // kaddr, vaddr, pte, len); - if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) { - sun3_put_pte(vaddr, pte); - ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte; - } + idx = ((unsigned long)vaddr & 0xff000) >> PAGE_SHIFT; - return (vaddr + (kaddr & ~PAGE_MASK)); + if (ptelist[idx] != pte) { + sun3_put_pte((unsigned long)vaddr, pte); + ptelist[idx] = pte; + } + return vaddr + offset_in_page(kaddr); } -int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, - int len) +int dvma_map_iommu(void *kaddr, unsigned long baddr, int len) { + void *vaddr = dvma_btov(baddr); + void *end = vaddr + len; - unsigned long end; - unsigned long vaddr; - - vaddr = dvma_btov(baddr); - - end = vaddr + len; - - while(vaddr < end) { + while (vaddr < end) { dvma_page(kaddr, vaddr); kaddr += PAGE_SIZE; vaddr += PAGE_SIZE; } return 0; - } void __init sun3_dvma_init(void) diff --git a/arch/m68k/sun3/sun3dvma.c b/arch/m68k/sun3/sun3dvma.c index fdc4900..68eefa4 100644 --- a/arch/m68k/sun3/sun3dvma.c +++ b/arch/m68k/sun3/sun3dvma.c @@ -277,7 +277,7 @@ void __init dvma_init(void) } -unsigned long dvma_map_align(unsigned long kaddr, int len, int align) +unsigned long dvma_map_align(void *kaddr, int len, int align) { unsigned long baddr; @@ -287,58 +287,52 @@ unsigned long dvma_map_align(unsigned long kaddr, int len, int align) len = 0x800; if(!kaddr || !len) { -// printk("error: kaddr %lx len %x\n", kaddr, len); +// printk("error: kaddr %p len %x\n", kaddr, len); // *(int *)4 = 0; return 0; } #ifdef DEBUG - printk("dvma_map request %08lx bytes from %08lx\n", + printk("dvma_map request %08lx bytes from %p\n", len, kaddr); #endif - off = kaddr & ~DVMA_PAGE_MASK; - kaddr &= PAGE_MASK; + off = (unsigned long)kaddr % DVMA_PAGE_SIZE; + kaddr -= off; len += off; - len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); + len = ALIGN(len, DVMA_PAGE_SIZE); if(align == 0) align = DVMA_PAGE_SIZE; else - align = ((align + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); + align = ALIGN(align, DVMA_PAGE_SIZE); baddr = get_baddr(len, align); // printk("using baddr %lx\n", baddr); - if(!dvma_map_iommu(kaddr, baddr, len)) + if (!dvma_map_iommu(kaddr, baddr, len)) return (baddr + off); - printk("dvma_map failed kaddr %lx baddr %lx len %x\n", kaddr, baddr, len); + printk("dvma_map failed kaddr %p baddr %lx len %x\n", kaddr, baddr, len); BUG(); return 0; } EXPORT_SYMBOL(dvma_map_align); -void dvma_unmap(void *baddr) +void dvma_unmap(unsigned long baddr) { - unsigned long addr; - - addr = (unsigned long)baddr; /* check if this is a vme mapping */ - if(!(addr & 0x00f00000)) - addr |= 0xf00000; - - free_baddr(addr); - - return; + if (!(baddr & 0x00f00000)) + baddr |= 0xf00000; + free_baddr(baddr); } EXPORT_SYMBOL(dvma_unmap); void *dvma_malloc_align(unsigned long len, unsigned long align) { - unsigned long kaddr; + void *kaddr; unsigned long baddr; - unsigned long vaddr; + void *vaddr; if(!len) return NULL; @@ -348,28 +342,28 @@ void *dvma_malloc_align(unsigned long len, unsigned long align) #endif len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK); - if((kaddr = __get_free_pages(GFP_ATOMIC, get_order(len))) == 0) + if((kaddr = get_free_pages(GFP_ATOMIC, get_order(len))) == NULL) return NULL; - if((baddr = (unsigned long)dvma_map_align(kaddr, len, align)) == 0) { - free_pages((void *)kaddr, get_order(len)); + if((baddr = dvma_map_align(kaddr, len, align)) == 0) { + free_pages(kaddr, get_order(len)); return NULL; } vaddr = dvma_btov(baddr); - if(dvma_map_cpu(kaddr, vaddr, len) < 0) { - dvma_unmap((void *)baddr); - free_pages((void *)kaddr, get_order(len)); + if (dvma_map_cpu(kaddr, vaddr, len) < 0) { + dvma_unmap(baddr); + free_pages(kaddr, get_order(len)); return NULL; } #ifdef DEBUG - printk("mapped %08lx bytes %08lx kern -> %08lx bus\n", + printk("mapped %08lx bytes %p kern -> %08lx bus\n", len, kaddr, baddr); #endif - return (void *)vaddr; + return vaddr; } EXPORT_SYMBOL(dvma_malloc_align); diff --git a/arch/m68k/sun3x/dvma.c b/arch/m68k/sun3x/dvma.c index d5ddcda..a85faa5 100644 --- a/arch/m68k/sun3x/dvma.c +++ b/arch/m68k/sun3x/dvma.c @@ -79,18 +79,14 @@ void dvma_print (unsigned long dvma_addr) /* create a virtual mapping for a page assigned within the IOMMU so that the cpu can reach it easily */ -inline int dvma_map_cpu(unsigned long kaddr, - unsigned long vaddr, int len) +int dvma_map_cpu(void *k, void *v, int len) { pgd_t *pgd; - unsigned long end; + unsigned long kaddr = (unsigned long)k & PAGE_MASK; + unsigned long vaddr = (unsigned long)v & PAGE_MASK; + unsigned long end = PAGE_ALIGN(vaddr + len); int ret = 0; - kaddr &= PAGE_MASK; - vaddr &= PAGE_MASK; - - end = PAGE_ALIGN(vaddr + len); - #ifdef DEBUG printk("dvma: mapping kern %08lx to virt %08lx\n", kaddr, vaddr); @@ -148,8 +144,7 @@ inline int dvma_map_cpu(unsigned long kaddr, } -inline int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, - int len) +int dvma_map_iommu(void *kaddr, unsigned long baddr, int len) { unsigned long end, index; diff --git a/drivers/net/ethernet/i825xx/sun3_82586.c b/drivers/net/ethernet/i825xx/sun3_82586.c index 353f57f6..a9a279f 100644 --- a/drivers/net/ethernet/i825xx/sun3_82586.c +++ b/drivers/net/ethernet/i825xx/sun3_82586.c @@ -131,7 +131,7 @@ static void sun3_82586_dump(struct net_device *,void *); /* helper-functions */ static int init586(struct net_device *dev); -static int check586(struct net_device *dev,char *where,unsigned size); +static int check586(struct net_device *dev,unsigned long where,unsigned size); static void alloc586(struct net_device *dev); static void startrecv586(struct net_device *dev); static void *alloc_rfa(struct net_device *dev,void *ptr); @@ -203,7 +203,7 @@ static int sun3_82586_open(struct net_device *dev) /********************************************** * Check to see if there's an 82586 out there. */ -static int check586(struct net_device *dev,char *where,unsigned size) +static int check586(struct net_device *dev,unsigned long where,unsigned size) { struct priv pb; struct priv *p = &pb; @@ -211,7 +211,7 @@ static int check586(struct net_device *dev,char *where,unsigned size) int i; p->base = (unsigned long) dvma_btov(0); - p->memtop = (char *)dvma_btov((unsigned long)where); + p->memtop = dvma_btov(where); p->scp = (struct scp_struct *)(p->base + SCP_DEFAULT_ADDRESS); memset((char *)p->scp,0, sizeof(struct scp_struct)); for(i=0;i<sizeof(struct scp_struct);i++) /* memory was writeable? */ @@ -221,7 +221,7 @@ static int check586(struct net_device *dev,char *where,unsigned size) if(p->scp->sysbus != SYSBUSVAL) return 0; - iscp_addr = (char *)dvma_btov((unsigned long)where); + iscp_addr = dvma_btov(where); p->iscp = (struct iscp_struct *) iscp_addr; memset((char *)p->iscp,0, sizeof(struct iscp_struct)); @@ -366,14 +366,13 @@ static int __init sun3_82586_probe1(struct net_device *dev,int ioaddr) retval = -ENODEV; goto out; } - if(!check586(dev,(char *) dev->mem_start,size)) { + if(!check586(dev, dev->mem_start,size)) { printk("?memcheck, Can't find memory at 0x%lx with size %d!\n",dev->mem_start,size); retval = -ENODEV; goto out; } - ((struct priv *)netdev_priv(dev))->memtop = - (char *)dvma_btov(dev->mem_start); + ((struct priv *)netdev_priv(dev))->memtop = dvma_btov(dev->mem_start); ((struct priv *)netdev_priv(dev))->base = (unsigned long) dvma_btov(0); alloc586(dev); diff --git a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c index 22a4283..5cfc634 100644 --- a/drivers/scsi/sun3_scsi.c +++ b/drivers/scsi/sun3_scsi.c @@ -100,7 +100,7 @@ static struct scsi_cmnd *sun3_dma_setup_done; static unsigned char *sun3_scsi_regp; static volatile struct sun3_dma_regs *dregs; static struct sun3_udc_regs *udc_regs; -static unsigned char *sun3_dma_orig_addr = NULL; +static unsigned long sun3_dma_orig_addr; static unsigned long sun3_dma_orig_count = 0; static int sun3_dma_active = 0; static unsigned long last_residual = 0; @@ -237,15 +237,15 @@ void sun3_sun3_debug (void) /* sun3scsi_dma_setup() -- initialize the dma controller for a read/write */ static unsigned long sun3scsi_dma_setup(void *data, unsigned long count, int write_flag) { - void *addr; + unsigned long addr; - if(sun3_dma_orig_addr != NULL) + if (sun3_dma_orig_addr) dvma_unmap(sun3_dma_orig_addr); #ifdef SUN3_SCSI_VME - addr = (void *)dvma_map_vme((unsigned long) data, count); + addr = dvma_map_vme(data, count); #else - addr = (void *)dvma_map((unsigned long) data, count); + addr = dvma_map(data, count); #endif sun3_dma_orig_addr = addr; @@ -399,9 +399,7 @@ static int sun3scsi_dma_finish(int write_flag) last_residual = fifo; /* empty bytes from the fifo which didn't make it */ if ((!write_flag) && (dregs->csr & CSR_LEFT)) { - unsigned char *vaddr; - - vaddr = (unsigned char *)dvma_vmetov(sun3_dma_orig_addr); + unsigned char *vaddr = dvma_vmetov(sun3_dma_orig_addr); vaddr += (sun3_dma_orig_count - fifo); vaddr--; @@ -444,11 +442,8 @@ static int sun3scsi_dma_finish(int write_flag) /* empty bytes from the fifo which didn't make it */ if((!write_flag) && (count - fifo) == 2) { - unsigned short data; - unsigned char *vaddr; - - data = dregs->fifo_data; - vaddr = (unsigned char *)dvma_btov(sun3_dma_orig_addr); + unsigned short data = dregs->fifo_data; + unsigned char *vaddr = dvma_btov(sun3_dma_orig_addr); vaddr += (sun3_dma_orig_count - fifo); @@ -458,7 +453,7 @@ static int sun3scsi_dma_finish(int write_flag) #endif dvma_unmap(sun3_dma_orig_addr); - sun3_dma_orig_addr = NULL; + sun3_dma_orig_addr = 0; #ifdef SUN3_SCSI_VME dregs->dma_addr_hi = 0; -- 2.1.4
| |