Statistics
| Branch: | Revision:

root / hw / pci.c @ e0ca7b94

History | View | Annotate | Download (32.7 kB)

1 69b91039 bellard
/*
2 69b91039 bellard
 * QEMU PCI bus manager
3 69b91039 bellard
 *
4 69b91039 bellard
 * Copyright (c) 2004 Fabrice Bellard
5 5fafdf24 ths
 *
6 69b91039 bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 69b91039 bellard
 * of this software and associated documentation files (the "Software"), to deal
8 69b91039 bellard
 * in the Software without restriction, including without limitation the rights
9 69b91039 bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 69b91039 bellard
 * copies of the Software, and to permit persons to whom the Software is
11 69b91039 bellard
 * furnished to do so, subject to the following conditions:
12 69b91039 bellard
 *
13 69b91039 bellard
 * The above copyright notice and this permission notice shall be included in
14 69b91039 bellard
 * all copies or substantial portions of the Software.
15 69b91039 bellard
 *
16 69b91039 bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 69b91039 bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 69b91039 bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 69b91039 bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 69b91039 bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 69b91039 bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 69b91039 bellard
 * THE SOFTWARE.
23 69b91039 bellard
 */
24 87ecb68b pbrook
#include "hw.h"
25 87ecb68b pbrook
#include "pci.h"
26 376253ec aliguori
#include "monitor.h"
27 87ecb68b pbrook
#include "net.h"
28 880345c4 aliguori
#include "sysemu.h"
29 69b91039 bellard
30 69b91039 bellard
//#define DEBUG_PCI
31 d8d2e079 Isaku Yamahata
#ifdef DEBUG_PCI
32 d8d2e079 Isaku Yamahata
# define PCI_DPRINTF(format, ...)       printf(format, __VA_ARGS__)
33 d8d2e079 Isaku Yamahata
#else
34 d8d2e079 Isaku Yamahata
# define PCI_DPRINTF(format, ...)       do { } while (0)
35 d8d2e079 Isaku Yamahata
#endif
36 69b91039 bellard
37 30468f78 bellard
struct PCIBus {
38 02e2da45 Paul Brook
    BusState qbus;
39 30468f78 bellard
    int bus_num;
40 30468f78 bellard
    int devfn_min;
41 502a5395 pbrook
    pci_set_irq_fn set_irq;
42 d2b59317 pbrook
    pci_map_irq_fn map_irq;
43 ee995ffb Gerd Hoffmann
    pci_hotplug_fn hotplug;
44 30468f78 bellard
    uint32_t config_reg; /* XXX: suppress */
45 5d4e84c8 Juan Quintela
    void *irq_opaque;
46 30468f78 bellard
    PCIDevice *devices[256];
47 80b3ada7 pbrook
    PCIDevice *parent_dev;
48 80b3ada7 pbrook
    PCIBus *next;
49 d2b59317 pbrook
    /* The bus IRQ state is the logical OR of the connected devices.
50 d2b59317 pbrook
       Keep a count of the number of devices with raised IRQs.  */
51 52fc1d83 balrog
    int nirq;
52 10c4c98a Gerd Hoffmann
    int *irq_count;
53 10c4c98a Gerd Hoffmann
};
54 10c4c98a Gerd Hoffmann
55 10c4c98a Gerd Hoffmann
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
56 10c4c98a Gerd Hoffmann
57 10c4c98a Gerd Hoffmann
static struct BusInfo pci_bus_info = {
58 10c4c98a Gerd Hoffmann
    .name       = "PCI",
59 10c4c98a Gerd Hoffmann
    .size       = sizeof(PCIBus),
60 10c4c98a Gerd Hoffmann
    .print_dev  = pcibus_dev_print,
61 ee6847d1 Gerd Hoffmann
    .props      = (Property[]) {
62 54586bd1 Gerd Hoffmann
        DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
63 54586bd1 Gerd Hoffmann
        DEFINE_PROP_END_OF_LIST()
64 ee6847d1 Gerd Hoffmann
    }
65 30468f78 bellard
};
66 69b91039 bellard
67 1941d19c bellard
static void pci_update_mappings(PCIDevice *d);
68 d537cf6c pbrook
static void pci_set_irq(void *opaque, int irq_num, int level);
69 1941d19c bellard
70 c227f099 Anthony Liguori
target_phys_addr_t pci_mem_base;
71 d350d97d aliguori
static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
72 d350d97d aliguori
static uint16_t pci_default_sub_device_id = PCI_SUBDEVICE_ID_QEMU;
73 30468f78 bellard
static PCIBus *first_bus;
74 30468f78 bellard
75 2d1e9f96 Juan Quintela
static const VMStateDescription vmstate_pcibus = {
76 2d1e9f96 Juan Quintela
    .name = "PCIBUS",
77 2d1e9f96 Juan Quintela
    .version_id = 1,
78 2d1e9f96 Juan Quintela
    .minimum_version_id = 1,
79 2d1e9f96 Juan Quintela
    .minimum_version_id_old = 1,
80 2d1e9f96 Juan Quintela
    .fields      = (VMStateField []) {
81 2d1e9f96 Juan Quintela
        VMSTATE_INT32_EQUAL(nirq, PCIBus),
82 2d1e9f96 Juan Quintela
        VMSTATE_INT32_VARRAY(irq_count, PCIBus, nirq),
83 2d1e9f96 Juan Quintela
        VMSTATE_END_OF_LIST()
84 52fc1d83 balrog
    }
85 2d1e9f96 Juan Quintela
};
86 52fc1d83 balrog
87 5330de09 Michael S. Tsirkin
static inline int pci_bar(int reg)
88 5330de09 Michael S. Tsirkin
{
89 5330de09 Michael S. Tsirkin
    return reg == PCI_ROM_SLOT ? PCI_ROM_ADDRESS : PCI_BASE_ADDRESS_0 + reg * 4;
90 5330de09 Michael S. Tsirkin
}
91 5330de09 Michael S. Tsirkin
92 5330de09 Michael S. Tsirkin
static void pci_device_reset(PCIDevice *dev)
93 5330de09 Michael S. Tsirkin
{
94 c0b1905b Michael S. Tsirkin
    int r;
95 c0b1905b Michael S. Tsirkin
96 5330de09 Michael S. Tsirkin
    memset(dev->irq_state, 0, sizeof dev->irq_state);
97 c0b1905b Michael S. Tsirkin
    dev->config[PCI_COMMAND] &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
98 c0b1905b Michael S. Tsirkin
                                  PCI_COMMAND_MASTER);
99 c0b1905b Michael S. Tsirkin
    dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
100 c0b1905b Michael S. Tsirkin
    dev->config[PCI_INTERRUPT_LINE] = 0x0;
101 c0b1905b Michael S. Tsirkin
    for (r = 0; r < PCI_NUM_REGIONS; ++r) {
102 c0b1905b Michael S. Tsirkin
        if (!dev->io_regions[r].size) {
103 c0b1905b Michael S. Tsirkin
            continue;
104 c0b1905b Michael S. Tsirkin
        }
105 c0b1905b Michael S. Tsirkin
        pci_set_long(dev->config + pci_bar(r), dev->io_regions[r].type);
106 c0b1905b Michael S. Tsirkin
    }
107 c0b1905b Michael S. Tsirkin
    pci_update_mappings(dev);
108 5330de09 Michael S. Tsirkin
}
109 5330de09 Michael S. Tsirkin
110 6eaa6847 Gleb Natapov
static void pci_bus_reset(void *opaque)
111 6eaa6847 Gleb Natapov
{
112 a60380a5 Juan Quintela
    PCIBus *bus = opaque;
113 6eaa6847 Gleb Natapov
    int i;
114 6eaa6847 Gleb Natapov
115 6eaa6847 Gleb Natapov
    for (i = 0; i < bus->nirq; i++) {
116 6eaa6847 Gleb Natapov
        bus->irq_count[i] = 0;
117 6eaa6847 Gleb Natapov
    }
118 5330de09 Michael S. Tsirkin
    for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
119 5330de09 Michael S. Tsirkin
        if (bus->devices[i]) {
120 5330de09 Michael S. Tsirkin
            pci_device_reset(bus->devices[i]);
121 5330de09 Michael S. Tsirkin
        }
122 6eaa6847 Gleb Natapov
    }
123 6eaa6847 Gleb Natapov
}
124 6eaa6847 Gleb Natapov
125 21eea4b3 Gerd Hoffmann
void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
126 21eea4b3 Gerd Hoffmann
                         const char *name, int devfn_min)
127 30468f78 bellard
{
128 52fc1d83 balrog
    static int nbus = 0;
129 52fc1d83 balrog
130 21eea4b3 Gerd Hoffmann
    qbus_create_inplace(&bus->qbus, &pci_bus_info, parent, name);
131 502a5395 pbrook
    bus->devfn_min = devfn_min;
132 425c608c Isaku Yamahata
    bus->next = first_bus;
133 30468f78 bellard
    first_bus = bus;
134 2d1e9f96 Juan Quintela
    vmstate_register(nbus++, &vmstate_pcibus, bus);
135 a08d4367 Jan Kiszka
    qemu_register_reset(pci_bus_reset, bus);
136 21eea4b3 Gerd Hoffmann
}
137 21eea4b3 Gerd Hoffmann
138 21eea4b3 Gerd Hoffmann
PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
139 21eea4b3 Gerd Hoffmann
{
140 21eea4b3 Gerd Hoffmann
    PCIBus *bus;
141 21eea4b3 Gerd Hoffmann
142 21eea4b3 Gerd Hoffmann
    bus = qemu_mallocz(sizeof(*bus));
143 21eea4b3 Gerd Hoffmann
    bus->qbus.qdev_allocated = 1;
144 21eea4b3 Gerd Hoffmann
    pci_bus_new_inplace(bus, parent, name, devfn_min);
145 21eea4b3 Gerd Hoffmann
    return bus;
146 21eea4b3 Gerd Hoffmann
}
147 21eea4b3 Gerd Hoffmann
148 21eea4b3 Gerd Hoffmann
void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
149 21eea4b3 Gerd Hoffmann
                  void *irq_opaque, int nirq)
