ia64/PCI: get rid of device resource fixups
Tell the PCI core about host bridge address translation so it can take care of bus-to-resource conversion for us. CC: Tony Luck <tony.luck@intel.com> CC: Jack Steiner <steiner@sgi.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
f920b55de4
commit
10d1cd2ba8
@ -108,11 +108,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)
|
|||||||
return (pci_domain_nr(bus) != 0);
|
return (pci_domain_nr(bus) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void pcibios_resource_to_bus(struct pci_dev *dev,
|
#define ARCH_HAS_GENERIC_PCI_OFFSETS
|
||||||
struct pci_bus_region *region, struct resource *res);
|
|
||||||
|
|
||||||
extern void pcibios_bus_to_resource(struct pci_dev *dev,
|
|
||||||
struct resource *res, struct pci_bus_region *region);
|
|
||||||
|
|
||||||
static inline struct resource *
|
static inline struct resource *
|
||||||
pcibios_select_root(struct pci_dev *pdev, struct resource *res)
|
pcibios_select_root(struct pci_dev *pdev, struct resource *res)
|
||||||
|
@ -320,7 +320,8 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
|
|||||||
* Ignore these tiny memory ranges */
|
* Ignore these tiny memory ranges */
|
||||||
if (!((window->resource.flags & IORESOURCE_MEM) &&
|
if (!((window->resource.flags & IORESOURCE_MEM) &&
|
||||||
(window->resource.end - window->resource.start < 16)))
|
(window->resource.end - window->resource.start < 16)))
|
||||||
pci_add_resource(&info->resources, &window->resource);
|
pci_add_resource_offset(&info->resources, &window->resource,
|
||||||
|
window->offset);
|
||||||
|
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
@ -395,54 +396,6 @@ out1:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcibios_resource_to_bus(struct pci_dev *dev,
|
|
||||||
struct pci_bus_region *region, struct resource *res)
|
|
||||||
{
|
|
||||||
struct pci_controller *controller = PCI_CONTROLLER(dev);
|
|
||||||
unsigned long offset = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < controller->windows; i++) {
|
|
||||||
struct pci_window *window = &controller->window[i];
|
|
||||||
if (!(window->resource.flags & res->flags))
|
|
||||||
continue;
|
|
||||||
if (window->resource.start > res->start)
|
|
||||||
continue;
|
|
||||||
if (window->resource.end < res->end)
|
|
||||||
continue;
|
|
||||||
offset = window->offset;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
region->start = res->start - offset;
|
|
||||||
region->end = res->end - offset;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(pcibios_resource_to_bus);
|
|
||||||
|
|
||||||
void pcibios_bus_to_resource(struct pci_dev *dev,
|
|
||||||
struct resource *res, struct pci_bus_region *region)
|
|
||||||
{
|
|
||||||
struct pci_controller *controller = PCI_CONTROLLER(dev);
|
|
||||||
unsigned long offset = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < controller->windows; i++) {
|
|
||||||
struct pci_window *window = &controller->window[i];
|
|
||||||
if (!(window->resource.flags & res->flags))
|
|
||||||
continue;
|
|
||||||
if (window->resource.start - window->offset > region->start)
|
|
||||||
continue;
|
|
||||||
if (window->resource.end - window->offset < region->end)
|
|
||||||
continue;
|
|
||||||
offset = window->offset;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
res->start = region->start + offset;
|
|
||||||
res->end = region->end + offset;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
|
||||||
|
|
||||||
static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
|
static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
|
||||||
{
|
{
|
||||||
unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
||||||
@ -464,15 +417,11 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
|
|||||||
static void __devinit
|
static void __devinit
|
||||||
pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
|
pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)
|
||||||
{
|
{
|
||||||
struct pci_bus_region region;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = start; i < limit; i++) {
|
for (i = start; i < limit; i++) {
|
||||||
if (!dev->resource[i].flags)
|
if (!dev->resource[i].flags)
|
||||||
continue;
|
continue;
|
||||||
region.start = dev->resource[i].start;
|
|
||||||
region.end = dev->resource[i].end;
|
|
||||||
pcibios_bus_to_resource(dev, &dev->resource[i], ®ion);
|
|
||||||
if ((is_valid_resource(dev, i)))
|
if ((is_valid_resource(dev, i)))
|
||||||
pci_claim_resource(dev, i);
|
pci_claim_resource(dev, i);
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,9 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
|||||||
prom_bussoft_ptr->bs_legacy_io,
|
prom_bussoft_ptr->bs_legacy_io,
|
||||||
prom_bussoft_ptr->bs_legacy_mem);
|
prom_bussoft_ptr->bs_legacy_mem);
|
||||||
for (i = 0; i < controller->windows; i++)
|
for (i = 0; i < controller->windows; i++)
|
||||||
pci_add_resource(&resources, &controller->window[i].resource);
|
pci_add_resource_offset(&resources,
|
||||||
|
&controller->window[i].resource,
|
||||||
|
controller->window[i].offset);
|
||||||
bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, controller,
|
bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, controller,
|
||||||
&resources);
|
&resources);
|
||||||
if (bus == NULL)
|
if (bus == NULL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user