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 */
 |