150 21eea4b3 Gerd Hoffmann
{
151 21eea4b3 Gerd Hoffmann
    bus->set_irq = set_irq;
152 21eea4b3 Gerd Hoffmann
    bus->map_irq = map_irq;
153 21eea4b3 Gerd Hoffmann
    bus->irq_opaque = irq_opaque;
154 21eea4b3 Gerd Hoffmann
    bus->nirq = nirq;
155 21eea4b3 Gerd Hoffmann
    bus->irq_count = qemu_mallocz(nirq * sizeof(bus->irq_count[0]));
156 21eea4b3 Gerd Hoffmann
}
157 21eea4b3 Gerd Hoffmann
158 ee995ffb Gerd Hoffmann
void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug)
159 ee995ffb Gerd Hoffmann
{
160 ee995ffb Gerd Hoffmann
    bus->qbus.allow_hotplug = 1;
161 ee995ffb Gerd Hoffmann
    bus->hotplug = hotplug;
162 ee995ffb Gerd Hoffmann
}
163 ee995ffb Gerd Hoffmann
164 21eea4b3 Gerd Hoffmann
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
165 21eea4b3 Gerd Hoffmann
                         pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
166 21eea4b3 Gerd Hoffmann
                         void *irq_opaque, int devfn_min, int nirq)
167 21eea4b3 Gerd Hoffmann
{
168 21eea4b3 Gerd Hoffmann
    PCIBus *bus;
169 21eea4b3 Gerd Hoffmann
170 21eea4b3 Gerd Hoffmann
    bus = pci_bus_new(parent, name, devfn_min);
171 21eea4b3 Gerd Hoffmann
    pci_bus_irqs(bus, set_irq, map_irq, irq_opaque, nirq);
172 30468f78 bellard
    return bus;
173 30468f78 bellard
}
174 69b91039 bellard
175 03587182 Gerd Hoffmann
static void pci_register_secondary_bus(PCIBus *bus,
176 03587182 Gerd Hoffmann
                                       PCIDevice *dev,
177 03587182 Gerd Hoffmann
                                       pci_map_irq_fn map_irq,
178 03587182 Gerd Hoffmann
                                       const char *name)
179 80b3ada7 pbrook
{
180 03587182 Gerd Hoffmann
    qbus_create_inplace(&bus->qbus, &pci_bus_info, &dev->qdev, name);
181 80b3ada7 pbrook
    bus->map_irq = map_irq;
182 80b3ada7 pbrook
    bus->parent_dev = dev;
183 80b3ada7 pbrook
    bus->next = dev->bus->next;
184 80b3ada7 pbrook
    dev->bus->next = bus;
185 80b3ada7 pbrook
}
186 80b3ada7 pbrook
187 502a5395 pbrook
int pci_bus_num(PCIBus *s)
188 502a5395 pbrook
{
189 502a5395 pbrook
    return s->bus_num;
190 502a5395 pbrook
}
191 502a5395 pbrook
192 73534f2f Juan Quintela
static int get_pci_config_device(QEMUFile *f, void *pv, size_t size)
193 30ca2aab bellard
{
194 73534f2f Juan Quintela
    PCIDevice *s = container_of(pv, PCIDevice, config);
195 05fcfada Michael S. Tsirkin
    uint8_t config[PCI_CONFIG_SPACE_SIZE];
196 52fc1d83 balrog
    int i;
197 52fc1d83 balrog
198 05fcfada Michael S. Tsirkin
    assert(size == sizeof config);
199 05fcfada Michael S. Tsirkin
    qemu_get_buffer(f, config, sizeof config);
200 05fcfada Michael S. Tsirkin
    for (i = 0; i < sizeof config; ++i)
201 bd4b65ee Michael S. Tsirkin
        if ((config[i] ^ s->config[i]) & s->cmask[i] & ~s->wmask[i])
202 bd4b65ee Michael S. Tsirkin
            return -EINVAL;
203 05fcfada Michael S. Tsirkin
    memcpy(s->config, config, sizeof config);
204 bd4b65ee Michael S. Tsirkin
205 1941d19c bellard
    pci_update_mappings(s);
206 52fc1d83 balrog
207 30ca2aab bellard
    return 0;
208 30ca2aab bellard
}
209 30ca2aab bellard
210 73534f2f Juan Quintela
/* just put buffer */
211 84e2e3eb Juan Quintela
static void put_pci_config_device(QEMUFile *f, void *pv, size_t size)
212 73534f2f Juan Quintela
{
213 73534f2f Juan Quintela
    const uint8_t *v = pv;
214 73534f2f Juan Quintela
    qemu_put_buffer(f, v, size);
215 73534f2f Juan Quintela
}
216 73534f2f Juan Quintela
217 73534f2f Juan Quintela
static VMStateInfo vmstate_info_pci_config = {
218 73534f2f Juan Quintela
    .name = "pci config",
219 73534f2f Juan Quintela
    .get  = get_pci_config_device,
220 73534f2f Juan Quintela
    .put  = put_pci_config_device,
221 73534f2f Juan Quintela
};
222 73534f2f Juan Quintela
223 73534f2f Juan Quintela
const VMStateDescription vmstate_pci_device = {
224 73534f2f Juan Quintela
    .name = "PCIDevice",
225 73534f2f Juan Quintela
    .version_id = 2,
226 73534f2f Juan Quintela
    .minimum_version_id = 1,
227 73534f2f Juan Quintela
    .minimum_version_id_old = 1,
228 73534f2f Juan Quintela
    .fields      = (VMStateField []) {
229 73534f2f Juan Quintela
        VMSTATE_INT32_LE(version_id, PCIDevice),
230 73534f2f Juan Quintela
        VMSTATE_SINGLE(config, PCIDevice, 0, vmstate_info_pci_config,
231 73534f2f Juan Quintela
                       typeof_field(PCIDevice,config)),
232 73534f2f Juan Quintela
        VMSTATE_INT32_ARRAY_V(irq_state, PCIDevice, 4, 2),
233 73534f2f Juan Quintela
        VMSTATE_END_OF_LIST()
234 73534f2f Juan Quintela
    }
235 73534f2f Juan Quintela
};
236 73534f2f Juan Quintela
237 73534f2f Juan Quintela
void pci_device_save(PCIDevice *s, QEMUFile *f)
238 73534f2f Juan Quintela
{
239 73534f2f Juan Quintela
    vmstate_save_state(f, &vmstate_pci_device, s);
240 73534f2f Juan Quintela
}
241 73534f2f Juan Quintela
242 73534f2f Juan Quintela
int pci_device_load(PCIDevice *s, QEMUFile *f)
243 73534f2f Juan Quintela
{
244 73534f2f Juan Quintela
    return vmstate_load_state(f, &vmstate_pci_device, s, s->version_id);
245 73534f2f Juan Quintela
}
246 73534f2f Juan Quintela
247 d350d97d aliguori
static int pci_set_default_subsystem_id(PCIDevice *pci_dev)
248 d350d97d aliguori
{
249 d350d97d aliguori
    uint16_t *id;
250 d350d97d aliguori
251 d350d97d aliguori
    id = (void*)(&pci_dev->config[PCI_SUBVENDOR_ID]);
252 d350d97d aliguori
    id[0] = cpu_to_le16(pci_default_sub_vendor_id);
253 d350d97d aliguori
    id[1] = cpu_to_le16(pci_default_sub_device_id);
254 d350d97d aliguori
    return 0;
255 d350d97d aliguori
}
256 d350d97d aliguori
257 880345c4 aliguori
/*
258 880345c4 aliguori
 * Parse [[<domain>:]<bus>:]<slot>, return -1 on error
259 880345c4 aliguori
 */
260 880345c4 aliguori
static int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)
261 880345c4 aliguori
{
262 880345c4 aliguori
    const char *p;
263 880345c4 aliguori
    char *e;
264 880345c4 aliguori
    unsigned long val;
265 880345c4 aliguori
    unsigned long dom = 0, bus = 0;
266 880345c4 aliguori
    unsigned slot = 0;
267 880345c4 aliguori
268 880345c4 aliguori
    p = addr;
269 880345c4 aliguori
    val = strtoul(p, &e, 16);
270 880345c4 aliguori
    if (e == p)
271 880345c4 aliguori
        return -1;
272 880345c4 aliguori
    if (*e == ':') {
273 880345c4 aliguori
        bus = val;
274 880345c4 aliguori
        p = e + 1;
275 880345c4 aliguori
        val = strtoul(p, &e, 16);
276 880345c4 aliguori
        if (e == p)
277 880345c4 aliguori
            return -1;
278 880345c4 aliguori
        if (*e == ':') {
279 880345c4 aliguori
            dom = bus;
280 880345c4 aliguori
            bus = val;
281 880345c4 aliguori
            p = e + 1;
282 880345c4 aliguori
            val = strtoul(p, &e, 16);
283 880345c4 aliguori
            if (e == p)
284 880345c4 aliguori
                return -1;
285 880345c4 aliguori
        }
286 880345c4 aliguori
    }
287 880345c4 aliguori
288 880345c4 aliguori
    if (dom > 0xffff || bus > 0xff || val > 0x1f)
289 880345c4 aliguori
        return -1;
290 880345c4 aliguori
291 880345c4 aliguori
    slot = val;
292 880345c4 aliguori
293 880345c4 aliguori
    if (*e)
294 880345c4 aliguori
        return -1;
295 880345c4 aliguori
296 880345c4 aliguori
    /* Note: QEMU doesn't implement domains other than 0 */
297 880345c4 aliguori
    if (dom != 0 || pci_find_bus(bus) == NULL)
298 880345c4 aliguori
        return -1;
299 880345c4 aliguori
300 880345c4 aliguori
    *domp = dom;
301 880345c4 aliguori
    *busp = bus;
302 880345c4 aliguori
    *slotp = slot;
303 880345c4 aliguori
    return 0;
304 880345c4 aliguori
}
305 880345c4 aliguori
306 e9283f8b Jan Kiszka
int pci_read_devaddr(Monitor *mon, const char *addr, int *domp, int *busp,
307 e9283f8b Jan Kiszka
                     unsigned *slotp)
