[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: [PATCH][VTD] pci mmcfg patch for x86-64 - version 2



>>> "Kay, Allen M" <allen.m.kay@xxxxxxxxx> 08.12.08 23:33 >>>
>+#define PCI_MCFG_VIRT_START     (PML4_ADDR(257))
>+#define PCI_MCFG_VIRT_END       (RDWR_MPT_VIRT_START + PML4_ENTRY_BYTES)

The latter line is certainly wrong.

>+static void __iomem * __init mcfg_ioremap(struct acpi_mcfg_allocation *cfg)
>+{
>+      void __iomem *addr;
>+      unsigned long virt;
>+      unsigned long mfn;
>+      unsigned long size, nr_mfn;
>+
>+        /* see asm-x86/config.h, only 2048 PCI segments are supported) */
>+        BUG_ON(cfg->pci_segment >= 2048);

This seems an inappropriate use of BUG_ON() - should either return NULL
here or map just the first 2048 segments (and check in other places
accordingly). Also, I'd say you shouldn't have a literal 2048 here, but rather
calculate the number from PCI_MCFG_VIRT_END.

>+      virt = PCI_MCFG_VIRT_START + (cfg->pci_segment * (1 << 22)) +
>+               (cfg->start_bus_number * (1 << 20));

Isn't the first (segment) shift value supposed to be 28? Also, you have to
use 1UL there, otherwise the multiplication will get truncated to 32 bits.

>+      mfn = cfg->address >> PAGE_SHIFT;
>+        size = (cfg->end_bus_number - cfg->start_bus_number) << 20;

Since end_bus_number is the last valid number, you need to add 1 here
I would think.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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