Statistics
| Branch: | Revision:

root / hw / pci_host_template.h @ 452efba6

History | View | Annotate | Download (3.7 kB)

1 4f5e19e6 Isaku Yamahata
/*
2 4f5e19e6 Isaku Yamahata
 * QEMU Common PCI Host bridge configuration data space access routines.
3 4f5e19e6 Isaku Yamahata
 *
4 4f5e19e6 Isaku Yamahata
 * Copyright (c) 2006 Fabrice Bellard
5 4f5e19e6 Isaku Yamahata
 *
6 4f5e19e6 Isaku Yamahata
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 4f5e19e6 Isaku Yamahata
 * of this software and associated documentation files (the "Software"), to deal
8 4f5e19e6 Isaku Yamahata
 * in the Software without restriction, including without limitation the rights
9 4f5e19e6 Isaku Yamahata
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 4f5e19e6 Isaku Yamahata
 * copies of the Software, and to permit persons to whom the Software is
11 4f5e19e6 Isaku Yamahata
 * furnished to do so, subject to the following conditions:
12 4f5e19e6 Isaku Yamahata
 *
13 4f5e19e6 Isaku Yamahata
 * The above copyright notice and this permission notice shall be included in
14 4f5e19e6 Isaku Yamahata
 * all copies or substantial portions of the Software.
15 4f5e19e6 Isaku Yamahata
 *
16 4f5e19e6 Isaku Yamahata
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 4f5e19e6 Isaku Yamahata
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 4f5e19e6 Isaku Yamahata
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 4f5e19e6 Isaku Yamahata
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 4f5e19e6 Isaku Yamahata
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 4f5e19e6 Isaku Yamahata
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 4f5e19e6 Isaku Yamahata
 * THE SOFTWARE.
23 4f5e19e6 Isaku Yamahata
 */
24 4f5e19e6 Isaku Yamahata
25 4f5e19e6 Isaku Yamahata
/* Worker routines for a PCI host controller that uses an {address,data}
26 4f5e19e6 Isaku Yamahata
   register pair to access PCI configuration space.  */
27 4f5e19e6 Isaku Yamahata
28 4f5e19e6 Isaku Yamahata
static void glue(pci_host_data_writeb, PCI_HOST_SUFFIX)(
29 4f5e19e6 Isaku Yamahata
    void* opaque, PCI_ADDR_T addr, uint32_t val)
30 4f5e19e6 Isaku Yamahata
{
31 4f5e19e6 Isaku Yamahata
    PCIHostState *s = opaque;
32 4f5e19e6 Isaku Yamahata
33 4f5e19e6 Isaku Yamahata
    PCI_DPRINTF("writeb addr " TARGET_FMT_plx " val %x\n",
34 4f5e19e6 Isaku Yamahata
                (target_phys_addr_t)addr, val);
35 4f5e19e6 Isaku Yamahata
    if (s->config_reg & (1u << 31))
36 4f5e19e6 Isaku Yamahata
        pci_data_write(s->bus, s->config_reg | (addr & 3), val, 1);
37 4f5e19e6 Isaku Yamahata
}
38 4f5e19e6 Isaku Yamahata
39 4f5e19e6 Isaku Yamahata
static void glue(pci_host_data_writew, PCI_HOST_SUFFIX)(
40 4f5e19e6 Isaku Yamahata
    void* opaque, PCI_ADDR_T addr, uint32_t val)
41 4f5e19e6 Isaku Yamahata
{
42 4f5e19e6 Isaku Yamahata
    PCIHostState *s = opaque;
43 4f5e19e6 Isaku Yamahata
#ifdef TARGET_WORDS_BIGENDIAN
44 4f5e19e6 Isaku Yamahata
    val = bswap16(val);
45 4f5e19e6 Isaku Yamahata
#endif
46 4f5e19e6 Isaku Yamahata
    PCI_DPRINTF("writew addr " TARGET_FMT_plx " val %x\n",
47 4f5e19e6 Isaku Yamahata
                (target_phys_addr_t)addr, val);
48 4f5e19e6 Isaku Yamahata
    if (s->config_reg & (1u << 31))
49 4f5e19e6 Isaku Yamahata
        pci_data_write(s->bus, s->config_reg | (addr & 3), val, 2);
50 4f5e19e6 Isaku Yamahata
}
51 4f5e19e6 Isaku Yamahata
52 4f5e19e6 Isaku Yamahata
static void glue(pci_host_data_writel, PCI_HOST_SUFFIX)(
53 4f5e19e6 Isaku Yamahata
    void* opaque, PCI_ADDR_T addr, uint32_t val)
