xref: /qemu/include/qemu/host-pci-mmio.h (revision 6b18f6e34246ae62aefcaaa56585f14cd1a15295)
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