io.h
 1  /* SPDX-License-Identifier: GPL-2.0-only */
 2  
 3  /*
 4   * I/O device access primitives. Simplified based on related U-Boot code,
 5   * which is in turn based on early versions from the Linux kernel:
 6   *
 7   *   Copyright (C) 1996-2000 Russell King
 8   *
 9   * This program is free software; you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License version 2 as
11   * published by the Free Software Foundation.
12   */
13  
14  #ifndef __ARCH_GENERIC_IO_H__
15  #define __ARCH_GENERIC_IO_H__
16  
17  #include <stdint.h>
18  #include <stddef.h>
19  #include <endian.h>
20  #include <arch/mmio.h>
21  
22  #define __io(a)	(void *)(uintptr_t)(CONFIG_PCI_IOBASE + a)
23  
24  static inline void outb(uint8_t value, uint16_t port)
25  {
26  	write8(__io(port), value);
27  }
28  
29  static inline void outw(uint16_t value, uint16_t port)
30  {
31  	write16(__io(port), cpu_to_le16(value));
32  }
33  
34  static inline void outl(uint32_t value, uint16_t port)
35  {
36  	write32(__io(port), cpu_to_le32(value));
37  }
38  
39  static inline uint8_t inb(uint16_t port)
40  {
41  	return read8(__io(port));
42  }
43  
44  static inline uint16_t inw(uint16_t port)
45  {
46  	return le16_to_cpu(read16(__io(port)));
47  }
48  
49  static inline uint32_t inl(uint16_t port)
50  {
51  	return le32_to_cpu(read32(__io(port)));
52  }
53  
54  static inline void outsb(uint16_t port, const void *addr, unsigned long count)
55  {
56  	uint8_t *buf = (uint8_t *)addr;
57  	while (count--)
58  		write8(__io(port), *buf++);
59  }
60  
61  static inline void outsw(uint16_t port, const void *addr, unsigned long count)
62  {
63  	uint16_t *buf = (uint16_t *)addr;
64  	while (count--)
65  		write16(__io(port), *buf++);
66  }
67  
68  static inline void outsl(uint16_t port, const void *addr, unsigned long count)
69  {
70  	uint32_t *buf = (uint32_t *)addr;
71  	while (count--)
72  		write32(__io(port), *buf++);
73  }
74  
75  static inline void insb(uint16_t port, void *addr, unsigned long count)
76  {
77  	uint8_t *buf = (uint8_t *)addr;
78  	while (count--)
79  		*buf++ = read8(__io(port));
80  }
81  
82  static inline void insw(uint16_t port, void *addr, unsigned long count)
83  {
84  	uint16_t *buf = (uint16_t *)addr;
85  	while (count--)
86  		*buf++ = read16(__io(port));
87  }
88  
89  static inline void insl(uint16_t port, void *addr, unsigned long count)
90  {
91  	uint32_t *buf = (uint32_t *)addr;
92  	while (count--)
93  		*buf++ = read32(__io(port));
94  }
95  
96  #endif