0001
0002
0003
0004 #include <linux/bitfield.h>
0005 #include <linux/bitops.h>
0006 #include <linux/clk.h>
0007 #include <linux/compiler.h>
0008 #include <linux/delay.h>
0009 #include <linux/init.h>
0010 #include <linux/interrupt.h>
0011 #include <linux/io.h>
0012 #include <linux/ioport.h>
0013 #include <linux/irqchip/chained_irq.h>
0014 #include <linux/irqdomain.h>
0015 #include <linux/kernel.h>
0016 #include <linux/list.h>
0017 #include <linux/log2.h>
0018 #include <linux/module.h>
0019 #include <linux/msi.h>
0020 #include <linux/of_address.h>
0021 #include <linux/of_irq.h>
0022 #include <linux/of_pci.h>
0023 #include <linux/of_platform.h>
0024 #include <linux/pci.h>
0025 #include <linux/pci-ecam.h>
0026 #include <linux/printk.h>
0027 #include <linux/regulator/consumer.h>
0028 #include <linux/reset.h>
0029 #include <linux/sizes.h>
0030 #include <linux/slab.h>
0031 #include <linux/string.h>
0032 #include <linux/types.h>
0033
0034 #include "../pci.h"
0035
0036
0037 #define BRCM_PCIE_CAP_REGS 0x00ac
0038
0039
0040 #define PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1 0x0188
0041 #define PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK 0xc
0042 #define PCIE_RC_CFG_VENDOR_SPCIFIC_REG1_LITTLE_ENDIAN 0x0
0043
0044 #define PCIE_RC_CFG_PRIV1_ID_VAL3 0x043c
0045 #define PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK 0xffffff
0046
0047 #define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY 0x04dc
0048 #define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK 0xc00
0049
0050 #define PCIE_RC_DL_MDIO_ADDR 0x1100
0051 #define PCIE_RC_DL_MDIO_WR_DATA 0x1104
0052 #define PCIE_RC_DL_MDIO_RD_DATA 0x1108
0053
0054 #define PCIE_MISC_MISC_CTRL 0x4008
0055 #define PCIE_MISC_MISC_CTRL_SCB_ACCESS_EN_MASK 0x1000
0056 #define PCIE_MISC_MISC_CTRL_CFG_READ_UR_MODE_MASK 0x2000
0057 #define PCIE_MISC_MISC_CTRL_MAX_BURST_SIZE_MASK 0x300000
0058
0059 #define PCIE_MISC_MISC_CTRL_SCB0_SIZE_MASK 0xf8000000
0060 #define PCIE_MISC_MISC_CTRL_SCB1_SIZE_MASK 0x07c00000
0061 #define PCIE_MISC_MISC_CTRL_SCB2_SIZE_MASK 0x0000001f
0062 #define SCB_SIZE_MASK(x) PCIE_MISC_MISC_CTRL_SCB ## x ## _SIZE_MASK
0063
0064 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO 0x400c
0065 #define PCIE_MEM_WIN0_LO(win) \
0066 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO + ((win) * 8)
0067
0068 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI 0x4010
0069 #define PCIE_MEM_WIN0_HI(win) \
0070 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI + ((win) * 8)
0071
0072 #define PCIE_MISC_RC_BAR1_CONFIG_LO 0x402c
0073 #define PCIE_MISC_RC_BAR1_CONFIG_LO_SIZE_MASK 0x1f
0074
0075 #define PCIE_MISC_RC_BAR2_CONFIG_LO 0x4034
0076 #define PCIE_MISC_RC_BAR2_CONFIG_LO_SIZE_MASK 0x1f
0077 #define PCIE_MISC_RC_BAR2_CONFIG_HI 0x4038
0078
0079 #define PCIE_MISC_RC_BAR3_CONFIG_LO 0x403c
0080 #define PCIE_MISC_RC_BAR3_CONFIG_LO_SIZE_MASK 0x1f
0081
0082 #define PCIE_MISC_MSI_BAR_CONFIG_LO 0x4044
0083 #define PCIE_MISC_MSI_BAR_CONFIG_HI 0x4048
0084
0085 #define PCIE_MISC_MSI_DATA_CONFIG 0x404c
0086 #define PCIE_MISC_MSI_DATA_CONFIG_VAL_32 0xffe06540
0087 #define PCIE_MISC_MSI_DATA_CONFIG_VAL_8 0xfff86540
0088
0089 #define PCIE_MISC_PCIE_CTRL 0x4064
0090 #define PCIE_MISC_PCIE_CTRL_PCIE_L23_REQUEST_MASK 0x1
0091 #define PCIE_MISC_PCIE_CTRL_PCIE_PERSTB_MASK 0x4
0092
0093 #define PCIE_MISC_PCIE_STATUS 0x4068
0094 #define PCIE_MISC_PCIE_STATUS_PCIE_PORT_MASK 0x80
0095 #define PCIE_MISC_PCIE_STATUS_PCIE_DL_ACTIVE_MASK 0x20
0096 #define PCIE_MISC_PCIE_STATUS_PCIE_PHYLINKUP_MASK 0x10
0097 #define PCIE_MISC_PCIE_STATUS_PCIE_LINK_IN_L23_MASK 0x40
0098
0099 #define PCIE_MISC_REVISION 0x406c
0100 #define BRCM_PCIE_HW_REV_33 0x0303
0101 #define BRCM_PCIE_HW_REV_3_20 0x0320
0102
0103 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT 0x4070
0104 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_LIMIT_MASK 0xfff00000
0105 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_BASE_MASK 0xfff0
0106 #define PCIE_MEM_WIN0_BASE_LIMIT(win) \
0107 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT + ((win) * 4)
0108
0109 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI 0x4080
0110 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI_BASE_MASK 0xff
0111 #define PCIE_MEM_WIN0_BASE_HI(win) \
0112 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI + ((win) * 8)
0113
0114 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI 0x4084
0115 #define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI_LIMIT_MASK 0xff
0116 #define PCIE_MEM_WIN0_LIMIT_HI(win) \
0117 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI + ((win) * 8)
0118
0119 #define PCIE_MISC_HARD_PCIE_HARD_DEBUG 0x4204
0120 #define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK 0x2
0121 #define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK 0x08000000
0122 #define PCIE_BMIPS_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK 0x00800000
0123
0124
0125 #define PCIE_INTR2_CPU_BASE 0x4300
0126 #define PCIE_MSI_INTR2_BASE 0x4500
0127
0128 #define MSI_INT_STATUS 0x0
0129 #define MSI_INT_CLR 0x8
0130 #define MSI_INT_MASK_SET 0x10
0131 #define MSI_INT_MASK_CLR 0x14
0132
0133 #define PCIE_EXT_CFG_DATA 0x8000
0134 #define PCIE_EXT_CFG_INDEX 0x9000
0135
0136 #define PCIE_RGR1_SW_INIT_1_PERST_MASK 0x1
0137 #define PCIE_RGR1_SW_INIT_1_PERST_SHIFT 0x0
0138
0139 #define RGR1_SW_INIT_1_INIT_GENERIC_MASK 0x2
0140 #define RGR1_SW_INIT_1_INIT_GENERIC_SHIFT 0x1
0141 #define RGR1_SW_INIT_1_INIT_7278_MASK 0x1
0142 #define RGR1_SW_INIT_1_INIT_7278_SHIFT 0x0
0143
0144
0145 #define BRCM_NUM_PCIE_OUT_WINS 0x4
0146 #define BRCM_INT_PCI_MSI_NR 32
0147 #define BRCM_INT_PCI_MSI_LEGACY_NR 8
0148 #define BRCM_INT_PCI_MSI_SHIFT 0
0149 #define BRCM_INT_PCI_MSI_MASK GENMASK(BRCM_INT_PCI_MSI_NR - 1, 0)
0150 #define BRCM_INT_PCI_MSI_LEGACY_MASK GENMASK(31, \
0151 32 - BRCM_INT_PCI_MSI_LEGACY_NR)
0152
0153
0154 #define BRCM_MSI_TARGET_ADDR_LT_4GB 0x0fffffffcULL
0155 #define BRCM_MSI_TARGET_ADDR_GT_4GB 0xffffffffcULL
0156
0157
0158 #define MDIO_PORT0 0x0
0159 #define MDIO_DATA_MASK 0x7fffffff
0160 #define MDIO_PORT_MASK 0xf0000
0161 #define MDIO_REGAD_MASK 0xffff
0162 #define MDIO_CMD_MASK 0xfff00000
0163 #define MDIO_CMD_READ 0x1
0164 #define MDIO_CMD_WRITE 0x0
0165 #define MDIO_DATA_DONE_MASK 0x80000000
0166 #define MDIO_RD_DONE(x) (((x) & MDIO_DATA_DONE_MASK) ? 1 : 0)
0167 #define MDIO_WT_DONE(x) (((x) & MDIO_DATA_DONE_MASK) ? 0 : 1)
0168 #define SSC_REGS_ADDR 0x1100
0169 #define SET_ADDR_OFFSET 0x1f
0170 #define SSC_CNTL_OFFSET 0x2
0171 #define SSC_CNTL_OVRD_EN_MASK 0x8000
0172 #define SSC_CNTL_OVRD_VAL_MASK 0x4000
0173 #define SSC_STATUS_OFFSET 0x1
0174 #define SSC_STATUS_SSC_MASK 0x400
0175 #define SSC_STATUS_PLL_LOCK_MASK 0x800
0176 #define PCIE_BRCM_MAX_MEMC 3
0177
0178 #define IDX_ADDR(pcie) (pcie->reg_offsets[EXT_CFG_INDEX])
0179 #define DATA_ADDR(pcie) (pcie->reg_offsets[EXT_CFG_DATA])
0180 #define PCIE_RGR1_SW_INIT_1(pcie) (pcie->reg_offsets[RGR1_SW_INIT_1])
0181
0182
0183 #define PCIE_DVT_PMU_PCIE_PHY_CTRL 0xc700
0184 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS 0x3
0185 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_MASK 0x4
0186 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_SHIFT 0x2
0187 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_MASK 0x2
0188 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_SHIFT 0x1
0189 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_MASK 0x1
0190 #define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_SHIFT 0x0
0191
0192
0193 struct brcm_pcie;
0194
0195 enum {
0196 RGR1_SW_INIT_1,
0197 EXT_CFG_INDEX,
0198 EXT_CFG_DATA,
0199 };
0200
0201 enum {
0202 RGR1_SW_INIT_1_INIT_MASK,
0203 RGR1_SW_INIT_1_INIT_SHIFT,
0204 };
0205
0206 enum pcie_type {
0207 GENERIC,
0208 BCM7425,
0209 BCM7435,
0210 BCM4908,
0211 BCM7278,
0212 BCM2711,
0213 };
0214
0215 struct pcie_cfg_data {
0216 const int *offsets;
0217 const enum pcie_type type;
0218 void (*perst_set)(struct brcm_pcie *pcie, u32 val);
0219 void (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
0220 };
0221
0222 struct subdev_regulators {
0223 unsigned int num_supplies;
0224 struct regulator_bulk_data supplies[];
0225 };
0226
0227 struct brcm_msi {
0228 struct device *dev;
0229 void __iomem *base;
0230 struct device_node *np;
0231 struct irq_domain *msi_domain;
0232 struct irq_domain *inner_domain;
0233 struct mutex lock;
0234 u64 target_addr;
0235 int irq;
0236 DECLARE_BITMAP(used, BRCM_INT_PCI_MSI_NR);
0237 bool legacy;
0238
0239 int legacy_shift;
0240 int nr;
0241
0242 void __iomem *intr_base;
0243 };
0244
0245
0246 struct brcm_pcie {
0247 struct device *dev;
0248 void __iomem *base;
0249 struct clk *clk;
0250 struct device_node *np;
0251 bool ssc;
0252 int gen;
0253 u64 msi_target_addr;
0254 struct brcm_msi *msi;
0255 const int *reg_offsets;
0256 enum pcie_type type;
0257 struct reset_control *rescal;
0258 struct reset_control *perst_reset;
0259 int num_memc;
0260 u64 memc_size[PCIE_BRCM_MAX_MEMC];
0261 u32 hw_rev;
0262 void (*perst_set)(struct brcm_pcie *pcie, u32 val);
0263 void (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
0264 struct subdev_regulators *sr;
0265 bool ep_wakeup_capable;
0266 };
0267
0268 static inline bool is_bmips(const struct brcm_pcie *pcie)
0269 {
0270 return pcie->type == BCM7435 || pcie->type == BCM7425;
0271 }
0272
0273
0274
0275
0276
0277 static int brcm_pcie_encode_ibar_size(u64 size)
0278 {
0279 int log2_in = ilog2(size);
0280
0281 if (log2_in >= 12 && log2_in <= 15)
0282
0283 return (log2_in - 12) + 0x1c;
0284 else if (log2_in >= 16 && log2_in <= 35)
0285
0286 return log2_in - 15;
0287
0288 return 0;
0289 }
0290
0291 static u32 brcm_pcie_mdio_form_pkt(int port, int regad, int cmd)
0292 {
0293 u32 pkt = 0;
0294
0295 pkt |= FIELD_PREP(MDIO_PORT_MASK, port);
0296 pkt |= FIELD_PREP(MDIO_REGAD_MASK, regad);
0297 pkt |= FIELD_PREP(MDIO_CMD_MASK, cmd);
0298
0299 return pkt;
0300 }
0301
0302
0303 static int brcm_pcie_mdio_read(void __iomem *base, u8 port, u8 regad, u32 *val)
0304 {
0305 int tries;
0306 u32 data;
0307
0308 writel(brcm_pcie_mdio_form_pkt(port, regad, MDIO_CMD_READ),
0309 base + PCIE_RC_DL_MDIO_ADDR);
0310 readl(base + PCIE_RC_DL_MDIO_ADDR);
0311
0312 data = readl(base + PCIE_RC_DL_MDIO_RD_DATA);
0313 for (tries = 0; !MDIO_RD_DONE(data) && tries < 10; tries++) {
0314 udelay(10);
0315 data = readl(base + PCIE_RC_DL_MDIO_RD_DATA);
0316 }
0317
0318 *val = FIELD_GET(MDIO_DATA_MASK, data);
0319 return MDIO_RD_DONE(data) ? 0 : -EIO;
0320 }
0321
0322
0323 static int brcm_pcie_mdio_write(void __iomem *base, u8 port,
0324 u8 regad, u16 wrdata)
0325 {
0326 int tries;
0327 u32 data;
0328
0329 writel(brcm_pcie_mdio_form_pkt(port, regad, MDIO_CMD_WRITE),
0330 base + PCIE_RC_DL_MDIO_ADDR);
0331 readl(base + PCIE_RC_DL_MDIO_ADDR);
0332 writel(MDIO_DATA_DONE_MASK | wrdata, base + PCIE_RC_DL_MDIO_WR_DATA);
0333
0334 data = readl(base + PCIE_RC_DL_MDIO_WR_DATA);
0335 for (tries = 0; !MDIO_WT_DONE(data) && tries < 10; tries++) {
0336 udelay(10);
0337 data = readl(base + PCIE_RC_DL_MDIO_WR_DATA);
0338 }
0339
0340 return MDIO_WT_DONE(data) ? 0 : -EIO;
0341 }
0342
0343
0344
0345
0346
0347 static int brcm_pcie_set_ssc(struct brcm_pcie *pcie)
0348 {
0349 int pll, ssc;
0350 int ret;
0351 u32 tmp;
0352
0353 ret = brcm_pcie_mdio_write(pcie->base, MDIO_PORT0, SET_ADDR_OFFSET,
0354 SSC_REGS_ADDR);
0355 if (ret < 0)
0356 return ret;
0357
0358 ret = brcm_pcie_mdio_read(pcie->base, MDIO_PORT0,
0359 SSC_CNTL_OFFSET, &tmp);
0360 if (ret < 0)
0361 return ret;
0362
0363 u32p_replace_bits(&tmp, 1, SSC_CNTL_OVRD_EN_MASK);
0364 u32p_replace_bits(&tmp, 1, SSC_CNTL_OVRD_VAL_MASK);
0365 ret = brcm_pcie_mdio_write(pcie->base, MDIO_PORT0,
0366 SSC_CNTL_OFFSET, tmp);
0367 if (ret < 0)
0368 return ret;
0369
0370 usleep_range(1000, 2000);
0371 ret = brcm_pcie_mdio_read(pcie->base, MDIO_PORT0,
0372 SSC_STATUS_OFFSET, &tmp);
0373 if (ret < 0)
0374 return ret;
0375
0376 ssc = FIELD_GET(SSC_STATUS_SSC_MASK, tmp);
0377 pll = FIELD_GET(SSC_STATUS_PLL_LOCK_MASK, tmp);
0378
0379 return ssc && pll ? 0 : -EIO;
0380 }
0381
0382
0383 static void brcm_pcie_set_gen(struct brcm_pcie *pcie, int gen)
0384 {
0385 u16 lnkctl2 = readw(pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCTL2);
0386 u32 lnkcap = readl(pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCAP);
0387
0388 lnkcap = (lnkcap & ~PCI_EXP_LNKCAP_SLS) | gen;
0389 writel(lnkcap, pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCAP);
0390
0391 lnkctl2 = (lnkctl2 & ~0xf) | gen;
0392 writew(lnkctl2, pcie->base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKCTL2);
0393 }
0394
0395 static void brcm_pcie_set_outbound_win(struct brcm_pcie *pcie,
0396 unsigned int win, u64 cpu_addr,
0397 u64 pcie_addr, u64 size)
0398 {
0399 u32 cpu_addr_mb_high, limit_addr_mb_high;
0400 phys_addr_t cpu_addr_mb, limit_addr_mb;
0401 int high_addr_shift;
0402 u32 tmp;
0403
0404
0405 writel(lower_32_bits(pcie_addr), pcie->base + PCIE_MEM_WIN0_LO(win));
0406 writel(upper_32_bits(pcie_addr), pcie->base + PCIE_MEM_WIN0_HI(win));
0407
0408
0409 cpu_addr_mb = cpu_addr / SZ_1M;
0410 limit_addr_mb = (cpu_addr + size - 1) / SZ_1M;
0411
0412 tmp = readl(pcie->base + PCIE_MEM_WIN0_BASE_LIMIT(win));
0413 u32p_replace_bits(&tmp, cpu_addr_mb,
0414 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_BASE_MASK);
0415 u32p_replace_bits(&tmp, limit_addr_mb,
0416 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_LIMIT_MASK);
0417 writel(tmp, pcie->base + PCIE_MEM_WIN0_BASE_LIMIT(win));
0418
0419 if (is_bmips(pcie))
0420 return;
0421
0422
0423 high_addr_shift =
0424 HWEIGHT32(PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_BASE_MASK);
0425
0426 cpu_addr_mb_high = cpu_addr_mb >> high_addr_shift;
0427 tmp = readl(pcie->base + PCIE_MEM_WIN0_BASE_HI(win));
0428 u32p_replace_bits(&tmp, cpu_addr_mb_high,
0429 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI_BASE_MASK);
0430 writel(tmp, pcie->base + PCIE_MEM_WIN0_BASE_HI(win));
0431
0432 limit_addr_mb_high = limit_addr_mb >> high_addr_shift;
0433 tmp = readl(pcie->base + PCIE_MEM_WIN0_LIMIT_HI(win));
0434 u32p_replace_bits(&tmp, limit_addr_mb_high,
0435 PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI_LIMIT_MASK);
0436 writel(tmp, pcie->base + PCIE_MEM_WIN0_LIMIT_HI(win));
0437 }
0438
0439 static struct irq_chip brcm_msi_irq_chip = {
0440 .name = "BRCM STB PCIe MSI",
0441 .irq_ack = irq_chip_ack_parent,
0442 .irq_mask = pci_msi_mask_irq,
0443 .irq_unmask = pci_msi_unmask_irq,
0444 };
0445
0446 static struct msi_domain_info brcm_msi_domain_info = {
0447
0448 .flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS),
0449 .chip = &brcm_msi_irq_chip,
0450 };
0451
0452 static void brcm_pcie_msi_isr(struct irq_desc *desc)
0453 {
0454 struct irq_chip *chip = irq_desc_get_chip(desc);
0455 unsigned long status;
0456 struct brcm_msi *msi;
0457 struct device *dev;
0458 u32 bit;
0459
0460 chained_irq_enter(chip, desc);
0461 msi = irq_desc_get_handler_data(desc);
0462 dev = msi->dev;
0463
0464 status = readl(msi->intr_base + MSI_INT_STATUS);
0465 status >>= msi->legacy_shift;
0466
0467 for_each_set_bit(bit, &status, msi->nr) {
0468 int ret;
0469 ret = generic_handle_domain_irq(msi->inner_domain, bit);
0470 if (ret)
0471 dev_dbg(dev, "unexpected MSI\n");
0472 }
0473
0474 chained_irq_exit(chip, desc);
0475 }
0476
0477 static void brcm_msi_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
0478 {
0479 struct brcm_msi *msi = irq_data_get_irq_chip_data(data);
0480
0481 msg->address_lo = lower_32_bits(msi->target_addr);
0482 msg->address_hi = upper_32_bits(msi->target_addr);
0483 msg->data = (0xffff & PCIE_MISC_MSI_DATA_CONFIG_VAL_32) | data->hwirq;
0484 }
0485
0486 static int brcm_msi_set_affinity(struct irq_data *irq_data,
0487 const struct cpumask *mask, bool force)
0488 {
0489 return -EINVAL;
0490 }
0491
0492 static void brcm_msi_ack_irq(struct irq_data *data)
0493 {
0494 struct brcm_msi *msi = irq_data_get_irq_chip_data(data);
0495 const int shift_amt = data->hwirq + msi->legacy_shift;
0496
0497 writel(1 << shift_amt, msi->intr_base + MSI_INT_CLR);
0498 }
0499
0500
0501 static struct irq_chip brcm_msi_bottom_irq_chip = {
0502 .name = "BRCM STB MSI",
0503 .irq_compose_msi_msg = brcm_msi_compose_msi_msg,
0504 .irq_set_affinity = brcm_msi_set_affinity,
0505 .irq_ack = brcm_msi_ack_irq,
0506 };
0507
0508 static int brcm_msi_alloc(struct brcm_msi *msi)
0509 {
0510 int hwirq;
0511
0512 mutex_lock(&msi->lock);
0513 hwirq = bitmap_find_free_region(msi->used, msi->nr, 0);
0514 mutex_unlock(&msi->lock);
0515
0516 return hwirq;
0517 }
0518
0519 static void brcm_msi_free(struct brcm_msi *msi, unsigned long hwirq)
0520 {
0521 mutex_lock(&msi->lock);
0522 bitmap_release_region(msi->used, hwirq, 0);
0523 mutex_unlock(&msi->lock);
0524 }
0525
0526 static int brcm_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
0527 unsigned int nr_irqs, void *args)
0528 {
0529 struct brcm_msi *msi = domain->host_data;
0530 int hwirq;
0531
0532 hwirq = brcm_msi_alloc(msi);
0533
0534 if (hwirq < 0)
0535 return hwirq;
0536
0537 irq_domain_set_info(domain, virq, (irq_hw_number_t)hwirq,
0538 &brcm_msi_bottom_irq_chip, domain->host_data,
0539 handle_edge_irq, NULL, NULL);
0540 return 0;
0541 }
0542
0543 static void brcm_irq_domain_free(struct irq_domain *domain,
0544 unsigned int virq, unsigned int nr_irqs)
0545 {
0546 struct irq_data *d = irq_domain_get_irq_data(domain, virq);
0547 struct brcm_msi *msi = irq_data_get_irq_chip_data(d);
0548
0549 brcm_msi_free(msi, d->hwirq);
0550 }
0551
0552 static const struct irq_domain_ops msi_domain_ops = {
0553 .alloc = brcm_irq_domain_alloc,
0554 .free = brcm_irq_domain_free,
0555 };
0556
0557 static int brcm_allocate_domains(struct brcm_msi *msi)
0558 {
0559 struct fwnode_handle *fwnode = of_node_to_fwnode(msi->np);
0560 struct device *dev = msi->dev;
0561
0562 msi->inner_domain = irq_domain_add_linear(NULL, msi->nr, &msi_domain_ops, msi);
0563 if (!msi->inner_domain) {
0564 dev_err(dev, "failed to create IRQ domain\n");
0565 return -ENOMEM;
0566 }
0567
0568 msi->msi_domain = pci_msi_create_irq_domain(fwnode,
0569 &brcm_msi_domain_info,
0570 msi->inner_domain);
0571 if (!msi->msi_domain) {
0572 dev_err(dev, "failed to create MSI domain\n");
0573 irq_domain_remove(msi->inner_domain);
0574 return -ENOMEM;
0575 }
0576
0577 return 0;
0578 }
0579
0580 static void brcm_free_domains(struct brcm_msi *msi)
0581 {
0582 irq_domain_remove(msi->msi_domain);
0583 irq_domain_remove(msi->inner_domain);
0584 }
0585
0586 static void brcm_msi_remove(struct brcm_pcie *pcie)
0587 {
0588 struct brcm_msi *msi = pcie->msi;
0589
0590 if (!msi)
0591 return;
0592 irq_set_chained_handler_and_data(msi->irq, NULL, NULL);
0593 brcm_free_domains(msi);
0594 }
0595
0596 static void brcm_msi_set_regs(struct brcm_msi *msi)
0597 {
0598 u32 val = msi->legacy ? BRCM_INT_PCI_MSI_LEGACY_MASK :
0599 BRCM_INT_PCI_MSI_MASK;
0600
0601 writel(val, msi->intr_base + MSI_INT_MASK_CLR);
0602 writel(val, msi->intr_base + MSI_INT_CLR);
0603
0604
0605
0606
0607
0608 writel(lower_32_bits(msi->target_addr) | 0x1,
0609 msi->base + PCIE_MISC_MSI_BAR_CONFIG_LO);
0610 writel(upper_32_bits(msi->target_addr),
0611 msi->base + PCIE_MISC_MSI_BAR_CONFIG_HI);
0612
0613 val = msi->legacy ? PCIE_MISC_MSI_DATA_CONFIG_VAL_8 : PCIE_MISC_MSI_DATA_CONFIG_VAL_32;
0614 writel(val, msi->base + PCIE_MISC_MSI_DATA_CONFIG);
0615 }
0616
0617 static int brcm_pcie_enable_msi(struct brcm_pcie *pcie)
0618 {
0619 struct brcm_msi *msi;
0620 int irq, ret;
0621 struct device *dev = pcie->dev;
0622
0623 irq = irq_of_parse_and_map(dev->of_node, 1);
0624 if (irq <= 0) {
0625 dev_err(dev, "cannot map MSI interrupt\n");
0626 return -ENODEV;
0627 }
0628
0629 msi = devm_kzalloc(dev, sizeof(struct brcm_msi), GFP_KERNEL);
0630 if (!msi)
0631 return -ENOMEM;
0632
0633 mutex_init(&msi->lock);
0634 msi->dev = dev;
0635 msi->base = pcie->base;
0636 msi->np = pcie->np;
0637 msi->target_addr = pcie->msi_target_addr;
0638 msi->irq = irq;
0639 msi->legacy = pcie->hw_rev < BRCM_PCIE_HW_REV_33;
0640
0641
0642
0643
0644
0645 BUILD_BUG_ON(BRCM_INT_PCI_MSI_LEGACY_NR > BRCM_INT_PCI_MSI_NR);
0646
0647 if (msi->legacy) {
0648 msi->intr_base = msi->base + PCIE_INTR2_CPU_BASE;
0649 msi->nr = BRCM_INT_PCI_MSI_LEGACY_NR;
0650 msi->legacy_shift = 24;
0651 } else {
0652 msi->intr_base = msi->base + PCIE_MSI_INTR2_BASE;
0653 msi->nr = BRCM_INT_PCI_MSI_NR;
0654 msi->legacy_shift = 0;
0655 }
0656
0657 ret = brcm_allocate_domains(msi);
0658 if (ret)
0659 return ret;
0660
0661 irq_set_chained_handler_and_data(msi->irq, brcm_pcie_msi_isr, msi);
0662
0663 brcm_msi_set_regs(msi);
0664 pcie->msi = msi;
0665
0666 return 0;
0667 }
0668
0669
0670 static bool brcm_pcie_rc_mode(struct brcm_pcie *pcie)
0671 {
0672 void __iomem *base = pcie->base;
0673 u32 val = readl(base + PCIE_MISC_PCIE_STATUS);
0674
0675 return !!FIELD_GET(PCIE_MISC_PCIE_STATUS_PCIE_PORT_MASK, val);
0676 }
0677
0678 static bool brcm_pcie_link_up(struct brcm_pcie *pcie)
0679 {
0680 u32 val = readl(pcie->base + PCIE_MISC_PCIE_STATUS);
0681 u32 dla = FIELD_GET(PCIE_MISC_PCIE_STATUS_PCIE_DL_ACTIVE_MASK, val);
0682 u32 plu = FIELD_GET(PCIE_MISC_PCIE_STATUS_PCIE_PHYLINKUP_MASK, val);
0683
0684 return dla && plu;
0685 }
0686
0687 static void __iomem *brcm_pcie_map_bus(struct pci_bus *bus,
0688 unsigned int devfn, int where)
0689 {
0690 struct brcm_pcie *pcie = bus->sysdata;
0691 void __iomem *base = pcie->base;
0692 int idx;
0693
0694
0695 if (pci_is_root_bus(bus))
0696 return devfn ? NULL : base + PCIE_ECAM_REG(where);
0697
0698
0699 if (!brcm_pcie_link_up(pcie))
0700 return NULL;
0701
0702
0703 idx = PCIE_ECAM_OFFSET(bus->number, devfn, 0);
0704 writel(idx, pcie->base + PCIE_EXT_CFG_INDEX);
0705 return base + PCIE_EXT_CFG_DATA + PCIE_ECAM_REG(where);
0706 }
0707
0708 static void __iomem *brcm7425_pcie_map_bus(struct pci_bus *bus,
0709 unsigned int devfn, int where)
0710 {
0711 struct brcm_pcie *pcie = bus->sysdata;
0712 void __iomem *base = pcie->base;
0713 int idx;
0714
0715
0716 if (pci_is_root_bus(bus))
0717 return devfn ? NULL : base + PCIE_ECAM_REG(where);
0718
0719
0720 if (!brcm_pcie_link_up(pcie))
0721 return NULL;
0722
0723
0724 idx = PCIE_ECAM_OFFSET(bus->number, devfn, where);
0725 writel(idx, base + IDX_ADDR(pcie));
0726 return base + DATA_ADDR(pcie);
0727 }
0728
0729 static inline void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie, u32 val)
0730 {
0731 u32 tmp, mask = RGR1_SW_INIT_1_INIT_GENERIC_MASK;
0732 u32 shift = RGR1_SW_INIT_1_INIT_GENERIC_SHIFT;
0733
0734 tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
0735 tmp = (tmp & ~mask) | ((val << shift) & mask);
0736 writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
0737 }
0738
0739 static inline void brcm_pcie_bridge_sw_init_set_7278(struct brcm_pcie *pcie, u32 val)
0740 {
0741 u32 tmp, mask = RGR1_SW_INIT_1_INIT_7278_MASK;
0742 u32 shift = RGR1_SW_INIT_1_INIT_7278_SHIFT;
0743
0744 tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
0745 tmp = (tmp & ~mask) | ((val << shift) & mask);
0746 writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
0747 }
0748
0749 static inline void brcm_pcie_perst_set_4908(struct brcm_pcie *pcie, u32 val)
0750 {
0751 if (WARN_ONCE(!pcie->perst_reset, "missing PERST# reset controller\n"))
0752 return;
0753
0754 if (val)
0755 reset_control_assert(pcie->perst_reset);
0756 else
0757 reset_control_deassert(pcie->perst_reset);
0758 }
0759
0760 static inline void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val)
0761 {
0762 u32 tmp;
0763
0764
0765 tmp = readl(pcie->base + PCIE_MISC_PCIE_CTRL);
0766 u32p_replace_bits(&tmp, !val, PCIE_MISC_PCIE_CTRL_PCIE_PERSTB_MASK);
0767 writel(tmp, pcie->base + PCIE_MISC_PCIE_CTRL);
0768 }
0769
0770 static inline void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val)
0771 {
0772 u32 tmp;
0773
0774 tmp = readl(pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
0775 u32p_replace_bits(&tmp, val, PCIE_RGR1_SW_INIT_1_PERST_MASK);
0776 writel(tmp, pcie->base + PCIE_RGR1_SW_INIT_1(pcie));
0777 }
0778
0779 static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
0780 u64 *rc_bar2_size,
0781 u64 *rc_bar2_offset)
0782 {
0783 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
0784 struct resource_entry *entry;
0785 struct device *dev = pcie->dev;
0786 u64 lowest_pcie_addr = ~(u64)0;
0787 int ret, i = 0;
0788 u64 size = 0;
0789
0790 resource_list_for_each_entry(entry, &bridge->dma_ranges) {
0791 u64 pcie_beg = entry->res->start - entry->offset;
0792
0793 size += entry->res->end - entry->res->start + 1;
0794 if (pcie_beg < lowest_pcie_addr)
0795 lowest_pcie_addr = pcie_beg;
0796 }
0797
0798 if (lowest_pcie_addr == ~(u64)0) {
0799 dev_err(dev, "DT node has no dma-ranges\n");
0800 return -EINVAL;
0801 }
0802
0803 ret = of_property_read_variable_u64_array(pcie->np, "brcm,scb-sizes", pcie->memc_size, 1,
0804 PCIE_BRCM_MAX_MEMC);
0805
0806 if (ret <= 0) {
0807
0808 pcie->num_memc = 1;
0809 pcie->memc_size[0] = 1ULL << fls64(size - 1);
0810 } else {
0811 pcie->num_memc = ret;
0812 }
0813
0814
0815 for (i = 0, size = 0; i < pcie->num_memc; i++)
0816 size += pcie->memc_size[i];
0817
0818
0819 *rc_bar2_offset = lowest_pcie_addr;
0820
0821 *rc_bar2_size = 1ULL << fls64(size - 1);
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856 if (!*rc_bar2_size || (*rc_bar2_offset & (*rc_bar2_size - 1)) ||
0857 (*rc_bar2_offset < SZ_4G && *rc_bar2_offset > SZ_2G)) {
0858 dev_err(dev, "Invalid rc_bar2_offset/size: size 0x%llx, off 0x%llx\n",
0859 *rc_bar2_size, *rc_bar2_offset);
0860 return -EINVAL;
0861 }
0862
0863 return 0;
0864 }
0865
0866 static int brcm_pcie_setup(struct brcm_pcie *pcie)
0867 {
0868 u64 rc_bar2_offset, rc_bar2_size;
0869 void __iomem *base = pcie->base;
0870 struct pci_host_bridge *bridge;
0871 struct resource_entry *entry;
0872 u32 tmp, burst, aspm_support;
0873 int num_out_wins = 0;
0874 int ret, memc;
0875
0876
0877 pcie->bridge_sw_init_set(pcie, 1);
0878 usleep_range(100, 200);
0879
0880
0881 pcie->bridge_sw_init_set(pcie, 0);
0882
0883 tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
0884 if (is_bmips(pcie))
0885 tmp &= ~PCIE_BMIPS_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK;
0886 else
0887 tmp &= ~PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK;
0888 writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
0889
0890 usleep_range(100, 200);
0891
0892
0893
0894
0895
0896
0897 if (is_bmips(pcie))
0898 burst = 0x1;
0899 else if (pcie->type == BCM2711)
0900 burst = 0x0;
0901 else if (pcie->type == BCM7278)
0902 burst = 0x3;
0903 else
0904 burst = 0x2;
0905
0906
0907 tmp = readl(base + PCIE_MISC_MISC_CTRL);
0908 u32p_replace_bits(&tmp, 1, PCIE_MISC_MISC_CTRL_SCB_ACCESS_EN_MASK);
0909 u32p_replace_bits(&tmp, 1, PCIE_MISC_MISC_CTRL_CFG_READ_UR_MODE_MASK);
0910 u32p_replace_bits(&tmp, burst, PCIE_MISC_MISC_CTRL_MAX_BURST_SIZE_MASK);
0911 writel(tmp, base + PCIE_MISC_MISC_CTRL);
0912
0913 ret = brcm_pcie_get_rc_bar2_size_and_offset(pcie, &rc_bar2_size,
0914 &rc_bar2_offset);
0915 if (ret)
0916 return ret;
0917
0918 tmp = lower_32_bits(rc_bar2_offset);
0919 u32p_replace_bits(&tmp, brcm_pcie_encode_ibar_size(rc_bar2_size),
0920 PCIE_MISC_RC_BAR2_CONFIG_LO_SIZE_MASK);
0921 writel(tmp, base + PCIE_MISC_RC_BAR2_CONFIG_LO);
0922 writel(upper_32_bits(rc_bar2_offset),
0923 base + PCIE_MISC_RC_BAR2_CONFIG_HI);
0924
0925 tmp = readl(base + PCIE_MISC_MISC_CTRL);
0926 for (memc = 0; memc < pcie->num_memc; memc++) {
0927 u32 scb_size_val = ilog2(pcie->memc_size[memc]) - 15;
0928
0929 if (memc == 0)
0930 u32p_replace_bits(&tmp, scb_size_val, SCB_SIZE_MASK(0));
0931 else if (memc == 1)
0932 u32p_replace_bits(&tmp, scb_size_val, SCB_SIZE_MASK(1));
0933 else if (memc == 2)
0934 u32p_replace_bits(&tmp, scb_size_val, SCB_SIZE_MASK(2));
0935 }
0936 writel(tmp, base + PCIE_MISC_MISC_CTRL);
0937
0938
0939
0940
0941
0942
0943
0944
0945 if (rc_bar2_offset >= SZ_4G || (rc_bar2_size + rc_bar2_offset) < SZ_4G)
0946 pcie->msi_target_addr = BRCM_MSI_TARGET_ADDR_LT_4GB;
0947 else
0948 pcie->msi_target_addr = BRCM_MSI_TARGET_ADDR_GT_4GB;
0949
0950 if (!brcm_pcie_rc_mode(pcie)) {
0951 dev_err(pcie->dev, "PCIe RC controller misconfigured as Endpoint\n");
0952 return -EINVAL;
0953 }
0954
0955
0956 tmp = readl(base + PCIE_MISC_RC_BAR1_CONFIG_LO);
0957 tmp &= ~PCIE_MISC_RC_BAR1_CONFIG_LO_SIZE_MASK;
0958 writel(tmp, base + PCIE_MISC_RC_BAR1_CONFIG_LO);
0959
0960
0961 tmp = readl(base + PCIE_MISC_RC_BAR3_CONFIG_LO);
0962 tmp &= ~PCIE_MISC_RC_BAR3_CONFIG_LO_SIZE_MASK;
0963 writel(tmp, base + PCIE_MISC_RC_BAR3_CONFIG_LO);
0964
0965
0966 aspm_support = PCIE_LINK_STATE_L1;
0967 if (!of_property_read_bool(pcie->np, "aspm-no-l0s"))
0968 aspm_support |= PCIE_LINK_STATE_L0S;
0969 tmp = readl(base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
0970 u32p_replace_bits(&tmp, aspm_support,
0971 PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK);
0972 writel(tmp, base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
0973
0974
0975
0976
0977
0978 tmp = readl(base + PCIE_RC_CFG_PRIV1_ID_VAL3);
0979 u32p_replace_bits(&tmp, 0x060400,
0980 PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK);
0981 writel(tmp, base + PCIE_RC_CFG_PRIV1_ID_VAL3);
0982
0983 bridge = pci_host_bridge_from_priv(pcie);
0984 resource_list_for_each_entry(entry, &bridge->windows) {
0985 struct resource *res = entry->res;
0986
0987 if (resource_type(res) != IORESOURCE_MEM)
0988 continue;
0989
0990 if (num_out_wins >= BRCM_NUM_PCIE_OUT_WINS) {
0991 dev_err(pcie->dev, "too many outbound wins\n");
0992 return -EINVAL;
0993 }
0994
0995 if (is_bmips(pcie)) {
0996 u64 start = res->start;
0997 unsigned int j, nwins = resource_size(res) / SZ_128M;
0998
0999
1000 if (nwins > BRCM_NUM_PCIE_OUT_WINS)
1001 nwins = BRCM_NUM_PCIE_OUT_WINS;
1002 for (j = 0; j < nwins; j++, start += SZ_128M)
1003 brcm_pcie_set_outbound_win(pcie, j, start,
1004 start - entry->offset,
1005 SZ_128M);
1006 break;
1007 }
1008 brcm_pcie_set_outbound_win(pcie, num_out_wins, res->start,
1009 res->start - entry->offset,
1010 resource_size(res));
1011 num_out_wins++;
1012 }
1013
1014
1015 tmp = readl(base + PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1);
1016 u32p_replace_bits(&tmp, PCIE_RC_CFG_VENDOR_SPCIFIC_REG1_LITTLE_ENDIAN,
1017 PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK);
1018 writel(tmp, base + PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1);
1019
1020 return 0;
1021 }
1022
1023 static int brcm_pcie_start_link(struct brcm_pcie *pcie)
1024 {
1025 struct device *dev = pcie->dev;
1026 void __iomem *base = pcie->base;
1027 u16 nlw, cls, lnksta;
1028 bool ssc_good = false;
1029 u32 tmp;
1030 int ret, i;
1031
1032
1033 pcie->perst_set(pcie, 0);
1034
1035
1036
1037
1038
1039 for (i = 0; i < 100 && !brcm_pcie_link_up(pcie); i += 5)
1040 msleep(5);
1041
1042 if (!brcm_pcie_link_up(pcie)) {
1043 dev_err(dev, "link down\n");
1044 return -ENODEV;
1045 }
1046
1047 if (pcie->gen)
1048 brcm_pcie_set_gen(pcie, pcie->gen);
1049
1050 if (pcie->ssc) {
1051 ret = brcm_pcie_set_ssc(pcie);
1052 if (ret == 0)
1053 ssc_good = true;
1054 else
1055 dev_err(dev, "failed attempt to enter ssc mode\n");
1056 }
1057
1058 lnksta = readw(base + BRCM_PCIE_CAP_REGS + PCI_EXP_LNKSTA);
1059 cls = FIELD_GET(PCI_EXP_LNKSTA_CLS, lnksta);
1060 nlw = FIELD_GET(PCI_EXP_LNKSTA_NLW, lnksta);
1061 dev_info(dev, "link up, %s x%u %s\n",
1062 pci_speed_string(pcie_link_speed[cls]), nlw,
1063 ssc_good ? "(SSC)" : "(!SSC)");
1064
1065
1066
1067
1068
1069 tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
1070 tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK;
1071 writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
1072
1073 return 0;
1074 }
1075
1076 static const char * const supplies[] = {
1077 "vpcie3v3",
1078 "vpcie3v3aux",
1079 "vpcie12v",
1080 };
1081
1082 static void *alloc_subdev_regulators(struct device *dev)
1083 {
1084 const size_t size = sizeof(struct subdev_regulators) +
1085 sizeof(struct regulator_bulk_data) * ARRAY_SIZE(supplies);
1086 struct subdev_regulators *sr;
1087 int i;
1088
1089 sr = devm_kzalloc(dev, size, GFP_KERNEL);
1090 if (sr) {
1091 sr->num_supplies = ARRAY_SIZE(supplies);
1092 for (i = 0; i < ARRAY_SIZE(supplies); i++)
1093 sr->supplies[i].supply = supplies[i];
1094 }
1095
1096 return sr;
1097 }
1098
1099 static int brcm_pcie_add_bus(struct pci_bus *bus)
1100 {
1101 struct brcm_pcie *pcie = bus->sysdata;
1102 struct device *dev = &bus->dev;
1103 struct subdev_regulators *sr;
1104 int ret;
1105
1106 if (!bus->parent || !pci_is_root_bus(bus->parent))
1107 return 0;
1108
1109 if (dev->of_node) {
1110 sr = alloc_subdev_regulators(dev);
1111 if (!sr) {
1112 dev_info(dev, "Can't allocate regulators for downstream device\n");
1113 goto no_regulators;
1114 }
1115
1116 pcie->sr = sr;
1117
1118 ret = regulator_bulk_get(dev, sr->num_supplies, sr->supplies);
1119 if (ret) {
1120 dev_info(dev, "No regulators for downstream device\n");
1121 goto no_regulators;
1122 }
1123
1124 ret = regulator_bulk_enable(sr->num_supplies, sr->supplies);
1125 if (ret) {
1126 dev_err(dev, "Can't enable regulators for downstream device\n");
1127 regulator_bulk_free(sr->num_supplies, sr->supplies);
1128 pcie->sr = NULL;
1129 }
1130 }
1131
1132 no_regulators:
1133 brcm_pcie_start_link(pcie);
1134 return 0;
1135 }
1136
1137 static void brcm_pcie_remove_bus(struct pci_bus *bus)
1138 {
1139 struct brcm_pcie *pcie = bus->sysdata;
1140 struct subdev_regulators *sr = pcie->sr;
1141 struct device *dev = &bus->dev;
1142
1143 if (!sr)
1144 return;
1145
1146 if (regulator_bulk_disable(sr->num_supplies, sr->supplies))
1147 dev_err(dev, "Failed to disable regulators for downstream device\n");
1148 regulator_bulk_free(sr->num_supplies, sr->supplies);
1149 pcie->sr = NULL;
1150 }
1151
1152
1153 static void brcm_pcie_enter_l23(struct brcm_pcie *pcie)
1154 {
1155 void __iomem *base = pcie->base;
1156 int l23, i;
1157 u32 tmp;
1158
1159
1160 tmp = readl(base + PCIE_MISC_PCIE_CTRL);
1161 u32p_replace_bits(&tmp, 1, PCIE_MISC_PCIE_CTRL_PCIE_L23_REQUEST_MASK);
1162 writel(tmp, base + PCIE_MISC_PCIE_CTRL);
1163
1164
1165 tmp = readl(base + PCIE_MISC_PCIE_STATUS);
1166 l23 = FIELD_GET(PCIE_MISC_PCIE_STATUS_PCIE_LINK_IN_L23_MASK, tmp);
1167 for (i = 0; i < 15 && !l23; i++) {
1168 usleep_range(2000, 2400);
1169 tmp = readl(base + PCIE_MISC_PCIE_STATUS);
1170 l23 = FIELD_GET(PCIE_MISC_PCIE_STATUS_PCIE_LINK_IN_L23_MASK,
1171 tmp);
1172 }
1173
1174 if (!l23)
1175 dev_err(pcie->dev, "failed to enter low-power link state\n");
1176 }
1177
1178 static int brcm_phy_cntl(struct brcm_pcie *pcie, const int start)
1179 {
1180 static const u32 shifts[PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS] = {
1181 PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_SHIFT,
1182 PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_SHIFT,
1183 PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_SHIFT,};
1184 static const u32 masks[PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS] = {
1185 PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_MASK,
1186 PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_MASK,
1187 PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_MASK,};
1188 const int beg = start ? 0 : PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS - 1;
1189 const int end = start ? PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS : -1;
1190 u32 tmp, combined_mask = 0;
1191 u32 val;
1192 void __iomem *base = pcie->base;
1193 int i, ret;
1194
1195 for (i = beg; i != end; start ? i++ : i--) {
1196 val = start ? BIT_MASK(shifts[i]) : 0;
1197 tmp = readl(base + PCIE_DVT_PMU_PCIE_PHY_CTRL);
1198 tmp = (tmp & ~masks[i]) | (val & masks[i]);
1199 writel(tmp, base + PCIE_DVT_PMU_PCIE_PHY_CTRL);
1200 usleep_range(50, 200);
1201 combined_mask |= masks[i];
1202 }
1203
1204 tmp = readl(base + PCIE_DVT_PMU_PCIE_PHY_CTRL);
1205 val = start ? combined_mask : 0;
1206
1207 ret = (tmp & combined_mask) == val ? 0 : -EIO;
1208 if (ret)
1209 dev_err(pcie->dev, "failed to %s phy\n", (start ? "start" : "stop"));
1210
1211 return ret;
1212 }
1213
1214 static inline int brcm_phy_start(struct brcm_pcie *pcie)
1215 {
1216 return pcie->rescal ? brcm_phy_cntl(pcie, 1) : 0;
1217 }
1218
1219 static inline int brcm_phy_stop(struct brcm_pcie *pcie)
1220 {
1221 return pcie->rescal ? brcm_phy_cntl(pcie, 0) : 0;
1222 }
1223
1224 static void brcm_pcie_turn_off(struct brcm_pcie *pcie)
1225 {
1226 void __iomem *base = pcie->base;
1227 int tmp;
1228
1229 if (brcm_pcie_link_up(pcie))
1230 brcm_pcie_enter_l23(pcie);
1231
1232 pcie->perst_set(pcie, 1);
1233
1234
1235 tmp = readl(base + PCIE_MISC_PCIE_CTRL);
1236 u32p_replace_bits(&tmp, 0, PCIE_MISC_PCIE_CTRL_PCIE_L23_REQUEST_MASK);
1237 writel(tmp, base + PCIE_MISC_PCIE_CTRL);
1238
1239
1240 tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
1241 u32p_replace_bits(&tmp, 1, PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK);
1242 writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
1243
1244
1245 pcie->bridge_sw_init_set(pcie, 1);
1246 }
1247
1248 static int pci_dev_may_wakeup(struct pci_dev *dev, void *data)
1249 {
1250 bool *ret = data;
1251
1252 if (device_may_wakeup(&dev->dev)) {
1253 *ret = true;
1254 dev_info(&dev->dev, "Possible wake-up device; regulators will not be disabled\n");
1255 }
1256 return (int) *ret;
1257 }
1258
1259 static int brcm_pcie_suspend_noirq(struct device *dev)
1260 {
1261 struct brcm_pcie *pcie = dev_get_drvdata(dev);
1262 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
1263 int ret;
1264
1265 brcm_pcie_turn_off(pcie);
1266
1267
1268
1269
1270
1271 if (brcm_phy_stop(pcie))
1272 dev_err(dev, "Could not stop phy for suspend\n");
1273
1274 ret = reset_control_rearm(pcie->rescal);
1275 if (ret) {
1276 dev_err(dev, "Could not rearm rescal reset\n");
1277 return ret;
1278 }
1279
1280 if (pcie->sr) {
1281
1282
1283
1284
1285
1286 pcie->ep_wakeup_capable = false;
1287 pci_walk_bus(bridge->bus, pci_dev_may_wakeup,
1288 &pcie->ep_wakeup_capable);
1289 if (!pcie->ep_wakeup_capable) {
1290 ret = regulator_bulk_disable(pcie->sr->num_supplies,
1291 pcie->sr->supplies);
1292 if (ret) {
1293 dev_err(dev, "Could not turn off regulators\n");
1294 reset_control_reset(pcie->rescal);
1295 return ret;
1296 }
1297 }
1298 }
1299 clk_disable_unprepare(pcie->clk);
1300
1301 return 0;
1302 }
1303
1304 static int brcm_pcie_resume_noirq(struct device *dev)
1305 {
1306 struct brcm_pcie *pcie = dev_get_drvdata(dev);
1307 void __iomem *base;
1308 u32 tmp;
1309 int ret;
1310
1311 base = pcie->base;
1312 ret = clk_prepare_enable(pcie->clk);
1313 if (ret)
1314 return ret;
1315
1316 ret = reset_control_reset(pcie->rescal);
1317 if (ret)
1318 goto err_disable_clk;
1319
1320 ret = brcm_phy_start(pcie);
1321 if (ret)
1322 goto err_reset;
1323
1324
1325 pcie->bridge_sw_init_set(pcie, 0);
1326
1327
1328 tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
1329 u32p_replace_bits(&tmp, 0, PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK);
1330 writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
1331
1332
1333 udelay(100);
1334
1335 ret = brcm_pcie_setup(pcie);
1336 if (ret)
1337 goto err_reset;
1338
1339 if (pcie->sr) {
1340 if (pcie->ep_wakeup_capable) {
1341
1342
1343
1344
1345
1346
1347 pcie->ep_wakeup_capable = false;
1348 } else {
1349 ret = regulator_bulk_enable(pcie->sr->num_supplies,
1350 pcie->sr->supplies);
1351 if (ret) {
1352 dev_err(dev, "Could not turn on regulators\n");
1353 goto err_reset;
1354 }
1355 }
1356 }
1357
1358 ret = brcm_pcie_start_link(pcie);
1359 if (ret)
1360 goto err_regulator;
1361
1362 if (pcie->msi)
1363 brcm_msi_set_regs(pcie->msi);
1364
1365 return 0;
1366
1367 err_regulator:
1368 if (pcie->sr)
1369 regulator_bulk_disable(pcie->sr->num_supplies, pcie->sr->supplies);
1370 err_reset:
1371 reset_control_rearm(pcie->rescal);
1372 err_disable_clk:
1373 clk_disable_unprepare(pcie->clk);
1374 return ret;
1375 }
1376
1377 static void __brcm_pcie_remove(struct brcm_pcie *pcie)
1378 {
1379 brcm_msi_remove(pcie);
1380 brcm_pcie_turn_off(pcie);
1381 if (brcm_phy_stop(pcie))
1382 dev_err(pcie->dev, "Could not stop phy\n");
1383 if (reset_control_rearm(pcie->rescal))
1384 dev_err(pcie->dev, "Could not rearm rescal reset\n");
1385 clk_disable_unprepare(pcie->clk);
1386 }
1387
1388 static int brcm_pcie_remove(struct platform_device *pdev)
1389 {
1390 struct brcm_pcie *pcie = platform_get_drvdata(pdev);
1391 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
1392
1393 pci_stop_root_bus(bridge->bus);
1394 pci_remove_root_bus(bridge->bus);
1395 __brcm_pcie_remove(pcie);
1396
1397 return 0;
1398 }
1399
1400 static const int pcie_offsets[] = {
1401 [RGR1_SW_INIT_1] = 0x9210,
1402 [EXT_CFG_INDEX] = 0x9000,
1403 [EXT_CFG_DATA] = 0x9004,
1404 };
1405
1406 static const int pcie_offsets_bmips_7425[] = {
1407 [RGR1_SW_INIT_1] = 0x8010,
1408 [EXT_CFG_INDEX] = 0x8300,
1409 [EXT_CFG_DATA] = 0x8304,
1410 };
1411
1412 static const struct pcie_cfg_data generic_cfg = {
1413 .offsets = pcie_offsets,
1414 .type = GENERIC,
1415 .perst_set = brcm_pcie_perst_set_generic,
1416 .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
1417 };
1418
1419 static const struct pcie_cfg_data bcm7425_cfg = {
1420 .offsets = pcie_offsets_bmips_7425,
1421 .type = BCM7425,
1422 .perst_set = brcm_pcie_perst_set_generic,
1423 .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
1424 };
1425
1426 static const struct pcie_cfg_data bcm7435_cfg = {
1427 .offsets = pcie_offsets,
1428 .type = BCM7435,
1429 .perst_set = brcm_pcie_perst_set_generic,
1430 .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
1431 };
1432
1433 static const struct pcie_cfg_data bcm4908_cfg = {
1434 .offsets = pcie_offsets,
1435 .type = BCM4908,
1436 .perst_set = brcm_pcie_perst_set_4908,
1437 .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
1438 };
1439
1440 static const int pcie_offset_bcm7278[] = {
1441 [RGR1_SW_INIT_1] = 0xc010,
1442 [EXT_CFG_INDEX] = 0x9000,
1443 [EXT_CFG_DATA] = 0x9004,
1444 };
1445
1446 static const struct pcie_cfg_data bcm7278_cfg = {
1447 .offsets = pcie_offset_bcm7278,
1448 .type = BCM7278,
1449 .perst_set = brcm_pcie_perst_set_7278,
1450 .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_7278,
1451 };
1452
1453 static const struct pcie_cfg_data bcm2711_cfg = {
1454 .offsets = pcie_offsets,
1455 .type = BCM2711,
1456 .perst_set = brcm_pcie_perst_set_generic,
1457 .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
1458 };
1459
1460 static const struct of_device_id brcm_pcie_match[] = {
1461 { .compatible = "brcm,bcm2711-pcie", .data = &bcm2711_cfg },
1462 { .compatible = "brcm,bcm4908-pcie", .data = &bcm4908_cfg },
1463 { .compatible = "brcm,bcm7211-pcie", .data = &generic_cfg },
1464 { .compatible = "brcm,bcm7278-pcie", .data = &bcm7278_cfg },
1465 { .compatible = "brcm,bcm7216-pcie", .data = &bcm7278_cfg },
1466 { .compatible = "brcm,bcm7445-pcie", .data = &generic_cfg },
1467 { .compatible = "brcm,bcm7435-pcie", .data = &bcm7435_cfg },
1468 { .compatible = "brcm,bcm7425-pcie", .data = &bcm7425_cfg },
1469 {},
1470 };
1471
1472 static struct pci_ops brcm_pcie_ops = {
1473 .map_bus = brcm_pcie_map_bus,
1474 .read = pci_generic_config_read,
1475 .write = pci_generic_config_write,
1476 .add_bus = brcm_pcie_add_bus,
1477 .remove_bus = brcm_pcie_remove_bus,
1478 };
1479
1480 static struct pci_ops brcm7425_pcie_ops = {
1481 .map_bus = brcm7425_pcie_map_bus,
1482 .read = pci_generic_config_read32,
1483 .write = pci_generic_config_write32,
1484 .add_bus = brcm_pcie_add_bus,
1485 .remove_bus = brcm_pcie_remove_bus,
1486 };
1487
1488 static int brcm_pcie_probe(struct platform_device *pdev)
1489 {
1490 struct device_node *np = pdev->dev.of_node, *msi_np;
1491 struct pci_host_bridge *bridge;
1492 const struct pcie_cfg_data *data;
1493 struct brcm_pcie *pcie;
1494 int ret;
1495
1496 bridge = devm_pci_alloc_host_bridge(&pdev->dev, sizeof(*pcie));
1497 if (!bridge)
1498 return -ENOMEM;
1499
1500 data = of_device_get_match_data(&pdev->dev);
1501 if (!data) {
1502 pr_err("failed to look up compatible string\n");
1503 return -EINVAL;
1504 }
1505
1506 pcie = pci_host_bridge_priv(bridge);
1507 pcie->dev = &pdev->dev;
1508 pcie->np = np;
1509 pcie->reg_offsets = data->offsets;
1510 pcie->type = data->type;
1511 pcie->perst_set = data->perst_set;
1512 pcie->bridge_sw_init_set = data->bridge_sw_init_set;
1513
1514 pcie->base = devm_platform_ioremap_resource(pdev, 0);
1515 if (IS_ERR(pcie->base))
1516 return PTR_ERR(pcie->base);
1517
1518 pcie->clk = devm_clk_get_optional(&pdev->dev, "sw_pcie");
1519 if (IS_ERR(pcie->clk))
1520 return PTR_ERR(pcie->clk);
1521
1522 ret = of_pci_get_max_link_speed(np);
1523 pcie->gen = (ret < 0) ? 0 : ret;
1524
1525 pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
1526
1527 ret = clk_prepare_enable(pcie->clk);
1528 if (ret) {
1529 dev_err(&pdev->dev, "could not enable clock\n");
1530 return ret;
1531 }
1532 pcie->rescal = devm_reset_control_get_optional_shared(&pdev->dev, "rescal");
1533 if (IS_ERR(pcie->rescal)) {
1534 clk_disable_unprepare(pcie->clk);
1535 return PTR_ERR(pcie->rescal);
1536 }
1537 pcie->perst_reset = devm_reset_control_get_optional_exclusive(&pdev->dev, "perst");
1538 if (IS_ERR(pcie->perst_reset)) {
1539 clk_disable_unprepare(pcie->clk);
1540 return PTR_ERR(pcie->perst_reset);
1541 }
1542
1543 ret = reset_control_reset(pcie->rescal);
1544 if (ret)
1545 dev_err(&pdev->dev, "failed to deassert 'rescal'\n");
1546
1547 ret = brcm_phy_start(pcie);
1548 if (ret) {
1549 reset_control_rearm(pcie->rescal);
1550 clk_disable_unprepare(pcie->clk);
1551 return ret;
1552 }
1553
1554 ret = brcm_pcie_setup(pcie);
1555 if (ret)
1556 goto fail;
1557
1558 pcie->hw_rev = readl(pcie->base + PCIE_MISC_REVISION);
1559 if (pcie->type == BCM4908 && pcie->hw_rev >= BRCM_PCIE_HW_REV_3_20) {
1560 dev_err(pcie->dev, "hardware revision with unsupported PERST# setup\n");
1561 ret = -ENODEV;
1562 goto fail;
1563 }
1564
1565 msi_np = of_parse_phandle(pcie->np, "msi-parent", 0);
1566 if (pci_msi_enabled() && msi_np == pcie->np) {
1567 ret = brcm_pcie_enable_msi(pcie);
1568 if (ret) {
1569 dev_err(pcie->dev, "probe of internal MSI failed");
1570 goto fail;
1571 }
1572 }
1573
1574 bridge->ops = pcie->type == BCM7425 ? &brcm7425_pcie_ops : &brcm_pcie_ops;
1575 bridge->sysdata = pcie;
1576
1577 platform_set_drvdata(pdev, pcie);
1578
1579 ret = pci_host_probe(bridge);
1580 if (!ret && !brcm_pcie_link_up(pcie))
1581 ret = -ENODEV;
1582
1583 if (ret) {
1584 brcm_pcie_remove(pdev);
1585 return ret;
1586 }
1587
1588 return 0;
1589
1590 fail:
1591 __brcm_pcie_remove(pcie);
1592 return ret;
1593 }
1594
1595 MODULE_DEVICE_TABLE(of, brcm_pcie_match);
1596
1597 static const struct dev_pm_ops brcm_pcie_pm_ops = {
1598 .suspend_noirq = brcm_pcie_suspend_noirq,
1599 .resume_noirq = brcm_pcie_resume_noirq,
1600 };
1601
1602 static struct platform_driver brcm_pcie_driver = {
1603 .probe = brcm_pcie_probe,
1604 .remove = brcm_pcie_remove,
1605 .driver = {
1606 .name = "brcm-pcie",
1607 .of_match_table = brcm_pcie_match,
1608 .pm = &brcm_pcie_pm_ops,
1609 },
1610 };
1611 module_platform_driver(brcm_pcie_driver);
1612
1613 MODULE_LICENSE("GPL");
1614 MODULE_DESCRIPTION("Broadcom STB PCIe RC driver");
1615 MODULE_AUTHOR("Broadcom");