diff options
Diffstat (limited to 'drivers/pci/pci-sysfs.c')
| -rw-r--r-- | drivers/pci/pci-sysfs.c | 26 | 
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index a15f94072a6f..cc9d65388e62 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -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; + +	for (i = 0; i < PCI_ROM_RESOURCE; i++) +		if (res == &pdev->resource[i]) +			break; +	if (i >= PCI_ROM_RESOURCE) +		return -ENODEV; -	vma->vm_pgoff += res->start >> PAGE_SHIFT; +	/* 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);  | 
