mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/physdev: enable PHYSDEVOP_pci_mmcfg_reserved for PVH Dom0
So that MMCFG regions not present in the MCFG ACPI table can be added at run time by the hardware domain. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
This commit is contained in:
1 parent
be52cb139f
commit
eb3dd90e40
3 files changed
+27
-5
No files matched your search
@@ -89,6 +89,11 @@ static long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
if ( !has_pirq(curr->domain) )
|
||||
return -ENOSYS;
|
||||
break;
|
||||
|
||||
case PHYSDEVOP_pci_mmcfg_reserved:
|
||||
if ( !has_vpci(curr->domain) )
|
||||
return -ENOSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( !curr->hcall_compat )
|
||||
|
||||
+11
-5
@@ -507,10 +507,9 @@ static const struct hvm_mmio_ops vpci_mmcfg_ops = {
|
||||
.write = vpci_mmcfg_write,
|
||||
};
|
||||
|
||||
int __hwdom_init register_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
|
||||
unsigned int start_bus,
|
||||
unsigned int end_bus,
|
||||
unsigned int seg)
|
||||
int register_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
|
||||
unsigned int start_bus, unsigned int end_bus,
|
||||
unsigned int seg)
|
||||
{
|
||||
struct hvm_mmcfg *mmcfg, *new = xmalloc(struct hvm_mmcfg);
|
||||
|
||||
@@ -535,9 +534,16 @@ int __hwdom_init register_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
|
||||
if ( new->addr < mmcfg->addr + mmcfg->size &&
|
||||
mmcfg->addr < new->addr + new->size )
|
||||
{
|
||||
int ret = -EEXIST;
|
||||
|
||||
if ( new->addr == mmcfg->addr &&
|
||||
new->start_bus == mmcfg->start_bus &&
|
||||
new->segment == mmcfg->segment &&
|
||||
new->size == mmcfg->size )
|
||||
ret = 0;
|
||||
write_unlock(&d->arch.hvm_domain.mmcfg_lock);
|
||||
xfree(new);
|
||||
return -EEXIST;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ( list_empty(&d->arch.hvm_domain.mmcfg_regions) )
|
||||
|
||||
@@ -557,6 +557,17 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
|
||||
ret = pci_mmcfg_reserved(info.address, info.segment,
|
||||
info.start_bus, info.end_bus, info.flags);
|
||||
if ( !ret && has_vpci(currd) )
|
||||
{
|
||||
/*
|
||||
* For HVM (PVH) domains try to add the newly found MMCFG to the
|
||||
* domain.
|
||||
*/
|
||||
ret = register_vpci_mmcfg_handler(currd, info.address,
|
||||
info.start_bus, info.end_bus,
|
||||
info.segment);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||