| .. | .. |
|---|
| 3 | 3 | * Synopsys DesignWare PCIe host controller driver |
|---|
| 4 | 4 | * |
|---|
| 5 | 5 | * Copyright (C) 2013 Samsung Electronics Co., Ltd. |
|---|
| 6 | | - * http://www.samsung.com |
|---|
| 6 | + * https://www.samsung.com |
|---|
| 7 | 7 | * |
|---|
| 8 | 8 | * Author: Jingoo Han <jg1.han@samsung.com> |
|---|
| 9 | 9 | */ |
|---|
| .. | .. |
|---|
| 30 | 30 | #define LINK_WAIT_IATU 9 |
|---|
| 31 | 31 | |
|---|
| 32 | 32 | /* Synopsys-specific PCIe configuration registers */ |
|---|
| 33 | | -#define PCIE_PORT_LINK_CONTROL 0x710 |
|---|
| 34 | | -#define PORT_LINK_MODE_MASK (0x3f << 16) |
|---|
| 35 | | -#define PORT_LINK_MODE_1_LANES (0x1 << 16) |
|---|
| 36 | | -#define PORT_LINK_MODE_2_LANES (0x3 << 16) |
|---|
| 37 | | -#define PORT_LINK_MODE_4_LANES (0x7 << 16) |
|---|
| 38 | | -#define PORT_LINK_MODE_8_LANES (0xf << 16) |
|---|
| 39 | | -#define PORT_LINK_LPBK_ENABLE (0x1 << 2) |
|---|
| 33 | +#define PCIE_PORT_AFR 0x70C |
|---|
| 34 | +#define PORT_AFR_N_FTS_MASK GENMASK(15, 8) |
|---|
| 35 | +#define PORT_AFR_N_FTS(n) FIELD_PREP(PORT_AFR_N_FTS_MASK, n) |
|---|
| 36 | +#define PORT_AFR_CC_N_FTS_MASK GENMASK(23, 16) |
|---|
| 37 | +#define PORT_AFR_CC_N_FTS(n) FIELD_PREP(PORT_AFR_CC_N_FTS_MASK, n) |
|---|
| 38 | +#define PORT_AFR_ENTER_ASPM BIT(30) |
|---|
| 39 | +#define PORT_AFR_L0S_ENTRANCE_LAT_SHIFT 24 |
|---|
| 40 | +#define PORT_AFR_L0S_ENTRANCE_LAT_MASK GENMASK(26, 24) |
|---|
| 41 | +#define PORT_AFR_L1_ENTRANCE_LAT_SHIFT 27 |
|---|
| 42 | +#define PORT_AFR_L1_ENTRANCE_LAT_MASK GENMASK(29, 27) |
|---|
| 40 | 43 | |
|---|
| 41 | | -#define PCIE_TIMER_CTRL_MAX_FUNC_NUM 0x718 |
|---|
| 42 | | -#define FAST_LINK_SCALING_FACTOR 0x9fffffff |
|---|
| 44 | +#define PCIE_PORT_LINK_CONTROL 0x710 |
|---|
| 45 | +#define PORT_LINK_LPBK_ENABLE BIT(2) |
|---|
| 46 | +#define PORT_LINK_DLL_LINK_EN BIT(5) |
|---|
| 47 | +#define PORT_LINK_FAST_LINK_MODE BIT(7) |
|---|
| 48 | +#define PORT_LINK_MODE_MASK GENMASK(21, 16) |
|---|
| 49 | +#define PORT_LINK_MODE(n) FIELD_PREP(PORT_LINK_MODE_MASK, n) |
|---|
| 50 | +#define PORT_LINK_MODE_1_LANES PORT_LINK_MODE(0x1) |
|---|
| 51 | +#define PORT_LINK_MODE_2_LANES PORT_LINK_MODE(0x3) |
|---|
| 52 | +#define PORT_LINK_MODE_4_LANES PORT_LINK_MODE(0x7) |
|---|
| 53 | +#define PORT_LINK_MODE_8_LANES PORT_LINK_MODE(0xf) |
|---|
| 54 | + |
|---|
| 55 | +#define PCIE_PORT_DEBUG0 0x728 |
|---|
| 56 | +#define PORT_LOGIC_LTSSM_STATE_MASK 0x1f |
|---|
| 57 | +#define PORT_LOGIC_LTSSM_STATE_L0 0x11 |
|---|
| 58 | +#define PCIE_PORT_DEBUG1 0x72C |
|---|
| 59 | +#define PCIE_PORT_DEBUG1_LINK_UP BIT(4) |
|---|
| 60 | +#define PCIE_PORT_DEBUG1_LINK_IN_TRAINING BIT(29) |
|---|
| 43 | 61 | |
|---|
| 44 | 62 | #define PCIE_LINK_WIDTH_SPEED_CONTROL 0x80C |
|---|
| 45 | | -#define PORT_LOGIC_SPEED_CHANGE (0x1 << 17) |
|---|
| 46 | | -#define PORT_LOGIC_LINK_WIDTH_MASK (0x1f << 8) |
|---|
| 47 | | -#define PORT_LOGIC_LINK_WIDTH_1_LANES (0x1 << 8) |
|---|
| 48 | | -#define PORT_LOGIC_LINK_WIDTH_2_LANES (0x2 << 8) |
|---|
| 49 | | -#define PORT_LOGIC_LINK_WIDTH_4_LANES (0x4 << 8) |
|---|
| 50 | | -#define PORT_LOGIC_LINK_WIDTH_8_LANES (0x8 << 8) |
|---|
| 63 | +#define PORT_LOGIC_N_FTS_MASK GENMASK(7, 0) |
|---|
| 64 | +#define PORT_LOGIC_SPEED_CHANGE BIT(17) |
|---|
| 65 | +#define PORT_LOGIC_LINK_WIDTH_MASK GENMASK(12, 8) |
|---|
| 66 | +#define PORT_LOGIC_LINK_WIDTH(n) FIELD_PREP(PORT_LOGIC_LINK_WIDTH_MASK, n) |
|---|
| 67 | +#define PORT_LOGIC_LINK_WIDTH_1_LANES PORT_LOGIC_LINK_WIDTH(0x1) |
|---|
| 68 | +#define PORT_LOGIC_LINK_WIDTH_2_LANES PORT_LOGIC_LINK_WIDTH(0x2) |
|---|
| 69 | +#define PORT_LOGIC_LINK_WIDTH_4_LANES PORT_LOGIC_LINK_WIDTH(0x4) |
|---|
| 70 | +#define PORT_LOGIC_LINK_WIDTH_8_LANES PORT_LOGIC_LINK_WIDTH(0x8) |
|---|
| 51 | 71 | |
|---|
| 52 | 72 | #define PCIE_MSI_ADDR_LO 0x820 |
|---|
| 53 | 73 | #define PCIE_MSI_ADDR_HI 0x824 |
|---|
| .. | .. |
|---|
| 55 | 75 | #define PCIE_MSI_INTR0_MASK 0x82C |
|---|
| 56 | 76 | #define PCIE_MSI_INTR0_STATUS 0x830 |
|---|
| 57 | 77 | |
|---|
| 78 | +#define PCIE_PORT_MULTI_LANE_CTRL 0x8C0 |
|---|
| 79 | +#define PORT_MLTI_UPCFG_SUPPORT BIT(7) |
|---|
| 80 | + |
|---|
| 58 | 81 | #define PCIE_ATU_VIEWPORT 0x900 |
|---|
| 59 | 82 | #define PCIE_ATU_REGION_INBOUND BIT(31) |
|---|
| 60 | 83 | #define PCIE_ATU_REGION_OUTBOUND 0 |
|---|
| 61 | 84 | #define PCIE_ATU_CR1 0x904 |
|---|
| 62 | | -#define PCIE_ATU_TYPE_MEM (0x0 << 0) |
|---|
| 63 | | -#define PCIE_ATU_TYPE_IO (0x2 << 0) |
|---|
| 64 | | -#define PCIE_ATU_TYPE_CFG0 (0x4 << 0) |
|---|
| 65 | | -#define PCIE_ATU_TYPE_CFG1 (0x5 << 0) |
|---|
| 85 | +#define PCIE_ATU_TYPE_MEM 0x0 |
|---|
| 86 | +#define PCIE_ATU_TYPE_IO 0x2 |
|---|
| 87 | +#define PCIE_ATU_TYPE_CFG0 0x4 |
|---|
| 88 | +#define PCIE_ATU_TYPE_CFG1 0x5 |
|---|
| 89 | +#define PCIE_ATU_FUNC_NUM(pf) ((pf) << 20) |
|---|
| 66 | 90 | #define PCIE_ATU_CR2 0x908 |
|---|
| 67 | | -#define PCIE_ATU_ENABLE (0x1 << 31) |
|---|
| 68 | | -#define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30) |
|---|
| 91 | +#define PCIE_ATU_ENABLE BIT(31) |
|---|
| 92 | +#define PCIE_ATU_BAR_MODE_ENABLE BIT(30) |
|---|
| 93 | +#define PCIE_ATU_FUNC_NUM_MATCH_EN BIT(19) |
|---|
| 69 | 94 | #define PCIE_ATU_LOWER_BASE 0x90C |
|---|
| 70 | 95 | #define PCIE_ATU_UPPER_BASE 0x910 |
|---|
| 71 | 96 | #define PCIE_ATU_LIMIT 0x914 |
|---|
| 72 | 97 | #define PCIE_ATU_LOWER_TARGET 0x918 |
|---|
| 73 | | -#define PCIE_ATU_BUS(x) (((x) & 0xff) << 24) |
|---|
| 74 | | -#define PCIE_ATU_DEV(x) (((x) & 0x1f) << 19) |
|---|
| 75 | | -#define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) |
|---|
| 98 | +#define PCIE_ATU_BUS(x) FIELD_PREP(GENMASK(31, 24), x) |
|---|
| 99 | +#define PCIE_ATU_DEV(x) FIELD_PREP(GENMASK(23, 19), x) |
|---|
| 100 | +#define PCIE_ATU_FUNC(x) FIELD_PREP(GENMASK(18, 16), x) |
|---|
| 76 | 101 | #define PCIE_ATU_UPPER_TARGET 0x91C |
|---|
| 77 | 102 | |
|---|
| 78 | 103 | #define PCIE_MISC_CONTROL_1_OFF 0x8BC |
|---|
| 79 | | -#define PCIE_DBI_RO_WR_EN (0x1 << 0) |
|---|
| 104 | +#define PCIE_DBI_RO_WR_EN BIT(0) |
|---|
| 105 | + |
|---|
| 106 | +#define PCIE_MSIX_DOORBELL 0x948 |
|---|
| 107 | +#define PCIE_MSIX_DOORBELL_PF_SHIFT 24 |
|---|
| 108 | + |
|---|
| 109 | +#define PCIE_PL_CHK_REG_CONTROL_STATUS 0xB20 |
|---|
| 110 | +#define PCIE_PL_CHK_REG_CHK_REG_START BIT(0) |
|---|
| 111 | +#define PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS BIT(1) |
|---|
| 112 | +#define PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR BIT(16) |
|---|
| 113 | +#define PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR BIT(17) |
|---|
| 114 | +#define PCIE_PL_CHK_REG_CHK_REG_COMPLETE BIT(18) |
|---|
| 115 | + |
|---|
| 116 | +#define PCIE_PL_CHK_REG_ERR_ADDR 0xB28 |
|---|
| 80 | 117 | |
|---|
| 81 | 118 | /* |
|---|
| 82 | 119 | * iATU Unroll-specific register definitions |
|---|
| .. | .. |
|---|
| 86 | 123 | #define PCIE_ATU_UNR_REGION_CTRL2 0x04 |
|---|
| 87 | 124 | #define PCIE_ATU_UNR_LOWER_BASE 0x08 |
|---|
| 88 | 125 | #define PCIE_ATU_UNR_UPPER_BASE 0x0C |
|---|
| 89 | | -#define PCIE_ATU_UNR_LIMIT 0x10 |
|---|
| 126 | +#define PCIE_ATU_UNR_LOWER_LIMIT 0x10 |
|---|
| 90 | 127 | #define PCIE_ATU_UNR_LOWER_TARGET 0x14 |
|---|
| 91 | 128 | #define PCIE_ATU_UNR_UPPER_TARGET 0x18 |
|---|
| 129 | +#define PCIE_ATU_UNR_UPPER_LIMIT 0x20 |
|---|
| 130 | + |
|---|
| 131 | +/* |
|---|
| 132 | + * The default address offset between dbi_base and atu_base. Root controller |
|---|
| 133 | + * drivers are not required to initialize atu_base if the offset matches this |
|---|
| 134 | + * default; the driver core automatically derives atu_base from dbi_base using |
|---|
| 135 | + * this offset, if atu_base not set. |
|---|
| 136 | + */ |
|---|
| 137 | +#define DEFAULT_DBI_ATU_OFFSET (0x3 << 20) |
|---|
| 92 | 138 | |
|---|
| 93 | 139 | /* Register address builder */ |
|---|
| 94 | | -#define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ |
|---|
| 95 | | - ((0x3 << 20) | ((region) << 9)) |
|---|
| 140 | +#define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ |
|---|
| 141 | + ((region) << 9) |
|---|
| 96 | 142 | |
|---|
| 97 | | -#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ |
|---|
| 98 | | - ((0x3 << 20) | ((region) << 9) | (0x1 << 8)) |
|---|
| 143 | +#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ |
|---|
| 144 | + (((region) << 9) | BIT(8)) |
|---|
| 99 | 145 | |
|---|
| 100 | 146 | #define MAX_MSI_IRQS 256 |
|---|
| 101 | 147 | #define MAX_MSI_IRQS_PER_CTRL 32 |
|---|
| .. | .. |
|---|
| 125 | 171 | }; |
|---|
| 126 | 172 | |
|---|
| 127 | 173 | struct dw_pcie_host_ops { |
|---|
| 128 | | - int (*rd_own_conf)(struct pcie_port *pp, int where, int size, u32 *val); |
|---|
| 129 | | - int (*wr_own_conf)(struct pcie_port *pp, int where, int size, u32 val); |
|---|
| 130 | | - int (*rd_other_conf)(struct pcie_port *pp, struct pci_bus *bus, |
|---|
| 131 | | - unsigned int devfn, int where, int size, u32 *val); |
|---|
| 132 | | - int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus, |
|---|
| 133 | | - unsigned int devfn, int where, int size, u32 val); |
|---|
| 134 | 174 | int (*host_init)(struct pcie_port *pp); |
|---|
| 135 | | - void (*msi_set_irq)(struct pcie_port *pp, int irq); |
|---|
| 136 | | - void (*msi_clear_irq)(struct pcie_port *pp, int irq); |
|---|
| 137 | | - phys_addr_t (*get_msi_addr)(struct pcie_port *pp); |
|---|
| 138 | | - u32 (*get_msi_data)(struct pcie_port *pp, int pos); |
|---|
| 139 | | - void (*scan_bus)(struct pcie_port *pp); |
|---|
| 140 | 175 | void (*set_num_vectors)(struct pcie_port *pp); |
|---|
| 141 | 176 | int (*msi_host_init)(struct pcie_port *pp); |
|---|
| 142 | | - void (*msi_irq_ack)(int irq, struct pcie_port *pp); |
|---|
| 143 | 177 | }; |
|---|
| 144 | 178 | |
|---|
| 145 | 179 | struct pcie_port { |
|---|
| 146 | | - u8 root_bus_nr; |
|---|
| 147 | 180 | u64 cfg0_base; |
|---|
| 148 | 181 | void __iomem *va_cfg0_base; |
|---|
| 149 | 182 | u32 cfg0_size; |
|---|
| 150 | | - u64 cfg1_base; |
|---|
| 151 | | - void __iomem *va_cfg1_base; |
|---|
| 152 | | - u32 cfg1_size; |
|---|
| 153 | 183 | resource_size_t io_base; |
|---|
| 154 | 184 | phys_addr_t io_bus_addr; |
|---|
| 155 | 185 | u32 io_size; |
|---|
| 156 | | - u64 mem_base; |
|---|
| 157 | | - phys_addr_t mem_bus_addr; |
|---|
| 158 | | - u32 mem_size; |
|---|
| 159 | | - struct resource *cfg; |
|---|
| 160 | | - struct resource *io; |
|---|
| 161 | | - struct resource *mem; |
|---|
| 162 | | - struct resource *busn; |
|---|
| 163 | 186 | int irq; |
|---|
| 164 | 187 | const struct dw_pcie_host_ops *ops; |
|---|
| 165 | 188 | int msi_irq; |
|---|
| 166 | 189 | struct irq_domain *irq_domain; |
|---|
| 167 | 190 | struct irq_domain *msi_domain; |
|---|
| 191 | + u16 msi_msg; |
|---|
| 168 | 192 | dma_addr_t msi_data; |
|---|
| 169 | | - struct page *msi_page; |
|---|
| 193 | + struct irq_chip *msi_irq_chip; |
|---|
| 170 | 194 | u32 num_vectors; |
|---|
| 171 | | - u32 irq_status[MAX_MSI_CTRLS]; |
|---|
| 195 | + u32 irq_mask[MAX_MSI_CTRLS]; |
|---|
| 196 | + struct pci_host_bridge *bridge; |
|---|
| 172 | 197 | raw_spinlock_t lock; |
|---|
| 173 | | - int msi_ext; |
|---|
| 174 | | - struct pci_host_bridge *bridge; |
|---|
| 175 | 198 | DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); |
|---|
| 176 | 199 | }; |
|---|
| 177 | 200 | |
|---|
| .. | .. |
|---|
| 185 | 208 | void (*ep_init)(struct dw_pcie_ep *ep); |
|---|
| 186 | 209 | int (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no, |
|---|
| 187 | 210 | enum pci_epc_irq_type type, u16 interrupt_num); |
|---|
| 211 | + const struct pci_epc_features* (*get_features)(struct dw_pcie_ep *ep); |
|---|
| 212 | + /* |
|---|
| 213 | + * Provide a method to implement the different func config space |
|---|
| 214 | + * access for different platform, if different func have different |
|---|
| 215 | + * offset, return the offset of func. if use write a register way |
|---|
| 216 | + * return a 0, and implement code in callback function of platform |
|---|
| 217 | + * driver. |
|---|
| 218 | + */ |
|---|
| 219 | + unsigned int (*func_conf_select)(struct dw_pcie_ep *ep, u8 func_no); |
|---|
| 220 | +}; |
|---|
| 221 | + |
|---|
| 222 | +struct dw_pcie_ep_func { |
|---|
| 223 | + struct list_head list; |
|---|
| 224 | + u8 func_no; |
|---|
| 225 | + u8 msi_cap; /* MSI capability offset */ |
|---|
| 226 | + u8 msix_cap; /* MSI-X capability offset */ |
|---|
| 188 | 227 | }; |
|---|
| 189 | 228 | |
|---|
| 190 | 229 | struct dw_pcie_ep { |
|---|
| 191 | 230 | struct pci_epc *epc; |
|---|
| 192 | | - struct dw_pcie_ep_ops *ops; |
|---|
| 231 | + struct list_head func_list; |
|---|
| 232 | + const struct dw_pcie_ep_ops *ops; |
|---|
| 193 | 233 | phys_addr_t phys_base; |
|---|
| 194 | 234 | size_t addr_size; |
|---|
| 195 | 235 | size_t page_size; |
|---|
| 196 | | - u8 bar_to_atu[6]; |
|---|
| 236 | + u8 bar_to_atu[PCI_STD_NUM_BARS]; |
|---|
| 197 | 237 | phys_addr_t *outbound_addr; |
|---|
| 198 | 238 | unsigned long *ib_window_map; |
|---|
| 199 | 239 | unsigned long *ob_window_map; |
|---|
| .. | .. |
|---|
| 201 | 241 | u32 num_ob_windows; |
|---|
| 202 | 242 | void __iomem *msi_mem; |
|---|
| 203 | 243 | phys_addr_t msi_mem_phys; |
|---|
| 204 | | - u8 msi_cap; /* MSI capability offset */ |
|---|
| 205 | | - u8 msix_cap; /* MSI-X capability offset */ |
|---|
| 244 | + struct pci_epf_bar *epf_bar[PCI_STD_NUM_BARS]; |
|---|
| 206 | 245 | }; |
|---|
| 207 | 246 | |
|---|
| 208 | 247 | struct dw_pcie_ops { |
|---|
| .. | .. |
|---|
| 211 | 250 | size_t size); |
|---|
| 212 | 251 | void (*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg, |
|---|
| 213 | 252 | size_t size, u32 val); |
|---|
| 253 | + void (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg, |
|---|
| 254 | + size_t size, u32 val); |
|---|
| 214 | 255 | int (*link_up)(struct dw_pcie *pcie); |
|---|
| 215 | 256 | int (*start_link)(struct dw_pcie *pcie); |
|---|
| 216 | 257 | void (*stop_link)(struct dw_pcie *pcie); |
|---|
| 217 | 258 | }; |
|---|
| 218 | 259 | |
|---|
| 260 | +#define DWC_IATU_UNROLL_EN BIT(0) |
|---|
| 261 | +#define DWC_IATU_IOCFG_SHARED BIT(1) |
|---|
| 219 | 262 | struct dw_pcie { |
|---|
| 220 | 263 | struct device *dev; |
|---|
| 221 | 264 | void __iomem *dbi_base; |
|---|
| 222 | 265 | void __iomem *dbi_base2; |
|---|
| 266 | + /* Used when iatu_unroll_enabled is true */ |
|---|
| 267 | + void __iomem *atu_base; |
|---|
| 223 | 268 | u32 num_viewport; |
|---|
| 269 | + u8 iatu_unroll_enabled; |
|---|
| 224 | 270 | struct pcie_port pp; |
|---|
| 225 | 271 | struct dw_pcie_ep ep; |
|---|
| 226 | 272 | const struct dw_pcie_ops *ops; |
|---|
| 273 | + unsigned int version; |
|---|
| 274 | + int num_lanes; |
|---|
| 227 | 275 | int link_gen; |
|---|
| 228 | 276 | u8 n_fts[2]; |
|---|
| 229 | | - bool iatu_unroll_enabled: 1; |
|---|
| 230 | | - bool io_cfg_atu_shared: 1; |
|---|
| 231 | 277 | }; |
|---|
| 232 | 278 | |
|---|
| 233 | 279 | #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp) |
|---|
| .. | .. |
|---|
| 236 | 282 | container_of((endpoint), struct dw_pcie, ep) |
|---|
| 237 | 283 | |
|---|
| 238 | 284 | u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap); |
|---|
| 285 | +u16 dw_pcie_find_ext_capability(struct dw_pcie *pci, u8 cap); |
|---|
| 286 | + |
|---|
| 239 | 287 | int dw_pcie_read(void __iomem *addr, int size, u32 *val); |
|---|
| 240 | 288 | int dw_pcie_write(void __iomem *addr, int size, u32 val); |
|---|
| 241 | 289 | |
|---|
| 242 | | -u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, |
|---|
| 243 | | - size_t size); |
|---|
| 244 | | -void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, |
|---|
| 245 | | - size_t size, u32 val); |
|---|
| 290 | +u32 dw_pcie_read_dbi(struct dw_pcie *pci, u32 reg, size_t size); |
|---|
| 291 | +void dw_pcie_write_dbi(struct dw_pcie *pci, u32 reg, size_t size, u32 val); |
|---|
| 292 | +void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val); |
|---|
| 246 | 293 | int dw_pcie_link_up(struct dw_pcie *pci); |
|---|
| 294 | +void dw_pcie_upconfig_setup(struct dw_pcie *pci); |
|---|
| 247 | 295 | int dw_pcie_wait_for_link(struct dw_pcie *pci); |
|---|
| 248 | 296 | void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, |
|---|
| 249 | 297 | int type, u64 cpu_addr, u64 pci_addr, |
|---|
| 250 | 298 | u32 size); |
|---|
| 251 | | -int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int bar, |
|---|
| 252 | | - u64 cpu_addr, enum dw_pcie_as_type as_type); |
|---|
| 299 | +void dw_pcie_prog_ep_outbound_atu(struct dw_pcie *pci, u8 func_no, int index, |
|---|
| 300 | + int type, u64 cpu_addr, u64 pci_addr, |
|---|
| 301 | + u32 size); |
|---|
| 302 | +int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, u8 func_no, int index, |
|---|
| 303 | + int bar, u64 cpu_addr, |
|---|
| 304 | + enum dw_pcie_as_type as_type); |
|---|
| 253 | 305 | void dw_pcie_disable_atu(struct dw_pcie *pci, int index, |
|---|
| 254 | 306 | enum dw_pcie_region_type type); |
|---|
| 255 | 307 | void dw_pcie_setup(struct dw_pcie *pci); |
|---|
| 256 | 308 | |
|---|
| 257 | 309 | static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) |
|---|
| 258 | 310 | { |
|---|
| 259 | | - __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x4, val); |
|---|
| 311 | + dw_pcie_write_dbi(pci, reg, 0x4, val); |
|---|
| 260 | 312 | } |
|---|
| 261 | 313 | |
|---|
| 262 | 314 | static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg) |
|---|
| 263 | 315 | { |
|---|
| 264 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x4); |
|---|
| 316 | + return dw_pcie_read_dbi(pci, reg, 0x4); |
|---|
| 265 | 317 | } |
|---|
| 266 | 318 | |
|---|
| 267 | 319 | static inline void dw_pcie_writew_dbi(struct dw_pcie *pci, u32 reg, u16 val) |
|---|
| 268 | 320 | { |
|---|
| 269 | | - __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x2, val); |
|---|
| 321 | + dw_pcie_write_dbi(pci, reg, 0x2, val); |
|---|
| 270 | 322 | } |
|---|
| 271 | 323 | |
|---|
| 272 | 324 | static inline u16 dw_pcie_readw_dbi(struct dw_pcie *pci, u32 reg) |
|---|
| 273 | 325 | { |
|---|
| 274 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x2); |
|---|
| 326 | + return dw_pcie_read_dbi(pci, reg, 0x2); |
|---|
| 275 | 327 | } |
|---|
| 276 | 328 | |
|---|
| 277 | 329 | static inline void dw_pcie_writeb_dbi(struct dw_pcie *pci, u32 reg, u8 val) |
|---|
| 278 | 330 | { |
|---|
| 279 | | - __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x1, val); |
|---|
| 331 | + dw_pcie_write_dbi(pci, reg, 0x1, val); |
|---|
| 280 | 332 | } |
|---|
| 281 | 333 | |
|---|
| 282 | 334 | static inline u8 dw_pcie_readb_dbi(struct dw_pcie *pci, u32 reg) |
|---|
| 283 | 335 | { |
|---|
| 284 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x1); |
|---|
| 336 | + return dw_pcie_read_dbi(pci, reg, 0x1); |
|---|
| 285 | 337 | } |
|---|
| 286 | 338 | |
|---|
| 287 | 339 | static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val) |
|---|
| 288 | 340 | { |
|---|
| 289 | | - __dw_pcie_write_dbi(pci, pci->dbi_base2, reg, 0x4, val); |
|---|
| 290 | | -} |
|---|
| 291 | | - |
|---|
| 292 | | -static inline u32 dw_pcie_readl_dbi2(struct dw_pcie *pci, u32 reg) |
|---|
| 293 | | -{ |
|---|
| 294 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base2, reg, 0x4); |
|---|
| 341 | + dw_pcie_write_dbi2(pci, reg, 0x4, val); |
|---|
| 295 | 342 | } |
|---|
| 296 | 343 | |
|---|
| 297 | 344 | static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci) |
|---|
| .. | .. |
|---|
| 322 | 369 | void dw_pcie_free_msi(struct pcie_port *pp); |
|---|
| 323 | 370 | void dw_pcie_setup_rc(struct pcie_port *pp); |
|---|
| 324 | 371 | int dw_pcie_host_init(struct pcie_port *pp); |
|---|
| 372 | +void dw_pcie_host_deinit(struct pcie_port *pp); |
|---|
| 325 | 373 | int dw_pcie_allocate_domains(struct pcie_port *pp); |
|---|
| 374 | +void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus, unsigned int devfn, |
|---|
| 375 | + int where); |
|---|
| 326 | 376 | #else |
|---|
| 327 | 377 | static inline irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) |
|---|
| 328 | 378 | { |
|---|
| .. | .. |
|---|
| 346 | 396 | return 0; |
|---|
| 347 | 397 | } |
|---|
| 348 | 398 | |
|---|
| 399 | +static inline void dw_pcie_host_deinit(struct pcie_port *pp) |
|---|
| 400 | +{ |
|---|
| 401 | +} |
|---|
| 402 | + |
|---|
| 349 | 403 | static inline int dw_pcie_allocate_domains(struct pcie_port *pp) |
|---|
| 350 | 404 | { |
|---|
| 351 | 405 | return 0; |
|---|
| 406 | +} |
|---|
| 407 | +static inline void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus, |
|---|
| 408 | + unsigned int devfn, |
|---|
| 409 | + int where) |
|---|
| 410 | +{ |
|---|
| 411 | + return NULL; |
|---|
| 352 | 412 | } |
|---|
| 353 | 413 | #endif |
|---|
| 354 | 414 | |
|---|
| 355 | 415 | #ifdef CONFIG_PCIE_DW_EP |
|---|
| 356 | 416 | void dw_pcie_ep_linkup(struct dw_pcie_ep *ep); |
|---|
| 357 | 417 | int dw_pcie_ep_init(struct dw_pcie_ep *ep); |
|---|
| 418 | +int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep); |
|---|
| 419 | +void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep); |
|---|
| 358 | 420 | void dw_pcie_ep_exit(struct dw_pcie_ep *ep); |
|---|
| 359 | 421 | int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no); |
|---|
| 360 | 422 | int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, |
|---|
| 361 | 423 | u8 interrupt_num); |
|---|
| 362 | 424 | int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no, |
|---|
| 363 | 425 | u16 interrupt_num); |
|---|
| 426 | +int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, u8 func_no, |
|---|
| 427 | + u16 interrupt_num); |
|---|
| 364 | 428 | void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar); |
|---|
| 429 | +struct dw_pcie_ep_func * |
|---|
| 430 | +dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no); |
|---|
| 365 | 431 | #else |
|---|
| 366 | 432 | static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep) |
|---|
| 367 | 433 | { |
|---|
| .. | .. |
|---|
| 370 | 436 | static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep) |
|---|
| 371 | 437 | { |
|---|
| 372 | 438 | return 0; |
|---|
| 439 | +} |
|---|
| 440 | + |
|---|
| 441 | +static inline int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep) |
|---|
| 442 | +{ |
|---|
| 443 | + return 0; |
|---|
| 444 | +} |
|---|
| 445 | + |
|---|
| 446 | +static inline void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep) |
|---|
| 447 | +{ |
|---|
| 373 | 448 | } |
|---|
| 374 | 449 | |
|---|
| 375 | 450 | static inline void dw_pcie_ep_exit(struct dw_pcie_ep *ep) |
|---|
| .. | .. |
|---|
| 393 | 468 | return 0; |
|---|
| 394 | 469 | } |
|---|
| 395 | 470 | |
|---|
| 471 | +static inline int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, |
|---|
| 472 | + u8 func_no, |
|---|
| 473 | + u16 interrupt_num) |
|---|
| 474 | +{ |
|---|
| 475 | + return 0; |
|---|
| 476 | +} |
|---|
| 477 | + |
|---|
| 396 | 478 | static inline void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar) |
|---|
| 397 | 479 | { |
|---|
| 398 | 480 | } |
|---|
| 481 | + |
|---|
| 482 | +static inline struct dw_pcie_ep_func * |
|---|
| 483 | +dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no) |
|---|
| 484 | +{ |
|---|
| 485 | + return NULL; |
|---|
| 486 | +} |
|---|
| 399 | 487 | #endif |
|---|
| 400 | 488 | #endif /* _PCIE_DESIGNWARE_H */ |
|---|