aboutsummaryrefslogtreecommitdiff
path: root/include/qemu/host-pci-mmio.h
blob: a8ed9938ac54997fe46ee76021e7e614c3c4bdb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * API for host PCI MMIO accesses (e.g. Linux VFIO BARs)
 *
 * Copyright 2025 IBM Corp.
 * Author(s): Farhan Ali <alifm@linux.ibm.com>
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef HOST_PCI_MMIO_H
#define HOST_PCI_MMIO_H

#include "qemu/bswap.h"
#include "qemu/s390x_pci_mmio.h"

static inline uint8_t host_pci_ldub_p(const void *ioaddr)
{
    uint8_t ret = 0;
#ifdef __s390x__
    ret = s390x_pci_mmio_read_8(ioaddr);
#else
    ret = ldub_p(ioaddr);
#endif

    return ret;
}

static inline uint16_t host_pci_lduw_le_p(const void *ioaddr)
{
    uint16_t ret = 0;
#ifdef __s390x__
    ret = le16_to_cpu(s390x_pci_mmio_read_16(ioaddr));
#else
    ret = lduw_le_p(ioaddr);
#endif

    return ret;
}

static inline uint32_t host_pci_ldl_le_p(const void *ioaddr)
{
    uint32_t ret = 0;
#ifdef __s390x__
    ret = le32_to_cpu(s390x_pci_mmio_read_32(ioaddr));
#else
    ret = ldl_le_p(ioaddr);
#endif

    return ret;
}

static inline uint64_t host_pci_ldq_le_p(const void *ioaddr)
{
    uint64_t ret = 0;
#ifdef __s390x__
    ret = le64_to_cpu(s390x_pci_mmio_read_64(ioaddr));
#else
    ret = ldq_le_p(ioaddr);
#endif

    return ret;
}

static inline void host_pci_stb_p(void *ioaddr, uint8_t val)
{
#ifdef __s390x__
    s390x_pci_mmio_write_8(ioaddr, val);
#else
    stb_p(ioaddr, val);
#endif
}

static inline void host_pci_stw_le_p(void *ioaddr, uint16_t val)
{
#ifdef __s390x__
    s390x_pci_mmio_write_16(ioaddr, cpu_to_le16(val));
#else
    stw_le_p(ioaddr, val);
#endif
}

static inline void host_pci_stl_le_p(void *ioaddr, uint32_t val)
{
#ifdef __s390x__
    s390x_pci_mmio_write_32(ioaddr, cpu_to_le32(val));
#else
    stl_le_p(ioaddr, val);
#endif
}

static inline void host_pci_stq_le_p(void *ioaddr, uint64_t val)
{
#ifdef __s390x__
    s390x_pci_mmio_write_64(ioaddr, cpu_to_le64(val));
#else
    stq_le_p(ioaddr, val);
#endif
}

static inline uint64_t host_pci_ldn_le_p(const void *ioaddr, int sz)
{
    switch (sz) {
    case 1:
        return host_pci_ldub_p(ioaddr);
    case 2:
        return host_pci_lduw_le_p(ioaddr);
    case 4:
        return host_pci_ldl_le_p(ioaddr);
    case 8:
        return host_pci_ldq_le_p(ioaddr);
    default:
        g_assert_not_reached();
    }
}

static inline void host_pci_stn_le_p(void *ioaddr, int sz, uint64_t v)
{
    switch (sz) {
    case 1:
        host_pci_stb_p(ioaddr, v);
        break;
    case 2:
        host_pci_stw_le_p(ioaddr, v);
        break;
    case 4:
        host_pci_stl_le_p(ioaddr, v);
        break;
    case 8:
        host_pci_stq_le_p(ioaddr, v);
        break;
    default:
        g_assert_not_reached();
    }
}

#endif