308 880345c4 aliguori
{
309 e9283f8b Jan Kiszka
    /* strip legacy tag */
310 e9283f8b Jan Kiszka
    if (!strncmp(addr, "pci_addr=", 9)) {
311 e9283f8b Jan Kiszka
        addr += 9;
312 e9283f8b Jan Kiszka
    }
313 e9283f8b Jan Kiszka
    if (pci_parse_devaddr(addr, domp, busp, slotp)) {
314 e9283f8b Jan Kiszka
        monitor_printf(mon, "Invalid pci address\n");
315 880345c4 aliguori
        return -1;
316 e9283f8b Jan Kiszka
    }
317 e9283f8b Jan Kiszka
    return 0;
318 880345c4 aliguori
}
319 880345c4 aliguori
320 49bd1458 Markus Armbruster
PCIBus *pci_get_bus_devfn(int *devfnp, const char *devaddr)
321 5607c388 Markus Armbruster
{
322 5607c388 Markus Armbruster
    int dom, bus;
323 5607c388 Markus Armbruster
    unsigned slot;
324 5607c388 Markus Armbruster
325 5607c388 Markus Armbruster
    if (!devaddr) {
326 5607c388 Markus Armbruster
        *devfnp = -1;
327 5607c388 Markus Armbruster
        return pci_find_bus(0);
328 5607c388 Markus Armbruster
    }
329 5607c388 Markus Armbruster
330 5607c388 Markus Armbruster
    if (pci_parse_devaddr(devaddr, &dom, &bus, &slot) < 0) {
331 5607c388 Markus Armbruster
        return NULL;
332 5607c388 Markus Armbruster
    }
333 5607c388 Markus Armbruster
334 5607c388 Markus Armbruster
    *devfnp = slot << 3;
335 5607c388 Markus Armbruster
    return pci_find_bus(bus);
336 5607c388 Markus Armbruster
}
337 5607c388 Markus Armbruster
338 bd4b65ee Michael S. Tsirkin
static void pci_init_cmask(PCIDevice *dev)
339 bd4b65ee Michael S. Tsirkin
{
340 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_VENDOR_ID, 0xffff);
341 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_DEVICE_ID, 0xffff);
342 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_STATUS] = PCI_STATUS_CAP_LIST;
343 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_REVISION_ID] = 0xff;
344 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_CLASS_PROG] = 0xff;
345 bd4b65ee Michael S. Tsirkin
    pci_set_word(dev->cmask + PCI_CLASS_DEVICE, 0xffff);
346 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_HEADER_TYPE] = 0xff;
347 bd4b65ee Michael S. Tsirkin
    dev->cmask[PCI_CAPABILITY_LIST] = 0xff;
348 bd4b65ee Michael S. Tsirkin
}
349 bd4b65ee Michael S. Tsirkin
350 b7ee1603 Michael S. Tsirkin
static void pci_init_wmask(PCIDevice *dev)
351 b7ee1603 Michael S. Tsirkin
{
352 b7ee1603 Michael S. Tsirkin
    int i;
353 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_CACHE_LINE_SIZE] = 0xff;
354 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_INTERRUPT_LINE] = 0xff;
355 b7ee1603 Michael S. Tsirkin
    dev->wmask[PCI_COMMAND] = PCI_COMMAND_IO | PCI_COMMAND_MEMORY
356 b7ee1603 Michael S. Tsirkin
                              | PCI_COMMAND_MASTER;
357 b7ee1603 Michael S. Tsirkin
    for (i = PCI_CONFIG_HEADER_SIZE; i < PCI_CONFIG_SPACE_SIZE; ++i)
358 b7ee1603 Michael S. Tsirkin
        dev->wmask[i] = 0xff;
359 b7ee1603 Michael S. Tsirkin
}
360 b7ee1603 Michael S. Tsirkin
361 69b91039 bellard
/* -1 for devfn means auto assign */
362 6b1b92d3 Paul Brook
static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
363 6b1b92d3 Paul Brook
                                         const char *name, int devfn,
364 6b1b92d3 Paul Brook
                                         PCIConfigReadFunc *config_read,
365 6b1b92d3 Paul Brook
                                         PCIConfigWriteFunc *config_write)
366 69b91039 bellard
{
367 69b91039 bellard
    if (devfn < 0) {
368 30468f78 bellard
        for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) {
369 30468f78 bellard
            if (!bus->devices[devfn])
370 69b91039 bellard
                goto found;
371 69b91039 bellard
        }
372 69b91039 bellard
        return NULL;
373 69b91039 bellard
    found: ;
374 07b7d053 Markus Armbruster
    } else if (bus->devices[devfn]) {
375 07b7d053 Markus Armbruster
        return NULL;
376 69b91039 bellard
    }
377 30468f78 bellard
    pci_dev->bus = bus;
378 69b91039 bellard
    pci_dev->devfn = devfn;
379 69b91039 bellard
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
380 d2b59317 pbrook
    memset(pci_dev->irq_state, 0, sizeof(pci_dev->irq_state));
381 d350d97d aliguori
    pci_set_default_subsystem_id(pci_dev);
382 bd4b65ee Michael S. Tsirkin
    pci_init_cmask(pci_dev);
383 b7ee1603 Michael S. Tsirkin
    pci_init_wmask(pci_dev);
384 0ac32c83 bellard
385 0ac32c83 bellard
    if (!config_read)
386 0ac32c83 bellard
        config_read = pci_default_read_config;
387 0ac32c83 bellard
    if (!config_write)
388 0ac32c83 bellard
        config_write = pci_default_write_config;
389 69b91039 bellard
    pci_dev->config_read = config_read;
390 69b91039 bellard
    pci_dev->config_write = config_write;
391 30468f78 bellard
    bus->devices[devfn] = pci_dev;
392 d537cf6c pbrook
    pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, 4);
393 f16c4abf Juan Quintela
    pci_dev->version_id = 2; /* Current pci device vmstate version */
394 69b91039 bellard
    return pci_dev;
395 69b91039 bellard
}
396 69b91039 bellard
397 6b1b92d3 Paul Brook
PCIDevice *pci_register_device(PCIBus *bus, const char *name,
398 6b1b92d3 Paul Brook
                               int instance_size, int devfn,
399 6b1b92d3 Paul Brook
                               PCIConfigReadFunc *config_read,
400 6b1b92d3 Paul Brook
                               PCIConfigWriteFunc *config_write)
401 6b1b92d3 Paul Brook
{
402 6b1b92d3 Paul Brook
    PCIDevice *pci_dev;
403 6b1b92d3 Paul Brook
404 6b1b92d3 Paul Brook
    pci_dev = qemu_mallocz(instance_size);
405 6b1b92d3 Paul Brook
    pci_dev = do_pci_register_device(pci_dev, bus, name, devfn,
406 6b1b92d3 Paul Brook
                                     config_read, config_write);
407 6b1b92d3 Paul Brook
    return pci_dev;
408 6b1b92d3 Paul Brook
}
409 c227f099 Anthony Liguori
static target_phys_addr_t pci_to_cpu_addr(target_phys_addr_t addr)
410 5851e08c aliguori
{
411 5851e08c aliguori
    return addr + pci_mem_base;
412 5851e08c aliguori
}
413 5851e08c aliguori
414 5851e08c aliguori
static void pci_unregister_io_regions(PCIDevice *pci_dev)
415 5851e08c aliguori
{
416 5851e08c aliguori
    PCIIORegion *r;
417 5851e08c aliguori
    int i;
418 5851e08c aliguori
419 5851e08c aliguori
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
420 5851e08c aliguori
        r = &pci_dev->io_regions[i];
421 5851e08c aliguori
        if (!r->size || r->addr == -1)
422 5851e08c aliguori
            continue;
423 5851e08c aliguori
        if (r->type == PCI_ADDRESS_SPACE_IO) {
424 5851e08c aliguori
            isa_unassign_ioport(r->addr, r->size);
425 5851e08c aliguori
        } else {
426 5851e08c aliguori
            cpu_register_physical_memory(pci_to_cpu_addr(r->addr),
427 5851e08c aliguori
                                                     r->size,
428 5851e08c aliguori
                                                     IO_MEM_UNASSIGNED);
429 5851e08c aliguori
        }
430 5851e08c aliguori
    }
431 5851e08c aliguori
}
432 5851e08c aliguori
433 a36a344d Gerd Hoffmann
static int pci_unregister_device(DeviceState *dev)
434 5851e08c aliguori
{
435 a36a344d Gerd Hoffmann
    PCIDevice *pci_dev = DO_UPCAST(PCIDevice, qdev, dev);
436 e3936fa5 Gerd Hoffmann
    PCIDeviceInfo *info = DO_UPCAST(PCIDeviceInfo, qdev, dev->info);
437 5851e08c aliguori
    int ret = 0;
438 5851e08c aliguori
439 e3936fa5 Gerd Hoffmann
    if (info->exit)
440 e3936fa5 Gerd Hoffmann
        ret = info->exit(pci_dev);
441 5851e08c aliguori
    if (ret)
442 5851e08c aliguori
        return ret;
443 5851e08c aliguori
444 5851e08c aliguori
    pci_unregister_io_regions(pci_dev);
445 5851e08c aliguori
446 5851e08c aliguori
    qemu_free_irqs(pci_dev->irq);
447 5851e08c aliguori
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
448 5851e08c aliguori
    return 0;
449 5851e08c aliguori
}
450 5851e08c aliguori
451 28c2c264 Avi Kivity
void pci_register_bar(PCIDevice *pci_dev, int region_num,
452 5fafdf24 ths
                            uint32_t size, int type,
453 69b91039 bellard
                            PCIMapIORegionFunc *map_func)
