Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  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 */