[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 12/17] hw/pci-host/i440fx: Make MemoryRegion pointers accessib
From: |
Bernhard Beschow |
Subject: |
[PATCH v3 12/17] hw/pci-host/i440fx: Make MemoryRegion pointers accessible as properties |
Date: |
Fri, 30 Jun 2023 09:37:15 +0200 |
The goal is to eliminate i440fx_init() which is a legacy init function. This
neccessitates the memory regions to be properties, like in Q35, which will be
assigned in board code.
Since i440fx needs different PCI devices in Xen mode, and since i440fx shall
be self-contained, the PCI device will be created during realization of the
host. Thus the pointers need to be moved to the host structure to be usable as
properties.
Signed-off-by: Bernhard Beschow <shentey@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/hw/pci-host/i440fx.h | 3 ---
hw/pci-host/i440fx.c | 42 +++++++++++++++++++++++++-----------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/include/hw/pci-host/i440fx.h b/include/hw/pci-host/i440fx.h
index bf57216c78..e3a550021e 100644
--- a/include/hw/pci-host/i440fx.h
+++ b/include/hw/pci-host/i440fx.h
@@ -25,9 +25,6 @@ struct PCII440FXState {
PCIDevice parent_obj;
/*< public >*/
- MemoryRegion *system_memory;
- MemoryRegion *pci_address_space;
- MemoryRegion *ram_memory;
PAMMemoryRegion pam_regions[PAM_REGIONS_COUNT];
MemoryRegion smram_region;
MemoryRegion smram, low_smram;
diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c
index e84fcd50b6..b9530fc3a0 100644
--- a/hw/pci-host/i440fx.c
+++ b/hw/pci-host/i440fx.c
@@ -47,6 +47,10 @@ OBJECT_DECLARE_SIMPLE_TYPE(I440FXState,
I440FX_PCI_HOST_BRIDGE)
struct I440FXState {
PCIHostState parent_obj;
+
+ MemoryRegion *system_memory;
+ MemoryRegion *pci_address_space;
+ MemoryRegion *ram_memory;
Range pci_hole;
uint64_t pci_hole64_size;
bool pci_hole64_fix;
@@ -214,12 +218,25 @@ static void i440fx_pcihost_get_pci_hole64_end(Object
*obj, Visitor *v,
static void i440fx_pcihost_initfn(Object *obj)
{
+ I440FXState *s = I440FX_PCI_HOST_BRIDGE(obj);
PCIHostState *phb = PCI_HOST_BRIDGE(obj);
memory_region_init_io(&phb->conf_mem, obj, &pci_host_conf_le_ops, phb,
"pci-conf-idx", 4);
memory_region_init_io(&phb->data_mem, obj, &pci_host_data_le_ops, phb,
"pci-conf-data", 4);
+
+ object_property_add_link(obj, PCI_HOST_PROP_RAM_MEM, TYPE_MEMORY_REGION,
+ (Object **) &s->ram_memory,
+ qdev_prop_allow_set_link_before_realize, 0);
+
+ object_property_add_link(obj, PCI_HOST_PROP_PCI_MEM, TYPE_MEMORY_REGION,
+ (Object **) &s->pci_address_space,
+ qdev_prop_allow_set_link_before_realize, 0);
+
+ object_property_add_link(obj, PCI_HOST_PROP_SYSTEM_MEM, TYPE_MEMORY_REGION,
+ (Object **) &s->system_memory,
+ qdev_prop_allow_set_link_before_realize, 0);
}
static void i440fx_pcihost_realize(DeviceState *dev, Error **errp)
@@ -255,27 +272,28 @@ PCIBus *i440fx_init(const char *pci_type,
PCII440FXState *f;
unsigned i;
- b = pci_root_bus_new(dev, NULL, pci_address_space,
+ s->system_memory = address_space_mem;
+ s->pci_address_space = pci_address_space;
+ s->ram_memory = ram_memory;
+
+ b = pci_root_bus_new(dev, NULL, s->pci_address_space,
address_space_io, 0, TYPE_PCI_BUS);
phb->bus = b;
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
d = pci_create_simple(b, 0, pci_type);
f = I440FX_PCI_DEVICE(d);
- f->system_memory = address_space_mem;
- f->pci_address_space = pci_address_space;
- f->ram_memory = ram_memory;
range_set_bounds(&s->pci_hole, below_4g_mem_size,
IO_APIC_DEFAULT_ADDRESS - 1);
/* setup pci memory mapping */
- pc_pci_as_mapping_init(f->system_memory, f->pci_address_space);
+ pc_pci_as_mapping_init(s->system_memory, s->pci_address_space);
/* if *disabled* show SMRAM to all CPUs */
memory_region_init_alias(&f->smram_region, OBJECT(d), "smram-region",
- f->pci_address_space, SMRAM_C_BASE, SMRAM_C_SIZE);
- memory_region_add_subregion_overlap(f->system_memory, SMRAM_C_BASE,
+ s->pci_address_space, SMRAM_C_BASE, SMRAM_C_SIZE);
+ memory_region_add_subregion_overlap(s->system_memory, SMRAM_C_BASE,
&f->smram_region, 1);
memory_region_set_enabled(&f->smram_region, true);
@@ -283,17 +301,17 @@ PCIBus *i440fx_init(const char *pci_type,
memory_region_init(&f->smram, OBJECT(d), "smram", 4 * GiB);
memory_region_set_enabled(&f->smram, true);
memory_region_init_alias(&f->low_smram, OBJECT(d), "smram-low",
- f->ram_memory, SMRAM_C_BASE, SMRAM_C_SIZE);
+ s->ram_memory, SMRAM_C_BASE, SMRAM_C_SIZE);
memory_region_set_enabled(&f->low_smram, true);
memory_region_add_subregion(&f->smram, SMRAM_C_BASE, &f->low_smram);
object_property_add_const_link(qdev_get_machine(), "smram",
OBJECT(&f->smram));
- init_pam(&f->pam_regions[0], OBJECT(d), f->ram_memory, f->system_memory,
- f->pci_address_space, PAM_BIOS_BASE, PAM_BIOS_SIZE);
+ init_pam(&f->pam_regions[0], OBJECT(d), s->ram_memory, s->system_memory,
+ s->pci_address_space, PAM_BIOS_BASE, PAM_BIOS_SIZE);
for (i = 0; i < ARRAY_SIZE(f->pam_regions) - 1; ++i) {
- init_pam(&f->pam_regions[i + 1], OBJECT(d), f->ram_memory,
- f->system_memory, f->pci_address_space,
+ init_pam(&f->pam_regions[i + 1], OBJECT(d), s->ram_memory,
+ s->system_memory, s->pci_address_space,
PAM_EXPAN_BASE + i * PAM_EXPAN_SIZE, PAM_EXPAN_SIZE);
}
--
2.41.0
- [PATCH v3 01/17] hw/i386/pc_q35: Resolve redundant q35_host variable, (continued)
- [PATCH v3 01/17] hw/i386/pc_q35: Resolve redundant q35_host variable, Bernhard Beschow, 2023/06/30
- [PATCH v3 02/17] hw/pci-host/q35: Fix double, contradicting .endianness assignment, Bernhard Beschow, 2023/06/30
- [PATCH v3 03/17] hw/pci-host/q35: Initialize PCMachineState::bus in board code, Bernhard Beschow, 2023/06/30
- [PATCH v3 05/17] hw/pci-host/q35: Initialize PCI_HOST_BYPASS_IOMMU property from board code, Bernhard Beschow, 2023/06/30
- [PATCH v3 06/17] hw/pci-host/q35: Make some property name macros reusable by i440fx, Bernhard Beschow, 2023/06/30
- [PATCH v3 15/17] hw/pci-host/i440fx: Add I440FX_HOST_PROP_PCI_TYPE property, Bernhard Beschow, 2023/06/30
- [PATCH v3 04/17] hw/pci/pci_host: Introduce PCI_HOST_BYPASS_IOMMU macro, Bernhard Beschow, 2023/06/30
- [PATCH v3 07/17] hw/i386/pc_piix: Turn some local variables into initializers, Bernhard Beschow, 2023/06/30
- [PATCH v3 09/17] hw/pci-host/i440fx: Replace magic values by existing constants, Bernhard Beschow, 2023/06/30
- [PATCH v3 08/17] hw/pci-host/i440fx: Add "i440fx" child property in board code, Bernhard Beschow, 2023/06/30
- [PATCH v3 12/17] hw/pci-host/i440fx: Make MemoryRegion pointers accessible as properties,
Bernhard Beschow <=
- [PATCH v3 11/17] hw/pci-host/i440fx: Move i440fx_realize() into PCII440FXState section, Bernhard Beschow, 2023/06/30
- [PATCH v3 16/17] hw/pci-host/i440fx: Resolve i440fx_init(), Bernhard Beschow, 2023/06/30
- [PATCH v3 14/17] hw/pci-host/i440fx: Add PCI_HOST_{ABOVE, BELOW}_4G_MEM_SIZE properties, Bernhard Beschow, 2023/06/30
- [PATCH v3 17/17] hw/i386/pc_piix: Move i440fx' realize near its qdev_new(), Bernhard Beschow, 2023/06/30
- [PATCH v3 13/17] hw/pci-host/i440fx: Add PCI_HOST_PROP_IO_MEM property, Bernhard Beschow, 2023/06/30
- [PATCH v3 10/17] hw/pci-host/i440fx: Have common names for some local variables, Bernhard Beschow, 2023/06/30