Lines Matching refs:pcie

24 #include "pcie-iproc.h"
410 struct iproc_pcie *pcie = bus->sysdata;
411 return pcie;
419 static inline u16 iproc_pcie_reg_offset(struct iproc_pcie *pcie,
422 return pcie->reg_offsets[reg];
425 static inline u32 iproc_pcie_read_reg(struct iproc_pcie *pcie,
428 u16 offset = iproc_pcie_reg_offset(pcie, reg);
433 return readl(pcie->base + offset);
436 static inline void iproc_pcie_write_reg(struct iproc_pcie *pcie,
439 u16 offset = iproc_pcie_reg_offset(pcie, reg);
444 writel(val, pcie->base + offset);
456 struct iproc_pcie *pcie = iproc_data(bus);
459 if (bus->number && pcie->has_apb_err_disable) {
460 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_APB_ERR_EN);
465 iproc_pcie_write_reg(pcie, IPROC_PCIE_APB_ERR_EN, val);
469 static void __iomem *iproc_pcie_map_ep_cfg_reg(struct iproc_pcie *pcie,
485 iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val);
486 offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA);
491 return (pcie->base + offset);
494 static unsigned int iproc_pcie_cfg_retry(struct iproc_pcie *pcie,
525 status = iproc_pcie_read_reg(pcie, IPROC_PCIE_CFG_RD_STATUS);
539 static void iproc_pcie_fix_cap(struct iproc_pcie *pcie, int where, u32 *val)
553 pcie->fix_paxc_cap = true;
557 if (pcie->fix_paxc_cap) {
565 if (pcie->fix_paxc_cap) {
585 struct iproc_pcie *pcie = iproc_data(bus);
597 iproc_pcie_fix_cap(pcie, where, val);
602 cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where);
607 data = iproc_pcie_cfg_retry(pcie, cfg_data_p);
626 if (pcie->rej_unconfig_pf &&
639 static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie,
652 iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR,
654 offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA);
658 return (pcie->base + offset);
661 return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where);
672 static int iproc_pci_raw_config_read32(struct iproc_pcie *pcie,
678 addr = iproc_pcie_map_cfg_bus(pcie, 0, devfn, where & ~0x3);
692 static int iproc_pci_raw_config_write32(struct iproc_pcie *pcie,
699 addr = iproc_pcie_map_cfg_bus(pcie, 0, devfn, where & ~0x3);
720 struct iproc_pcie *pcie = iproc_data(bus);
723 if (pcie->iproc_cfg_read)
750 static void iproc_pcie_perst_ctrl(struct iproc_pcie *pcie, bool assert)
759 if (pcie->ep_is_internal)
763 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);
766 iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
769 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);
771 iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
776 int iproc_pcie_shutdown(struct iproc_pcie *pcie)
778 iproc_pcie_perst_ctrl(pcie, true);
785 static int iproc_pcie_check_link(struct iproc_pcie *pcie)
787 struct device *dev = pcie->dev;
795 if (pcie->ep_is_internal)
798 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_LINK_STATUS);
805 iproc_pci_raw_config_read32(pcie, 0, PCI_HEADER_TYPE, 1, &hdr_type);
815 iproc_pci_raw_config_read32(pcie, 0, PCI_BRIDGE_CTRL_REG_OFFSET,
819 iproc_pci_raw_config_write32(pcie, 0, PCI_BRIDGE_CTRL_REG_OFFSET,
823 iproc_pci_raw_config_read32(pcie, 0, IPROC_PCI_EXP_CAP + PCI_EXP_LNKSTA,
833 iproc_pci_raw_config_read32(pcie, 0,
840 iproc_pci_raw_config_write32(pcie, 0,
845 iproc_pci_raw_config_read32(pcie, 0,
858 static void iproc_pcie_enable(struct iproc_pcie *pcie)
860 iproc_pcie_write_reg(pcie, IPROC_PCIE_INTX_EN, SYS_RC_INTX_MASK);
863 static inline bool iproc_pcie_ob_is_valid(struct iproc_pcie *pcie,
868 val = iproc_pcie_read_reg(pcie, MAP_REG(IPROC_PCIE_OARR0, window_idx));
873 static inline int iproc_pcie_ob_write(struct iproc_pcie *pcie, int window_idx,
876 struct device *dev = pcie->dev;
883 oarr_offset = iproc_pcie_reg_offset(pcie, MAP_REG(IPROC_PCIE_OARR0,
885 omap_offset = iproc_pcie_reg_offset(pcie, MAP_REG(IPROC_PCIE_OMAP0,
896 OARR_VALID, pcie->base + oarr_offset);
897 writel(upper_32_bits(axi_addr), pcie->base + oarr_offset + 4);
900 writel(lower_32_bits(pci_addr), pcie->base + omap_offset);
901 writel(upper_32_bits(pci_addr), pcie->base + omap_offset + 4);
906 readl(pcie->base + oarr_offset),
907 readl(pcie->base + oarr_offset + 4));
909 readl(pcie->base + omap_offset),
910 readl(pcie->base + omap_offset + 4));
926 static int iproc_pcie_setup_ob(struct iproc_pcie *pcie, u64 axi_addr,
929 struct iproc_pcie_ob *ob = &pcie->ob;
930 struct device *dev = pcie->dev;
948 &pcie->ob_map[window_idx];
954 if (iproc_pcie_ob_is_valid(pcie, window_idx))
999 ret = iproc_pcie_ob_write(pcie, window_idx, size_idx,
1028 static int iproc_pcie_map_ranges(struct iproc_pcie *pcie,
1031 struct device *dev = pcie->dev;
1044 ret = iproc_pcie_setup_ob(pcie, res->start,
1059 static inline bool iproc_pcie_ib_is_in_use(struct iproc_pcie *pcie,
1062 const struct iproc_pcie_ib_map *ib_map = &pcie->ib_map[region_idx];
1065 val = iproc_pcie_read_reg(pcie, MAP_REG(IPROC_PCIE_IARR0, region_idx));
1076 static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx,
1080 struct device *dev = pcie->dev;
1081 const struct iproc_pcie_ib_map *ib_map = &pcie->ib_map[region_idx];
1086 iarr_offset = iproc_pcie_reg_offset(pcie,
1088 imap_offset = iproc_pcie_reg_offset(pcie,
1102 pcie->base + iarr_offset);
1103 writel(upper_32_bits(pci_addr), pcie->base + iarr_offset + 4);
1106 readl(pcie->base + iarr_offset),
1107 readl(pcie->base + iarr_offset + 4));
1115 val = readl(pcie->base + imap_offset);
1117 writel(val, pcie->base + imap_offset);
1119 pcie->base + imap_offset + ib_map->imap_addr_offset);
1122 window_idx, readl(pcie->base + imap_offset),
1123 readl(pcie->base + imap_offset +
1133 static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
1137 struct device *dev = pcie->dev;
1138 struct iproc_pcie_ib *ib = &pcie->ib;
1148 &pcie->ib_map[region_idx];
1154 if (iproc_pcie_ib_is_in_use(pcie, region_idx) ||
1175 ret = iproc_pcie_ib_write(pcie, region_idx, size_idx,
1195 static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie)
1197 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1203 ret = iproc_pcie_setup_ib(pcie, entry, IPROC_PCIE_IB_MAP_MEM);
1211 static void iproc_pcie_invalidate_mapping(struct iproc_pcie *pcie)
1213 struct iproc_pcie_ib *ib = &pcie->ib;
1214 struct iproc_pcie_ob *ob = &pcie->ob;
1217 if (pcie->ep_is_internal)
1220 if (pcie->need_ob_cfg) {
1223 iproc_pcie_write_reg(pcie,
1228 if (pcie->need_ib_cfg) {
1231 iproc_pcie_write_reg(pcie,
1237 static int iproce_pcie_get_msi(struct iproc_pcie *pcie,
1241 struct device *dev = pcie->dev;
1265 static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr)
1277 ret = iproc_pcie_setup_ib(pcie, &entry, IPROC_PCIE_IB_MAP_IO);
1281 static void iproc_pcie_paxc_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr,
1291 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG);
1293 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val);
1303 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_BASE_ADDR,
1307 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_WINDOW_SIZE, 0);
1310 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_GIC_MODE);
1312 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_GIC_MODE, val);
1319 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_ADDR_HI,
1321 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_ADDR_LO,
1325 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG);
1327 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val);
1330 static int iproc_pcie_msi_steer(struct iproc_pcie *pcie,
1333 struct device *dev = pcie->dev;
1337 ret = iproce_pcie_get_msi(pcie, msi_node, &msi_addr);
1343 switch (pcie->type) {
1345 ret = iproc_pcie_paxb_v2_msi_steer(pcie, msi_addr);
1350 iproc_pcie_paxc_v2_msi_steer(pcie, msi_addr, true);
1359 static int iproc_pcie_msi_enable(struct iproc_pcie *pcie)
1369 msi_node = of_parse_phandle(pcie->dev->of_node, "msi-parent", 0);
1375 msi_map = of_get_property(pcie->dev->of_node, "msi-map", &len);
1390 if (pcie->need_msi_steer) {
1391 ret = iproc_pcie_msi_steer(pcie, msi_node);
1400 ret = iproc_msi_init(pcie, msi_node);
1407 static void iproc_pcie_msi_disable(struct iproc_pcie *pcie)
1409 iproc_msi_exit(pcie);
1412 static int iproc_pcie_rev_init(struct iproc_pcie *pcie)
1414 struct device *dev = pcie->dev;
1418 switch (pcie->type) {
1424 pcie->has_apb_err_disable = true;
1425 if (pcie->need_ob_cfg) {
1426 pcie->ob_map = paxb_ob_map;
1427 pcie->ob.nr_windows = ARRAY_SIZE(paxb_ob_map);
1432 pcie->iproc_cfg_read = true;
1433 pcie->has_apb_err_disable = true;
1434 if (pcie->need_ob_cfg) {
1435 pcie->ob_map = paxb_v2_ob_map;
1436 pcie->ob.nr_windows = ARRAY_SIZE(paxb_v2_ob_map);
1438 pcie->ib.nr_regions = ARRAY_SIZE(paxb_v2_ib_map);
1439 pcie->ib_map = paxb_v2_ib_map;
1440 pcie->need_msi_steer = true;
1446 pcie->ep_is_internal = true;
1447 pcie->iproc_cfg_read = true;
1448 pcie->rej_unconfig_pf = true;
1452 pcie->ep_is_internal = true;
1453 pcie->iproc_cfg_read = true;
1454 pcie->rej_unconfig_pf = true;
1455 pcie->need_msi_steer = true;
1462 pcie->reg_offsets = devm_kcalloc(dev, IPROC_PCIE_MAX_NUM_REG,
1463 sizeof(*pcie->reg_offsets),
1465 if (!pcie->reg_offsets)
1469 pcie->reg_offsets[0] = (pcie->type == IPROC_PCIE_PAXC_V2) ?
1472 pcie->reg_offsets[reg_idx] = regs[reg_idx] ?
1478 int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
1482 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1484 dev = pcie->dev;
1486 ret = iproc_pcie_rev_init(pcie);
1492 ret = phy_init(pcie->phy);
1498 ret = phy_power_on(pcie->phy);
1504 iproc_pcie_perst_ctrl(pcie, true);
1505 iproc_pcie_perst_ctrl(pcie, false);
1507 iproc_pcie_invalidate_mapping(pcie);
1509 if (pcie->need_ob_cfg) {
1510 ret = iproc_pcie_map_ranges(pcie, res);
1517 if (pcie->need_ib_cfg) {
1518 ret = iproc_pcie_map_dma_ranges(pcie);
1523 ret = iproc_pcie_check_link(pcie);
1529 iproc_pcie_enable(pcie);
1532 if (iproc_pcie_msi_enable(pcie))
1536 host->sysdata = pcie;
1537 host->map_irq = pcie->map_irq;
1548 phy_power_off(pcie->phy);
1550 phy_exit(pcie->phy);
1555 int iproc_pcie_remove(struct iproc_pcie *pcie)
1557 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1562 iproc_pcie_msi_disable(pcie);
1564 phy_power_off(pcie->phy);
1565 phy_exit(pcie->phy);
1577 struct iproc_pcie *pcie = iproc_data(pdev->bus);
1580 iproc_pcie_paxc_v2_msi_steer(pcie, 0, false);