OpenCloudOS-Kernel/arch/mips/jazz/io.c

136 lines
3.1 KiB
C

/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Low level I/O functions for Jazz family machines.
*
* Copyright (C) 1997 by Ralf Baechle.
*/
#include <linux/string.h>
#include <linux/spinlock.h>
#include <asm/addrspace.h>
#include <asm/system.h>
#include <asm/jazz.h>
/*
* Map an 16mb segment of the EISA address space to 0xe3000000;
*/
static inline void map_eisa_address(unsigned long address)
{
/* XXX */
/* We've got an wired entry in the TLB. We just need to modify it.
fast and clean. But since we want to get rid of wired entries
things are a little bit more complicated ... */
}
static unsigned char jazz_readb(unsigned long addr)
{
unsigned char res;
map_eisa_address(addr);
addr &= 0xffffff;
res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);
return res;
}
static unsigned short jazz_readw(unsigned long addr)
{
unsigned short res;
map_eisa_address(addr);
addr &= 0xffffff;
res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);
return res;
}
static unsigned int jazz_readl(unsigned long addr)
{
unsigned int res;
map_eisa_address(addr);
addr &= 0xffffff;
res = *(volatile unsigned char *) (JAZZ_EISA_BASE + addr);
return res;
}
static void jazz_writeb(unsigned char val, unsigned long addr)
{
map_eisa_address(addr);
addr &= 0xffffff;
*(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;
}
static void jazz_writew(unsigned short val, unsigned long addr)
{
map_eisa_address(addr);
addr &= 0xffffff;
*(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;
}
static void jazz_writel(unsigned int val, unsigned long addr)
{
map_eisa_address(addr);
addr &= 0xffffff;
*(volatile unsigned char *) (JAZZ_EISA_BASE + addr) = val;
}
static void jazz_memset_io(unsigned long addr, int val, unsigned long len)
{
unsigned long waddr;
waddr = JAZZ_EISA_BASE | (addr & 0xffffff);
while(len) {
unsigned long fraglen;
fraglen = (~addr + 1) & 0xffffff;
fraglen = (fraglen < len) ? fraglen : len;
map_eisa_address(addr);
memset((char *)waddr, val, fraglen);
addr += fraglen;
waddr = waddr + fraglen - 0x1000000;
len -= fraglen;
}
}
static void jazz_memcpy_fromio(unsigned long to, unsigned long from, unsigned long len)
{
unsigned long waddr;
waddr = JAZZ_EISA_BASE | (from & 0xffffff);
while(len) {
unsigned long fraglen;
fraglen = (~from + 1) & 0xffffff;
fraglen = (fraglen < len) ? fraglen : len;
map_eisa_address(from);
memcpy((void *)to, (void *)waddr, fraglen);
to += fraglen;
from += fraglen;
waddr = waddr + fraglen - 0x1000000;
len -= fraglen;
}
}
static void jazz_memcpy_toio(unsigned long to, unsigned long from, unsigned long len)
{
unsigned long waddr;
waddr = JAZZ_EISA_BASE | (to & 0xffffff);
while(len) {
unsigned long fraglen;
fraglen = (~to + 1) & 0xffffff;
fraglen = (fraglen < len) ? fraglen : len;
map_eisa_address(to);
memcpy((char *)to + JAZZ_EISA_BASE, (void *)from, fraglen);
to += fraglen;
from += fraglen;
waddr = waddr + fraglen - 0x1000000;
len -= fraglen;
}
}