[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.