File Index
Files and directories
Sign in
FILE

ipu7.h

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/media/ipu7/ipu7.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2013 - 2025 Intel Corporation
  4 */
  5
  6#ifndef IPU7_H
  7#define IPU7_H
  8
  9#include <linux/list.h>
 10#include <linux/pci.h>
 11#include <linux/types.h>
 12
 13#include "ipu7-buttress.h"
 14
 15struct ipu7_bus_device;
 16struct pci_dev;
 17struct firmware;
 18
 19#define IPU_NAME			"intel-ipu7"
 20#define IPU_MEDIA_DEV_MODEL_NAME	"ipu7"
 21
 22#define IPU7_FIRMWARE_NAME		"intel/ipu/ipu7_fw.bin"
 23#define IPU7P5_FIRMWARE_NAME		"intel/ipu/ipu7ptl_fw.bin"
 24#define IPU8_FIRMWARE_NAME		"intel/ipu/ipu8_fw.bin"
 25
 26#define IPU7_ISYS_NUM_STREAMS		12
 27
 28#define IPU7_PCI_ID			0x645d
 29#define IPU7P5_PCI_ID			0xb05d
 30#define IPU8_PCI_ID			0xd719
 31
 32#define FW_LOG_BUF_SIZE			(2 * 1024 * 1024)
 33
 34enum ipu_version {
 35	IPU_VER_INVALID = 0,
 36	IPU_VER_7 = 1,
 37	IPU_VER_7P5 = 2,
 38	IPU_VER_8 = 3,
 39};
 40
 41static inline bool is_ipu7p5(u8 hw_ver)
 42{
 43	return hw_ver == IPU_VER_7P5;
 44}
 45
 46static inline bool is_ipu7(u8 hw_ver)
 47{
 48	return hw_ver == IPU_VER_7;
 49}
 50
 51static inline bool is_ipu8(u8 hw_ver)
 52{
 53	return hw_ver == IPU_VER_8;
 54}
 55
 56#define IPU_UNIFIED_OFFSET		0
 57
 58/*
 59 * ISYS DMA can overshoot. For higher resolutions over allocation is one line
 60 * but it must be at minimum 1024 bytes. Value could be different in
 61 * different versions / generations thus provide it via platform data.
 62 */
 63#define IPU_ISYS_OVERALLOC_MIN		1024
 64
 65#define IPU_FW_CODE_REGION_SIZE		0x1000000 /* 16MB */
 66#define IPU_FW_CODE_REGION_START	0x4000000 /* 64MB */
 67#define IPU_FW_CODE_REGION_END		(IPU_FW_CODE_REGION_START +	\
 68					 IPU_FW_CODE_REGION_SIZE) /* 80MB */
 69
 70struct ipu7_device {
 71	struct pci_dev *pdev;
 72	struct list_head devices;
 73	struct ipu7_bus_device *isys;
 74	struct ipu7_bus_device *psys;
 75	struct ipu_buttress buttress;
 76
 77	const struct firmware *cpd_fw;
 78	const char *cpd_fw_name;
 79	/* Only for non-secure mode. */
 80	void *fw_code_region;
 81
 82	void __iomem *base;
 83	void __iomem *pb_base;
 84	u8 hw_ver;
 85	bool ipc_reinit;
 86	bool secure_mode;
 87	bool ipu7_bus_ready_to_probe;
 88};
 89
 90#define IPU_DMA_MASK			39
 91#define IPU_LIB_CALL_TIMEOUT_MS		2000
 92#define IPU_PSYS_CMD_TIMEOUT_MS		2000
 93#define IPU_PSYS_OPEN_CLOSE_TIMEOUT_US	50
 94#define IPU_PSYS_OPEN_CLOSE_RETRY	(10000 / IPU_PSYS_OPEN_CLOSE_TIMEOUT_US)
 95
 96#define IPU_ISYS_NAME "isys"
 97#define IPU_PSYS_NAME "psys"
 98
 99#define IPU_MMU_ADDR_BITS		32
