1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Synopsys DesignWare PCIe host controller driver 4 * 5 * Copyright (C) 2013 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com 7 * 8 * Author: Jingoo Han <jg1.han@samsung.com> 9 */ 10 11 #ifndef _PCIE_DESIGNWARE_H 12 #define _PCIE_DESIGNWARE_H 13 14 #include <linux/dma-mapping.h> 15 #include <linux/irq.h> 16 #include <linux/msi.h> 17 #include <linux/pci.h> 18 19 #include <linux/pci-epc.h> 20 #include <linux/pci-epf.h> 21 22 /* Parameters for the waiting for link up routine */ 23 #define LINK_WAIT_MAX_RETRIES 10 24 #define LINK_WAIT_USLEEP_MIN 90000 25 #define LINK_WAIT_USLEEP_MAX 100000 26 27 /* Parameters for the waiting for iATU enabled routine */ 28 #define LINK_WAIT_MAX_IATU_RETRIES 5 29 #define LINK_WAIT_IATU_MIN 9000 30 #define LINK_WAIT_IATU_MAX 10000 31 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 40 #define PCIE_LINK_WIDTH_SPEED_CONTROL 0x80C 41 #define PORT_LOGIC_SPEED_CHANGE (0x1 << 17) 42 #define PORT_LOGIC_LINK_WIDTH_MASK (0x1f << 8) 43 #define PORT_LOGIC_LINK_WIDTH_1_LANES (0x1 << 8) 44 #define PORT_LOGIC_LINK_WIDTH_2_LANES (0x2 << 8) 45 #define PORT_LOGIC_LINK_WIDTH_4_LANES (0x4 << 8) 46 #define PORT_LOGIC_LINK_WIDTH_8_LANES (0x8 << 8) 47 48 #define PCIE_MSI_ADDR_LO 0x820 49 #define PCIE_MSI_ADDR_HI 0x824 50 #define PCIE_MSI_INTR0_ENABLE 0x828 51 #define PCIE_MSI_INTR0_MASK 0x82C 52 #define PCIE_MSI_INTR0_STATUS 0x830 53 54 #define PCIE_ATU_VIEWPORT 0x900 55 #define PCIE_ATU_REGION_INBOUND (0x1 << 31) 56 #define PCIE_ATU_REGION_OUTBOUND (0x0 << 31) 57 #define PCIE_ATU_REGION_INDEX2 (0x2 << 0) 58 #define PCIE_ATU_REGION_INDEX1 (0x1 << 0) 59 #define PCIE_ATU_REGION_INDEX0 (0x0 << 0) 60 #define PCIE_ATU_CR1 0x904 61 #define PCIE_ATU_TYPE_MEM (0x0 << 0) 62 #define PCIE_ATU_TYPE_IO (0x2 << 0) 63 #define PCIE_ATU_TYPE_CFG0 (0x4 << 0) 64 #define PCIE_ATU_TYPE_CFG1 (0x5 << 0) 65 #define PCIE_ATU_CR2 0x908 66 #define PCIE_ATU_ENABLE (0x1 << 31) 67 #define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30) 68 #define PCIE_ATU_LOWER_BASE 0x90C 69 #define PCIE_ATU_UPPER_BASE 0x910 70 #define PCIE_ATU_LIMIT 0x914 71 #define PCIE_ATU_LOWER_TARGET 0x918 72 #define PCIE_ATU_BUS(x) (((x) & 0xff) << 24) 73 #define PCIE_ATU_DEV(x) (((x) & 0x1f) << 19) 74 #define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) 75 #define PCIE_ATU_UPPER_TARGET 0x91C 76 77 #define PCIE_MISC_CONTROL_1_OFF 0x8BC 78 #define PCIE_DBI_RO_WR_EN (0x1 << 0) 79 80 /* 81 * iATU Unroll-specific register definitions 82 * From 4.80 core version the address translation will be made by unroll 83 */ 84 #define PCIE_ATU_UNR_REGION_CTRL1 0x00 85 #define PCIE_ATU_UNR_REGION_CTRL2 0x04 86 #define PCIE_ATU_UNR_LOWER_BASE 0x08 87 #define PCIE_ATU_UNR_UPPER_BASE 0x0C 88 #define PCIE_ATU_UNR_LIMIT 0x10 89 #define PCIE_ATU_UNR_LOWER_TARGET 0x14 90 #define PCIE_ATU_UNR_UPPER_TARGET 0x18 91 92 /* Register address builder */ 93 #define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ 94 ((0x3 << 20) | ((region) << 9)) 95 96 #define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ 97 ((0x3 << 20) | ((region) << 9) | (0x1 << 8)) 98 99 #define MAX_MSI_IRQS 256 100 #define MAX_MSI_IRQS_PER_CTRL 32 101 #define MAX_MSI_CTRLS (MAX_MSI_IRQS / MAX_MSI_IRQS_PER_CTRL) 102 #define MSI_REG_CTRL_BLOCK_SIZE 12 103 #define MSI_DEF_NUM_VECTORS 32 104 105 /* Maximum number of inbound/outbound iATUs */ 106 #define MAX_IATU_IN 256 107 #define MAX_IATU_OUT 256 108 109 struct pcie_port; 110 struct dw_pcie; 111 struct dw_pcie_ep; 112 113 enum dw_pcie_region_type { 114 DW_PCIE_REGION_UNKNOWN, 115 DW_PCIE_REGION_INBOUND, 116 DW_PCIE_REGION_OUTBOUND, 117 }; 118 119 enum dw_pcie_device_mode { 120 DW_PCIE_UNKNOWN_TYPE, 121 DW_PCIE_EP_TYPE, 122 DW_PCIE_LEG_EP_TYPE, 123 DW_PCIE_RC_TYPE, 124 }; 125 126 struct dw_pcie_host_ops { 127 int (*rd_own_conf)(struct pcie_port *pp, int where, int size, u32 *val); 128 int (*wr_own_conf)(struct pcie_port *pp, int where, int size, u32 val); 129 int (*rd_other_conf)(struct pcie_port *pp, struct pci_bus *bus, 130 unsigned int devfn, int where, int size, u32 *val); 131 int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus, 132 unsigned int devfn, int where, int size, u32 val); 133 int (*host_init)(struct pcie_port *pp); 134 void (*msi_set_irq)(struct pcie_port *pp, int irq); 135 void (*msi_clear_irq)(struct pcie_port *pp, int irq); 136 phys_addr_t (*get_msi_addr)(struct pcie_port *pp); 137 u32 (*get_msi_data)(struct pcie_port *pp, int pos); 138 void (*scan_bus)(struct pcie_port *pp); 139 void (*set_num_vectors)(struct pcie_port *pp); 140 int (*msi_host_init)(struct pcie_port *pp); 141 void (*msi_irq_ack)(int irq, struct pcie_port *pp); 142 }; 143 144 struct pcie_port { 145 u8 root_bus_nr; 146 u64 cfg0_base; 147 void __iomem *va_cfg0_base; 148 u32 cfg0_size; 149 u64 cfg1_base; 150 void __iomem *va_cfg1_base; 151 u32 cfg1_size; 152 resource_size_t io_base; 153 phys_addr_t io_bus_addr; 154 u32 io_size; 155 u64 mem_base; 156 phys_addr_t mem_bus_addr; 157 u32 mem_size; 158 struct resource *cfg; 159 struct resource *io; 160 struct resource *mem; 161 struct resource *busn; 162 int irq; 163 const struct dw_pcie_host_ops *ops; 164 int msi_irq; 165 struct irq_domain *irq_domain; 166 struct irq_domain *msi_domain; 167 dma_addr_t msi_data; 168 u32 num_vectors; 169 u32 irq_status[MAX_MSI_CTRLS]; 170 raw_spinlock_t lock; 171 DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); 172 }; 173 174 enum dw_pcie_as_type { 175 DW_PCIE_AS_UNKNOWN, 176 DW_PCIE_AS_MEM, 177 DW_PCIE_AS_IO, 178 }; 179 180 struct dw_pcie_ep_ops { 181 void (*ep_init)(struct dw_pcie_ep *ep); 182 int (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no, 183 enum pci_epc_irq_type type, u16 interrupt_num); 184 }; 185 186 struct dw_pcie_ep { 187 struct pci_epc *epc; 188 struct dw_pcie_ep_ops *ops; 189 phys_addr_t phys_base; 190 size_t addr_size; 191 size_t page_size; 192 u8 bar_to_atu[6]; 193 phys_addr_t *outbound_addr; 194 unsigned long *ib_window_map; 195 unsigned long *ob_window_map; 196 u32 num_ib_windows; 197 u32 num_ob_windows; 198 void __iomem *msi_mem; 199 phys_addr_t msi_mem_phys; 200 u8 msi_cap; /* MSI capability offset */ 201 u8 msix_cap; /* MSI-X capability offset */ 202 }; 203 204 struct dw_pcie_ops { 205 u64 (*cpu_addr_fixup)(struct dw_pcie *pcie, u64 cpu_addr); 206 u32 (*read_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg, 207 size_t size); 208 void (*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg, 209 size_t size, u32 val); 210 int (*link_up)(struct dw_pcie *pcie); 211 int (*start_link)(struct dw_pcie *pcie); 212 void (*stop_link)(struct dw_pcie *pcie); 213 }; 214 215 struct dw_pcie { 216 struct device *dev; 217 void __iomem *dbi_base; 218 void __iomem *dbi_base2; 219 u32 num_viewport; 220 u8 iatu_unroll_enabled; 221 struct pcie_port pp; 222 struct dw_pcie_ep ep; 223 const struct dw_pcie_ops *ops; 224 }; 225 226 #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp) 227 228 #define to_dw_pcie_from_ep(endpoint) \ 229 container_of((endpoint), struct dw_pcie, ep) 230 231 int dw_pcie_read(void __iomem *addr, int size, u32 *val); 232 int dw_pcie_write(void __iomem *addr, int size, u32 val); 233 234 u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, 235 size_t size); 236 void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, 237 size_t size, u32 val); 238 int dw_pcie_link_up(struct dw_pcie *pci); 239 int dw_pcie_wait_for_link(struct dw_pcie *pci); 240 void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, 241 int type, u64 cpu_addr, u64 pci_addr, 242 u32 size); 243 int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int bar, 244 u64 cpu_addr, enum dw_pcie_as_type as_type); 245 void dw_pcie_disable_atu(struct dw_pcie *pci, int index, 246 enum dw_pcie_region_type type); 247 void dw_pcie_setup(struct dw_pcie *pci); 248 249 static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) 250 { 251 __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x4, val); 252 } 253 254 static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg) 255 { 256 return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x4); 257 } 258 259 static inline void dw_pcie_writew_dbi(struct dw_pcie *pci, u32 reg, u16 val) 260 { 261 __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x2, val); 262 } 263 264 static inline u16 dw_pcie_readw_dbi(struct dw_pcie *pci, u32 reg) 265 { 266 return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x2); 267 } 268 269 static inline void dw_pcie_writeb_dbi(struct dw_pcie *pci, u32 reg, u8 val) 270 { 271 __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x1, val); 272 } 273 274 static inline u8 dw_pcie_readb_dbi(struct dw_pcie *pci, u32 reg) 275 { 276 return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x1); 277 } 278 279 static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val) 280 { 281 __dw_pcie_write_dbi(pci, pci->dbi_base2, reg, 0x4, val); 282 } 283 284 static inline u32 dw_pcie_readl_dbi2(struct dw_pcie *pci, u32 reg) 285 { 286 return __dw_pcie_read_dbi(pci, pci->dbi_base2, reg, 0x4); 287 } 288 289 static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci) 290 { 291 u32 reg; 292 u32 val; 293 294 reg = PCIE_MISC_CONTROL_1_OFF; 295 val = dw_pcie_readl_dbi(pci, reg); 296 val |= PCIE_DBI_RO_WR_EN; 297 dw_pcie_writel_dbi(pci, reg, val); 298 } 299 300 static inline void dw_pcie_dbi_ro_wr_dis(struct dw_pcie *pci) 301 { 302 u32 reg; 303 u32 val; 304 305 reg = PCIE_MISC_CONTROL_1_OFF; 306 val = dw_pcie_readl_dbi(pci, reg); 307 val &= ~PCIE_DBI_RO_WR_EN; 308 dw_pcie_writel_dbi(pci, reg, val); 309 } 310 311 #ifdef CONFIG_PCIE_DW_HOST 312 irqreturn_t dw_handle_msi_irq(struct pcie_port *pp); 313 void dw_pcie_msi_init(struct pcie_port *pp); 314 void dw_pcie_free_msi(struct pcie_port *pp); 315 void dw_pcie_setup_rc(struct pcie_port *pp); 316 int dw_pcie_host_init(struct pcie_port *pp); 317 int dw_pcie_allocate_domains(struct pcie_port *pp); 318 #else 319 static inline irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) 320 { 321 return IRQ_NONE; 322 } 323 324 static inline void dw_pcie_msi_init(struct pcie_port *pp) 325 { 326 } 327 328 static inline void dw_pcie_free_msi(struct pcie_port *pp) 329 { 330 } 331 332 static inline void dw_pcie_setup_rc(struct pcie_port *pp) 333 { 334 } 335 336 static inline int dw_pcie_host_init(struct pcie_port *pp) 337 { 338 return 0; 339 } 340 341 static inline int dw_pcie_allocate_domains(struct pcie_port *pp) 342 { 343 return 0; 344 } 345 #endif 346 347 #ifdef CONFIG_PCIE_DW_EP 348 void dw_pcie_ep_linkup(struct dw_pcie_ep *ep); 349 int dw_pcie_ep_init(struct dw_pcie_ep *ep); 350 void dw_pcie_ep_exit(struct dw_pcie_ep *ep); 351 int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no); 352 int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, 353 u8 interrupt_num); 354 int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no, 355 u16 interrupt_num); 356 void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar); 357 #else 358 static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep) 359 { 360 } 361 362 static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep) 363 { 364 return 0; 365 } 366 367 static inline void dw_pcie_ep_exit(struct dw_pcie_ep *ep) 368 { 369 } 370 371 static inline int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no) 372 { 373 return 0; 374 } 375 376 static inline int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, 377 u8 interrupt_num) 378 { 379 return 0; 380 } 381 382 static inline int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no, 383 u16 interrupt_num) 384 { 385 return 0; 386 } 387 388 static inline void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar) 389 { 390 } 391 #endif 392 #endif /* _PCIE_DESIGNWARE_H */ 393