Lines Matching refs:pcie

24 #include "pcie-iproc.h"
400 struct iproc_pcie *pcie = bus->sysdata;
401 return pcie;
409 static inline u16 iproc_pcie_reg_offset(struct iproc_pcie *pcie,
412 return pcie->reg_offsets[reg];
415 static inline u32 iproc_pcie_read_reg(struct iproc_pcie *pcie,
418 u16 offset = iproc_pcie_reg_offset(pcie, reg);
423 return readl(pcie->base + offset);
426 static inline void iproc_pcie_write_reg(struct iproc_pcie *pcie,
429 u16 offset = iproc_pcie_reg_offset(pcie, reg);
434 writel(val, pcie->base + offset);
446 struct iproc_pcie *pcie = iproc_data(bus);
449 if (bus->number && pcie->has_apb_err_disable) {
450 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_APB_ERR_EN);
455 iproc_pcie_write_reg(pcie, IPROC_PCIE_APB_ERR_EN, val);
459 static void __iomem *iproc_pcie_map_ep_cfg_reg(struct iproc_pcie *pcie,
471 iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_ADDR, val);
472 offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_DATA);
477 return (pcie->base + offset);
480 static unsigned int iproc_pcie_cfg_retry(struct iproc_pcie *pcie,
511 status = iproc_pcie_read_reg(pcie, IPROC_PCIE_CFG_RD_STATUS);
525 static void iproc_pcie_fix_cap(struct iproc_pcie *pcie, int where, u32 *val)
539 pcie->fix_paxc_cap = true;
543 if (pcie->fix_paxc_cap) {
551 if (pcie->fix_paxc_cap) {
571 struct iproc_pcie *pcie = iproc_data(bus);
581 iproc_pcie_fix_cap(pcie, where, val);
586 cfg_data_p = iproc_pcie_map_ep_cfg_reg(pcie, busno, devfn, where);
591 data = iproc_pcie_cfg_retry(pcie, cfg_data_p);
610 if (pcie->rej_unconfig_pf &&
623 static void __iomem *iproc_pcie_map_cfg_bus(struct iproc_pcie *pcie,
634 iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR,
636 offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA);
640 return (pcie->base + offset);
643 return iproc_pcie_map_ep_cfg_reg(pcie, busno, devfn, where);
654 static int iproc_pci_raw_config_read32(struct iproc_pcie *pcie,
660 addr = iproc_pcie_map_cfg_bus(pcie, 0, devfn, where & ~0x3);
672 static int iproc_pci_raw_config_write32(struct iproc_pcie *pcie,
679 addr = iproc_pcie_map_cfg_bus(pcie, 0, devfn, where & ~0x3);
700 struct iproc_pcie *pcie = iproc_data(bus);
703 if (pcie->iproc_cfg_read)
730 static void iproc_pcie_perst_ctrl(struct iproc_pcie *pcie, bool assert)
739 if (pcie->ep_is_internal)
743 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);
746 iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
749 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_CLK_CTRL);
751 iproc_pcie_write_reg(pcie, IPROC_PCIE_CLK_CTRL, val);
756 int iproc_pcie_shutdown(struct iproc_pcie *pcie)
758 iproc_pcie_perst_ctrl(pcie, true);
765 static int iproc_pcie_check_link(struct iproc_pcie *pcie)
767 struct device *dev = pcie->dev;
775 if (pcie->ep_is_internal)
778 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_LINK_STATUS);
785 iproc_pci_raw_config_read32(pcie, 0, PCI_HEADER_TYPE, 1, &hdr_type);
794 iproc_pci_raw_config_read32(pcie, 0, PCI_BRIDGE_CTRL_REG_OFFSET,
798 iproc_pci_raw_config_write32(pcie, 0, PCI_BRIDGE_CTRL_REG_OFFSET,
802 iproc_pci_raw_config_read32(pcie, 0, IPROC_PCI_EXP_CAP + PCI_EXP_LNKSTA,
812 iproc_pci_raw_config_read32(pcie, 0,
819 iproc_pci_raw_config_write32(pcie, 0,
824 iproc_pci_raw_config_read32(pcie, 0,
837 static void iproc_pcie_enable(struct iproc_pcie *pcie)
839 iproc_pcie_write_reg(pcie, IPROC_PCIE_INTX_EN, SYS_RC_INTX_MASK);
842 static inline bool iproc_pcie_ob_is_valid(struct iproc_pcie *pcie,
847 val = iproc_pcie_read_reg(pcie, MAP_REG(IPROC_PCIE_OARR0, window_idx));
852 static inline int iproc_pcie_ob_write(struct iproc_pcie *pcie, int window_idx,
855 struct device *dev = pcie->dev;
862 oarr_offset = iproc_pcie_reg_offset(pcie, MAP_REG(IPROC_PCIE_OARR0,
864 omap_offset = iproc_pcie_reg_offset(pcie, MAP_REG(IPROC_PCIE_OMAP0,
875 OARR_VALID, pcie->base + oarr_offset);
876 writel(upper_32_bits(axi_addr), pcie->base + oarr_offset + 4);
879 writel(lower_32_bits(pci_addr), pcie->base + omap_offset);
880 writel(upper_32_bits(pci_addr), pcie->base + omap_offset + 4);
885 readl(pcie->base + oarr_offset),
886 readl(pcie->base + oarr_offset + 4));
888 readl(pcie->base + omap_offset),
889 readl(pcie->base + omap_offset + 4));
905 static int iproc_pcie_setup_ob(struct iproc_pcie *pcie, u64 axi_addr,
908 struct iproc_pcie_ob *ob = &pcie->ob;
909 struct device *dev = pcie->dev;
927 &pcie->ob_map[window_idx];
933 if (iproc_pcie_ob_is_valid(pcie, window_idx))
978 ret = iproc_pcie_ob_write(pcie, window_idx, size_idx,
1007 static int iproc_pcie_map_ranges(struct iproc_pcie *pcie,
1010 struct device *dev = pcie->dev;
1023 ret = iproc_pcie_setup_ob(pcie, res->start,
1038 static inline bool iproc_pcie_ib_is_in_use(struct iproc_pcie *pcie,
1041 const struct iproc_pcie_ib_map *ib_map = &pcie->ib_map[region_idx];
1044 val = iproc_pcie_read_reg(pcie, MAP_REG(IPROC_PCIE_IARR0, region_idx));
1055 static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx,
1059 struct device *dev = pcie->dev;
1060 const struct iproc_pcie_ib_map *ib_map = &pcie->ib_map[region_idx];
1065 iarr_offset = iproc_pcie_reg_offset(pcie,
1067 imap_offset = iproc_pcie_reg_offset(pcie,
1081 pcie->base + iarr_offset);
1082 writel(upper_32_bits(pci_addr), pcie->base + iarr_offset + 4);
1085 readl(pcie->base + iarr_offset),
1086 readl(pcie->base + iarr_offset + 4));
1094 val = readl(pcie->base + imap_offset);
1096 writel(val, pcie->base + imap_offset);
1098 pcie->base + imap_offset + ib_map->imap_addr_offset);
1101 window_idx, readl(pcie->base + imap_offset),
1102 readl(pcie->base + imap_offset +
1112 static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
1116 struct device *dev = pcie->dev;
1117 struct iproc_pcie_ib *ib = &pcie->ib;
1127 &pcie->ib_map[region_idx];
1133 if (iproc_pcie_ib_is_in_use(pcie, region_idx) ||
1154 ret = iproc_pcie_ib_write(pcie, region_idx, size_idx,
1174 static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie)
1176 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1182 ret = iproc_pcie_setup_ib(pcie, entry, IPROC_PCIE_IB_MAP_MEM);
1190 static void iproc_pcie_invalidate_mapping(struct iproc_pcie *pcie)
1192 struct iproc_pcie_ib *ib = &pcie->ib;
1193 struct iproc_pcie_ob *ob = &pcie->ob;
1196 if (pcie->ep_is_internal)
1199 if (pcie->need_ob_cfg) {
1202 iproc_pcie_write_reg(pcie,
1207 if (pcie->need_ib_cfg) {
1210 iproc_pcie_write_reg(pcie,
1216 static int iproce_pcie_get_msi(struct iproc_pcie *pcie,
1220 struct device *dev = pcie->dev;
1244 static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr)
1256 ret = iproc_pcie_setup_ib(pcie, &entry, IPROC_PCIE_IB_MAP_IO);
1260 static void iproc_pcie_paxc_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr,
1270 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG);
1272 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val);
1282 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_BASE_ADDR,
1286 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_WINDOW_SIZE, 0);
1289 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_GIC_MODE);
1291 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_GIC_MODE, val);
1298 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_ADDR_HI,
1300 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_ADDR_LO,
1304 val = iproc_pcie_read_reg(pcie, IPROC_PCIE_MSI_EN_CFG);
1306 iproc_pcie_write_reg(pcie, IPROC_PCIE_MSI_EN_CFG, val);
1309 static int iproc_pcie_msi_steer(struct iproc_pcie *pcie,
1312 struct device *dev = pcie->dev;
1316 ret = iproce_pcie_get_msi(pcie, msi_node, &msi_addr);
1322 switch (pcie->type) {
1324 ret = iproc_pcie_paxb_v2_msi_steer(pcie, msi_addr);
1329 iproc_pcie_paxc_v2_msi_steer(pcie, msi_addr, true);
1338 static int iproc_pcie_msi_enable(struct iproc_pcie *pcie)
1348 msi_node = of_parse_phandle(pcie->dev->of_node, "msi-parent", 0);
1354 msi_map = of_get_property(pcie->dev->of_node, "msi-map", &len);
1369 if (pcie->need_msi_steer) {
1370 ret = iproc_pcie_msi_steer(pcie, msi_node);
1379 ret = iproc_msi_init(pcie, msi_node);
1386 static void iproc_pcie_msi_disable(struct iproc_pcie *pcie)
1388 iproc_msi_exit(pcie);
1391 static int iproc_pcie_rev_init(struct iproc_pcie *pcie)
1393 struct device *dev = pcie->dev;
1397 switch (pcie->type) {
1403 pcie->has_apb_err_disable = true;
1404 if (pcie->need_ob_cfg) {
1405 pcie->ob_map = paxb_ob_map;
1406 pcie->ob.nr_windows = ARRAY_SIZE(paxb_ob_map);
1411 pcie->iproc_cfg_read = true;
1412 pcie->has_apb_err_disable = true;
1413 if (pcie->need_ob_cfg) {
1414 pcie->ob_map = paxb_v2_ob_map;
1415 pcie->ob.nr_windows = ARRAY_SIZE(paxb_v2_ob_map);
1417 pcie->ib.nr_regions = ARRAY_SIZE(paxb_v2_ib_map);
1418 pcie->ib_map = paxb_v2_ib_map;
1419 pcie->need_msi_steer = true;
1425 pcie->ep_is_internal = true;
1426 pcie->iproc_cfg_read = true;
1427 pcie->rej_unconfig_pf = true;
1431 pcie->ep_is_internal = true;
1432 pcie->iproc_cfg_read = true;
1433 pcie->rej_unconfig_pf = true;
1434 pcie->need_msi_steer = true;
1441 pcie->reg_offsets = devm_kcalloc(dev, IPROC_PCIE_MAX_NUM_REG,
1442 sizeof(*pcie->reg_offsets),
1444 if (!pcie->reg_offsets)
1448 pcie->reg_offsets[0] = (pcie->type == IPROC_PCIE_PAXC_V2) ?
1451 pcie->reg_offsets[reg_idx] = regs[reg_idx] ?
1457 int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
1462 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1464 dev = pcie->dev;
1466 ret = iproc_pcie_rev_init(pcie);
1472 ret = phy_init(pcie->phy);
1478 ret = phy_power_on(pcie->phy);
1484 iproc_pcie_perst_ctrl(pcie, true);
1485 iproc_pcie_perst_ctrl(pcie, false);
1487 iproc_pcie_invalidate_mapping(pcie);
1489 if (pcie->need_ob_cfg) {
1490 ret = iproc_pcie_map_ranges(pcie, res);
1497 if (pcie->need_ib_cfg) {
1498 ret = iproc_pcie_map_dma_ranges(pcie);
1503 ret = iproc_pcie_check_link(pcie);
1509 iproc_pcie_enable(pcie);
1512 if (iproc_pcie_msi_enable(pcie))
1516 host->sysdata = pcie;
1517 host->map_irq = pcie->map_irq;
1533 phy_power_off(pcie->phy);
1535 phy_exit(pcie->phy);
1540 void iproc_pcie_remove(struct iproc_pcie *pcie)
1542 struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1547 iproc_pcie_msi_disable(pcie);
1549 phy_power_off(pcie->phy);
1550 phy_exit(pcie->phy);
1560 struct iproc_pcie *pcie = iproc_data(pdev->bus);
1563 iproc_pcie_paxc_v2_msi_steer(pcie, 0, false);