Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 // Copyright (c) 2017 Cadence
0003 // Cadence PCIe controller driver.
0004 // Author: Cyrille Pitchen <cyrille.pitchen@free-electrons.com>
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 /* Parameters for the waiting for link up routine */
0015 #define LINK_WAIT_MAX_RETRIES   10
0016 #define LINK_WAIT_USLEEP_MIN    90000
0017 #define LINK_WAIT_USLEEP_MAX    100000
0018 
0019 /*
0020  * Local Management Registers
0021  */
0022 #define CDNS_PCIE_LM_BASE   0x00100000
0023 
0024 /* Vendor ID Register */
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 /* Root Port Requestor ID Register */
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 /* Endpoint Bus and Device Number Register */
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 /* Endpoint Function f BAR b Configuration Registers */
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 /* Endpoint Function Configuration Register */
0072 #define CDNS_PCIE_LM_EP_FUNC_CFG    (CDNS_PCIE_LM_BASE + 0x02c0)
0073 
0074 /* Root Complex BAR Configuration Register */
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 /* BAR control values applicable to both Endpoint Function and Root Complex */
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 /* PTM Control Register */
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  * Endpoint Function Registers (PCI configuration space for endpoint functions)
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  * Root Port Registers (PCI configuration space for the root port function)
0135  */
0136 #define CDNS_PCIE_RP_BASE   0x00200000
0137 #define CDNS_PCIE_RP_CAP_OFFSET 0xc0
0138 
0139 /*
0140  * Address Translation Registers
0141  */
0142 #define CDNS_PCIE_AT_BASE   0x00400000
0143 
0144 /* Region r Outbound AXI to PCIe Address Translation Register 0 */
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 /* Region r Outbound AXI to PCIe Address Translation Register 1 */
0158 #define CDNS_PCIE_AT_OB_REGION_PCI_ADDR1(r) \
0159     (CDNS_PCIE_AT_BASE + 0x0004 + ((r) & 0x1f) * 0x0020)
0160 
0161 /* Region r Outbound PCIe Descriptor Register 0 */
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 /* Bit 23 MUST be set in RC mode. */
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 /* Region r Outbound PCIe Descriptor Register 1 */
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 /* Region r AXI Region Base Address Register 0 */
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 /* Region r AXI Region Base Address Register 1 */
0192 #define CDNS_PCIE_AT_OB_REGION_CPU_ADDR1(r) \
0193     (CDNS_PCIE_AT_BASE + 0x001c + ((r) & 0x1f) * 0x0020)
0194 
0195 /* Root Port BAR Inbound PCIe to AXI Address Translation Register */
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 /* AXI link down register */
0205 #define CDNS_PCIE_AT_LINKDOWN (CDNS_PCIE_AT_BASE + 0x0824)
0206 
0207 /* LTSSM Capabilities register */
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 /* Endpoint Function BAR Inbound PCIe to AXI Address Translation Register */
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 /* Normal/Vendor specific message access: offset inside some outbound region */
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     /* Route to Root Complex */
0260     MSG_ROUTING_TO_RC,
0261 
0262     /* Use Address Routing */
0263     MSG_ROUTING_BY_ADDR,
0264 
0265     /* Use ID Routing */
0266     MSG_ROUTING_BY_ID,
0267 
0268     /* Route as Broadcast Message from Root Complex */
0269     MSG_ROUTING_BCAST,
0270 
0271     /* Local message; terminate at receiver (INTx messages) */
0272     MSG_ROUTING_LOCAL,
0273 
0274     /* Gather & route to Root Complex (PME_TO_Ack message) */
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  * struct cdns_pcie - private data for Cadence PCIe controller drivers
0287  * @reg_base: IO mapped register base
0288  * @mem_res: start/end offsets in the physical system memory to map PCI accesses
0289  * @dev: PCIe controller
0290  * @is_rc: tell whether the PCIe controller mode is Root Complex or Endpoint.
0291  * @phy_count: number of supported PHY devices
0292  * @phy: list of pointers to specific PHY control blocks
0293  * @link: list of pointers to corresponding device link representations
0294  * @ops: Platform-specific ops to control various inputs from Cadence PCIe
0295  *       wrapper
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  * struct cdns_pcie_rc - private data for this PCIe Root Complex driver
0310  * @pcie: Cadence PCIe controller
0311  * @dev: pointer to PCIe device
0312  * @cfg_res: start/end offsets in the physical system memory to map PCI
0313  *           configuration space accesses
0314  * @cfg_base: IO mapped window to access the PCI configuration space of a
0315  *            single function at a time
0316  * @vendor_id: PCI vendor ID
0317  * @device_id: PCI device ID
0318  * @avail_ib_bar: Status of RP_BAR0, RP_BAR1 and RP_NO_BAR if it's free or
0319  *                available
0320  * @quirk_retrain_flag: Retrain link as quirk for PCIe Gen2
0321  * @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk
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  * struct cdns_pcie_epf - Structure to hold info about endpoint function
0336  * @epf: Info about virtual functions attached to the physical function
0337  * @epf_bar: reference to the pci_epf_bar for the six Base Address Registers
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  * struct cdns_pcie_ep - private data for this PCIe endpoint controller driver
0346  * @pcie: Cadence PCIe controller
0347  * @max_regions: maximum number of regions supported by hardware
0348  * @ob_region_map: bitmask of mapped outbound regions
0349  * @ob_addr: base addresses in the AXI bus where the outbound regions start
0350  * @irq_phys_addr: base address on the AXI bus where the MSI/legacy IRQ
0351  *         dedicated outbound regions is mapped.
0352  * @irq_cpu_addr: base address in the CPU space where a write access triggers
0353  *        the sending of a memory write (MSI) / normal message (legacy
0354  *        IRQ) TLP through the PCIe bus.
0355  * @irq_pci_addr: used to save the current mapping of the MSI/legacy IRQ
0356  *        dedicated outbound region.
0357  * @irq_pci_fn: the latest PCI function that has updated the mapping of
0358  *      the MSI/legacy IRQ dedicated outbound region.
0359  * @irq_pending: bitmask of asserted legacy IRQs.
0360  * @lock: spin lock to disable interrupts while modifying PCIe controller
0361  *        registers fields (RMW) accessible by both remote RC and EP to
0362  *        minimize time between read and write
0363  * @epf: Structure to hold info about endpoint function
0364  * @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk
0365  * @quirk_disable_flr: Disable FLR (Function Level Reset) quirk flag
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     /* protect writing to PCI_STATUS while raising legacy interrupts */
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 /* Register access */
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 /* Root Port register access */
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 /* Endpoint Function register access */
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 /* _PCIE_CADENCE_H */