forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/media/platform/rockchip/isp/common.c
....@@ -18,7 +18,25 @@
1818 *flag = SW_REG_CACHE;
1919 if (dev->hw_dev->is_single || is_direct) {
2020 *flag = SW_REG_CACHE_SYNC;
21
+ if (dev->isp_ver == ISP_V32 && reg <= 0x200)
22
+ rv1106_sdmmc_get_lock();
2123 writel(val, dev->hw_dev->base_addr + reg);
24
+ if (dev->isp_ver == ISP_V32 && reg <= 0x200)
25
+ rv1106_sdmmc_put_lock();
26
+ }
27
+}
28
+
29
+void rkisp_next_write(struct rkisp_device *dev, u32 reg, u32 val, bool is_direct)
30
+{
31
+ u32 offset = RKISP_ISP_SW_MAX_SIZE + reg;
32
+ u32 *mem = dev->sw_base_addr + offset;
33
+ u32 *flag = dev->sw_base_addr + offset + RKISP_ISP_SW_REG_SIZE;
34
+
35
+ *mem = val;
36
+ *flag = SW_REG_CACHE;
37
+ if (dev->hw_dev->is_single || is_direct) {
38
+ *flag = SW_REG_CACHE_SYNC;
39
+ writel(val, dev->hw_dev->base_next_addr + reg);
2240 }
2341 }
2442
....@@ -33,9 +51,15 @@
3351 return val;
3452 }
3553
36
-u32 rkisp_read_reg_cache(struct rkisp_device *dev, u32 reg)
54
+u32 rkisp_next_read(struct rkisp_device *dev, u32 reg, bool is_direct)
3755 {
38
- return *(u32 *)(dev->sw_base_addr + reg);
56
+ u32 val;
57
+
58
+ if (dev->hw_dev->is_single || is_direct)
59
+ val = readl(dev->hw_dev->base_next_addr + reg);
60
+ else
61
+ val = *(u32 *)(dev->sw_base_addr + RKISP_ISP_SW_MAX_SIZE + reg);
62
+ return val;
3963 }
4064
4165 void rkisp_set_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val, bool is_direct)
....@@ -45,6 +69,13 @@
4569 rkisp_write(dev, reg, val | tmp, is_direct);
4670 }
4771
72
+void rkisp_next_set_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val, bool is_direct)
73
+{
74
+ u32 tmp = rkisp_next_read(dev, reg, is_direct) & ~mask;
75
+
76
+ rkisp_next_write(dev, reg, val | tmp, is_direct);
77
+}
78
+
4879 void rkisp_clear_bits(struct rkisp_device *dev, u32 reg, u32 mask, bool is_direct)
4980 {
5081 u32 tmp = rkisp_read(dev, reg, is_direct);
....@@ -52,9 +83,70 @@
5283 rkisp_write(dev, reg, tmp & ~mask, is_direct);
5384 }
5485
86
+void rkisp_next_clear_bits(struct rkisp_device *dev, u32 reg, u32 mask, bool is_direct)
87
+{
88
+ u32 tmp = rkisp_next_read(dev, reg, is_direct);
89
+
90
+ rkisp_next_write(dev, reg, tmp & ~mask, is_direct);
91
+}
92
+
93
+void rkisp_write_reg_cache(struct rkisp_device *dev, u32 reg, u32 val)
94
+{
95
+ u32 *mem = dev->sw_base_addr + reg;
96
+
97
+ *mem = val;
98
+}
99
+
100
+void rkisp_next_write_reg_cache(struct rkisp_device *dev, u32 reg, u32 val)
101
+{
102
+ u32 offset = RKISP_ISP_SW_MAX_SIZE + reg;
103
+ u32 *mem = dev->sw_base_addr + offset;
104
+
105
+ *mem = val;
106
+}
107
+
108
+u32 rkisp_read_reg_cache(struct rkisp_device *dev, u32 reg)
109
+{
110
+ return *(u32 *)(dev->sw_base_addr + reg);
111
+}
112
+
113
+u32 rkisp_next_read_reg_cache(struct rkisp_device *dev, u32 reg)
114
+{
115
+ return *(u32 *)(dev->sw_base_addr + RKISP_ISP_SW_MAX_SIZE + reg);
116
+}
117
+
118
+void rkisp_set_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val)
119
+{
120
+ u32 tmp = rkisp_read_reg_cache(dev, reg) & ~mask;
121
+
122
+ rkisp_write_reg_cache(dev, reg, val | tmp);
123
+}
124
+
125
+void rkisp_next_set_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask, u32 val)
126
+{
127
+ u32 tmp = rkisp_next_read_reg_cache(dev, reg) & ~mask;
128
+
129
+ rkisp_next_write_reg_cache(dev, reg, val | tmp);
130
+}
131
+
132
+void rkisp_clear_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask)
133
+{
134
+ u32 tmp = rkisp_read_reg_cache(dev, reg);
135
+
136
+ rkisp_write_reg_cache(dev, reg, tmp & ~mask);
137
+}
138
+
139
+void rkisp_next_clear_reg_cache_bits(struct rkisp_device *dev, u32 reg, u32 mask)
140
+{
141
+ u32 tmp = rkisp_next_read_reg_cache(dev, reg);
142
+
143
+ rkisp_next_write_reg_cache(dev, reg, tmp & ~mask);
144
+}
145
+
55146 void rkisp_update_regs(struct rkisp_device *dev, u32 start, u32 end)
56147 {
57
- void __iomem *base = dev->hw_dev->base_addr;
148
+ struct rkisp_hw_dev *hw = dev->hw_dev;
149
+ void __iomem *base = hw->base_addr;
58150 u32 i;
59151
60152 if (end > RKISP_ISP_SW_REG_SIZE - 4) {
....@@ -65,8 +157,30 @@
65157 u32 *val = dev->sw_base_addr + i;
66158 u32 *flag = dev->sw_base_addr + i + RKISP_ISP_SW_REG_SIZE;
67159
68
- if (*flag == SW_REG_CACHE)
160
+ if (dev->procfs.mode & RKISP_PROCFS_FIL_SW) {
161
+ if (!((i >= ISP3X_ISP_ACQ_H_OFFS && i <= ISP3X_ISP_ACQ_V_SIZE) ||
162
+ (i >= ISP3X_ISP_OUT_H_OFFS && i <= ISP3X_ISP_OUT_V_SIZE) ||
163
+ (i >= ISP3X_DUAL_CROP_BASE && i < ISP3X_DUAL_CROP_FBC_V_SIZE_SHD) ||
164
+ (i >= ISP3X_MAIN_RESIZE_BASE && i < ISP3X_CSI2RX_VERSION) ||
165
+ (i >= CIF_ISP_IS_BASE && i < CIF_ISP_IS_V_SIZE_SHD)))
166
+ continue;
167
+ }
168
+
169
+ if (*flag == SW_REG_CACHE) {
170
+ if ((i == ISP3X_MAIN_RESIZE_CTRL ||
171
+ i == ISP32_BP_RESIZE_CTRL ||
172
+ i == ISP3X_SELF_RESIZE_CTRL) && *val == 0)
173
+ *val = CIF_RSZ_CTRL_CFG_UPD;
69174 writel(*val, base + i);
175
+ if (hw->is_unite) {
176
+ val = dev->sw_base_addr + i + RKISP_ISP_SW_MAX_SIZE;
177
+ if ((i == ISP3X_MAIN_RESIZE_CTRL ||
178
+ i == ISP32_BP_RESIZE_CTRL ||
179
+ i == ISP3X_SELF_RESIZE_CTRL) && *val == 0)
180
+ *val = CIF_RSZ_CTRL_CFG_UPD;
181
+ writel(*val, hw->base_next_addr + i);
182
+ }
183
+ }
70184 }
71185 }
72186
....@@ -78,6 +192,8 @@
78192 struct sg_table *sg_tbl;
79193 void *mem_priv;
80194 int ret = 0;
195
+
196
+ mutex_lock(&dev->buf_lock);
81197
82198 if (!buf->size) {
83199 ret = -EINVAL;
....@@ -119,8 +235,10 @@
119235 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
120236 "%s buf:0x%x~0x%x size:%d\n", __func__,
121237 (u32)buf->dma_addr, (u32)buf->dma_addr + buf->size, buf->size);
238
+ mutex_unlock(&dev->buf_lock);
122239 return ret;
123240 err:
241
+ mutex_unlock(&dev->buf_lock);
124242 dev_err(dev->dev, "%s failed ret:%d\n", __func__, ret);
125243 return ret;
126244 }
....@@ -130,6 +248,7 @@
130248 {
131249 const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
132250
251
+ mutex_lock(&dev->buf_lock);
133252 if (buf && buf->mem_priv) {
134253 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
135254 "%s buf:0x%x~0x%x\n", __func__,
....@@ -145,6 +264,7 @@
145264 buf->is_need_vaddr = false;
146265 buf->is_need_dmafd = false;
147266 }
267
+ mutex_unlock(&dev->buf_lock);
148268 }
149269
150270 void rkisp_prepare_buffer(struct rkisp_device *dev,
....@@ -190,8 +310,6 @@
190310 return -EINVAL;
191311 }
192312
193
- if (hw->dev_num)
194
- hw->is_single = false;
195313 isp->dev_id = hw->dev_num;
196314 hw->isp[hw->dev_num] = isp;
197315 hw->dev_num++;
....@@ -269,7 +387,7 @@
269387 struct rkisp_dummy_buffer *dummy_buf = &hw->dummy_buf;
270388 struct rkisp_stream *stream;
271389 struct rkisp_device *isp;
272
- u32 i, j, size = 0;
390
+ u32 i, j, val, size = 0;
273391 int ret = 0;
274392
275393 if (dummy_buf->mem_priv)
....@@ -279,13 +397,17 @@
279397 size = hw->max_in.w * hw->max_in.h * 2;
280398 for (i = 0; i < hw->dev_num; i++) {
281399 isp = hw->isp[i];
400
+ if (!isp || (isp && !isp->is_hw_link))
401
+ continue;
282402 for (j = 0; j < RKISP_MAX_STREAM; j++) {
283403 stream = &isp->cap_dev.stream[j];
284404 if (!stream->linked)
285405 continue;
286
- size = max(size,
287
- stream->out_fmt.plane_fmt[0].bytesperline *
288
- stream->out_fmt.height);
406
+ val = stream->out_isp_fmt.fmt_type == FMT_FBC ?
407
+ stream->out_fmt.plane_fmt[1].sizeimage :
408
+ stream->out_fmt.plane_fmt[0].bytesperline *
409
+ stream->out_fmt.height;
410
+ size = max(size, val);
289411 }
290412 }
291413 if (size == 0)