[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] Add boot parameter 'pci-mem-align' to page-align PCI memory regions.
# HG changeset patch # User Keir Fraser <keir@xxxxxxxxxxxxx> # Date 1193822497 0 # Node ID ba69bacc7e8a28ec3aa7bcec0dbd21a3be2db2eb # Parent 71a5313e13f5d99b1b550b1b5f1c0198fc4c9a70 Add boot parameter 'pci-mem-align' to page-align PCI memory regions. In PCI pass-through the mmio resources are mapped/translated from pfns to mfns (page size), so mmio resources should be at least page-aligned. Signed-off-by: Barak Fargoun <barak@xxxxxxxxxxxx> Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- drivers/pci/bus.c | 7 +++++++ drivers/pci/quirks.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff -r 71a5313e13f5 -r ba69bacc7e8a drivers/pci/bus.c --- a/drivers/pci/bus.c Tue Oct 30 17:35:21 2007 +0000 +++ b/drivers/pci/bus.c Wed Oct 31 09:21:37 2007 +0000 @@ -16,6 +16,8 @@ #include <linux/init.h> #include "pci.h" + +extern int pci_mem_align; /** * pci_bus_alloc_resource - allocate a resource from a parent bus @@ -43,6 +45,11 @@ pci_bus_alloc_resource(struct pci_bus *b int i, ret = -ENOMEM; type_mask |= IORESOURCE_IO | IORESOURCE_MEM; + + /* If the boot parameter 'pci-mem-align' was specified then we need to + align the memory addresses, at page size alignment. */ + if (pci_mem_align && (align < (PAGE_SIZE-1))) + align = PAGE_SIZE - 1; for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { struct resource *r = bus->resource[i]; diff -r 71a5313e13f5 -r ba69bacc7e8a drivers/pci/quirks.c --- a/drivers/pci/quirks.c Tue Oct 30 17:35:21 2007 +0000 +++ b/drivers/pci/quirks.c Wed Oct 31 09:21:37 2007 +0000 @@ -22,6 +22,40 @@ #include <linux/delay.h> #include <linux/acpi.h> #include "pci.h" + +/* A global flag which signals if we should page-align PCI mem windows. */ +int pci_mem_align = 0; + +static int __init set_pci_mem_align(char *str) +{ + pci_mem_align = 1; + return 1; +} +__setup("pci-mem-align", set_pci_mem_align); + +/* This quirk function enables us to force all memory resources which are + * assigned to PCI devices, to be page-aligned. + */ +static void __devinit quirk_align_mem_resources(struct pci_dev *dev) +{ + int i; + struct resource *r; + resource_size_t old_start; + + if (!pci_mem_align) + return; + + for (i=0; i < DEVICE_COUNT_RESOURCE; i++) { + r = &dev->resource[i]; + if ((r == NULL) || !(r->flags & IORESOURCE_MEM)) + continue; + + old_start = r->start; + r->start = (r->start + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); + r->end = r->end - (old_start - r->start); + } +} +DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_align_mem_resources); /* The Mellanox Tavor device gives false positive parity errors * Mark this device with a broken_parity_status, to allow _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |