xref: /linux/drivers/staging/media/ipu7/ipu7-isys.h (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2013 - 2025 Intel Corporation
4  */
5 
6 #ifndef IPU7_ISYS_H
7 #define IPU7_ISYS_H
8 
9 #include <linux/irqreturn.h>
10 #include <linux/list.h>
11 #include <linux/mutex.h>
12 #include <linux/pm_qos.h>
13 #include <linux/spinlock_types.h>
14 #include <linux/types.h>
15 
16 #include <media/media-device.h>
17 #include <media/v4l2-async.h>
18 #include <media/v4l2-device.h>
19 #include <media/v4l2-mediabus.h>
20 
21 #include "abi/ipu7_fw_msg_abi.h"
22 #include "abi/ipu7_fw_isys_abi.h"
23 
24 #include "ipu7.h"
25 #include "ipu7-isys-csi2.h"
26 #include "ipu7-isys-video.h"
27 
28 #define IPU_ISYS_ENTITY_PREFIX		"Intel IPU7"
29 
30 /* FW support max 16 streams */
31 #define IPU_ISYS_MAX_STREAMS		16U
32 
33 /*
34  * Current message queue configuration. These must be big enough
35  * so that they never gets full. Queues are located in system memory
36  */
37 #define IPU_ISYS_SIZE_RECV_QUEUE	40U
38 #define IPU_ISYS_SIZE_LOG_QUEUE		256U
39 #define IPU_ISYS_SIZE_SEND_QUEUE	40U
40 #define IPU_ISYS_NUM_RECV_QUEUE		1U
41 
42 #define IPU_ISYS_MIN_WIDTH		2U
43 #define IPU_ISYS_MIN_HEIGHT		2U
44 #define IPU_ISYS_MAX_WIDTH		8160U
45 #define IPU_ISYS_MAX_HEIGHT		8190U
46 
47 #define FW_CALL_TIMEOUT_JIFFIES		\
48 	msecs_to_jiffies(IPU_LIB_CALL_TIMEOUT_MS)
49 
50 struct isys_fw_log {
51 	struct mutex mutex; /* protect whole struct */
52 	void *head;
53 	void *addr;
54 	u32 count; /* running counter of log */
55 	u32 size; /* actual size of log content, in bits */
56 };
57 
58 /*
59  * struct ipu7_isys
60  *
61  * @media_dev: Media device
62  * @v4l2_dev: V4L2 device
63  * @adev: ISYS bus device
64  * @power: Is ISYS powered on or not?
65  * @isr_bits: Which bits does the ISR handle?
66  * @power_lock: Serialise access to power (power state in general)
67  * @csi2_rx_ctrl_cached: cached shared value between all CSI2 receivers
68  * @streams_lock: serialise access to streams
69  * @streams: streams per firmware stream ID
70  * @syscom: fw communication layer context
71  * @ref_count: total number of callers fw open
72  * @mutex: serialise access isys video open/release related operations
73  * @stream_mutex: serialise stream start and stop, queueing requests
74  * @pdata: platform data pointer
75  * @csi2: CSI-2 receivers
76  */
77 struct ipu7_isys {
78 	struct media_device media_dev;
79 	struct v4l2_device v4l2_dev;
80 	struct ipu7_bus_device *adev;
81 
82 	int power;
83 	spinlock_t power_lock;	/* Serialise access to power */
84 	u32 isr_csi2_mask;
85 	u32 csi2_rx_ctrl_cached;
86 	spinlock_t streams_lock;
87 	struct ipu7_isys_stream streams[IPU_ISYS_MAX_STREAMS];
88 	int streams_ref_count[IPU_ISYS_MAX_STREAMS];
89 	u32 phy_rext_cal;
90 	bool icache_prefetch;
91 	bool csi2_cse_ipc_not_supported;
92 	unsigned int ref_count;
93 	unsigned int stream_opened;
94 
95 	struct mutex mutex;	/* Serialise isys video open/release related */
96 	struct mutex stream_mutex;	/* Stream start, stop, queueing reqs */
97 
98 	struct ipu7_isys_pdata *pdata;
99 
100 	struct ipu7_isys_csi2 *csi2;
101 	struct isys_fw_log *fw_log;
102 
103 	struct list_head requests;
104 	struct pm_qos_request pm_qos;
105 	spinlock_t listlock;	/* Protect framebuflist */
106 	struct list_head framebuflist;
107 	struct list_head framebuflist_fw;
108 	struct v4l2_async_notifier notifier;
109 
110 	struct ipu7_insys_config *subsys_config;
111 	dma_addr_t subsys_config_dma_addr;
112 };
113 
114 struct isys_fw_msgs {
115 	union {
116 		u64 dummy;
117 		struct ipu7_insys_buffset frame;
118 		struct ipu7_insys_stream_cfg stream;
119 	} fw_msg;
120 	struct list_head head;
121 	dma_addr_t dma_addr;
122 };
123 
124 struct ipu7_isys_csi2_config {
125 	unsigned int nlanes;
126 	unsigned int port;
127 	enum v4l2_mbus_type bus_type;
128 };
129 
130 struct sensor_async_sd {
131 	struct v4l2_async_connection asc;
132 	struct ipu7_isys_csi2_config csi2;
133 };
134 
135 struct isys_fw_msgs *ipu7_get_fw_msg_buf(struct ipu7_isys_stream *stream);
136 void ipu7_put_fw_msg_buf(struct ipu7_isys *isys, uintptr_t data);
137 void ipu7_cleanup_fw_msg_bufs(struct ipu7_isys *isys);
138 int isys_isr_one(struct ipu7_bus_device *adev);
139 void ipu7_isys_setup_hw(struct ipu7_isys *isys);
140 #endif /* IPU7_ISYS_H */
141