1 /*****************************************************************************/
7 * \author Frank Mehnert <fm3@os.inf.tu-dresden.de>
9 /*****************************************************************************/
12 * (c) 2003-2009 Author(s)
13 * economic rights: Technische Universität Dresden (Germany)
14 * This file is part of TUD:OS and distributed under the terms of the
15 * GNU Lesser General Public License 2.1.
16 * Please see the COPYING-LGPL-2.1 file for details.
19 #ifndef _L4UTIL_PORT_IO_H
20 #define _L4UTIL_PORT_IO_H
23 * \defgroup l4util_portio IA32 Port I/O API
28 #include <l4/sys/l4int.h>
29 #include <l4/sys/compiler.h>
31 /*****************************************************************************
33 *****************************************************************************/
37 * \addtogroup l4util_portio
41 * \brief Read byte from I/O port
43 * \param port I/O port address
47 l4util_in8(l4_uint16_t port);
50 * \brief Read 16-bit-value from I/O port
52 * \param port I/O port address
56 l4util_in16(l4_uint16_t port);
59 * \brief Read 32-bit-value from I/O port
61 * \param port I/O port address
65 l4util_in32(l4_uint16_t port);
68 * \brief Read a block of 8-bit-values from I/O ports
70 * \param port I/O port address
71 * \param addr address of buffer
72 * \param count number of I/O operations
75 l4util_ins8(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
78 * \brief Read a block of 16-bit-values from I/O ports
80 * \param port I/O port address
81 * \param addr address of buffer
82 * \param count number of I/O operations
85 l4util_ins16(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
88 * \brief Read a block of 32-bit-values from I/O ports
90 * \param port I/O port address
91 * \param addr address of buffer
92 * \param count number of I/O operations
95 l4util_ins32(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
98 * \brief Write byte to I/O port
100 * \param port I/O port address
101 * \param value value to write
104 l4util_out8(l4_uint8_t value, l4_uint16_t port);
107 * \brief Write 16-bit-value to I/O port
110 * \param port I/O port address
111 * \param value value to write
114 l4util_out16(l4_uint16_t value, l4_uint16_t port);
117 * \brief Write 32-bit-value to I/O port
119 * \param port I/O port address
120 * \param value value to write
123 l4util_out32(l4_uint32_t value, l4_uint16_t port);
126 * \brief Write a block of bytes to I/O port
128 * \param port I/O port address
129 * \param addr address of buffer
130 * \param count number of I/O operations
133 l4util_outs8(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
136 * \brief Write a block of 16-bit-values to I/O port
139 * \param port I/O port address
140 * \param addr address of buffer
141 * \param count number of I/O operations
144 l4util_outs16(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
147 * \brief Write block of 32-bit-values to I/O port
149 * \param port I/O port address
150 * \param addr address of buffer
151 * \param count number of I/O operations
154 l4util_outs32(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
157 * \brief delay I/O port access by writing to port 0x80
160 l4util_iodelay(void);
167 /*****************************************************************************
169 *****************************************************************************/
172 l4util_in8(l4_uint16_t port)
175 asm volatile ("inb %w1, %b0" : "=a" (value) : "Nd" (port));
179 L4_INLINE l4_uint16_t
180 l4util_in16(l4_uint16_t port)
183 asm volatile ("inw %w1, %w0" : "=a" (value) : "Nd" (port));
187 L4_INLINE l4_uint32_t
188 l4util_in32(l4_uint16_t port)
191 asm volatile ("inl %w1, %0" : "=a" (value) : "Nd" (port));
196 l4util_ins8(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
198 l4_umword_t dummy1, dummy2;
199 asm volatile ("rep insb" : "=D"(dummy1), "=c"(dummy2)
200 : "d" (port), "D" (addr), "c"(count)
205 l4util_ins16(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
207 l4_umword_t dummy1, dummy2;
208 asm volatile ("rep insw" : "=D"(dummy1), "=c"(dummy2)
209 : "d" (port), "D" (addr), "c"(count)
214 l4util_ins32(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
216 l4_umword_t dummy1, dummy2;
217 asm volatile ("rep insl" : "=D"(dummy1), "=c"(dummy2)
218 : "d" (port), "D" (addr), "c"(count)
223 l4util_out8(l4_uint8_t value, l4_uint16_t port)
225 asm volatile ("outb %b0, %w1" : : "a" (value), "Nd" (port));
229 l4util_out16(l4_uint16_t value, l4_uint16_t port)
231 asm volatile ("outw %w0, %w1" : : "a" (value), "Nd" (port));
235 l4util_out32(l4_uint32_t value, l4_uint16_t port)
237 asm volatile ("outl %0, %w1" : : "a" (value), "Nd" (port));
241 l4util_outs8(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
243 l4_umword_t dummy1, dummy2;
244 asm volatile ("rep outsb" : "=S"(dummy1), "=c"(dummy2)
245 : "d" (port), "S" (addr), "c"(count)
250 l4util_outs16(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
252 l4_umword_t dummy1, dummy2;
253 asm volatile ("rep outsw" : "=S"(dummy1), "=c"(dummy2)
254 : "d" (port), "S" (addr), "c"(count)
259 l4util_outs32(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
261 l4_umword_t dummy1, dummy2;
262 asm volatile ("rep outsl" : "=S"(dummy1), "=c"(dummy2)
263 : "d" (port), "S" (addr), "c"(count)
270 asm volatile ("outb %al,$0x80");