Statistics
| Branch: | Revision:

root / hw / empty_slot.c @ 1f51470d

History | View | Annotate | Download (2.3 kB)

1 da9fcfa5 Artyom Tarasenko
/*
2 da9fcfa5 Artyom Tarasenko
 * QEMU Empty Slot
3 da9fcfa5 Artyom Tarasenko
 *
4 da9fcfa5 Artyom Tarasenko
 * The empty_slot device emulates known to a bus but not connected devices.
5 da9fcfa5 Artyom Tarasenko
 *
6 da9fcfa5 Artyom Tarasenko
 * Copyright (c) 2010 Artyom Tarasenko
7 da9fcfa5 Artyom Tarasenko
 *
8 da9fcfa5 Artyom Tarasenko
 * This code is licensed under the GNU GPL v2 or (at your option) any later
9 da9fcfa5 Artyom Tarasenko
 * version.
10 da9fcfa5 Artyom Tarasenko
 */
11 da9fcfa5 Artyom Tarasenko
12 da9fcfa5 Artyom Tarasenko
#include "hw.h"
13 da9fcfa5 Artyom Tarasenko
#include "sysbus.h"
14 da9fcfa5 Artyom Tarasenko
#include "empty_slot.h"
15 da9fcfa5 Artyom Tarasenko
16 da9fcfa5 Artyom Tarasenko
//#define DEBUG_EMPTY_SLOT
17 da9fcfa5 Artyom Tarasenko
18 da9fcfa5 Artyom Tarasenko
#ifdef DEBUG_EMPTY_SLOT
19 da9fcfa5 Artyom Tarasenko
#define DPRINTF(fmt, ...)                                       \
20 da9fcfa5 Artyom Tarasenko
    do { printf("empty_slot: " fmt , ## __VA_ARGS__); } while (0)
21 da9fcfa5 Artyom Tarasenko
#else
22 da9fcfa5 Artyom Tarasenko
#define DPRINTF(fmt, ...) do {} while (0)
23 da9fcfa5 Artyom Tarasenko
#endif
24 da9fcfa5 Artyom Tarasenko
25 da9fcfa5 Artyom Tarasenko
typedef struct EmptySlot {
26 da9fcfa5 Artyom Tarasenko
    SysBusDevice busdev;
27 b0a941b0 Avi Kivity
    MemoryRegion iomem;
28 da9fcfa5 Artyom Tarasenko
    uint64_t size;
29 da9fcfa5 Artyom Tarasenko
} EmptySlot;
30 da9fcfa5 Artyom Tarasenko
31 b0a941b0 Avi Kivity
static uint64_t empty_slot_read(void *opaque, target_phys_addr_t addr,
32 b0a941b0 Avi Kivity
                                unsigned size)
33 da9fcfa5 Artyom Tarasenko
{
34 da9fcfa5 Artyom Tarasenko
    DPRINTF("read from " TARGET_FMT_plx "\n", addr);
35 da9fcfa5 Artyom Tarasenko
    return 0;
36 da9fcfa5 Artyom Tarasenko
}
37 da9fcfa5 Artyom Tarasenko
38 b0a941b0 Avi Kivity
static void empty_slot_write(void *opaque, target_phys_addr_t addr,
39 b0a941b0 Avi Kivity
                             uint64_t val, unsigned size)
40 da9fcfa5 Artyom Tarasenko
{
41 b0a941b0 Avi Kivity
    DPRINTF("write 0x%x to " TARGET_FMT_plx "\n", (unsigned)val, addr);
42 da9fcfa5 Artyom Tarasenko
}
43 da9fcfa5 Artyom Tarasenko
44 b0a941b0 Avi Kivity
static const MemoryRegionOps empty_slot_ops = {
45 b0a941b0 Avi Kivity
    .read = empty_slot_read,
46 b0a941b0 Avi Kivity
    .write = empty_slot_write,
47 b0a941b0 Avi Kivity
    .endianness = DEVICE_NATIVE_ENDIAN,
48 da9fcfa5 Artyom Tarasenko
};
49 da9fcfa5 Artyom Tarasenko
50 da9fcfa5 Artyom Tarasenko
void empty_slot_init(target_phys_addr_t addr, uint64_t slot_size)
51 da9fcfa5 Artyom Tarasenko
{
52 1a00282a Stefan Weil
    if (slot_size > 0) {
53 1a00282a Stefan Weil
        /* Only empty slots larger than 0 byte need handling. */
54 1a00282a Stefan Weil
        DeviceState *dev;
55 1a00282a Stefan Weil
        SysBusDevice *s;
56 1a00282a Stefan Weil
        EmptySlot *e;
57 da9fcfa5 Artyom Tarasenko
58 1a00282a Stefan Weil
        dev = qdev_create(NULL, "empty_slot");
59 1a00282a Stefan Weil
        s = sysbus_from_qdev(dev);
60 1a00282a Stefan Weil
        e = FROM_SYSBUS(EmptySlot, s);
61 1a00282a Stefan Weil
        e->size = slot_size;
62 da9fcfa5 Artyom Tarasenko
63 1a00282a Stefan Weil
        qdev_init_nofail(dev);
64 da9fcfa5 Artyom Tarasenko
65 1a00282a Stefan Weil
        sysbus_mmio_map(s, 0, addr);
66 1a00282a Stefan Weil
    }
67 da9fcfa5 Artyom Tarasenko
}
68 da9fcfa5 Artyom Tarasenko
69 da9fcfa5 Artyom Tarasenko
static int empty_slot_init1(SysBusDevice *dev)
70 da9fcfa5 Artyom Tarasenko
{
71 da9fcfa5 Artyom Tarasenko
    EmptySlot *s = FROM_SYSBUS(EmptySlot, dev);
72 da9fcfa5 Artyom Tarasenko
73 b0a941b0 Avi Kivity
    memory_region_init_io(&s->iomem, &empty_slot_ops, s,
74 b0a941b0 Avi Kivity
                          "empty-slot", s->size);
75 750ecd44 Avi Kivity
    sysbus_init_mmio(dev, &s->iomem);
76 da9fcfa5 Artyom Tarasenko
    return 0;
77 da9fcfa5 Artyom Tarasenko
}
78 da9fcfa5 Artyom Tarasenko
79 999e12bb Anthony Liguori
static void empty_slot_class_init(ObjectClass *klass, void *data)
80 999e12bb Anthony Liguori
{
81 999e12bb Anthony Liguori
    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
82 999e12bb Anthony Liguori
83 999e12bb Anthony Liguori
    k->init = empty_slot_init1;
84 999e12bb Anthony Liguori
}
85 999e12bb Anthony Liguori
86 39bffca2 Anthony Liguori
static TypeInfo empty_slot_info = {
87 39bffca2 Anthony Liguori
    .name          = "empty_slot",
88 39bffca2 Anthony Liguori
    .parent        = TYPE_SYS_BUS_DEVICE,
89 39bffca2 Anthony Liguori
    .instance_size = sizeof(EmptySlot),
90 39bffca2 Anthony Liguori
    .class_init    = empty_slot_class_init,
91 da9fcfa5 Artyom Tarasenko
};
92 da9fcfa5 Artyom Tarasenko
93 83f7d43a Andreas Färber
static void empty_slot_register_types(void)
94 da9fcfa5 Artyom Tarasenko
{
95 39bffca2 Anthony Liguori
    type_register_static(&empty_slot_info);
96 da9fcfa5 Artyom Tarasenko
}
97 da9fcfa5 Artyom Tarasenko
98 83f7d43a Andreas Färber
type_init(empty_slot_register_types)