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