|
@@ -60,15 +60,18 @@ resource_show(struct device * dev, struct device_attribute *attr, char * buf)
|
|
|
char * str = buf;
|
|
|
int i;
|
|
|
int max = 7;
|
|
|
+ u64 start, end;
|
|
|
|
|
|
if (pci_dev->subordinate)
|
|
|
max = DEVICE_COUNT_RESOURCE;
|
|
|
|
|
|
for (i = 0; i < max; i++) {
|
|
|
- str += sprintf(str,"0x%016lx 0x%016lx 0x%016lx\n",
|
|
|
- pci_resource_start(pci_dev,i),
|
|
|
- pci_resource_end(pci_dev,i),
|
|
|
- pci_resource_flags(pci_dev,i));
|
|
|
+ struct resource *res = &pci_dev->resource[i];
|
|
|
+ pci_resource_to_user(pci_dev, i, res, &start, &end);
|
|
|
+ str += sprintf(str,"0x%016llx 0x%016llx 0x%016llx\n",
|
|
|
+ (unsigned long long)start,
|
|
|
+ (unsigned long long)end,
|
|
|
+ (unsigned long long)res->flags);
|
|
|
}
|
|
|
return (str - buf);
|
|
|
}
|
|
@@ -313,8 +316,21 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
|
|
|
struct device, kobj));
|
|
|
struct resource *res = (struct resource *)attr->private;
|
|
|
enum pci_mmap_state mmap_type;
|
|
|
+ u64 start, end;
|
|
|
+ int i;
|
|
|
|
|
|
- vma->vm_pgoff += res->start >> PAGE_SHIFT;
|
|
|
+ for (i = 0; i < PCI_ROM_RESOURCE; i++)
|
|
|
+ if (res == &pdev->resource[i])
|
|
|
+ break;
|
|
|
+ if (i >= PCI_ROM_RESOURCE)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ /* pci_mmap_page_range() expects the same kind of entry as coming
|
|
|
+ * from /proc/bus/pci/ which is a "user visible" value. If this is
|
|
|
+ * different from the resource itself, arch will do necessary fixup.
|
|
|
+ */
|
|
|
+ pci_resource_to_user(pdev, i, res, &start, &end);
|
|
|
+ vma->vm_pgoff += start >> PAGE_SHIFT;
|
|
|
mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
|
|
|
|
|
|
return pci_mmap_page_range(pdev, vma, mmap_type, 0);
|