100/* FW is accessible within the first 2 GiB only in non-secure mode. */
101#define IPU_MMU_ADDR_BITS_NON_SECURE	31
102
103#define IPU7_IS_MMU_NUM			4U
104#define IPU7_PS_MMU_NUM			4U
105#define IPU7P5_IS_MMU_NUM		4U
106#define IPU7P5_PS_MMU_NUM		4U
107#define IPU8_IS_MMU_NUM			5U
108#define IPU8_PS_MMU_NUM			4U
109#define IPU_MMU_MAX_NUM			5U /* max(IS, PS) */
110#define IPU_MMU_MAX_TLB_L1_STREAMS	40U
111#define IPU_MMU_MAX_TLB_L2_STREAMS	40U
112#define IPU_ZLX_MAX_NUM			32U
113#define IPU_ZLX_POOL_NUM		8U
114#define IPU_UAO_PLANE_MAX_NUM		64U
115
116/*
117 * To maximize the IOSF utlization, IPU need to send requests in bursts.
118 * At the DMA interface with the buttress, there are CDC FIFOs with burst
119 * collection capability. CDC FIFO burst collectors have a configurable
120 * threshold and is configured based on the outcome of performance measurements.
121 *
122 * isys has 3 ports with IOSF interface for VC0, VC1 and VC2
123 * psys has 4 ports with IOSF interface for VC0, VC1w, VC1r and VC2
124 *
125 * Threshold values are pre-defined and are arrived at after performance
126 * evaluations on a type of IPU
127 */
128#define IPU_MAX_VC_IOSF_PORTS		4
129
130/*
131 * IPU must configure correct arbitration mechanism related to the IOSF VC
132 * requests. There are two options per VC0 and VC1 - > 0 means rearbitrate on
133 * stall and 1 means stall until the request is completed.
134 */
135#define IPU_BTRS_ARB_MODE_TYPE_REARB	0
136#define IPU_BTRS_ARB_MODE_TYPE_STALL	1
137
138/* Currently chosen arbitration mechanism for VC0 */
139#define IPU_BTRS_ARB_STALL_MODE_VC0	IPU_BTRS_ARB_MODE_TYPE_REARB
140
141/* Currently chosen arbitration mechanism for VC1 */
142#define IPU_BTRS_ARB_STALL_MODE_VC1	IPU_BTRS_ARB_MODE_TYPE_REARB
143
144/* One L2 entry maps 1024 L1 entries and one L1 entry per page */
145#define IPU_MMUV2_L2_RANGE		(1024 * PAGE_SIZE)
146/* Max L2 blocks per stream */
147#define IPU_MMUV2_MAX_L2_BLOCKS		2
148/* Max L1 blocks per stream */
149#define IPU_MMUV2_MAX_L1_BLOCKS		16
150#define IPU_MMUV2_TRASH_RANGE		(IPU_MMUV2_L2_RANGE *	\
151					 IPU_MMUV2_MAX_L2_BLOCKS)
152/* Entries per L1 block */
153#define MMUV2_ENTRIES_PER_L1_BLOCK	16
154#define MMUV2_TRASH_L1_BLOCK_OFFSET	(MMUV2_ENTRIES_PER_L1_BLOCK * PAGE_SIZE)
155#define MMUV2_TRASH_L2_BLOCK_OFFSET	IPU_MMUV2_L2_RANGE
156
157struct ipu7_mmu_hw {
158	char name[32];
159
160	void __iomem *base;
161	void __iomem *zlx_base;
162	void __iomem *uao_base;
163
164	u32 offset;
165	u32 zlx_offset;
166	u32 uao_offset;
167
168	u32 info_bits;
169	u32 refill;
170	u32 collapse_en_bitmap;
171	u32 at_sp_arb_cfg;
172
173	u32 l1_block;
174	u32 l2_block;
175
176	u8 nr_l1streams;
177	u8 nr_l2streams;
178	u32 l1_block_sz[IPU_MMU_MAX_TLB_L1_STREAMS];
179	u32 l2_block_sz[IPU_MMU_MAX_TLB_L2_STREAMS];
180
181	u8 zlx_nr;
182	u32 zlx_axi_pool[IPU_ZLX_POOL_NUM];
183	u32 zlx_en[IPU_ZLX_MAX_NUM];
184	u32 zlx_conf[IPU_ZLX_MAX_NUM];
185
186	u32 uao_p_num;
187	u32 uao_p2tlb[IPU_UAO_PLANE_MAX_NUM];
188};
189
190struct ipu7_mmu_pdata {
191	u32 nr_mmus;
192	struct ipu7_mmu_hw mmu_hw[IPU_MMU_MAX_NUM];
193	int mmid;
194};
195
196struct ipu7_isys_csi2_pdata {
197	void __iomem *base;
198};
199
200struct ipu7_isys_internal_csi2_pdata {
201	u32 nports;
202	u32 const *offsets;
203	u32 gpreg;
204};
205
206struct ipu7_hw_variants {
207	unsigned long offset;
208	u32 nr_mmus;
209	struct ipu7_mmu_hw mmu_hw[IPU_MMU_MAX_NUM];
210	u8 cdc_fifos;
211	u8 cdc_fifo_threshold[IPU_MAX_VC_IOSF_PORTS];
212	u32 dmem_offset;
213	u32 spc_offset;	/* SPC offset from psys base */
214};
215
216struct ipu_isys_internal_pdata {
217	struct ipu7_isys_internal_csi2_pdata csi2;
218	struct ipu7_hw_variants hw_variant;
219	u32 num_parallel_streams;
220	u32 isys_dma_overshoot;
221};
222
223struct ipu7_isys_pdata {
224	void __iomem *base;
225	const struct ipu_isys_internal_pdata *ipdata;
226};
227
228struct ipu_psys_internal_pdata {
229	struct ipu7_hw_variants hw_variant;
230};
231
232struct ipu7_psys_pdata {
233	void __iomem *base;
234	const struct ipu_psys_internal_pdata *ipdata;
235};
236
237int request_cpd_fw(const struct firmware **firmware_p, const char *name,
238		   struct device *device);
239void ipu_internal_pdata_init(struct ipu_isys_internal_pdata *isys_ipdata,
240			     struct ipu_psys_internal_pdata *psys_ipdata);
241void ipu7_dump_fw_error_log(const struct ipu7_bus_device *adev);
242#endif /* IPU7_H */
~/ Read-only file preview.