xref: /openbmc/linux/drivers/net/ipa/ipa.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1cdf2e941SAlex Elder /* SPDX-License-Identifier: GPL-2.0 */
2cdf2e941SAlex Elder 
3cdf2e941SAlex Elder /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
4a4388da5SAlex Elder  * Copyright (C) 2018-2022 Linaro Ltd.
5cdf2e941SAlex Elder  */
6cdf2e941SAlex Elder #ifndef _IPA_H_
7cdf2e941SAlex Elder #define _IPA_H_
8cdf2e941SAlex Elder 
9cdf2e941SAlex Elder #include <linux/types.h>
10cdf2e941SAlex Elder #include <linux/device.h>
11cdf2e941SAlex Elder #include <linux/notifier.h>
12cdf2e941SAlex Elder #include <linux/pm_wakeup.h>
13cdf2e941SAlex Elder 
14cdf2e941SAlex Elder #include "ipa_version.h"
15cdf2e941SAlex Elder #include "gsi.h"
16cdf2e941SAlex Elder #include "ipa_mem.h"
17cdf2e941SAlex Elder #include "ipa_qmi.h"
18cdf2e941SAlex Elder #include "ipa_endpoint.h"
19cdf2e941SAlex Elder #include "ipa_interrupt.h"
20cdf2e941SAlex Elder 
21cdf2e941SAlex Elder struct clk;
22cdf2e941SAlex Elder struct icc_path;
23cdf2e941SAlex Elder struct net_device;
24cdf2e941SAlex Elder struct platform_device;
25cdf2e941SAlex Elder 
267aa0e8b8SAlex Elder struct ipa_power;
27cdf2e941SAlex Elder struct ipa_smp2p;
28cdf2e941SAlex Elder struct ipa_interrupt;
29cdf2e941SAlex Elder 
30cdf2e941SAlex Elder /**
31cdf2e941SAlex Elder  * struct ipa - IPA information
32cdf2e941SAlex Elder  * @gsi:		Embedded GSI structure
33cdf2e941SAlex Elder  * @version:		IPA hardware version
34cdf2e941SAlex Elder  * @pdev:		Platform device
3551c48ce2SAlex Elder  * @completion:		Used to signal pipeline clear transfer complete
36862d3f2cSAlex Elder  * @nb:			Notifier block used for remoteproc SSR
37862d3f2cSAlex Elder  * @notifier:		Remoteproc SSR notifier
38cdf2e941SAlex Elder  * @smp2p:		SMP2P information
397aa0e8b8SAlex Elder  * @power:		IPA power information
40cdf2e941SAlex Elder  * @table_addr:		DMA address of filter/route table content
41cdf2e941SAlex Elder  * @table_virt:		Virtual address of filter/route table content
42fc094058SAlex Elder  * @route_count:	Total number of entries in a routing table
438defab8bSAlex Elder  * @modem_route_count:	Number of modem entries in a routing table
44f787d848SAlex Elder  * @filter_count:	Maximum number of entries in a filter table
45cdf2e941SAlex Elder  * @interrupt:		IPA Interrupt information
467aa0e8b8SAlex Elder  * @uc_powered:		true if power is active by proxy for microcontroller
47cdf2e941SAlex Elder  * @uc_loaded:		true after microcontroller has reported it's ready
48cdf2e941SAlex Elder  * @reg_virt:		Virtual address used for IPA register access
4907f120bcSAlex Elder  * @regs:		IPA register definitions
50cdf2e941SAlex Elder  * @mem_addr:		DMA address of IPA-local memory space
51cdf2e941SAlex Elder  * @mem_virt:		Virtual address of IPA-local memory space
52cdf2e941SAlex Elder  * @mem_offset:		Offset from @mem_virt used for access to IPA memory
53cdf2e941SAlex Elder  * @mem_size:		Total size (bytes) of memory at @mem_virt
54440c3247SAlex Elder  * @mem_count:		Number of entries in the mem array
55cdf2e941SAlex Elder  * @mem:		Array of IPA-local memory region descriptors
563e313c3fSAlex Elder  * @imem_iova:		I/O virtual address of IPA region in IMEM
57862d3f2cSAlex Elder  * @imem_size:		Size of IMEM region
58a0036bb4SAlex Elder  * @smem_iova:		I/O virtual address of IPA region in SMEM
59862d3f2cSAlex Elder  * @smem_size:		Size of SMEM region
60cdf2e941SAlex Elder  * @zero_addr:		DMA address of preallocated zero-filled memory
61cdf2e941SAlex Elder  * @zero_virt:		Virtual address of preallocated zero-filled memory
62cdf2e941SAlex Elder  * @zero_size:		Size (bytes) of preallocated zero-filled memory
6388de7672SAlex Elder  * @endpoint_count:	Number of defined bits in most bitmaps below
6488de7672SAlex Elder  * @available_count:	Number of defined bits in the available bitmap
659a9f5129SAlex Elder  * @defined:		Bitmap of endpoints defined in config data
6688de7672SAlex Elder  * @available:		Bitmap of endpoints supported by hardware
670f97fbd4SAlex Elder  * @filtered:		Bitmap of endpoints that support filtering
68ae5108e9SAlex Elder  * @set_up:		Bitmap of endpoints that are set up for use
699b7a0065SAlex Elder  * @enabled:		Bitmap of currently enabled endpoints
702091c79aSAlex Elder  * @modem_tx_count:	Number of defined modem TX endoints
71cdf2e941SAlex Elder  * @endpoint:		Array of endpoint information
72cdf2e941SAlex Elder  * @channel_map:	Mapping of GSI channel to IPA endpoint
73cdf2e941SAlex Elder  * @name_map:		Mapping of IPA endpoint name to IPA endpoint
74cdf2e941SAlex Elder  * @setup_complete:	Flag indicating whether setup stage has completed
75cdf2e941SAlex Elder  * @modem_state:	State of modem (stopped, running)
76cdf2e941SAlex Elder  * @modem_netdev:	Network device structure used for modem
77cdf2e941SAlex Elder  * @qmi:		QMI information
78cdf2e941SAlex Elder  */
79cdf2e941SAlex Elder struct ipa {
80cdf2e941SAlex Elder 	struct gsi gsi;
81cdf2e941SAlex Elder 	enum ipa_version version;
82cdf2e941SAlex Elder 	struct platform_device *pdev;
8351c48ce2SAlex Elder 	struct completion completion;
8430eb3fbeSAlex Elder 	struct notifier_block nb;
8530eb3fbeSAlex Elder 	void *notifier;
86cdf2e941SAlex Elder 	struct ipa_smp2p *smp2p;
877aa0e8b8SAlex Elder 	struct ipa_power *power;
88cdf2e941SAlex Elder 
89cdf2e941SAlex Elder 	dma_addr_t table_addr;
90cdf2e941SAlex Elder 	__le64 *table_virt;
91fc094058SAlex Elder 	u32 route_count;
928defab8bSAlex Elder 	u32 modem_route_count;
93f787d848SAlex Elder 	u32 filter_count;
94cdf2e941SAlex Elder 
95cdf2e941SAlex Elder 	struct ipa_interrupt *interrupt;
967aa0e8b8SAlex Elder 	bool uc_powered;
97cdf2e941SAlex Elder 	bool uc_loaded;
98cdf2e941SAlex Elder 
99cdf2e941SAlex Elder 	void __iomem *reg_virt;
100*81772e44SAlex Elder 	const struct regs *regs;
101cdf2e941SAlex Elder 
102cdf2e941SAlex Elder 	dma_addr_t mem_addr;
103cdf2e941SAlex Elder 	void *mem_virt;
104cdf2e941SAlex Elder 	u32 mem_offset;
105cdf2e941SAlex Elder 	u32 mem_size;
106440c3247SAlex Elder 	u32 mem_count;
107cdf2e941SAlex Elder 	const struct ipa_mem *mem;
108cdf2e941SAlex Elder 
1093e313c3fSAlex Elder 	unsigned long imem_iova;
1103e313c3fSAlex Elder 	size_t imem_size;
1113e313c3fSAlex Elder 
112a0036bb4SAlex Elder 	unsigned long smem_iova;
113a0036bb4SAlex Elder 	size_t smem_size;
114a0036bb4SAlex Elder 
115cdf2e941SAlex Elder 	dma_addr_t zero_addr;
116cdf2e941SAlex Elder 	void *zero_virt;
117cdf2e941SAlex Elder 	size_t zero_size;
118cdf2e941SAlex Elder 
1199a9f5129SAlex Elder 	/* Bitmaps indicating endpoint state */
120b7aaff0bSAlex Elder 	u32 endpoint_count;
12188de7672SAlex Elder 	u32 available_count;
1229a9f5129SAlex Elder 	unsigned long *defined;		/* Defined in configuration data */
12388de7672SAlex Elder 	unsigned long *available;	/* Supported by hardware */
1240f97fbd4SAlex Elder 	u64 filtered;			/* Support filtering (AP and modem) */
125ae5108e9SAlex Elder 	unsigned long *set_up;
1269b7a0065SAlex Elder 	unsigned long *enabled;
127cdf2e941SAlex Elder 
1282091c79aSAlex Elder 	u32 modem_tx_count;
129cdf2e941SAlex Elder 	struct ipa_endpoint endpoint[IPA_ENDPOINT_MAX];
130cdf2e941SAlex Elder 	struct ipa_endpoint *channel_map[GSI_CHANNEL_COUNT_MAX];
131cdf2e941SAlex Elder 	struct ipa_endpoint *name_map[IPA_ENDPOINT_COUNT];
132cdf2e941SAlex Elder 
133cdf2e941SAlex Elder 	bool setup_complete;
134cdf2e941SAlex Elder 
135cdf2e941SAlex Elder 	atomic_t modem_state;		/* enum ipa_modem_state */
136cdf2e941SAlex Elder 	struct net_device *modem_netdev;
137cdf2e941SAlex Elder 	struct ipa_qmi qmi;
138cdf2e941SAlex Elder };
139cdf2e941SAlex Elder 
140cdf2e941SAlex Elder /**
141cdf2e941SAlex Elder  * ipa_setup() - Perform IPA setup
142cdf2e941SAlex Elder  * @ipa:		IPA pointer
143cdf2e941SAlex Elder  *
144cdf2e941SAlex Elder  * IPA initialization is broken into stages:  init; config; and setup.
145cdf2e941SAlex Elder  * (These have inverses exit, deconfig, and teardown.)
146cdf2e941SAlex Elder  *
147cdf2e941SAlex Elder  * Activities performed at the init stage can be done without requiring
148cdf2e941SAlex Elder  * any access to IPA hardware.  Activities performed at the config stage
1497aa0e8b8SAlex Elder  * require IPA power, because they involve access to IPA registers.
1507aa0e8b8SAlex Elder  * The setup stage is performed only after the GSI hardware is ready
1517aa0e8b8SAlex Elder  * (more on this below).  The setup stage allows the AP to perform
1527aa0e8b8SAlex Elder  * more complex initialization by issuing "immediate commands" using
1537aa0e8b8SAlex Elder  * a special interface to the IPA.
154cdf2e941SAlex Elder  *
155cdf2e941SAlex Elder  * This function, @ipa_setup(), starts the setup stage.
156cdf2e941SAlex Elder  *
157cdf2e941SAlex Elder  * In order for the GSI hardware to be functional it needs firmware to be
158cdf2e941SAlex Elder  * loaded (in addition to some other low-level initialization).  This early
159cdf2e941SAlex Elder  * GSI initialization can be done either by Trust Zone on the AP or by the
160cdf2e941SAlex Elder  * modem.
161cdf2e941SAlex Elder  *
162cdf2e941SAlex Elder  * If it's done by Trust Zone, the AP loads the GSI firmware and supplies
163cdf2e941SAlex Elder  * it to Trust Zone to verify and install.  When this completes, if
164cdf2e941SAlex Elder  * verification was successful, the GSI layer is ready and ipa_setup()
165cdf2e941SAlex Elder  * implements the setup phase of initialization.
166cdf2e941SAlex Elder  *
167cdf2e941SAlex Elder  * If the modem performs early GSI initialization, the AP needs to know
168cdf2e941SAlex Elder  * when this has occurred.  An SMP2P interrupt is used for this purpose,
169cdf2e941SAlex Elder  * and receipt of that interrupt triggers the call to ipa_setup().
170cdf2e941SAlex Elder  */
171cdf2e941SAlex Elder int ipa_setup(struct ipa *ipa);
172cdf2e941SAlex Elder 
173cdf2e941SAlex Elder #endif /* _IPA_H_ */
174