1 /*
2 * API for host PCI MMIO accesses (e.g. Linux VFIO BARs)
3 *
4 * Copyright 2025 IBM Corp.
5 * Author(s): Farhan Ali <alifm@linux.ibm.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #ifndef HOST_PCI_MMIO_H
11 #define HOST_PCI_MMIO_H
12
13 #include "qemu/bswap.h"
14 #include "qemu/s390x_pci_mmio.h"
15
host_pci_ldub_p(const void * ioaddr)16 static inline uint8_t host_pci_ldub_p(const void *ioaddr)
17 {
18 uint8_t ret = 0;
19 #ifdef __s390x__
20 ret = s390x_pci_mmio_read_8(ioaddr);
21 #else
22 ret = ldub_p(ioaddr);
23 #endif
24
25 return ret;
26 }
27
host_pci_lduw_le_p(const void * ioaddr)28 static inline uint16_t host_pci_lduw_le_p(const void *ioaddr)
29 {
30 uint16_t ret = 0;
31 #ifdef __s390x__
32 ret = le16_to_cpu(s390x_pci_mmio_read_16(ioaddr));
33 #else
34 ret = lduw_le_p(ioaddr);
35 #endif
36
37 return ret;
38 }
39
host_pci_ldl_le_p(const void * ioaddr)40 static inline uint32_t host_pci_ldl_le_p(const void *ioaddr)
41 {
42 uint32_t ret = 0;
43 #ifdef __s390x__
44 ret = le32_to_cpu(s390x_pci_mmio_read_32(ioaddr));
45 #else
46 ret = ldl_le_p(ioaddr);
47 #endif
48
49 return ret;
50 }
51
host_pci_ldq_le_p(const void * ioaddr)52 static inline uint64_t host_pci_ldq_le_p(const void *ioaddr)
53 {
54 uint64_t ret = 0;
55 #ifdef __s390x__
56 ret = le64_to_cpu(s390x_pci_mmio_read_64(ioaddr));
57 #else
58 ret = ldq_le_p(ioaddr);
59 #endif
60
61 return ret;
62 }
63
host_pci_stb_p(void * ioaddr,uint8_t val)64 static inline void host_pci_stb_p(void *ioaddr, uint8_t val)
65 {
66 #ifdef __s390x__
67 s390x_pci_mmio_write_8(ioaddr, val);
68 #else
69 stb_p(ioaddr, val);
70 #endif
71 }
72
host_pci_stw_le_p(void * ioaddr,uint16_t val)73 static inline void host_pci_stw_le_p(void *ioaddr, uint16_t val)
74 {
75 #ifdef __s390x__
76 s390x_pci_mmio_write_16(ioaddr, cpu_to_le16(val));
77 #else
78 stw_le_p(ioaddr, val);
79 #endif
80 }
81
host_pci_stl_le_p(void * ioaddr,uint32_t val)82 static inline void host_pci_stl_le_p(void *ioaddr, uint32_t val)
83 {
84 #ifdef __s390x__
85 s390x_pci_mmio_write_32(ioaddr, cpu_to_le32(val));
86 #else
87 stl_le_p(ioaddr, val);
88 #endif
89 }
90
host_pci_stq_le_p(void * ioaddr,uint64_t val)91 static inline void host_pci_stq_le_p(void *ioaddr, uint64_t val)
92 {
93 #ifdef __s390x__
94 s390x_pci_mmio_write_64(ioaddr, cpu_to_le64(val));
95 #else
96 stq_le_p(ioaddr, val);
97 #endif
98 }
99
host_pci_ldn_le_p(const void * ioaddr,int sz)100 static inline uint64_t host_pci_ldn_le_p(const void *ioaddr, int sz)
101 {
102 switch (sz) {
103 case 1:
104 return host_pci_ldub_p(ioaddr);
105 case 2:
106 return host_pci_lduw_le_p(ioaddr);
107 case 4:
108 return host_pci_ldl_le_p(ioaddr);
109 case 8:
110 return host_pci_ldq_le_p(ioaddr);
111 default:
112 g_assert_not_reached();
113 }
114 }
115
host_pci_stn_le_p(void * ioaddr,int sz,uint64_t v)116 static inline void host_pci_stn_le_p(void *ioaddr, int sz, uint64_t v)
117 {
118 switch (sz) {
119 case 1:
120 host_pci_stb_p(ioaddr, v);
121 break;
122 case 2:
123 host_pci_stw_le_p(ioaddr, v);
124 break;
125 case 4:
126 host_pci_stl_le_p(ioaddr, v);
127 break;
128 case 8:
129 host_pci_stq_le_p(ioaddr, v);
130 break;
131 default:
132 g_assert_not_reached();
133 }
134 }
135
136 #endif
137