.. | .. |
---|
12 | 12 | #include "isp_params_v1x.h" |
---|
13 | 13 | #include "isp_params_v2x.h" |
---|
14 | 14 | #include "isp_params_v21.h" |
---|
| 15 | +#include "isp_params_v3x.h" |
---|
| 16 | +#include "isp_params_v32.h" |
---|
| 17 | +#include "regs.h" |
---|
15 | 18 | |
---|
16 | 19 | #define PARAMS_NAME DRIVER_NAME "-input-params" |
---|
17 | 20 | #define RKISP_ISP_PARAMS_REQ_BUFS_MIN 2 |
---|
.. | .. |
---|
126 | 129 | params_vdev->ops->get_param_size(params_vdev, sizes); |
---|
127 | 130 | |
---|
128 | 131 | INIT_LIST_HEAD(¶ms_vdev->params); |
---|
| 132 | + |
---|
| 133 | + if (params_vdev->first_cfg_params) { |
---|
| 134 | + params_vdev->first_cfg_params = false; |
---|
| 135 | + return 0; |
---|
| 136 | + } |
---|
| 137 | + |
---|
129 | 138 | params_vdev->first_params = true; |
---|
130 | 139 | |
---|
131 | 140 | return 0; |
---|
.. | .. |
---|
137 | 146 | struct rkisp_buffer *params_buf = to_rkisp_buffer(vbuf); |
---|
138 | 147 | struct vb2_queue *vq = vb->vb2_queue; |
---|
139 | 148 | struct rkisp_isp_params_vdev *params_vdev = vq->drv_priv; |
---|
| 149 | + struct rkisp_device *dev = params_vdev->dev; |
---|
140 | 150 | void *first_param; |
---|
141 | 151 | unsigned long flags; |
---|
142 | | - |
---|
143 | 152 | unsigned int cur_frame_id = -1; |
---|
144 | | - cur_frame_id = atomic_read(¶ms_vdev->dev->isp_sdev.frm_sync_seq) - 1; |
---|
| 153 | + |
---|
| 154 | + cur_frame_id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; |
---|
145 | 155 | if (params_vdev->first_params) { |
---|
146 | 156 | first_param = vb2_plane_vaddr(vb, 0); |
---|
147 | 157 | params_vdev->ops->save_first_param(params_vdev, first_param); |
---|
| 158 | + params_vdev->is_first_cfg = true; |
---|
148 | 159 | vbuf->sequence = cur_frame_id; |
---|
149 | 160 | vb2_buffer_done(¶ms_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
---|
150 | 161 | params_vdev->first_params = false; |
---|
151 | 162 | wake_up(¶ms_vdev->dev->sync_onoff); |
---|
152 | | - dev_info(params_vdev->dev->dev, "first params buf queue\n"); |
---|
| 163 | + if (dev->is_first_double) { |
---|
| 164 | + dev_info(dev->dev, "first params for fast\n"); |
---|
| 165 | + dev->is_first_double = false; |
---|
| 166 | + dev->sw_rd_cnt = 0; |
---|
| 167 | + if (dev->hw_dev->unite == ISP_UNITE_ONE) { |
---|
| 168 | + dev->unite_index = ISP_UNITE_LEFT; |
---|
| 169 | + dev->sw_rd_cnt += dev->hw_dev->is_multi_overflow ? 3 : 1; |
---|
| 170 | + } |
---|
| 171 | + params_vdev->rdbk_times = dev->sw_rd_cnt + 1; |
---|
| 172 | + rkisp_trigger_read_back(dev, false, false, false); |
---|
| 173 | + } |
---|
| 174 | + dev_info(dev->dev, "first params buf queue\n"); |
---|
| 175 | + return; |
---|
| 176 | + } |
---|
| 177 | + |
---|
| 178 | + if (dev->procfs.mode & |
---|
| 179 | + (RKISP_PROCFS_FIL_AIQ | RKISP_PROCFS_FIL_SW)) { |
---|
| 180 | + vb2_buffer_done(¶ms_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
---|
153 | 181 | return; |
---|
154 | 182 | } |
---|
155 | 183 | |
---|
.. | .. |
---|
157 | 185 | spin_lock_irqsave(¶ms_vdev->config_lock, flags); |
---|
158 | 186 | list_add_tail(¶ms_buf->queue, ¶ms_vdev->params); |
---|
159 | 187 | spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); |
---|
| 188 | + |
---|
| 189 | + if (params_vdev->dev->is_first_double) { |
---|
| 190 | + struct isp32_isp_params_cfg *params = params_buf->vaddr[0]; |
---|
| 191 | + struct rkisp_buffer *buf; |
---|
| 192 | + |
---|
| 193 | + if (!(params->module_cfg_update & ISP32_MODULE_RTT_FST)) |
---|
| 194 | + return; |
---|
| 195 | + spin_lock_irqsave(¶ms_vdev->config_lock, flags); |
---|
| 196 | + while (!list_empty(¶ms_vdev->params)) { |
---|
| 197 | + buf = list_first_entry(¶ms_vdev->params, |
---|
| 198 | + struct rkisp_buffer, queue); |
---|
| 199 | + if (buf == params_buf) |
---|
| 200 | + break; |
---|
| 201 | + list_del(&buf->queue); |
---|
| 202 | + vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
---|
| 203 | + } |
---|
| 204 | + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); |
---|
| 205 | + dev_info(params_vdev->dev->dev, |
---|
| 206 | + "first params:%d for rtt resume\n", params->frame_id); |
---|
| 207 | + params_vdev->dev->is_first_double = false; |
---|
| 208 | + rkisp_trigger_read_back(params_vdev->dev, false, false, false); |
---|
| 209 | + } |
---|
160 | 210 | } |
---|
161 | 211 | |
---|
162 | 212 | static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq) |
---|
.. | .. |
---|
165 | 215 | struct rkisp_device *dev = params_vdev->dev; |
---|
166 | 216 | struct rkisp_buffer *buf; |
---|
167 | 217 | unsigned long flags; |
---|
168 | | - int i; |
---|
169 | 218 | |
---|
170 | 219 | /* stop params input firstly */ |
---|
171 | 220 | spin_lock_irqsave(¶ms_vdev->config_lock, flags); |
---|
172 | 221 | params_vdev->streamon = false; |
---|
173 | 222 | wake_up(&dev->sync_onoff); |
---|
174 | | - spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); |
---|
175 | | - |
---|
176 | | - for (i = 0; i < RKISP_ISP_PARAMS_REQ_BUFS_MAX; i++) { |
---|
177 | | - spin_lock_irqsave(¶ms_vdev->config_lock, flags); |
---|
178 | | - if (!list_empty(¶ms_vdev->params)) { |
---|
179 | | - buf = list_first_entry(¶ms_vdev->params, |
---|
180 | | - struct rkisp_buffer, queue); |
---|
181 | | - list_del(&buf->queue); |
---|
182 | | - spin_unlock_irqrestore(¶ms_vdev->config_lock, |
---|
183 | | - flags); |
---|
184 | | - } else { |
---|
185 | | - spin_unlock_irqrestore(¶ms_vdev->config_lock, |
---|
186 | | - flags); |
---|
187 | | - break; |
---|
188 | | - } |
---|
189 | | - |
---|
190 | | - if (buf) |
---|
191 | | - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); |
---|
192 | | - buf = NULL; |
---|
| 223 | + while (!list_empty(¶ms_vdev->params)) { |
---|
| 224 | + buf = list_first_entry(¶ms_vdev->params, |
---|
| 225 | + struct rkisp_buffer, queue); |
---|
| 226 | + list_del(&buf->queue); |
---|
| 227 | + vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); |
---|
193 | 228 | } |
---|
194 | | - |
---|
195 | 229 | if (params_vdev->cur_buf) { |
---|
196 | 230 | buf = params_vdev->cur_buf; |
---|
197 | 231 | vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); |
---|
198 | 232 | params_vdev->cur_buf = NULL; |
---|
199 | 233 | } |
---|
| 234 | + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); |
---|
200 | 235 | |
---|
| 236 | + if (dev->is_pre_on) { |
---|
| 237 | + params_vdev->first_cfg_params = true; |
---|
| 238 | + return; |
---|
| 239 | + } |
---|
201 | 240 | rkisp_params_disable_isp(params_vdev); |
---|
202 | 241 | /* clean module params */ |
---|
203 | 242 | params_vdev->ops->clear_first_param(params_vdev); |
---|
.. | .. |
---|
210 | 249 | struct rkisp_isp_params_vdev *params_vdev = queue->drv_priv; |
---|
211 | 250 | unsigned long flags; |
---|
212 | 251 | |
---|
213 | | - params_vdev->is_first_cfg = true; |
---|
214 | 252 | params_vdev->hdrtmo_en = false; |
---|
| 253 | + params_vdev->afaemode_en = false; |
---|
215 | 254 | params_vdev->cur_buf = NULL; |
---|
216 | 255 | spin_lock_irqsave(¶ms_vdev->config_lock, flags); |
---|
217 | 256 | params_vdev->streamon = true; |
---|
.. | .. |
---|
235 | 274 | struct rkisp_isp_params_vdev *params = video_drvdata(filp); |
---|
236 | 275 | int ret; |
---|
237 | 276 | |
---|
| 277 | + if (!params->dev->is_probe_end) |
---|
| 278 | + return -EINVAL; |
---|
| 279 | + |
---|
238 | 280 | ret = v4l2_fh_open(filp); |
---|
239 | 281 | if (!ret) { |
---|
240 | | - ret = v4l2_pipeline_pm_use(¶ms->vnode.vdev.entity, 1); |
---|
| 282 | + ret = v4l2_pipeline_pm_get(¶ms->vnode.vdev.entity); |
---|
241 | 283 | if (ret < 0) |
---|
242 | 284 | vb2_fop_release(filp); |
---|
243 | 285 | } |
---|
.. | .. |
---|
248 | 290 | static int rkisp_params_fop_release(struct file *file) |
---|
249 | 291 | { |
---|
250 | 292 | struct rkisp_isp_params_vdev *params = video_drvdata(file); |
---|
251 | | - struct video_device *vdev = video_devdata(file); |
---|
252 | 293 | int ret; |
---|
253 | 294 | |
---|
254 | | - if (file->private_data == vdev->queue->owner && params->ops->fop_release) |
---|
255 | | - params->ops->fop_release(params); |
---|
256 | | - |
---|
257 | 295 | ret = vb2_fop_release(file); |
---|
258 | | - if (!ret) { |
---|
259 | | - ret = v4l2_pipeline_pm_use(¶ms->vnode.vdev.entity, 0); |
---|
260 | | - if (ret < 0) |
---|
261 | | - v4l2_err(¶ms->dev->v4l2_dev, |
---|
262 | | - "set pipeline power failed %d\n", ret); |
---|
263 | | - } |
---|
| 296 | + if (!ret) |
---|
| 297 | + v4l2_pipeline_pm_put(¶ms->vnode.vdev.entity); |
---|
264 | 298 | return ret; |
---|
| 299 | +} |
---|
| 300 | + |
---|
| 301 | +static __poll_t rkisp_params_fop_poll(struct file *file, poll_table *wait) |
---|
| 302 | +{ |
---|
| 303 | + struct video_device *vdev = video_devdata(file); |
---|
| 304 | + |
---|
| 305 | + /* buf done or subscribe event */ |
---|
| 306 | + if (vdev->queue->owner == file->private_data) |
---|
| 307 | + return vb2_fop_poll(file, wait); |
---|
| 308 | + else |
---|
| 309 | + return v4l2_ctrl_poll(file, wait); |
---|
265 | 310 | } |
---|
266 | 311 | |
---|
267 | 312 | struct v4l2_file_operations rkisp_params_fops = { |
---|
268 | 313 | .mmap = vb2_fop_mmap, |
---|
269 | 314 | .unlocked_ioctl = video_ioctl2, |
---|
270 | | - .poll = vb2_fop_poll, |
---|
| 315 | + .poll = rkisp_params_fop_poll, |
---|
271 | 316 | .open = rkisp_params_fh_open, |
---|
272 | 317 | .release = rkisp_params_fop_release |
---|
273 | 318 | }; |
---|
.. | .. |
---|
291 | 336 | |
---|
292 | 337 | static int rkisp_init_params_vdev(struct rkisp_isp_params_vdev *params_vdev) |
---|
293 | 338 | { |
---|
294 | | - params_vdev->vdev_fmt.fmt.meta.dataformat = |
---|
295 | | - V4L2_META_FMT_RK_ISP1_PARAMS; |
---|
296 | | - params_vdev->vdev_fmt.fmt.meta.buffersize = |
---|
297 | | - sizeof(struct rkisp1_isp_params_cfg); |
---|
| 339 | + int ret; |
---|
298 | 340 | |
---|
299 | 341 | if (params_vdev->dev->isp_ver <= ISP_V13) |
---|
300 | | - return rkisp_init_params_vdev_v1x(params_vdev); |
---|
| 342 | + ret = rkisp_init_params_vdev_v1x(params_vdev); |
---|
301 | 343 | else if (params_vdev->dev->isp_ver == ISP_V21) |
---|
302 | | - return rkisp_init_params_vdev_v21(params_vdev); |
---|
| 344 | + ret = rkisp_init_params_vdev_v21(params_vdev); |
---|
| 345 | + else if (params_vdev->dev->isp_ver == ISP_V20) |
---|
| 346 | + ret = rkisp_init_params_vdev_v2x(params_vdev); |
---|
| 347 | + else if (params_vdev->dev->isp_ver == ISP_V30) |
---|
| 348 | + ret = rkisp_init_params_vdev_v3x(params_vdev); |
---|
303 | 349 | else |
---|
304 | | - return rkisp_init_params_vdev_v2x(params_vdev); |
---|
| 350 | + ret = rkisp_init_params_vdev_v32(params_vdev); |
---|
| 351 | + |
---|
| 352 | + params_vdev->vdev_fmt.fmt.meta.dataformat = |
---|
| 353 | + V4L2_META_FMT_RK_ISP1_PARAMS; |
---|
| 354 | + if (params_vdev->ops && params_vdev->ops->get_param_size) |
---|
| 355 | + params_vdev->ops->get_param_size(params_vdev, |
---|
| 356 | + ¶ms_vdev->vdev_fmt.fmt.meta.buffersize); |
---|
| 357 | + return ret; |
---|
305 | 358 | } |
---|
306 | 359 | |
---|
307 | 360 | static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev) |
---|
.. | .. |
---|
310 | 363 | rkisp_uninit_params_vdev_v1x(params_vdev); |
---|
311 | 364 | else if (params_vdev->dev->isp_ver == ISP_V21) |
---|
312 | 365 | rkisp_uninit_params_vdev_v21(params_vdev); |
---|
313 | | - else |
---|
| 366 | + else if (params_vdev->dev->isp_ver == ISP_V20) |
---|
314 | 367 | rkisp_uninit_params_vdev_v2x(params_vdev); |
---|
| 368 | + else if (params_vdev->dev->isp_ver == ISP_V30) |
---|
| 369 | + rkisp_uninit_params_vdev_v3x(params_vdev); |
---|
| 370 | + else |
---|
| 371 | + rkisp_uninit_params_vdev_v32(params_vdev); |
---|
315 | 372 | } |
---|
316 | 373 | |
---|
317 | 374 | void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id) |
---|
.. | .. |
---|
320 | 377 | params_vdev->ops->param_cfg(params_vdev, frame_id, RKISP_PARAMS_IMD); |
---|
321 | 378 | } |
---|
322 | 379 | |
---|
323 | | -void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev) |
---|
| 380 | +void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, bool is_check) |
---|
324 | 381 | { |
---|
325 | | - /* multi device to switch sram config */ |
---|
326 | | - if (params_vdev->dev->hw_dev->is_single) |
---|
327 | | - return; |
---|
| 382 | + if (is_check) { |
---|
| 383 | + if (params_vdev->dev->procfs.mode & RKISP_PROCFS_FIL_SW) |
---|
| 384 | + return; |
---|
328 | 385 | |
---|
| 386 | + /* multi device to switch sram config */ |
---|
| 387 | + if (params_vdev->dev->hw_dev->is_single) |
---|
| 388 | + return; |
---|
| 389 | + } |
---|
329 | 390 | if (params_vdev->ops->param_cfgsram) |
---|
330 | 391 | params_vdev->ops->param_cfgsram(params_vdev); |
---|
331 | 392 | } |
---|
.. | .. |
---|
341 | 402 | struct ispsd_in_fmt *in_fmt, |
---|
342 | 403 | enum v4l2_quantization quantization) |
---|
343 | 404 | { |
---|
| 405 | + struct rkisp_device *dev = params_vdev->dev; |
---|
| 406 | + |
---|
344 | 407 | if (!params_vdev->is_first_cfg) |
---|
345 | 408 | return; |
---|
346 | 409 | params_vdev->is_first_cfg = false; |
---|
.. | .. |
---|
348 | 411 | params_vdev->raw_type = in_fmt->bayer_pat; |
---|
349 | 412 | params_vdev->in_mbus_code = in_fmt->mbus_code; |
---|
350 | 413 | params_vdev->ops->first_cfg(params_vdev); |
---|
| 414 | + /* update selfpath range if it output rgb format */ |
---|
| 415 | + if (params_vdev->quantization != quantization) { |
---|
| 416 | + struct rkisp_stream *stream = &dev->cap_dev.stream[RKISP_STREAM_SP]; |
---|
| 417 | + u32 mask = CIF_MI_SP_Y_FULL_YUV2RGB | CIF_MI_SP_CBCR_FULL_YUV2RGB; |
---|
| 418 | + |
---|
| 419 | + quantization = params_vdev->quantization; |
---|
| 420 | + if (stream->streaming && |
---|
| 421 | + stream->out_isp_fmt.fmt_type == FMT_RGB) |
---|
| 422 | + rkisp_unite_set_bits(dev, ISP3X_MI_WR_CTRL, mask, |
---|
| 423 | + quantization == V4L2_QUANTIZATION_FULL_RANGE ? |
---|
| 424 | + mask : 0, false); |
---|
| 425 | + dev->isp_sdev.quantization = quantization; |
---|
| 426 | + } |
---|
351 | 427 | } |
---|
352 | 428 | |
---|
353 | 429 | /* Not called when the camera active, thus not isr protection. */ |
---|
.. | .. |
---|
364 | 440 | params_vdev->ops->get_meshbuf_inf(params_vdev, meshbuf); |
---|
365 | 441 | } |
---|
366 | 442 | |
---|
367 | | -void rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, |
---|
368 | | - void *meshsize) |
---|
| 443 | +int rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, |
---|
| 444 | + void *meshsize) |
---|
369 | 445 | { |
---|
370 | 446 | if (params_vdev->ops->set_meshbuf_size) |
---|
371 | | - params_vdev->ops->set_meshbuf_size(params_vdev, meshsize); |
---|
| 447 | + return params_vdev->ops->set_meshbuf_size(params_vdev, |
---|
| 448 | + meshsize); |
---|
| 449 | + else |
---|
| 450 | + return -EINVAL; |
---|
| 451 | +} |
---|
| 452 | + |
---|
| 453 | +void rkisp_params_meshbuf_free(struct rkisp_isp_params_vdev *params_vdev, u64 id) |
---|
| 454 | +{ |
---|
| 455 | + /* isp working no to free buf */ |
---|
| 456 | + if (params_vdev->ops->free_meshbuf && |
---|
| 457 | + !(params_vdev->dev->isp_state & ISP_START)) |
---|
| 458 | + params_vdev->ops->free_meshbuf(params_vdev, id); |
---|
372 | 459 | } |
---|
373 | 460 | |
---|
374 | 461 | void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev) |
---|
375 | 462 | { |
---|
| 463 | + /* isp stop to free buf */ |
---|
376 | 464 | if (params_vdev->ops->stream_stop) |
---|
377 | 465 | params_vdev->ops->stream_stop(params_vdev); |
---|
| 466 | + if (params_vdev->ops->fop_release) |
---|
| 467 | + params_vdev->ops->fop_release(params_vdev); |
---|
| 468 | + params_vdev->first_cfg_params = false; |
---|
| 469 | +} |
---|
| 470 | + |
---|
| 471 | +bool rkisp_params_check_bigmode(struct rkisp_isp_params_vdev *params_vdev) |
---|
| 472 | +{ |
---|
| 473 | + if (params_vdev->ops->check_bigmode) |
---|
| 474 | + return params_vdev->ops->check_bigmode(params_vdev); |
---|
| 475 | + |
---|
| 476 | + return 0; |
---|
| 477 | +} |
---|
| 478 | + |
---|
| 479 | +int rkisp_params_info2ddr_cfg(struct rkisp_isp_params_vdev *params_vdev, |
---|
| 480 | + void *arg) |
---|
| 481 | +{ |
---|
| 482 | + int ret = -EINVAL; |
---|
| 483 | + |
---|
| 484 | + if (params_vdev->ops->info2ddr_cfg) |
---|
| 485 | + ret = params_vdev->ops->info2ddr_cfg(params_vdev, arg); |
---|
| 486 | + |
---|
| 487 | + return ret; |
---|
378 | 488 | } |
---|
379 | 489 | |
---|
380 | 490 | int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev, |
---|
.. | .. |
---|
414 | 524 | ret = media_entity_pads_init(&vdev->entity, 1, &node->pad); |
---|
415 | 525 | if (ret < 0) |
---|
416 | 526 | goto err_release_queue; |
---|
417 | | - ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); |
---|
| 527 | + ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); |
---|
418 | 528 | if (ret < 0) { |
---|
419 | 529 | dev_err(&vdev->dev, |
---|
420 | 530 | "could not register Video for Linux device\n"); |
---|