]>
Commit | Line | Data |
---|---|---|
cdf2e941 AE |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. | |
4 | * Copyright (C) 2018-2020 Linaro Ltd. | |
5 | */ | |
6 | #ifndef _IPA_H_ | |
7 | #define _IPA_H_ | |
8 | ||
9 | #include <linux/types.h> | |
10 | #include <linux/device.h> | |
11 | #include <linux/notifier.h> | |
12 | #include <linux/pm_wakeup.h> | |
13 | ||
14 | #include "ipa_version.h" | |
15 | #include "gsi.h" | |
16 | #include "ipa_mem.h" | |
17 | #include "ipa_qmi.h" | |
18 | #include "ipa_endpoint.h" | |
19 | #include "ipa_interrupt.h" | |
20 | ||
21 | struct clk; | |
22 | struct icc_path; | |
23 | struct net_device; | |
24 | struct platform_device; | |
25 | ||
26 | struct ipa_clock; | |
27 | struct ipa_smp2p; | |
28 | struct ipa_interrupt; | |
29 | ||
2b09841c AE |
30 | /** |
31 | * enum ipa_flag - IPA state flags | |
3c6ccdde AE |
32 | * @IPA_FLAG_RESUMED: Whether resume from suspend has been signaled |
33 | * @IPA_FLAG_COUNT: Number of defined IPA flags | |
2b09841c AE |
34 | */ |
35 | enum ipa_flag { | |
3c6ccdde | 36 | IPA_FLAG_RESUMED, |
2b09841c AE |
37 | IPA_FLAG_COUNT, /* Last; not a flag */ |
38 | }; | |
39 | ||
cdf2e941 AE |
40 | /** |
41 | * struct ipa - IPA information | |
42 | * @gsi: Embedded GSI structure | |
2b09841c | 43 | * @flags: Boolean state flags |
cdf2e941 AE |
44 | * @version: IPA hardware version |
45 | * @pdev: Platform device | |
46 | * @modem_rproc: Remoteproc handle for modem subsystem | |
47 | * @smp2p: SMP2P information | |
48 | * @clock: IPA clocking information | |
cdf2e941 AE |
49 | * @table_addr: DMA address of filter/route table content |
50 | * @table_virt: Virtual address of filter/route table content | |
51 | * @interrupt: IPA Interrupt information | |
52 | * @uc_loaded: true after microcontroller has reported it's ready | |
53 | * @reg_addr: DMA address used for IPA register access | |
54 | * @reg_virt: Virtual address used for IPA register access | |
55 | * @mem_addr: DMA address of IPA-local memory space | |
56 | * @mem_virt: Virtual address of IPA-local memory space | |
57 | * @mem_offset: Offset from @mem_virt used for access to IPA memory | |
58 | * @mem_size: Total size (bytes) of memory at @mem_virt | |
59 | * @mem: Array of IPA-local memory region descriptors | |
3e313c3f AE |
60 | * @imem_iova: I/O virtual address of IPA region in IMEM |
61 | * @imem_size; Size of IMEM region | |
a0036bb4 AE |
62 | * @smem_iova: I/O virtual address of IPA region in SMEM |
63 | * @smem_size; Size of SMEM region | |
cdf2e941 AE |
64 | * @zero_addr: DMA address of preallocated zero-filled memory |
65 | * @zero_virt: Virtual address of preallocated zero-filled memory | |
66 | * @zero_size: Size (bytes) of preallocated zero-filled memory | |
67 | * @wakeup_source: Wakeup source information | |
68 | * @available: Bit mask indicating endpoints hardware supports | |
69 | * @filter_map: Bit mask indicating endpoints that support filtering | |
70 | * @initialized: Bit mask indicating endpoints initialized | |
71 | * @set_up: Bit mask indicating endpoints set up | |
72 | * @enabled: Bit mask indicating endpoints enabled | |
73 | * @endpoint: Array of endpoint information | |
74 | * @channel_map: Mapping of GSI channel to IPA endpoint | |
75 | * @name_map: Mapping of IPA endpoint name to IPA endpoint | |
76 | * @setup_complete: Flag indicating whether setup stage has completed | |
77 | * @modem_state: State of modem (stopped, running) | |
78 | * @modem_netdev: Network device structure used for modem | |
79 | * @qmi: QMI information | |
80 | */ | |
81 | struct ipa { | |
82 | struct gsi gsi; | |
2b09841c | 83 | DECLARE_BITMAP(flags, IPA_FLAG_COUNT); |
cdf2e941 AE |
84 | enum ipa_version version; |
85 | struct platform_device *pdev; | |
86 | struct rproc *modem_rproc; | |
30eb3fbe AE |
87 | struct notifier_block nb; |
88 | void *notifier; | |
cdf2e941 AE |
89 | struct ipa_smp2p *smp2p; |
90 | struct ipa_clock *clock; | |
cdf2e941 AE |
91 | |
92 | dma_addr_t table_addr; | |
93 | __le64 *table_virt; | |
94 | ||
95 | struct ipa_interrupt *interrupt; | |
96 | bool uc_loaded; | |
97 | ||
98 | dma_addr_t reg_addr; | |
99 | void __iomem *reg_virt; | |
100 | ||
101 | dma_addr_t mem_addr; | |
102 | void *mem_virt; | |
103 | u32 mem_offset; | |
104 | u32 mem_size; | |
105 | const struct ipa_mem *mem; | |
106 | ||
3e313c3f AE |
107 | unsigned long imem_iova; |
108 | size_t imem_size; | |
a0036bb4 AE |
109 | |
110 | unsigned long smem_iova; | |
111 | size_t smem_size; | |
3e313c3f | 112 | |
cdf2e941 AE |
113 | dma_addr_t zero_addr; |
114 | void *zero_virt; | |
115 | size_t zero_size; | |
116 | ||
cdf2e941 AE |
117 | /* Bit masks indicating endpoint state */ |
118 | u32 available; /* supported by hardware */ | |
119 | u32 filter_map; | |
120 | u32 initialized; | |
121 | u32 set_up; | |
122 | u32 enabled; | |
123 | ||
124 | struct ipa_endpoint endpoint[IPA_ENDPOINT_MAX]; | |
125 | struct ipa_endpoint *channel_map[GSI_CHANNEL_COUNT_MAX]; | |
126 | struct ipa_endpoint *name_map[IPA_ENDPOINT_COUNT]; | |
127 | ||
128 | bool setup_complete; | |
129 | ||
130 | atomic_t modem_state; /* enum ipa_modem_state */ | |
131 | struct net_device *modem_netdev; | |
132 | struct ipa_qmi qmi; | |
133 | }; | |
134 | ||
135 | /** | |
136 | * ipa_setup() - Perform IPA setup | |
137 | * @ipa: IPA pointer | |
138 | * | |
139 | * IPA initialization is broken into stages: init; config; and setup. | |
140 | * (These have inverses exit, deconfig, and teardown.) | |
141 | * | |
142 | * Activities performed at the init stage can be done without requiring | |
143 | * any access to IPA hardware. Activities performed at the config stage | |
144 | * require the IPA clock to be running, because they involve access | |
145 | * to IPA registers. The setup stage is performed only after the GSI | |
146 | * hardware is ready (more on this below). The setup stage allows | |
147 | * the AP to perform more complex initialization by issuing "immediate | |
148 | * commands" using a special interface to the IPA. | |
149 | * | |
150 | * This function, @ipa_setup(), starts the setup stage. | |
151 | * | |
152 | * In order for the GSI hardware to be functional it needs firmware to be | |
153 | * loaded (in addition to some other low-level initialization). This early | |
154 | * GSI initialization can be done either by Trust Zone on the AP or by the | |
155 | * modem. | |
156 | * | |
157 | * If it's done by Trust Zone, the AP loads the GSI firmware and supplies | |
158 | * it to Trust Zone to verify and install. When this completes, if | |
159 | * verification was successful, the GSI layer is ready and ipa_setup() | |
160 | * implements the setup phase of initialization. | |
161 | * | |
162 | * If the modem performs early GSI initialization, the AP needs to know | |
163 | * when this has occurred. An SMP2P interrupt is used for this purpose, | |
164 | * and receipt of that interrupt triggers the call to ipa_setup(). | |
165 | */ | |
166 | int ipa_setup(struct ipa *ipa); | |
167 | ||
168 | #endif /* _IPA_H_ */ |