root / hw / empty_slot.c @ 9f506893
History | View | Annotate | Download (2.1 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 | da9fcfa5 | Artyom Tarasenko | uint64_t size; |
28 | da9fcfa5 | Artyom Tarasenko | } EmptySlot; |
29 | da9fcfa5 | Artyom Tarasenko | |
30 | da9fcfa5 | Artyom Tarasenko | static uint32_t empty_slot_readl(void *opaque, target_phys_addr_t addr) |
31 | da9fcfa5 | Artyom Tarasenko | { |
32 | da9fcfa5 | Artyom Tarasenko | DPRINTF("read from " TARGET_FMT_plx "\n", addr); |
33 | da9fcfa5 | Artyom Tarasenko | return 0; |
34 | da9fcfa5 | Artyom Tarasenko | } |
35 | da9fcfa5 | Artyom Tarasenko | |
36 | da9fcfa5 | Artyom Tarasenko | static void empty_slot_writel(void *opaque, target_phys_addr_t addr, |
37 | da9fcfa5 | Artyom Tarasenko | uint32_t val) |
38 | da9fcfa5 | Artyom Tarasenko | { |
39 | da9fcfa5 | Artyom Tarasenko | DPRINTF("write 0x%x to " TARGET_FMT_plx "\n", val, addr); |
40 | da9fcfa5 | Artyom Tarasenko | } |
41 | da9fcfa5 | Artyom Tarasenko | |
42 | da9fcfa5 | Artyom Tarasenko | CPUReadMemoryFunc * const empty_slot_read[3] = { |
43 | da9fcfa5 | Artyom Tarasenko | empty_slot_readl, |
44 | da9fcfa5 | Artyom Tarasenko | empty_slot_readl, |
45 | da9fcfa5 | Artyom Tarasenko | empty_slot_readl, |
46 | da9fcfa5 | Artyom Tarasenko | }; |
47 | da9fcfa5 | Artyom Tarasenko | |
48 | da9fcfa5 | Artyom Tarasenko | static CPUWriteMemoryFunc * const empty_slot_write[3] = { |
49 | da9fcfa5 | Artyom Tarasenko | empty_slot_writel, |
50 | da9fcfa5 | Artyom Tarasenko | empty_slot_writel, |
51 | da9fcfa5 | Artyom Tarasenko | empty_slot_writel, |
52 | da9fcfa5 | Artyom Tarasenko | }; |
53 | da9fcfa5 | Artyom Tarasenko | |
54 | da9fcfa5 | Artyom Tarasenko | void empty_slot_init(target_phys_addr_t addr, uint64_t slot_size)
|
55 | da9fcfa5 | Artyom Tarasenko | { |
56 | da9fcfa5 | Artyom Tarasenko | DeviceState *dev; |
57 | da9fcfa5 | Artyom Tarasenko | SysBusDevice *s; |
58 | da9fcfa5 | Artyom Tarasenko | EmptySlot *e; |
59 | da9fcfa5 | Artyom Tarasenko | |
60 | da9fcfa5 | Artyom Tarasenko | dev = qdev_create(NULL, "empty_slot"); |
61 | da9fcfa5 | Artyom Tarasenko | s = sysbus_from_qdev(dev); |
62 | da9fcfa5 | Artyom Tarasenko | e = FROM_SYSBUS(EmptySlot, s); |
63 | da9fcfa5 | Artyom Tarasenko | e->size = slot_size; |
64 | da9fcfa5 | Artyom Tarasenko | |
65 | da9fcfa5 | Artyom Tarasenko | qdev_init_nofail(dev); |
66 | da9fcfa5 | Artyom Tarasenko | |
67 | da9fcfa5 | Artyom Tarasenko | sysbus_mmio_map(s, 0, addr);
|
68 | da9fcfa5 | Artyom Tarasenko | } |
69 | da9fcfa5 | Artyom Tarasenko | |
70 | da9fcfa5 | Artyom Tarasenko | static int empty_slot_init1(SysBusDevice *dev) |
71 | da9fcfa5 | Artyom Tarasenko | { |
72 | da9fcfa5 | Artyom Tarasenko | EmptySlot *s = FROM_SYSBUS(EmptySlot, dev); |
73 | da9fcfa5 | Artyom Tarasenko | ram_addr_t empty_slot_offset; |
74 | da9fcfa5 | Artyom Tarasenko | |
75 | da9fcfa5 | Artyom Tarasenko | empty_slot_offset = cpu_register_io_memory(empty_slot_read, |
76 | da9fcfa5 | Artyom Tarasenko | empty_slot_write, s); |
77 | da9fcfa5 | Artyom Tarasenko | sysbus_init_mmio(dev, s->size, empty_slot_offset | IO_MEM_RAM); |
78 | da9fcfa5 | Artyom Tarasenko | return 0; |
79 | da9fcfa5 | Artyom Tarasenko | } |
80 | da9fcfa5 | Artyom Tarasenko | |
81 | da9fcfa5 | Artyom Tarasenko | static SysBusDeviceInfo empty_slot_info = {
|
82 | da9fcfa5 | Artyom Tarasenko | .init = empty_slot_init1, |
83 | da9fcfa5 | Artyom Tarasenko | .qdev.name = "empty_slot",
|
84 | da9fcfa5 | Artyom Tarasenko | .qdev.size = sizeof(EmptySlot),
|
85 | da9fcfa5 | Artyom Tarasenko | }; |
86 | da9fcfa5 | Artyom Tarasenko | |
87 | da9fcfa5 | Artyom Tarasenko | static void empty_slot_register_devices(void) |
88 | da9fcfa5 | Artyom Tarasenko | { |
89 | da9fcfa5 | Artyom Tarasenko | sysbus_register_withprop(&empty_slot_info); |
90 | da9fcfa5 | Artyom Tarasenko | } |
91 | da9fcfa5 | Artyom Tarasenko | |
92 | da9fcfa5 | Artyom Tarasenko | device_init(empty_slot_register_devices); |