454 69b91039 bellard
{
455 69b91039 bellard
    PCIIORegion *r;
456 d7ce493a pbrook
    uint32_t addr;
457 b7ee1603 Michael S. Tsirkin
    uint32_t wmask;
458 69b91039 bellard
459 8a8696a3 bellard
    if ((unsigned int)region_num >= PCI_NUM_REGIONS)
460 69b91039 bellard
        return;
461 a4c20c6a aliguori
462 a4c20c6a aliguori
    if (size & (size-1)) {
463 a4c20c6a aliguori
        fprintf(stderr, "ERROR: PCI region size must be pow2 "
464 a4c20c6a aliguori
                    "type=0x%x, size=0x%x\n", type, size);
465 a4c20c6a aliguori
        exit(1);
466 a4c20c6a aliguori
    }
467 a4c20c6a aliguori
468 69b91039 bellard
    r = &pci_dev->io_regions[region_num];
469 69b91039 bellard
    r->addr = -1;
470 69b91039 bellard
    r->size = size;
471 69b91039 bellard
    r->type = type;
472 69b91039 bellard
    r->map_func = map_func;
473 b7ee1603 Michael S. Tsirkin
474 b7ee1603 Michael S. Tsirkin
    wmask = ~(size - 1);
475 5330de09 Michael S. Tsirkin
    addr = pci_bar(region_num);
476 d7ce493a pbrook
    if (region_num == PCI_ROM_SLOT) {
477 b7ee1603 Michael S. Tsirkin
        /* ROM enable bit is writeable */
478 5330de09 Michael S. Tsirkin
        wmask |= PCI_ROM_ADDRESS_ENABLE;
479 d7ce493a pbrook
    }
480 d7ce493a pbrook
    *(uint32_t *)(pci_dev->config + addr) = cpu_to_le32(type);
481 b7ee1603 Michael S. Tsirkin
    *(uint32_t *)(pci_dev->wmask + addr) = cpu_to_le32(wmask);
482 bd4b65ee Michael S. Tsirkin
    *(uint32_t *)(pci_dev->cmask + addr) = 0xffffffff;
483 69b91039 bellard
}
484 69b91039 bellard
485 0ac32c83 bellard
static void pci_update_mappings(PCIDevice *d)
486 0ac32c83 bellard
{
487 0ac32c83 bellard
    PCIIORegion *r;
488 0ac32c83 bellard
    int cmd, i;
489 5330de09 Michael S. Tsirkin
    uint32_t last_addr, new_addr;
490 3b46e624 ths
491 0ac32c83 bellard
    cmd = le16_to_cpu(*(uint16_t *)(d->config + PCI_COMMAND));
492 8a8696a3 bellard
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
493 0ac32c83 bellard
        r = &d->io_regions[i];
494 0ac32c83 bellard
        if (r->size != 0) {
495 0ac32c83 bellard
            if (r->type & PCI_ADDRESS_SPACE_IO) {
496 0ac32c83 bellard
                if (cmd & PCI_COMMAND_IO) {
497 5330de09 Michael S. Tsirkin
                    new_addr = pci_get_long(d->config + pci_bar(i));
498 0ac32c83 bellard
                    new_addr = new_addr & ~(r->size - 1);
499 0ac32c83 bellard
                    last_addr = new_addr + r->size - 1;
500 0ac32c83 bellard
                    /* NOTE: we have only 64K ioports on PC */
501 0ac32c83 bellard
                    if (last_addr <= new_addr || new_addr == 0 ||
502 0ac32c83 bellard
                        last_addr >= 0x10000) {
503 0ac32c83 bellard
                        new_addr = -1;
504 0ac32c83 bellard
                    }
505 0ac32c83 bellard
                } else {
506 0ac32c83 bellard
                    new_addr = -1;
507 0ac32c83 bellard
                }
508 0ac32c83 bellard
            } else {
509 0ac32c83 bellard
                if (cmd & PCI_COMMAND_MEMORY) {
510 5330de09 Michael S. Tsirkin
                    new_addr = pci_get_long(d->config + pci_bar(i));
511 8a8696a3 bellard
                    /* the ROM slot has a specific enable bit */
512 5330de09 Michael S. Tsirkin
                    if (i == PCI_ROM_SLOT && !(new_addr & PCI_ROM_ADDRESS_ENABLE))
513 8a8696a3 bellard
                        goto no_mem_map;
514 0ac32c83 bellard
                    new_addr = new_addr & ~(r->size - 1);
515 0ac32c83 bellard
                    last_addr = new_addr + r->size - 1;
516 0ac32c83 bellard
                    /* NOTE: we do not support wrapping */
517 0ac32c83 bellard
                    /* XXX: as we cannot support really dynamic
518 0ac32c83 bellard
                       mappings, we handle specific values as invalid
519 0ac32c83 bellard
                       mappings. */
520 0ac32c83 bellard
                    if (last_addr <= new_addr || new_addr == 0 ||
521 0ac32c83 bellard
                        last_addr == -1) {
522 0ac32c83 bellard
                        new_addr = -1;
523 0ac32c83 bellard
                    }
524 0ac32c83 bellard
                } else {
525 8a8696a3 bellard
                no_mem_map:
526 0ac32c83 bellard
                    new_addr = -1;
527 0ac32c83 bellard
                }
528 0ac32c83 bellard
            }
529 0ac32c83 bellard
            /* now do the real mapping */
530 0ac32c83 bellard
            if (new_addr != r->addr) {
531 0ac32c83 bellard
                if (r->addr != -1) {
532 0ac32c83 bellard
                    if (r->type & PCI_ADDRESS_SPACE_IO) {
533 0ac32c83 bellard
                        int class;
534 0ac32c83 bellard
                        /* NOTE: specific hack for IDE in PC case:
535 0ac32c83 bellard
                           only one byte must be mapped. */
536 5330de09 Michael S. Tsirkin
                        class = pci_get_word(d->config + PCI_CLASS_DEVICE);
537 0ac32c83 bellard
                        if (class == 0x0101 && r->size == 4) {
538 0ac32c83 bellard
                            isa_unassign_ioport(r->addr + 2, 1);
539 0ac32c83 bellard
                        } else {
540 0ac32c83 bellard
                            isa_unassign_ioport(r->addr, r->size);
541 0ac32c83 bellard
                        }
542 0ac32c83 bellard
                    } else {
543 502a5395 pbrook
                        cpu_register_physical_memory(pci_to_cpu_addr(r->addr),
544 5fafdf24 ths
                                                     r->size,
545 0ac32c83 bellard
                                                     IO_MEM_UNASSIGNED);
546 f65ed4c1 aliguori
                        qemu_unregister_coalesced_mmio(r->addr, r->size);
547 0ac32c83 bellard
                    }
548 0ac32c83 bellard
                }
549 0ac32c83 bellard
                r->addr = new_addr;
550 0ac32c83 bellard
                if (r->addr != -1) {
551 0ac32c83 bellard
                    r->map_func(d, i, r->addr, r->size, r->type);
552 0ac32c83 bellard
                }
553 0ac32c83 bellard
            }
554 0ac32c83 bellard
        }
555 0ac32c83 bellard
    }
556 0ac32c83 bellard
}
557 0ac32c83 bellard
558 5fafdf24 ths
uint32_t pci_default_read_config(PCIDevice *d,
559 0ac32c83 bellard
                                 uint32_t address, int len)
