File Index
Files and directories
Sign in
FILE

ipu7-mmu.h

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/media/ipu7/ipu7-mmu.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2013 - 2025 Intel Corporation
  4 */
  5
  6#ifndef IPU7_MMU_H
  7#define IPU7_MMU_H
  8
  9#include <linux/dma-mapping.h>
 10#include <linux/list.h>
 11#include <linux/spinlock_types.h>
 12#include <linux/types.h>
 13
 14struct device;
 15struct page;
 16struct ipu7_hw_variants;
 17struct ipu7_mmu;
 18struct ipu7_mmu_info;
 19
 20#define ISYS_MMID 0x1
 21#define PSYS_MMID 0x0
 22
 23/* IPU7 for LNL */
 24/* IS MMU Cmd RD */
 25#define IPU7_IS_MMU_FW_RD_OFFSET		0x274000
 26#define IPU7_IS_MMU_FW_RD_STREAM_NUM		3
 27#define IPU7_IS_MMU_FW_RD_L1_BLOCKNR_REG	0x54
 28#define IPU7_IS_MMU_FW_RD_L2_BLOCKNR_REG	0x60
 29
 30/* IS MMU Cmd WR */
 31#define IPU7_IS_MMU_FW_WR_OFFSET		0x275000
 32#define IPU7_IS_MMU_FW_WR_STREAM_NUM		3
 33#define IPU7_IS_MMU_FW_WR_L1_BLOCKNR_REG	0x54
 34#define IPU7_IS_MMU_FW_WR_L2_BLOCKNR_REG	0x60
 35
 36/* IS MMU Data WR Snoop */
 37#define IPU7_IS_MMU_M0_OFFSET			0x276000
 38#define IPU7_IS_MMU_M0_STREAM_NUM		8
 39#define IPU7_IS_MMU_M0_L1_BLOCKNR_REG		0x54
 40#define IPU7_IS_MMU_M0_L2_BLOCKNR_REG		0x74
 41
 42/* IS MMU Data WR ISOC */
 43#define IPU7_IS_MMU_M1_OFFSET			0x277000
 44#define IPU7_IS_MMU_M1_STREAM_NUM		16
 45#define IPU7_IS_MMU_M1_L1_BLOCKNR_REG		0x54
 46#define IPU7_IS_MMU_M1_L2_BLOCKNR_REG		0x94
 47
 48/* PS MMU FW RD */
 49#define IPU7_PS_MMU_FW_RD_OFFSET		0x148000
 50#define IPU7_PS_MMU_FW_RD_STREAM_NUM		20
 51#define IPU7_PS_MMU_FW_RD_L1_BLOCKNR_REG	0x54
 52#define IPU7_PS_MMU_FW_RD_L2_BLOCKNR_REG	0xa4
 53
 54/* PS MMU FW WR */
 55#define IPU7_PS_MMU_FW_WR_OFFSET		0x149000
 56#define IPU7_PS_MMU_FW_WR_STREAM_NUM		10
 57#define IPU7_PS_MMU_FW_WR_L1_BLOCKNR_REG	0x54
 58#define IPU7_PS_MMU_FW_WR_L2_BLOCKNR_REG	0x7c
 59
 60/* PS MMU FW Data RD VC0 */
 61#define IPU7_PS_MMU_SRT_RD_OFFSET		0x14a000
 62#define IPU7_PS_MMU_SRT_RD_STREAM_NUM		40
 63#define IPU7_PS_MMU_SRT_RD_L1_BLOCKNR_REG	0x54
 64#define IPU7_PS_MMU_SRT_RD_L2_BLOCKNR_REG	0xf4
 65
 66/* PS MMU FW Data WR VC0 */
 67#define IPU7_PS_MMU_SRT_WR_OFFSET		0x14b000
 68#define IPU7_PS_MMU_SRT_WR_STREAM_NUM		40
 69#define IPU7_PS_MMU_SRT_WR_L1_BLOCKNR_REG	0x54
 70#define IPU7_PS_MMU_SRT_WR_L2_BLOCKNR_REG	0xf4
 71
 72/* IS UAO UC RD */
 73#define IPU7_IS_UAO_UC_RD_OFFSET		0x27c000
 74#define IPU7_IS_UAO_UC_RD_PLANENUM		4
 75
 76/* IS UAO UC WR */
 77#define IPU7_IS_UAO_UC_WR_OFFSET		0x27d000
 78#define IPU7_IS_UAO_UC_WR_PLANENUM		4
 79
 80/* IS UAO M0 WR */
 81#define IPU7_IS_UAO_M0_WR_OFFSET		0x27e000
 82#define IPU7_IS_UAO_M0_WR_PLANENUM		8
 83
 84/* IS UAO M1 WR */
 85#define IPU7_IS_UAO_M1_WR_OFFSET		0x27f000
 86#define IPU7_IS_UAO_M1_WR_PLANENUM		16
 87
 88/* PS UAO FW RD */
 89#define IPU7_PS_UAO_FW_RD_OFFSET		0x156000
 90#define IPU7_PS_UAO_FW_RD_PLANENUM		20
 91
 92/* PS UAO FW WR */
 93#define IPU7_PS_UAO_FW_WR_OFFSET		0x157000
 94#define IPU7_PS_UAO_FW_WR_PLANENUM		16
 95
 96/* PS UAO SRT RD */
 97#define IPU7_PS_UAO_SRT_RD_OFFSET		0x154000
 98#define IPU7_PS_UAO_SRT_RD_PLANENUM		40
 99
