linux/drivers/pci/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_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 MSI_MESSAGE_CONTROL             0x52
 100#define MSI_CAP_MMC_SHIFT               1
 101#define MSI_CAP_MMC_MASK                (7 << MSI_CAP_MMC_SHIFT)
 102#define MSI_CAP_MME_SHIFT               4
 103#define MSI_CAP_MSI_EN_MASK             0x1
 104#define MSI_CAP_MME_MASK                (7 << MSI_CAP_MME_SHIFT)
 105#define MSI_MESSAGE_ADDR_L32            0x54
 106#define MSI_MESSAGE_ADDR_U32            0x58
 107#define MSI_MESSAGE_DATA_32             0x58
 108#define MSI_MESSAGE_DATA_64             0x5C
 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_DEF_NUM_VECTORS             32
 114
 115/* Maximum number of inbound/outbound iATUs */
 116#define MAX_IATU_IN                     256
 117#define MAX_IATU_OUT                    256
 118
 119struct pcie_port;
 120struct dw_pcie;
 121struct dw_pcie_ep;
 122
 123enum dw_pcie_region_type {
 124        DW_PCIE_REGION_UNKNOWN,
 125        DW_PCIE_REGION_INBOUND,
 126        DW_PCIE_REGION_OUTBOUND,
 127};
 128
 129enum dw_pcie_device_mode {
 130        DW_PCIE_UNKNOWN_TYPE,
 131        DW_PCIE_EP_TYPE,
 132        DW_PCIE_LEG_EP_TYPE,
 133        DW_PCIE_RC_TYPE,
 134};
 135
 136struct dw_pcie_host_ops {
 137        int (*rd_own_conf)(struct pcie_port *pp, int where, int size, u32 *val);
 138        int (*wr_own_conf)(struct pcie_port *pp, int where, int size, u32 val);
 139        int (*rd_other_conf)(struct pcie_port *pp, struct pci_bus *bus,
 140                             unsigned int devfn, int where, int size, u32 *val);
 141        int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus,
 142                             unsigned int devfn, int where, int size, u32 val);
 143        int (*host_init)(struct pcie_port *pp);
 144        void (*msi_set_irq)(struct pcie_port *pp, int irq);
 145        void (*msi_clear_irq)(struct pcie_port *pp, int irq);
 146        phys_addr_t (*get_msi_addr)(struct pcie_port *pp);
 147        u32 (*get_msi_data)(struct pcie_port *pp, int pos);
 148        void (*scan_bus)(struct pcie_port *pp);
 149        void (*set_num_vectors)(struct pcie_port *pp);
 150        int (*msi_host_init)(struct pcie_port *pp);
 151        void (*msi_irq_ack)(int irq, struct pcie_port *pp);
 152};
 153
 154struct pcie_port {
 155        u8                      root_bus_nr;
 156        u64                     cfg0_base;
 157        void __iomem            *va_cfg0_base;
 158        u32                     cfg0_size;
 159        u64                     cfg1_base;
 160        void __iomem            *va_cfg1_base;
 161        u32                     cfg1_size;
 162        resource_size_t         io_base;
 163        phys_addr_t             io_bus_addr;
 164        u32                     io_size;
 165        u64                     mem_base;
 166        phys_addr_t             mem_bus_addr;
 167        u32                     mem_size;
 168        struct resource         *cfg;
 169        struct resource         *io;
 170        struct resource         *mem;
 171        struct resource         *busn;
 172        int                     irq;
 173        const struct dw_pcie_host_ops *ops;
 174        int                     msi_irq;
 175        struct irq_domain       *irq_domain;
 176        struct irq_domain       *msi_domain;
 177        dma_addr_t              msi_data;
 178        u32                     num_vectors;
 179        u32                     irq_status[MAX_MSI_CTRLS];
 180        raw_spinlock_t          lock;
 181        DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS);
 182};
 183
 184enum dw_pcie_as_type {
 185        DW_PCIE_AS_UNKNOWN,
 186        DW_PCIE_AS_MEM,
 187        DW_PCIE_AS_IO,
 188};
 189
 190struct dw_pcie_ep_ops {
 191        void    (*ep_init)(struct dw_pcie_ep *ep);
 192        int     (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no,
 193                             enum pci_epc_irq_type type, u8 interrupt_num);
 194};
 195
 196struct dw_pcie_ep {
 197        struct pci_epc          *epc;
 198        struct dw_pcie_ep_ops   *ops;
 199        phys_addr_t             phys_base;
 200        size_t                  addr_size;
 201        size_t                  page_size;
 202        u8                      bar_to_atu[6];
 203        phys_addr_t             *outbound_addr;
 204        unsigned long           *ib_window_map;
 205        unsigned long           *ob_window_map;
 206        u32                     num_ib_windows;
 207        u32                     num_ob_windows;
 208        void __iomem            *msi_mem;
 209        phys_addr_t             msi_mem_phys;
 210};
 211
 212struct dw_pcie_ops {
 213        u64     (*cpu_addr_fixup)(struct dw_pcie *pcie, u64 cpu_addr);
 214        u32     (*read_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
 215                            size_t size);
 216        void    (*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
 217                             size_t size, u32 val);
 218        int     (*link_up)(struct dw_pcie *pcie);
 219        int     (*start_link)(struct dw_pcie *pcie);
 220        void    (*stop_link)(struct dw_pcie *pcie);
 221};
 222
 223struct dw_pcie {
 224        struct device           *dev;
 225        void __iomem            *dbi_base;
 226        void __iomem            *dbi_base2;
 227        u32                     num_viewport;
 228        u8                      iatu_unroll_enabled;
 229        struct pcie_port        pp;
 230        struct dw_pcie_ep       ep;
 231        const struct dw_pcie_ops *ops;
 232};
 233
 234#define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp)
 235
 236#define to_dw_pcie_from_ep(endpoint)   \
 237                container_of((endpoint), struct dw_pcie, ep)
 238
 239int dw_pcie_read(void __iomem *addr, int size, u32 *val);
 240int dw_pcie_write(void __iomem *addr, int size, u32 val);
 241
 242u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
 243                       size_t size);
 244void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg,
 245                         size_t size, u32 val);
 246int dw_pcie_link_up(struct dw_pcie *pci);
 247int dw_pcie_wait_for_link(struct dw_pcie *pci);
 248void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index,
 249                               int type, u64 cpu_addr, u64 pci_addr,
 250                               u32 size);
 251int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int bar,
 252                             u64 cpu_addr, enum dw_pcie_as_type as_type);
 253void dw_pcie_disable_atu(struct dw_pcie *pci, int index,
 254                         enum dw_pcie_region_type type);
 255void dw_pcie_setup(struct dw_pcie *pci);
 256
 257static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val)
 258{
 259        __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x4, val);
 260}
 261
 262static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg)
 263{
 264        return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x4);
 265}
 266
 267static inline void dw_pcie_writew_dbi(struct dw_pcie *pci, u32 reg, u16 val)
 268{
 269        __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x2, val);
 270}
 271
 272static inline u16 dw_pcie_readw_dbi(struct dw_pcie *pci, u32 reg)
 273{
 274        return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x2);
 275}
 276
 277static inline void dw_pcie_writeb_dbi(struct dw_pcie *pci, u32 reg, u8 val)
 278{
 279        __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x1, val);
 280}
 281
 282static inline u8 dw_pcie_readb_dbi(struct dw_pcie *pci, u32 reg)
 283{
 284        return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x1);
 285}
 286
 287static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val)
 288{
 289        __dw_pcie_write_dbi(pci, pci->dbi_base2, reg, 0x4, val);
 290}
 291
 292static 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);
 295}
 296
 297static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci)
 298{
 299        u32 reg;
 300        u32 val;
 301
 302        reg = PCIE_MISC_CONTROL_1_OFF;
 303        val = dw_pcie_readl_dbi(pci, reg);
 304        val |= PCIE_DBI_RO_WR_EN;
 305        dw_pcie_writel_dbi(pci, reg, val);
 306}
 307
 308static inline void dw_pcie_dbi_ro_wr_dis(struct dw_pcie *pci)
 309{
 310        u32 reg;
 311        u32 val;
 312
 313        reg = PCIE_MISC_CONTROL_1_OFF;
 314        val = dw_pcie_readl_dbi(pci, reg);
 315        val &= ~PCIE_DBI_RO_WR_EN;
 316        dw_pcie_writel_dbi(pci, reg, val);
 317}
 318
 319#ifdef CONFIG_PCIE_DW_HOST
 320irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
 321void dw_pcie_msi_init(struct pcie_port *pp);
 322void dw_pcie_free_msi(struct pcie_port *pp);
 323void dw_pcie_setup_rc(struct pcie_port *pp);
 324int dw_pcie_host_init(struct pcie_port *pp);
 325int dw_pcie_allocate_domains(struct pcie_port *pp);
 326#else
 327static inline irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
 328{
 329        return IRQ_NONE;
 330}
 331
 332static inline void dw_pcie_msi_init(struct pcie_port *pp)
 333{
 334}
 335
 336static inline void dw_pcie_free_msi(struct pcie_port *pp)
 337{
 338}
 339
 340static inline void dw_pcie_setup_rc(struct pcie_port *pp)
 341{
 342}
 343
 344static inline int dw_pcie_host_init(struct pcie_port *pp)
 345{
 346        return 0;
 347}
 348
 349static inline int dw_pcie_allocate_domains(struct pcie_port *pp)
 350{
 351        return 0;
 352}
 353#endif
 354
 355#ifdef CONFIG_PCIE_DW_EP
 356void dw_pcie_ep_linkup(struct dw_pcie_ep *ep);
 357int dw_pcie_ep_init(struct dw_pcie_ep *ep);
 358void dw_pcie_ep_exit(struct dw_pcie_ep *ep);
 359int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
 360                             u8 interrupt_num);
 361void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar);
 362#else
 363static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
 364{
 365}
 366
 367static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep)
 368{
 369        return 0;
 370}
 371
 372static inline void dw_pcie_ep_exit(struct dw_pcie_ep *ep)
 373{
 374}
 375
 376static 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
 382static inline void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)
 383{
 384}
 385#endif
 386#endif /* _PCIE_DESIGNWARE_H */
 387