Lines Matching refs:pcie

393 	struct iproc_pcie *pcie = bus->sysdata;  in iproc_data()  local
394 return pcie; in iproc_data()
402 static inline u16 iproc_pcie_reg_offset(struct iproc_pcie *pcie, in iproc_pcie_reg_offset() argument
405 return pcie->reg_offsets[reg]; in iproc_pcie_reg_offset()
408 static inline u32 iproc_pcie_read_reg(struct iproc_pcie *pcie, in iproc_pcie_read_reg() argument
411 u16 offset = iproc_pcie_reg_offset(pcie, reg); in iproc_pcie_read_reg()
416 return readl(pcie->base + offset); in iproc_pcie_read_reg()
419 static inline void iproc_pcie_write_reg(struct iproc_pcie *pcie, in iproc_pcie_write_reg() argument
422 u16 offset = iproc_pcie_reg_offset(pcie, reg); in iproc_pcie_write_reg()
427 writel(val, pcie->base + offset); in iproc_pcie_write_reg()
439 struct iproc_pcie *pcie = iproc_data(bus); in iproc_pcie_apb_err_disable() local
442 if (bus->number && pcie->has_apb_err_disable) { in iproc_pcie_apb_err_disable()
443 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_APB_ERR_EN); in iproc_pcie_apb_err_disable()
448 iproc_pcie_write_reg(pcie, IPROC_PCIE_APB_ERR_EN, val); in iproc_pcie_apb_err_disable()
452 static void __iomem *iproc_pcie_map_ep_cfg_reg(struct iproc_pcie *pcie, in iproc_pcie_map_ep_cfg_reg() argument
468 iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val); in iproc_pcie_map_ep_cfg_reg()
469 offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA); in iproc_pcie_map_ep_cfg_reg()
474 return (pcie->base + offset); in iproc_pcie_map_ep_cfg_reg()
511 static void iproc_pcie_fix_cap(struct iproc_pcie *pcie, int where, u32 *val) in iproc_pcie_fix_cap() argument
525 pcie->fix_paxc_cap = true; in iproc_pcie_fix_cap()
529 if (pcie->fix_paxc_cap) { in iproc_pcie_fix_cap()
537 if (pcie->fix_paxc_cap) { in iproc_pcie_fix_cap()
557 struct iproc_pcie *pcie = iproc_data(bus); in iproc_pcie_config_read() local
569 iproc_pcie_fix_cap(pcie, where, val); in iproc_pcie_config_read()
574 cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); in iproc_pcie_config_read()
598 if (pcie->rej_unconfig_pf && in iproc_pcie_config_read()
611 static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie, in iproc_pcie_map_cfg_bus() argument
624 iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR, in iproc_pcie_map_cfg_bus()
626 offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA); in iproc_pcie_map_cfg_bus()
630 return (pcie->base + offset); in iproc_pcie_map_cfg_bus()
633 return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); in iproc_pcie_map_cfg_bus()
644 static int iproc_pci_raw_config_read32(struct iproc_pcie *pcie, in iproc_pci_raw_config_read32() argument
650 addr = iproc_pcie_map_cfg_bus(pcie, 0, devfn, where & ~0x3); in iproc_pci_raw_config_read32()
664 static int iproc_pci_raw_config_write32(struct iproc_pcie *pcie, in iproc_pci_raw_config_write32() argument
671 addr = iproc_pcie_map_cfg_bus(pcie, 0, devfn, where & ~0x3); in iproc_pci_raw_config_write32()
692 struct iproc_pcie *pcie = iproc_data(bus); in iproc_pcie_config_read32() local
695 if (pcie->iproc_cfg_read) in iproc_pcie_config_read32()
722 static void iproc_pcie_perst_ctrl(struct iproc_pcie *pcie, bool assert) in iproc_pcie_perst_ctrl() argument
731 if (pcie->ep_is_internal) in iproc_pcie_perst_ctrl()
735 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL); in iproc_pcie_perst_ctrl()
738 iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val); in iproc_pcie_perst_ctrl()
741 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL); in iproc_pcie_perst_ctrl()
743 iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val); in iproc_pcie_perst_ctrl()
748 int iproc_pcie_shutdown(struct iproc_pcie *pcie) in iproc_pcie_shutdown() argument
750 iproc_pcie_perst_ctrl(pcie, true); in iproc_pcie_shutdown()
757 static int iproc_pcie_check_link(struct iproc_pcie *pcie) in iproc_pcie_check_link() argument
759 struct device *dev = pcie->dev; in iproc_pcie_check_link()
767 if (pcie->ep_is_internal) in iproc_pcie_check_link()
770 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_LINK_STATUS); in iproc_pcie_check_link()
777 iproc_pci_raw_config_read32(pcie, 0, PCI_HEADER_TYPE, 1, &hdr_type); in iproc_pcie_check_link()
787 iproc_pci_raw_config_read32(pcie, 0, PCI_BRIDGE_CTRL_REG_OFFSET, in iproc_pcie_check_link()
791 iproc_pci_raw_config_write32(pcie, 0, PCI_BRIDGE_CTRL_REG_OFFSET, in iproc_pcie_check_link()
795 iproc_pci_raw_config_read32(pcie, 0, IPROC_PCI_EXP_CAP + PCI_EXP_LNKSTA, in iproc_pcie_check_link()
805 iproc_pci_raw_config_read32(pcie, 0, in iproc_pcie_check_link()
812 iproc_pci_raw_config_write32(pcie, 0, in iproc_pcie_check_link()
817 iproc_pci_raw_config_read32(pcie, 0, in iproc_pcie_check_link()
830 static void iproc_pcie_enable(struct iproc_pcie *pcie) in iproc_pcie_enable() argument
832 iproc_pcie_write_reg(pcie, IPROC_PCIE_INTX_EN, SYS_RC_INTX_MASK); in iproc_pcie_enable()
835 static inline bool iproc_pcie_ob_is_valid(struct iproc_pcie *pcie, in iproc_pcie_ob_is_valid() argument
840 val = iproc_pcie_read_reg(pcie, MAP_REG(IPROC_PCIE_OARR0, window_idx)); in iproc_pcie_ob_is_valid()
845 static inline int iproc_pcie_ob_write(struct iproc_pcie *pcie, int window_idx, in iproc_pcie_ob_write() argument
848 struct device *dev = pcie->dev; in iproc_pcie_ob_write()
855 oarr_offset = iproc_pcie_reg_offset(pcie, MAP_REG(IPROC_PCIE_OARR0, in iproc_pcie_ob_write()
857 omap_offset = iproc_pcie_reg_offset(pcie, MAP_REG(IPROC_PCIE_OMAP0, in iproc_pcie_ob_write()
868 OARR_VALID, pcie->base + oarr_offset); in iproc_pcie_ob_write()
869 writel(upper_32_bits(axi_addr), pcie->base + oarr_offset + 4); in iproc_pcie_ob_write()
872 writel(lower_32_bits(pci_addr), pcie->base + omap_offset); in iproc_pcie_ob_write()
873 writel(upper_32_bits(pci_addr), pcie->base + omap_offset + 4); in iproc_pcie_ob_write()
878 readl(pcie->base + oarr_offset), in iproc_pcie_ob_write()
879 readl(pcie->base + oarr_offset + 4)); in iproc_pcie_ob_write()
881 readl(pcie->base + omap_offset), in iproc_pcie_ob_write()
882 readl(pcie->base + omap_offset + 4)); in iproc_pcie_ob_write()
898 static int iproc_pcie_setup_ob(struct iproc_pcie *pcie, u64 axi_addr, in iproc_pcie_setup_ob() argument
901 struct iproc_pcie_ob *ob = &pcie->ob; in iproc_pcie_setup_ob()
902 struct device *dev = pcie->dev; in iproc_pcie_setup_ob()
920 &pcie->ob_map[window_idx]; in iproc_pcie_setup_ob()
926 if (iproc_pcie_ob_is_valid(pcie, window_idx)) in iproc_pcie_setup_ob()
954 ret = iproc_pcie_ob_write(pcie, window_idx, size_idx, in iproc_pcie_setup_ob()
983 static int iproc_pcie_map_ranges(struct iproc_pcie *pcie, in iproc_pcie_map_ranges() argument
986 struct device *dev = pcie->dev; in iproc_pcie_map_ranges()
999 ret = iproc_pcie_setup_ob(pcie, res->start, in iproc_pcie_map_ranges()
1014 static inline bool iproc_pcie_ib_is_in_use(struct iproc_pcie *pcie, in iproc_pcie_ib_is_in_use() argument
1017 const struct iproc_pcie_ib_map *ib_map = &pcie->ib_map[region_idx]; in iproc_pcie_ib_is_in_use()
1020 val = iproc_pcie_read_reg(pcie, MAP_REG(IPROC_PCIE_IARR0, region_idx)); in iproc_pcie_ib_is_in_use()
1031 static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx, in iproc_pcie_ib_write() argument
1035 struct device *dev = pcie->dev; in iproc_pcie_ib_write()
1036 const struct iproc_pcie_ib_map *ib_map = &pcie->ib_map[region_idx]; in iproc_pcie_ib_write()
1041 iarr_offset = iproc_pcie_reg_offset(pcie, in iproc_pcie_ib_write()
1043 imap_offset = iproc_pcie_reg_offset(pcie, in iproc_pcie_ib_write()
1057 pcie->base + iarr_offset); in iproc_pcie_ib_write()
1058 writel(upper_32_bits(pci_addr), pcie->base + iarr_offset + 4); in iproc_pcie_ib_write()
1061 readl(pcie->base + iarr_offset), in iproc_pcie_ib_write()
1062 readl(pcie->base + iarr_offset + 4)); in iproc_pcie_ib_write()
1070 val = readl(pcie->base + imap_offset); in iproc_pcie_ib_write()
1072 writel(val, pcie->base + imap_offset); in iproc_pcie_ib_write()
1074 pcie->base + imap_offset + ib_map->imap_addr_offset); in iproc_pcie_ib_write()
1077 window_idx, readl(pcie->base + imap_offset), in iproc_pcie_ib_write()
1078 readl(pcie->base + imap_offset + in iproc_pcie_ib_write()
1088 static int iproc_pcie_setup_ib(struct iproc_pcie *pcie, in iproc_pcie_setup_ib() argument
1092 struct device *dev = pcie->dev; in iproc_pcie_setup_ib()
1093 struct iproc_pcie_ib *ib = &pcie->ib; in iproc_pcie_setup_ib()
1102 &pcie->ib_map[region_idx]; in iproc_pcie_setup_ib()
1108 if (iproc_pcie_ib_is_in_use(pcie, region_idx) || in iproc_pcie_setup_ib()
1129 ret = iproc_pcie_ib_write(pcie, region_idx, size_idx, in iproc_pcie_setup_ib()
1149 static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie) in iproc_pcie_map_dma_ranges() argument
1156 ret = of_pci_dma_range_parser_init(&parser, pcie->dev->of_node); in iproc_pcie_map_dma_ranges()
1162 ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_MEM); in iproc_pcie_map_dma_ranges()
1170 static int iproce_pcie_get_msi(struct iproc_pcie *pcie, in iproce_pcie_get_msi() argument
1174 struct device *dev = pcie->dev; in iproce_pcie_get_msi()
1198 static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr) in iproc_pcie_paxb_v2_msi_steer() argument
1207 ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_IO); in iproc_pcie_paxb_v2_msi_steer()
1211 static void iproc_pcie_paxc_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr, in iproc_pcie_paxc_v2_msi_steer() argument
1221 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG); in iproc_pcie_paxc_v2_msi_steer()
1223 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val); in iproc_pcie_paxc_v2_msi_steer()
1233 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_BASE_ADDR, in iproc_pcie_paxc_v2_msi_steer()
1237 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_WINDOW_SIZE, 0); in iproc_pcie_paxc_v2_msi_steer()
1240 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_GIC_MODE); in iproc_pcie_paxc_v2_msi_steer()
1242 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_GIC_MODE, val); in iproc_pcie_paxc_v2_msi_steer()
1249 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_ADDR_HI, in iproc_pcie_paxc_v2_msi_steer()
1251 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_ADDR_LO, in iproc_pcie_paxc_v2_msi_steer()
1255 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG); in iproc_pcie_paxc_v2_msi_steer()
1257 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val); in iproc_pcie_paxc_v2_msi_steer()
1260 static int iproc_pcie_msi_steer(struct iproc_pcie *pcie, in iproc_pcie_msi_steer() argument
1263 struct device *dev = pcie->dev; in iproc_pcie_msi_steer()
1267 ret = iproce_pcie_get_msi(pcie, msi_node, &msi_addr); in iproc_pcie_msi_steer()
1273 switch (pcie->type) { in iproc_pcie_msi_steer()
1275 ret = iproc_pcie_paxb_v2_msi_steer(pcie, msi_addr); in iproc_pcie_msi_steer()
1280 iproc_pcie_paxc_v2_msi_steer(pcie, msi_addr, true); in iproc_pcie_msi_steer()
1289 static int iproc_pcie_msi_enable(struct iproc_pcie *pcie) in iproc_pcie_msi_enable() argument
1299 msi_node = of_parse_phandle(pcie->dev->of_node, "msi-parent", 0); in iproc_pcie_msi_enable()
1305 msi_map = of_get_property(pcie->dev->of_node, "msi-map", &len); in iproc_pcie_msi_enable()
1320 if (pcie->need_msi_steer) { in iproc_pcie_msi_enable()
1321 ret = iproc_pcie_msi_steer(pcie, msi_node); in iproc_pcie_msi_enable()
1330 return iproc_msi_init(pcie, msi_node); in iproc_pcie_msi_enable()
1333 static void iproc_pcie_msi_disable(struct iproc_pcie *pcie) in iproc_pcie_msi_disable() argument
1335 iproc_msi_exit(pcie); in iproc_pcie_msi_disable()
1338 static int iproc_pcie_rev_init(struct iproc_pcie *pcie) in iproc_pcie_rev_init() argument
1340 struct device *dev = pcie->dev; in iproc_pcie_rev_init()
1344 switch (pcie->type) { in iproc_pcie_rev_init()
1350 pcie->has_apb_err_disable = true; in iproc_pcie_rev_init()
1351 if (pcie->need_ob_cfg) { in iproc_pcie_rev_init()
1352 pcie->ob_map = paxb_ob_map; in iproc_pcie_rev_init()
1353 pcie->ob.nr_windows = ARRAY_SIZE(paxb_ob_map); in iproc_pcie_rev_init()
1358 pcie->iproc_cfg_read = true; in iproc_pcie_rev_init()
1359 pcie->has_apb_err_disable = true; in iproc_pcie_rev_init()
1360 if (pcie->need_ob_cfg) { in iproc_pcie_rev_init()
1361 pcie->ob_map = paxb_v2_ob_map; in iproc_pcie_rev_init()
1362 pcie->ob.nr_windows = ARRAY_SIZE(paxb_v2_ob_map); in iproc_pcie_rev_init()
1364 pcie->ib.nr_regions = ARRAY_SIZE(paxb_v2_ib_map); in iproc_pcie_rev_init()
1365 pcie->ib_map = paxb_v2_ib_map; in iproc_pcie_rev_init()
1366 pcie->need_msi_steer = true; in iproc_pcie_rev_init()
1372 pcie->ep_is_internal = true; in iproc_pcie_rev_init()
1373 pcie->iproc_cfg_read = true; in iproc_pcie_rev_init()
1374 pcie->rej_unconfig_pf = true; in iproc_pcie_rev_init()
1378 pcie->ep_is_internal = true; in iproc_pcie_rev_init()
1379 pcie->iproc_cfg_read = true; in iproc_pcie_rev_init()
1380 pcie->rej_unconfig_pf = true; in iproc_pcie_rev_init()
1381 pcie->need_msi_steer = true; in iproc_pcie_rev_init()
1388 pcie->reg_offsets = devm_kcalloc(dev, IPROC_PCIE_MAX_NUM_REG, in iproc_pcie_rev_init()
1389 sizeof(*pcie->reg_offsets), in iproc_pcie_rev_init()
1391 if (!pcie->reg_offsets) in iproc_pcie_rev_init()
1395 pcie->reg_offsets[0] = (pcie->type == IPROC_PCIE_PAXC_V2) ? in iproc_pcie_rev_init()
1398 pcie->reg_offsets[reg_idx] = regs[reg_idx] ? in iproc_pcie_rev_init()
1404 int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res) in iproc_pcie_setup() argument
1409 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie); in iproc_pcie_setup()
1411 dev = pcie->dev; in iproc_pcie_setup()
1413 ret = iproc_pcie_rev_init(pcie); in iproc_pcie_setup()
1423 ret = phy_init(pcie->phy); in iproc_pcie_setup()
1429 ret = phy_power_on(pcie->phy); in iproc_pcie_setup()
1435 iproc_pcie_perst_ctrl(pcie, true); in iproc_pcie_setup()
1436 iproc_pcie_perst_ctrl(pcie, false); in iproc_pcie_setup()
1438 if (pcie->need_ob_cfg) { in iproc_pcie_setup()
1439 ret = iproc_pcie_map_ranges(pcie, res); in iproc_pcie_setup()
1446 if (pcie->need_ib_cfg) { in iproc_pcie_setup()
1447 ret = iproc_pcie_map_dma_ranges(pcie); in iproc_pcie_setup()
1452 ret = iproc_pcie_check_link(pcie); in iproc_pcie_setup()
1458 iproc_pcie_enable(pcie); in iproc_pcie_setup()
1461 if (iproc_pcie_msi_enable(pcie)) in iproc_pcie_setup()
1468 host->sysdata = pcie; in iproc_pcie_setup()
1469 host->map_irq = pcie->map_irq; in iproc_pcie_setup()
1480 pcie->root_bus = host->bus; in iproc_pcie_setup()
1490 phy_power_off(pcie->phy); in iproc_pcie_setup()
1492 phy_exit(pcie->phy); in iproc_pcie_setup()
1497 int iproc_pcie_remove(struct iproc_pcie *pcie) in iproc_pcie_remove() argument
1499 pci_stop_root_bus(pcie->root_bus); in iproc_pcie_remove()
1500 pci_remove_root_bus(pcie->root_bus); in iproc_pcie_remove()
1502 iproc_pcie_msi_disable(pcie); in iproc_pcie_remove()
1504 phy_power_off(pcie->phy); in iproc_pcie_remove()
1505 phy_exit(pcie->phy); in iproc_pcie_remove()
1517 struct iproc_pcie *pcie = iproc_data(pdev->bus); in quirk_paxc_disable_msi_parsing() local
1520 iproc_pcie_paxc_v2_msi_steer(pcie, 0, false); in quirk_paxc_disable_msi_parsing()