54 4f5e19e6 Isaku Yamahata
{
55 4f5e19e6 Isaku Yamahata
    PCIHostState *s = opaque;
56 4f5e19e6 Isaku Yamahata
#ifdef TARGET_WORDS_BIGENDIAN
57 4f5e19e6 Isaku Yamahata
    val = bswap32(val);
58 4f5e19e6 Isaku Yamahata
#endif
59 4f5e19e6 Isaku Yamahata
    PCI_DPRINTF("writel addr " TARGET_FMT_plx " val %x\n",
60 4f5e19e6 Isaku Yamahata
                (target_phys_addr_t)addr, val);
61 4f5e19e6 Isaku Yamahata
    if (s->config_reg & (1u << 31))
62 4f5e19e6 Isaku Yamahata
        pci_data_write(s->bus, s->config_reg, val, 4);
63 4f5e19e6 Isaku Yamahata
}
64 4f5e19e6 Isaku Yamahata
65 4f5e19e6 Isaku Yamahata
static uint32_t glue(pci_host_data_readb, PCI_HOST_SUFFIX)(
66 4f5e19e6 Isaku Yamahata
    void* opaque, PCI_ADDR_T addr)
67 4f5e19e6 Isaku Yamahata
{
68 4f5e19e6 Isaku Yamahata
    PCIHostState *s = opaque;
69 4f5e19e6 Isaku Yamahata
    uint32_t val;
70 4f5e19e6 Isaku Yamahata
71 4f5e19e6 Isaku Yamahata
    if (!(s->config_reg & (1 << 31)))
72 4f5e19e6 Isaku Yamahata
        return 0xff;
73 4f5e19e6 Isaku Yamahata
    val = pci_data_read(s->bus, s->config_reg | (addr & 3), 1);
74 4f5e19e6 Isaku Yamahata
    PCI_DPRINTF("readb addr " TARGET_FMT_plx " val %x\n",
75 4f5e19e6 Isaku Yamahata
                (target_phys_addr_t)addr, val);
76 4f5e19e6 Isaku Yamahata
    return val;
77 4f5e19e6 Isaku Yamahata
}
78 4f5e19e6 Isaku Yamahata
79 4f5e19e6 Isaku Yamahata
static uint32_t glue(pci_host_data_readw, PCI_HOST_SUFFIX)(
80 4f5e19e6 Isaku Yamahata
    void* opaque, PCI_ADDR_T addr)
81 4f5e19e6 Isaku Yamahata
{
82 4f5e19e6 Isaku Yamahata
    PCIHostState *s = opaque;
83 4f5e19e6 Isaku Yamahata
    uint32_t val;
84 4f5e19e6 Isaku Yamahata
    if (!(s->config_reg & (1 << 31)))
85 4f5e19e6 Isaku Yamahata
        return 0xffff;
86 4f5e19e6 Isaku Yamahata
    val = pci_data_read(s->bus, s->config_reg | (addr & 3), 2);
87 4f5e19e6 Isaku Yamahata
    PCI_DPRINTF("readw addr " TARGET_FMT_plx " val %x\n",
88 4f5e19e6 Isaku Yamahata
                (target_phys_addr_t)addr, val);
89 4f5e19e6 Isaku Yamahata
#ifdef TARGET_WORDS_BIGENDIAN
90 4f5e19e6 Isaku Yamahata
    val = bswap16(val);
91 4f5e19e6 Isaku Yamahata
#endif
92 4f5e19e6 Isaku Yamahata
    return val;
93 4f5e19e6 Isaku Yamahata
}
94 4f5e19e6 Isaku Yamahata
95 4f5e19e6 Isaku Yamahata
static uint32_t glue(pci_host_data_readl, PCI_HOST_SUFFIX)(
96 4f5e19e6 Isaku Yamahata
    void* opaque, PCI_ADDR_T addr)
97 4f5e19e6 Isaku Yamahata
{
98 4f5e19e6 Isaku Yamahata
    PCIHostState *s = opaque;
99 4f5e19e6 Isaku Yamahata
    uint32_t val;
100 4f5e19e6 Isaku Yamahata
    if (!(s->config_reg & (1 << 31)))
101 4f5e19e6 Isaku Yamahata
        return 0xffffffff;
102 4f5e19e6 Isaku Yamahata
    val = pci_data_read(s->bus, s->config_reg | (addr & 3), 4);
103 4f5e19e6 Isaku Yamahata
    PCI_DPRINTF("readl addr " TARGET_FMT_plx " val %x\n",
104 4f5e19e6 Isaku Yamahata
                (target_phys_addr_t)addr, val);
105 4f5e19e6 Isaku Yamahata
#ifdef TARGET_WORDS_BIGENDIAN
106 4f5e19e6 Isaku Yamahata
    val = bswap32(val);
107 4f5e19e6 Isaku Yamahata
#endif
108 4f5e19e6 Isaku Yamahata
    return val;
109 4f5e19e6 Isaku Yamahata
}