100/* PS UAO SRT WR */
101#define IPU7_PS_UAO_SRT_WR_OFFSET		0x155000
102#define IPU7_PS_UAO_SRT_WR_PLANENUM		40
103
104#define IPU7_IS_ZLX_UC_RD_OFFSET		0x278000
105#define IPU7_IS_ZLX_UC_WR_OFFSET		0x279000
106#define IPU7_IS_ZLX_M0_OFFSET			0x27a000
107#define IPU7_IS_ZLX_M1_OFFSET			0x27b000
108#define IPU7_IS_ZLX_UC_RD_NUM			4
109#define IPU7_IS_ZLX_UC_WR_NUM			4
110#define IPU7_IS_ZLX_M0_NUM			8
111#define IPU7_IS_ZLX_M1_NUM			16
112
113#define IPU7_PS_ZLX_DATA_RD_OFFSET		0x14e000
114#define IPU7_PS_ZLX_DATA_WR_OFFSET		0x14f000
115#define IPU7_PS_ZLX_FW_RD_OFFSET		0x150000
116#define IPU7_PS_ZLX_FW_WR_OFFSET		0x151000
117#define IPU7_PS_ZLX_DATA_RD_NUM			32
118#define IPU7_PS_ZLX_DATA_WR_NUM			32
119#define IPU7_PS_ZLX_FW_RD_NUM			16
120#define IPU7_PS_ZLX_FW_WR_NUM			10
121
122/* IPU7P5 for PTL */
123/* IS MMU Cmd RD */
124#define IPU7P5_IS_MMU_FW_RD_OFFSET		0x274000
125#define IPU7P5_IS_MMU_FW_RD_STREAM_NUM		3
126#define IPU7P5_IS_MMU_FW_RD_L1_BLOCKNR_REG	0x54
127#define IPU7P5_IS_MMU_FW_RD_L2_BLOCKNR_REG	0x60
128
129/* IS MMU Cmd WR */
130#define IPU7P5_IS_MMU_FW_WR_OFFSET		0x275000
131#define IPU7P5_IS_MMU_FW_WR_STREAM_NUM		3
132#define IPU7P5_IS_MMU_FW_WR_L1_BLOCKNR_REG	0x54
133#define IPU7P5_IS_MMU_FW_WR_L2_BLOCKNR_REG	0x60
134
135/* IS MMU Data WR Snoop */
136#define IPU7P5_IS_MMU_M0_OFFSET			0x276000
137#define IPU7P5_IS_MMU_M0_STREAM_NUM		16
138#define IPU7P5_IS_MMU_M0_L1_BLOCKNR_REG		0x54
139#define IPU7P5_IS_MMU_M0_L2_BLOCKNR_REG		0x94
140
141/* IS MMU Data WR ISOC */
142#define IPU7P5_IS_MMU_M1_OFFSET			0x277000
143#define IPU7P5_IS_MMU_M1_STREAM_NUM		16
144#define IPU7P5_IS_MMU_M1_L1_BLOCKNR_REG		0x54
145#define IPU7P5_IS_MMU_M1_L2_BLOCKNR_REG		0x94
146
147/* PS MMU FW RD */
148#define IPU7P5_PS_MMU_FW_RD_OFFSET		0x148000
149#define IPU7P5_PS_MMU_FW_RD_STREAM_NUM		16
150#define IPU7P5_PS_MMU_FW_RD_L1_BLOCKNR_REG	0x54
151#define IPU7P5_PS_MMU_FW_RD_L2_BLOCKNR_REG	0x94
152
153/* PS MMU FW WR */
154#define IPU7P5_PS_MMU_FW_WR_OFFSET		0x149000
155#define IPU7P5_PS_MMU_FW_WR_STREAM_NUM		10
156#define IPU7P5_PS_MMU_FW_WR_L1_BLOCKNR_REG	0x54
157#define IPU7P5_PS_MMU_FW_WR_L2_BLOCKNR_REG	0x7c
158
159/* PS MMU FW Data RD VC0 */
160#define IPU7P5_PS_MMU_SRT_RD_OFFSET		0x14a000
161#define IPU7P5_PS_MMU_SRT_RD_STREAM_NUM		22
162#define IPU7P5_PS_MMU_SRT_RD_L1_BLOCKNR_REG	0x54
163#define IPU7P5_PS_MMU_SRT_RD_L2_BLOCKNR_REG	0xac
164
165/* PS MMU FW Data WR VC0 */
166#define IPU7P5_PS_MMU_SRT_WR_OFFSET		0x14b000
167#define IPU7P5_PS_MMU_SRT_WR_STREAM_NUM		32
168#define IPU7P5_PS_MMU_SRT_WR_L1_BLOCKNR_REG	0x54
169#define IPU7P5_PS_MMU_SRT_WR_L2_BLOCKNR_REG	0xd4
170
171/* IS UAO UC RD */
172#define IPU7P5_IS_UAO_UC_RD_OFFSET		0x27c000
173#define IPU7P5_IS_UAO_UC_RD_PLANENUM		4
174
175/* IS UAO UC WR */
176#define IPU7P5_IS_UAO_UC_WR_OFFSET		0x27d000
177#define IPU7P5_IS_UAO_UC_WR_PLANENUM		4
178
179/* IS UAO M0 WR */
180#define IPU7P5_IS_UAO_M0_WR_OFFSET		0x27e000
181#define IPU7P5_IS_UAO_M0_WR_PLANENUM		16
182
183/* IS UAO M1 WR */
184#define IPU7P5_IS_UAO_M1_WR_OFFSET		0x27f000
185#define IPU7P5_IS_UAO_M1_WR_PLANENUM		16
186
187/* PS UAO FW RD */
188#define IPU7P5_PS_UAO_FW_RD_OFFSET		0x156000
189#define IPU7P5_PS_UAO_FW_RD_PLANENUM		16
190
191/* PS UAO FW WR */
192#define IPU7P5_PS_UAO_FW_WR_OFFSET		0x157000
193#define IPU7P5_PS_UAO_FW_WR_PLANENUM		10
194
195/* PS UAO SRT RD */
196#define IPU7P5_PS_UAO_SRT_RD_OFFSET		0x154000
197#define IPU7P5_PS_UAO_SRT_RD_PLANENUM		22
198
199/* PS UAO SRT WR */
200#define IPU7P5_PS_UAO_SRT_WR_OFFSET		0x155000
201#define IPU7P5_PS_UAO_SRT_WR_PLANENUM		32
202
203#define IPU7P5_IS_ZLX_UC_RD_OFFSET		0x278000
204#define IPU7P5_IS_ZLX_UC_WR_OFFSET		0x279000
205#define IPU7P5_IS_ZLX_M0_OFFSET			0x27a000
206#define IPU7P5_IS_ZLX_M1_OFFSET			0x27b000
207#define IPU7P5_IS_ZLX_UC_RD_NUM			4
208#define IPU7P5_IS_ZLX_UC_WR_NUM			4
209#define IPU7P5_IS_ZLX_M0_NUM			16
210#define IPU7P5_IS_ZLX_M1_NUM			16
211
212#define IPU7P5_PS_ZLX_DATA_RD_OFFSET		0x14e000
213#define IPU7P5_PS_ZLX_DATA_WR_OFFSET		0x14f000
214#define IPU7P5_PS_ZLX_FW_RD_OFFSET		0x150000
215#define IPU7P5_PS_ZLX_FW_WR_OFFSET		0x151000
216#define IPU7P5_PS_ZLX_DATA_RD_NUM		22
217#define IPU7P5_PS_ZLX_DATA_WR_NUM		32
218#define IPU7P5_PS_ZLX_FW_RD_NUM			16
219#define IPU7P5_PS_ZLX_FW_WR_NUM			10
220
221/* IS MMU Cmd RD */
222#define IPU8_IS_MMU_FW_RD_OFFSET		0x270000
223#define IPU8_IS_MMU_FW_RD_STREAM_NUM		3
224#define IPU8_IS_MMU_FW_RD_L1_BLOCKNR_REG	0x54
225#define IPU8_IS_MMU_FW_RD_L2_BLOCKNR_REG	0x60
226
227/* IS MMU Cmd WR */
228#define IPU8_IS_MMU_FW_WR_OFFSET		0x271000
229#define IPU8_IS_MMU_FW_WR_STREAM_NUM		3
230#define IPU8_IS_MMU_FW_WR_L1_BLOCKNR_REG	0x54
231#define IPU8_IS_MMU_FW_WR_L2_BLOCKNR_REG	0x60
232
233/* IS MMU Data WR Snoop */
234#define IPU8_IS_MMU_M0_OFFSET			0x272000
235#define IPU8_IS_MMU_M0_STREAM_NUM		16
236#define IPU8_IS_MMU_M0_L1_BLOCKNR_REG		0x54
237#define IPU8_IS_MMU_M0_L2_BLOCKNR_REG		0x94
238
239/* IS MMU Data WR ISOC */
240#define IPU8_IS_MMU_M1_OFFSET			0x273000
241#define IPU8_IS_MMU_M1_STREAM_NUM		16
242#define IPU8_IS_MMU_M1_L1_BLOCKNR_REG		0x54
243#define IPU8_IS_MMU_M1_L2_BLOCKNR_REG		0x94
244
245/* IS MMU UPIPE ISOC */
246#define IPU8_IS_MMU_UPIPE_OFFSET		0x274000
247#define IPU8_IS_MMU_UPIPE_STREAM_NUM		6
248#define IPU8_IS_MMU_UPIPE_L1_BLOCKNR_REG	0x54
249#define IPU8_IS_MMU_UPIPE_L2_BLOCKNR_REG	0x6c
250
251/* PS MMU FW RD */
252#define IPU8_PS_MMU_FW_RD_OFFSET		0x148000
253#define IPU8_PS_MMU_FW_RD_STREAM_NUM		12
254#define IPU8_PS_MMU_FW_RD_L1_BLOCKNR_REG	0x54
255#define IPU8_PS_MMU_FW_RD_L2_BLOCKNR_REG	0x84
256
257/* PS MMU FW WR */
258#define IPU8_PS_MMU_FW_WR_OFFSET		0x149000
259#define IPU8_PS_MMU_FW_WR_STREAM_NUM		8
260#define IPU8_PS_MMU_FW_WR_L1_BLOCKNR_REG	0x54
261#define IPU8_PS_MMU_FW_WR_L2_BLOCKNR_REG	0x74
262
263/* PS MMU FW Data RD VC0 */
264#define IPU8_PS_MMU_SRT_RD_OFFSET		0x14a000
265#define IPU8_PS_MMU_SRT_RD_STREAM_NUM		26
266#define IPU8_PS_MMU_SRT_RD_L1_BLOCKNR_REG	0x54
267#define IPU8_PS_MMU_SRT_RD_L2_BLOCKNR_REG	0xbc
268
269/* PS MMU FW Data WR VC0 */
270#define IPU8_PS_MMU_SRT_WR_OFFSET		0x14b000
271#define IPU8_PS_MMU_SRT_WR_STREAM_NUM		26
272#define IPU8_PS_MMU_SRT_WR_L1_BLOCKNR_REG	0x54
273#define IPU8_PS_MMU_SRT_WR_L2_BLOCKNR_REG	0xbc
274
275/* IS UAO UC RD */
276#define IPU8_IS_UAO_UC_RD_OFFSET		0x27a000
277#define IPU8_IS_UAO_UC_RD_PLANENUM		4
278
279/* IS UAO UC WR */
280#define IPU8_IS_UAO_UC_WR_OFFSET		0x27b000
281#define IPU8_IS_UAO_UC_WR_PLANENUM		4
282
283/* IS UAO M0 WR */
284#define IPU8_IS_UAO_M0_WR_OFFSET		0x27c000
285#define IPU8_IS_UAO_M0_WR_PLANENUM		16
286
287/* IS UAO M1 WR */
288#define IPU8_IS_UAO_M1_WR_OFFSET		0x27d000
289#define IPU8_IS_UAO_M1_WR_PLANENUM		16
290
291/* IS UAO UPIPE */
292#define IPU8_IS_UAO_UPIPE_OFFSET		0x27e000
293#define IPU8_IS_UAO_UPIPE_PLANENUM		6
294
295/* PS UAO FW RD */
296#define IPU8_PS_UAO_FW_RD_OFFSET		0x156000
297#define IPU8_PS_UAO_FW_RD_PLANENUM		12
298
299/* PS UAO FW WR */
300#define IPU8_PS_UAO_FW_WR_OFFSET		0x157000
301#define IPU8_PS_UAO_FW_WR_PLANENUM		8
302
303/* PS UAO SRT RD */
304#define IPU8_PS_UAO_SRT_RD_OFFSET		0x154000
305#define IPU8_PS_UAO_SRT_RD_PLANENUM		26
306
307/* PS UAO SRT WR */
308#define IPU8_PS_UAO_SRT_WR_OFFSET		0x155000
309#define IPU8_PS_UAO_SRT_WR_PLANENUM		26
310
311#define IPU8_IS_ZLX_UC_RD_OFFSET		0x275000
312#define IPU8_IS_ZLX_UC_WR_OFFSET		0x276000
313#define IPU8_IS_ZLX_M0_OFFSET			0x277000
314#define IPU8_IS_ZLX_M1_OFFSET			0x278000
315#define IPU8_IS_ZLX_UPIPE_OFFSET		0x279000
316#define IPU8_IS_ZLX_UC_RD_NUM			4
317#define IPU8_IS_ZLX_UC_WR_NUM			4
318#define IPU8_IS_ZLX_M0_NUM			16
319#define IPU8_IS_ZLX_M1_NUM			16
320#define IPU8_IS_ZLX_UPIPE_NUM			6
321
322#define IPU8_PS_ZLX_DATA_RD_OFFSET		0x14e000
323#define IPU8_PS_ZLX_DATA_WR_OFFSET		0x14f000
324#define IPU8_PS_ZLX_FW_RD_OFFSET		0x150000
325#define IPU8_PS_ZLX_FW_WR_OFFSET		0x151000
326#define IPU8_PS_ZLX_DATA_RD_NUM			26
327#define IPU8_PS_ZLX_DATA_WR_NUM			26
328#define IPU8_PS_ZLX_FW_RD_NUM			12
329#define IPU8_PS_ZLX_FW_WR_NUM			8
330
331#define MMU_REG_INVALIDATE_0			0x00
332#define MMU_REG_INVALIDATE_1			0x04
333#define MMU_REG_PAGE_TABLE_BASE_ADDR		0x08
334#define MMU_REG_USER_INFO_BITS			0x0c
335#define MMU_REG_AXI_REFILL_IF_ID		0x10
336#define MMU_REG_PW_EN_BITMAP			0x14
337#define MMU_REG_COLLAPSE_ENABLE_BITMAP		0x18
338#define MMU_REG_GENERAL_REG			0x1c
339#define MMU_REG_AT_SP_ARB_CFG			0x20
340#define MMU_REG_INVALIDATION_STATUS		0x24
341#define MMU_REG_IRQ_LEVEL_NO_PULSE		0x28
342#define MMU_REG_IRQ_MASK			0x2c
343#define MMU_REG_IRQ_ENABLE			0x30
344#define MMU_REG_IRQ_EDGE			0x34
345#define MMU_REG_IRQ_CLEAR			0x38
346#define MMU_REG_IRQ_CAUSE			0x3c
347#define MMU_REG_CG_CTRL_BITS			0x40
348#define MMU_REG_RD_FIFOS_STATUS			0x44
349#define MMU_REG_WR_FIFOS_STATUS			0x48
350#define MMU_REG_COMMON_FIFOS_STATUS		0x4c
351#define MMU_REG_FSM_STATUS			0x50
352
353#define ZLX_REG_AXI_POOL			0x0
354#define ZLX_REG_EN				0x20
355#define ZLX_REG_CONF				0x24
356#define ZLX_REG_CG_CTRL				0x900
357#define ZLX_REG_FORCE_BYPASS			0x904
358
359struct ipu7_mmu_info {
360	struct device *dev;
361
362	u32 *l1_pt;
363	u32 l1_pt_dma;
364	u32 **l2_pts;
365
366	u32 *dummy_l2_pt;
367	u32 dummy_l2_pteval;
368	void *dummy_page;
369	u32 dummy_page_pteval;
370
371	dma_addr_t aperture_start;
372	dma_addr_t aperture_end;
373	unsigned long pgsize_bitmap;
374
375	spinlock_t lock;	/* Serialize access to users */
376	struct ipu7_dma_mapping *dmap;
377};
378
379struct ipu7_mmu {
380	struct list_head node;
381
382	struct ipu7_mmu_hw *mmu_hw;
383	unsigned int nr_mmus;
384	unsigned int mmid;
385
386	phys_addr_t pgtbl;
387	struct device *dev;
388
389	struct ipu7_dma_mapping *dmap;
390	struct list_head vma_list;
391
392	struct page *trash_page;
393	dma_addr_t pci_trash_page; /* IOVA from PCI DMA services (parent) */
394	dma_addr_t iova_trash_page; /* IOVA for IPU child nodes to use */
395
396	bool ready;
397	spinlock_t ready_lock;	/* Serialize access to bool ready */
398
399	void (*tlb_invalidate)(struct ipu7_mmu *mmu);
400};
401
402struct ipu7_mmu *ipu7_mmu_init(struct device *dev,
403			       void __iomem *base, int mmid,
404			       const struct ipu7_hw_variants *hw);
405void ipu7_mmu_cleanup(struct ipu7_mmu *mmu);
406int ipu7_mmu_hw_init(struct ipu7_mmu *mmu);
407void ipu7_mmu_hw_cleanup(struct ipu7_mmu *mmu);
408int ipu7_mmu_map(struct ipu7_mmu_info *mmu_info, unsigned long iova,
409		 phys_addr_t paddr, size_t size);
410void ipu7_mmu_unmap(struct ipu7_mmu_info *mmu_info, unsigned long iova,
411		    size_t size);
412phys_addr_t ipu7_mmu_iova_to_phys(struct ipu7_mmu_info *mmu_info,
413				  dma_addr_t iova);
414#endif
~/ Read-only file preview.