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