allocator: Page align memory mapped PCI resources
To help hypervisors to assign PCI devices individually to virtualization guests, page align dynamically allocated MMIO resources. Tested with kontron/ktqm77 which has dynamically configured onboard devices on the root bus and secondary buses. Booted Linux and checked the configuration with `lspci -v`. Got the configuration through Muen's tools which are very picky about overlapping and alignment. Booted a Muen based system that uses many onboard devices. GMA, xHCI and one NIC (on a secondary bus) were verified to function properly. Change-Id: I2b7115070e1ccad64565feff025289732c3b5e66 Signed-off-by: Nico Huber <nico.huber@secunet.com> Reviewed-on: http://review.coreboot.org/12111 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
37743a913f
commit
8193b068d4
|
@ -211,6 +211,12 @@ struct resource *pci_get_resource(struct device *dev, unsigned long index)
|
|||
resource->gran += 1;
|
||||
}
|
||||
resource->limit = limit = moving | (resource->size - 1);
|
||||
|
||||
if (pci_base_address_is_memory_space(attr)) {
|
||||
/* Page-align to allow individual mapping of devices. */
|
||||
if (resource->align < 12)
|
||||
resource->align = 12;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -78,6 +78,13 @@
|
|||
#define PCI_BASE_ADDRESS_IO_ATTR_MASK 0x03
|
||||
/* bit 1 is reserved if address_space = 1 */
|
||||
|
||||
#ifndef __ROMCC__
|
||||
static inline int pci_base_address_is_memory_space(unsigned int attr)
|
||||
{
|
||||
return (attr & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Header type 0 (normal devices) */
|
||||
#define PCI_CARDBUS_CIS 0x28
|
||||
#define PCI_SUBSYSTEM_VENDOR_ID 0x2c
|
||||
|
|
Loading…
Reference in New Issue