Lines Matching refs:pcie
175 #define IDX_ADDR(pcie) (pcie->reg_offsets[EXT_CFG_INDEX])
176 #define DATA_ADDR(pcie) (pcie->reg_offsets[EXT_CFG_DATA])
177 #define PCIE_RGR1_SW_INIT_1(pcie) (pcie->reg_offsets[RGR1_SW_INIT_1])
191 static inline void brcm_pcie_bridge_sw_init_set_7278(struct brcm_pcie *pcie, u32 val);
192 static inline void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie, u32 val);
193 static inline void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val);
194 static inline void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val);
216 void (*perst_set)(struct brcm_pcie *pcie, u32 val);
217 void (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
288 void (*perst_set)(struct brcm_pcie *pcie, u32 val);
289 void (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
366 static int brcm_pcie_set_ssc(struct brcm_pcie *pcie)
372 ret = brcm_pcie_mdio_write(pcie->base, MDIO_PORT0, SET_ADDR_OFFSET,
377 ret = brcm_pcie_mdio_read(pcie->base, MDIO_PORT0,
384 ret = brcm_pcie_mdio_write(pcie->base, MDIO_PORT0,
390 ret = brcm_pcie_mdio_read(pcie->base, MDIO_PORT0,
402 static void brcm_pcie_set_gen(struct brcm_pcie *pcie, int gen)
404 u16 lnkctl2 = readw(pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCTL2);
405 u32 lnkcap = readl(pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCAP);
408 writel(lnkcap, pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCAP);
411 writew(lnkctl2, pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCTL2);
414 static void brcm_pcie_set_outbound_win(struct brcm_pcie *pcie,
424 writel(lower_32_bits(pcie_addr), pcie->base + PCIE_MEM_WIN0_LO(win));
425 writel(upper_32_bits(pcie_addr), pcie->base + PCIE_MEM_WIN0_HI(win));
431 tmp = readl(pcie->base + PCIE_MEM_WIN0_BASE_LIMIT(win));
436 writel(tmp, pcie->base + PCIE_MEM_WIN0_BASE_LIMIT(win));
443 tmp = readl(pcie->base + PCIE_MEM_WIN0_BASE_HI(win));
446 writel(tmp, pcie->base + PCIE_MEM_WIN0_BASE_HI(win));
449 tmp = readl(pcie->base + PCIE_MEM_WIN0_LIMIT_HI(win));
452 writel(tmp, pcie->base + PCIE_MEM_WIN0_LIMIT_HI(win));
603 static void brcm_msi_remove(struct brcm_pcie *pcie)
605 struct brcm_msi *msi = pcie->msi;
634 static int brcm_pcie_enable_msi(struct brcm_pcie *pcie)
638 struct device *dev = pcie->dev;
652 msi->base = pcie->base;
653 msi->np = pcie->np;
654 msi->target_addr = pcie->msi_target_addr;
656 msi->legacy = pcie->hw_rev < BRCM_PCIE_HW_REV_33;
675 pcie->msi = msi;
681 static bool brcm_pcie_rc_mode(struct brcm_pcie *pcie)
683 void __iomem *base = pcie->base;
689 static bool brcm_pcie_link_up(struct brcm_pcie *pcie)
691 u32 val = readl(pcie->base + PCIE_MISC_PCIE_STATUS);
710 struct brcm_pcie *pcie = bus->sysdata;
711 void __iomem *base = pcie->base;
720 writel(idx, pcie->base + PCIE_EXT_CFG_INDEX);
730 static inline void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie, u32 val)
735 tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
737 writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
740 static inline void brcm_pcie_bridge_sw_init_set_7278(struct brcm_pcie *pcie, u32 val)
745 tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
747 writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
750 static inline void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val)
755 tmp = readl(pcie->base + PCIE_MISC_PCIE_CTRL);
757 writel(tmp, pcie->base + PCIE_MISC_PCIE_CTRL);
760 static inline void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val)
764 tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
766 writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
769 static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
773 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
775 struct device *dev = pcie->dev;
793 ret = of_property_read_variable_u64_array(pcie->np, "brcm,scb-sizes", pcie->memc_size, 1,
798 pcie->num_memc = 1;
799 pcie->memc_size[0] = 1ULL << fls64(size - 1);
801 pcie->num_memc = ret;
805 for (i = 0, size = 0; i < pcie->num_memc; i++)
806 size += pcie->memc_size[i];
826 * matters, the viewport must start on a pcie-address that is aligned
837 * region in the first 4GB of pcie-space, as some legacy devices can
856 static int brcm_pcie_setup(struct brcm_pcie *pcie)
858 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
860 void __iomem *base = pcie->base;
861 struct device *dev = pcie->dev;
871 pcie->bridge_sw_init_set(pcie, 1);
875 pcie->bridge_sw_init_set(pcie, 0);
888 if (pcie->type == BCM2711)
890 else if (pcie->type == BCM7278)
902 ret = brcm_pcie_get_rc_bar2_size_and_offset(pcie, &rc_bar2_size,
915 for (memc = 0; memc < pcie->num_memc; memc++) {
916 u32 scb_size_val = ilog2(pcie->memc_size[memc]) - 15;
935 pcie->msi_target_addr = BRCM_MSI_TARGET_ADDR_LT_4GB;
937 pcie->msi_target_addr = BRCM_MSI_TARGET_ADDR_GT_4GB;
949 if (pcie->gen)
950 brcm_pcie_set_gen(pcie, pcie->gen);
953 pcie->perst_set(pcie, 0);
959 for (i = 0; i < 100 && !brcm_pcie_link_up(pcie); i += 5)
962 if (!brcm_pcie_link_up(pcie)) {
967 if (!brcm_pcie_rc_mode(pcie)) {
979 dev_err(pcie->dev, "too many outbound wins\n");
983 brcm_pcie_set_outbound_win(pcie, num_out_wins, res->start,
991 if (!of_property_read_bool(pcie->np, "aspm-no-l0s"))
1007 if (pcie->ssc) {
1008 ret = brcm_pcie_set_ssc(pcie);
1040 static void brcm_pcie_enter_l23(struct brcm_pcie *pcie)
1042 void __iomem *base = pcie->base;
1062 dev_err(pcie->dev, "failed to enter low-power link state\n");
1065 static int brcm_phy_cntl(struct brcm_pcie *pcie, const int start)
1079 void __iomem *base = pcie->base;
1096 dev_err(pcie->dev, "failed to %s phy\n", (start ? "start" : "stop"));
1101 static inline int brcm_phy_start(struct brcm_pcie *pcie)
1103 return pcie->rescal ? brcm_phy_cntl(pcie, 1) : 0;
1106 static inline int brcm_phy_stop(struct brcm_pcie *pcie)
1108 return pcie->rescal ? brcm_phy_cntl(pcie, 0) : 0;
1111 static void brcm_pcie_turn_off(struct brcm_pcie *pcie)
1113 void __iomem *base = pcie->base;
1116 if (brcm_pcie_link_up(pcie))
1117 brcm_pcie_enter_l23(pcie);
1119 pcie->perst_set(pcie, 1);
1132 pcie->bridge_sw_init_set(pcie, 1);
1137 struct brcm_pcie *pcie = dev_get_drvdata(dev);
1140 brcm_pcie_turn_off(pcie);
1141 ret = brcm_phy_stop(pcie);
1142 clk_disable_unprepare(pcie->clk);
1149 struct brcm_pcie *pcie = dev_get_drvdata(dev);
1154 base = pcie->base;
1155 clk_prepare_enable(pcie->clk);
1157 ret = brcm_phy_start(pcie);
1162 pcie->bridge_sw_init_set(pcie, 0);
1172 ret = brcm_pcie_setup(pcie);
1176 if (pcie->msi)
1177 brcm_msi_set_regs(pcie->msi);
1182 clk_disable_unprepare(pcie->clk);
1186 static void __brcm_pcie_remove(struct brcm_pcie *pcie)
1188 brcm_msi_remove(pcie);
1189 brcm_pcie_turn_off(pcie);
1190 brcm_phy_stop(pcie);
1191 reset_control_assert(pcie->rescal);
1192 clk_disable_unprepare(pcie->clk);
1197 struct brcm_pcie *pcie = platform_get_drvdata(pdev);
1198 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
1202 __brcm_pcie_remove(pcie);
1208 { .compatible = "brcm,bcm2711-pcie", .data = &bcm2711_cfg },
1209 { .compatible = "brcm,bcm7211-pcie", .data = &generic_cfg },
1210 { .compatible = "brcm,bcm7278-pcie", .data = &bcm7278_cfg },
1211 { .compatible = "brcm,bcm7216-pcie", .data = &bcm7278_cfg },
1212 { .compatible = "brcm,bcm7445-pcie", .data = &generic_cfg },
1221 struct brcm_pcie *pcie;
1224 bridge = devm_pci_alloc_host_bridge(&pdev->dev, sizeof(*pcie));
1234 pcie = pci_host_bridge_priv(bridge);
1235 pcie->dev = &pdev->dev;
1236 pcie->np = np;
1237 pcie->reg_offsets = data->offsets;
1238 pcie->type = data->type;
1239 pcie->perst_set = data->perst_set;
1240 pcie->bridge_sw_init_set = data->bridge_sw_init_set;
1242 pcie->base = devm_platform_ioremap_resource(pdev, 0);
1243 if (IS_ERR(pcie->base))
1244 return PTR_ERR(pcie->base);
1246 pcie->clk = devm_clk_get_optional(&pdev->dev, "sw_pcie");
1247 if (IS_ERR(pcie->clk))
1248 return PTR_ERR(pcie->clk);
1251 pcie->gen = (ret < 0) ? 0 : ret;
1253 pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
1255 ret = clk_prepare_enable(pcie->clk);
1260 pcie->rescal = devm_reset_control_get_optional_shared(&pdev->dev, "rescal");
1261 if (IS_ERR(pcie->rescal)) {
1262 clk_disable_unprepare(pcie->clk);
1263 return PTR_ERR(pcie->rescal);
1266 ret = reset_control_deassert(pcie->rescal);
1270 ret = brcm_phy_start(pcie);
1272 reset_control_assert(pcie->rescal);
1273 clk_disable_unprepare(pcie->clk);
1277 ret = brcm_pcie_setup(pcie);
1281 pcie->hw_rev = readl(pcie->base + PCIE_MISC_REVISION);
1283 msi_np = of_parse_phandle(pcie->np, "msi-parent", 0);
1284 if (pci_msi_enabled() && msi_np == pcie->np) {
1285 ret = brcm_pcie_enable_msi(pcie);
1287 dev_err(pcie->dev, "probe of internal MSI failed");
1293 bridge->sysdata = pcie;
1295 platform_set_drvdata(pdev, pcie);
1299 __brcm_pcie_remove(pcie);
1314 .name = "brcm-pcie",