275 lines
6.9 KiB
C
275 lines
6.9 KiB
C
/*
|
|
NinjaSCSI I/O funtions
|
|
By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
|
|
|
|
This software may be used and distributed according to the terms of
|
|
the GNU General Public License.
|
|
|
|
*/
|
|
|
|
/* $Id: nsp_io.h,v 1.3 2003/08/04 21:15:26 elca Exp $ */
|
|
|
|
#ifndef __NSP_IO_H__
|
|
#define __NSP_IO_H__
|
|
|
|
static inline void nsp_write(unsigned int base,
|
|
unsigned int index,
|
|
unsigned char val);
|
|
static inline unsigned char nsp_read(unsigned int base,
|
|
unsigned int index);
|
|
static inline void nsp_index_write(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
unsigned char Value);
|
|
static inline unsigned char nsp_index_read(unsigned int BaseAddr,
|
|
unsigned int Register);
|
|
|
|
/*******************************************************************
|
|
* Basic IO
|
|
*/
|
|
|
|
static inline void nsp_write(unsigned int base,
|
|
unsigned int index,
|
|
unsigned char val)
|
|
{
|
|
outb(val, (base + index));
|
|
}
|
|
|
|
static inline unsigned char nsp_read(unsigned int base,
|
|
unsigned int index)
|
|
{
|
|
return inb(base + index);
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
* Indexed IO
|
|
*/
|
|
static inline unsigned char nsp_index_read(unsigned int BaseAddr,
|
|
unsigned int Register)
|
|
{
|
|
outb(Register, BaseAddr + INDEXREG);
|
|
return inb(BaseAddr + DATAREG);
|
|
}
|
|
|
|
static inline void nsp_index_write(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
unsigned char Value)
|
|
{
|
|
outb(Register, BaseAddr + INDEXREG);
|
|
outb(Value, BaseAddr + DATAREG);
|
|
}
|
|
|
|
/*********************************************************************
|
|
* fifo func
|
|
*/
|
|
|
|
/* read 8 bit FIFO */
|
|
static inline void nsp_multi_read_1(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
insb(BaseAddr + Register, buf, count);
|
|
}
|
|
|
|
static inline void nsp_fifo8_read(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
/*nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx", buf, count);*/
|
|
nsp_multi_read_1(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
/*--------------------------------------------------------------*/
|
|
|
|
/* read 16 bit FIFO */
|
|
static inline void nsp_multi_read_2(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
insw(BaseAddr + Register, buf, count);
|
|
}
|
|
|
|
static inline void nsp_fifo16_read(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*2", buf, count);
|
|
nsp_multi_read_2(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
/*--------------------------------------------------------------*/
|
|
|
|
/* read 32bit FIFO */
|
|
static inline void nsp_multi_read_4(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
insl(BaseAddr + Register, buf, count);
|
|
}
|
|
|
|
static inline void nsp_fifo32_read(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
|
|
nsp_multi_read_4(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
/*----------------------------------------------------------*/
|
|
|
|
/* write 8bit FIFO */
|
|
static inline void nsp_multi_write_1(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
outsb(BaseAddr + Register, buf, count);
|
|
}
|
|
|
|
static inline void nsp_fifo8_write(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
nsp_multi_write_1(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
/*---------------------------------------------------------*/
|
|
|
|
/* write 16bit FIFO */
|
|
static inline void nsp_multi_write_2(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
outsw(BaseAddr + Register, buf, count);
|
|
}
|
|
|
|
static inline void nsp_fifo16_write(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
nsp_multi_write_2(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
/*---------------------------------------------------------*/
|
|
|
|
/* write 32bit FIFO */
|
|
static inline void nsp_multi_write_4(unsigned int BaseAddr,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
outsl(BaseAddr + Register, buf, count);
|
|
}
|
|
|
|
static inline void nsp_fifo32_write(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
nsp_multi_write_4(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
|
|
/*====================================================================*/
|
|
|
|
static inline void nsp_mmio_write(unsigned long base,
|
|
unsigned int index,
|
|
unsigned char val)
|
|
{
|
|
unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
|
|
|
|
writeb(val, ptr);
|
|
}
|
|
|
|
static inline unsigned char nsp_mmio_read(unsigned long base,
|
|
unsigned int index)
|
|
{
|
|
unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
|
|
|
|
return readb(ptr);
|
|
}
|
|
|
|
/*-----------*/
|
|
|
|
static inline unsigned char nsp_mmio_index_read(unsigned long base,
|
|
unsigned int reg)
|
|
{
|
|
unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
|
|
unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
|
|
|
|
writeb((unsigned char)reg, index_ptr);
|
|
return readb(data_ptr);
|
|
}
|
|
|
|
static inline void nsp_mmio_index_write(unsigned long base,
|
|
unsigned int reg,
|
|
unsigned char val)
|
|
{
|
|
unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
|
|
unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
|
|
|
|
writeb((unsigned char)reg, index_ptr);
|
|
writeb(val, data_ptr);
|
|
}
|
|
|
|
/* read 32bit FIFO */
|
|
static inline void nsp_mmio_multi_read_4(unsigned long base,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
unsigned long *ptr = (unsigned long *)(base + Register);
|
|
unsigned long *tmp = (unsigned long *)buf;
|
|
int i;
|
|
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
|
|
|
|
for (i = 0; i < count; i++) {
|
|
*tmp = readl(ptr);
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
|
|
tmp++;
|
|
}
|
|
}
|
|
|
|
static inline void nsp_mmio_fifo32_read(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
|
|
nsp_mmio_multi_read_4(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
static inline void nsp_mmio_multi_write_4(unsigned long base,
|
|
unsigned int Register,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
unsigned long *ptr = (unsigned long *)(base + Register);
|
|
unsigned long *tmp = (unsigned long *)buf;
|
|
int i;
|
|
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
|
|
|
|
for (i = 0; i < count; i++) {
|
|
writel(*tmp, ptr);
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
|
|
tmp++;
|
|
}
|
|
}
|
|
|
|
static inline void nsp_mmio_fifo32_write(unsigned int base,
|
|
void *buf,
|
|
unsigned long count)
|
|
{
|
|
//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
|
|
nsp_mmio_multi_write_4(base, FIFODATA, buf, count);
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
/* end */
|