[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Xen, MCFG acpi table and E820 address map
>>> On 04.09.13 at 17:01, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> wrote: > On Wed, Sep 04, 2013 at 10:16:26AM +0100, Jan Beulich wrote: >> For reference I'm attaching the diff of the respective source file, >> in case someone finds this useful. > > Thank you for providing the patch. > > Is there a nicer way of doing this? Inserting Xen codepaths right > there is on the high list of no-no. I guess xen_report_mmconf_reserved() could become a pv op, pointing to a no-op on native, returning back just the "valid" flag it gets passed. Jan >> --- linux-3.11/arch/x86/pci/mmconfig-shared.c >> +++ head/arch/x86/pci/mmconfig-shared.c >> @@ -23,6 +23,10 @@ >> #include <asm/pci_x86.h> >> #include <asm/acpi.h> >> >> +#ifdef CONFIG_XEN >> +#include <xen/interface/physdev.h> >> +#endif >> + >> #define PREFIX "PCI: " >> >> /* Indicate if the mmcfg resources have been placed into the resource >> table. */ >> @@ -437,6 +441,36 @@ static int is_acpi_reserved(u64 start, u >> return mcfg_res.flags; >> } >> >> +static int xen_report_mmconf_reserved(const struct pci_mmcfg_region *cfg, >> + int valid, int with_e820) >> +{ >> +#ifdef CONFIG_XEN >> + if (!with_e820) { >> + struct physdev_pci_mmcfg_reserved r = { >> + .address = cfg->address, >> + .segment = cfg->segment, >> + .start_bus = cfg->start_bus, >> + .end_bus = cfg->end_bus, >> + .flags = valid ? XEN_PCI_MMCFG_RESERVED : 0 >> + }; >> + int rc; >> + >> + rc = HYPERVISOR_physdev_op(PHYSDEVOP_pci_mmcfg_reserved, &r); >> + switch (rc) { >> + case 0: case -ENOSYS: >> + break; >> + default: >> + pr_warn(PREFIX "Failed to report MMCONFIG reservation" >> + " state for %04x [bus%02x-%02x] to hypervisor" >> + " (%d)\n", >> + cfg->segment, cfg->start_bus, cfg->end_bus, >> + rc); >> + } >> + } >> +#endif >> + return valid; >> +} >> + >> typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type); >> >> static int __ref is_mmconf_reserved(check_reserved_t is_reserved, >> @@ -456,7 +490,7 @@ static int __ref is_mmconf_reserved(chec >> } >> >> if (size < (16UL<<20) && size != old_size) >> - return 0; >> + return xen_report_mmconf_reserved(cfg, 0, with_e820); >> >> if (dev) >> dev_info(dev, "MMCONFIG at %pR reserved in %s\n", >> @@ -488,7 +522,7 @@ static int __ref is_mmconf_reserved(chec >> &cfg->res, (unsigned long) cfg->address); >> } >> >> - return 1; >> + return xen_report_mmconf_reserved(cfg, 1, with_e820); >> } >> >> static int __ref pci_mmcfg_check_reserved(struct device *dev, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |