diff options
author | Artyom Tarasenko <atar4qemu@googlemail.com> | 2010-04-17 01:10:04 +0200 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2010-04-18 08:55:12 +0000 |
commit | da9fcfa54486797a5f261b43ad0c0b2f8dc47181 (patch) | |
tree | b06df9085333d963ef379883c65894e63a98245e | |
parent | 3c83eb4f17ffa981cb60b965087769b808062a3a (diff) |
create empty_slot device
The empty_slot device emulates known to a bus but not connected devices.
Signed-off-by: Artyom Tarasenko <atar4qemu@gmail.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
-rw-r--r-- | hw/empty_slot.c | 92 | ||||
-rw-r--r-- | hw/empty_slot.h | 2 |
2 files changed, 94 insertions, 0 deletions
diff --git a/hw/empty_slot.c b/hw/empty_slot.c new file mode 100644 index 0000000000..ac1f6ebbf5 --- /dev/null +++ b/hw/empty_slot.c @@ -0,0 +1,92 @@ +/* + * QEMU Empty Slot + * + * The empty_slot device emulates known to a bus but not connected devices. + * + * Copyright (c) 2010 Artyom Tarasenko + * + * This code is licensed under the GNU GPL v2 or (at your option) any later + * version. + */ + +#include "hw.h" +#include "sysbus.h" +#include "empty_slot.h" + +//#define DEBUG_EMPTY_SLOT + +#ifdef DEBUG_EMPTY_SLOT +#define DPRINTF(fmt, ...) \ + do { printf("empty_slot: " fmt , ## __VA_ARGS__); } while (0) +#else +#define DPRINTF(fmt, ...) do {} while (0) +#endif + +typedef struct EmptySlot { + SysBusDevice busdev; + uint64_t size; +} EmptySlot; + +static uint32_t empty_slot_readl(void *opaque, target_phys_addr_t addr) +{ + DPRINTF("read from " TARGET_FMT_plx "\n", addr); + return 0; +} + +static void empty_slot_writel(void *opaque, target_phys_addr_t addr, + uint32_t val) +{ + DPRINTF("write 0x%x to " TARGET_FMT_plx "\n", val, addr); +} + +CPUReadMemoryFunc * const empty_slot_read[3] = { + empty_slot_readl, + empty_slot_readl, + empty_slot_readl, +}; + +static CPUWriteMemoryFunc * const empty_slot_write[3] = { + empty_slot_writel, + empty_slot_writel, + empty_slot_writel, +}; + +void empty_slot_init(target_phys_addr_t addr, uint64_t slot_size) +{ + DeviceState *dev; + SysBusDevice *s; + EmptySlot *e; + + dev = qdev_create(NULL, "empty_slot"); + s = sysbus_from_qdev(dev); + e = FROM_SYSBUS(EmptySlot, s); + e->size = slot_size; + + qdev_init_nofail(dev); + + sysbus_mmio_map(s, 0, addr); +} + +static int empty_slot_init1(SysBusDevice *dev) +{ + EmptySlot *s = FROM_SYSBUS(EmptySlot, dev); + ram_addr_t empty_slot_offset; + + empty_slot_offset = cpu_register_io_memory(empty_slot_read, + empty_slot_write, s); + sysbus_init_mmio(dev, s->size, empty_slot_offset | IO_MEM_RAM); + return 0; +} + +static SysBusDeviceInfo empty_slot_info = { + .init = empty_slot_init1, + .qdev.name = "empty_slot", + .qdev.size = sizeof(EmptySlot), +}; + +static void empty_slot_register_devices(void) +{ + sysbus_register_withprop(&empty_slot_info); +} + +device_init(empty_slot_register_devices); diff --git a/hw/empty_slot.h b/hw/empty_slot.h new file mode 100644 index 0000000000..78dc91de10 --- /dev/null +++ b/hw/empty_slot.h @@ -0,0 +1,2 @@ +/* empty_slot.c */ +void empty_slot_init(target_phys_addr_t addr, uint64_t slot_size); |