|
@@ -448,6 +448,31 @@ static inline void iproc_pcie_apb_err_disable(struct pci_bus *bus,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void __iomem *iproc_pcie_map_ep_cfg_reg(struct iproc_pcie *pcie,
|
|
|
|
+ unsigned int busno,
|
|
|
|
+ unsigned int slot,
|
|
|
|
+ unsigned int fn,
|
|
|
|
+ int where)
|
|
|
|
+{
|
|
|
|
+ u16 offset;
|
|
|
|
+ u32 val;
|
|
|
|
+
|
|
|
|
+ /* EP device access */
|
|
|
|
+ val = (busno << CFG_ADDR_BUS_NUM_SHIFT) |
|
|
|
|
+ (slot << CFG_ADDR_DEV_NUM_SHIFT) |
|
|
|
|
+ (fn << CFG_ADDR_FUNC_NUM_SHIFT) |
|
|
|
|
+ (where & CFG_ADDR_REG_NUM_MASK) |
|
|
|
|
+ (1 & CFG_ADDR_CFG_TYPE_MASK);
|
|
|
|
+
|
|
|
|
+ iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val);
|
|
|
|
+ offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA);
|
|
|
|
+
|
|
|
|
+ if (iproc_pcie_reg_is_invalid(offset))
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ return (pcie->base + offset);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Note access to the configuration registers are protected at the higher layer
|
|
* Note access to the configuration registers are protected at the higher layer
|
|
* by 'pci_lock' in drivers/pci/access.c
|
|
* by 'pci_lock' in drivers/pci/access.c
|
|
@@ -459,7 +484,6 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie,
|
|
{
|
|
{
|
|
unsigned slot = PCI_SLOT(devfn);
|
|
unsigned slot = PCI_SLOT(devfn);
|
|
unsigned fn = PCI_FUNC(devfn);
|
|
unsigned fn = PCI_FUNC(devfn);
|
|
- u32 val;
|
|
|
|
u16 offset;
|
|
u16 offset;
|
|
|
|
|
|
/* root complex access */
|
|
/* root complex access */
|
|
@@ -484,18 +508,7 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie,
|
|
if (slot > 0)
|
|
if (slot > 0)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
- /* EP device access */
|
|
|
|
- val = (busno << CFG_ADDR_BUS_NUM_SHIFT) |
|
|
|
|
- (slot << CFG_ADDR_DEV_NUM_SHIFT) |
|
|
|
|
- (fn << CFG_ADDR_FUNC_NUM_SHIFT) |
|
|
|
|
- (where & CFG_ADDR_REG_NUM_MASK) |
|
|
|
|
- (1 & CFG_ADDR_CFG_TYPE_MASK);
|
|
|
|
- iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val);
|
|
|
|
- offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA);
|
|
|
|
- if (iproc_pcie_reg_is_invalid(offset))
|
|
|
|
- return NULL;
|
|
|
|
- else
|
|
|
|
- return (pcie->base + offset);
|
|
|
|
|
|
+ return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where);
|
|
}
|
|
}
|
|
|
|
|
|
static void __iomem *iproc_pcie_bus_map_cfg_bus(struct pci_bus *bus,
|
|
static void __iomem *iproc_pcie_bus_map_cfg_bus(struct pci_bus *bus,
|