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