18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci  NinjaSCSI I/O funtions
38c2ecf20Sopenharmony_ci      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci  This software may be used and distributed according to the terms of
68c2ecf20Sopenharmony_ci  the GNU General Public License.
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci  */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/* $Id: nsp_io.h,v 1.3 2003/08/04 21:15:26 elca Exp $ */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#ifndef __NSP_IO_H__
138c2ecf20Sopenharmony_ci#define __NSP_IO_H__
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistatic inline          void nsp_write(unsigned int base,
168c2ecf20Sopenharmony_ci				      unsigned int index,
178c2ecf20Sopenharmony_ci				      unsigned char val);
188c2ecf20Sopenharmony_cistatic inline unsigned char nsp_read(unsigned int base,
198c2ecf20Sopenharmony_ci				     unsigned int index);
208c2ecf20Sopenharmony_cistatic inline          void nsp_index_write(unsigned int BaseAddr,
218c2ecf20Sopenharmony_ci					    unsigned int Register,
228c2ecf20Sopenharmony_ci					    unsigned char Value);
238c2ecf20Sopenharmony_cistatic inline unsigned char nsp_index_read(unsigned int BaseAddr,
248c2ecf20Sopenharmony_ci					   unsigned int Register);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/*******************************************************************
278c2ecf20Sopenharmony_ci * Basic IO
288c2ecf20Sopenharmony_ci */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic inline void nsp_write(unsigned int  base,
318c2ecf20Sopenharmony_ci			     unsigned int  index,
328c2ecf20Sopenharmony_ci			     unsigned char val)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	outb(val, (base + index));
358c2ecf20Sopenharmony_ci}
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistatic inline unsigned char nsp_read(unsigned int base,
388c2ecf20Sopenharmony_ci				     unsigned int index)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	return inb(base + index);
418c2ecf20Sopenharmony_ci}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/**********************************************************************
458c2ecf20Sopenharmony_ci * Indexed IO
468c2ecf20Sopenharmony_ci */
478c2ecf20Sopenharmony_cistatic inline unsigned char nsp_index_read(unsigned int BaseAddr,
488c2ecf20Sopenharmony_ci					   unsigned int Register)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	outb(Register, BaseAddr + INDEXREG);
518c2ecf20Sopenharmony_ci	return inb(BaseAddr + DATAREG);
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic inline void nsp_index_write(unsigned int  BaseAddr,
558c2ecf20Sopenharmony_ci				   unsigned int  Register,
568c2ecf20Sopenharmony_ci				   unsigned char Value)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	outb(Register, BaseAddr + INDEXREG);
598c2ecf20Sopenharmony_ci	outb(Value, BaseAddr + DATAREG);
608c2ecf20Sopenharmony_ci}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci/*********************************************************************
638c2ecf20Sopenharmony_ci * fifo func
648c2ecf20Sopenharmony_ci */
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci/* read 8 bit FIFO */
678c2ecf20Sopenharmony_cistatic inline void nsp_multi_read_1(unsigned int   BaseAddr,
688c2ecf20Sopenharmony_ci				    unsigned int   Register,
698c2ecf20Sopenharmony_ci				    void          *buf,
708c2ecf20Sopenharmony_ci				    unsigned long  count)
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci	insb(BaseAddr + Register, buf, count);
738c2ecf20Sopenharmony_ci}
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistatic inline void nsp_fifo8_read(unsigned int   base,
768c2ecf20Sopenharmony_ci				  void          *buf,
778c2ecf20Sopenharmony_ci				  unsigned long  count)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	/*nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx", buf, count);*/
808c2ecf20Sopenharmony_ci	nsp_multi_read_1(base, FIFODATA, buf, count);
818c2ecf20Sopenharmony_ci}
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci/*--------------------------------------------------------------*/
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci/* read 16 bit FIFO */
868c2ecf20Sopenharmony_cistatic inline void nsp_multi_read_2(unsigned int   BaseAddr,
878c2ecf20Sopenharmony_ci				    unsigned int   Register,
888c2ecf20Sopenharmony_ci				    void          *buf,
898c2ecf20Sopenharmony_ci				    unsigned long  count)
908c2ecf20Sopenharmony_ci{
918c2ecf20Sopenharmony_ci	insw(BaseAddr + Register, buf, count);
928c2ecf20Sopenharmony_ci}
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_cistatic inline void nsp_fifo16_read(unsigned int   base,
958c2ecf20Sopenharmony_ci				   void          *buf,
968c2ecf20Sopenharmony_ci				   unsigned long  count)
978c2ecf20Sopenharmony_ci{
988c2ecf20Sopenharmony_ci	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*2", buf, count);
998c2ecf20Sopenharmony_ci	nsp_multi_read_2(base, FIFODATA, buf, count);
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci/*--------------------------------------------------------------*/
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci/* read 32bit FIFO */
1058c2ecf20Sopenharmony_cistatic inline void nsp_multi_read_4(unsigned int   BaseAddr,
1068c2ecf20Sopenharmony_ci				    unsigned int   Register,
1078c2ecf20Sopenharmony_ci				    void          *buf,
1088c2ecf20Sopenharmony_ci				    unsigned long  count)
1098c2ecf20Sopenharmony_ci{
1108c2ecf20Sopenharmony_ci	insl(BaseAddr + Register, buf, count);
1118c2ecf20Sopenharmony_ci}
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_cistatic inline void nsp_fifo32_read(unsigned int   base,
1148c2ecf20Sopenharmony_ci				   void          *buf,
1158c2ecf20Sopenharmony_ci				   unsigned long  count)
1168c2ecf20Sopenharmony_ci{
1178c2ecf20Sopenharmony_ci	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
1188c2ecf20Sopenharmony_ci	nsp_multi_read_4(base, FIFODATA, buf, count);
1198c2ecf20Sopenharmony_ci}
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci/*----------------------------------------------------------*/
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci/* write 8bit FIFO */
1248c2ecf20Sopenharmony_cistatic inline void nsp_multi_write_1(unsigned int   BaseAddr,
1258c2ecf20Sopenharmony_ci				     unsigned int   Register,
1268c2ecf20Sopenharmony_ci				     void          *buf,
1278c2ecf20Sopenharmony_ci				     unsigned long  count)
1288c2ecf20Sopenharmony_ci{
1298c2ecf20Sopenharmony_ci	outsb(BaseAddr + Register, buf, count);
1308c2ecf20Sopenharmony_ci}
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cistatic inline void nsp_fifo8_write(unsigned int   base,
1338c2ecf20Sopenharmony_ci				   void          *buf,
1348c2ecf20Sopenharmony_ci				   unsigned long  count)
1358c2ecf20Sopenharmony_ci{
1368c2ecf20Sopenharmony_ci	nsp_multi_write_1(base, FIFODATA, buf, count);
1378c2ecf20Sopenharmony_ci}
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci/*---------------------------------------------------------*/
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci/* write 16bit FIFO */
1428c2ecf20Sopenharmony_cistatic inline void nsp_multi_write_2(unsigned int   BaseAddr,
1438c2ecf20Sopenharmony_ci				     unsigned int   Register,
1448c2ecf20Sopenharmony_ci				     void          *buf,
1458c2ecf20Sopenharmony_ci				     unsigned long  count)
1468c2ecf20Sopenharmony_ci{
1478c2ecf20Sopenharmony_ci	outsw(BaseAddr + Register, buf, count);
1488c2ecf20Sopenharmony_ci}
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cistatic inline void nsp_fifo16_write(unsigned int   base,
1518c2ecf20Sopenharmony_ci				    void          *buf,
1528c2ecf20Sopenharmony_ci				    unsigned long  count)
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	nsp_multi_write_2(base, FIFODATA, buf, count);
1558c2ecf20Sopenharmony_ci}
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci/*---------------------------------------------------------*/
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci/* write 32bit FIFO */
1608c2ecf20Sopenharmony_cistatic inline void nsp_multi_write_4(unsigned int   BaseAddr,
1618c2ecf20Sopenharmony_ci				     unsigned int   Register,
1628c2ecf20Sopenharmony_ci				     void          *buf,
1638c2ecf20Sopenharmony_ci				     unsigned long  count)
1648c2ecf20Sopenharmony_ci{
1658c2ecf20Sopenharmony_ci	outsl(BaseAddr + Register, buf, count);
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_cistatic inline void nsp_fifo32_write(unsigned int   base,
1698c2ecf20Sopenharmony_ci				    void          *buf,
1708c2ecf20Sopenharmony_ci				    unsigned long  count)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	nsp_multi_write_4(base, FIFODATA, buf, count);
1738c2ecf20Sopenharmony_ci}
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci/*====================================================================*/
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_cistatic inline void nsp_mmio_write(unsigned long base,
1798c2ecf20Sopenharmony_ci				  unsigned int  index,
1808c2ecf20Sopenharmony_ci				  unsigned char val)
1818c2ecf20Sopenharmony_ci{
1828c2ecf20Sopenharmony_ci	unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci	writeb(val, ptr);
1858c2ecf20Sopenharmony_ci}
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_cistatic inline unsigned char nsp_mmio_read(unsigned long base,
1888c2ecf20Sopenharmony_ci					  unsigned int  index)
1898c2ecf20Sopenharmony_ci{
1908c2ecf20Sopenharmony_ci	unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci	return readb(ptr);
1938c2ecf20Sopenharmony_ci}
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci/*-----------*/
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_cistatic inline unsigned char nsp_mmio_index_read(unsigned long base,
1988c2ecf20Sopenharmony_ci						unsigned int  reg)
1998c2ecf20Sopenharmony_ci{
2008c2ecf20Sopenharmony_ci	unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
2018c2ecf20Sopenharmony_ci	unsigned char *data_ptr  = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	writeb((unsigned char)reg, index_ptr);
2048c2ecf20Sopenharmony_ci	return readb(data_ptr);
2058c2ecf20Sopenharmony_ci}
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_cistatic inline void nsp_mmio_index_write(unsigned long base,
2088c2ecf20Sopenharmony_ci					unsigned int  reg,
2098c2ecf20Sopenharmony_ci					unsigned char val)
2108c2ecf20Sopenharmony_ci{
2118c2ecf20Sopenharmony_ci	unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
2128c2ecf20Sopenharmony_ci	unsigned char *data_ptr  = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci	writeb((unsigned char)reg, index_ptr);
2158c2ecf20Sopenharmony_ci	writeb(val,                data_ptr);
2168c2ecf20Sopenharmony_ci}
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci/* read 32bit FIFO */
2198c2ecf20Sopenharmony_cistatic inline void nsp_mmio_multi_read_4(unsigned long  base,
2208c2ecf20Sopenharmony_ci					 unsigned int   Register,
2218c2ecf20Sopenharmony_ci					 void          *buf,
2228c2ecf20Sopenharmony_ci					 unsigned long  count)
2238c2ecf20Sopenharmony_ci{
2248c2ecf20Sopenharmony_ci	unsigned long *ptr = (unsigned long *)(base + Register);
2258c2ecf20Sopenharmony_ci	unsigned long *tmp = (unsigned long *)buf;
2268c2ecf20Sopenharmony_ci	int i;
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	for (i = 0; i < count; i++) {
2318c2ecf20Sopenharmony_ci		*tmp = readl(ptr);
2328c2ecf20Sopenharmony_ci		//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
2338c2ecf20Sopenharmony_ci		tmp++;
2348c2ecf20Sopenharmony_ci	}
2358c2ecf20Sopenharmony_ci}
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_cistatic inline void nsp_mmio_fifo32_read(unsigned int   base,
2388c2ecf20Sopenharmony_ci					void          *buf,
2398c2ecf20Sopenharmony_ci					unsigned long  count)
2408c2ecf20Sopenharmony_ci{
2418c2ecf20Sopenharmony_ci	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
2428c2ecf20Sopenharmony_ci	nsp_mmio_multi_read_4(base, FIFODATA, buf, count);
2438c2ecf20Sopenharmony_ci}
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_cistatic inline void nsp_mmio_multi_write_4(unsigned long  base,
2468c2ecf20Sopenharmony_ci					  unsigned int   Register,
2478c2ecf20Sopenharmony_ci					  void          *buf,
2488c2ecf20Sopenharmony_ci					  unsigned long  count)
2498c2ecf20Sopenharmony_ci{
2508c2ecf20Sopenharmony_ci	unsigned long *ptr = (unsigned long *)(base + Register);
2518c2ecf20Sopenharmony_ci	unsigned long *tmp = (unsigned long *)buf;
2528c2ecf20Sopenharmony_ci	int i;
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci	//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	for (i = 0; i < count; i++) {
2578c2ecf20Sopenharmony_ci		writel(*tmp, ptr);
2588c2ecf20Sopenharmony_ci		//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
2598c2ecf20Sopenharmony_ci		tmp++;
2608c2ecf20Sopenharmony_ci	}
2618c2ecf20Sopenharmony_ci}
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_cistatic inline void nsp_mmio_fifo32_write(unsigned int   base,
2648c2ecf20Sopenharmony_ci					 void          *buf,
2658c2ecf20Sopenharmony_ci					 unsigned long  count)
2668c2ecf20Sopenharmony_ci{
2678c2ecf20Sopenharmony_ci	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
2688c2ecf20Sopenharmony_ci	nsp_mmio_multi_write_4(base, FIFODATA, buf, count);
2698c2ecf20Sopenharmony_ci}
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci#endif
2748c2ecf20Sopenharmony_ci/* end */
275