0001
0002
0003
0004
0005
0006 #ifndef _PCIE_CADENCE_H
0007 #define _PCIE_CADENCE_H
0008
0009 #include <linux/kernel.h>
0010 #include <linux/pci.h>
0011 #include <linux/pci-epf.h>
0012 #include <linux/phy/phy.h>
0013
0014
0015 #define LINK_WAIT_MAX_RETRIES 10
0016 #define LINK_WAIT_USLEEP_MIN 90000
0017 #define LINK_WAIT_USLEEP_MAX 100000
0018
0019
0020
0021
0022 #define CDNS_PCIE_LM_BASE 0x00100000
0023
0024
0025 #define CDNS_PCIE_LM_ID (CDNS_PCIE_LM_BASE + 0x0044)
0026 #define CDNS_PCIE_LM_ID_VENDOR_MASK GENMASK(15, 0)
0027 #define CDNS_PCIE_LM_ID_VENDOR_SHIFT 0
0028 #define CDNS_PCIE_LM_ID_VENDOR(vid) \
0029 (((vid) << CDNS_PCIE_LM_ID_VENDOR_SHIFT) & CDNS_PCIE_LM_ID_VENDOR_MASK)
0030 #define CDNS_PCIE_LM_ID_SUBSYS_MASK GENMASK(31, 16)
0031 #define CDNS_PCIE_LM_ID_SUBSYS_SHIFT 16
0032 #define CDNS_PCIE_LM_ID_SUBSYS(sub) \
0033 (((sub) << CDNS_PCIE_LM_ID_SUBSYS_SHIFT) & CDNS_PCIE_LM_ID_SUBSYS_MASK)
0034
0035
0036 #define CDNS_PCIE_LM_RP_RID (CDNS_PCIE_LM_BASE + 0x0228)
0037 #define CDNS_PCIE_LM_RP_RID_MASK GENMASK(15, 0)
0038 #define CDNS_PCIE_LM_RP_RID_SHIFT 0
0039 #define CDNS_PCIE_LM_RP_RID_(rid) \
0040 (((rid) << CDNS_PCIE_LM_RP_RID_SHIFT) & CDNS_PCIE_LM_RP_RID_MASK)
0041
0042
0043 #define CDNS_PCIE_LM_EP_ID (CDNS_PCIE_LM_BASE + 0x022c)
0044 #define CDNS_PCIE_LM_EP_ID_DEV_MASK GENMASK(4, 0)
0045 #define CDNS_PCIE_LM_EP_ID_DEV_SHIFT 0
0046 #define CDNS_PCIE_LM_EP_ID_BUS_MASK GENMASK(15, 8)
0047 #define CDNS_PCIE_LM_EP_ID_BUS_SHIFT 8
0048
0049
0050 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG(bar, fn) \
0051 (((bar) < BAR_4) ? CDNS_PCIE_LM_EP_FUNC_BAR_CFG0(fn) : CDNS_PCIE_LM_EP_FUNC_BAR_CFG1(fn))
0052 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG0(fn) \
0053 (CDNS_PCIE_LM_BASE + 0x0240 + (fn) * 0x0008)
0054 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG1(fn) \
0055 (CDNS_PCIE_LM_BASE + 0x0244 + (fn) * 0x0008)
0056 #define CDNS_PCIE_LM_EP_VFUNC_BAR_CFG(bar, fn) \
0057 (((bar) < BAR_4) ? CDNS_PCIE_LM_EP_VFUNC_BAR_CFG0(fn) : CDNS_PCIE_LM_EP_VFUNC_BAR_CFG1(fn))
0058 #define CDNS_PCIE_LM_EP_VFUNC_BAR_CFG0(fn) \
0059 (CDNS_PCIE_LM_BASE + 0x0280 + (fn) * 0x0008)
0060 #define CDNS_PCIE_LM_EP_VFUNC_BAR_CFG1(fn) \
0061 (CDNS_PCIE_LM_BASE + 0x0284 + (fn) * 0x0008)
0062 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG_BAR_APERTURE_MASK(b) \
0063 (GENMASK(4, 0) << ((b) * 8))
0064 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG_BAR_APERTURE(b, a) \
0065 (((a) << ((b) * 8)) & CDNS_PCIE_LM_EP_FUNC_BAR_CFG_BAR_APERTURE_MASK(b))
0066 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG_BAR_CTRL_MASK(b) \
0067 (GENMASK(7, 5) << ((b) * 8))
0068 #define CDNS_PCIE_LM_EP_FUNC_BAR_CFG_BAR_CTRL(b, c) \
0069 (((c) << ((b) * 8 + 5)) & CDNS_PCIE_LM_EP_FUNC_BAR_CFG_BAR_CTRL_MASK(b))
0070
0071
0072 #define CDNS_PCIE_LM_EP_FUNC_CFG (CDNS_PCIE_LM_BASE + 0x02c0)
0073
0074
0075 #define CDNS_PCIE_LM_RC_BAR_CFG (CDNS_PCIE_LM_BASE + 0x0300)
0076 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR0_APERTURE_MASK GENMASK(5, 0)
0077 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR0_APERTURE(a) \
0078 (((a) << 0) & CDNS_PCIE_LM_RC_BAR_CFG_BAR0_APERTURE_MASK)
0079 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR0_CTRL_MASK GENMASK(8, 6)
0080 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR0_CTRL(c) \
0081 (((c) << 6) & CDNS_PCIE_LM_RC_BAR_CFG_BAR0_CTRL_MASK)
0082 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR1_APERTURE_MASK GENMASK(13, 9)
0083 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR1_APERTURE(a) \
0084 (((a) << 9) & CDNS_PCIE_LM_RC_BAR_CFG_BAR1_APERTURE_MASK)
0085 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR1_CTRL_MASK GENMASK(16, 14)
0086 #define CDNS_PCIE_LM_RC_BAR_CFG_BAR1_CTRL(c) \
0087 (((c) << 14) & CDNS_PCIE_LM_RC_BAR_CFG_BAR1_CTRL_MASK)
0088 #define CDNS_PCIE_LM_RC_BAR_CFG_PREFETCH_MEM_ENABLE BIT(17)
0089 #define CDNS_PCIE_LM_RC_BAR_CFG_PREFETCH_MEM_32BITS 0
0090 #define CDNS_PCIE_LM_RC_BAR_CFG_PREFETCH_MEM_64BITS BIT(18)
0091 #define CDNS_PCIE_LM_RC_BAR_CFG_IO_ENABLE BIT(19)
0092 #define CDNS_PCIE_LM_RC_BAR_CFG_IO_16BITS 0
0093 #define CDNS_PCIE_LM_RC_BAR_CFG_IO_32BITS BIT(20)
0094 #define CDNS_PCIE_LM_RC_BAR_CFG_CHECK_ENABLE BIT(31)
0095
0096
0097 #define CDNS_PCIE_LM_BAR_CFG_CTRL_DISABLED 0x0
0098 #define CDNS_PCIE_LM_BAR_CFG_CTRL_IO_32BITS 0x1
0099 #define CDNS_PCIE_LM_BAR_CFG_CTRL_MEM_32BITS 0x4
0100 #define CDNS_PCIE_LM_BAR_CFG_CTRL_PREFETCH_MEM_32BITS 0x5
0101 #define CDNS_PCIE_LM_BAR_CFG_CTRL_MEM_64BITS 0x6
0102 #define CDNS_PCIE_LM_BAR_CFG_CTRL_PREFETCH_MEM_64BITS 0x7
0103
0104 #define LM_RC_BAR_CFG_CTRL_DISABLED(bar) \
0105 (CDNS_PCIE_LM_BAR_CFG_CTRL_DISABLED << (((bar) * 8) + 6))
0106 #define LM_RC_BAR_CFG_CTRL_IO_32BITS(bar) \
0107 (CDNS_PCIE_LM_BAR_CFG_CTRL_IO_32BITS << (((bar) * 8) + 6))
0108 #define LM_RC_BAR_CFG_CTRL_MEM_32BITS(bar) \
0109 (CDNS_PCIE_LM_BAR_CFG_CTRL_MEM_32BITS << (((bar) * 8) + 6))
0110 #define LM_RC_BAR_CFG_CTRL_PREF_MEM_32BITS(bar) \
0111 (CDNS_PCIE_LM_BAR_CFG_CTRL_PREFETCH_MEM_32BITS << (((bar) * 8) + 6))
0112 #define LM_RC_BAR_CFG_CTRL_MEM_64BITS(bar) \
0113 (CDNS_PCIE_LM_BAR_CFG_CTRL_MEM_64BITS << (((bar) * 8) + 6))
0114 #define LM_RC_BAR_CFG_CTRL_PREF_MEM_64BITS(bar) \
0115 (CDNS_PCIE_LM_BAR_CFG_CTRL_PREFETCH_MEM_64BITS << (((bar) * 8) + 6))
0116 #define LM_RC_BAR_CFG_APERTURE(bar, aperture) \
0117 (((aperture) - 2) << ((bar) * 8))
0118
0119
0120 #define CDNS_PCIE_LM_PTM_CTRL (CDNS_PCIE_LM_BASE + 0x0da8)
0121 #define CDNS_PCIE_LM_TPM_CTRL_PTMRSEN BIT(17)
0122
0123
0124
0125
0126 #define CDNS_PCIE_EP_FUNC_BASE(fn) (((fn) << 12) & GENMASK(19, 12))
0127
0128 #define CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET 0x90
0129 #define CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET 0xb0
0130 #define CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET 0xc0
0131 #define CDNS_PCIE_EP_FUNC_SRIOV_CAP_OFFSET 0x200
0132
0133
0134
0135
0136 #define CDNS_PCIE_RP_BASE 0x00200000
0137 #define CDNS_PCIE_RP_CAP_OFFSET 0xc0
0138
0139
0140
0141
0142 #define CDNS_PCIE_AT_BASE 0x00400000
0143
0144
0145 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0(r) \
0146 (CDNS_PCIE_AT_BASE + 0x0000 + ((r) & 0x1f) * 0x0020)
0147 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_NBITS_MASK GENMASK(5, 0)
0148 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_NBITS(nbits) \
0149 (((nbits) - 1) & CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_NBITS_MASK)
0150 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_DEVFN_MASK GENMASK(19, 12)
0151 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_DEVFN(devfn) \
0152 (((devfn) << 12) & CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_DEVFN_MASK)
0153 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_BUS_MASK GENMASK(27, 20)
0154 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_BUS(bus) \
0155 (((bus) << 20) & CDNS_PCIE_AT_OB_REGION_PCI_ADDR0_BUS_MASK)
0156
0157
0158 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR1(r) \
0159 (CDNS_PCIE_AT_BASE + 0x0004 + ((r) & 0x1f) * 0x0020)
0160
0161
0162 #define CDNS_PCIE_AT_OB_REGION_DESC0(r) \
0163 (CDNS_PCIE_AT_BASE + 0x0008 + ((r) & 0x1f) * 0x0020)
0164 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_MASK GENMASK(3, 0)
0165 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_MEM 0x2
0166 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_IO 0x6
0167 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_CONF_TYPE0 0xa
0168 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_CONF_TYPE1 0xb
0169 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_NORMAL_MSG 0xc
0170 #define CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_VENDOR_MSG 0xd
0171
0172 #define CDNS_PCIE_AT_OB_REGION_DESC0_HARDCODED_RID BIT(23)
0173 #define CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN_MASK GENMASK(31, 24)
0174 #define CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(devfn) \
0175 (((devfn) << 24) & CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN_MASK)
0176
0177
0178 #define CDNS_PCIE_AT_OB_REGION_DESC1(r) \
0179 (CDNS_PCIE_AT_BASE + 0x000c + ((r) & 0x1f) * 0x0020)
0180 #define CDNS_PCIE_AT_OB_REGION_DESC1_BUS_MASK GENMASK(7, 0)
0181 #define CDNS_PCIE_AT_OB_REGION_DESC1_BUS(bus) \
0182 ((bus) & CDNS_PCIE_AT_OB_REGION_DESC1_BUS_MASK)
0183
0184
0185 #define CDNS_PCIE_AT_OB_REGION_CPU_ADDR0(r) \
0186 (CDNS_PCIE_AT_BASE + 0x0018 + ((r) & 0x1f) * 0x0020)
0187 #define CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS_MASK GENMASK(5, 0)
0188 #define CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(nbits) \
0189 (((nbits) - 1) & CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS_MASK)
0190
0191
0192 #define CDNS_PCIE_AT_OB_REGION_CPU_ADDR1(r) \
0193 (CDNS_PCIE_AT_BASE + 0x001c + ((r) & 0x1f) * 0x0020)
0194
0195
0196 #define CDNS_PCIE_AT_IB_RP_BAR_ADDR0(bar) \
0197 (CDNS_PCIE_AT_BASE + 0x0800 + (bar) * 0x0008)
0198 #define CDNS_PCIE_AT_IB_RP_BAR_ADDR0_NBITS_MASK GENMASK(5, 0)
0199 #define CDNS_PCIE_AT_IB_RP_BAR_ADDR0_NBITS(nbits) \
0200 (((nbits) - 1) & CDNS_PCIE_AT_IB_RP_BAR_ADDR0_NBITS_MASK)
0201 #define CDNS_PCIE_AT_IB_RP_BAR_ADDR1(bar) \
0202 (CDNS_PCIE_AT_BASE + 0x0804 + (bar) * 0x0008)
0203
0204
0205 #define CDNS_PCIE_AT_LINKDOWN (CDNS_PCIE_AT_BASE + 0x0824)
0206
0207
0208 #define CDNS_PCIE_LTSSM_CONTROL_CAP (CDNS_PCIE_LM_BASE + 0x0054)
0209 #define CDNS_PCIE_DETECT_QUIET_MIN_DELAY_MASK GENMASK(2, 1)
0210 #define CDNS_PCIE_DETECT_QUIET_MIN_DELAY_SHIFT 1
0211 #define CDNS_PCIE_DETECT_QUIET_MIN_DELAY(delay) \
0212 (((delay) << CDNS_PCIE_DETECT_QUIET_MIN_DELAY_SHIFT) & \
0213 CDNS_PCIE_DETECT_QUIET_MIN_DELAY_MASK)
0214
0215 enum cdns_pcie_rp_bar {
0216 RP_BAR_UNDEFINED = -1,
0217 RP_BAR0,
0218 RP_BAR1,
0219 RP_NO_BAR
0220 };
0221
0222 #define CDNS_PCIE_RP_MAX_IB 0x3
0223 #define CDNS_PCIE_MAX_OB 32
0224
0225 struct cdns_pcie_rp_ib_bar {
0226 u64 size;
0227 bool free;
0228 };
0229
0230
0231 #define CDNS_PCIE_AT_IB_EP_FUNC_BAR_ADDR0(fn, bar) \
0232 (CDNS_PCIE_AT_BASE + 0x0840 + (fn) * 0x0040 + (bar) * 0x0008)
0233 #define CDNS_PCIE_AT_IB_EP_FUNC_BAR_ADDR1(fn, bar) \
0234 (CDNS_PCIE_AT_BASE + 0x0844 + (fn) * 0x0040 + (bar) * 0x0008)
0235
0236
0237 #define CDNS_PCIE_NORMAL_MSG_ROUTING_MASK GENMASK(7, 5)
0238 #define CDNS_PCIE_NORMAL_MSG_ROUTING(route) \
0239 (((route) << 5) & CDNS_PCIE_NORMAL_MSG_ROUTING_MASK)
0240 #define CDNS_PCIE_NORMAL_MSG_CODE_MASK GENMASK(15, 8)
0241 #define CDNS_PCIE_NORMAL_MSG_CODE(code) \
0242 (((code) << 8) & CDNS_PCIE_NORMAL_MSG_CODE_MASK)
0243 #define CDNS_PCIE_MSG_NO_DATA BIT(16)
0244
0245 struct cdns_pcie;
0246
0247 enum cdns_pcie_msg_code {
0248 MSG_CODE_ASSERT_INTA = 0x20,
0249 MSG_CODE_ASSERT_INTB = 0x21,
0250 MSG_CODE_ASSERT_INTC = 0x22,
0251 MSG_CODE_ASSERT_INTD = 0x23,
0252 MSG_CODE_DEASSERT_INTA = 0x24,
0253 MSG_CODE_DEASSERT_INTB = 0x25,
0254 MSG_CODE_DEASSERT_INTC = 0x26,
0255 MSG_CODE_DEASSERT_INTD = 0x27,
0256 };
0257
0258 enum cdns_pcie_msg_routing {
0259
0260 MSG_ROUTING_TO_RC,
0261
0262
0263 MSG_ROUTING_BY_ADDR,
0264
0265
0266 MSG_ROUTING_BY_ID,
0267
0268
0269 MSG_ROUTING_BCAST,
0270
0271
0272 MSG_ROUTING_LOCAL,
0273
0274
0275 MSG_ROUTING_GATHER,
0276 };
0277
0278 struct cdns_pcie_ops {
0279 int (*start_link)(struct cdns_pcie *pcie);
0280 void (*stop_link)(struct cdns_pcie *pcie);
0281 bool (*link_up)(struct cdns_pcie *pcie);
0282 u64 (*cpu_addr_fixup)(struct cdns_pcie *pcie, u64 cpu_addr);
0283 };
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297 struct cdns_pcie {
0298 void __iomem *reg_base;
0299 struct resource *mem_res;
0300 struct device *dev;
0301 bool is_rc;
0302 int phy_count;
0303 struct phy **phy;
0304 struct device_link **link;
0305 const struct cdns_pcie_ops *ops;
0306 };
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323 struct cdns_pcie_rc {
0324 struct cdns_pcie pcie;
0325 struct resource *cfg_res;
0326 void __iomem *cfg_base;
0327 u32 vendor_id;
0328 u32 device_id;
0329 bool avail_ib_bar[CDNS_PCIE_RP_MAX_IB];
0330 unsigned int quirk_retrain_flag:1;
0331 unsigned int quirk_detect_quiet_flag:1;
0332 };
0333
0334
0335
0336
0337
0338
0339 struct cdns_pcie_epf {
0340 struct cdns_pcie_epf *epf;
0341 struct pci_epf_bar *epf_bar[PCI_STD_NUM_BARS];
0342 };
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367 struct cdns_pcie_ep {
0368 struct cdns_pcie pcie;
0369 u32 max_regions;
0370 unsigned long ob_region_map;
0371 phys_addr_t *ob_addr;
0372 phys_addr_t irq_phys_addr;
0373 void __iomem *irq_cpu_addr;
0374 u64 irq_pci_addr;
0375 u8 irq_pci_fn;
0376 u8 irq_pending;
0377
0378 spinlock_t lock;
0379 struct cdns_pcie_epf *epf;
0380 unsigned int quirk_detect_quiet_flag:1;
0381 unsigned int quirk_disable_flr:1;
0382 };
0383
0384
0385
0386 static inline void cdns_pcie_writel(struct cdns_pcie *pcie, u32 reg, u32 value)
0387 {
0388 writel(value, pcie->reg_base + reg);
0389 }
0390
0391 static inline u32 cdns_pcie_readl(struct cdns_pcie *pcie, u32 reg)
0392 {
0393 return readl(pcie->reg_base + reg);
0394 }
0395
0396 static inline u32 cdns_pcie_read_sz(void __iomem *addr, int size)
0397 {
0398 void __iomem *aligned_addr = PTR_ALIGN_DOWN(addr, 0x4);
0399 unsigned int offset = (unsigned long)addr & 0x3;
0400 u32 val = readl(aligned_addr);
0401
0402 if (!IS_ALIGNED((uintptr_t)addr, size)) {
0403 pr_warn("Address %p and size %d are not aligned\n", addr, size);
0404 return 0;
0405 }
0406
0407 if (size > 2)
0408 return val;
0409
0410 return (val >> (8 * offset)) & ((1 << (size * 8)) - 1);
0411 }
0412
0413 static inline void cdns_pcie_write_sz(void __iomem *addr, int size, u32 value)
0414 {
0415 void __iomem *aligned_addr = PTR_ALIGN_DOWN(addr, 0x4);
0416 unsigned int offset = (unsigned long)addr & 0x3;
0417 u32 mask;
0418 u32 val;
0419
0420 if (!IS_ALIGNED((uintptr_t)addr, size)) {
0421 pr_warn("Address %p and size %d are not aligned\n", addr, size);
0422 return;
0423 }
0424
0425 if (size > 2) {
0426 writel(value, addr);
0427 return;
0428 }
0429
0430 mask = ~(((1 << (size * 8)) - 1) << (offset * 8));
0431 val = readl(aligned_addr) & mask;
0432 val |= value << (offset * 8);
0433 writel(val, aligned_addr);
0434 }
0435
0436
0437 static inline void cdns_pcie_rp_writeb(struct cdns_pcie *pcie,
0438 u32 reg, u8 value)
0439 {
0440 void __iomem *addr = pcie->reg_base + CDNS_PCIE_RP_BASE + reg;
0441
0442 cdns_pcie_write_sz(addr, 0x1, value);
0443 }
0444
0445 static inline void cdns_pcie_rp_writew(struct cdns_pcie *pcie,
0446 u32 reg, u16 value)
0447 {
0448 void __iomem *addr = pcie->reg_base + CDNS_PCIE_RP_BASE + reg;
0449
0450 cdns_pcie_write_sz(addr, 0x2, value);
0451 }
0452
0453 static inline u16 cdns_pcie_rp_readw(struct cdns_pcie *pcie, u32 reg)
0454 {
0455 void __iomem *addr = pcie->reg_base + CDNS_PCIE_RP_BASE + reg;
0456
0457 return cdns_pcie_read_sz(addr, 0x2);
0458 }
0459
0460
0461 static inline void cdns_pcie_ep_fn_writeb(struct cdns_pcie *pcie, u8 fn,
0462 u32 reg, u8 value)
0463 {
0464 void __iomem *addr = pcie->reg_base + CDNS_PCIE_EP_FUNC_BASE(fn) + reg;
0465
0466 cdns_pcie_write_sz(addr, 0x1, value);
0467 }
0468
0469 static inline void cdns_pcie_ep_fn_writew(struct cdns_pcie *pcie, u8 fn,
0470 u32 reg, u16 value)
0471 {
0472 void __iomem *addr = pcie->reg_base + CDNS_PCIE_EP_FUNC_BASE(fn) + reg;
0473
0474 cdns_pcie_write_sz(addr, 0x2, value);
0475 }
0476
0477 static inline void cdns_pcie_ep_fn_writel(struct cdns_pcie *pcie, u8 fn,
0478 u32 reg, u32 value)
0479 {
0480 writel(value, pcie->reg_base + CDNS_PCIE_EP_FUNC_BASE(fn) + reg);
0481 }
0482
0483 static inline u16 cdns_pcie_ep_fn_readw(struct cdns_pcie *pcie, u8 fn, u32 reg)
0484 {
0485 void __iomem *addr = pcie->reg_base + CDNS_PCIE_EP_FUNC_BASE(fn) + reg;
0486
0487 return cdns_pcie_read_sz(addr, 0x2);
0488 }
0489
0490 static inline u32 cdns_pcie_ep_fn_readl(struct cdns_pcie *pcie, u8 fn, u32 reg)
0491 {
0492 return readl(pcie->reg_base + CDNS_PCIE_EP_FUNC_BASE(fn) + reg);
0493 }
0494
0495 static inline int cdns_pcie_start_link(struct cdns_pcie *pcie)
0496 {
0497 if (pcie->ops->start_link)
0498 return pcie->ops->start_link(pcie);
0499
0500 return 0;
0501 }
0502
0503 static inline void cdns_pcie_stop_link(struct cdns_pcie *pcie)
0504 {
0505 if (pcie->ops->stop_link)
0506 pcie->ops->stop_link(pcie);
0507 }
0508
0509 static inline bool cdns_pcie_link_up(struct cdns_pcie *pcie)
0510 {
0511 if (pcie->ops->link_up)
0512 return pcie->ops->link_up(pcie);
0513
0514 return true;
0515 }
0516
0517 #ifdef CONFIG_PCIE_CADENCE_HOST
0518 int cdns_pcie_host_setup(struct cdns_pcie_rc *rc);
0519 void __iomem *cdns_pci_map_bus(struct pci_bus *bus, unsigned int devfn,
0520 int where);
0521 #else
0522 static inline int cdns_pcie_host_setup(struct cdns_pcie_rc *rc)
0523 {
0524 return 0;
0525 }
0526
0527 static inline void __iomem *cdns_pci_map_bus(struct pci_bus *bus, unsigned int devfn,
0528 int where)
0529 {
0530 return NULL;
0531 }
0532 #endif
0533
0534 #ifdef CONFIG_PCIE_CADENCE_EP
0535 int cdns_pcie_ep_setup(struct cdns_pcie_ep *ep);
0536 #else
0537 static inline int cdns_pcie_ep_setup(struct cdns_pcie_ep *ep)
0538 {
0539 return 0;
0540 }
0541 #endif
0542
0543 void cdns_pcie_detect_quiet_min_delay_set(struct cdns_pcie *pcie);
0544
0545 void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 busnr, u8 fn,
0546 u32 r, bool is_io,
0547 u64 cpu_addr, u64 pci_addr, size_t size);
0548
0549 void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie,
0550 u8 busnr, u8 fn,
0551 u32 r, u64 cpu_addr);
0552
0553 void cdns_pcie_reset_outbound_region(struct cdns_pcie *pcie, u32 r);
0554 void cdns_pcie_disable_phy(struct cdns_pcie *pcie);
0555 int cdns_pcie_enable_phy(struct cdns_pcie *pcie);
0556 int cdns_pcie_init_phy(struct device *dev, struct cdns_pcie *pcie);
0557 extern const struct dev_pm_ops cdns_pcie_pm_ops;
0558
0559 #endif