Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * PLDA PCIe host controller driver
  4 */
  5
  6#ifndef _PCIE_PLDA_H
  7#define _PCIE_PLDA_H
  8
  9/* Number of MSI IRQs */
 10#define PLDA_MAX_NUM_MSI_IRQS			32
 11
 12/* PCIe Bridge Phy Regs */
 13#define GEN_SETTINGS				0x80
 14#define  RP_ENABLE				1
 15#define PCIE_PCI_IDS_DW1			0x9c
 16#define  IDS_CLASS_CODE_SHIFT			16
 17#define  REVISION_ID_MASK			GENMASK(7, 0)
 18#define  CLASS_CODE_ID_MASK			GENMASK(31, 8)
 19#define PCIE_PCI_IRQ_DW0			0xa8
 20#define  MSIX_CAP_MASK				BIT(31)
 21#define  NUM_MSI_MSGS_MASK			GENMASK(6, 4)
 22#define  NUM_MSI_MSGS_SHIFT			4
 23#define PCI_MISC				0xb4
 24#define  PHY_FUNCTION_DIS			BIT(15)
 25#define PCIE_WINROM				0xfc
 26#define  PREF_MEM_WIN_64_SUPPORT		BIT(3)
 27
 28#define IMASK_LOCAL				0x180
 29#define  DMA_END_ENGINE_0_MASK			0x00000000u
 30#define  DMA_END_ENGINE_0_SHIFT			0
 31#define  DMA_END_ENGINE_1_MASK			0x00000000u
 32#define  DMA_END_ENGINE_1_SHIFT			1
 33#define  DMA_ERROR_ENGINE_0_MASK		0x00000100u
 34#define  DMA_ERROR_ENGINE_0_SHIFT		8
 35#define  DMA_ERROR_ENGINE_1_MASK		0x00000200u
 36#define  DMA_ERROR_ENGINE_1_SHIFT		9
 37#define  A_ATR_EVT_POST_ERR_MASK		0x00010000u
 38#define  A_ATR_EVT_POST_ERR_SHIFT		16
 39#define  A_ATR_EVT_FETCH_ERR_MASK		0x00020000u
 40#define  A_ATR_EVT_FETCH_ERR_SHIFT		17
 41#define  A_ATR_EVT_DISCARD_ERR_MASK		0x00040000u
 42#define  A_ATR_EVT_DISCARD_ERR_SHIFT		18
 43#define  A_ATR_EVT_DOORBELL_MASK		0x00000000u
 44#define  A_ATR_EVT_DOORBELL_SHIFT		19
 45#define  P_ATR_EVT_POST_ERR_MASK		0x00100000u
 46#define  P_ATR_EVT_POST_ERR_SHIFT		20
 47#define  P_ATR_EVT_FETCH_ERR_MASK		0x00200000u
 48#define  P_ATR_EVT_FETCH_ERR_SHIFT		21
 49#define  P_ATR_EVT_DISCARD_ERR_MASK		0x00400000u
 50#define  P_ATR_EVT_DISCARD_ERR_SHIFT		22
 51#define  P_ATR_EVT_DOORBELL_MASK		0x00000000u
 52#define  P_ATR_EVT_DOORBELL_SHIFT		23
 53#define  PM_MSI_INT_INTA_MASK			0x01000000u
 54#define  PM_MSI_INT_INTA_SHIFT			24
 55#define  PM_MSI_INT_INTB_MASK			0x02000000u
 56#define  PM_MSI_INT_INTB_SHIFT			25
 57#define  PM_MSI_INT_INTC_MASK			0x04000000u
 58#define  PM_MSI_INT_INTC_SHIFT			26
 59#define  PM_MSI_INT_INTD_MASK			0x08000000u
 60#define  PM_MSI_INT_INTD_SHIFT			27
 61#define  PM_MSI_INT_INTX_MASK			0x0f000000u
 62#define  PM_MSI_INT_INTX_SHIFT			24
 63#define  PM_MSI_INT_MSI_MASK			0x10000000u
 64#define  PM_MSI_INT_MSI_SHIFT			28
 65#define  PM_MSI_INT_AER_EVT_MASK		0x20000000u
 66#define  PM_MSI_INT_AER_EVT_SHIFT		29
 67#define  PM_MSI_INT_EVENTS_MASK			0x40000000u
 68#define  PM_MSI_INT_EVENTS_SHIFT		30
 69#define  PM_MSI_INT_SYS_ERR_MASK		0x80000000u
 70#define  PM_MSI_INT_SYS_ERR_SHIFT		31
 71#define  SYS_AND_MSI_MASK			GENMASK(31, 28)
 72#define  NUM_LOCAL_EVENTS			15
 73#define ISTATUS_LOCAL				0x184
 74#define IMASK_HOST				0x188
 75#define ISTATUS_HOST				0x18c
 76#define IMSI_ADDR				0x190
 77#define ISTATUS_MSI				0x194
 78#define PMSG_SUPPORT_RX				0x3f0
 79#define  PMSG_LTR_SUPPORT			BIT(2)
 80
 81/* PCIe Master table init defines */
 82#define ATR0_PCIE_WIN0_SRCADDR_PARAM		0x600u
 83#define  ATR0_PCIE_ATR_SIZE			0x25
 84#define  ATR0_PCIE_ATR_SIZE_SHIFT		1
 85#define ATR0_PCIE_WIN0_SRC_ADDR			0x604u
 86#define ATR0_PCIE_WIN0_TRSL_ADDR_LSB		0x608u
 87#define ATR0_PCIE_WIN0_TRSL_ADDR_UDW		0x60cu
 88#define ATR0_PCIE_WIN0_TRSL_PARAM		0x610u
 89
 90/* PCIe AXI slave table init defines */
 91#define ATR0_AXI4_SLV0_SRCADDR_PARAM		0x800u
 92#define  ATR_SIZE_MASK				GENMASK(6, 1)
 93#define  ATR_IMPL_ENABLE			BIT(0)
 94#define ATR0_AXI4_SLV0_SRC_ADDR			0x804u
 95#define ATR0_AXI4_SLV0_TRSL_ADDR_LSB		0x808u
 96#define ATR0_AXI4_SLV0_TRSL_ADDR_UDW		0x80cu
 97#define ATR0_AXI4_SLV0_TRSL_PARAM		0x810u
 98#define  PCIE_TX_RX_INTERFACE			0x00000000u
 99#define  PCIE_CONFIG_INTERFACE			0x00000001u