560 69b91039 bellard
{
561 0ac32c83 bellard
    uint32_t val;
562 a2d4e44b ths
563 0ac32c83 bellard
    switch(len) {
564 0ac32c83 bellard
    default:
565 0ac32c83 bellard
    case 4:
566 a2d4e44b ths
        if (address <= 0xfc) {
567 a2d4e44b ths
            val = le32_to_cpu(*(uint32_t *)(d->config + address));
568 a2d4e44b ths
            break;
569 a2d4e44b ths
        }
570 a2d4e44b ths
        /* fall through */
571 a2d4e44b ths
    case 2:
572 a2d4e44b ths
        if (address <= 0xfe) {
573 a2d4e44b ths
            val = le16_to_cpu(*(uint16_t *)(d->config + address));
574 a2d4e44b ths
            break;
575 a2d4e44b ths
        }
576 a2d4e44b ths
        /* fall through */
577 a2d4e44b ths
    case 1:
578 a2d4e44b ths
        val = d->config[address];
579 0ac32c83 bellard
        break;
580 0ac32c83 bellard
    }
581 0ac32c83 bellard
    return val;
582 0ac32c83 bellard
}
583 0ac32c83 bellard
584 b7ee1603 Michael S. Tsirkin
void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
585 0ac32c83 bellard
{
586 b7ee1603 Michael S. Tsirkin
    uint8_t orig[PCI_CONFIG_SPACE_SIZE];
587 b7ee1603 Michael S. Tsirkin
    int i;
588 0ac32c83 bellard
589 0ac32c83 bellard
    /* not efficient, but simple */
590 b7ee1603 Michael S. Tsirkin
    memcpy(orig, d->config, PCI_CONFIG_SPACE_SIZE);
591 b7ee1603 Michael S. Tsirkin
    for(i = 0; i < l && addr < PCI_CONFIG_SPACE_SIZE; val >>= 8, ++i, ++addr) {
592 b7ee1603 Michael S. Tsirkin
        uint8_t wmask = d->wmask[addr];
593 b7ee1603 Michael S. Tsirkin
        d->config[addr] = (d->config[addr] & ~wmask) | (val & wmask);
594 0ac32c83 bellard
    }
595 b7ee1603 Michael S. Tsirkin
    if (memcmp(orig + PCI_BASE_ADDRESS_0, d->config + PCI_BASE_ADDRESS_0, 24)
596 b7ee1603 Michael S. Tsirkin
        || ((orig[PCI_COMMAND] ^ d->config[PCI_COMMAND])
597 b7ee1603 Michael S. Tsirkin
            & (PCI_COMMAND_MEMORY | PCI_COMMAND_IO)))
598 0ac32c83 bellard
        pci_update_mappings(d);
599 69b91039 bellard
}
600 69b91039 bellard
601 502a5395 pbrook
void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
602 69b91039 bellard
{
603 30468f78 bellard
    PCIBus *s = opaque;
604 30468f78 bellard
    PCIDevice *pci_dev;
605 30468f78 bellard
    int config_addr, bus_num;
606 3b46e624 ths
607 d8d2e079 Isaku Yamahata
#if 0
608 d8d2e079 Isaku Yamahata
    PCI_DPRINTF("pci_data_write: addr=%08x val=%08x len=%d\n",
609 d8d2e079 Isaku Yamahata
                addr, val, len);
610 69b91039 bellard
#endif
611 502a5395 pbrook
    bus_num = (addr >> 16) & 0xff;
612 80b3ada7 pbrook
    while (s && s->bus_num != bus_num)
613 80b3ada7 pbrook
        s = s->next;
614 80b3ada7 pbrook
    if (!s)
615 69b91039 bellard
        return;
616 502a5395 pbrook
    pci_dev = s->devices[(addr >> 8) & 0xff];
617 69b91039 bellard
    if (!pci_dev)
618 69b91039 bellard
        return;
619 502a5395 pbrook
    config_addr = addr & 0xff;
620 d8d2e079 Isaku Yamahata
    PCI_DPRINTF("pci_config_write: %s: addr=%02x val=%08x len=%d\n",
621 d8d2e079 Isaku Yamahata
                pci_dev->name, config_addr, val, len);
622 0ac32c83 bellard
    pci_dev->config_write(pci_dev, config_addr, val, len);
623 69b91039 bellard
}
624 69b91039 bellard
625 502a5395 pbrook
uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
626 69b91039 bellard
{
627 30468f78 bellard
    PCIBus *s = opaque;
628 30468f78 bellard
    PCIDevice *pci_dev;
629 30468f78 bellard
    int config_addr, bus_num;
630 69b91039 bellard
    uint32_t val;
631 69b91039 bellard
632 502a5395 pbrook
    bus_num = (addr >> 16) & 0xff;
633 80b3ada7 pbrook
    while (s && s->bus_num != bus_num)
634 80b3ada7 pbrook
        s= s->next;
635 80b3ada7 pbrook
    if (!s)
636 69b91039 bellard
        goto fail;
637 502a5395 pbrook
    pci_dev = s->devices[(addr >> 8) & 0xff];
638 69b91039 bellard
    if (!pci_dev) {
639 69b91039 bellard
    fail:
640 63ce9e0a bellard
        switch(len) {
641 63ce9e0a bellard
        case 1:
642 63ce9e0a bellard
            val = 0xff;
643 63ce9e0a bellard
            break;
644 63ce9e0a bellard
        case 2:
645 63ce9e0a bellard
            val = 0xffff;
646 63ce9e0a bellard
            break;
647 63ce9e0a bellard
        default:
648 63ce9e0a bellard
        case 4:
649 63ce9e0a bellard
            val = 0xffffffff;
650 63ce9e0a bellard
            break;
651 63ce9e0a bellard
        }
652 69b91039 bellard
        goto the_end;
653 69b91039 bellard
    }
654 502a5395 pbrook
    config_addr = addr & 0xff;
655 69b91039 bellard
    val = pci_dev->config_read(pci_dev, config_addr, len);
656 d8d2e079 Isaku Yamahata
    PCI_DPRINTF("pci_config_read: %s: addr=%02x val=%08x len=%d\n",
657 d8d2e079 Isaku Yamahata
                pci_dev->name, config_addr, val, len);
658 69b91039 bellard
 the_end:
659 d8d2e079 Isaku Yamahata
#if 0
660 d8d2e079 Isaku Yamahata
    PCI_DPRINTF("pci_data_read: addr=%08x val=%08x len=%d\n",
661 d8d2e079 Isaku Yamahata
                addr, val, len);
662 69b91039 bellard
#endif
663 69b91039 bellard
    return val;
664 69b91039 bellard
}
665 69b91039 bellard
666 502a5395 pbrook
/***********************************************************/
667 502a5395 pbrook
/* generic PCI irq support */
668 30468f78 bellard
669 502a5395 pbrook
/* 0 <= irq_num <= 3. level must be 0 or 1 */
670 d537cf6c pbrook
static void pci_set_irq(void *opaque, int irq_num, int level)
671 69b91039 bellard
{
672 a60380a5 Juan Quintela
    PCIDevice *pci_dev = opaque;
673 80b3ada7 pbrook
    PCIBus *bus;
674 80b3ada7 pbrook
    int change;
675 3b46e624 ths
676 80b3ada7 pbrook
    change = level - pci_dev->irq_state[irq_num];
677 80b3ada7 pbrook
    if (!change)
678 80b3ada7 pbrook
        return;
679 d2b59317 pbrook
680 d2b59317 pbrook
    pci_dev->irq_state[irq_num] = level;
681 5e966ce6 pbrook
    for (;;) {
682 5e966ce6 pbrook
        bus = pci_dev->bus;
683 80b3ada7 pbrook
        irq_num = bus->map_irq(pci_dev, irq_num);
684 5e966ce6 pbrook
        if (bus->set_irq)
685 5e966ce6 pbrook
            break;
686 80b3ada7 pbrook
        pci_dev = bus->parent_dev;
687 80b3ada7 pbrook
    }
688 80b3ada7 pbrook
    bus->irq_count[irq_num] += change;
689 d2b59317 pbrook
    bus->set_irq(bus->irq_opaque, irq_num, bus->irq_count[irq_num] != 0);
690 69b91039 bellard
}
691 69b91039 bellard
692 502a5395 pbrook
/***********************************************************/
693 502a5395 pbrook
/* monitor info on PCI */
694 0ac32c83 bellard
695 6650ee6d pbrook
typedef struct {
696 6650ee6d pbrook
    uint16_t class;
697 6650ee6d pbrook
    const char *desc;
698 6650ee6d pbrook
} pci_class_desc;
699 6650ee6d pbrook
700 09bc878a blueswir1
static const pci_class_desc pci_class_descriptions[] =
701 6650ee6d pbrook
{
702 4ca9c76f pbrook
    { 0x0100, "SCSI controller"},
703 6650ee6d pbrook
    { 0x0101, "IDE controller"},
704 dcb5b19a ths
    { 0x0102, "Floppy controller"},
705 dcb5b19a ths
    { 0x0103, "IPI controller"},
706 dcb5b19a ths
    { 0x0104, "RAID controller"},
707 dcb5b19a ths
    { 0x0106, "SATA controller"},
708 dcb5b19a ths
    { 0x0107, "SAS controller"},
709 dcb5b19a ths
    { 0x0180, "Storage controller"},
710 6650ee6d pbrook
    { 0x0200, "Ethernet controller"},
711 dcb5b19a ths
    { 0x0201, "Token Ring controller"},
712 dcb5b19a ths
    { 0x0202, "FDDI controller"},
713 dcb5b19a ths
    { 0x0203, "ATM controller"},
714 dcb5b19a ths
    { 0x0280, "Network controller"},
715 6650ee6d pbrook
    { 0x0300, "VGA controller"},
716 dcb5b19a ths
    { 0x0301, "XGA controller"},
717 dcb5b19a ths
    { 0x0302, "3D controller"},
718 dcb5b19a ths
    { 0x0380, "Display controller"},
719 dcb5b19a ths
    { 0x0400, "Video controller"},
720 dcb5b19a ths
    { 0x0401, "Audio controller"},
721 dcb5b19a ths
    { 0x0402, "Phone"},
722 dcb5b19a ths
    { 0x0480, "Multimedia controller"},
723 dcb5b19a ths
    { 0x0500, "RAM controller"},
724 dcb5b19a ths
    { 0x0501, "Flash controller"},
725 dcb5b19a ths
    { 0x0580, "Memory controller"},
726 6650ee6d pbrook
    { 0x0600, "Host bridge"},
727 6650ee6d pbrook
    { 0x0601, "ISA bridge"},
728 dcb5b19a ths
    { 0x0602, "EISA bridge"},
729 dcb5b19a ths
    { 0x0603, "MC bridge"},
730 6650ee6d pbrook
    { 0x0604, "PCI bridge"},
731 dcb5b19a ths
    { 0x0605, "PCMCIA bridge"},
732 dcb5b19a ths
    { 0x0606, "NUBUS bridge"},
733 dcb5b19a ths
    { 0x0607, "CARDBUS bridge"},
734 dcb5b19a ths
    { 0x0608, "RACEWAY bridge"},
735 dcb5b19a ths
    { 0x0680, "Bridge"},
736 6650ee6d pbrook
    { 0x0c03, "USB controller"},
737 6650ee6d pbrook
    { 0, NULL}
738 6650ee6d pbrook
};
739 6650ee6d pbrook
740 502a5395 pbrook
static void pci_info_device(PCIDevice *d)
741 30468f78 bellard
{
742 376253ec aliguori
    Monitor *mon = cur_mon;
743 502a5395 pbrook
    int i, class;
744 502a5395 pbrook
    PCIIORegion *r;
745 09bc878a blueswir1
    const pci_class_desc *desc;
746 30468f78 bellard
747 376253ec aliguori
    monitor_printf(mon, "  Bus %2d, device %3d, function %d:\n",
748 376253ec aliguori
                   d->bus->bus_num, d->devfn >> 3, d->devfn & 7);
749 502a5395 pbrook
    class = le16_to_cpu(*((uint16_t *)(d->config + PCI_CLASS_DEVICE)));
750 376253ec aliguori
    monitor_printf(mon, "    ");
751 6650ee6d pbrook
    desc = pci_class_descriptions;
752 6650ee6d pbrook
    while (desc->desc && class != desc->class)
753 6650ee6d pbrook
        desc++;
754 6650ee6d pbrook
    if (desc->desc) {
755 376253ec aliguori
        monitor_printf(mon, "%s", desc->desc);
756 6650ee6d pbrook
    } else {
757 376253ec aliguori
        monitor_printf(mon, "Class %04x", class);
758 72cc6cfe bellard
    }
759 376253ec aliguori
    monitor_printf(mon, ": PCI device %04x:%04x\n",
760 502a5395 pbrook
           le16_to_cpu(*((uint16_t *)(d->config + PCI_VENDOR_ID))),
761 502a5395 pbrook
           le16_to_cpu(*((uint16_t *)(d->config + PCI_DEVICE_ID))));
762 30468f78 bellard
763 502a5395 pbrook
    if (d->config[PCI_INTERRUPT_PIN] != 0) {
764 376253ec aliguori
        monitor_printf(mon, "      IRQ %d.\n",
765 376253ec aliguori
                       d->config[PCI_INTERRUPT_LINE]);
766 30468f78 bellard
    }
767 80b3ada7 pbrook
    if (class == 0x0604) {
768 376253ec aliguori
        monitor_printf(mon, "      BUS %d.\n", d->config[0x19]);
769 80b3ada7 pbrook
    }
770 502a5395 pbrook
    for(i = 0;i < PCI_NUM_REGIONS; i++) {
771 502a5395 pbrook
        r = &d->io_regions[i];
772 502a5395 pbrook
        if (r->size != 0) {
773 376253ec aliguori
            monitor_printf(mon, "      BAR%d: ", i);
774 502a5395 pbrook
            if (r->type & PCI_ADDRESS_SPACE_IO) {
775 376253ec aliguori
                monitor_printf(mon, "I/O at 0x%04x [0x%04x].\n",
776 376253ec aliguori
                               r->addr, r->addr + r->size - 1);
777 502a5395 pbrook
            } else {
778 376253ec aliguori
                monitor_printf(mon, "32 bit memory at 0x%08x [0x%08x].\n",
779 376253ec aliguori
                               r->addr, r->addr + r->size - 1);
780 502a5395 pbrook
            }
781 502a5395 pbrook
        }
782 77d4bc34 bellard
    }
783 8ad12514 Gerd Hoffmann
    monitor_printf(mon, "      id \"%s\"\n", d->qdev.id ? d->qdev.id : "");
784 80b3ada7 pbrook
    if (class == 0x0604 && d->config[0x19] != 0) {
785 80b3ada7 pbrook
        pci_for_each_device(d->config[0x19], pci_info_device);
786 80b3ada7 pbrook
    }
787 384d8876 bellard
}
788 384d8876 bellard
789 80b3ada7 pbrook
void pci_for_each_device(int bus_num, void (*fn)(PCIDevice *d))
790 384d8876 bellard
{
791 502a5395 pbrook
    PCIBus *bus = first_bus;
792 384d8876 bellard
    PCIDevice *d;
793 502a5395 pbrook
    int devfn;
794 3b46e624 ths
795 80b3ada7 pbrook
    while (bus && bus->bus_num != bus_num)
796 80b3ada7 pbrook
        bus = bus->next;
797 502a5395 pbrook
    if (bus) {
798 502a5395 pbrook
        for(devfn = 0; devfn < 256; devfn++) {
799 502a5395 pbrook
            d = bus->devices[devfn];
800 502a5395 pbrook
            if (d)
801 502a5395 pbrook
                fn(d);
802 502a5395 pbrook
        }
803 f2aa58c6 bellard
    }
804 f2aa58c6 bellard
}
805 f2aa58c6 bellard
806 376253ec aliguori
void pci_info(Monitor *mon)
807 f2aa58c6 bellard
{
808 80b3ada7 pbrook
    pci_for_each_device(0, pci_info_device);
809 77d4bc34 bellard
}
810 a41b2ff2 pbrook
811 cb457d76 aliguori
static const char * const pci_nic_models[] = {
812 cb457d76 aliguori
    "ne2k_pci",
813 cb457d76 aliguori
    "i82551",
814 cb457d76 aliguori
    "i82557b",
815 cb457d76 aliguori
    "i82559er",
816 cb457d76 aliguori
    "rtl8139",
817 cb457d76 aliguori
    "e1000",
818 cb457d76 aliguori
    "pcnet",
819 cb457d76 aliguori
    "virtio",
820 cb457d76 aliguori
    NULL
821 cb457d76 aliguori
};
822 cb457d76 aliguori
823 9d07d757 Paul Brook
static const char * const pci_nic_names[] = {
824 9d07d757 Paul Brook
    "ne2k_pci",
825 9d07d757 Paul Brook
    "i82551",
826 9d07d757 Paul Brook
    "i82557b",
827 9d07d757 Paul Brook
    "i82559er",
828 9d07d757 Paul Brook
    "rtl8139",
829 9d07d757 Paul Brook
    "e1000",
830 9d07d757 Paul Brook
    "pcnet",
831 53c25cea Paul Brook
    "virtio-net-pci",
832 cb457d76 aliguori
    NULL
833 cb457d76 aliguori
};
834 cb457d76 aliguori
835 a41b2ff2 pbrook
/* Initialize a PCI NIC.  */
836 33e66b86 Markus Armbruster
/* FIXME callers should check for failure, but don't */
837 5607c388 Markus Armbruster
PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
838 5607c388 Markus Armbruster
                        const char *default_devaddr)
