Skip to content

Commit 9e89939

Browse files
Jing Liumstsirkin
Jing Liu
authored andcommitted
hw/pci: factor PCI reserve resources to a separate structure
Factor "bus_reserve", "io_reserve", "mem_reserve", "pref32_reserve" and "pref64_reserve" fields of the "GenPCIERootPort" structure out to "PCIResReserve" structure, so that other PCI bridges can reuse it to add resource reserve capability. Signed-off-by: Jing Liu <[email protected]> Reviewed-by: Marcel Apfelbaum<[email protected]> Reviewed-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent db812c4 commit 9e89939

File tree

3 files changed

+47
-42
lines changed

3 files changed

+47
-42
lines changed

hw/pci-bridge/gen_pcie_root_port.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,8 @@ typedef struct GenPCIERootPort {
2929

3030
bool migrate_msix;
3131

32-
/* additional resources to reserve on firmware init */
33-
uint32_t bus_reserve;
34-
uint64_t io_reserve;
35-
uint64_t mem_reserve;
36-
uint64_t pref32_reserve;
37-
uint64_t pref64_reserve;
32+
/* additional resources to reserve */
33+
PCIResReserve res_reserve;
3834
} GenPCIERootPort;
3935

4036
static uint8_t gen_rp_aer_vector(const PCIDevice *d)
@@ -82,16 +78,15 @@ static void gen_rp_realize(DeviceState *dev, Error **errp)
8278
return;
8379
}
8480

85-
int rc = pci_bridge_qemu_reserve_cap_init(d, 0, grp->bus_reserve,
86-
grp->io_reserve, grp->mem_reserve, grp->pref32_reserve,
87-
grp->pref64_reserve, errp);
81+
int rc = pci_bridge_qemu_reserve_cap_init(d, 0,
82+
grp->res_reserve, errp);
8883

8984
if (rc < 0) {
9085
rpc->parent_class.exit(d);
9186
return;
9287
}
9388

