275 lines · c
1/*2 NinjaSCSI I/O funtions 3 By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>4 5 This software may be used and distributed according to the terms of6 the GNU General Public License.7 8 */9 10/* $Id: nsp_io.h,v 1.3 2003/08/04 21:15:26 elca Exp $ */11 12#ifndef __NSP_IO_H__13#define __NSP_IO_H__14 15static inline void nsp_write(unsigned int base,16 unsigned int index,17 unsigned char val);18static inline unsigned char nsp_read(unsigned int base,19 unsigned int index);20static inline void nsp_index_write(unsigned int BaseAddr,21 unsigned int Register,22 unsigned char Value);23static inline unsigned char nsp_index_read(unsigned int BaseAddr,24 unsigned int Register);25 26/*******************************************************************27 * Basic IO28 */29 30static inline void nsp_write(unsigned int base,31 unsigned int index,32 unsigned char val)33{34 outb(val, (base + index));35}36 37static inline unsigned char nsp_read(unsigned int base,38 unsigned int index)39{40 return inb(base + index);41}42 43 44/**********************************************************************45 * Indexed IO46 */47static inline unsigned char nsp_index_read(unsigned int BaseAddr,48 unsigned int Register)49{50 outb(Register, BaseAddr + INDEXREG);51 return inb(BaseAddr + DATAREG);52}53 54static inline void nsp_index_write(unsigned int BaseAddr,55 unsigned int Register,56 unsigned char Value)57{58 outb(Register, BaseAddr + INDEXREG);59 outb(Value, BaseAddr + DATAREG);60}61 62/*********************************************************************63 * fifo func64 */65 66/* read 8 bit FIFO */67static inline void nsp_multi_read_1(unsigned int BaseAddr,68 unsigned int Register,69 void *buf,70 unsigned long count)71{72 insb(BaseAddr + Register, buf, count);73}74 75static inline void nsp_fifo8_read(unsigned int base,76 void *buf,77 unsigned long count)78{79 /*nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx", buf, count);*/80 nsp_multi_read_1(base, FIFODATA, buf, count);81}82 83/*--------------------------------------------------------------*/84 85/* read 16 bit FIFO */86static inline void nsp_multi_read_2(unsigned int BaseAddr,87 unsigned int Register,88 void *buf,89 unsigned long count)90{91 insw(BaseAddr + Register, buf, count);92}93 94static inline void nsp_fifo16_read(unsigned int base,95 void *buf,96 unsigned long count)97{98 //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*2", buf, count);99 nsp_multi_read_2(base, FIFODATA, buf, count);100}101 102/*--------------------------------------------------------------*/103 104/* read 32bit FIFO */105static inline void nsp_multi_read_4(unsigned int BaseAddr,106 unsigned int Register,107 void *buf,108 unsigned long count)109{110 insl(BaseAddr + Register, buf, count);111}112 113static inline void nsp_fifo32_read(unsigned int base,114 void *buf,115 unsigned long count)116{117 //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);118 nsp_multi_read_4(base, FIFODATA, buf, count);119}120 121/*----------------------------------------------------------*/122 123/* write 8bit FIFO */124static inline void nsp_multi_write_1(unsigned int BaseAddr,125 unsigned int Register,126 void *buf,127 unsigned long count)128{129 outsb(BaseAddr + Register, buf, count);130}131 132static inline void nsp_fifo8_write(unsigned int base,133 void *buf,134 unsigned long count)135{136 nsp_multi_write_1(base, FIFODATA, buf, count);137}138 139/*---------------------------------------------------------*/140 141/* write 16bit FIFO */142static inline void nsp_multi_write_2(unsigned int BaseAddr,143 unsigned int Register,144 void *buf,145 unsigned long count)146{147 outsw(BaseAddr + Register, buf, count);148}149 150static inline void nsp_fifo16_write(unsigned int base,151 void *buf,152 unsigned long count)153{154 nsp_multi_write_2(base, FIFODATA, buf, count);155}156 157/*---------------------------------------------------------*/158 159/* write 32bit FIFO */160static inline void nsp_multi_write_4(unsigned int BaseAddr,161 unsigned int Register,162 void *buf,163 unsigned long count)164{165 outsl(BaseAddr + Register, buf, count);166}167 168static inline void nsp_fifo32_write(unsigned int base,169 void *buf,170 unsigned long count)171{172 nsp_multi_write_4(base, FIFODATA, buf, count);173}174 175 176/*====================================================================*/177 178static inline void nsp_mmio_write(unsigned long base,179 unsigned int index,180 unsigned char val)181{182 unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);183 184 writeb(val, ptr);185}186 187static inline unsigned char nsp_mmio_read(unsigned long base,188 unsigned int index)189{190 unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);191 192 return readb(ptr);193}194 195/*-----------*/196 197static inline unsigned char nsp_mmio_index_read(unsigned long base,198 unsigned int reg)199{200 unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);201 unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);202 203 writeb((unsigned char)reg, index_ptr);204 return readb(data_ptr);205}206 207static inline void nsp_mmio_index_write(unsigned long base,208 unsigned int reg,209 unsigned char val)210{211 unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);212 unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);213 214 writeb((unsigned char)reg, index_ptr);215 writeb(val, data_ptr);216}217 218/* read 32bit FIFO */219static inline void nsp_mmio_multi_read_4(unsigned long base,220 unsigned int Register,221 void *buf,222 unsigned long count)223{224 unsigned long *ptr = (unsigned long *)(base + Register);225 unsigned long *tmp = (unsigned long *)buf;226 int i;227 228 //nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);229 230 for (i = 0; i < count; i++) {231 *tmp = readl(ptr);232 //nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);233 tmp++;234 }235}236 237static inline void nsp_mmio_fifo32_read(unsigned int base,238 void *buf,239 unsigned long count)240{241 //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);242 nsp_mmio_multi_read_4(base, FIFODATA, buf, count);243}244 245static inline void nsp_mmio_multi_write_4(unsigned long base,246 unsigned int Register,247 void *buf,248 unsigned long count)249{250 unsigned long *ptr = (unsigned long *)(base + Register);251 unsigned long *tmp = (unsigned long *)buf;252 int i;253 254 //nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);255 256 for (i = 0; i < count; i++) {257 writel(*tmp, ptr);258 //nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);259 tmp++;260 }261}262 263static inline void nsp_mmio_fifo32_write(unsigned int base,264 void *buf,265 unsigned long count)266{267 //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);268 nsp_mmio_multi_write_4(base, FIFODATA, buf, count);269}270 271 272 273#endif274/* end */275