瀏覽代碼

powerpc/PCI: compute I/O space bus-to-resource offset consistently

Make sure we compute CPU addresses (resource start/end) the same way both
when we set up the I/O aperture (hose->io_resource) and when we use
pcibios_bus_to_resource() to convert BAR values into resources.

This fixes a build failure ("cast from pointer to integer of different
size" in configs where resource_size_t is 64 bits but pointers are 32 bits)
I introduced in 6c5705fec63d.

Acked-By: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Bjorn Helgaas 13 年之前
父節點
當前提交
38973ba790
共有 4 個文件被更改,包括 11 次插入6 次删除
  1. 1 0
      arch/powerpc/include/asm/pci.h
  2. 6 2
      arch/powerpc/kernel/pci-common.c
  3. 3 3
      arch/powerpc/kernel/pci_32.c
  4. 1 1
      arch/powerpc/kernel/pci_64.c

+ 1 - 0
arch/powerpc/include/asm/pci.h

@@ -182,6 +182,7 @@ extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
 				 const struct resource *rsrc,
 				 const struct resource *rsrc,
 				 resource_size_t *start, resource_size_t *end);
 				 resource_size_t *start, resource_size_t *end);
 
 
+extern resource_size_t pcibios_io_space_offset(struct pci_controller *hose);
 extern void pcibios_setup_bus_devices(struct pci_bus *bus);
 extern void pcibios_setup_bus_devices(struct pci_bus *bus);
 extern void pcibios_setup_bus_self(struct pci_bus *bus);
 extern void pcibios_setup_bus_self(struct pci_bus *bus);
 extern void pcibios_setup_phb_io_space(struct pci_controller *hose);
 extern void pcibios_setup_phb_io_space(struct pci_controller *hose);

+ 6 - 2
arch/powerpc/kernel/pci-common.c

@@ -1492,6 +1492,11 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
 	return pci_enable_resources(dev, mask);
 	return pci_enable_resources(dev, mask);
 }
 }
 
 
+resource_size_t pcibios_io_space_offset(struct pci_controller *hose)
+{
+	return (unsigned long) hose->io_base_virt - _IO_BASE;
+}
+
 static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)
 static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources)
 {
 {
 	struct resource *res;
 	struct resource *res;
@@ -1516,8 +1521,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s
 		 (unsigned long long)res->start,
 		 (unsigned long long)res->start,
 		 (unsigned long long)res->end,
 		 (unsigned long long)res->end,
 		 (unsigned long)res->flags);
 		 (unsigned long)res->flags);
-	pci_add_resource_offset(resources, res,
-			(resource_size_t) hose->io_base_virt - _IO_BASE);
+	pci_add_resource_offset(resources, res, pcibios_io_space_offset(hose));
 
 
 	/* Hookup PHB Memory resources */
 	/* Hookup PHB Memory resources */
 	for (i = 0; i < 3; ++i) {
 	for (i = 0; i < 3; ++i) {

+ 3 - 3
arch/powerpc/kernel/pci_32.c

@@ -219,9 +219,9 @@ void __devinit pcibios_setup_phb_io_space(struct pci_controller *hose)
 	struct resource *res = &hose->io_resource;
 	struct resource *res = &hose->io_resource;
 
 
 	/* Fixup IO space offset */
 	/* Fixup IO space offset */
-	io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
-	res->start = (res->start + io_offset) & 0xffffffffu;
-	res->end = (res->end + io_offset) & 0xffffffffu;
+	io_offset = pcibios_io_space_offset(hose);
+	res->start += io_offset;
+	res->end += io_offset;
 }
 }
 
 
 static int __init pcibios_init(void)
 static int __init pcibios_init(void)

+ 1 - 1
arch/powerpc/kernel/pci_64.c

@@ -168,7 +168,7 @@ static int __devinit pcibios_map_phb_io_space(struct pci_controller *hose)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	/* Fixup hose IO resource */
 	/* Fixup hose IO resource */
-	io_virt_offset = (unsigned long)hose->io_base_virt - _IO_BASE;
+	io_virt_offset = pcibios_io_space_offset(hose);
 	hose->io_resource.start += io_virt_offset;
 	hose->io_resource.start += io_virt_offset;
 	hose->io_resource.end += io_virt_offset;
 	hose->io_resource.end += io_virt_offset;