]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Revert "sparc: Accommodate mem64_offset != mem_offset in pbm configuration"
authorKhalid Aziz <khalid.aziz@oracle.com>
Tue, 3 May 2016 13:58:05 +0000 (07:58 -0600)
committerChuck Anderson <chuck.anderson@oracle.com>
Sun, 28 May 2017 02:43:53 +0000 (19:43 -0700)
This reverts commit 6037ec961e10e6e162c564d5306b2c2fddfb5b77. This
commit causes hotplug to break as documented in Orabug 22855133.

Orabug: 22855133

Signed-off-by: Khalid Aziz <khalid.aziz@oracle.com>
(cherry picked from commit 7d551cd315fb544b9b815566737de6e146fd0cd8)
Signed-off-by: Allen Pais <allen.pais@oracle.com>
arch/sparc/kernel/pci.c
arch/sparc/kernel/pci_common.c
arch/sparc/kernel/pci_impl.h

index d21f046fa23b853584c5e8334285c32233404334..916f221edc1e43ba01054859050b9360beaaada7 100644 (file)
@@ -671,7 +671,7 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
                                pbm->mem_offset);
        if (pbm->mem64_space.flags)
                pci_add_resource_offset(&resources, &pbm->mem64_space,
-                                       pbm->mem64_offset);
+                                       pbm->mem_offset);
        pbm->busn.start = pbm->pci_first_busno;
        pbm->busn.end   = pbm->pci_last_busno;
        pbm->busn.flags = IORESOURCE_BUS;
@@ -745,30 +745,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
        return 0;
 }
 
-static resource_size_t get_mem_offset(struct pci_pbm_info *pbm,
-                                 resource_size_t bus_addr)
-{
-       resource_size_t start;
-
-       if (pbm->mem_space.flags) {
-               start = bus_addr + pbm->mem_offset;
-
-               if (start >= pbm->mem_space.start &&
-                   start <= pbm->mem_space.end)
-                       return pbm->mem_offset;
-       }
-
-       if (pbm->mem64_space.flags) {
-               start = bus_addr + pbm->mem64_offset;
-
-               if (start >= pbm->mem64_space.start &&
-                   start <= pbm->mem64_space.end)
-                       return pbm->mem64_offset;
-       }
-
-       return 0;
-}
-
 /* Platform support for /proc/bus/pci/X/Y mmap()s. */
 
 /* If the user uses a host-bridge as the PCI device, he may use
@@ -783,21 +759,17 @@ static int __pci_mmap_make_offset_bus(struct pci_dev *pdev, struct vm_area_struc
 {
        struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
        unsigned long space_size, user_offset, user_size;
-       resource_size_t mem_offset = 0;
-
-       /* Make sure the request is in range. */
-       user_offset = vma->vm_pgoff << PAGE_SHIFT;
-       user_size = vma->vm_end - vma->vm_start;
 
        if (mmap_state == pci_mmap_io) {
                space_size = resource_size(&pbm->io_space);
        } else {
-               mem_offset = get_mem_offset(pbm, user_offset);
                space_size = resource_size(&pbm->mem_space);
-               if (mem_offset != pbm->mem_offset && pbm->mem64_space.flags)
-                       space_size = resource_size(&pbm->mem64_space);
        }
 
+       /* Make sure the request is in range. */
+       user_offset = vma->vm_pgoff << PAGE_SHIFT;
+       user_size = vma->vm_end - vma->vm_start;
+
        if (user_offset >= space_size ||
            (user_offset + user_size) > space_size)
                return -EINVAL;
@@ -806,7 +778,7 @@ static int __pci_mmap_make_offset_bus(struct pci_dev *pdev, struct vm_area_struc
                vma->vm_pgoff = (pbm->io_offset +
                                 user_offset) >> PAGE_SHIFT;
        } else {
-               vma->vm_pgoff = (mem_offset +
+               vma->vm_pgoff = (pbm->mem_offset +
                                 user_offset) >> PAGE_SHIFT;
        }
 
@@ -1029,12 +1001,16 @@ void pci_resource_to_user(const struct pci_dev *pdev, int bar,
                          const struct resource *rp, resource_size_t *start,
                          resource_size_t *end)
 {
-       struct pci_bus_region region;
+       struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
+       unsigned long offset;
 
-       pcibios_resource_to_bus(pdev->bus, &region, (struct resource *)rp);
+       if (rp->flags & IORESOURCE_IO)
+               offset = pbm->io_offset;
+       else
+               offset = pbm->mem_offset;
 
-       *start = region.start;
-       *end = region.end;
+       *start = rp->start - offset;
+       *end = rp->end - offset;
 }
 
 void pcibios_set_master(struct pci_dev *dev)
index c776a302d0b8284c79d4990d7d8897d9d2985988..957dc9d0300d936315c2b09935538864d8a90476 100644 (file)
@@ -328,56 +328,39 @@ void pci_get_pbm_props(struct pci_pbm_info *pbm)
        }
 }
 
