On Thu, Feb 18, 2016 at 08:25:35PM +0800, liudongdong (C) wrote:
[...]
+/*
- Map a pci_mmcfg_region, can be overrriden by arch
- */
+int __weak pci_mmconfig_map_resource(struct device *dev,
- struct pci_mmcfg_region *mcfg)
+{
- struct resource *tmp;
- void __iomem *vaddr;
- tmp = insert_resource_conflict(&iomem_resource, &mcfg->res);
- if (tmp) {
dev_warn(dev, "MMCONFIG %pR conflicts with %s %pR\n",
&mcfg->res, tmp->name, tmp);
return -EBUSY;
- }
- vaddr = ioremap(mcfg->res.start, resource_size(&mcfg->res));
^^ while at it, stray white space
- if (!vaddr) {
release_resource(&mcfg->res);
return -ENOMEM;
- }
- mcfg->virt = vaddr;
Here should be changed to mcfg->virt = vaddr - PCI_MMCFG_BUS_OFFSET(mcfg->start_bus);
or when pcie host "start_bus" is not 0, the configuraion access will be wrong.
Well spotted, thanks.
Lorenzo