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:
Nico Huber 2015-10-21 15:43:41 +02:00 committed by Nico Huber
parent 37743a913f
commit 8193b068d4
2 changed files with 13 additions and 0 deletions

View File

@ -211,6 +211,12 @@ struct resource *pci_get_resource(struct device *dev, unsigned long index)
resource->gran += 1; resource->gran += 1;
} }
resource->limit = limit = moving | (resource->size - 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;
}
} }
/* /*

View File

@ -78,6 +78,13 @@
#define PCI_BASE_ADDRESS_IO_ATTR_MASK 0x03 #define PCI_BASE_ADDRESS_IO_ATTR_MASK 0x03
/* bit 1 is reserved if address_space = 1 */ /* 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) */ /* Header type 0 (normal devices) */
#define PCI_CARDBUS_CIS 0x28 #define PCI_CARDBUS_CIS 0x28
#define PCI_SUBSYSTEM_VENDOR_ID 0x2c #define PCI_SUBSYSTEM_VENDOR_ID 0x2c