Hi, 2013/6/26 Hu Tao > From: Vasilis Liaskovitis > > Initialize the 32-bit and 64-bit pci starting offsets from values passed > in by > the qemu paravirt interface QEMU_CFG_PCI_WINDOW. Qemu calculates the > starting > offsets based on initial memory and hotplug-able dimms. > We should drop this patch and the corresponding seabios patch since Michael Tsirkin's pci-window patches are merged or will be soon. See "pc: pass PCI hole ranges to Guests" - already in qemu master "pci: load memory window setup from host" (should go into seabios) thanks, - Vasilis > It's possible to avoid the new paravirt interface, and calculate pci > ranges from > srat entries. But the code changes are ugly, see: > http://lists.gnu.org/archive/html/qemu-devel/2012-09/msg03548.html > > Signed-off-by: Vasilis Liaskovitis > --- > src/paravirt.c | 7 +++++++ > src/paravirt.h | 1 + > src/pciinit.c | 9 +++++++++ > 3 files changed, 17 insertions(+) > > diff --git a/src/paravirt.c b/src/paravirt.c > index 5925c63..9c1e511 100644 > --- a/src/paravirt.c > +++ b/src/paravirt.c > @@ -134,6 +134,7 @@ qemu_platform_setup(void) > #define QEMU_CFG_BOOT_MENU 0x0e > #define QEMU_CFG_MAX_CPUS 0x0f > #define QEMU_CFG_FILE_DIR 0x19 > +#define QEMU_CFG_PCI_WINDOW 0x1a > #define QEMU_CFG_ARCH_LOCAL 0x8000 > #define QEMU_CFG_ACPI_TABLES (QEMU_CFG_ARCH_LOCAL + 0) > #define QEMU_CFG_SMBIOS_ENTRIES (QEMU_CFG_ARCH_LOCAL + 1) > @@ -339,3 +340,9 @@ void qemu_cfg_init(void) > , 0, be32_to_cpu(qfile.size)); > } > } > + > +void qemu_cfg_get_pci_offsets(u64 *pcimem_start, u64 *pcimem64_start) > +{ > + qemu_cfg_read_entry(pcimem_start, QEMU_CFG_PCI_WINDOW, sizeof(u64)); > + qemu_cfg_read((u8*)(pcimem64_start), sizeof(u64)); > +} > diff --git a/src/paravirt.h b/src/paravirt.h > index fce5af9..2c37d0d 100644 > --- a/src/paravirt.h > +++ b/src/paravirt.h > @@ -27,5 +27,6 @@ static inline int runningOnKVM(void) { > void qemu_preinit(void); > void qemu_platform_setup(void); > void qemu_cfg_init(void); > +void qemu_cfg_get_pci_offsets(u64 *pcimem_start, u64 *pcimem64_start); > > #endif > diff --git a/src/pciinit.c b/src/pciinit.c > index 8370b96..7e63c5e 100644 > --- a/src/pciinit.c > +++ b/src/pciinit.c > @@ -805,6 +805,7 @@ static void pci_bios_map_devices(struct pci_bus > *busses) > void > pci_setup(void) > { > + u64 pv_pcimem_start, pv_pcimem64_start; > if (!CONFIG_QEMU) > return; > > @@ -837,6 +838,14 @@ pci_setup(void) > > pci_bios_init_devices(); > > + /* if qemu gives us other pci window values, it means there are > hotplug-able > + * dimms. Adjust accordingly */ > + qemu_cfg_get_pci_offsets(&pv_pcimem_start, &pv_pcimem64_start); > + if (pv_pcimem_start > pcimem_start) > + pcimem_start = pv_pcimem_start; > + if (pv_pcimem64_start > pcimem64_start) > + pcimem64_start = pv_pcimem64_start; > + > free(busses); > > pci_enable_default_vga(); > -- > 1.8.3.1 > >