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