839 a41b2ff2 pbrook
{
840 5607c388 Markus Armbruster
    const char *devaddr = nd->devaddr ? nd->devaddr : default_devaddr;
841 07caea31 Markus Armbruster
    PCIBus *bus;
842 07caea31 Markus Armbruster
    int devfn;
843 5607c388 Markus Armbruster
    PCIDevice *pci_dev;
844 9d07d757 Paul Brook
    DeviceState *dev;
845 cb457d76 aliguori
    int i;
846 cb457d76 aliguori
847 07caea31 Markus Armbruster
    i = qemu_find_nic_model(nd, pci_nic_models, default_model);
848 07caea31 Markus Armbruster
    if (i < 0)
849 07caea31 Markus Armbruster
        return NULL;
850 07caea31 Markus Armbruster
851 07caea31 Markus Armbruster
    bus = pci_get_bus_devfn(&devfn, devaddr);
852 07caea31 Markus Armbruster
    if (!bus) {
853 07caea31 Markus Armbruster
        qemu_error("Invalid PCI device address %s for device %s\n",
854 07caea31 Markus Armbruster
                   devaddr, pci_nic_names[i]);
855 07caea31 Markus Armbruster
        return NULL;
856 07caea31 Markus Armbruster
    }
857 07caea31 Markus Armbruster
858 499cf102 Markus Armbruster
    pci_dev = pci_create(bus, devfn, pci_nic_names[i]);
859 9ee05825 Markus Armbruster
    dev = &pci_dev->qdev;
860 dea7b3b9 Mark McLoughlin
    if (nd->name)
861 dea7b3b9 Mark McLoughlin
        dev->id = qemu_strdup(nd->name);
862 1cc33683 Gerd Hoffmann
    qdev_set_nic_properties(dev, nd);
863 07caea31 Markus Armbruster
    if (qdev_init(dev) < 0)
864 07caea31 Markus Armbruster
        return NULL;
865 9ee05825 Markus Armbruster
    return pci_dev;
866 a41b2ff2 pbrook
}
867 a41b2ff2 pbrook
868 07caea31 Markus Armbruster
PCIDevice *pci_nic_init_nofail(NICInfo *nd, const char *default_model,
869 07caea31 Markus Armbruster
                               const char *default_devaddr)
870 07caea31 Markus Armbruster
{
871 07caea31 Markus Armbruster
    PCIDevice *res;
872 07caea31 Markus Armbruster
873 07caea31 Markus Armbruster
    if (qemu_show_nic_models(nd->model, pci_nic_models))
874 07caea31 Markus Armbruster
        exit(0);
875 07caea31 Markus Armbruster
876 07caea31 Markus Armbruster
    res = pci_nic_init(nd, default_model, default_devaddr);
877 07caea31 Markus Armbruster
    if (!res)
878 07caea31 Markus Armbruster
        exit(1);
879 07caea31 Markus Armbruster
    return res;
880 07caea31 Markus Armbruster
}
881 07caea31 Markus Armbruster
882 80b3ada7 pbrook
typedef struct {
883 80b3ada7 pbrook
    PCIDevice dev;
884 03587182 Gerd Hoffmann
    PCIBus bus;
885 03587182 Gerd Hoffmann
    uint32_t vid;
886 03587182 Gerd Hoffmann
    uint32_t did;
887 80b3ada7 pbrook
} PCIBridge;
888 80b3ada7 pbrook
889 9596ebb7 pbrook
static void pci_bridge_write_config(PCIDevice *d,
890 80b3ada7 pbrook
                             uint32_t address, uint32_t val, int len)
