]>
git.proxmox.com Git - mirror_qemu.git/blob - tests/libqos/pci-pc.c
2 * libqos PCI bindings for PC
4 * Copyright IBM, Corp. 2012-2013
7 * Anthony Liguori <aliguori@us.ibm.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
13 #include "qemu/osdep.h"
15 #include "libqos/pci-pc.h"
17 #include "hw/pci/pci_regs.h"
19 #include "qemu-common.h"
22 #define ACPI_PCIHP_ADDR 0xae00
23 #define PCI_EJ_BASE 0x0008
25 typedef struct QPCIBusPC
30 static uint8_t qpci_pc_pio_readb(QPCIBus
*bus
, uint32_t addr
)
35 static void qpci_pc_pio_writeb(QPCIBus
*bus
, uint32_t addr
, uint8_t val
)
40 static uint16_t qpci_pc_pio_readw(QPCIBus
*bus
, uint32_t addr
)
45 static void qpci_pc_pio_writew(QPCIBus
*bus
, uint32_t addr
, uint16_t val
)
50 static uint32_t qpci_pc_pio_readl(QPCIBus
*bus
, uint32_t addr
)
55 static void qpci_pc_pio_writel(QPCIBus
*bus
, uint32_t addr
, uint32_t val
)
60 static void qpci_pc_memread(QPCIBus
*bus
, uint32_t addr
, void *buf
, size_t len
)
62 memread(addr
, buf
, len
);
65 static void qpci_pc_memwrite(QPCIBus
*bus
, uint32_t addr
,
66 const void *buf
, size_t len
)
68 memwrite(addr
, buf
, len
);
71 static uint8_t qpci_pc_config_readb(QPCIBus
*bus
, int devfn
, uint8_t offset
)
73 outl(0xcf8, (1U << 31) | (devfn
<< 8) | offset
);
77 static uint16_t qpci_pc_config_readw(QPCIBus
*bus
, int devfn
, uint8_t offset
)
79 outl(0xcf8, (1U << 31) | (devfn
<< 8) | offset
);
83 static uint32_t qpci_pc_config_readl(QPCIBus
*bus
, int devfn
, uint8_t offset
)
85 outl(0xcf8, (1U << 31) | (devfn
<< 8) | offset
);
89 static void qpci_pc_config_writeb(QPCIBus
*bus
, int devfn
, uint8_t offset
, uint8_t value
)
91 outl(0xcf8, (1U << 31) | (devfn
<< 8) | offset
);
95 static void qpci_pc_config_writew(QPCIBus
*bus
, int devfn
, uint8_t offset
, uint16_t value
)
97 outl(0xcf8, (1U << 31) | (devfn
<< 8) | offset
);
101 static void qpci_pc_config_writel(QPCIBus
*bus
, int devfn
, uint8_t offset
, uint32_t value
)
103 outl(0xcf8, (1U << 31) | (devfn
<< 8) | offset
);
107 QPCIBus
*qpci_init_pc(QGuestAllocator
*alloc
)
111 ret
= g_malloc(sizeof(*ret
));
113 ret
->bus
.pio_readb
= qpci_pc_pio_readb
;
114 ret
->bus
.pio_readw
= qpci_pc_pio_readw
;
115 ret
->bus
.pio_readl
= qpci_pc_pio_readl
;
117 ret
->bus
.pio_writeb
= qpci_pc_pio_writeb
;
118 ret
->bus
.pio_writew
= qpci_pc_pio_writew
;
119 ret
->bus
.pio_writel
= qpci_pc_pio_writel
;
121 ret
->bus
.memread
= qpci_pc_memread
;
122 ret
->bus
.memwrite
= qpci_pc_memwrite
;
124 ret
->bus
.config_readb
= qpci_pc_config_readb
;
125 ret
->bus
.config_readw
= qpci_pc_config_readw
;
126 ret
->bus
.config_readl
= qpci_pc_config_readl
;
128 ret
->bus
.config_writeb
= qpci_pc_config_writeb
;
129 ret
->bus
.config_writew
= qpci_pc_config_writew
;
130 ret
->bus
.config_writel
= qpci_pc_config_writel
;
132 ret
->bus
.pio_alloc_ptr
= 0xc000;
133 ret
->bus
.mmio_alloc_ptr
= 0xE0000000;
134 ret
->bus
.mmio_limit
= 0x100000000ULL
;
139 void qpci_free_pc(QPCIBus
*bus
)
141 QPCIBusPC
*s
= container_of(bus
, QPCIBusPC
, bus
);
146 void qpci_unplug_acpi_device_test(const char *id
, uint8_t slot
)
151 cmd
= g_strdup_printf("{'execute': 'device_del',"
158 g_assert(!qdict_haskey(response
, "error"));
161 outb(ACPI_PCIHP_ADDR
+ PCI_EJ_BASE
, 1 << slot
);
165 g_assert(qdict_haskey(response
, "event"));
166 g_assert(!strcmp(qdict_get_str(response
, "event"), "DEVICE_DELETED"));