Message ID | 20200815103734.31153-8-dafna.hirschfeld@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: staging: rkisp1: various bug fixes | expand |
Hi Dafna, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linuxtv-media/master] [also build test WARNING on v5.8 next-20200814] [cannot apply to staging/staging-testing] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Dafna-Hirschfeld/media-staging-rkisp1-various-bug-fixes/20200816-090416 base: git://linuxtv.org/media_tree.git master config: xtensa-allyesconfig (attached as .config) compiler: xtensa-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): In file included from include/linux/kernel.h:11, from include/linux/list.h:9, from include/linux/preempt.h:11, from include/linux/spinlock.h:51, from include/linux/seqlock.h:36, from include/linux/time.h:6, from include/media/v4l2-common.h:17, from drivers/staging/media/rkisp1/rkisp1-params.c:8: include/linux/scatterlist.h: In function 'sg_set_buf': arch/xtensa/include/asm/page.h:193:9: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits] 193 | ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr) | ^~ include/linux/compiler.h:78:42: note: in definition of macro 'unlikely' 78 | # define unlikely(x) __builtin_expect(!!(x), 0) | ^ include/linux/scatterlist.h:143:2: note: in expansion of macro 'BUG_ON' 143 | BUG_ON(!virt_addr_valid(buf)); | ^~~~~~ arch/xtensa/include/asm/page.h:201:32: note: in expansion of macro 'pfn_valid' 201 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | ^~~~~~~~~ include/linux/scatterlist.h:143:10: note: in expansion of macro 'virt_addr_valid' 143 | BUG_ON(!virt_addr_valid(buf)); | ^~~~~~~~~~~~~~~ In file included from ./arch/xtensa/include/generated/asm/bug.h:1, from include/linux/bug.h:5, from include/linux/thread_info.h:12, from include/asm-generic/preempt.h:5, from ./arch/xtensa/include/generated/asm/preempt.h:1, from include/linux/preempt.h:78, from include/linux/spinlock.h:51, from include/linux/seqlock.h:36, from include/linux/time.h:6, from include/media/v4l2-common.h:17, from drivers/staging/media/rkisp1/rkisp1-params.c:8: include/linux/dma-mapping.h: In function 'dma_map_resource': arch/xtensa/include/asm/page.h:193:9: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits] 193 | ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr) | ^~ include/asm-generic/bug.h:144:27: note: in definition of macro 'WARN_ON_ONCE' 144 | int __ret_warn_once = !!(condition); \ | ^~~~~~~~~ include/linux/dma-mapping.h:352:19: note: in expansion of macro 'pfn_valid' 352 | if (WARN_ON_ONCE(pfn_valid(PHYS_PFN(phys_addr)))) | ^~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-params.c: At top level: >> drivers/staging/media/rkisp1/rkisp1-params.c:1196:6: warning: no previous prototype for 'rkisp1_params_apply_params_cfg' [-Wmissing-prototypes] 1196 | void rkisp1_params_apply_params_cfg(struct rkisp1_params *params, unsigned int frame_sequence) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vim +/rkisp1_params_apply_params_cfg +1196 drivers/staging/media/rkisp1/rkisp1-params.c 1195 > 1196 void rkisp1_params_apply_params_cfg(struct rkisp1_params *params, unsigned int frame_sequence) 1197 { 1198 struct rkisp1_params_cfg *new_params; 1199 struct rkisp1_buffer *cur_buf = NULL; 1200 1201 if (list_empty(¶ms->params)) 1202 return; 1203 1204 cur_buf = list_first_entry(¶ms->params, 1205 struct rkisp1_buffer, queue); 1206 1207 new_params = (struct rkisp1_params_cfg *)(cur_buf->vaddr[0]); 1208 1209 rkisp1_isp_isr_other_config(params, new_params); 1210 rkisp1_isp_isr_meas_config(params, new_params); 1211 1212 /* update shadow register immediately */ 1213 rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL, RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD); 1214 1215 list_del(&cur_buf->queue); 1216 1217 cur_buf->vb.sequence = frame_sequence; 1218 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); 1219 } 1220 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Dafna, Thanks for the patch On 8/15/20 7:37 AM, Dafna Hirschfeld wrote: > Currently, the first buffer queued in the params node is returned > immediately to userspace and a copy of it is saved in the field > 'cur_params'. The copy is later used for the first configuration > when the stream is initiated by one of selfpath/mainpath capture nodes. > > There are 3 problems with this implementation: > - The first params buffer is applied and returned to userspace even if > userspace never calls to streamon on the params node. > - If the first params buffer is queued after the stream started on the > params node then it will return to userspace but will never be used. > - The frame_sequence of the first buffer is set to -1 if the main/selfpath > did not start streaming. > > A correct implementation is to apply the first params buffer when stream > is started from mainpath/selfpath and only if params is also streaming. > > The patch adds a new function 'rkisp1_params_apply_params_cfg' which takes > a buffer from the buffers queue, apply it and returns it to userspace. > The function is called from the irq handler and when main/selfpath stream > starts - in the function 'rkisp1_params_config_parameter' > > Also remove the fields 'cur_params', 'is_first_params' which are no > more needed. > > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> lgtm Acked-by: Helen Koike <helen.koike@collabora.com> Regards, Helen > --- > drivers/staging/media/rkisp1/rkisp1-common.h | 5 -- > drivers/staging/media/rkisp1/rkisp1-params.c | 49 ++++++++------------ > 2 files changed, 19 insertions(+), 35 deletions(-) > > diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h > index 29eaadc58489..9b41935c6597 100644 > --- a/drivers/staging/media/rkisp1/rkisp1-common.h > +++ b/drivers/staging/media/rkisp1/rkisp1-common.h > @@ -197,9 +197,6 @@ struct rkisp1_stats { > > /* > * struct rkisp1_params - ISP input parameters device > - * > - * @cur_params: Current ISP parameters > - * @is_first_params: the first params should take effect immediately > */ > struct rkisp1_params { > struct rkisp1_vdev_node vnode; > @@ -207,10 +204,8 @@ struct rkisp1_params { > > spinlock_t config_lock; > struct list_head params; > - struct rkisp1_params_cfg cur_params; > struct v4l2_format vdev_fmt; > bool is_streaming; > - bool is_first_params; > > enum v4l2_quantization quantization; > enum rkisp1_fmt_raw_pat_type raw_type; > diff --git a/drivers/staging/media/rkisp1/rkisp1-params.c b/drivers/staging/media/rkisp1/rkisp1-params.c > index 86bbd01e18c7..134b5c9a94c1 100644 > --- a/drivers/staging/media/rkisp1/rkisp1-params.c > +++ b/drivers/staging/media/rkisp1/rkisp1-params.c > @@ -1193,23 +1193,13 @@ static void rkisp1_isp_isr_meas_config(struct rkisp1_params *params, > } > } > > -void rkisp1_params_isr(struct rkisp1_device *rkisp1) > +void rkisp1_params_apply_params_cfg(struct rkisp1_params *params, unsigned int frame_sequence) > { > - unsigned int frame_sequence = atomic_read(&rkisp1->isp.frame_sequence); > - struct rkisp1_params *params = &rkisp1->params; > struct rkisp1_params_cfg *new_params; > struct rkisp1_buffer *cur_buf = NULL; > > - spin_lock(¶ms->config_lock); > - if (!params->is_streaming) { > - spin_unlock(¶ms->config_lock); > - return; > - } > - > - if (list_empty(¶ms->params)) { > - spin_unlock(¶ms->config_lock); > + if (list_empty(¶ms->params)) > return; > - } > > cur_buf = list_first_entry(¶ms->params, > struct rkisp1_buffer, queue); > @@ -1226,6 +1216,20 @@ void rkisp1_params_isr(struct rkisp1_device *rkisp1) > > cur_buf->vb.sequence = frame_sequence; > vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); > +} > + > +void rkisp1_params_isr(struct rkisp1_device *rkisp1) > +{ > + unsigned int frame_sequence = atomic_read(&rkisp1->isp.frame_sequence); > + struct rkisp1_params *params = &rkisp1->params; > + > + spin_lock(¶ms->config_lock); > + if (!params->is_streaming) { > + spin_unlock(¶ms->config_lock); > + return; > + } > + rkisp1_params_apply_params_cfg(params, frame_sequence); > + > spin_unlock(¶ms->config_lock); > } > > @@ -1298,9 +1302,9 @@ static void rkisp1_params_config_parameter(struct rkisp1_params *params) > else > rkisp1_csm_config(params, false); > > - /* override the default things */ > - rkisp1_isp_isr_other_config(params, ¶ms->cur_params); > - rkisp1_isp_isr_meas_config(params, ¶ms->cur_params); > + /* apply the first buffer if there is one already */ > + if (params->is_streaming) > + rkisp1_params_apply_params_cfg(params, 0); > > spin_unlock(¶ms->config_lock); > } > @@ -1428,8 +1432,6 @@ static int rkisp1_params_vb2_queue_setup(struct vb2_queue *vq, > sizes[0] = sizeof(struct rkisp1_params_cfg); > > INIT_LIST_HEAD(¶ms->params); > - params->is_first_params = true; > - > return 0; > } > > @@ -1440,20 +1442,7 @@ static void rkisp1_params_vb2_buf_queue(struct vb2_buffer *vb) > container_of(vbuf, struct rkisp1_buffer, vb); > struct vb2_queue *vq = vb->vb2_queue; > struct rkisp1_params *params = vq->drv_priv; > - struct rkisp1_params_cfg *new_params; > unsigned long flags; > - unsigned int frame_sequence = > - atomic_read(¶ms->rkisp1->isp.frame_sequence); > - > - if (params->is_first_params) { > - new_params = (struct rkisp1_params_cfg *) > - (vb2_plane_vaddr(vb, 0)); > - vbuf->sequence = frame_sequence; > - vb2_buffer_done(¶ms_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); > - params->is_first_params = false; > - params->cur_params = *new_params; > - return; > - } > > params_buf->vaddr[0] = vb2_plane_vaddr(vb, 0); > spin_lock_irqsave(¶ms->config_lock, flags); >
diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h index 29eaadc58489..9b41935c6597 100644 --- a/drivers/staging/media/rkisp1/rkisp1-common.h +++ b/drivers/staging/media/rkisp1/rkisp1-common.h @@ -197,9 +197,6 @@ struct rkisp1_stats { /* * struct rkisp1_params - ISP input parameters device - * - * @cur_params: Current ISP parameters - * @is_first_params: the first params should take effect immediately */ struct rkisp1_params { struct rkisp1_vdev_node vnode; @@ -207,10 +204,8 @@ struct rkisp1_params { spinlock_t config_lock; struct list_head params; - struct rkisp1_params_cfg cur_params; struct v4l2_format vdev_fmt; bool is_streaming; - bool is_first_params; enum v4l2_quantization quantization; enum rkisp1_fmt_raw_pat_type raw_type; diff --git a/drivers/staging/media/rkisp1/rkisp1-params.c b/drivers/staging/media/rkisp1/rkisp1-params.c index 86bbd01e18c7..134b5c9a94c1 100644 --- a/drivers/staging/media/rkisp1/rkisp1-params.c +++ b/drivers/staging/media/rkisp1/rkisp1-params.c @@ -1193,23 +1193,13 @@ static void rkisp1_isp_isr_meas_config(struct rkisp1_params *params, } } -void rkisp1_params_isr(struct rkisp1_device *rkisp1) +void rkisp1_params_apply_params_cfg(struct rkisp1_params *params, unsigned int frame_sequence) { - unsigned int frame_sequence = atomic_read(&rkisp1->isp.frame_sequence); - struct rkisp1_params *params = &rkisp1->params; struct rkisp1_params_cfg *new_params; struct rkisp1_buffer *cur_buf = NULL; - spin_lock(¶ms->config_lock); - if (!params->is_streaming) { - spin_unlock(¶ms->config_lock); - return; - } - - if (list_empty(¶ms->params)) { - spin_unlock(¶ms->config_lock); + if (list_empty(¶ms->params)) return; - } cur_buf = list_first_entry(¶ms->params, struct rkisp1_buffer, queue); @@ -1226,6 +1216,20 @@ void rkisp1_params_isr(struct rkisp1_device *rkisp1) cur_buf->vb.sequence = frame_sequence; vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); +} + +void rkisp1_params_isr(struct rkisp1_device *rkisp1) +{ + unsigned int frame_sequence = atomic_read(&rkisp1->isp.frame_sequence); + struct rkisp1_params *params = &rkisp1->params; + + spin_lock(¶ms->config_lock); + if (!params->is_streaming) { + spin_unlock(¶ms->config_lock); + return; + } + rkisp1_params_apply_params_cfg(params, frame_sequence); + spin_unlock(¶ms->config_lock); } @@ -1298,9 +1302,9 @@ static void rkisp1_params_config_parameter(struct rkisp1_params *params) else rkisp1_csm_config(params, false); - /* override the default things */ - rkisp1_isp_isr_other_config(params, ¶ms->cur_params); - rkisp1_isp_isr_meas_config(params, ¶ms->cur_params); + /* apply the first buffer if there is one already */ + if (params->is_streaming) + rkisp1_params_apply_params_cfg(params, 0); spin_unlock(¶ms->config_lock); } @@ -1428,8 +1432,6 @@ static int rkisp1_params_vb2_queue_setup(struct vb2_queue *vq, sizes[0] = sizeof(struct rkisp1_params_cfg); INIT_LIST_HEAD(¶ms->params); - params->is_first_params = true; - return 0; } @@ -1440,20 +1442,7 @@ static void rkisp1_params_vb2_buf_queue(struct vb2_buffer *vb) container_of(vbuf, struct rkisp1_buffer, vb); struct vb2_queue *vq = vb->vb2_queue; struct rkisp1_params *params = vq->drv_priv; - struct rkisp1_params_cfg *new_params; unsigned long flags; - unsigned int frame_sequence = - atomic_read(¶ms->rkisp1->isp.frame_sequence); - - if (params->is_first_params) { - new_params = (struct rkisp1_params_cfg *) - (vb2_plane_vaddr(vb, 0)); - vbuf->sequence = frame_sequence; - vb2_buffer_done(¶ms_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - params->is_first_params = false; - params->cur_params = *new_params; - return; - } params_buf->vaddr[0] = vb2_plane_vaddr(vb, 0); spin_lock_irqsave(¶ms->config_lock, flags);
Currently, the first buffer queued in the params node is returned immediately to userspace and a copy of it is saved in the field 'cur_params'. The copy is later used for the first configuration when the stream is initiated by one of selfpath/mainpath capture nodes. There are 3 problems with this implementation: - The first params buffer is applied and returned to userspace even if userspace never calls to streamon on the params node. - If the first params buffer is queued after the stream started on the params node then it will return to userspace but will never be used. - The frame_sequence of the first buffer is set to -1 if the main/selfpath did not start streaming. A correct implementation is to apply the first params buffer when stream is started from mainpath/selfpath and only if params is also streaming. The patch adds a new function 'rkisp1_params_apply_params_cfg' which takes a buffer from the buffers queue, apply it and returns it to userspace. The function is called from the irq handler and when main/selfpath stream starts - in the function 'rkisp1_params_config_parameter' Also remove the fields 'cur_params', 'is_first_params' which are no more needed. Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> --- drivers/staging/media/rkisp1/rkisp1-common.h | 5 -- drivers/staging/media/rkisp1/rkisp1-params.c | 49 ++++++++------------ 2 files changed, 19 insertions(+), 35 deletions(-)