891 80b3ada7 pbrook
{
892 80b3ada7 pbrook
    PCIBridge *s = (PCIBridge *)d;
893 80b3ada7 pbrook
894 80b3ada7 pbrook
    pci_default_write_config(d, address, val, len);
895 03587182 Gerd Hoffmann
    s->bus.bus_num = d->config[PCI_SECONDARY_BUS];
896 80b3ada7 pbrook
}
897 80b3ada7 pbrook
898 3ae80618 aliguori
PCIBus *pci_find_bus(int bus_num)
899 3ae80618 aliguori
{
900 3ae80618 aliguori
    PCIBus *bus = first_bus;
901 3ae80618 aliguori
902 3ae80618 aliguori
    while (bus && bus->bus_num != bus_num)
903 3ae80618 aliguori
        bus = bus->next;
904 3ae80618 aliguori
905 3ae80618 aliguori
    return bus;
906 3ae80618 aliguori
}
907 3ae80618 aliguori
908 3ae80618 aliguori
PCIDevice *pci_find_device(int bus_num, int slot, int function)
909 3ae80618 aliguori
{
910 3ae80618 aliguori
    PCIBus *bus = pci_find_bus(bus_num);
911 3ae80618 aliguori
912 3ae80618 aliguori
    if (!bus)
913 3ae80618 aliguori
        return NULL;
914 3ae80618 aliguori
915 3ae80618 aliguori
    return bus->devices[PCI_DEVFN(slot, function)];
916 3ae80618 aliguori
}
917 3ae80618 aliguori
918 03587182 Gerd Hoffmann
static int pci_bridge_initfn(PCIDevice *dev)
919 80b3ada7 pbrook
{
920 03587182 Gerd Hoffmann
    PCIBridge *s = DO_UPCAST(PCIBridge, dev, dev);
921 480b9f24 blueswir1
922 03587182 Gerd Hoffmann
    pci_config_set_vendor_id(s->dev.config, s->vid);
923 03587182 Gerd Hoffmann
    pci_config_set_device_id(s->dev.config, s->did);
924 480b9f24 blueswir1
925 80b3ada7 pbrook
    s->dev.config[0x04] = 0x06; // command = bus master, pci mem
926 80b3ada7 pbrook
    s->dev.config[0x05] = 0x00;
927 80b3ada7 pbrook
    s->dev.config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error
928 80b3ada7 pbrook
    s->dev.config[0x07] = 0x00; // status = fast devsel
929 80b3ada7 pbrook
    s->dev.config[0x08] = 0x00; // revision
930 80b3ada7 pbrook
    s->dev.config[0x09] = 0x00; // programming i/f
931 173a543b blueswir1
    pci_config_set_class(s->dev.config, PCI_CLASS_BRIDGE_PCI);
932 80b3ada7 pbrook
    s->dev.config[0x0D] = 0x10; // latency_timer
933 6407f373 Isaku Yamahata
    s->dev.config[PCI_HEADER_TYPE] =
934 6407f373 Isaku Yamahata
        PCI_HEADER_TYPE_MULTI_FUNCTION | PCI_HEADER_TYPE_BRIDGE; // header_type
935 80b3ada7 pbrook
    s->dev.config[0x1E] = 0xa0; // secondary status
936 03587182 Gerd Hoffmann
    return 0;
937 03587182 Gerd Hoffmann
}
938 80b3ada7 pbrook
939 03587182 Gerd Hoffmann
PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
940 03587182 Gerd Hoffmann
                        pci_map_irq_fn map_irq, const char *name)
941 03587182 Gerd Hoffmann
{
942 03587182 Gerd Hoffmann
    PCIDevice *dev;
943 03587182 Gerd Hoffmann
    PCIBridge *s;
944 03587182 Gerd Hoffmann
945 499cf102 Markus Armbruster
    dev = pci_create(bus, devfn, "pci-bridge");
946 03587182 Gerd Hoffmann
    qdev_prop_set_uint32(&dev->qdev, "vendorid", vid);
947 03587182 Gerd Hoffmann
    qdev_prop_set_uint32(&dev->qdev, "deviceid", did);
948 e23a1b33 Markus Armbruster
    qdev_init_nofail(&dev->qdev);
949 03587182 Gerd Hoffmann
950 03587182 Gerd Hoffmann
    s = DO_UPCAST(PCIBridge, dev, dev);
951 03587182 Gerd Hoffmann
    pci_register_secondary_bus(&s->bus, &s->dev, map_irq, name);
952 03587182 Gerd Hoffmann
    return &s->bus;
953 80b3ada7 pbrook
}
954 6b1b92d3 Paul Brook
955 81a322d4 Gerd Hoffmann
static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
956 6b1b92d3 Paul Brook
{
957 6b1b92d3 Paul Brook
    PCIDevice *pci_dev = (PCIDevice *)qdev;
958 02e2da45 Paul Brook
    PCIDeviceInfo *info = container_of(base, PCIDeviceInfo, qdev);
959 6b1b92d3 Paul Brook
    PCIBus *bus;
960 ee995ffb Gerd Hoffmann
    int devfn, rc;
961 6b1b92d3 Paul Brook
962 02e2da45 Paul Brook
    bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev));
963 ee6847d1 Gerd Hoffmann
    devfn = pci_dev->devfn;
964 16eaedf2 Gerd Hoffmann
    pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn,
965 0aab0d3a Gerd Hoffmann
                                     info->config_read, info->config_write);
966 6b1b92d3 Paul Brook
    assert(pci_dev);
967 ee995ffb Gerd Hoffmann
    rc = info->init(pci_dev);
968 ee995ffb Gerd Hoffmann
    if (rc != 0)
969 ee995ffb Gerd Hoffmann
        return rc;
970 ee995ffb Gerd Hoffmann
    if (qdev->hotplugged)
971 ee995ffb Gerd Hoffmann
        bus->hotplug(pci_dev, 1);
972 ee995ffb Gerd Hoffmann
    return 0;
973 ee995ffb Gerd Hoffmann
}
974 ee995ffb Gerd Hoffmann
975 ee995ffb Gerd Hoffmann
static int pci_unplug_device(DeviceState *qdev)
976 ee995ffb Gerd Hoffmann
{
977 ee995ffb Gerd Hoffmann
    PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
978 ee995ffb Gerd Hoffmann
979 ee995ffb Gerd Hoffmann
    dev->bus->hotplug(dev, 0);
980 ee995ffb Gerd Hoffmann
    return 0;
981 6b1b92d3 Paul Brook
}
982 6b1b92d3 Paul Brook
983 0aab0d3a Gerd Hoffmann
void pci_qdev_register(PCIDeviceInfo *info)
984 6b1b92d3 Paul Brook
{
985 02e2da45 Paul Brook
    info->qdev.init = pci_qdev_init;
986 ee995ffb Gerd Hoffmann
    info->qdev.unplug = pci_unplug_device;
987 a36a344d Gerd Hoffmann
    info->qdev.exit = pci_unregister_device;
988 10c4c98a Gerd Hoffmann
    info->qdev.bus_info = &pci_bus_info;
989 074f2fff Gerd Hoffmann
    qdev_register(&info->qdev);
990 6b1b92d3 Paul Brook
}
991 6b1b92d3 Paul Brook
992 0aab0d3a Gerd Hoffmann
void pci_qdev_register_many(PCIDeviceInfo *info)
993 0aab0d3a Gerd Hoffmann
{
994 0aab0d3a Gerd Hoffmann
    while (info->qdev.name) {
995 0aab0d3a Gerd Hoffmann
        pci_qdev_register(info);
996 0aab0d3a Gerd Hoffmann
        info++;
997 0aab0d3a Gerd Hoffmann
    }
998 0aab0d3a Gerd Hoffmann
}
999 0aab0d3a Gerd Hoffmann
1000 499cf102 Markus Armbruster
PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name)
1001 6b1b92d3 Paul Brook
{
1002 6b1b92d3 Paul Brook
    DeviceState *dev;
1003 6b1b92d3 Paul Brook
1004 02e2da45 Paul Brook
    dev = qdev_create(&bus->qbus, name);
1005 a6307b08 Gerd Hoffmann
    qdev_prop_set_uint32(dev, "addr", devfn);
1006 71077c1c Gerd Hoffmann
    return DO_UPCAST(PCIDevice, qdev, dev);
1007 71077c1c Gerd Hoffmann
}
1008 6b1b92d3 Paul Brook
1009 71077c1c Gerd Hoffmann
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
1010 71077c1c Gerd Hoffmann
{
1011 499cf102 Markus Armbruster
    PCIDevice *dev = pci_create(bus, devfn, name);
1012 e23a1b33 Markus Armbruster
    qdev_init_nofail(&dev->qdev);
1013 71077c1c Gerd Hoffmann
    return dev;
1014 6b1b92d3 Paul Brook
}
1015 6f4cbd39 Michael S. Tsirkin
1016 6f4cbd39 Michael S. Tsirkin
static int pci_find_space(PCIDevice *pdev, uint8_t size)
1017 6f4cbd39 Michael S. Tsirkin
{
1018 6f4cbd39 Michael S. Tsirkin
    int offset = PCI_CONFIG_HEADER_SIZE;
1019 6f4cbd39 Michael S. Tsirkin
    int i;
1020 6f4cbd39 Michael S. Tsirkin
    for (i = PCI_CONFIG_HEADER_SIZE; i < PCI_CONFIG_SPACE_SIZE; ++i)
1021 6f4cbd39 Michael S. Tsirkin
        if (pdev->used[i])
1022 6f4cbd39 Michael S. Tsirkin
            offset = i + 1;
1023 6f4cbd39 Michael S. Tsirkin
        else if (i - offset + 1 == size)
1024 6f4cbd39 Michael S. Tsirkin
            return offset;
1025 6f4cbd39 Michael S. Tsirkin
    return 0;
1026 6f4cbd39 Michael S. Tsirkin
}
1027 6f4cbd39 Michael S. Tsirkin
1028 6f4cbd39 Michael S. Tsirkin
static uint8_t pci_find_capability_list(PCIDevice *pdev, uint8_t cap_id,
1029 6f4cbd39 Michael S. Tsirkin
                                        uint8_t *prev_p)
