.. | .. |
---|
3 | 3 | * Synopsys DesignWare PCIe host controller driver |
---|
4 | 4 | * |
---|
5 | 5 | * Copyright (C) 2013 Samsung Electronics Co., Ltd. |
---|
6 | | - * http://www.samsung.com |
---|
| 6 | + * https://www.samsung.com |
---|
7 | 7 | * |
---|
8 | 8 | * Author: Jingoo Han <jg1.han@samsung.com> |
---|
9 | 9 | */ |
---|
.. | .. |
---|
30 | 30 | #define LINK_WAIT_IATU 9 |
---|
31 | 31 | |
---|
32 | 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 | | -#define PORT_LINK_LPBK_ENABLE (0x1 << 2) |
---|
| 33 | +#define PCIE_PORT_AFR 0x70C |
---|
| 34 | +#define PORT_AFR_N_FTS_MASK GENMASK(15, 8) |
---|
| 35 | +#define PORT_AFR_N_FTS(n) FIELD_PREP(PORT_AFR_N_FTS_MASK, n) |
---|
| 36 | +#define PORT_AFR_CC_N_FTS_MASK GENMASK(23, 16) |
---|
| 37 | +#define PORT_AFR_CC_N_FTS(n) FIELD_PREP(PORT_AFR_CC_N_FTS_MASK, n) |
---|
| 38 | +#define PORT_AFR_ENTER_ASPM BIT(30) |
---|
| 39 | +#define PORT_AFR_L0S_ENTRANCE_LAT_SHIFT 24 |
---|
| 40 | +#define PORT_AFR_L0S_ENTRANCE_LAT_MASK GENMASK(26, 24) |
---|
| 41 | +#define PORT_AFR_L1_ENTRANCE_LAT_SHIFT 27 |
---|
| 42 | +#define PORT_AFR_L1_ENTRANCE_LAT_MASK GENMASK(29, 27) |
---|
40 | 43 | |
---|
41 | | -#define PCIE_TIMER_CTRL_MAX_FUNC_NUM 0x718 |
---|
42 | | -#define FAST_LINK_SCALING_FACTOR 0x9fffffff |
---|
| 44 | +#define PCIE_PORT_LINK_CONTROL 0x710 |
---|
| 45 | +#define PORT_LINK_LPBK_ENABLE BIT(2) |
---|
| 46 | +#define PORT_LINK_DLL_LINK_EN BIT(5) |
---|
| 47 | +#define PORT_LINK_FAST_LINK_MODE BIT(7) |
---|
| 48 | +#define PORT_LINK_MODE_MASK GENMASK(21, 16) |
---|
| 49 | +#define PORT_LINK_MODE(n) FIELD_PREP(PORT_LINK_MODE_MASK, n) |
---|
| 50 | +#define PORT_LINK_MODE_1_LANES PORT_LINK_MODE(0x1) |
---|
| 51 | +#define PORT_LINK_MODE_2_LANES PORT_LINK_MODE(0x3) |
---|
| 52 | +#define PORT_LINK_MODE_4_LANES PORT_LINK_MODE(0x7) |
---|
| 53 | +#define PORT_LINK_MODE_8_LANES PORT_LINK_MODE(0xf) |
---|
| 54 | + |
---|
| 55 | +#define PCIE_PORT_DEBUG0 0x728 |
---|
| 56 | +#define PORT_LOGIC_LTSSM_STATE_MASK 0x1f |
---|
| 57 | +#define PORT_LOGIC_LTSSM_STATE_L0 0x11 |
---|
| 58 | +#define PCIE_PORT_DEBUG1 0x72C |
---|
| 59 | +#define PCIE_PORT_DEBUG1_LINK_UP BIT(4) |
---|
| 60 | +#define PCIE_PORT_DEBUG1_LINK_IN_TRAINING BIT(29) |
---|
43 | 61 | |
---|
44 | 62 | #define PCIE_LINK_WIDTH_SPEED_CONTROL 0x80C |
---|
45 | | -#define PORT_LOGIC_SPEED_CHANGE (0x1 << 17) |
---|
46 | | -#define PORT_LOGIC_LINK_WIDTH_MASK (0x1f << 8) |
---|
47 | | -#define PORT_LOGIC_LINK_WIDTH_1_LANES (0x1 << 8) |
---|
48 | | -#define PORT_LOGIC_LINK_WIDTH_2_LANES (0x2 << 8) |
---|
49 | | -#define PORT_LOGIC_LINK_WIDTH_4_LANES (0x4 << 8) |
---|
50 | | -#define PORT_LOGIC_LINK_WIDTH_8_LANES (0x8 << 8) |
---|
| 63 | +#define PORT_LOGIC_N_FTS_MASK GENMASK(7, 0) |
---|
| 64 | +#define PORT_LOGIC_SPEED_CHANGE BIT(17) |
---|
| 65 | +#define PORT_LOGIC_LINK_WIDTH_MASK GENMASK(12, 8) |
---|
| 66 | +#define PORT_LOGIC_LINK_WIDTH(n) FIELD_PREP(PORT_LOGIC_LINK_WIDTH_MASK, n) |
---|
| 67 | +#define PORT_LOGIC_LINK_WIDTH_1_LANES PORT_LOGIC_LINK_WIDTH(0x1) |
---|
| 68 | +#define PORT_LOGIC_LINK_WIDTH_2_LANES PORT_LOGIC_LINK_WIDTH(0x2) |
---|
| 69 | +#define PORT_LOGIC_LINK_WIDTH_4_LANES PORT_LOGIC_LINK_WIDTH(0x4) |
---|
| 70 | +#define PORT_LOGIC_LINK_WIDTH_8_LANES PORT_LOGIC_LINK_WIDTH(0x8) |
---|
51 | 71 | |
---|
52 | 72 | #define PCIE_MSI_ADDR_LO 0x820 |
---|
53 | 73 | #define PCIE_MSI_ADDR_HI 0x824 |
---|
.. | .. |
---|
55 | 75 | #define PCIE_MSI_INTR0_MASK 0x82C |
---|
56 | 76 | #define PCIE_MSI_INTR0_STATUS 0x830 |
---|
57 | 77 | |
---|
| 78 | +#define PCIE_PORT_MULTI_LANE_CTRL 0x8C0 |
---|
| 79 | +#define PORT_MLTI_UPCFG_SUPPORT BIT(7) |
---|
| 80 | + |
---|
58 | 81 | #define PCIE_ATU_VIEWPORT 0x900 |
---|
59 | 82 | #define PCIE_ATU_REGION_INBOUND BIT(31) |
---|
60 | 83 | #define PCIE_ATU_REGION_OUTBOUND 0 |
---|
61 | 84 | #define PCIE_ATU_CR1 0x904 |
---|
62 | | -#define PCIE_ATU_TYPE_MEM (0x0 << 0) |
---|
63 | | -#define PCIE_ATU_TYPE_IO (0x2 << 0) |
---|
64 | | -#define PCIE_ATU_TYPE_CFG0 (0x4 << 0) |
---|
65 | | -#define PCIE_ATU_TYPE_CFG1 (0x5 << 0) |
---|
| 85 | +#define PCIE_ATU_TYPE_MEM 0x0 |
---|
| 86 | +#define PCIE_ATU_TYPE_IO 0x2 |
---|
| 87 | +#define PCIE_ATU_TYPE_CFG0 0x4 |
---|
| 88 | +#define PCIE_ATU_TYPE_CFG1 0x5 |
---|
| 89 | +#define PCIE_ATU_FUNC_NUM(pf) ((pf) << 20) |
---|
66 | 90 | #define PCIE_ATU_CR2 0x908 |
---|
67 | | -#define PCIE_ATU_ENABLE (0x1 << 31) |
---|
68 | | -#define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30) |
---|
| 91 | +#define PCIE_ATU_ENABLE BIT(31) |
---|
| 92 | +#define PCIE_ATU_BAR_MODE_ENABLE BIT(30) |
---|
| 93 | +#define PCIE_ATU_FUNC_NUM_MATCH_EN BIT(19) |
---|
69 | 94 | #define PCIE_ATU_LOWER_BASE 0x90C |
---|
70 | 95 | #define PCIE_ATU_UPPER_BASE 0x910 |
---|
71 | 96 | #define PCIE_ATU_LIMIT 0x914 |
---|
72 | 97 | #define PCIE_ATU_LOWER_TARGET 0x918 |
---|
73 | | -#define PCIE_ATU_BUS(x) (((x) & 0xff) << 24) |
---|
74 | | -#define PCIE_ATU_DEV(x) (((x) & 0x1f) << 19) |
---|
75 | | -#define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) |
---|
| 98 | +#define PCIE_ATU_BUS(x) FIELD_PREP(GENMASK(31, 24), x) |
---|
| 99 | +#define PCIE_ATU_DEV(x) FIELD_PREP(GENMASK(23, 19), x) |
---|
| 100 | +#define PCIE_ATU_FUNC(x) FIELD_PREP(GENMASK(18, 16), x) |
---|
76 | 101 | #define PCIE_ATU_UPPER_TARGET 0x91C |
---|
77 | 102 | |
---|
78 | 103 | #define PCIE_MISC_CONTROL_1_OFF 0x8BC |
---|
79 | | -#define PCIE_DBI_RO_WR_EN (0x1 << 0) |
---|
| 104 | +#define PCIE_DBI_RO_WR_EN BIT(0) |
---|
| 105 | + |
---|
| 106 | +#define PCIE_MSIX_DOORBELL 0x948 |
---|
| 107 | +#define PCIE_MSIX_DOORBELL_PF_SHIFT 24 |
---|
| 108 | + |
---|
| 109 | +#define PCIE_PL_CHK_REG_CONTROL_STATUS 0xB20 |
---|
| 110 | +#define PCIE_PL_CHK_REG_CHK_REG_START BIT(0) |
---|
| 111 | +#define PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS BIT(1) |
---|
| 112 | +#define PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR BIT(16) |
---|
| 113 | +#define PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR BIT(17) |
---|
| 114 | +#define PCIE_PL_CHK_REG_CHK_REG_COMPLETE BIT(18) |
---|
| 115 | + |
---|
| 116 | +#define PCIE_PL_CHK_REG_ERR_ADDR 0xB28 |
---|
80 | 117 | |
---|
81 | 118 | /* |
---|
82 | 119 | * iATU Unroll-specific register definitions |
---|
.. | .. |
---|
86 | 123 | #define PCIE_ATU_UNR_REGION_CTRL2 0x04 |
---|
87 | 124 | #define PCIE_ATU_UNR_LOWER_BASE 0x08 |
---|
88 | 125 | #define PCIE_ATU_UNR_UPPER_BASE 0x0C |
---|
89 | | -#define PCIE_ATU_UNR_LIMIT 0x10 |
---|
| 126 | +#define PCIE_ATU_UNR_LOWER_LIMIT 0x10 |
---|
90 | 127 | #define PCIE_ATU_UNR_LOWER_TARGET 0x14 |
---|
91 | 128 | #define PCIE_ATU_UNR_UPPER_TARGET 0x18 |
---|
| 129 | +#define PCIE_ATU_UNR_UPPER_LIMIT 0x20 |
---|
| 130 | + |
---|
| 131 | +/* |
---|
| 132 | + * The default address offset between dbi_base and atu_base. Root controller |
---|
| 133 | + * drivers are not required to initialize atu_base if the offset matches this |
---|
| 134 | + * default; the driver core automatically derives atu_base from dbi_base using |
---|
| 135 | + * this offset, if atu_base not set. |
---|
| 136 | + */ |
---|
| 137 | +#define DEFAULT_DBI_ATU_OFFSET (0x3 << 20) |
---|
92 | 138 | |
---|
93 | 139 | /* Register address builder */ |
---|
94 | | -#define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ |
---|
95 | | - ((0x3 << 20) | ((region) << 9)) |
---|
| 140 | +#define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \ |
---|
| 141 | + ((region) << 9) |
---|
96 | 142 | |
---|
97 | | -#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ |
---|
98 | | - ((0x3 << 20) | ((region) << 9) | (0x1 << 8)) |
---|
| 143 | +#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \ |
---|
| 144 | + (((region) << 9) | BIT(8)) |
---|
99 | 145 | |
---|
100 | 146 | #define MAX_MSI_IRQS 256 |
---|
101 | 147 | #define MAX_MSI_IRQS_PER_CTRL 32 |
---|
.. | .. |
---|
125 | 171 | }; |
---|
126 | 172 | |
---|
127 | 173 | struct dw_pcie_host_ops { |
---|
128 | | - int (*rd_own_conf)(struct pcie_port *pp, int where, int size, u32 *val); |
---|
129 | | - int (*wr_own_conf)(struct pcie_port *pp, int where, int size, u32 val); |
---|
130 | | - int (*rd_other_conf)(struct pcie_port *pp, struct pci_bus *bus, |
---|
131 | | - unsigned int devfn, int where, int size, u32 *val); |
---|
132 | | - int (*wr_other_conf)(struct pcie_port *pp, struct pci_bus *bus, |
---|
133 | | - unsigned int devfn, int where, int size, u32 val); |
---|
134 | 174 | int (*host_init)(struct pcie_port *pp); |
---|
135 | | - void (*msi_set_irq)(struct pcie_port *pp, int irq); |
---|
136 | | - void (*msi_clear_irq)(struct pcie_port *pp, int irq); |
---|
137 | | - phys_addr_t (*get_msi_addr)(struct pcie_port *pp); |
---|
138 | | - u32 (*get_msi_data)(struct pcie_port *pp, int pos); |
---|
139 | | - void (*scan_bus)(struct pcie_port *pp); |
---|
140 | 175 | void (*set_num_vectors)(struct pcie_port *pp); |
---|
141 | 176 | int (*msi_host_init)(struct pcie_port *pp); |
---|
142 | | - void (*msi_irq_ack)(int irq, struct pcie_port *pp); |
---|
143 | 177 | }; |
---|
144 | 178 | |
---|
145 | 179 | struct pcie_port { |
---|
146 | | - u8 root_bus_nr; |
---|
147 | 180 | u64 cfg0_base; |
---|
148 | 181 | void __iomem *va_cfg0_base; |
---|
149 | 182 | u32 cfg0_size; |
---|
150 | | - u64 cfg1_base; |
---|
151 | | - void __iomem *va_cfg1_base; |
---|
152 | | - u32 cfg1_size; |
---|
153 | 183 | resource_size_t io_base; |
---|
154 | 184 | phys_addr_t io_bus_addr; |
---|
155 | 185 | u32 io_size; |
---|
156 | | - u64 mem_base; |
---|
157 | | - phys_addr_t mem_bus_addr; |
---|
158 | | - u32 mem_size; |
---|
159 | | - struct resource *cfg; |
---|
160 | | - struct resource *io; |
---|
161 | | - struct resource *mem; |
---|
162 | | - struct resource *busn; |
---|
163 | 186 | int irq; |
---|
164 | 187 | const struct dw_pcie_host_ops *ops; |
---|
165 | 188 | int msi_irq; |
---|
166 | 189 | struct irq_domain *irq_domain; |
---|
167 | 190 | struct irq_domain *msi_domain; |
---|
| 191 | + u16 msi_msg; |
---|
168 | 192 | dma_addr_t msi_data; |
---|
169 | | - struct page *msi_page; |
---|
| 193 | + struct irq_chip *msi_irq_chip; |
---|
170 | 194 | u32 num_vectors; |
---|
171 | | - u32 irq_status[MAX_MSI_CTRLS]; |
---|
| 195 | + u32 irq_mask[MAX_MSI_CTRLS]; |
---|
| 196 | + struct pci_host_bridge *bridge; |
---|
172 | 197 | raw_spinlock_t lock; |
---|
173 | | - int msi_ext; |
---|
174 | | - struct pci_host_bridge *bridge; |
---|
175 | 198 | DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS); |
---|
176 | 199 | }; |
---|
177 | 200 | |
---|
.. | .. |
---|
185 | 208 | void (*ep_init)(struct dw_pcie_ep *ep); |
---|
186 | 209 | int (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no, |
---|
187 | 210 | enum pci_epc_irq_type type, u16 interrupt_num); |
---|
| 211 | + const struct pci_epc_features* (*get_features)(struct dw_pcie_ep *ep); |
---|
| 212 | + /* |
---|
| 213 | + * Provide a method to implement the different func config space |
---|
| 214 | + * access for different platform, if different func have different |
---|
| 215 | + * offset, return the offset of func. if use write a register way |
---|
| 216 | + * return a 0, and implement code in callback function of platform |
---|
| 217 | + * driver. |
---|
| 218 | + */ |
---|
| 219 | + unsigned int (*func_conf_select)(struct dw_pcie_ep *ep, u8 func_no); |
---|
| 220 | +}; |
---|
| 221 | + |
---|
| 222 | +struct dw_pcie_ep_func { |
---|
| 223 | + struct list_head list; |
---|
| 224 | + u8 func_no; |
---|
| 225 | + u8 msi_cap; /* MSI capability offset */ |
---|
| 226 | + u8 msix_cap; /* MSI-X capability offset */ |
---|
188 | 227 | }; |
---|
189 | 228 | |
---|
190 | 229 | struct dw_pcie_ep { |
---|
191 | 230 | struct pci_epc *epc; |
---|
192 | | - struct dw_pcie_ep_ops *ops; |
---|
| 231 | + struct list_head func_list; |
---|
| 232 | + const struct dw_pcie_ep_ops *ops; |
---|
193 | 233 | phys_addr_t phys_base; |
---|
194 | 234 | size_t addr_size; |
---|
195 | 235 | size_t page_size; |
---|
196 | | - u8 bar_to_atu[6]; |
---|
| 236 | + u8 bar_to_atu[PCI_STD_NUM_BARS]; |
---|
197 | 237 | phys_addr_t *outbound_addr; |
---|
198 | 238 | unsigned long *ib_window_map; |
---|
199 | 239 | unsigned long *ob_window_map; |
---|
.. | .. |
---|
201 | 241 | u32 num_ob_windows; |
---|
202 | 242 | void __iomem *msi_mem; |
---|
203 | 243 | phys_addr_t msi_mem_phys; |
---|
204 | | - u8 msi_cap; /* MSI capability offset */ |
---|
205 | | - u8 msix_cap; /* MSI-X capability offset */ |
---|
| 244 | + struct pci_epf_bar *epf_bar[PCI_STD_NUM_BARS]; |
---|
206 | 245 | }; |
---|
207 | 246 | |
---|
208 | 247 | struct dw_pcie_ops { |
---|
.. | .. |
---|
211 | 250 | size_t size); |
---|
212 | 251 | void (*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg, |
---|
213 | 252 | size_t size, u32 val); |
---|
| 253 | + void (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg, |
---|
| 254 | + size_t size, u32 val); |
---|
214 | 255 | int (*link_up)(struct dw_pcie *pcie); |
---|
215 | 256 | int (*start_link)(struct dw_pcie *pcie); |
---|
216 | 257 | void (*stop_link)(struct dw_pcie *pcie); |
---|
217 | 258 | }; |
---|
218 | 259 | |
---|
| 260 | +#define DWC_IATU_UNROLL_EN BIT(0) |
---|
| 261 | +#define DWC_IATU_IOCFG_SHARED BIT(1) |
---|
219 | 262 | struct dw_pcie { |
---|
220 | 263 | struct device *dev; |
---|
221 | 264 | void __iomem *dbi_base; |
---|
222 | 265 | void __iomem *dbi_base2; |
---|
| 266 | + /* Used when iatu_unroll_enabled is true */ |
---|
| 267 | + void __iomem *atu_base; |
---|
223 | 268 | u32 num_viewport; |
---|
| 269 | + u8 iatu_unroll_enabled; |
---|
224 | 270 | struct pcie_port pp; |
---|
225 | 271 | struct dw_pcie_ep ep; |
---|
226 | 272 | const struct dw_pcie_ops *ops; |
---|
| 273 | + unsigned int version; |
---|
| 274 | + int num_lanes; |
---|
227 | 275 | int link_gen; |
---|
228 | 276 | u8 n_fts[2]; |
---|
229 | | - bool iatu_unroll_enabled: 1; |
---|
230 | | - bool io_cfg_atu_shared: 1; |
---|
231 | 277 | }; |
---|
232 | 278 | |
---|
233 | 279 | #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp) |
---|
.. | .. |
---|
236 | 282 | container_of((endpoint), struct dw_pcie, ep) |
---|
237 | 283 | |
---|
238 | 284 | u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap); |
---|
| 285 | +u16 dw_pcie_find_ext_capability(struct dw_pcie *pci, u8 cap); |
---|
| 286 | + |
---|
239 | 287 | int dw_pcie_read(void __iomem *addr, int size, u32 *val); |
---|
240 | 288 | int dw_pcie_write(void __iomem *addr, int size, u32 val); |
---|
241 | 289 | |
---|
242 | | -u32 __dw_pcie_read_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, |
---|
243 | | - size_t size); |
---|
244 | | -void __dw_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base, u32 reg, |
---|
245 | | - size_t size, u32 val); |
---|
| 290 | +u32 dw_pcie_read_dbi(struct dw_pcie *pci, u32 reg, size_t size); |
---|
| 291 | +void dw_pcie_write_dbi(struct dw_pcie *pci, u32 reg, size_t size, u32 val); |
---|
| 292 | +void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val); |
---|
246 | 293 | int dw_pcie_link_up(struct dw_pcie *pci); |
---|
| 294 | +void dw_pcie_upconfig_setup(struct dw_pcie *pci); |
---|
247 | 295 | int dw_pcie_wait_for_link(struct dw_pcie *pci); |
---|
248 | 296 | void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, |
---|
249 | 297 | int type, u64 cpu_addr, u64 pci_addr, |
---|
250 | 298 | u32 size); |
---|
251 | | -int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int bar, |
---|
252 | | - u64 cpu_addr, enum dw_pcie_as_type as_type); |
---|
| 299 | +void dw_pcie_prog_ep_outbound_atu(struct dw_pcie *pci, u8 func_no, int index, |
---|
| 300 | + int type, u64 cpu_addr, u64 pci_addr, |
---|
| 301 | + u32 size); |
---|
| 302 | +int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, u8 func_no, int index, |
---|
| 303 | + int bar, u64 cpu_addr, |
---|
| 304 | + enum dw_pcie_as_type as_type); |
---|
253 | 305 | void dw_pcie_disable_atu(struct dw_pcie *pci, int index, |
---|
254 | 306 | enum dw_pcie_region_type type); |
---|
255 | 307 | void dw_pcie_setup(struct dw_pcie *pci); |
---|
256 | 308 | |
---|
257 | 309 | static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) |
---|
258 | 310 | { |
---|
259 | | - __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x4, val); |
---|
| 311 | + dw_pcie_write_dbi(pci, reg, 0x4, val); |
---|
260 | 312 | } |
---|
261 | 313 | |
---|
262 | 314 | static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg) |
---|
263 | 315 | { |
---|
264 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x4); |
---|
| 316 | + return dw_pcie_read_dbi(pci, reg, 0x4); |
---|
265 | 317 | } |
---|
266 | 318 | |
---|
267 | 319 | static inline void dw_pcie_writew_dbi(struct dw_pcie *pci, u32 reg, u16 val) |
---|
268 | 320 | { |
---|
269 | | - __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x2, val); |
---|
| 321 | + dw_pcie_write_dbi(pci, reg, 0x2, val); |
---|
270 | 322 | } |
---|
271 | 323 | |
---|
272 | 324 | static inline u16 dw_pcie_readw_dbi(struct dw_pcie *pci, u32 reg) |
---|
273 | 325 | { |
---|
274 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x2); |
---|
| 326 | + return dw_pcie_read_dbi(pci, reg, 0x2); |
---|
275 | 327 | } |
---|
276 | 328 | |
---|
277 | 329 | static inline void dw_pcie_writeb_dbi(struct dw_pcie *pci, u32 reg, u8 val) |
---|
278 | 330 | { |
---|
279 | | - __dw_pcie_write_dbi(pci, pci->dbi_base, reg, 0x1, val); |
---|
| 331 | + dw_pcie_write_dbi(pci, reg, 0x1, val); |
---|
280 | 332 | } |
---|
281 | 333 | |
---|
282 | 334 | static inline u8 dw_pcie_readb_dbi(struct dw_pcie *pci, u32 reg) |
---|
283 | 335 | { |
---|
284 | | - return __dw_pcie_read_dbi(pci, pci->dbi_base, reg, 0x1); |
---|
| 336 | + return dw_pcie_read_dbi(pci, reg, 0x1); |
---|
285 | 337 | } |
---|
286 | 338 | |
---|
287 | 339 | static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val) |
---|
288 | 340 | { |
---|
289 | | - __dw_pcie_write_dbi(pci, pci->dbi_base2, reg, 0x4, val); |
---|
290 | | -} |
---|
291 | | - |
---|
292 | | -static 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); |
---|
| 341 | + dw_pcie_write_dbi2(pci, reg, 0x4, val); |
---|
295 | 342 | } |
---|
296 | 343 | |
---|
297 | 344 | static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci) |
---|
.. | .. |
---|
322 | 369 | void dw_pcie_free_msi(struct pcie_port *pp); |
---|
323 | 370 | void dw_pcie_setup_rc(struct pcie_port *pp); |
---|
324 | 371 | int dw_pcie_host_init(struct pcie_port *pp); |
---|
| 372 | +void dw_pcie_host_deinit(struct pcie_port *pp); |
---|
325 | 373 | int dw_pcie_allocate_domains(struct pcie_port *pp); |
---|
| 374 | +void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus, unsigned int devfn, |
---|
| 375 | + int where); |
---|
326 | 376 | #else |
---|
327 | 377 | static inline irqreturn_t dw_handle_msi_irq(struct pcie_port *pp) |
---|
328 | 378 | { |
---|
.. | .. |
---|
346 | 396 | return 0; |
---|
347 | 397 | } |
---|
348 | 398 | |
---|
| 399 | +static inline void dw_pcie_host_deinit(struct pcie_port *pp) |
---|
| 400 | +{ |
---|
| 401 | +} |
---|
| 402 | + |
---|
349 | 403 | static inline int dw_pcie_allocate_domains(struct pcie_port *pp) |
---|
350 | 404 | { |
---|
351 | 405 | return 0; |
---|
| 406 | +} |
---|
| 407 | +static inline void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus, |
---|
| 408 | + unsigned int devfn, |
---|
| 409 | + int where) |
---|
| 410 | +{ |
---|
| 411 | + return NULL; |
---|
352 | 412 | } |
---|
353 | 413 | #endif |
---|
354 | 414 | |
---|
355 | 415 | #ifdef CONFIG_PCIE_DW_EP |
---|
356 | 416 | void dw_pcie_ep_linkup(struct dw_pcie_ep *ep); |
---|
357 | 417 | int dw_pcie_ep_init(struct dw_pcie_ep *ep); |
---|
| 418 | +int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep); |
---|
| 419 | +void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep); |
---|
358 | 420 | void dw_pcie_ep_exit(struct dw_pcie_ep *ep); |
---|
359 | 421 | int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no); |
---|
360 | 422 | int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no, |
---|
361 | 423 | u8 interrupt_num); |
---|
362 | 424 | int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no, |
---|
363 | 425 | u16 interrupt_num); |
---|
| 426 | +int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, u8 func_no, |
---|
| 427 | + u16 interrupt_num); |
---|
364 | 428 | void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar); |
---|
| 429 | +struct dw_pcie_ep_func * |
---|
| 430 | +dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no); |
---|
365 | 431 | #else |
---|
366 | 432 | static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep) |
---|
367 | 433 | { |
---|
.. | .. |
---|
370 | 436 | static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep) |
---|
371 | 437 | { |
---|
372 | 438 | return 0; |
---|
| 439 | +} |
---|
| 440 | + |
---|
| 441 | +static inline int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep) |
---|
| 442 | +{ |
---|
| 443 | + return 0; |
---|
| 444 | +} |
---|
| 445 | + |
---|
| 446 | +static inline void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep) |
---|
| 447 | +{ |
---|
373 | 448 | } |
---|
374 | 449 | |
---|
375 | 450 | static inline void dw_pcie_ep_exit(struct dw_pcie_ep *ep) |
---|
.. | .. |
---|
393 | 468 | return 0; |
---|
394 | 469 | } |
---|
395 | 470 | |
---|
| 471 | +static inline int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, |
---|
| 472 | + u8 func_no, |
---|
| 473 | + u16 interrupt_num) |
---|
| 474 | +{ |
---|
| 475 | + return 0; |
---|
| 476 | +} |
---|
| 477 | + |
---|
396 | 478 | static inline void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar) |
---|
397 | 479 | { |
---|
398 | 480 | } |
---|
| 481 | + |
---|
| 482 | +static inline struct dw_pcie_ep_func * |
---|
| 483 | +dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no) |
---|
| 484 | +{ |
---|
| 485 | + return NULL; |
---|
| 486 | +} |
---|
399 | 487 | #endif |
---|
400 | 488 | #endif /* _PCIE_DESIGNWARE_H */ |
---|