-static int pci_register_region_one(struct pci_pbm_info *pbm, const char *name,
-                               struct resource *mem_res,
-                               resource_size_t mem_offset,
+static void pci_register_region(struct pci_pbm_info *pbm, const char *name,
                                resource_size_t rstart, resource_size_t size)
 {
        struct resource *res, *conflict;
+       struct resource *mem_res = &pbm->mem_space;
+       resource_size_t offset = pbm->mem_offset;
        resource_size_t mem_rstart, mem_rend;
        resource_size_t rend = rstart + size - 1UL;
 
        if (!mem_res->flags)
-               return -1;
+               return;
 
-       mem_rstart = mem_res->start - mem_offset;
-       mem_rend = mem_res->end - mem_offset;
+       mem_rstart = mem_res->start - offset;
+       mem_rend = mem_res->end - offset;
 
        /* contain checking */
        if (!(mem_rstart <= rstart && mem_rend >= rend))
-               return -1;
+               return;
 
        res = kzalloc(sizeof(*res), GFP_KERNEL);
        if (!res)
-               return 0;
+               return;
 
        res->name = name;
        res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-       res->start = rstart + mem_offset;
-       res->end = rend + mem_offset;
+       res->start = rstart + offset;
+       res->end = rend + offset;
        conflict = request_resource_conflict(mem_res, res);
        if (conflict) {
                printk(KERN_DEBUG "PCI: %s can't claim %s %pR: address conflict with %s %pR\n",
                        pbm->name, res->name, res, conflict->name, conflict);
                kfree(res);
        }
-
-       return 0;
-}
-
-static void pci_register_region(struct pci_pbm_info *pbm, const char *name,
-                               resource_size_t rstart, resource_size_t size)
-{
-       int ret;
-
-       ret = pci_register_region_one(pbm, name, &pbm->mem_space,
-                                     pbm->mem_offset, rstart, size);
-
-       if (!ret)
-               return;
-
-       pci_register_region_one(pbm, name, &pbm->mem64_space,
-                               pbm->mem64_offset, rstart, size);
 }
 
 void pci_register_legacy_regions(struct pci_pbm_info *pbm)
@@ -402,6 +385,7 @@ static void pci_register_iommu_region(struct pci_pbm_info *pbm)
 void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
 {
        const struct linux_prom_pci_ranges *pbm_ranges;
+       resource_size_t mem64_offset = 0;
        int i, saw_mem, saw_io;
        int num_pbm_ranges;
 
@@ -472,7 +456,7 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
                        pbm->mem64_space.start = a;
                        pbm->mem64_space.end = a + size - 1UL;
                        pbm->mem64_space.flags = IORESOURCE_MEM;
-                       pbm->mem64_offset = a - region_a;
+                       mem64_offset = a - region_a;
                        saw_mem = 1;
                        break;
 
@@ -494,16 +478,17 @@ void pci_determine_mem_io_space(struct pci_pbm_info *pbm)
        if (pbm->mem_space.flags)
                printk("%s: PCI MEM %pR offset %llx\n",
                       pbm->name, &pbm->mem_space, pbm->mem_offset);
-       if (pbm->mem64_space.flags && pbm->mem_space.flags) {
-               if (pbm->mem64_space.start <= pbm->mem_space.end)
-                       pbm->mem64_space.start = pbm->mem_space.end + 1;
-               if (pbm->mem64_space.start > pbm->mem64_space.end)
-                       pbm->mem64_space.flags = 0;
-       }
+       if (pbm->mem64_space.flags) {
+               if (pbm->mem_space.flags) {
+                       if (mem64_offset != pbm->mem_offset)
+                               panic("mem offset %llx != mem64 offset %llx\n",
+                                       pbm->mem_offset, mem64_offset);
+               } else
+                       pbm->mem_offset = mem64_offset;
 
-       if (pbm->mem64_space.flags)
                printk("%s: PCI MEM64 %pR offset %llx\n",
-                      pbm->name, &pbm->mem64_space, pbm->mem64_offset);
+                      pbm->name, &pbm->mem64_space, pbm->mem_offset);
+       }
 
        pbm->io_space.name = pbm->mem_space.name = pbm->name;
        pbm->mem64_space.name = pbm->name;
index f5e37628130c40e0058a24902b2d34e209d79604..adad5785b308cc926d0f2f97ad6cc8face16d6b9 100644 (file)
@@ -113,7 +113,6 @@ struct pci_pbm_info {
        /* offset */
        resource_size_t                 io_offset;
        resource_size_t                 mem_offset;
-       resource_size_t                 mem64_offset;
 
        /* Base of PCI Config space, can be per-PBM or shared. */
        unsigned long                   config_space;