|
@@ -4,6 +4,41 @@
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/pci.h>
|
|
|
|
|
|
+unsigned long PCIBIOS_MIN_IO = 0x0000;
|
|
|
+unsigned long PCIBIOS_MIN_MEM = 0;
|
|
|
+
|
|
|
+/*
|
|
|
+ * We need to avoid collisions with `mirrored' VGA ports
|
|
|
+ * and other strange ISA hardware, so we always want the
|
|
|
+ * addresses to be allocated in the 0x000-0x0ff region
|
|
|
+ * modulo 0x400.
|
|
|
+ */
|
|
|
+void pcibios_align_resource(void *data, struct resource *res,
|
|
|
+ resource_size_t size, resource_size_t align)
|
|
|
+{
|
|
|
+ struct pci_dev *dev = data;
|
|
|
+ struct pci_channel *chan = dev->sysdata;
|
|
|
+ resource_size_t start = res->start;
|
|
|
+
|
|
|
+ if (res->flags & IORESOURCE_IO) {
|
|
|
+ if (start < PCIBIOS_MIN_IO + chan->io_resource->start)
|
|
|
+ start = PCIBIOS_MIN_IO + chan->io_resource->start;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Put everything into 0x00-0xff region modulo 0x400.
|
|
|
+ */
|
|
|
+ if (start & 0x300) {
|
|
|
+ start = (start + 0x3ff) & ~0x3ff;
|
|
|
+ res->start = start;
|
|
|
+ }
|
|
|
+ } else if (res->flags & IORESOURCE_MEM) {
|
|
|
+ if (start < PCIBIOS_MIN_MEM + chan->mem_resource->start)
|
|
|
+ start = PCIBIOS_MIN_MEM + chan->mem_resource->start;
|
|
|
+ }
|
|
|
+
|
|
|
+ res->start = start;
|
|
|
+}
|
|
|
+
|
|
|
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
|
|
enum pci_mmap_state mmap_state, int write_combine)
|
|
|
{
|
|
@@ -24,3 +59,10 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
|
|
vma->vm_end - vma->vm_start,
|
|
|
vma->vm_page_prot);
|
|
|
}
|
|
|
+
|
|
|
+#ifdef CONFIG_HOTPLUG
|
|
|
+EXPORT_SYMBOL(pcibios_resource_to_bus);
|
|
|
+EXPORT_SYMBOL(pcibios_bus_to_resource);
|
|
|
+EXPORT_SYMBOL(PCIBIOS_MIN_IO);
|
|
|
+EXPORT_SYMBOL(PCIBIOS_MIN_MEM);
|
|
|
+#endif
|