100#define  TRSL_ID_AXI4_MASTER_0			0x00000004u
101
102#define CONFIG_SPACE_ADDR_OFFSET		0x1000u
103
104#define ATR_ENTRY_SIZE				32
105
106enum plda_int_event {
107	PLDA_AXI_POST_ERR,
108	PLDA_AXI_FETCH_ERR,
109	PLDA_AXI_DISCARD_ERR,
110	PLDA_AXI_DOORBELL,
111	PLDA_PCIE_POST_ERR,
112	PLDA_PCIE_FETCH_ERR,
113	PLDA_PCIE_DISCARD_ERR,
114	PLDA_PCIE_DOORBELL,
115	PLDA_INTX,
116	PLDA_MSI,
117	PLDA_AER_EVENT,
118	PLDA_MISC_EVENTS,
119	PLDA_SYS_ERR,
120	PLDA_INT_EVENT_NUM
121};
122
123#define PLDA_NUM_DMA_EVENTS			16
124
125#define EVENT_PM_MSI_INT_INTX			(PLDA_NUM_DMA_EVENTS + PLDA_INTX)
126#define EVENT_PM_MSI_INT_MSI			(PLDA_NUM_DMA_EVENTS + PLDA_MSI)
127#define PLDA_MAX_EVENT_NUM			(PLDA_NUM_DMA_EVENTS + PLDA_INT_EVENT_NUM)
128
129/*
130 * PLDA interrupt register
131 *
132 * 31         27     23              15           7          0
133 * +--+--+--+-+------+-+-+-+-+-+-+-+-+-----------+-----------+
134 * |12|11|10|9| intx |7|6|5|4|3|2|1|0| DMA error | DMA end   |
135 * +--+--+--+-+------+-+-+-+-+-+-+-+-+-----------+-----------+
136 * event  bit
137 * 0-7   (0-7)   DMA interrupt end : reserved for vendor implement
138 * 8-15  (8-15)  DMA error : reserved for vendor implement
139 * 16    (16)    AXI post error (PLDA_AXI_POST_ERR)
140 * 17    (17)    AXI fetch error (PLDA_AXI_FETCH_ERR)
141 * 18    (18)    AXI discard error (PLDA_AXI_DISCARD_ERR)
142 * 19    (19)    AXI doorbell (PLDA_PCIE_DOORBELL)
143 * 20    (20)    PCIe post error (PLDA_PCIE_POST_ERR)
144 * 21    (21)    PCIe fetch error (PLDA_PCIE_FETCH_ERR)
145 * 22    (22)    PCIe discard error (PLDA_PCIE_DISCARD_ERR)
146 * 23    (23)    PCIe doorbell (PLDA_PCIE_DOORBELL)
147 * 24    (27-24) INTx interruts (PLDA_INTX)
148 * 25    (28):   MSI interrupt (PLDA_MSI)
149 * 26    (29):   AER event (PLDA_AER_EVENT)
150 * 27    (30):   PM/LTR/Hotplug (PLDA_MISC_EVENTS)
151 * 28    (31):   System error (PLDA_SYS_ERR)
152 */
153
154struct plda_pcie_rp;
155
156struct plda_event_ops {
157	u32 (*get_events)(struct plda_pcie_rp *pcie);
158};
159
160struct plda_pcie_host_ops {
161	int (*host_init)(struct plda_pcie_rp *pcie);
162	void (*host_deinit)(struct plda_pcie_rp *pcie);
163};
164
165struct plda_msi {
166	struct mutex lock;		/* Protect used bitmap */
167	struct irq_domain *msi_domain;
168	struct irq_domain *dev_domain;
169	u32 num_vectors;
170	u64 vector_phy;
171	DECLARE_BITMAP(used, PLDA_MAX_NUM_MSI_IRQS);
172};
173
174struct plda_pcie_rp {
175	struct device *dev;
176	struct pci_host_bridge *bridge;
177	struct irq_domain *intx_domain;
178	struct irq_domain *event_domain;
179	raw_spinlock_t lock;
180	struct plda_msi msi;
181	const struct plda_event_ops *event_ops;
182	const struct irq_chip *event_irq_chip;
183	const struct plda_pcie_host_ops *host_ops;
184	void __iomem *bridge_addr;
185	void __iomem *config_base;
186	unsigned long events_bitmap;
187	int irq;
188	int msi_irq;
189	int intx_irq;
190	int num_events;
191};
192
193struct plda_event {
194	int (*request_event_irq)(struct plda_pcie_rp *pcie,
195				 int event_irq, int event);
196	int intx_event;
197	int msi_event;
198};
199
200void __iomem *plda_pcie_map_bus(struct pci_bus *bus, unsigned int devfn,
201				int where);
202int plda_init_interrupts(struct platform_device *pdev,
203			 struct plda_pcie_rp *port,
204			 const struct plda_event *event);
205void plda_pcie_setup_window(void __iomem *bridge_base_addr, u32 index,
206			    phys_addr_t axi_addr, phys_addr_t pci_addr,
207			    size_t size);
208void plda_pcie_setup_inbound_address_translation(struct plda_pcie_rp *port);
209int plda_pcie_setup_iomems(struct pci_host_bridge *bridge,
210			   struct plda_pcie_rp *port);
211int plda_pcie_host_init(struct plda_pcie_rp *port, struct pci_ops *ops,
212			const struct plda_event *plda_event);
213void plda_pcie_host_deinit(struct plda_pcie_rp *pcie);
214
215static inline void plda_set_default_msi(struct plda_msi *msi)
216{
217	msi->vector_phy = IMSI_ADDR;
218	msi->num_vectors = PLDA_MAX_NUM_MSI_IRQS;
219}
220
221static inline void plda_pcie_enable_root_port(struct plda_pcie_rp *plda)
222{
223	u32 value;
224
225	value = readl_relaxed(plda->bridge_addr + GEN_SETTINGS);
226	value |= RP_ENABLE;
227	writel_relaxed(value, plda->bridge_addr + GEN_SETTINGS);
228}
229
230static inline void plda_pcie_set_standard_class(struct plda_pcie_rp *plda)
231{
232	u32 value;
233
234	/* set class code and reserve revision id */
235	value = readl_relaxed(plda->bridge_addr + PCIE_PCI_IDS_DW1);
236	value &= REVISION_ID_MASK;
237	value |= (PCI_CLASS_BRIDGE_PCI << IDS_CLASS_CODE_SHIFT);
238	writel_relaxed(value, plda->bridge_addr + PCIE_PCI_IDS_DW1);
239}
240
241static inline void plda_pcie_set_pref_win_64bit(struct plda_pcie_rp *plda)
242{
243	u32 value;
244
245	value = readl_relaxed(plda->bridge_addr + PCIE_WINROM);
246	value |= PREF_MEM_WIN_64_SUPPORT;
247	writel_relaxed(value, plda->bridge_addr + PCIE_WINROM);
248}
249
250static inline void plda_pcie_disable_ltr(struct plda_pcie_rp *plda)
251{
252	u32 value;
253
254	value = readl_relaxed(plda->bridge_addr + PMSG_SUPPORT_RX);
255	value &= ~PMSG_LTR_SUPPORT;
256	writel_relaxed(value, plda->bridge_addr + PMSG_SUPPORT_RX);
257}
258
259static inline void plda_pcie_disable_func(struct plda_pcie_rp *plda)
260{
261	u32 value;
262
263	value = readl_relaxed(plda->bridge_addr + PCI_MISC);
264	value |= PHY_FUNCTION_DIS;
265	writel_relaxed(value, plda->bridge_addr + PCI_MISC);
266}
267
268static inline void plda_pcie_write_rc_bar(struct plda_pcie_rp *plda, u64 val)
269{
270	void __iomem *addr = plda->bridge_addr + CONFIG_SPACE_ADDR_OFFSET;
271
272	writel_relaxed(lower_32_bits(val), addr + PCI_BASE_ADDRESS_0);
273	writel_relaxed(upper_32_bits(val), addr + PCI_BASE_ADDRESS_1);
274}
275#endif /* _PCIE_PLDA_H */