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