root/drivers/pci/controller/dwc/pcie-designware.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. dw_pcie_writel_dbi
  2. dw_pcie_readl_dbi
  3. dw_pcie_writew_dbi
  4. dw_pcie_readw_dbi
  5. dw_pcie_writeb_dbi
  6. dw_pcie_readb_dbi
  7. dw_pcie_writel_dbi2
  8. dw_pcie_readl_dbi2
  9. dw_pcie_writel_atu
  10. dw_pcie_readl_atu
  11. dw_pcie_dbi_ro_wr_en
  12. dw_pcie_dbi_ro_wr_dis
  13. dw_handle_msi_irq
  14. dw_pcie_msi_init
  15. dw_pcie_free_msi
  16. dw_pcie_setup_rc
  17. dw_pcie_host_init
  18. dw_pcie_host_deinit
  19. dw_pcie_allocate_domains
  20. dw_pcie_ep_linkup
  21. dw_pcie_ep_init
  22. dw_pcie_ep_exit
  23. dw_pcie_ep_raise_legacy_irq
  24. dw_pcie_ep_raise_msi_irq
  25. dw_pcie_ep_raise_msix_irq
  26. dw_pcie_ep_reset_bar

   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/bitfield.h>
  15 #include <linux/dma-mapping.h>
  16 #include <linux/irq.h>
  17 #include <linux/msi.h>
  18 #include <linux/pci.h>
  19 
  20 #include <linux/pci-epc.h>
  21 #include <linux/pci-epf.h>
  22 
  23 /* Parameters for the waiting for link up routine */
  24 #define LINK_WAIT_MAX_RETRIES           10
  25 #define LINK_WAIT_USLEEP_MIN            90000
  26 #define LINK_WAIT_USLEEP_MAX            100000
  27 
  28 /* Parameters for the waiting for iATU enabled routine */
  29 #define LINK_WAIT_MAX_IATU_RETRIES      5
  30 #define LINK_WAIT_IATU                  9
  31 
  32 /* Synopsys-specific PCIe configuration registers */
  33 #define PCIE_PORT_LINK_CONTROL          0x710
  34 #define PORT_LINK_MODE_MASK             GENMASK(21, 16)
  35 #define PORT_LINK_MODE(n)               FIELD_PREP(PORT_LINK_MODE_MASK, n)
  36 #define PORT_LINK_MODE_1_LANES          PORT_LINK_MODE(0x1)
  37 #define PORT_LINK_MODE_2_LANES          PORT_LINK_MODE(0x3)
  38 #define PORT_LINK_MODE_4_LANES          PORT_LINK_MODE(0x7)
  39 #define PORT_LINK_MODE_8_LANES          PORT_LINK_MODE(0xf)
  40 
  41 #define PCIE_PORT_DEBUG0                0x728
  42 #define PORT_LOGIC_LTSSM_STATE_MASK     0x1f
  43 #define PORT_LOGIC_LTSSM_STATE_L0       0x11
  44 #define PCIE_PORT_DEBUG1                0x72C
  45 #define PCIE_PORT_DEBUG1_LINK_UP                BIT(4)
  46 #define PCIE_PORT_DEBUG1_LINK_IN_TRAINING       BIT(29)
  47 
  48 #define PCIE_LINK_WIDTH_SPEED_CONTROL   0x80C
  49 #define PORT_LOGIC_SPEED_CHANGE         BIT(17)
  50 #define PORT_LOGIC_LINK_WIDTH_MASK      GENMASK(12, 8)
  51 #define PORT_LOGIC_LINK_WIDTH(n)        FIELD_PREP(PORT_LOGIC_LINK_WIDTH_MASK, n)
  52 #define PORT_LOGIC_LINK_WIDTH_1_LANES   PORT_LOGIC_LINK_WIDTH(0x1)
  53 #define PORT_LOGIC_LINK_WIDTH_2_LANES   PORT_LOGIC_LINK_WIDTH(0x2)
  54 #define PORT_LOGIC_LINK_WIDTH_4_LANES   PORT_LOGIC_LINK_WIDTH(0x4)
  55 #define PORT_LOGIC_LINK_WIDTH_8_LANES   PORT_LOGIC_LINK_WIDTH(0x8)
  56 
  57 #define PCIE_MSI_ADDR_LO                0x820
  58 #define PCIE_MSI_ADDR_HI                0x824
  59 #define PCIE_MSI_INTR0_ENABLE           0x828
  60 #define PCIE_MSI_INTR0_MASK             0x82C
  61 #define PCIE_MSI_INTR0_STATUS           0x830
  62 
  63 #define PCIE_ATU_VIEWPORT               0x900
  64 #define PCIE_ATU_REGION_INBOUND         BIT(31)
  65 #define PCIE_ATU_REGION_OUTBOUND        0
  66 #define PCIE_ATU_REGION_INDEX2          0x2
  67 #define PCIE_ATU_REGION_INDEX1          0x1
  68 #define PCIE_ATU_REGION_INDEX0          0x0
  69 #define PCIE_ATU_CR1                    0x904
  70 #define PCIE_ATU_TYPE_MEM               0x0
  71 #define PCIE_ATU_TYPE_IO                0x2
  72 #define PCIE_ATU_TYPE_CFG0              0x4
  73 #define PCIE_ATU_TYPE_CFG1              0x5
  74 #define PCIE_ATU_CR2                    0x908
  75 #define PCIE_ATU_ENABLE                 BIT(31)
  76 #define PCIE_ATU_BAR_MODE_ENABLE        BIT(30)
  77 #define PCIE_ATU_LOWER_BASE             0x90C
  78 #define PCIE_ATU_UPPER_BASE             0x910
  79 #define PCIE_ATU_LIMIT                  0x914
  80 #define PCIE_ATU_LOWER_TARGET           0x918
  81 #define PCIE_ATU_BUS(x)                 FIELD_PREP(GENMASK(31, 24), x)
  82 #define PCIE_ATU_DEV(x)                 FIELD_PREP(GENMASK(23, 19), x)
  83 #define PCIE_ATU_FUNC(x)                FIELD_PREP(GENMASK(18, 16), x)
  84 #define PCIE_ATU_UPPER_TARGET           0x91C
  85 
  86 #define PCIE_MISC_CONTROL_1_OFF         0x8BC
  87 #define PCIE_DBI_RO_WR_EN               BIT(0)
  88 
  89 #define PCIE_PL_CHK_REG_CONTROL_STATUS                  0xB20
  90 #define PCIE_PL_CHK_REG_CHK_REG_START                   BIT(0)
  91 #define PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS              BIT(1)
  92 #define PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR        BIT(16)
  93 #define PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR             BIT(17)
  94 #define PCIE_PL_CHK_REG_CHK_REG_COMPLETE                BIT(18)
  95 
  96 #define PCIE_PL_CHK_REG_ERR_ADDR                        0xB28
  97 
  98 /*
  99  * iATU Unroll-specific register definitions
 100  * From 4.80 core version the address translation will be made by unroll
 101  */
 102 #define PCIE_ATU_UNR_REGION_CTRL1       0x00
 103 #define PCIE_ATU_UNR_REGION_CTRL2       0x04
 104 #define PCIE_ATU_UNR_LOWER_BASE         0x08
 105 #define PCIE_ATU_UNR_UPPER_BASE         0x0C
 106 #define PCIE_ATU_UNR_LIMIT              0x10
 107 #define PCIE_ATU_UNR_LOWER_TARGET       0x14
 108 #define PCIE_ATU_UNR_UPPER_TARGET       0x18
 109 
 110 /*
 111  * The default address offset between dbi_base and atu_base. Root controller
 112  * drivers are not required to initialize atu_base if the offset matches this
 113  * default; the driver core automatically derives atu_base from dbi_base using
 114  * this offset, if atu_base not set.
 115  */
 116 #define DEFAULT_DBI_ATU_OFFSET (0x3 << 20)
 117 
 118 /* Register address builder */
 119 #define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \
 120                 ((region) << 9)
 121 
 122 #define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \
 123                 (((region) << 9) | BIT(8))
 124 
 125 #define MAX_MSI_IRQS                    256
 126 #define MAX_MSI_IRQS_PER_CTRL           32
 127 #define MAX_MSI_CTRLS                   (MAX_MSI_IRQS / MAX_MSI_IRQS_PER_CTRL)
 128 #define MSI_REG_CTRL_BLOCK_SIZE         12
 129 #define MSI_DEF_NUM_VECTORS             32
 130 
 131 /* Maximum number of inbound/outbound iATUs */
 132 #define MAX_IATU_IN                     256
 133 #define MAX_IATU_OUT                    256
 134 
 135 struct pcie_port;
 136 struct dw_pcie;
 137 struct dw_pcie_ep;
 138 
 139 enum dw_pcie_region_type {
 140         DW_PCIE_REGION_UNKNOWN,
 141         DW_PCIE_REGION_INBOUND,
 142         DW_PCIE_REGION_OUTBOUND,
 143 };
 144 
 145 enum dw_pcie_device_mode {
 146         DW_PCIE_UNKNOWN_TYPE,
 147         DW_PCIE_EP_TYPE,
 148         DW_PCIE_LEG_EP_TYPE,
 149         DW_PCIE_RC_TYPE,
 150 };
 151 
 152 struct dw_pcie_host_ops {
 153         int (*rd_own_conf)(struct pcie_port *pp, int where, int size, u32 *val);
 154         int (*wr_own_conf)(struct pcie_port *pp, int where, int size, u32 val);
 155         int (*rd_other_conf)(struct pcie_port *pp, struct pci_bus *bus,
 156                              unsigned int devfn, int where, int size, u32 *val);
 157         int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus,
 158                              unsigned int devfn, int where, int size, u32 val);
 159         int (*host_init)(struct pcie_port *pp);
 160         void (*scan_bus)(struct pcie_port *pp);
 161         void (*set_num_vectors)(struct pcie_port *pp);
 162         int (*msi_host_init)(struct pcie_port *pp);
 163 };
 164 
 165 struct pcie_port {
 166         u8                      root_bus_nr;
 167         u64                     cfg0_base;
 168         void __iomem            *va_cfg0_base;
 169         u32                     cfg0_size;
 170         u64                     cfg1_base;
 171         void __iomem            *va_cfg1_base;
 172         u32                     cfg1_size;
 173         resource_size_t         io_base;
 174         phys_addr_t             io_bus_addr;
 175         u32                     io_size;
 176         u64                     mem_base;
 177         phys_addr_t             mem_bus_addr;
 178         u32                     mem_size;
 179         struct resource         *cfg;
 180         struct resource         *io;
 181         struct resource         *mem;
 182         struct resource         *busn;
 183         int                     irq;
 184         const struct dw_pcie_host_ops *ops;
 185         int                     msi_irq;
 186         struct irq_domain       *irq_domain;
 187         struct irq_domain       *msi_domain;
 188         dma_addr_t              msi_data;
 189         struct page             *msi_page;
 190         struct irq_chip         *msi_irq_chip;
 191         u32                     num_vectors;
 192         u32                     irq_mask[MAX_MSI_CTRLS];
 193         struct pci_bus          *root_bus;
 194         raw_spinlock_t          lock;
 195         DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS);
 196 };
 197 
 198 enum dw_pcie_as_type {
 199         DW_PCIE_AS_UNKNOWN,
 200         DW_PCIE_AS_MEM,
 201         DW_PCIE_AS_IO,
 202 };
 203 
 204 struct dw_pcie_ep_ops {
 205         void    (*ep_init)(struct dw_pcie_ep *ep);
 206         int     (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no,
 207                              enum pci_epc_irq_type type, u16 interrupt_num);
 208         const struct pci_epc_features* (*get_features)(struct dw_pcie_ep *ep);
 209 };
 210 
 211 struct dw_pcie_ep {
 212         struct pci_epc          *epc;
 213         const struct dw_pcie_ep_ops *ops;
 214         phys_addr_t             phys_base;
 215         size_t                  addr_size;
 216         size_t                  page_size;
 217         u8                      bar_to_atu[6];
 218         phys_addr_t             *outbound_addr;
 219         unsigned long           *ib_window_map;
 220         unsigned long           *ob_window_map;
 221         u32                     num_ib_windows;
 222         u32                     num_ob_windows;
 223         void __iomem            *msi_mem;
 224         phys_addr_t             msi_mem_phys;
 225         u8                      msi_cap;        /* MSI capability offset */
 226         u8                      msix_cap;       /* MSI-X capability offset */
 227 };
 228 
 229 struct dw_pcie_ops {
 230         u64     (*cpu_addr_fixup)(struct dw_pcie *pcie, u64 cpu_addr);
 231         u32     (*read_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
 232                             size_t size);
 233         void    (*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
 234                              size_t size, u32 val);
 235         u32     (*read_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
 236                              size_t size);
 237         void    (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
 238                               size_t size, u32 val);
 239         int     (*link_up)(struct dw_pcie *pcie);
 240         int     (*start_link)(struct dw_pcie *pcie);
 241         void    (*stop_link)(struct dw_pcie *pcie);
 242 };
 243 
 244 struct dw_pcie {
 245         struct device           *dev;
 246         void __iomem            *dbi_base;
 247         void __iomem            *dbi_base2;
 248         /* Used when iatu_unroll_enabled is true */
 249         void __iomem            *atu_base;
 250         u32                     num_viewport;
 251         u8                      iatu_unroll_enabled;
 252         struct pcie_port        pp;
 253         struct dw_pcie_ep       ep;
 254         const struct dw_pcie_ops *ops;
 255         unsigned int            version;
 256 };
 257 
 258 #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp)
 259 
 260 #define to_dw_pcie_from_ep(endpoint)   \
 261                 container_of((endpoint), struct dw_pcie, ep)
 262 
 263 u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap);
 264 u16 dw_pcie_find_ext_capability(struct dw_pcie *pci, u8 cap);
 265 
 266 int dw_pcie_read(void __iomem *addr, int size, u32 *val);
 267 int dw_pcie_write(void __iomem *addr, int size, u32 val);
 268 
 269 u32 dw_pcie_read_dbi(struct dw_pcie *pci, u32 reg, size_t size);
 270 void dw_pcie_write_dbi(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
 271 u32 dw_pcie_read_dbi2(struct dw_pcie *pci, u32 reg, size_t size);
 272 void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
 273 u32 dw_pcie_read_atu(struct dw_pcie *pci, u32 reg, size_t size);
 274 void dw_pcie_write_atu(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
 275 int dw_pcie_link_up(struct dw_pcie *pci);
 276 int dw_pcie_wait_for_link(struct dw_pcie *pci);
 277 void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index,
 278                                int type, u64 cpu_addr, u64 pci_addr,
 279                                u32 size);
 280 int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int bar,
 281                              u64 cpu_addr, enum dw_pcie_as_type as_type);
 282 void dw_pcie_disable_atu(struct dw_pcie *pci, int index,
 283                          enum dw_pcie_region_type type);
 284 void dw_pcie_setup(struct dw_pcie *pci);
 285 
 286 static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val)
 287 {
 288         dw_pcie_write_dbi(pci, reg, 0x4, val);
 289 }
 290 
 291 static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg)
 292 {
 293         return dw_pcie_read_dbi(pci, reg, 0x4);
 294 }
 295 
 296 static inline void dw_pcie_writew_dbi(struct dw_pcie *pci, u32 reg, u16 val)
 297 {
 298         dw_pcie_write_dbi(pci, reg, 0x2, val);
 299 }
 300 
 301 static inline u16 dw_pcie_readw_dbi(struct dw_pcie *pci, u32 reg)
 302 {
 303         return dw_pcie_read_dbi(pci, reg, 0x2);
 304 }
 305 
 306 static inline void dw_pcie_writeb_dbi(struct dw_pcie *pci, u32 reg, u8 val)
 307 {
 308         dw_pcie_write_dbi(pci, reg, 0x1, val);
 309 }
 310 
 311 static inline u8 dw_pcie_readb_dbi(struct dw_pcie *pci, u32 reg)
 312 {
 313         return dw_pcie_read_dbi(pci, reg, 0x1);
 314 }
 315 
 316 static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val)
 317 {
 318         dw_pcie_write_dbi2(pci, reg, 0x4, val);
 319 }
 320 
 321 static inline u32 dw_pcie_readl_dbi2(struct dw_pcie *pci, u32 reg)
 322 {
 323         return dw_pcie_read_dbi2(pci, reg, 0x4);
 324 }
 325 
 326 static inline void dw_pcie_writel_atu(struct dw_pcie *pci, u32 reg, u32 val)
 327 {
 328         dw_pcie_write_atu(pci, reg, 0x4, val);
 329 }
 330 
 331 static inline u32 dw_pcie_readl_atu(struct dw_pcie *pci, u32 reg)
 332 {
 333         return dw_pcie_read_atu(pci, reg, 0x4);
 334 }
 335 
 336 static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci)
 337 {
 338         u32 reg;
 339         u32 val;
 340 
 341         reg = PCIE_MISC_CONTROL_1_OFF;
 342         val = dw_pcie_readl_dbi(pci, reg);
 343         val |= PCIE_DBI_RO_WR_EN;
 344         dw_pcie_writel_dbi(pci, reg, val);
 345 }
 346 
 347 static inline void dw_pcie_dbi_ro_wr_dis(struct dw_pcie *pci)
 348 {
 349         u32 reg;
 350         u32 val;
 351 
 352         reg = PCIE_MISC_CONTROL_1_OFF;
 353         val = dw_pcie_readl_dbi(pci, reg);
 354         val &= ~PCIE_DBI_RO_WR_EN;
 355         dw_pcie_writel_dbi(pci, reg, val);
 356 }
 357 
 358 #ifdef CONFIG_PCIE_DW_HOST
 359 irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
 360 void dw_pcie_msi_init(struct pcie_port *pp);
 361 void dw_pcie_free_msi(struct pcie_port *pp);
 362 void dw_pcie_setup_rc(struct pcie_port *pp);
 363 int dw_pcie_host_init(struct pcie_port *pp);
 364 void dw_pcie_host_deinit(struct pcie_port *pp);
 365 int dw_pcie_allocate_domains(struct pcie_port *pp);
 366 #else
 367 static inline irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
 368 {
 369         return IRQ_NONE;
 370 }
 371 
 372 static inline void dw_pcie_msi_init(struct pcie_port *pp)
 373 {
 374 }
 375 
 376 static inline void dw_pcie_free_msi(struct pcie_port *pp)
 377 {
 378 }
 379 
 380 static inline void dw_pcie_setup_rc(struct pcie_port *pp)
 381 {
 382 }
 383 
 384 static inline int dw_pcie_host_init(struct pcie_port *pp)
 385 {
 386         return 0;
 387 }
 388 
 389 static inline void dw_pcie_host_deinit(struct pcie_port *pp)
 390 {
 391 }
 392 
 393 static inline int dw_pcie_allocate_domains(struct pcie_port *pp)
 394 {
 395         return 0;
 396 }
 397 #endif
 398 
 399 #ifdef CONFIG_PCIE_DW_EP
 400 void dw_pcie_ep_linkup(struct dw_pcie_ep *ep);
 401 int dw_pcie_ep_init(struct dw_pcie_ep *ep);
 402 void dw_pcie_ep_exit(struct dw_pcie_ep *ep);
 403 int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no);
 404 int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
 405                              u8 interrupt_num);
 406 int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
 407                              u16 interrupt_num);
 408 void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar);
 409 #else
 410 static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
 411 {
 412 }
 413 
 414 static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep)
 415 {
 416         return 0;
 417 }
 418 
 419 static inline void dw_pcie_ep_exit(struct dw_pcie_ep *ep)
 420 {
 421 }
 422 
 423 static inline int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no)
 424 {
 425         return 0;
 426 }
 427 
 428 static inline int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
 429                                            u8 interrupt_num)
 430 {
 431         return 0;
 432 }
 433 
 434 static inline int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
 435                                            u16 interrupt_num)
 436 {
 437         return 0;
 438 }
 439 
 440 static inline void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)
 441 {
 442 }
 443 #endif
 444 #endif /* _PCIE_DESIGNWARE_H */

/* [<][>][^][v][top][bottom][index][help] */