94-
if (!grp->io_reserve) {
89+
if (!grp->res_reserve.io) {
9590
pci_word_test_and_clear_mask(d->wmask + PCI_COMMAND,
9691
PCI_COMMAND_IO);
9792
d->wmask[PCI_IO_BASE] = 0;
@@ -117,12 +112,18 @@ static const VMStateDescription vmstate_rp_dev = {
117112
};
118113

119114
static Property gen_rp_props[] = {
120-
DEFINE_PROP_BOOL("x-migrate-msix", GenPCIERootPort, migrate_msix, true),
121-
DEFINE_PROP_UINT32("bus-reserve", GenPCIERootPort, bus_reserve, -1),
122-
DEFINE_PROP_SIZE("io-reserve", GenPCIERootPort, io_reserve, -1),
123-
DEFINE_PROP_SIZE("mem-reserve", GenPCIERootPort, mem_reserve, -1),
124-
DEFINE_PROP_SIZE("pref32-reserve", GenPCIERootPort, pref32_reserve, -1),
125-
DEFINE_PROP_SIZE("pref64-reserve", GenPCIERootPort, pref64_reserve, -1),
115+
DEFINE_PROP_BOOL("x-migrate-msix", GenPCIERootPort,
116+
migrate_msix, true),
117+
DEFINE_PROP_UINT32("bus-reserve", GenPCIERootPort,
118+
res_reserve.bus, -1),
119+
DEFINE_PROP_SIZE("io-reserve", GenPCIERootPort,
120+
res_reserve.io, -1),
121+
DEFINE_PROP_SIZE("mem-reserve", GenPCIERootPort,
122+
res_reserve.mem_non_pref, -1),
123+
DEFINE_PROP_SIZE("pref32-reserve", GenPCIERootPort,
124+
res_reserve.mem_pref_32, -1),
125+
DEFINE_PROP_SIZE("pref64-reserve", GenPCIERootPort,
126+
res_reserve.mem_pref_64, -1),
126127
DEFINE_PROP_END_OF_LIST()
127128
};
128129

hw/pci/pci_bridge.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -411,50 +411,46 @@ void pci_bridge_map_irq(PCIBridge *br, const char* bus_name,
411411

412412

413413
int pci_bridge_qemu_reserve_cap_init(PCIDevice *dev, int cap_offset,
414-
uint32_t bus_reserve, uint64_t io_reserve,
415-
uint64_t mem_non_pref_reserve,
416-
uint64_t mem_pref_32_reserve,
417-
uint64_t mem_pref_64_reserve,
418-
Error **errp)
414+
PCIResReserve res_reserve, Error **errp)
419415
{
420-
if (mem_pref_32_reserve != (uint64_t)-1 &&
421-
mem_pref_64_reserve != (uint64_t)-1) {
416+
if (res_reserve.mem_pref_32 != (uint64_t)-1 &&
417+
res_reserve.mem_pref_64 != (uint64_t)-1) {
422418
error_setg(errp,
423419
"PCI resource reserve cap: PREF32 and PREF64 conflict");
424420
return -EINVAL;
425421
}
426422

427-
if (mem_non_pref_reserve != (uint64_t)-1 &&
428-
mem_non_pref_reserve >= (1ULL << 32)) {
423+
if (res_reserve.mem_non_pref != (uint64_t)-1 &&
424+
res_reserve.mem_non_pref >= (1ULL << 32)) {
429425
error_setg(errp,
430426
"PCI resource reserve cap: mem-reserve must be less than 4G");
431427
return -EINVAL;
432428
}
433429

434-
if (mem_pref_32_reserve != (uint64_t)-1 &&
435-
mem_pref_32_reserve >= (1ULL << 32)) {
430+
if (res_reserve.mem_pref_32 != (uint64_t)-1 &&
431+
res_reserve.mem_pref_32 >= (1ULL << 32)) {
436432
error_setg(errp,
437433
"PCI resource reserve cap: pref32-reserve must be less than 4G");
438434
return -EINVAL;
439435
}
440436

441-
if (bus_reserve == (uint32_t)-1 &&
442-
io_reserve == (uint64_t)-1 &&
443-
mem_non_pref_reserve == (uint64_t)-1 &&
444-
mem_pref_32_reserve == (uint64_t)-1 &&
445-
mem_pref_64_reserve == (uint64_t)-1) {
437+
if (res_reserve.bus == (uint32_t)-1 &&
438+
res_reserve.io == (uint64_t)-1 &&
439+
res_reserve.mem_non_pref == (uint64_t)-1 &&
440+
res_reserve.mem_pref_32 == (uint64_t)-1 &&
441+
res_reserve.mem_pref_64 == (uint64_t)-1) {
446442
return 0;
447443
}
448444

449445
size_t cap_len = sizeof(PCIBridgeQemuCap);
450446
PCIBridgeQemuCap cap = {
451447
.len = cap_len,
452448
.type = REDHAT_PCI_CAP_RESOURCE_RESERVE,
453-
.bus_res = bus_reserve,
454-
.io = io_reserve,
455-
.mem = mem_non_pref_reserve,
456-
.mem_pref_32 = mem_pref_32_reserve,
457-
.mem_pref_64 = mem_pref_64_reserve
449+
.bus_res = res_reserve.bus,
450+
.io = res_reserve.io,
451+
.mem = res_reserve.mem_non_pref,
452+
.mem_pref_32 = res_reserve.mem_pref_32,
453+
.mem_pref_64 = res_reserve.mem_pref_64
458454
};
459455

460456
int offset = pci_add_capability(dev, PCI_CAP_ID_VNDR,

include/hw/pci/pci_bridge.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,19 @@ typedef struct PCIBridgeQemuCap {
133133

134134
#define REDHAT_PCI_CAP_RESOURCE_RESERVE 1
135135

136+
/*
137+
* PCI BUS/IO/MEM/PREFMEM additional resources recorded as a
138+
* capability in PCI configuration space to reserve on firmware init.
139+
*/
140+
typedef struct PCIResReserve {
141+
uint32_t bus;
142+
uint64_t io;
143+
uint64_t mem_non_pref;
144+
uint64_t mem_pref_32;
145+
uint64_t mem_pref_64;
146+
} PCIResReserve;
147+
136148
int pci_bridge_qemu_reserve_cap_init(PCIDevice *dev, int cap_offset,
137-
uint32_t bus_reserve, uint64_t io_reserve,
138-
uint64_t mem_non_pref_reserve,
139-
uint64_t mem_pref_32_reserve,
140-
uint64_t mem_pref_64_reserve,
141-
Error **errp);
149+
PCIResReserve res_reserve, Error **errp);
142150

143151
#endif /* QEMU_PCI_BRIDGE_H */

0 commit comments

Comments
 (0)