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