1030 6f4cbd39 Michael S. Tsirkin
{
1031 6f4cbd39 Michael S. Tsirkin
    uint8_t next, prev;
1032 6f4cbd39 Michael S. Tsirkin
1033 6f4cbd39 Michael S. Tsirkin
    if (!(pdev->config[PCI_STATUS] & PCI_STATUS_CAP_LIST))
1034 6f4cbd39 Michael S. Tsirkin
        return 0;
1035 6f4cbd39 Michael S. Tsirkin
1036 6f4cbd39 Michael S. Tsirkin
    for (prev = PCI_CAPABILITY_LIST; (next = pdev->config[prev]);
1037 6f4cbd39 Michael S. Tsirkin
         prev = next + PCI_CAP_LIST_NEXT)
1038 6f4cbd39 Michael S. Tsirkin
        if (pdev->config[next + PCI_CAP_LIST_ID] == cap_id)
1039 6f4cbd39 Michael S. Tsirkin
            break;
1040 6f4cbd39 Michael S. Tsirkin
1041 6f4cbd39 Michael S. Tsirkin
    if (prev_p)
1042 6f4cbd39 Michael S. Tsirkin
        *prev_p = prev;
1043 6f4cbd39 Michael S. Tsirkin
    return next;
1044 6f4cbd39 Michael S. Tsirkin
}
1045 6f4cbd39 Michael S. Tsirkin
1046 6f4cbd39 Michael S. Tsirkin
/* Reserve space and add capability to the linked list in pci config space */
1047 6f4cbd39 Michael S. Tsirkin
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
1048 6f4cbd39 Michael S. Tsirkin
{
1049 6f4cbd39 Michael S. Tsirkin
    uint8_t offset = pci_find_space(pdev, size);
1050 6f4cbd39 Michael S. Tsirkin
    uint8_t *config = pdev->config + offset;
1051 6f4cbd39 Michael S. Tsirkin
    if (!offset)
1052 6f4cbd39 Michael S. Tsirkin
        return -ENOSPC;
1053 6f4cbd39 Michael S. Tsirkin
    config[PCI_CAP_LIST_ID] = cap_id;
1054 6f4cbd39 Michael S. Tsirkin
    config[PCI_CAP_LIST_NEXT] = pdev->config[PCI_CAPABILITY_LIST];
1055 6f4cbd39 Michael S. Tsirkin
    pdev->config[PCI_CAPABILITY_LIST] = offset;
1056 6f4cbd39 Michael S. Tsirkin
    pdev->config[PCI_STATUS] |= PCI_STATUS_CAP_LIST;
1057 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0xFF, size);
1058 6f4cbd39 Michael S. Tsirkin
    /* Make capability read-only by default */
1059 6f4cbd39 Michael S. Tsirkin
    memset(pdev->wmask + offset, 0, size);
1060 bd4b65ee Michael S. Tsirkin
    /* Check capability by default */
1061 bd4b65ee Michael S. Tsirkin
    memset(pdev->cmask + offset, 0xFF, size);
1062 6f4cbd39 Michael S. Tsirkin
    return offset;
1063 6f4cbd39 Michael S. Tsirkin
}
1064 6f4cbd39 Michael S. Tsirkin
1065 6f4cbd39 Michael S. Tsirkin
/* Unlink capability from the pci config space. */
1066 6f4cbd39 Michael S. Tsirkin
void pci_del_capability(PCIDevice *pdev, uint8_t cap_id, uint8_t size)
1067 6f4cbd39 Michael S. Tsirkin
{
1068 6f4cbd39 Michael S. Tsirkin
    uint8_t prev, offset = pci_find_capability_list(pdev, cap_id, &prev);
1069 6f4cbd39 Michael S. Tsirkin
    if (!offset)
1070 6f4cbd39 Michael S. Tsirkin
        return;
1071 6f4cbd39 Michael S. Tsirkin
    pdev->config[prev] = pdev->config[offset + PCI_CAP_LIST_NEXT];
1072 6f4cbd39 Michael S. Tsirkin
    /* Make capability writeable again */
1073 6f4cbd39 Michael S. Tsirkin
    memset(pdev->wmask + offset, 0xff, size);
1074 bd4b65ee Michael S. Tsirkin
    /* Clear cmask as device-specific registers can't be checked */
1075 bd4b65ee Michael S. Tsirkin
    memset(pdev->cmask + offset, 0, size);
1076 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0, size);
1077 6f4cbd39 Michael S. Tsirkin
1078 6f4cbd39 Michael S. Tsirkin
    if (!pdev->config[PCI_CAPABILITY_LIST])
1079 6f4cbd39 Michael S. Tsirkin
        pdev->config[PCI_STATUS] &= ~PCI_STATUS_CAP_LIST;
1080 6f4cbd39 Michael S. Tsirkin
}
1081 6f4cbd39 Michael S. Tsirkin
1082 6f4cbd39 Michael S. Tsirkin
/* Reserve space for capability at a known offset (to call after load). */
1083 6f4cbd39 Michael S. Tsirkin
void pci_reserve_capability(PCIDevice *pdev, uint8_t offset, uint8_t size)
1084 6f4cbd39 Michael S. Tsirkin
{
1085 6f4cbd39 Michael S. Tsirkin
    memset(pdev->used + offset, 0xff, size);
1086 6f4cbd39 Michael S. Tsirkin
}
1087 6f4cbd39 Michael S. Tsirkin
1088 6f4cbd39 Michael S. Tsirkin
uint8_t pci_find_capability(PCIDevice *pdev, uint8_t cap_id)
1089 6f4cbd39 Michael S. Tsirkin
{
1090 6f4cbd39 Michael S. Tsirkin
    return pci_find_capability_list(pdev, cap_id, NULL);
1091 6f4cbd39 Michael S. Tsirkin
}
1092 10c4c98a Gerd Hoffmann
1093 10c4c98a Gerd Hoffmann
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
1094 10c4c98a Gerd Hoffmann
{
1095 10c4c98a Gerd Hoffmann
    PCIDevice *d = (PCIDevice *)dev;
1096 10c4c98a Gerd Hoffmann
    const pci_class_desc *desc;
1097 10c4c98a Gerd Hoffmann
    char ctxt[64];
1098 10c4c98a Gerd Hoffmann
    PCIIORegion *r;
1099 10c4c98a Gerd Hoffmann
    int i, class;
1100 10c4c98a Gerd Hoffmann
1101 10c4c98a Gerd Hoffmann
    class = le16_to_cpu(*((uint16_t *)(d->config + PCI_CLASS_DEVICE)));
1102 10c4c98a Gerd Hoffmann
    desc = pci_class_descriptions;
1103 10c4c98a Gerd Hoffmann
    while (desc->desc && class != desc->class)
1104 10c4c98a Gerd Hoffmann
        desc++;
1105 10c4c98a Gerd Hoffmann
    if (desc->desc) {
1106 10c4c98a Gerd Hoffmann
        snprintf(ctxt, sizeof(ctxt), "%s", desc->desc);
1107 10c4c98a Gerd Hoffmann
    } else {
1108 10c4c98a Gerd Hoffmann
        snprintf(ctxt, sizeof(ctxt), "Class %04x", class);
1109 10c4c98a Gerd Hoffmann
    }
1110 10c4c98a Gerd Hoffmann
1111 10c4c98a Gerd Hoffmann
    monitor_printf(mon, "%*sclass %s, addr %02x:%02x.%x, "
1112 10c4c98a Gerd Hoffmann
                   "pci id %04x:%04x (sub %04x:%04x)\n",
1113 10c4c98a Gerd Hoffmann
                   indent, "", ctxt,
1114 10c4c98a Gerd Hoffmann
                   d->bus->bus_num, d->devfn >> 3, d->devfn & 7,
1115 10c4c98a Gerd Hoffmann
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_VENDOR_ID))),
1116 10c4c98a Gerd Hoffmann
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_DEVICE_ID))),
1117 10c4c98a Gerd Hoffmann
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_SUBSYSTEM_VENDOR_ID))),
1118 10c4c98a Gerd Hoffmann
                   le16_to_cpu(*((uint16_t *)(d->config + PCI_SUBSYSTEM_ID))));
1119 10c4c98a Gerd Hoffmann
    for (i = 0; i < PCI_NUM_REGIONS; i++) {
1120 10c4c98a Gerd Hoffmann
        r = &d->io_regions[i];
1121 10c4c98a Gerd Hoffmann
        if (!r->size)
1122 10c4c98a Gerd Hoffmann
            continue;
1123 10c4c98a Gerd Hoffmann
        monitor_printf(mon, "%*sbar %d: %s at 0x%x [0x%x]\n", indent, "",
1124 10c4c98a Gerd Hoffmann
                       i, r->type & PCI_ADDRESS_SPACE_IO ? "i/o" : "mem",
1125 10c4c98a Gerd Hoffmann
                       r->addr, r->addr + r->size - 1);
1126 10c4c98a Gerd Hoffmann
    }
1127 10c4c98a Gerd Hoffmann
}
1128 03587182 Gerd Hoffmann
1129 03587182 Gerd Hoffmann
static PCIDeviceInfo bridge_info = {
1130 03587182 Gerd Hoffmann
    .qdev.name    = "pci-bridge",
1131 03587182 Gerd Hoffmann
    .qdev.size    = sizeof(PCIBridge),
1132 03587182 Gerd Hoffmann
    .init         = pci_bridge_initfn,
1133 03587182 Gerd Hoffmann
    .config_write = pci_bridge_write_config,
1134 03587182 Gerd Hoffmann
    .qdev.props   = (Property[]) {
1135 03587182 Gerd Hoffmann
        DEFINE_PROP_HEX32("vendorid", PCIBridge, vid, 0),
1136 03587182 Gerd Hoffmann
        DEFINE_PROP_HEX32("deviceid", PCIBridge, did, 0),
1137 03587182 Gerd Hoffmann
        DEFINE_PROP_END_OF_LIST(),
1138 03587182 Gerd Hoffmann
    }
1139 03587182 Gerd Hoffmann
};
1140 03587182 Gerd Hoffmann
1141 03587182 Gerd Hoffmann
static void pci_register_devices(void)
1142 03587182 Gerd Hoffmann
{
1143 03587182 Gerd Hoffmann
    pci_qdev_register(&bridge_info);
1144 03587182 Gerd Hoffmann
}
1145 03587182 Gerd Hoffmann
1146 03587182 Gerd Hoffmann
device_init(pci_register_devices)