1*25fedc02SBingbu Cao /* SPDX-License-Identifier: GPL-2.0-only */
2*25fedc02SBingbu Cao /* Copyright (C) 2013 - 2024 Intel Corporation */
3*25fedc02SBingbu Cao
4*25fedc02SBingbu Cao #ifndef IPU6_H
5*25fedc02SBingbu Cao #define IPU6_H
6*25fedc02SBingbu Cao
7*25fedc02SBingbu Cao #include <linux/list.h>
8*25fedc02SBingbu Cao #include <linux/pci.h>
9*25fedc02SBingbu Cao #include <linux/types.h>
10*25fedc02SBingbu Cao
11*25fedc02SBingbu Cao #include "ipu6-buttress.h"
12*25fedc02SBingbu Cao
13*25fedc02SBingbu Cao struct firmware;
14*25fedc02SBingbu Cao struct pci_dev;
15*25fedc02SBingbu Cao struct ipu6_bus_device;
16*25fedc02SBingbu Cao
17*25fedc02SBingbu Cao #define IPU6_NAME "intel-ipu6"
18*25fedc02SBingbu Cao #define IPU6_MEDIA_DEV_MODEL_NAME "ipu6"
19*25fedc02SBingbu Cao
20*25fedc02SBingbu Cao #define IPU6SE_FIRMWARE_NAME "intel/ipu/ipu6se_fw.bin"
21*25fedc02SBingbu Cao #define IPU6EP_FIRMWARE_NAME "intel/ipu/ipu6ep_fw.bin"
22*25fedc02SBingbu Cao #define IPU6_FIRMWARE_NAME "intel/ipu/ipu6_fw.bin"
23*25fedc02SBingbu Cao #define IPU6EPMTL_FIRMWARE_NAME "intel/ipu/ipu6epmtl_fw.bin"
24*25fedc02SBingbu Cao #define IPU6EPADLN_FIRMWARE_NAME "intel/ipu/ipu6epadln_fw.bin"
25*25fedc02SBingbu Cao
26*25fedc02SBingbu Cao enum ipu6_version {
27*25fedc02SBingbu Cao IPU6_VER_INVALID = 0,
28*25fedc02SBingbu Cao IPU6_VER_6 = 1,
29*25fedc02SBingbu Cao IPU6_VER_6SE = 3,
30*25fedc02SBingbu Cao IPU6_VER_6EP = 5,
31*25fedc02SBingbu Cao IPU6_VER_6EP_MTL = 6,
32*25fedc02SBingbu Cao };
33*25fedc02SBingbu Cao
34*25fedc02SBingbu Cao /*
35*25fedc02SBingbu Cao * IPU6 - TGL
36*25fedc02SBingbu Cao * IPU6SE - JSL
37*25fedc02SBingbu Cao * IPU6EP - ADL/RPL
38*25fedc02SBingbu Cao * IPU6EP_MTL - MTL
39*25fedc02SBingbu Cao */
is_ipu6se(u8 hw_ver)40*25fedc02SBingbu Cao static inline bool is_ipu6se(u8 hw_ver)
41*25fedc02SBingbu Cao {
42*25fedc02SBingbu Cao return hw_ver == IPU6_VER_6SE;
43*25fedc02SBingbu Cao }
44*25fedc02SBingbu Cao
is_ipu6ep(u8 hw_ver)45*25fedc02SBingbu Cao static inline bool is_ipu6ep(u8 hw_ver)
46*25fedc02SBingbu Cao {
47*25fedc02SBingbu Cao return hw_ver == IPU6_VER_6EP;
48*25fedc02SBingbu Cao }
49*25fedc02SBingbu Cao
is_ipu6ep_mtl(u8 hw_ver)50*25fedc02SBingbu Cao static inline bool is_ipu6ep_mtl(u8 hw_ver)
51*25fedc02SBingbu Cao {
52*25fedc02SBingbu Cao return hw_ver == IPU6_VER_6EP_MTL;
53*25fedc02SBingbu Cao }
54*25fedc02SBingbu Cao
is_ipu6_tgl(u8 hw_ver)55*25fedc02SBingbu Cao static inline bool is_ipu6_tgl(u8 hw_ver)
56*25fedc02SBingbu Cao {
57*25fedc02SBingbu Cao return hw_ver == IPU6_VER_6;
58*25fedc02SBingbu Cao }
59*25fedc02SBingbu Cao
60*25fedc02SBingbu Cao /*
61*25fedc02SBingbu Cao * ISYS DMA can overshoot. For higher resolutions over allocation is one line
62*25fedc02SBingbu Cao * but it must be at minimum 1024 bytes. Value could be different in
63*25fedc02SBingbu Cao * different versions / generations thus provide it via platform data.
64*25fedc02SBingbu Cao */
65*25fedc02SBingbu Cao #define IPU6_ISYS_OVERALLOC_MIN 1024
66*25fedc02SBingbu Cao
67*25fedc02SBingbu Cao /* Physical pages in GDA is 128, page size is 2K for IPU6, 1K for others */
68*25fedc02SBingbu Cao #define IPU6_DEVICE_GDA_NR_PAGES 128
69*25fedc02SBingbu Cao
70*25fedc02SBingbu Cao /* Virtualization factor to calculate the available virtual pages */
71*25fedc02SBingbu Cao #define IPU6_DEVICE_GDA_VIRT_FACTOR 32
72*25fedc02SBingbu Cao
73*25fedc02SBingbu Cao struct ipu6_device {
74*25fedc02SBingbu Cao struct pci_dev *pdev;
75*25fedc02SBingbu Cao struct list_head devices;
76*25fedc02SBingbu Cao struct ipu6_bus_device *isys;
77*25fedc02SBingbu Cao struct ipu6_bus_device *psys;
78*25fedc02SBingbu Cao struct ipu6_buttress buttress;
79*25fedc02SBingbu Cao
80*25fedc02SBingbu Cao const struct firmware *cpd_fw;
81*25fedc02SBingbu Cao const char *cpd_fw_name;
82*25fedc02SBingbu Cao u32 cpd_metadata_cmpnt_size;
83*25fedc02SBingbu Cao
84*25fedc02SBingbu Cao void __iomem *base;
85*25fedc02SBingbu Cao bool need_ipc_reset;
86*25fedc02SBingbu Cao bool secure_mode;
87*25fedc02SBingbu Cao u8 hw_ver;
88*25fedc02SBingbu Cao bool bus_ready_to_probe;
89*25fedc02SBingbu Cao };
90*25fedc02SBingbu Cao
91*25fedc02SBingbu Cao #define IPU6_ISYS_NAME "isys"
92*25fedc02SBingbu Cao #define IPU6_PSYS_NAME "psys"
93*25fedc02SBingbu Cao
94*25fedc02SBingbu Cao #define IPU6_MMU_MAX_DEVICES 4
95*25fedc02SBingbu Cao #define IPU6_MMU_ADDR_BITS 32
96*25fedc02SBingbu Cao /* The firmware is accessible within the first 2 GiB only in non-secure mode. */
97*25fedc02SBingbu Cao #define IPU6_MMU_ADDR_BITS_NON_SECURE 31
98*25fedc02SBingbu Cao
99*25fedc02SBingbu Cao #define IPU6_MMU_MAX_TLB_L1_STREAMS 32
100*25fedc02SBingbu Cao #define IPU6_MMU_MAX_TLB_L2_STREAMS 32
101*25fedc02SBingbu Cao #define IPU6_MAX_LI_BLOCK_ADDR 128
102*25fedc02SBingbu Cao #define IPU6_MAX_L2_BLOCK_ADDR 64
103*25fedc02SBingbu Cao
104*25fedc02SBingbu Cao #define IPU6SE_ISYS_NUM_STREAMS IPU6SE_NONSECURE_STREAM_ID_MAX
105*25fedc02SBingbu Cao #define IPU6_ISYS_NUM_STREAMS IPU6_NONSECURE_STREAM_ID_MAX
106*25fedc02SBingbu Cao
107*25fedc02SBingbu Cao /*
108*25fedc02SBingbu Cao * To maximize the IOSF utlization, IPU6 need to send requests in bursts.
109*25fedc02SBingbu Cao * At the DMA interface with the buttress, there are CDC FIFOs with burst
110*25fedc02SBingbu Cao * collection capability. CDC FIFO burst collectors have a configurable
111*25fedc02SBingbu Cao * threshold and is configured based on the outcome of performance measurements.
112*25fedc02SBingbu Cao *
113*25fedc02SBingbu Cao * isys has 3 ports with IOSF interface for VC0, VC1 and VC2
114*25fedc02SBingbu Cao * psys has 4 ports with IOSF interface for VC0, VC1w, VC1r and VC2
115*25fedc02SBingbu Cao *
116*25fedc02SBingbu Cao * Threshold values are pre-defined and are arrived at after performance
117*25fedc02SBingbu Cao * evaluations on a type of IPU6
118*25fedc02SBingbu Cao */
119*25fedc02SBingbu Cao #define IPU6_MAX_VC_IOSF_PORTS 4
120*25fedc02SBingbu Cao
121*25fedc02SBingbu Cao /*
122*25fedc02SBingbu Cao * IPU6 must configure correct arbitration mechanism related to the IOSF VC
123*25fedc02SBingbu Cao * requests. There are two options per VC0 and VC1 - > 0 means rearbitrate on
124*25fedc02SBingbu Cao * stall and 1 means stall until the request is completed.
125*25fedc02SBingbu Cao */
126*25fedc02SBingbu Cao #define IPU6_BTRS_ARB_MODE_TYPE_REARB 0
127*25fedc02SBingbu Cao #define IPU6_BTRS_ARB_MODE_TYPE_STALL 1
128*25fedc02SBingbu Cao
129*25fedc02SBingbu Cao /* Currently chosen arbitration mechanism for VC0 */
130*25fedc02SBingbu Cao #define IPU6_BTRS_ARB_STALL_MODE_VC0 \
131*25fedc02SBingbu Cao IPU6_BTRS_ARB_MODE_TYPE_REARB
132*25fedc02SBingbu Cao
133*25fedc02SBingbu Cao /* Currently chosen arbitration mechanism for VC1 */
134*25fedc02SBingbu Cao #define IPU6_BTRS_ARB_STALL_MODE_VC1 \
135*25fedc02SBingbu Cao IPU6_BTRS_ARB_MODE_TYPE_REARB
136*25fedc02SBingbu Cao
137*25fedc02SBingbu Cao /*
138*25fedc02SBingbu Cao * MMU Invalidation HW bug workaround by ZLW mechanism
139*25fedc02SBingbu Cao *
140*25fedc02SBingbu Cao * Old IPU6 MMUV2 has a bug in the invalidation mechanism which might result in
141*25fedc02SBingbu Cao * wrong translation or replication of the translation. This will cause data
142*25fedc02SBingbu Cao * corruption. So we cannot directly use the MMU V2 invalidation registers
143*25fedc02SBingbu Cao * to invalidate the MMU. Instead, whenever an invalidate is called, we need to
144*25fedc02SBingbu Cao * clear the TLB by evicting all the valid translations by filling it with trash
145*25fedc02SBingbu Cao * buffer (which is guaranteed not to be used by any other processes). ZLW is
146*25fedc02SBingbu Cao * used to fill the L1 and L2 caches with the trash buffer translations. ZLW
147*25fedc02SBingbu Cao * or Zero length write, is pre-fetch mechanism to pre-fetch the pages in
148*25fedc02SBingbu Cao * advance to the L1 and L2 caches without triggering any memory operations.
149*25fedc02SBingbu Cao *
150*25fedc02SBingbu Cao * In MMU V2, L1 -> 16 streams and 64 blocks, maximum 16 blocks per stream
151*25fedc02SBingbu Cao * One L1 block has 16 entries, hence points to 16 * 4K pages
152*25fedc02SBingbu Cao * L2 -> 16 streams and 32 blocks. 2 blocks per streams
153*25fedc02SBingbu Cao * One L2 block maps to 1024 L1 entries, hence points to 4MB address range
154*25fedc02SBingbu Cao * 2 blocks per L2 stream means, 1 stream points to 8MB range
155*25fedc02SBingbu Cao *
156*25fedc02SBingbu Cao * As we need to clear the caches and 8MB being the biggest cache size, we need
157*25fedc02SBingbu Cao * to have trash buffer which points to 8MB address range. As these trash
158*25fedc02SBingbu Cao * buffers are not used for any memory transactions, we need only the least
159*25fedc02SBingbu Cao * amount of physical memory. So we reserve 8MB IOVA address range but only
160*25fedc02SBingbu Cao * one page is reserved from physical memory. Each of this 8MB IOVA address
161*25fedc02SBingbu Cao * range is then mapped to the same physical memory page.
162*25fedc02SBingbu Cao */
163*25fedc02SBingbu Cao /* One L2 entry maps 1024 L1 entries and one L1 entry per page */
164*25fedc02SBingbu Cao #define IPU6_MMUV2_L2_RANGE (1024 * PAGE_SIZE)
165*25fedc02SBingbu Cao /* Max L2 blocks per stream */
166*25fedc02SBingbu Cao #define IPU6_MMUV2_MAX_L2_BLOCKS 2
167*25fedc02SBingbu Cao /* Max L1 blocks per stream */
168*25fedc02SBingbu Cao #define IPU6_MMUV2_MAX_L1_BLOCKS 16
169*25fedc02SBingbu Cao #define IPU6_MMUV2_TRASH_RANGE (IPU6_MMUV2_L2_RANGE * IPU6_MMUV2_MAX_L2_BLOCKS)
170*25fedc02SBingbu Cao /* Entries per L1 block */
171*25fedc02SBingbu Cao #define MMUV2_ENTRIES_PER_L1_BLOCK 16
172*25fedc02SBingbu Cao #define MMUV2_TRASH_L1_BLOCK_OFFSET (MMUV2_ENTRIES_PER_L1_BLOCK * PAGE_SIZE)
173*25fedc02SBingbu Cao #define MMUV2_TRASH_L2_BLOCK_OFFSET IPU6_MMUV2_L2_RANGE
174*25fedc02SBingbu Cao
175*25fedc02SBingbu Cao /*
176*25fedc02SBingbu Cao * In some of the IPU6 MMUs, there is provision to configure L1 and L2 page
177*25fedc02SBingbu Cao * table caches. Both these L1 and L2 caches are divided into multiple sections
178*25fedc02SBingbu Cao * called streams. There is maximum 16 streams for both caches. Each of these
179*25fedc02SBingbu Cao * sections are subdivided into multiple blocks. When nr_l1streams = 0 and
180*25fedc02SBingbu Cao * nr_l2streams = 0, means the MMU is of type MMU_V1 and do not support
181*25fedc02SBingbu Cao * L1/L2 page table caches.
182*25fedc02SBingbu Cao *
183*25fedc02SBingbu Cao * L1 stream per block sizes are configurable and varies per usecase.
184*25fedc02SBingbu Cao * L2 has constant block sizes - 2 blocks per stream.
185*25fedc02SBingbu Cao *
186*25fedc02SBingbu Cao * MMU1 support pre-fetching of the pages to have less cache lookup misses. To
187*25fedc02SBingbu Cao * enable the pre-fetching, MMU1 AT (Address Translator) device registers
188*25fedc02SBingbu Cao * need to be configured.
189*25fedc02SBingbu Cao *
190*25fedc02SBingbu Cao * There are four types of memory accesses which requires ZLW configuration.
191*25fedc02SBingbu Cao * ZLW(Zero Length Write) is a mechanism to enable VT-d pre-fetching on IOMMU.
192*25fedc02SBingbu Cao *
193*25fedc02SBingbu Cao * 1. Sequential Access or 1D mode
194*25fedc02SBingbu Cao * Set ZLW_EN -> 1
195*25fedc02SBingbu Cao * set ZLW_PAGE_CROSS_1D -> 1
196*25fedc02SBingbu Cao * Set ZLW_N to "N" pages so that ZLW will be inserte N pages ahead where
197*25fedc02SBingbu Cao * N is pre-defined and hardcoded in the platform data
198*25fedc02SBingbu Cao * Set ZLW_2D -> 0
199*25fedc02SBingbu Cao *
200*25fedc02SBingbu Cao * 2. ZLW 2D mode
201*25fedc02SBingbu Cao * Set ZLW_EN -> 1
202*25fedc02SBingbu Cao * set ZLW_PAGE_CROSS_1D -> 1,
203*25fedc02SBingbu Cao * Set ZLW_N -> 0
204*25fedc02SBingbu Cao * Set ZLW_2D -> 1
205*25fedc02SBingbu Cao *
206*25fedc02SBingbu Cao * 3. ZLW Enable (no 1D or 2D mode)
207*25fedc02SBingbu Cao * Set ZLW_EN -> 1
208*25fedc02SBingbu Cao * set ZLW_PAGE_CROSS_1D -> 0,
209*25fedc02SBingbu Cao * Set ZLW_N -> 0
210*25fedc02SBingbu Cao * Set ZLW_2D -> 0
211*25fedc02SBingbu Cao *
212*25fedc02SBingbu Cao * 4. ZLW disable
213*25fedc02SBingbu Cao * Set ZLW_EN -> 0
214*25fedc02SBingbu Cao * set ZLW_PAGE_CROSS_1D -> 0,
215*25fedc02SBingbu Cao * Set ZLW_N -> 0
216*25fedc02SBingbu Cao * Set ZLW_2D -> 0
217*25fedc02SBingbu Cao *
218*25fedc02SBingbu Cao * To configure the ZLW for the above memory access, four registers are
219*25fedc02SBingbu Cao * available. Hence to track these four settings, we have the following entries
220*25fedc02SBingbu Cao * in the struct ipu6_mmu_hw. Each of these entries are per stream and
221*25fedc02SBingbu Cao * available only for the L1 streams.
222*25fedc02SBingbu Cao *
223*25fedc02SBingbu Cao * a. l1_zlw_en -> To track zlw enabled per stream (ZLW_EN)
224*25fedc02SBingbu Cao * b. l1_zlw_1d_mode -> Track 1D mode per stream. ZLW inserted at page boundary
225*25fedc02SBingbu Cao * c. l1_ins_zlw_ahead_pages -> to track how advance the ZLW need to be inserted
226*25fedc02SBingbu Cao * Insert ZLW request N pages ahead address.
227*25fedc02SBingbu Cao * d. l1_zlw_2d_mode -> To track 2D mode per stream (ZLW_2D)
228*25fedc02SBingbu Cao *
229*25fedc02SBingbu Cao *
230*25fedc02SBingbu Cao * Currently L1/L2 streams, blocks, AT ZLW configurations etc. are pre-defined
231*25fedc02SBingbu Cao * as per the usecase specific calculations. Any change to this pre-defined
232*25fedc02SBingbu Cao * table has to happen in sync with IPU6 FW.
233*25fedc02SBingbu Cao */
234*25fedc02SBingbu Cao struct ipu6_mmu_hw {
235*25fedc02SBingbu Cao union {
236*25fedc02SBingbu Cao unsigned long offset;
237*25fedc02SBingbu Cao void __iomem *base;
238*25fedc02SBingbu Cao };
239*25fedc02SBingbu Cao u32 info_bits;
240*25fedc02SBingbu Cao u8 nr_l1streams;
241*25fedc02SBingbu Cao /*
242*25fedc02SBingbu Cao * L1 has variable blocks per stream - total of 64 blocks and maximum of
243*25fedc02SBingbu Cao * 16 blocks per stream. Configurable by using the block start address
244*25fedc02SBingbu Cao * per stream. Block start address is calculated from the block size
245*25fedc02SBingbu Cao */
246*25fedc02SBingbu Cao u8 l1_block_sz[IPU6_MMU_MAX_TLB_L1_STREAMS];
247*25fedc02SBingbu Cao /* Is ZLW is enabled in each stream */
248*25fedc02SBingbu Cao bool l1_zlw_en[IPU6_MMU_MAX_TLB_L1_STREAMS];
249*25fedc02SBingbu Cao bool l1_zlw_1d_mode[IPU6_MMU_MAX_TLB_L1_STREAMS];
250*25fedc02SBingbu Cao u8 l1_ins_zlw_ahead_pages[IPU6_MMU_MAX_TLB_L1_STREAMS];
251*25fedc02SBingbu Cao bool l1_zlw_2d_mode[IPU6_MMU_MAX_TLB_L1_STREAMS];
252*25fedc02SBingbu Cao
253*25fedc02SBingbu Cao u32 l1_stream_id_reg_offset;
254*25fedc02SBingbu Cao u32 l2_stream_id_reg_offset;
255*25fedc02SBingbu Cao
256*25fedc02SBingbu Cao u8 nr_l2streams;
257*25fedc02SBingbu Cao /*
258*25fedc02SBingbu Cao * L2 has fixed 2 blocks per stream. Block address is calculated
259*25fedc02SBingbu Cao * from the block size
260*25fedc02SBingbu Cao */
261*25fedc02SBingbu Cao u8 l2_block_sz[IPU6_MMU_MAX_TLB_L2_STREAMS];
262*25fedc02SBingbu Cao /* flag to track if WA is needed for successive invalidate HW bug */
263*25fedc02SBingbu Cao bool insert_read_before_invalidate;
264*25fedc02SBingbu Cao };
265*25fedc02SBingbu Cao
266*25fedc02SBingbu Cao struct ipu6_mmu_pdata {
267*25fedc02SBingbu Cao u32 nr_mmus;
268*25fedc02SBingbu Cao struct ipu6_mmu_hw mmu_hw[IPU6_MMU_MAX_DEVICES];
269*25fedc02SBingbu Cao int mmid;
270*25fedc02SBingbu Cao };
271*25fedc02SBingbu Cao
272*25fedc02SBingbu Cao struct ipu6_isys_csi2_pdata {
273*25fedc02SBingbu Cao void __iomem *base;
274*25fedc02SBingbu Cao };
275*25fedc02SBingbu Cao
276*25fedc02SBingbu Cao struct ipu6_isys_internal_csi2_pdata {
277*25fedc02SBingbu Cao u32 nports;
278*25fedc02SBingbu Cao u32 irq_mask;
279*25fedc02SBingbu Cao u32 ctrl0_irq_edge;
280*25fedc02SBingbu Cao u32 ctrl0_irq_clear;
281*25fedc02SBingbu Cao u32 ctrl0_irq_mask;
282*25fedc02SBingbu Cao u32 ctrl0_irq_enable;
283*25fedc02SBingbu Cao u32 ctrl0_irq_lnp;
284*25fedc02SBingbu Cao u32 ctrl0_irq_status;
285*25fedc02SBingbu Cao u32 fw_access_port_ofs;
286*25fedc02SBingbu Cao };
287*25fedc02SBingbu Cao
288*25fedc02SBingbu Cao struct ipu6_isys_internal_tpg_pdata {
289*25fedc02SBingbu Cao u32 ntpgs;
290*25fedc02SBingbu Cao u32 *offsets;
291*25fedc02SBingbu Cao u32 *sels;
292*25fedc02SBingbu Cao };
293*25fedc02SBingbu Cao
294*25fedc02SBingbu Cao struct ipu6_hw_variants {
295*25fedc02SBingbu Cao unsigned long offset;
296*25fedc02SBingbu Cao u32 nr_mmus;
297*25fedc02SBingbu Cao struct ipu6_mmu_hw mmu_hw[IPU6_MMU_MAX_DEVICES];
298*25fedc02SBingbu Cao u8 cdc_fifos;
299*25fedc02SBingbu Cao u8 cdc_fifo_threshold[IPU6_MAX_VC_IOSF_PORTS];
300*25fedc02SBingbu Cao u32 dmem_offset;
301*25fedc02SBingbu Cao u32 spc_offset;
302*25fedc02SBingbu Cao };
303*25fedc02SBingbu Cao
304*25fedc02SBingbu Cao struct ipu6_isys_internal_pdata {
305*25fedc02SBingbu Cao struct ipu6_isys_internal_csi2_pdata csi2;
306*25fedc02SBingbu Cao struct ipu6_hw_variants hw_variant;
307*25fedc02SBingbu Cao u32 num_parallel_streams;
308*25fedc02SBingbu Cao u32 isys_dma_overshoot;
309*25fedc02SBingbu Cao u32 sram_gran_shift;
310*25fedc02SBingbu Cao u32 sram_gran_size;
311*25fedc02SBingbu Cao u32 max_sram_size;
312*25fedc02SBingbu Cao u32 max_streams;
313*25fedc02SBingbu Cao u32 max_send_queues;
314*25fedc02SBingbu Cao u32 max_sram_blocks;
315*25fedc02SBingbu Cao u32 max_devq_size;
316*25fedc02SBingbu Cao u32 sensor_type_start;
317*25fedc02SBingbu Cao u32 sensor_type_end;
318*25fedc02SBingbu Cao u32 ltr;
319*25fedc02SBingbu Cao u32 memopen_threshold;
320*25fedc02SBingbu Cao bool enhanced_iwake;
321*25fedc02SBingbu Cao };
322*25fedc02SBingbu Cao
323*25fedc02SBingbu Cao struct ipu6_isys_pdata {
324*25fedc02SBingbu Cao void __iomem *base;
325*25fedc02SBingbu Cao const struct ipu6_isys_internal_pdata *ipdata;
326*25fedc02SBingbu Cao };
327*25fedc02SBingbu Cao
328*25fedc02SBingbu Cao struct ipu6_psys_internal_pdata {
329*25fedc02SBingbu Cao struct ipu6_hw_variants hw_variant;
330*25fedc02SBingbu Cao };
331*25fedc02SBingbu Cao
332*25fedc02SBingbu Cao struct ipu6_psys_pdata {
333*25fedc02SBingbu Cao void __iomem *base;
334*25fedc02SBingbu Cao const struct ipu6_psys_internal_pdata *ipdata;
335*25fedc02SBingbu Cao };
336*25fedc02SBingbu Cao
337*25fedc02SBingbu Cao int ipu6_fw_authenticate(void *data, u64 val);
338*25fedc02SBingbu Cao void ipu6_configure_spc(struct ipu6_device *isp,
339*25fedc02SBingbu Cao const struct ipu6_hw_variants *hw_variant,
340*25fedc02SBingbu Cao int pkg_dir_idx, void __iomem *base, u64 *pkg_dir,
341*25fedc02SBingbu Cao dma_addr_t pkg_dir_dma_addr);
342*25fedc02SBingbu Cao #endif /* IPU6_H */
343