diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-12-13 11:36:58 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-12-13 11:36:58 -0800 | 
| commit | cdb9d3537711939e4d8fd0de2889c966f88346eb (patch) | |
| tree | 2a118e0930d3e08c6303b579e89f0df388cba4e6 /drivers/staging/media/atomisp | |
| parent | 102f9d3d455870844c47b82322c2dfc0a35eb745 (diff) | |
| parent | 3178804c64ef7c8c87a53cd5bba0b2942dd64fec (diff) | |
| download | linux-cdb9d3537711939e4d8fd0de2889c966f88346eb.tar.bz2 | |
Merge tag 'media/v6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
 - DVB core changes to avoid refcount troubles and UAF
 - DVB API/core has gained support for DVB-C2 and DVB-S2X
 - New sensor drivers: ov08x40, ov4689.c, st-vgxy61 and tc358746.c
 - Removal of an unused sensor driver: s5k4ecgx
 - Move microchip_csi2dc to a new directory, named after the
   manufacturer
 - Add media controller support to Microship drivers
 - Old Atmel/Microship drivers that don't use media controler got moved
   to staging
 - New drivers added for Renesas RZ/G2L CRU and MIPI CSI-2 support
 - Allwinner A31 camera sensor driver code was now split into a bridge
   and a separate processor driver
 - Added a virtual stateless decoder driver in order to test core
   support for stateless drivers and test userspace apps using it
 - removed platform-based support for ov9650, as this is not used
   anymore
 - atomisp now uses videobuf2 and supports normal mmap mode
 - the imx7-media-csi driver got promoted from staging
 - rcar-vin driver has gained support for gen3 UDS (Up Down Scaler)
 - most i2c drivers now use I2C .probe_new() kAPI
 - lots of drivers fixes, cleanups and improvements
* tag 'media/v6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (544 commits)
  media: s5c73m3: Switch to GPIO descriptors
  media: i2c: s5k5baf: switch to using gpiod API
  media: i2c: s5k6a3: switch to using gpiod API
  media: imx: remove code for non-existing config IMX_GPT_ICAP
  media: si470x: Fix use-after-free in si470x_int_in_callback()
  media: staging: stkwebcam: Restore MEDIA_{USB,CAMERA}_SUPPORT dependencies
  media: coda: Add check for kmalloc
  media: coda: Add check for dcoda_iram_alloc
  dt-bindings: media: s5c73m3: Fix reset-gpio descriptor
  media: dt-bindings: allwinner: h6-vpu-g2: Add IOMMU reference property
  media: s5k4ecgx: Delete driver
  media: s5k4ecgx: Switch to GPIO descriptors
  media: Switch to use dev_err_probe() helper
  headers: Remove some left-over license text in include/uapi/linux/v4l2-*
  headers: Remove some left-over license text in include/uapi/linux/dvb/
  media: usb: pwc-uncompress: Use flex array destination for memcpy()
  media: s5p-mfc: Fix to handle reference queue during finishing
  media: s5p-mfc: Clear workbit to handle error condition
  media: s5p-mfc: Fix in register read and write for H264
  media: imx: Use get_mbus_config instead of parsing upstream DT endpoints
  ...
Diffstat (limited to 'drivers/staging/media/atomisp')
43 files changed, 784 insertions, 2585 deletions
| diff --git a/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c b/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c index 783f1b88ebf2..87a634bf9ff5 100644 --- a/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c +++ b/drivers/staging/media/atomisp/i2c/atomisp-gc0310.c @@ -786,8 +786,6 @@ static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)  	return ret;  } -static int power_down(struct v4l2_subdev *sd); -  static int power_up(struct v4l2_subdev *sd)  {  	struct gc0310_device *dev = to_gc0310_sensor(sd); @@ -800,6 +798,9 @@ static int power_up(struct v4l2_subdev *sd)  		return -ENODEV;  	} +	if (dev->power_on) +		return 0; /* Already on */ +  	/* power control */  	ret = power_ctrl(sd, 1);  	if (ret) @@ -820,6 +821,7 @@ static int power_up(struct v4l2_subdev *sd)  	msleep(100); +	dev->power_on = true;  	return 0;  fail_gpio: @@ -844,6 +846,9 @@ static int power_down(struct v4l2_subdev *sd)  		return -ENODEV;  	} +	if (!dev->power_on) +		return 0; /* Already off */ +  	/* gpio ctrl */  	ret = gpio_ctrl(sd, 0);  	if (ret) { @@ -861,6 +866,7 @@ static int power_down(struct v4l2_subdev *sd)  	if (ret)  		dev_err(&client->dev, "vprog failed.\n"); +	dev->power_on = false;  	return ret;  } @@ -935,6 +941,9 @@ static int gc0310_set_fmt(struct v4l2_subdev *sd,  		return 0;  	} +	/* s_power has not been called yet for std v4l2 clients (camorama) */ +	power_up(sd); +  	dev_dbg(&client->dev, "%s: before gc0310_write_reg_array %s\n",  		__func__, dev->res->desc);  	ret = startup(sd); @@ -1073,6 +1082,7 @@ static int gc0310_s_config(struct v4l2_subdev *sd,  	 * as first power on by board may not fulfill the  	 * power on sequqence needed by the module  	 */ +	dev->power_on = true; /* force power_down() to run */  	ret = power_down(sd);  	if (ret) {  		dev_err(&client->dev, "gc0310 power-off err.\n"); diff --git a/drivers/staging/media/atomisp/i2c/gc0310.h b/drivers/staging/media/atomisp/i2c/gc0310.h index db643ebc3909..4b9ce681bd93 100644 --- a/drivers/staging/media/atomisp/i2c/gc0310.h +++ b/drivers/staging/media/atomisp/i2c/gc0310.h @@ -152,6 +152,7 @@ struct gc0310_device {  	int vt_pix_clk_freq_mhz;  	struct gc0310_resolution *res;  	u8 type; +	bool power_on;  };  enum gc0310_tok_type { diff --git a/drivers/staging/media/atomisp/i2c/ov2680.h b/drivers/staging/media/atomisp/i2c/ov2680.h index 4e351196fe34..7ab337b859ad 100644 --- a/drivers/staging/media/atomisp/i2c/ov2680.h +++ b/drivers/staging/media/atomisp/i2c/ov2680.h @@ -485,19 +485,19 @@ static struct ov2680_reg const ov2680_720x592_30fps[] = {  static struct ov2680_reg const ov2680_800x600_30fps[] = {  	{0x3086, 0x01},  	{0x370a, 0x23}, -	{0x3801, 0x00}, +	{0x3801, 0x00}, /* hstart 0 */  	{0x3802, 0x00}, -	{0x3803, 0x00}, +	{0x3803, 0x00}, /* vstart 0 */  	{0x3804, 0x06}, -	{0x3805, 0x4f}, +	{0x3805, 0x4f}, /* hend 1615 */  	{0x3806, 0x04}, -	{0x3807, 0xbf}, +	{0x3807, 0xbf}, /* vend 1215 */  	{0x3808, 0x03}, -	{0x3809, 0x20}, +	{0x3809, 0x20}, /* hsize 800 */  	{0x380a, 0x02}, -	{0x380b, 0x58}, +	{0x380b, 0x58}, /* vsize 600 */  	{0x380c, 0x06}, -	{0x380d, 0xac}, +	{0x380d, 0xac}, /* htotal 1708 */  	{0x3810, 0x00},  	{0x3811, 0x00},  	{0x3812, 0x00}, @@ -524,19 +524,19 @@ static struct ov2680_reg const ov2680_800x600_30fps[] = {  static struct ov2680_reg const ov2680_720p_30fps[] = {  	{0x3086, 0x00},  	{0x370a, 0x21}, -	{0x3801, 0xa0}, +	{0x3801, 0xa0}, /* hstart 160 */  	{0x3802, 0x00}, -	{0x3803, 0xf2}, +	{0x3803, 0xf2}, /* vstart 242 */  	{0x3804, 0x05}, -	{0x3805, 0xbf}, +	{0x3805, 0xbf}, /* hend 1471 */  	{0x3806, 0x03}, -	{0x3807, 0xdd}, +	{0x3807, 0xdd}, /* vend 989 */  	{0x3808, 0x05}, -	{0x3809, 0x10}, +	{0x3809, 0x10}, /* hsize 1296 */  	{0x380a, 0x02}, -	{0x380b, 0xe0}, +	{0x380b, 0xe0}, /* vsize 736 */  	{0x380c, 0x06}, -	{0x380d, 0xa8}, +	{0x380d, 0xa8}, /* htotal 1704 */  	{0x3810, 0x00},  	{0x3811, 0x08},  	{0x3812, 0x00}, @@ -563,19 +563,19 @@ static struct ov2680_reg const ov2680_720p_30fps[] = {  static struct ov2680_reg const ov2680_1296x976_30fps[] = {  	{0x3086, 0x00},  	{0x370a, 0x21}, -	{0x3801, 0xa0}, +	{0x3801, 0xa0}, /* hstart 160 */  	{0x3802, 0x00}, -	{0x3803, 0x78}, +	{0x3803, 0x78}, /* vstart 120 */  	{0x3804, 0x05}, -	{0x3805, 0xbf}, +	{0x3805, 0xbf}, /* hend 1471 */  	{0x3806, 0x04}, -	{0x3807, 0x57}, +	{0x3807, 0x57}, /* vend 1111 */  	{0x3808, 0x05}, -	{0x3809, 0x10}, +	{0x3809, 0x10}, /* hsize 1296 */  	{0x380a, 0x03}, -	{0x380b, 0xd0}, +	{0x380b, 0xd0}, /* vsize 976 */  	{0x380c, 0x06}, -	{0x380d, 0xa8}, +	{0x380d, 0xa8}, /* htotal 1704 */  	{0x3810, 0x00},  	{0x3811, 0x08},  	{0x3812, 0x00}, @@ -820,8 +820,8 @@ static struct ov2680_resolution ov2680_res_preview[] = {  		.regs = ov2680_1296x976_30fps,  	},  	{ -		.width = 1280, -		.height = 720, +		.width = 1296, +		.height = 736,  		.fps = 60,  		.pix_clk_freq = 66,  		.pixels_per_line = 1698,//1704, diff --git a/drivers/staging/media/atomisp/include/hmm/hmm.h b/drivers/staging/media/atomisp/include/hmm/hmm.h index c0384bb0a762..2bc323b34f89 100644 --- a/drivers/staging/media/atomisp/include/hmm/hmm.h +++ b/drivers/staging/media/atomisp/include/hmm/hmm.h @@ -37,7 +37,8 @@ int hmm_init(void);  void hmm_cleanup(void);  ia_css_ptr hmm_alloc(size_t bytes); -ia_css_ptr hmm_create_from_userdata(size_t bytes, const void __user *userptr); +ia_css_ptr hmm_create_from_vmalloc_buf(size_t bytes, void *vmalloc_addr); +  void hmm_free(ia_css_ptr ptr);  int hmm_load(ia_css_ptr virt, void *data, unsigned int bytes);  int hmm_store(ia_css_ptr virt, const void *data, unsigned int bytes); diff --git a/drivers/staging/media/atomisp/include/hmm/hmm_bo.h b/drivers/staging/media/atomisp/include/hmm/hmm_bo.h index c5cbae1d9cf9..b4c03e0ca9c0 100644 --- a/drivers/staging/media/atomisp/include/hmm/hmm_bo.h +++ b/drivers/staging/media/atomisp/include/hmm/hmm_bo.h @@ -73,7 +73,7 @@  enum hmm_bo_type {  	HMM_BO_PRIVATE, -	HMM_BO_USER, +	HMM_BO_VMALLOC,  	HMM_BO_LAST,  }; @@ -207,7 +207,7 @@ int hmm_bo_allocated(struct hmm_buffer_object *bo);   */  int hmm_bo_alloc_pages(struct hmm_buffer_object *bo,  		       enum hmm_bo_type type, -		       const void __user *userptr); +		       void *vmalloc_addr);  void hmm_bo_free_pages(struct hmm_buffer_object *bo);  int hmm_bo_page_allocated(struct hmm_buffer_object *bo); diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c index c72d0e344671..d8c7e7367386 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c @@ -30,7 +30,6 @@  #include <asm/iosf_mbi.h>  #include <media/v4l2-event.h> -#include <media/videobuf-vmalloc.h>  #define CREATE_TRACE_POINTS  #include "atomisp_trace_event.h" @@ -208,11 +207,6 @@ int atomisp_freq_scaling(struct atomisp_device *isp,  	int i, ret;  	unsigned short fps = 0; -	if (isp->sw_contex.power_state != ATOM_ISP_POWER_UP) { -		dev_err(isp->dev, "DFS cannot proceed due to no power.\n"); -		return -EINVAL; -	} -  	if ((pdev->device & ATOMISP_PCI_DEVICE_SOC_MASK) ==  	    ATOMISP_PCI_DEVICE_SOC_CHT && ATOMISP_USE_YUVPP(asd))  		isp->dfs = &dfs_config_cht_soc; @@ -308,24 +302,16 @@ int atomisp_reset(struct atomisp_device *isp)  	int ret = 0;  	dev_dbg(isp->dev, "%s\n", __func__); -	atomisp_css_suspend(isp); -	ret = atomisp_runtime_suspend(isp->dev); + +	ret = atomisp_power_off(isp->dev);  	if (ret < 0) -		dev_err(isp->dev, "atomisp_runtime_suspend failed, %d\n", ret); -	ret = atomisp_mrfld_power_down(isp); +		dev_err(isp->dev, "atomisp_power_off failed, %d\n", ret); + +	ret = atomisp_power_on(isp->dev);  	if (ret < 0) { -		dev_err(isp->dev, "can not disable ISP power\n"); -	} else { -		ret = atomisp_mrfld_power_up(isp); -		if (ret < 0) -			dev_err(isp->dev, "can not enable ISP power\n"); -		ret = atomisp_runtime_resume(isp->dev); -		if (ret < 0) -			dev_err(isp->dev, "atomisp_runtime_resume failed, %d\n", ret); -	} -	ret = atomisp_css_resume(isp); -	if (ret) +		dev_err(isp->dev, "atomisp_power_on failed, %d\n", ret);  		isp->isp_fatal_error = true; +	}  	return ret;  } @@ -518,8 +504,8 @@ irqreturn_t atomisp_isr(int irq, void *dev)  	int err;  	spin_lock_irqsave(&isp->lock, flags); -	if (isp->sw_contex.power_state != ATOM_ISP_POWER_UP || -	    !isp->css_initialized) { + +	if (!isp->css_initialized) {  		spin_unlock_irqrestore(&isp->lock, flags);  		return IRQ_HANDLED;  	} @@ -634,25 +620,6 @@ void atomisp_clear_css_buffer_counters(struct atomisp_sub_device *asd)  		memset(asd->metadata_bufs_in_css[i], 0,  		       sizeof(asd->metadata_bufs_in_css[i]));  	asd->dis_bufs_in_css = 0; -	asd->video_out_capture.buffers_in_css = 0; -	asd->video_out_vf.buffers_in_css = 0; -	asd->video_out_preview.buffers_in_css = 0; -	asd->video_out_video_capture.buffers_in_css = 0; -} - -/* ISP2400 */ -bool atomisp_buffers_queued(struct atomisp_sub_device *asd) -{ -	return asd->video_out_capture.buffers_in_css || -	       asd->video_out_vf.buffers_in_css || -	       asd->video_out_preview.buffers_in_css || -	       asd->video_out_video_capture.buffers_in_css; -} - -/* ISP2401 */ -bool atomisp_buffers_queued_pipe(struct atomisp_video_pipe *pipe) -{ -	return pipe->buffers_in_css ? true : false;  }  /* 0x100000 is the start of dmem inside SP */ @@ -681,57 +648,68 @@ void dump_sp_dmem(struct atomisp_device *isp, unsigned int addr,  	} while (--size32);  } -static struct videobuf_buffer *atomisp_css_frame_to_vbuf( -    struct atomisp_video_pipe *pipe, struct ia_css_frame *frame) +int atomisp_buffers_in_css(struct atomisp_video_pipe *pipe)  { -	struct videobuf_vmalloc_memory *vm_mem; -	struct ia_css_frame *handle; -	int i; +	unsigned long irqflags; +	struct list_head *pos; +	int buffers_in_css = 0; -	for (i = 0; pipe->capq.bufs[i]; i++) { -		vm_mem = pipe->capq.bufs[i]->priv; -		handle = vm_mem->vaddr; -		if (handle && handle->data == frame->data) -			return pipe->capq.bufs[i]; -	} +	spin_lock_irqsave(&pipe->irq_lock, irqflags); -	return NULL; +	list_for_each(pos, &pipe->buffers_in_css) +		buffers_in_css++; + +	spin_unlock_irqrestore(&pipe->irq_lock, irqflags); + +	return buffers_in_css;  } -static void atomisp_flush_video_pipe(struct atomisp_sub_device *asd, -				     struct atomisp_video_pipe *pipe) +void atomisp_buffer_done(struct ia_css_frame *frame, enum vb2_buffer_state state)  { +	struct atomisp_video_pipe *pipe = vb_to_pipe(&frame->vb.vb2_buf); + +	lockdep_assert_held(&pipe->irq_lock); + +	frame->vb.vb2_buf.timestamp = ktime_get_ns(); +	frame->vb.field = pipe->pix.field; +	frame->vb.sequence = atomic_read(&pipe->asd->sequence); +	list_del(&frame->queue); +	if (state == VB2_BUF_STATE_DONE) +		vb2_set_plane_payload(&frame->vb.vb2_buf, 0, pipe->pix.sizeimage); +	vb2_buffer_done(&frame->vb.vb2_buf, state); +} + +void atomisp_flush_video_pipe(struct atomisp_video_pipe *pipe, bool warn_on_css_frames) +{ +	struct ia_css_frame *frame, *_frame;  	unsigned long irqflags; -	int i; -	if (!pipe->users) -		return; +	spin_lock_irqsave(&pipe->irq_lock, irqflags); -	for (i = 0; pipe->capq.bufs[i]; i++) { -		spin_lock_irqsave(&pipe->irq_lock, irqflags); -		if (pipe->capq.bufs[i]->state == VIDEOBUF_ACTIVE || -		    pipe->capq.bufs[i]->state == VIDEOBUF_QUEUED) { -			pipe->capq.bufs[i]->ts = ktime_get_ns(); -			pipe->capq.bufs[i]->field_count = -			    atomic_read(&asd->sequence) << 1; -			dev_dbg(asd->isp->dev, "release buffers on device %s\n", -				pipe->vdev.name); -			if (pipe->capq.bufs[i]->state == VIDEOBUF_QUEUED) -				list_del_init(&pipe->capq.bufs[i]->queue); -			pipe->capq.bufs[i]->state = VIDEOBUF_ERROR; -			wake_up(&pipe->capq.bufs[i]->done); -		} -		spin_unlock_irqrestore(&pipe->irq_lock, irqflags); +	list_for_each_entry_safe(frame, _frame, &pipe->buffers_in_css, queue) { +		if (warn_on_css_frames) +			dev_warn(pipe->isp->dev, "Warning: CSS frames queued on flush\n"); +		atomisp_buffer_done(frame, VB2_BUF_STATE_ERROR); +	} + +	list_for_each_entry_safe(frame, _frame, &pipe->activeq, queue) +		atomisp_buffer_done(frame, VB2_BUF_STATE_ERROR); + +	list_for_each_entry_safe(frame, _frame, &pipe->buffers_waiting_for_param, queue) { +		pipe->frame_request_config_id[frame->vb.vb2_buf.index] = 0; +		atomisp_buffer_done(frame, VB2_BUF_STATE_ERROR);  	} + +	spin_unlock_irqrestore(&pipe->irq_lock, irqflags);  }  /* Returns queued buffers back to video-core */  void atomisp_flush_bufs_and_wakeup(struct atomisp_sub_device *asd)  { -	atomisp_flush_video_pipe(asd, &asd->video_out_capture); -	atomisp_flush_video_pipe(asd, &asd->video_out_vf); -	atomisp_flush_video_pipe(asd, &asd->video_out_preview); -	atomisp_flush_video_pipe(asd, &asd->video_out_video_capture); +	atomisp_flush_video_pipe(&asd->video_out_capture, false); +	atomisp_flush_video_pipe(&asd->video_out_vf, false); +	atomisp_flush_video_pipe(&asd->video_out_preview, false); +	atomisp_flush_video_pipe(&asd->video_out_video_capture, false);  }  /* clean out the parameters that did not apply */ @@ -763,93 +741,6 @@ static void atomisp_recover_params_queue(struct atomisp_video_pipe *pipe)  	atomisp_handle_parameter_and_buffer(pipe);  } -/* find atomisp_video_pipe with css pipe id, buffer type and atomisp run_mode */ -static struct atomisp_video_pipe *__atomisp_get_pipe( -    struct atomisp_sub_device *asd, -    enum atomisp_input_stream_id stream_id, -    enum ia_css_pipe_id css_pipe_id, -    enum ia_css_buffer_type buf_type) -{ -	/* video is same in online as in continuouscapture mode */ -	if (asd->vfpp->val == ATOMISP_VFPP_DISABLE_LOWLAT) { -		/* -		 * Disable vf_pp and run CSS in still capture mode. In this -		 * mode, CSS does not cause extra latency with buffering, but -		 * scaling is not available. -		 */ -		return &asd->video_out_capture; -	} else if (asd->vfpp->val == ATOMISP_VFPP_DISABLE_SCALER) { -		/* -		 * Disable vf_pp and run CSS in video mode. This allows using -		 * ISP scaling but it has one frame delay due to CSS internal -		 * buffering. -		 */ -		return &asd->video_out_video_capture; -	} else if (css_pipe_id == IA_CSS_PIPE_ID_YUVPP) { -		/* -		 * to SOC camera, yuvpp pipe is run for capture/video/SDV/ZSL. -		 */ -		if (asd->continuous_mode->val) { -			if (asd->run_mode->val == ATOMISP_RUN_MODE_VIDEO) { -				/* SDV case */ -				switch (buf_type) { -				case IA_CSS_BUFFER_TYPE_SEC_OUTPUT_FRAME: -					return &asd->video_out_video_capture; -				case IA_CSS_BUFFER_TYPE_SEC_VF_OUTPUT_FRAME: -					return &asd->video_out_preview; -				case IA_CSS_BUFFER_TYPE_OUTPUT_FRAME: -					return &asd->video_out_capture; -				default: -					return &asd->video_out_vf; -				} -			} else if (asd->run_mode->val == ATOMISP_RUN_MODE_PREVIEW) { -				/* ZSL case */ -				switch (buf_type) { -				case IA_CSS_BUFFER_TYPE_SEC_OUTPUT_FRAME: -					return &asd->video_out_preview; -				case IA_CSS_BUFFER_TYPE_OUTPUT_FRAME: -					return &asd->video_out_capture; -				default: -					return &asd->video_out_vf; -				} -			} -		} else if (buf_type == IA_CSS_BUFFER_TYPE_OUTPUT_FRAME) { -			switch (asd->run_mode->val) { -			case ATOMISP_RUN_MODE_VIDEO: -				return &asd->video_out_video_capture; -			case ATOMISP_RUN_MODE_PREVIEW: -				return &asd->video_out_preview; -			default: -				return &asd->video_out_capture; -			} -		} else if (buf_type == IA_CSS_BUFFER_TYPE_VF_OUTPUT_FRAME) { -			if (asd->run_mode->val == ATOMISP_RUN_MODE_VIDEO) -				return &asd->video_out_preview; -			else -				return &asd->video_out_vf; -		} -	} else if (asd->run_mode->val == ATOMISP_RUN_MODE_VIDEO) { -		/* For online video or SDV video pipe. */ -		if (css_pipe_id == IA_CSS_PIPE_ID_VIDEO || -		    css_pipe_id == IA_CSS_PIPE_ID_COPY || -		    css_pipe_id == IA_CSS_PIPE_ID_YUVPP) { -			if (buf_type == IA_CSS_BUFFER_TYPE_OUTPUT_FRAME) -				return &asd->video_out_video_capture; -			return &asd->video_out_preview; -		} -	} else if (asd->run_mode->val == ATOMISP_RUN_MODE_PREVIEW) { -		/* For online preview or ZSL preview pipe. */ -		if (css_pipe_id == IA_CSS_PIPE_ID_PREVIEW || -		    css_pipe_id == IA_CSS_PIPE_ID_COPY || -		    css_pipe_id == IA_CSS_PIPE_ID_YUVPP) -			return &asd->video_out_preview; -	} -	/* For capture pipe. */ -	if (buf_type == IA_CSS_BUFFER_TYPE_VF_OUTPUT_FRAME) -		return &asd->video_out_vf; -	return &asd->video_out_capture; -} -  enum atomisp_metadata_type  atomisp_get_metadata_type(struct atomisp_sub_device *asd,  			  enum ia_css_pipe_id pipe_id) @@ -868,11 +759,9 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		      enum ia_css_pipe_id css_pipe_id,  		      bool q_buffers, enum atomisp_input_stream_id stream_id)  { -	struct videobuf_buffer *vb = NULL;  	struct atomisp_video_pipe *pipe = NULL;  	struct atomisp_css_buffer buffer;  	bool requeue = false; -	int err;  	unsigned long irqflags;  	struct ia_css_frame *frame = NULL;  	struct atomisp_s3a_buf *s3a_buf = NULL, *_s3a_buf_tmp, *s3a_iter; @@ -881,6 +770,7 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  	enum atomisp_metadata_type md_type;  	struct atomisp_device *isp = asd->isp;  	struct v4l2_control ctrl; +	int i, err;  	lockdep_assert_held(&isp->mutex); @@ -908,13 +798,6 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		return;  	} -	/* need to know the atomisp pipe for frame buffers */ -	pipe = __atomisp_get_pipe(asd, stream_id, css_pipe_id, buf_type); -	if (!pipe) { -		dev_err(isp->dev, "error getting atomisp pipe\n"); -		return; -	} -  	switch (buf_type) {  	case IA_CSS_BUFFER_TYPE_3A_STATISTICS:  		list_for_each_entry_safe(s3a_iter, _s3a_buf_tmp, @@ -989,7 +872,6 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		break;  	case IA_CSS_BUFFER_TYPE_VF_OUTPUT_FRAME:  	case IA_CSS_BUFFER_TYPE_SEC_VF_OUTPUT_FRAME: -		pipe->buffers_in_css--;  		frame = buffer.css_buffer.data.frame;  		if (!frame) {  			WARN_ON(1); @@ -998,6 +880,8 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		if (!frame->valid)  			error = true; +		pipe = vb_to_pipe(&frame->vb.vb2_buf); +  		/* FIXME:  		 * YUVPP doesn't set postview exp_id correctlly in SDV mode.  		 * This is a WORKAROUND to set exp_id. see HSDES-1503911606. @@ -1022,10 +906,7 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  				dev_dbg(isp->dev, "%s thumb no flash in this frame\n",  					__func__);  		} -		vb = atomisp_css_frame_to_vbuf(pipe, frame); -		WARN_ON(!vb); -		if (vb) -			pipe->frame_config_id[vb->i] = frame->isp_config_id; +		pipe->frame_config_id[frame->vb.vb2_buf.index] = frame->isp_config_id;  		if (css_pipe_id == IA_CSS_PIPE_ID_CAPTURE &&  		    asd->pending_capture_request > 0) {  			err = atomisp_css_offline_capture_configure(asd, @@ -1041,7 +922,6 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		break;  	case IA_CSS_BUFFER_TYPE_OUTPUT_FRAME:  	case IA_CSS_BUFFER_TYPE_SEC_OUTPUT_FRAME: -		pipe->buffers_in_css--;  		frame = buffer.css_buffer.data.frame;  		if (!frame) {  			WARN_ON(1); @@ -1051,6 +931,8 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		if (!frame->valid)  			error = true; +		pipe = vb_to_pipe(&frame->vb.vb2_buf); +  		/* FIXME:  		 * YUVPP doesn't set preview exp_id correctlly in ZSL mode.  		 * This is a WORKAROUND to set exp_id. see HSDES-1503911606. @@ -1062,72 +944,53 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  		dev_dbg(isp->dev, "%s: main frame with exp_id %d is ready\n",  			__func__, frame->exp_id); -		vb = atomisp_css_frame_to_vbuf(pipe, frame); -		if (!vb) { -			WARN_ON(1); -			break; -		} + +		i = frame->vb.vb2_buf.index;  		/* free the parameters */ -		if (pipe->frame_params[vb->i]) { -			if (asd->params.dvs_6axis == -			    pipe->frame_params[vb->i]->params.dvs_6axis) +		if (pipe->frame_params[i]) { +			if (asd->params.dvs_6axis == pipe->frame_params[i]->params.dvs_6axis)  				asd->params.dvs_6axis = NULL; -			atomisp_free_css_parameters( -			    &pipe->frame_params[vb->i]->params); -			kvfree(pipe->frame_params[vb->i]); -			pipe->frame_params[vb->i] = NULL; +			atomisp_free_css_parameters(&pipe->frame_params[i]->params); +			kvfree(pipe->frame_params[i]); +			pipe->frame_params[i] = NULL;  		} -		pipe->frame_config_id[vb->i] = frame->isp_config_id; +		pipe->frame_config_id[i] = frame->isp_config_id;  		ctrl.id = V4L2_CID_FLASH_MODE;  		if (asd->params.flash_state == ATOMISP_FLASH_ONGOING) { -			if (frame->flash_state -			    == IA_CSS_FRAME_FLASH_STATE_PARTIAL) { -				asd->frame_status[vb->i] = -				    ATOMISP_FRAME_STATUS_FLASH_PARTIAL; -				dev_dbg(isp->dev, "%s partially flashed\n", -					__func__); -			} else if (frame->flash_state -				   == IA_CSS_FRAME_FLASH_STATE_FULL) { -				asd->frame_status[vb->i] = -				    ATOMISP_FRAME_STATUS_FLASH_EXPOSED; +			if (frame->flash_state == IA_CSS_FRAME_FLASH_STATE_PARTIAL) { +				asd->frame_status[i] = ATOMISP_FRAME_STATUS_FLASH_PARTIAL; +				dev_dbg(isp->dev, "%s partially flashed\n", __func__); +			} else if (frame->flash_state == IA_CSS_FRAME_FLASH_STATE_FULL) { +				asd->frame_status[i] = ATOMISP_FRAME_STATUS_FLASH_EXPOSED;  				asd->params.num_flash_frames--; -				dev_dbg(isp->dev, "%s completely flashed\n", -					__func__); +				dev_dbg(isp->dev, "%s completely flashed\n", __func__);  			} else { -				asd->frame_status[vb->i] = -				    ATOMISP_FRAME_STATUS_OK; -				dev_dbg(isp->dev, -					"%s no flash in this frame\n", -					__func__); +				asd->frame_status[i] = ATOMISP_FRAME_STATUS_OK; +				dev_dbg(isp->dev, "%s no flash in this frame\n", __func__);  			}  			/* Check if flashing sequence is done */ -			if (asd->frame_status[vb->i] == -			    ATOMISP_FRAME_STATUS_FLASH_EXPOSED) +			if (asd->frame_status[i] == ATOMISP_FRAME_STATUS_FLASH_EXPOSED)  				asd->params.flash_state = ATOMISP_FLASH_DONE;  		} else if (isp->flash) { -			if (v4l2_g_ctrl(isp->flash->ctrl_handler, &ctrl) == -			    0 && ctrl.value == ATOMISP_FLASH_MODE_TORCH) { +			if (v4l2_g_ctrl(isp->flash->ctrl_handler, &ctrl) == 0 && +			    ctrl.value == ATOMISP_FLASH_MODE_TORCH) {  				ctrl.id = V4L2_CID_FLASH_TORCH_INTENSITY; -				if (v4l2_g_ctrl(isp->flash->ctrl_handler, &ctrl) -				    == 0 && ctrl.value > 0) { -					asd->frame_status[vb->i] = -					    ATOMISP_FRAME_STATUS_FLASH_EXPOSED; -				} else { -					asd->frame_status[vb->i] = -					    ATOMISP_FRAME_STATUS_OK; -				} +				if (v4l2_g_ctrl(isp->flash->ctrl_handler, &ctrl) == 0 && +				    ctrl.value > 0) +					asd->frame_status[i] = ATOMISP_FRAME_STATUS_FLASH_EXPOSED; +				else +					asd->frame_status[i] = ATOMISP_FRAME_STATUS_OK;  			} else { -				asd->frame_status[vb->i] = -				    ATOMISP_FRAME_STATUS_OK; +				asd->frame_status[i] = ATOMISP_FRAME_STATUS_OK;  			}  		} else { -			asd->frame_status[vb->i] = ATOMISP_FRAME_STATUS_OK; +			asd->frame_status[i] = ATOMISP_FRAME_STATUS_OK;  		} -		asd->params.last_frame_status = asd->frame_status[vb->i]; +		asd->params.last_frame_status = asd->frame_status[i];  		if (asd->continuous_mode->val) {  			if (css_pipe_id == IA_CSS_PIPE_ID_PREVIEW || @@ -1193,20 +1056,10 @@ void atomisp_buf_done(struct atomisp_sub_device *asd, int error,  	default:  		break;  	} -	if (vb) { -		vb->ts = ktime_get_ns(); -		vb->field_count = atomic_read(&asd->sequence) << 1; -		/*mark videobuffer done for dequeue*/ +	if (frame) {  		spin_lock_irqsave(&pipe->irq_lock, irqflags); -		vb->state = !error ? VIDEOBUF_DONE : VIDEOBUF_ERROR; +		atomisp_buffer_done(frame, error ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);  		spin_unlock_irqrestore(&pipe->irq_lock, irqflags); - -		/* -		 * Frame capture done, wake up any process block on -		 * current active buffer -		 * possibly hold by videobuf_dqbuf() -		 */ -		wake_up(&vb->done);  	}  	/* @@ -3288,7 +3141,7 @@ int atomisp_css_cp_dvs2_coefs(struct atomisp_sub_device *asd,  	if (!IS_ISP2401) {  		if (sizeof(*cur) != sizeof(coefs->grid) ||  		    memcmp(&coefs->grid, cur, sizeof(coefs->grid))) { -			dev_err(asd->isp->dev, "dvs grid mis-match!\n"); +			dev_err(asd->isp->dev, "dvs grid mismatch!\n");  			/* If the grid info in the argument differs from the current  			grid info, we tell the caller to reset the grid size and  			try again. */ @@ -3344,7 +3197,7 @@ int atomisp_css_cp_dvs2_coefs(struct atomisp_sub_device *asd,  		if (sizeof(*cur) != sizeof(dvs2_coefs.grid) ||  		    memcmp(&dvs2_coefs.grid, cur, sizeof(dvs2_coefs.grid))) { -			dev_err(asd->isp->dev, "dvs grid mis-match!\n"); +			dev_err(asd->isp->dev, "dvs grid mismatch!\n");  			/* If the grid info in the argument differs from the current  			grid info, we tell the caller to reset the grid size and  			try again. */ @@ -3676,6 +3529,18 @@ void atomisp_free_css_parameters(struct atomisp_css_params *css_param)  	}  } +static void atomisp_move_frame_to_activeq(struct ia_css_frame *frame, +					  struct atomisp_css_params_with_list *param) +{ +	struct atomisp_video_pipe *pipe = vb_to_pipe(&frame->vb.vb2_buf); +	unsigned long irqflags; + +	pipe->frame_params[frame->vb.vb2_buf.index] = param; +	spin_lock_irqsave(&pipe->irq_lock, irqflags); +	list_move_tail(&frame->queue, &pipe->activeq); +	spin_unlock_irqrestore(&pipe->irq_lock, irqflags); +} +  /*   * Check parameter queue list and buffer queue list to find out if matched items   * and then set parameter to CSS and enqueue buffer to CSS. @@ -3686,13 +3551,10 @@ void atomisp_free_css_parameters(struct atomisp_css_params *css_param)  void atomisp_handle_parameter_and_buffer(struct atomisp_video_pipe *pipe)  {  	struct atomisp_sub_device *asd = pipe->asd; -	struct videobuf_buffer *vb = NULL, *vb_tmp; +	struct ia_css_frame *frame = NULL, *frame_tmp;  	struct atomisp_css_params_with_list *param = NULL, *param_tmp; -	struct videobuf_vmalloc_memory *vm_mem = NULL; -	unsigned long irqflags;  	bool need_to_enqueue_buffer = false; - -	lockdep_assert_held(&asd->isp->mutex); +	int i;  	if (!asd) {  		dev_err(pipe->isp->dev, "%s(): asd is NULL, device is %s\n", @@ -3700,6 +3562,8 @@ void atomisp_handle_parameter_and_buffer(struct atomisp_video_pipe *pipe)  		return;  	} +	lockdep_assert_held(&asd->isp->mutex); +  	if (atomisp_is_vf_pipe(pipe))  		return; @@ -3714,44 +3578,32 @@ void atomisp_handle_parameter_and_buffer(struct atomisp_video_pipe *pipe)  	    list_empty(&pipe->buffers_waiting_for_param))  		return; -	list_for_each_entry_safe(vb, vb_tmp, +	list_for_each_entry_safe(frame, frame_tmp,  				 &pipe->buffers_waiting_for_param, queue) { -		if (pipe->frame_request_config_id[vb->i]) { +		i = frame->vb.vb2_buf.index; +		if (pipe->frame_request_config_id[i]) {  			list_for_each_entry_safe(param, param_tmp,  						 &pipe->per_frame_params, list) { -				if (pipe->frame_request_config_id[vb->i] != -				    param->params.isp_config_id) +				if (pipe->frame_request_config_id[i] != param->params.isp_config_id)  					continue;  				list_del(¶m->list); -				list_del(&vb->queue); +  				/*  				 * clear the request config id as the buffer  				 * will be handled and enqueued into CSS soon  				 */ -				pipe->frame_request_config_id[vb->i] = 0; -				pipe->frame_params[vb->i] = param; -				vm_mem = vb->priv; -				BUG_ON(!vm_mem); +				pipe->frame_request_config_id[i] = 0; +				atomisp_move_frame_to_activeq(frame, param); +				need_to_enqueue_buffer = true;  				break;  			} -			if (vm_mem) { -				spin_lock_irqsave(&pipe->irq_lock, irqflags); -				list_add_tail(&vb->queue, &pipe->activeq); -				spin_unlock_irqrestore(&pipe->irq_lock, irqflags); -				vm_mem = NULL; -				need_to_enqueue_buffer = true; -			} else { -				/* The is the end, stop further loop */ +			/* If this is the end, stop further loop */ +			if (list_entry_is_head(param, &pipe->per_frame_params, list))  				break; -			}  		} else { -			list_del(&vb->queue); -			pipe->frame_params[vb->i] = NULL; -			spin_lock_irqsave(&pipe->irq_lock, irqflags); -			list_add_tail(&vb->queue, &pipe->activeq); -			spin_unlock_irqrestore(&pipe->irq_lock, irqflags); +			atomisp_move_frame_to_activeq(frame, NULL);  			need_to_enqueue_buffer = true;  		}  	} @@ -3774,14 +3626,14 @@ int atomisp_set_parameters(struct video_device *vdev,  	struct atomisp_css_params *css_param = &asd->params.css_param;  	int ret; -	lockdep_assert_held(&asd->isp->mutex); -  	if (!asd) {  		dev_err(pipe->isp->dev, "%s(): asd is NULL, device is %s\n",  			__func__, vdev->name);  		return -EINVAL;  	} +	lockdep_assert_held(&asd->isp->mutex); +  	if (!asd->stream_env[ATOMISP_INPUT_STREAM_GENERAL].stream) {  		dev_err(asd->isp->dev, "%s: internal error!\n", __func__);  		return -EINVAL; @@ -5140,9 +4992,8 @@ static int atomisp_set_fmt_to_snr(struct video_device *vdev,  	return css_input_resolution_changed(asd, ffmt);  } -int atomisp_set_fmt(struct file *file, void *unused, struct v4l2_format *f) +int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f)  { -	struct video_device *vdev = video_devdata(file);  	struct atomisp_device *isp = video_get_drvdata(vdev);  	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev);  	struct atomisp_sub_device *asd = pipe->asd; @@ -5558,8 +5409,6 @@ done:  	f->fmt.pix.priv = PAGE_ALIGN(pipe->pix.width *  				     pipe->pix.height * 2); -	pipe->capq.field = f->fmt.pix.field; -  	/*  	 * If in video 480P case, no GFX throttle  	 */ @@ -5643,51 +5492,6 @@ out:  	return ret;  } -/*Turn off ISP dphy */ -int atomisp_ospm_dphy_down(struct atomisp_device *isp) -{ -	struct pci_dev *pdev = to_pci_dev(isp->dev); -	unsigned long flags; -	u32 reg; - -	dev_dbg(isp->dev, "%s\n", __func__); - -	/* if ISP timeout, we can force powerdown */ -	if (isp->isp_timeout) -		goto done; - -	if (!atomisp_dev_users(isp)) -		goto done; - -	spin_lock_irqsave(&isp->lock, flags); -	isp->sw_contex.power_state = ATOM_ISP_POWER_DOWN; -	spin_unlock_irqrestore(&isp->lock, flags); -done: -	/* -	 * MRFLD IUNIT DPHY is located in an always-power-on island -	 * MRFLD HW design need all CSI ports are disabled before -	 * powering down the IUNIT. -	 */ -	pci_read_config_dword(pdev, MRFLD_PCI_CSI_CONTROL, ®); -	reg |= MRFLD_ALL_CSI_PORTS_OFF_MASK; -	pci_write_config_dword(pdev, MRFLD_PCI_CSI_CONTROL, reg); -	return 0; -} - -/*Turn on ISP dphy */ -int atomisp_ospm_dphy_up(struct atomisp_device *isp) -{ -	unsigned long flags; - -	dev_dbg(isp->dev, "%s\n", __func__); - -	spin_lock_irqsave(&isp->lock, flags); -	isp->sw_contex.power_state = ATOM_ISP_POWER_UP; -	spin_unlock_irqrestore(&isp->lock, flags); - -	return 0; -} -  int atomisp_exif_makernote(struct atomisp_sub_device *asd,  			   struct atomisp_makernote_info *config)  { diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.h b/drivers/staging/media/atomisp/pci/atomisp_cmd.h index c9f92f1326b6..b8911491581a 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.h +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.h @@ -55,12 +55,11 @@ void dump_sp_dmem(struct atomisp_device *isp, unsigned int addr,  struct camera_mipi_info *atomisp_to_sensor_mipi_info(struct v4l2_subdev *sd);  struct atomisp_video_pipe *atomisp_to_video_pipe(struct video_device *dev);  int atomisp_reset(struct atomisp_device *isp); +int atomisp_buffers_in_css(struct atomisp_video_pipe *pipe); +void atomisp_buffer_done(struct ia_css_frame *frame, enum vb2_buffer_state state); +void atomisp_flush_video_pipe(struct atomisp_video_pipe *pipe, bool warn_on_css_frames);  void atomisp_flush_bufs_and_wakeup(struct atomisp_sub_device *asd);  void atomisp_clear_css_buffer_counters(struct atomisp_sub_device *asd); -/* ISP2400 */ -bool atomisp_buffers_queued(struct atomisp_sub_device *asd); -/* ISP2401 */ -bool atomisp_buffers_queued_pipe(struct atomisp_video_pipe *pipe);  /* Interrupt functions */  void atomisp_msi_irq_init(struct atomisp_device *isp); @@ -266,7 +265,7 @@ int atomisp_get_sensor_mode_data(struct atomisp_sub_device *asd,  int atomisp_try_fmt(struct video_device *vdev, struct v4l2_pix_format *f,  		    bool *res_overflow); -int atomisp_set_fmt(struct file *file, void *fh, struct v4l2_format *f); +int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f);  int atomisp_set_shading_table(struct atomisp_sub_device *asd,  			      struct atomisp_shading_table *shading_table); @@ -274,8 +273,6 @@ int atomisp_set_shading_table(struct atomisp_sub_device *asd,  int atomisp_offline_capture_configure(struct atomisp_sub_device *asd,  				      struct atomisp_cont_capture_conf *cvf_config); -int atomisp_ospm_dphy_down(struct atomisp_device *isp); -int atomisp_ospm_dphy_up(struct atomisp_device *isp);  int atomisp_exif_makernote(struct atomisp_sub_device *asd,  			   struct atomisp_makernote_info *config); @@ -342,8 +339,6 @@ int atomisp_inject_a_fake_event(struct atomisp_sub_device *asd, int *event);  int atomisp_get_invalid_frame_num(struct video_device *vdev,  				  int *invalid_frame_num); -int atomisp_mrfld_power_up(struct atomisp_device *isp); -int atomisp_mrfld_power_down(struct atomisp_device *isp); -int atomisp_runtime_suspend(struct device *dev); -int atomisp_runtime_resume(struct device *dev); +int atomisp_power_off(struct device *dev); +int atomisp_power_on(struct device *dev);  #endif /* __ATOMISP_CMD_H__ */ diff --git a/drivers/staging/media/atomisp/pci/atomisp_common.h b/drivers/staging/media/atomisp/pci/atomisp_common.h index b29874f2bc0f..07c38e487a66 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_common.h +++ b/drivers/staging/media/atomisp/pci/atomisp_common.h @@ -25,7 +25,7 @@  #include <linux/v4l2-mediabus.h> -#include <media/videobuf-core.h> +#include <media/videobuf2-v4l2.h>  #include "atomisp_compat.h" @@ -64,8 +64,4 @@ struct atomisp_fmt {  	u32 bayer_order;  }; -struct atomisp_buffer { -	struct videobuf_buffer	vb; -}; -  #endif diff --git a/drivers/staging/media/atomisp/pci/atomisp_compat.h b/drivers/staging/media/atomisp/pci/atomisp_compat.h index a6d85d0f9ae5..7316eb9f974a 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_compat.h +++ b/drivers/staging/media/atomisp/pci/atomisp_compat.h @@ -22,7 +22,6 @@  #include "atomisp_compat_css20.h"  #include "../../include/linux/atomisp.h" -#include <media/videobuf-vmalloc.h>  struct atomisp_device;  struct atomisp_sub_device; @@ -42,10 +41,6 @@ int atomisp_css_init(struct atomisp_device *isp);  void atomisp_css_uninit(struct atomisp_device *isp); -void atomisp_css_suspend(struct atomisp_device *isp); - -int atomisp_css_resume(struct atomisp_device *isp); -  void atomisp_css_init_struct(struct atomisp_sub_device *asd);  int atomisp_css_irq_translate(struct atomisp_device *isp, @@ -61,7 +56,7 @@ int atomisp_css_irq_enable(struct atomisp_device *isp,  			   enum ia_css_irq_info info, bool enable);  int atomisp_q_video_buffer_to_css(struct atomisp_sub_device *asd, -				  struct videobuf_vmalloc_memory *vm_mem, +				  struct ia_css_frame *frame,  				  enum atomisp_input_stream_id stream_id,  				  enum ia_css_buffer_type css_buf_type,  				  enum ia_css_pipe_id css_pipe_id); @@ -258,13 +253,6 @@ int atomisp_css_yuvpp_configure_output(struct atomisp_sub_device *asd,  				       unsigned int padded_width,  				       enum ia_css_frame_format format); -int atomisp_css_yuvpp_configure_viewfinder( -    struct atomisp_sub_device *asd, -    unsigned int stream_index, -    unsigned int width, unsigned int height, -    unsigned int min_width, -    enum ia_css_frame_format format); -  int atomisp_css_yuvpp_get_output_frame_info(      struct atomisp_sub_device *asd,      unsigned int stream_index, diff --git a/drivers/staging/media/atomisp/pci/atomisp_compat_css20.c b/drivers/staging/media/atomisp/pci/atomisp_compat_css20.c index fdc05548d972..61e2e63a0ef1 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_compat_css20.c +++ b/drivers/staging/media/atomisp/pci/atomisp_compat_css20.c @@ -237,18 +237,6 @@ static void __dump_pipe_config(struct atomisp_sub_device *asd,  			"pipe_config.isp_pipe_version:%d.\n",  			p_config->isp_pipe_version);  		dev_dbg(isp->dev, -			"pipe_config.acc_extension=%p.\n", -			p_config->acc_extension); -		dev_dbg(isp->dev, -			"pipe_config.acc_stages=%p.\n", -			p_config->acc_stages); -		dev_dbg(isp->dev, -			"pipe_config.num_acc_stages=%d.\n", -			p_config->num_acc_stages); -		dev_dbg(isp->dev, -			"pipe_config.acc_num_execs=%d.\n", -			p_config->acc_num_execs); -		dev_dbg(isp->dev,  			"pipe_config.default_capture_config.capture_mode=%d.\n",  			p_config->default_capture_config.mode);  		dev_dbg(isp->dev, @@ -629,10 +617,6 @@ static void __apply_additional_pipe_config(  		else  			stream_env->pipe_configs[pipe_id].enable_dz = false;  		break; -	case IA_CSS_PIPE_ID_ACC: -		stream_env->pipe_configs[pipe_id].mode = IA_CSS_PIPE_MODE_ACC; -		stream_env->pipe_configs[pipe_id].enable_dz = false; -		break;  	default:  		break;  	} @@ -644,7 +628,7 @@ static bool is_pipe_valid_to_current_run_mode(struct atomisp_sub_device *asd,  	if (!asd)  		return false; -	if (pipe_id == IA_CSS_PIPE_ID_ACC || pipe_id == IA_CSS_PIPE_ID_YUVPP) +	if (pipe_id == IA_CSS_PIPE_ID_YUVPP)  		return true;  	if (asd->vfpp) { @@ -718,12 +702,7 @@ static int __create_pipe(struct atomisp_sub_device *asd,  	if (pipe_id >= IA_CSS_PIPE_ID_NUM)  		return -EINVAL; -	if (pipe_id != IA_CSS_PIPE_ID_ACC && -	    !stream_env->pipe_configs[pipe_id].output_info[0].res.width) -		return 0; - -	if (pipe_id == IA_CSS_PIPE_ID_ACC && -	    !stream_env->pipe_configs[pipe_id].acc_extension) +	if (!stream_env->pipe_configs[pipe_id].output_info[0].res.width)  		return 0;  	if (!is_pipe_valid_to_current_run_mode(asd, pipe_id)) @@ -885,48 +864,10 @@ int atomisp_css_load_firmware(struct atomisp_device *isp)  void atomisp_css_uninit(struct atomisp_device *isp)  { -	struct atomisp_sub_device *asd; -	unsigned int i; - -	for (i = 0; i < isp->num_of_streams; i++) { -		asd = &isp->asd[i]; -		memset(&asd->params.config, 0, sizeof(asd->params.config)); -		asd->params.css_update_params_needed = false; -	} - -	isp->css_initialized = false; -	ia_css_uninit(); -} - -void atomisp_css_suspend(struct atomisp_device *isp) -{  	isp->css_initialized = false;  	ia_css_uninit();  } -int atomisp_css_resume(struct atomisp_device *isp) -{ -	unsigned int mmu_base_addr; -	int ret; - -	ret = hmm_get_mmu_base_addr(isp->dev, &mmu_base_addr); -	if (ret) { -		dev_err(isp->dev, "get base address error.\n"); -		return -EINVAL; -	} - -	ret = ia_css_init(isp->dev, &isp->css_env.isp_css_env, NULL, -			  mmu_base_addr, IA_CSS_IRQ_TYPE_PULSE); -	if (ret) { -		dev_err(isp->dev, "re-init css failed.\n"); -		return -EINVAL; -	} -	ia_css_enable_isys_event_queue(true); - -	isp->css_initialized = true; -	return 0; -} -  int atomisp_css_irq_translate(struct atomisp_device *isp,  			      unsigned int *infos)  { @@ -996,7 +937,7 @@ void atomisp_css_init_struct(struct atomisp_sub_device *asd)  }  int atomisp_q_video_buffer_to_css(struct atomisp_sub_device *asd, -				  struct videobuf_vmalloc_memory *vm_mem, +				  struct ia_css_frame *frame,  				  enum atomisp_input_stream_id stream_id,  				  enum ia_css_buffer_type css_buf_type,  				  enum ia_css_pipe_id css_pipe_id) @@ -1006,7 +947,7 @@ int atomisp_q_video_buffer_to_css(struct atomisp_sub_device *asd,  	int err;  	css_buf.type = css_buf_type; -	css_buf.data.frame = vm_mem->vaddr; +	css_buf.data.frame = frame;  	err = ia_css_pipe_enqueue_buffer(  		  stream_env->pipes[css_pipe_id], &css_buf); @@ -2141,8 +2082,6 @@ static enum ia_css_pipe_mode __pipe_id_to_pipe_mode(  		return IA_CSS_PIPE_MODE_CAPTURE;  	case IA_CSS_PIPE_ID_VIDEO:  		return IA_CSS_PIPE_MODE_VIDEO; -	case IA_CSS_PIPE_ID_ACC: -		return IA_CSS_PIPE_MODE_ACC;  	case IA_CSS_PIPE_ID_YUVPP:  		return IA_CSS_PIPE_MODE_YUVPP;  	default: @@ -2688,7 +2627,7 @@ int atomisp_get_css_frame_info(struct atomisp_sub_device *asd,  	if (0 != ia_css_pipe_get_info(asd->stream_env[stream_index]  		.pipes[pipe_index], &info)) { -		dev_err(isp->dev, "ia_css_pipe_get_info FAILED"); +		dev_dbg(isp->dev, "ia_css_pipe_get_info FAILED");  		return -EINVAL;  	} @@ -2765,29 +2704,6 @@ int atomisp_css_yuvpp_configure_output(struct atomisp_sub_device *asd,  	return 0;  } -int atomisp_css_yuvpp_configure_viewfinder( -    struct atomisp_sub_device *asd, -    unsigned int stream_index, -    unsigned int width, unsigned int height, -    unsigned int min_width, -    enum ia_css_frame_format format) -{ -	struct atomisp_stream_env *stream_env = -		    &asd->stream_env[stream_index]; -	enum ia_css_pipe_id pipe_id = IA_CSS_PIPE_ID_YUVPP; - -	stream_env->pipe_configs[pipe_id].mode = -	    __pipe_id_to_pipe_mode(asd, pipe_id); -	stream_env->update_pipe[pipe_id] = true; - -	stream_env->pipe_configs[pipe_id].vf_output_info[0].res.width = width; -	stream_env->pipe_configs[pipe_id].vf_output_info[0].res.height = height; -	stream_env->pipe_configs[pipe_id].vf_output_info[0].format = format; -	stream_env->pipe_configs[pipe_id].vf_output_info[0].padded_width = -	    min_width; -	return 0; -} -  int atomisp_css_yuvpp_get_output_frame_info(      struct atomisp_sub_device *asd,      unsigned int stream_index, @@ -3180,7 +3096,7 @@ static int atomisp_compare_dvs_grid(struct atomisp_sub_device *asd,  	}  	if (sizeof(*cur) != sizeof(*atomgrid)) { -		dev_err(asd->isp->dev, "dvs grid mis-match!\n"); +		dev_err(asd->isp->dev, "dvs grid mismatch!\n");  		return -EINVAL;  	} diff --git a/drivers/staging/media/atomisp/pci/atomisp_fops.c b/drivers/staging/media/atomisp/pci/atomisp_fops.c index 84a84e0cdeef..acea7492847d 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_fops.c +++ b/drivers/staging/media/atomisp/pci/atomisp_fops.c @@ -22,7 +22,7 @@  #include <linux/pm_runtime.h>  #include <media/v4l2-ioctl.h> -#include <media/videobuf-vmalloc.h> +#include <media/videobuf2-vmalloc.h>  #include "atomisp_cmd.h"  #include "atomisp_common.h" @@ -35,49 +35,74 @@  #include "atomisp-regs.h"  #include "hmm/hmm.h" +#include "ia_css_frame.h"  #include "type_support.h"  #include "device_access/device_access.h" -#define ISP_LEFT_PAD			128	/* equal to 2*NWAY */ -  /* - * input image data, and current frame resolution for test + * Videobuf2 ops   */ -#define	ISP_PARAM_MMAP_OFFSET	0xfffff000 +static int atomisp_queue_setup(struct vb2_queue *vq, +			       unsigned int *nbuffers, unsigned int *nplanes, +			       unsigned int sizes[], struct device *alloc_devs[]) +{ +	struct atomisp_video_pipe *pipe = container_of(vq, struct atomisp_video_pipe, vb_queue); +	u16 source_pad = atomisp_subdev_source_pad(&pipe->vdev); +	int ret; -#define MAGIC_CHECK(is, should)	\ -	do { \ -		if (unlikely((is) != (should))) { \ -			pr_err("magic mismatch: %x (expected %x)\n", \ -				is, should); \ -			BUG(); \ -		} \ -	} while (0) +	mutex_lock(&pipe->asd->isp->mutex); /* for get_css_frame_info() / set_fmt() */ -/* - * Videobuf ops - */ -static int atomisp_buf_setup(struct videobuf_queue *vq, unsigned int *count, -			     unsigned int *size) -{ -	struct atomisp_video_pipe *pipe = vq->priv_data; +	/* +	 * When VIDIOC_S_FMT has not been called before VIDIOC_REQBUFS, then +	 * this will fail. Call atomisp_set_fmt() ourselves and try again. +	 */ +	ret = atomisp_get_css_frame_info(pipe->asd, source_pad, &pipe->frame_info); +	if (ret) { +		struct v4l2_format f = { +			.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420, +			.fmt.pix.width = 10000, +			.fmt.pix.height = 10000, +		}; + +		ret = atomisp_set_fmt(&pipe->vdev, &f); +		if (ret) +			goto out; + +		ret = atomisp_get_css_frame_info(pipe->asd, source_pad, &pipe->frame_info); +		if (ret) +			goto out; +	} + +	atomisp_alloc_css_stat_bufs(pipe->asd, ATOMISP_INPUT_STREAM_GENERAL); -	*size = pipe->pix.sizeimage; +	*nplanes = 1; +	sizes[0] = PAGE_ALIGN(pipe->pix.sizeimage); +out: +	mutex_unlock(&pipe->asd->isp->mutex);  	return 0;  } -static int atomisp_buf_prepare(struct videobuf_queue *vq, -			       struct videobuf_buffer *vb, -			       enum v4l2_field field) +static int atomisp_buf_init(struct vb2_buffer *vb)  { -	struct atomisp_video_pipe *pipe = vq->priv_data; +	struct atomisp_video_pipe *pipe = vb_to_pipe(vb); +	struct ia_css_frame *frame = vb_to_frame(vb); +	int ret; + +	ret = ia_css_frame_init_from_info(frame, &pipe->frame_info); +	if (ret) +		return ret; -	vb->size = pipe->pix.sizeimage; -	vb->width = pipe->pix.width; -	vb->height = pipe->pix.height; -	vb->field = field; -	vb->state = VIDEOBUF_PREPARED; +	if (frame->data_bytes > vb2_plane_size(vb, 0)) { +		dev_err(pipe->asd->isp->dev, "Internal error frame.data_bytes(%u) > vb.length(%lu)\n", +			frame->data_bytes, vb2_plane_size(vb, 0)); +		return -EIO; +	} + +	frame->data = hmm_create_from_vmalloc_buf(vb2_plane_size(vb, 0), +						  vb2_plane_vaddr(vb, 0)); +	if (frame->data == mmgr_NULL) +		return -ENOMEM;  	return 0;  } @@ -156,8 +181,7 @@ static int atomisp_q_one_s3a_buffer(struct atomisp_sub_device *asd,  	} else {  		list_add_tail(&s3a_buf->list, &asd->s3a_stats_in_css);  		if (s3a_list == &asd->s3a_stats_ready) -			dev_warn(asd->isp->dev, "%s: drop one s3a stat which has exp_id %d!\n", -				 __func__, exp_id); +			dev_dbg(asd->isp->dev, "drop one s3a stat with exp_id %d\n", exp_id);  	}  	asd->s3a_bufs_in_css[css_pipe_id]++; @@ -206,43 +230,44 @@ static int atomisp_q_one_dis_buffer(struct atomisp_sub_device *asd,  	return 0;  } -int atomisp_q_video_buffers_to_css(struct atomisp_sub_device *asd, -				   struct atomisp_video_pipe *pipe, -				   enum atomisp_input_stream_id stream_id, -				   enum ia_css_buffer_type css_buf_type, -				   enum ia_css_pipe_id css_pipe_id) +static int atomisp_q_video_buffers_to_css(struct atomisp_sub_device *asd, +					  struct atomisp_video_pipe *pipe, +					  enum atomisp_input_stream_id stream_id, +					  enum ia_css_buffer_type css_buf_type, +					  enum ia_css_pipe_id css_pipe_id)  { -	struct videobuf_vmalloc_memory *vm_mem;  	struct atomisp_css_params_with_list *param;  	struct ia_css_dvs_grid_info *dvs_grid =  	    atomisp_css_get_dvs_grid_info(&asd->params.curr_grid_info);  	unsigned long irqflags; -	int err = 0; +	int space, err = 0; + +	lockdep_assert_held(&asd->isp->mutex);  	if (WARN_ON(css_pipe_id >= IA_CSS_PIPE_ID_NUM))  		return -EINVAL; -	while (pipe->buffers_in_css < ATOMISP_CSS_Q_DEPTH) { -		struct videobuf_buffer *vb; +	if (pipe->stopping) +		return -EINVAL; + +	space = ATOMISP_CSS_Q_DEPTH - atomisp_buffers_in_css(pipe); +	while (space--) { +		struct ia_css_frame *frame;  		spin_lock_irqsave(&pipe->irq_lock, irqflags); -		if (list_empty(&pipe->activeq)) { -			spin_unlock_irqrestore(&pipe->irq_lock, irqflags); -			return -EINVAL; -		} -		vb = list_entry(pipe->activeq.next, -				struct videobuf_buffer, queue); -		list_del_init(&vb->queue); -		vb->state = VIDEOBUF_ACTIVE; +		frame = list_first_entry_or_null(&pipe->activeq, struct ia_css_frame, queue); +		if (frame) +			list_move_tail(&frame->queue, &pipe->buffers_in_css);  		spin_unlock_irqrestore(&pipe->irq_lock, irqflags); +		if (!frame) +			return -EINVAL; +  		/*  		 * If there is a per_frame setting to apply on the buffer,  		 * do it before buffer en-queueing.  		 */ -		vm_mem = vb->priv; - -		param = pipe->frame_params[vb->i]; +		param = pipe->frame_params[frame->vb.vb2_buf.index];  		if (param) {  			atomisp_makeup_css_parameters(asd,  						      &asd->params.css_param.update_flag, @@ -256,8 +281,7 @@ int atomisp_q_video_buffers_to_css(struct atomisp_sub_device *asd,  				if (!err)  					asd->params.config.dz_config = ¶m->params.dz_config;  			} -			atomisp_css_set_isp_config_applied_frame(asd, -				vm_mem->vaddr); +			atomisp_css_set_isp_config_applied_frame(asd, frame);  			atomisp_css_update_isp_params_on_pipe(asd,  							      asd->stream_env[stream_id].pipes[css_pipe_id]);  			asd->params.dvs_6axis = (struct ia_css_dvs_6axis_config *) @@ -282,20 +306,19 @@ int atomisp_q_video_buffers_to_css(struct atomisp_sub_device *asd,  				    &asd->params.css_param.dz_config;  				asd->params.css_update_params_needed = true;  			} +			pipe->frame_params[frame->vb.vb2_buf.index] = NULL;  		}  		/* Enqueue buffer */ -		err = atomisp_q_video_buffer_to_css(asd, vm_mem, stream_id, +		err = atomisp_q_video_buffer_to_css(asd, frame, stream_id,  						    css_buf_type, css_pipe_id);  		if (err) {  			spin_lock_irqsave(&pipe->irq_lock, irqflags); -			list_add_tail(&vb->queue, &pipe->activeq); -			vb->state = VIDEOBUF_QUEUED; +			list_move_tail(&frame->queue, &pipe->activeq);  			spin_unlock_irqrestore(&pipe->irq_lock, irqflags);  			dev_err(asd->isp->dev, "%s, css q fails: %d\n",  				__func__, err);  			return -EINVAL;  		} -		pipe->buffers_in_css++;  		/* enqueue 3A/DIS/metadata buffers */  		if (asd->params.curr_grid_info.s3a_grid.enable && @@ -517,11 +540,32 @@ int atomisp_qbuffers_to_css(struct atomisp_sub_device *asd)  	return 0;  } -static void atomisp_buf_queue(struct videobuf_queue *vq, -			      struct videobuf_buffer *vb) +static void atomisp_buf_queue(struct vb2_buffer *vb)  { -	struct atomisp_video_pipe *pipe = vq->priv_data; +	struct atomisp_video_pipe *pipe = vb_to_pipe(vb); +	struct ia_css_frame *frame = vb_to_frame(vb); +	struct atomisp_sub_device *asd = pipe->asd; +	u16 source_pad = atomisp_subdev_source_pad(&pipe->vdev); +	unsigned long irqflags; +	int ret; + +	mutex_lock(&asd->isp->mutex); + +	ret = atomisp_pipe_check(pipe, false); +	if (ret || pipe->stopping) { +		spin_lock_irqsave(&pipe->irq_lock, irqflags); +		atomisp_buffer_done(frame, VB2_BUF_STATE_ERROR); +		spin_unlock_irqrestore(&pipe->irq_lock, irqflags); +		goto out_unlock; +	} + +	/* FIXME this ugliness comes from the original atomisp buffer handling */ +	if (!(vb->skip_cache_sync_on_finish && vb->skip_cache_sync_on_prepare)) +		wbinvd(); +	pipe->frame_params[vb->index] = NULL; + +	spin_lock_irqsave(&pipe->irq_lock, irqflags);  	/*  	 * when a frame buffer meets following conditions, it should be put into  	 * the waiting list: @@ -533,40 +577,83 @@ static void atomisp_buf_queue(struct videobuf_queue *vq,  	 *     get enqueued.  	 */  	if (!atomisp_is_vf_pipe(pipe) && -	    (pipe->frame_request_config_id[vb->i] || +	    (pipe->frame_request_config_id[vb->index] ||  	     !list_empty(&pipe->buffers_waiting_for_param))) -		list_add_tail(&vb->queue, &pipe->buffers_waiting_for_param); +		list_add_tail(&frame->queue, &pipe->buffers_waiting_for_param);  	else -		list_add_tail(&vb->queue, &pipe->activeq); +		list_add_tail(&frame->queue, &pipe->activeq); + +	spin_unlock_irqrestore(&pipe->irq_lock, irqflags); + +	/* TODO: do this better, not best way to queue to css */ +	if (asd->streaming == ATOMISP_DEVICE_STREAMING_ENABLED) { +		if (!list_empty(&pipe->buffers_waiting_for_param)) +			atomisp_handle_parameter_and_buffer(pipe); +		else +			atomisp_qbuffers_to_css(asd); +	} + +	/* +	 * Workaround: Due to the design of HALv3, +	 * sometimes in ZSL or SDV mode HAL needs to +	 * capture multiple images within one streaming cycle. +	 * But the capture number cannot be determined by HAL. +	 * So HAL only sets the capture number to be 1 and queue multiple +	 * buffers. Atomisp driver needs to check this case and re-trigger +	 * CSS to do capture when new buffer is queued. +	 */ +	if (asd->continuous_mode->val && source_pad == ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE && +	    !asd->enable_raw_buffer_lock->val && asd->params.offline_parm.num_captures == 1) { +		asd->pending_capture_request++; +		dev_dbg(asd->isp->dev, "Add one pending capture request.\n"); +	} -	vb->state = VIDEOBUF_QUEUED; +out_unlock: +	mutex_unlock(&asd->isp->mutex);  } -static void atomisp_buf_release(struct videobuf_queue *vq, -				struct videobuf_buffer *vb) +static void atomisp_buf_cleanup(struct vb2_buffer *vb)  { -	vb->state = VIDEOBUF_NEEDS_INIT; -	atomisp_videobuf_free_buf(vb); +	struct atomisp_video_pipe *pipe = vb_to_pipe(vb); +	struct ia_css_frame *frame = vb_to_frame(vb); +	int index = frame->vb.vb2_buf.index; + +	pipe->frame_request_config_id[index] = 0; +	pipe->frame_params[index] = NULL; + +	hmm_free(frame->data);  } -static const struct videobuf_queue_ops videobuf_qops = { -	.buf_setup	= atomisp_buf_setup, -	.buf_prepare	= atomisp_buf_prepare, -	.buf_queue	= atomisp_buf_queue, -	.buf_release	= atomisp_buf_release, +static const struct vb2_ops atomisp_vb2_ops = { +	.queue_setup		= atomisp_queue_setup, +	.buf_init		= atomisp_buf_init, +	.buf_cleanup		= atomisp_buf_cleanup, +	.buf_queue		= atomisp_buf_queue, +	.start_streaming	= atomisp_start_streaming, +	.stop_streaming		= atomisp_stop_streaming,  };  static int atomisp_init_pipe(struct atomisp_video_pipe *pipe)  { +	int ret; +  	/* init locks */  	spin_lock_init(&pipe->irq_lock); +	mutex_init(&pipe->vb_queue_mutex); + +	/* Init videobuf2 queue structure */ +	pipe->vb_queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; +	pipe->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR; +	pipe->vb_queue.buf_struct_size = sizeof(struct ia_css_frame); +	pipe->vb_queue.ops = &atomisp_vb2_ops; +	pipe->vb_queue.mem_ops = &vb2_vmalloc_memops; +	pipe->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; +	ret = vb2_queue_init(&pipe->vb_queue); +	if (ret) +		return ret; -	videobuf_queue_vmalloc_init(&pipe->capq, &videobuf_qops, NULL, -				    &pipe->irq_lock, -				    V4L2_BUF_TYPE_VIDEO_CAPTURE, -				    V4L2_FIELD_NONE, -				    sizeof(struct atomisp_buffer), pipe, -				    NULL);	/* ext_lock: NULL */ +	pipe->vdev.queue = &pipe->vb_queue; +	pipe->vdev.queue->lock = &pipe->vb_queue_mutex;  	INIT_LIST_HEAD(&pipe->activeq);  	INIT_LIST_HEAD(&pipe->buffers_waiting_for_param); @@ -721,13 +808,6 @@ static int atomisp_open(struct file *file)  		goto error;  	} -	/* Init ISP */ -	if (atomisp_css_init(isp)) { -		ret = -EINVAL; -		/* Need to clean up CSS init if it fails. */ -		goto css_error; -	} -  	atomisp_dev_init_struct(isp);  	ret = v4l2_subdev_call(isp->flash, core, s_power, 1); @@ -752,7 +832,6 @@ done:  	return 0;  css_error: -	atomisp_css_uninit(isp);  	pm_runtime_put(vdev->v4l2_dev->dev);  error:  	mutex_unlock(&isp->mutex); @@ -766,45 +845,26 @@ static int atomisp_release(struct file *file)  	struct atomisp_device *isp = video_get_drvdata(vdev);  	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev);  	struct atomisp_sub_device *asd = pipe->asd; -	struct v4l2_requestbuffers req;  	struct v4l2_subdev_fh fh;  	struct v4l2_rect clear_compose = {0};  	unsigned long flags; -	int ret = 0; +	int ret;  	v4l2_fh_init(&fh.vfh, vdev); -	req.count = 0; -	if (!isp) -		return -EBADF; - -	mutex_lock(&isp->mutex); -  	dev_dbg(isp->dev, "release device %s\n", vdev->name);  	asd->subdev.devnode = vdev; -	pipe->users--; - -	if (pipe->capq.streaming) -		dev_warn(isp->dev, -			 "%s: ISP still streaming while closing!", -			 __func__); +	/* Note file must not be used after this! */ +	vb2_fop_release(file); -	if (pipe->capq.streaming && -	    atomisp_streamoff(file, NULL, V4L2_BUF_TYPE_VIDEO_CAPTURE)) { -		dev_err(isp->dev, "atomisp_streamoff failed on release, driver bug"); -		goto done; -	} +	mutex_lock(&isp->mutex); +	pipe->users--;  	if (pipe->users)  		goto done; -	if (atomisp_reqbufs(file, NULL, &req)) { -		dev_err(isp->dev, "atomisp_reqbufs failed on release, driver bug"); -		goto done; -	} -  	/*  	 * A little trick here:  	 * file injection input resolution is recorded in the sink pad, @@ -840,7 +900,6 @@ static int atomisp_release(struct file *file)  		goto done;  	atomisp_destroy_pipes_stream_force(asd); -	atomisp_css_uninit(isp);  	if (defer_fw_load) {  		ia_css_unload_firmware(); @@ -862,260 +921,15 @@ done:  				     V4L2_SEL_TGT_COMPOSE, 0,  				     &clear_compose);  	mutex_unlock(&isp->mutex); - -	return v4l2_fh_release(file); -} - -/* - * Memory help functions for image frame and private parameters - */ -static int do_isp_mm_remap(struct atomisp_device *isp, -			   struct vm_area_struct *vma, -			   ia_css_ptr isp_virt, u32 host_virt, u32 pgnr) -{ -	u32 pfn; - -	while (pgnr) { -		pfn = hmm_virt_to_phys(isp_virt) >> PAGE_SHIFT; -		if (remap_pfn_range(vma, host_virt, pfn, -				    PAGE_SIZE, PAGE_SHARED)) { -			dev_err(isp->dev, "remap_pfn_range err.\n"); -			return -EAGAIN; -		} - -		isp_virt += PAGE_SIZE; -		host_virt += PAGE_SIZE; -		pgnr--; -	} - -	return 0; -} - -static int frame_mmap(struct atomisp_device *isp, -		      const struct ia_css_frame *frame, struct vm_area_struct *vma) -{ -	ia_css_ptr isp_virt; -	u32 host_virt; -	u32 pgnr; - -	if (!frame) { -		dev_err(isp->dev, "%s: NULL frame pointer.\n", __func__); -		return -EINVAL; -	} - -	host_virt = vma->vm_start; -	isp_virt = frame->data; -	pgnr = DIV_ROUND_UP(frame->data_bytes, PAGE_SIZE); - -	if (do_isp_mm_remap(isp, vma, isp_virt, host_virt, pgnr)) -		return -EAGAIN; -  	return 0;  } -int atomisp_videobuf_mmap_mapper(struct videobuf_queue *q, -				 struct vm_area_struct *vma) -{ -	u32 offset = vma->vm_pgoff << PAGE_SHIFT; -	int ret = -EINVAL, i; -	struct atomisp_device *isp = -	    ((struct atomisp_video_pipe *)(q->priv_data))->isp; -	struct videobuf_vmalloc_memory *vm_mem; -	struct videobuf_mapping *map; - -	MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); -	if (!(vma->vm_flags & VM_WRITE) || !(vma->vm_flags & VM_SHARED)) { -		dev_err(isp->dev, "map appl bug: PROT_WRITE and MAP_SHARED are required\n"); -		return -EINVAL; -	} - -	mutex_lock(&q->vb_lock); -	for (i = 0; i < VIDEO_MAX_FRAME; i++) { -		struct videobuf_buffer *buf = q->bufs[i]; - -		if (!buf) -			continue; - -		map = kzalloc(sizeof(struct videobuf_mapping), GFP_KERNEL); -		if (!map) { -			mutex_unlock(&q->vb_lock); -			return -ENOMEM; -		} - -		buf->map = map; -		map->q = q; - -		buf->baddr = vma->vm_start; - -		if (buf && buf->memory == V4L2_MEMORY_MMAP && -		    buf->boff == offset) { -			vm_mem = buf->priv; -			ret = frame_mmap(isp, vm_mem->vaddr, vma); -			vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; -			break; -		} -	} -	mutex_unlock(&q->vb_lock); - -	return ret; -} - -/* The input frame contains left and right padding that need to be removed. - * There is always ISP_LEFT_PAD padding on the left side. - * There is also padding on the right (padded_width - width). - */ -static int remove_pad_from_frame(struct atomisp_device *isp, -				 struct ia_css_frame *in_frame, __u32 width, __u32 height) -{ -	unsigned int i; -	unsigned short *buffer; -	int ret = 0; -	ia_css_ptr load = in_frame->data; -	ia_css_ptr store = load; - -	buffer = kmalloc_array(width, sizeof(load), GFP_KERNEL); -	if (!buffer) -		return -ENOMEM; - -	load += ISP_LEFT_PAD; -	for (i = 0; i < height; i++) { -		ret = hmm_load(load, buffer, width * sizeof(load)); -		if (ret < 0) -			goto remove_pad_error; - -		ret = hmm_store(store, buffer, width * sizeof(store)); -		if (ret < 0) -			goto remove_pad_error; - -		load  += in_frame->info.padded_width; -		store += width; -	} - -remove_pad_error: -	kfree(buffer); -	return ret; -} - -static int atomisp_mmap(struct file *file, struct vm_area_struct *vma) -{ -	struct video_device *vdev = video_devdata(file); -	struct atomisp_device *isp = video_get_drvdata(vdev); -	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); -	struct atomisp_sub_device *asd = pipe->asd; -	struct ia_css_frame *raw_virt_addr; -	u32 start = vma->vm_start; -	u32 end = vma->vm_end; -	u32 size = end - start; -	u32 origin_size, new_size; -	int ret; - -	if (!asd) { -		dev_err(isp->dev, "%s(): asd is NULL, device is %s\n", -			__func__, vdev->name); -		return -EINVAL; -	} - -	if (!(vma->vm_flags & (VM_WRITE | VM_READ))) -		return -EACCES; - -	mutex_lock(&isp->mutex); - -	if (!(vma->vm_flags & VM_SHARED)) { -		/* Map private buffer. -		 * Set VM_SHARED to the flags since we need -		 * to map the buffer page by page. -		 * Without VM_SHARED, remap_pfn_range() treats -		 * this kind of mapping as invalid. -		 */ -		vma->vm_flags |= VM_SHARED; -		ret = hmm_mmap(vma, vma->vm_pgoff << PAGE_SHIFT); -		mutex_unlock(&isp->mutex); -		return ret; -	} - -	/* mmap for ISP offline raw data */ -	if (atomisp_subdev_source_pad(vdev) -	    == ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE && -	    vma->vm_pgoff == (ISP_PARAM_MMAP_OFFSET >> PAGE_SHIFT)) { -		new_size = pipe->pix.width * pipe->pix.height * 2; -		if (asd->params.online_process != 0) { -			ret = -EINVAL; -			goto error; -		} -		raw_virt_addr = asd->raw_output_frame; -		if (!raw_virt_addr) { -			dev_err(isp->dev, "Failed to request RAW frame\n"); -			ret = -EINVAL; -			goto error; -		} - -		ret = remove_pad_from_frame(isp, raw_virt_addr, -					    pipe->pix.width, pipe->pix.height); -		if (ret < 0) { -			dev_err(isp->dev, "remove pad failed.\n"); -			goto error; -		} -		origin_size = raw_virt_addr->data_bytes; -		raw_virt_addr->data_bytes = new_size; - -		if (size != PAGE_ALIGN(new_size)) { -			dev_err(isp->dev, "incorrect size for mmap ISP  Raw Frame\n"); -			ret = -EINVAL; -			goto error; -		} - -		if (frame_mmap(isp, raw_virt_addr, vma)) { -			dev_err(isp->dev, "frame_mmap failed.\n"); -			raw_virt_addr->data_bytes = origin_size; -			ret = -EAGAIN; -			goto error; -		} -		raw_virt_addr->data_bytes = origin_size; -		vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; -		mutex_unlock(&isp->mutex); -		return 0; -	} - -	/* -	 * mmap for normal frames -	 */ -	if (size != pipe->pix.sizeimage) { -		dev_err(isp->dev, "incorrect size for mmap ISP frames\n"); -		ret = -EINVAL; -		goto error; -	} -	mutex_unlock(&isp->mutex); - -	return atomisp_videobuf_mmap_mapper(&pipe->capq, vma); - -error: -	mutex_unlock(&isp->mutex); - -	return ret; -} - -static __poll_t atomisp_poll(struct file *file, -			     struct poll_table_struct *pt) -{ -	struct video_device *vdev = video_devdata(file); -	struct atomisp_device *isp = video_get_drvdata(vdev); -	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); - -	mutex_lock(&isp->mutex); -	if (pipe->capq.streaming != 1) { -		mutex_unlock(&isp->mutex); -		return EPOLLERR; -	} -	mutex_unlock(&isp->mutex); - -	return videobuf_poll_stream(file, &pipe->capq, pt); -} -  const struct v4l2_file_operations atomisp_fops = {  	.owner = THIS_MODULE,  	.open = atomisp_open,  	.release = atomisp_release, -	.mmap = atomisp_mmap, +	.mmap = vb2_fop_mmap, +	.poll = vb2_fop_poll,  	.unlocked_ioctl = video_ioctl2,  #ifdef CONFIG_COMPAT  	/* @@ -1124,5 +938,4 @@ const struct v4l2_file_operations atomisp_fops = {  	.compat_ioctl32 = atomisp_compat_ioctl32,  	 */  #endif -	.poll = atomisp_poll,  }; diff --git a/drivers/staging/media/atomisp/pci/atomisp_fops.h b/drivers/staging/media/atomisp/pci/atomisp_fops.h index 3f1e442ba782..10e43126b693 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_fops.h +++ b/drivers/staging/media/atomisp/pci/atomisp_fops.h @@ -22,12 +22,6 @@  #define	__ATOMISP_FOPS_H__  #include "atomisp_subdev.h" -int atomisp_q_video_buffers_to_css(struct atomisp_sub_device *asd, -				   struct atomisp_video_pipe *pipe, -				   enum atomisp_input_stream_id stream_id, -				   enum ia_css_buffer_type css_buf_type, -				   enum ia_css_pipe_id css_pipe_id); -  unsigned int atomisp_dev_users(struct atomisp_device *isp);  unsigned int atomisp_sub_dev_users(struct atomisp_sub_device *asd); @@ -35,13 +29,6 @@ unsigned int atomisp_sub_dev_users(struct atomisp_sub_device *asd);   * Memory help functions for image frame and private parameters   */ -int atomisp_videobuf_mmap_mapper(struct videobuf_queue *q, -				 struct vm_area_struct *vma); - -int atomisp_qbuf_to_css(struct atomisp_device *isp, -			struct atomisp_video_pipe *pipe, -			struct videobuf_buffer *vb); -  int atomisp_qbuffers_to_css(struct atomisp_sub_device *asd);  extern const struct v4l2_file_operations atomisp_fops; diff --git a/drivers/staging/media/atomisp/pci/atomisp_internal.h b/drivers/staging/media/atomisp/pci/atomisp_internal.h index d9d158cdf09e..653e6d74a966 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_internal.h +++ b/drivers/staging/media/atomisp/pci/atomisp_internal.h @@ -195,7 +195,6 @@ struct atomisp_regs {  };  struct atomisp_sw_contex { -	int power_state;  	int running_freq;  }; diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c index 0ddb0ed42dd9..cb01ba65c88f 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c @@ -23,7 +23,6 @@  #include <media/v4l2-ioctl.h>  #include <media/v4l2-event.h> -#include <media/videobuf-vmalloc.h>  #include "atomisp_cmd.h"  #include "atomisp_common.h" @@ -542,6 +541,11 @@ int atomisp_pipe_check(struct atomisp_video_pipe *pipe, bool settings_change)  	if (pipe->isp->isp_fatal_error)  		return -EIO; +	if (settings_change && vb2_is_busy(&pipe->vb_queue)) { +		dev_err(pipe->isp->dev, "Set fmt/input IOCTL while streaming\n"); +		return -EBUSY; +	} +  	switch (pipe->asd->streaming) {  	case ATOMISP_DEVICE_STREAMING_DISABLED:  		break; @@ -632,10 +636,10 @@ static int atomisp_enum_input(struct file *file, void *fh,  static unsigned int  atomisp_subdev_streaming_count(struct atomisp_sub_device *asd)  { -	return asd->video_out_preview.capq.streaming -	       + asd->video_out_capture.capq.streaming -	       + asd->video_out_video_capture.capq.streaming -	       + asd->video_out_vf.capq.streaming; +	return asd->video_out_preview.vb_queue.start_streaming_called +	       + asd->video_out_capture.vb_queue.start_streaming_called +	       + asd->video_out_video_capture.vb_queue.start_streaming_called +	       + asd->video_out_vf.vb_queue.start_streaming_called;  }  unsigned int atomisp_streaming_count(struct atomisp_device *isp) @@ -661,6 +665,14 @@ static int atomisp_g_input(struct file *file, void *fh, unsigned int *input)  	return 0;  } +static int atomisp_s_fmt_cap(struct file *file, void *fh, +			     struct v4l2_format *f) +{ +	struct video_device *vdev = video_devdata(file); + +	return atomisp_set_fmt(vdev, f); +} +  /*   * set input are used to set current primary/secondary camera   */ @@ -866,29 +878,8 @@ static int atomisp_adjust_fmt(struct v4l2_format *f)  	u32 padded_width;  	format_bridge = atomisp_get_format_bridge(f->fmt.pix.pixelformat); - -	padded_width = f->fmt.pix.width + pad_w; - -	if (format_bridge->planar) { -		f->fmt.pix.bytesperline = padded_width; -		f->fmt.pix.sizeimage = PAGE_ALIGN(f->fmt.pix.height * -						  DIV_ROUND_UP(format_bridge->depth * -						  padded_width, 8)); -	} else { -		f->fmt.pix.bytesperline = DIV_ROUND_UP(format_bridge->depth * -						      padded_width, 8); -		f->fmt.pix.sizeimage = PAGE_ALIGN(f->fmt.pix.height * f->fmt.pix.bytesperline); -	} - -	if (f->fmt.pix.field == V4L2_FIELD_ANY) -		f->fmt.pix.field = V4L2_FIELD_NONE; - -	format_bridge = atomisp_get_format_bridge(f->fmt.pix.pixelformat); -	if (!format_bridge) -		return -EINVAL; -  	/* Currently, raw formats are broken!!! */ -	if (format_bridge->sh_fmt == IA_CSS_FRAME_FORMAT_RAW) { +	if (!format_bridge || format_bridge->sh_fmt == IA_CSS_FRAME_FORMAT_RAW) {  		f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;  		format_bridge = atomisp_get_format_bridge(f->fmt.pix.pixelformat); @@ -931,6 +922,7 @@ static int atomisp_try_fmt_cap(struct file *file, void *fh,  			       struct v4l2_format *f)  {  	struct video_device *vdev = video_devdata(file); +	u32 pixfmt = f->fmt.pix.pixelformat;  	int ret;  	/* @@ -944,6 +936,12 @@ static int atomisp_try_fmt_cap(struct file *file, void *fh,  	if (ret)  		return ret; +	/* +	 * atomisp_try_fmt() replaces pixelformat with the sensors native +	 * format, restore the actual format requested by userspace. +	 */ +	f->fmt.pix.pixelformat = pixfmt; +  	return atomisp_adjust_fmt(f);  } @@ -961,44 +959,13 @@ static int atomisp_g_fmt_cap(struct file *file, void *fh,  	if (f->fmt.pix.sizeimage)  		return 0; -	f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; +	f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;  	f->fmt.pix.width = 10000;  	f->fmt.pix.height = 10000;  	return atomisp_try_fmt_cap(file, fh, f);  } -/* - * Free videobuffer buffer priv data - */ -void atomisp_videobuf_free_buf(struct videobuf_buffer *vb) -{ -	struct videobuf_vmalloc_memory *vm_mem; - -	if (!vb) -		return; - -	vm_mem = vb->priv; -	if (vm_mem && vm_mem->vaddr) { -		ia_css_frame_free(vm_mem->vaddr); -		vm_mem->vaddr = NULL; -	} -} - -/* - * this function is used to free video buffer queue - */ -static void atomisp_videobuf_free_queue(struct videobuf_queue *q) -{ -	int i; - -	for (i = 0; i < VIDEO_MAX_FRAME; i++) { -		atomisp_videobuf_free_buf(q->bufs[i]); -		kfree(q->bufs[i]); -		q->bufs[i] = NULL; -	} -} -  int atomisp_alloc_css_stat_bufs(struct atomisp_sub_device *asd,  				uint16_t stream_id)  { @@ -1100,178 +1067,13 @@ error:  	return -ENOMEM;  } -/* - * Initiate Memory Mapping or User Pointer I/O - */ -int atomisp_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *req) -{ -	struct video_device *vdev = video_devdata(file); -	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); -	struct atomisp_sub_device *asd = pipe->asd; -	struct ia_css_frame_info frame_info; -	struct ia_css_frame *frame; -	struct videobuf_vmalloc_memory *vm_mem; -	u16 source_pad = atomisp_subdev_source_pad(vdev); -	int ret = 0, i = 0; - -	if (req->count == 0) { -		mutex_lock(&pipe->capq.vb_lock); -		if (!list_empty(&pipe->capq.stream)) -			videobuf_queue_cancel(&pipe->capq); - -		atomisp_videobuf_free_queue(&pipe->capq); -		mutex_unlock(&pipe->capq.vb_lock); -		/* clear request config id */ -		memset(pipe->frame_request_config_id, 0, -		       VIDEO_MAX_FRAME * sizeof(unsigned int)); -		memset(pipe->frame_params, 0, -		       VIDEO_MAX_FRAME * -		       sizeof(struct atomisp_css_params_with_list *)); -		return 0; -	} - -	ret = videobuf_reqbufs(&pipe->capq, req); -	if (ret) -		return ret; - -	atomisp_alloc_css_stat_bufs(asd, ATOMISP_INPUT_STREAM_GENERAL); - -	/* -	 * for user pointer type, buffers are not really allocated here, -	 * buffers are setup in QBUF operation through v4l2_buffer structure -	 */ -	if (req->memory == V4L2_MEMORY_USERPTR) -		return 0; - -	ret = atomisp_get_css_frame_info(asd, source_pad, &frame_info); -	if (ret) -		return ret; - -	/* -	 * Allocate the real frame here for selected node using our -	 * memory management function -	 */ -	for (i = 0; i < req->count; i++) { -		if (ia_css_frame_allocate_from_info(&frame, &frame_info)) -			goto error; -		vm_mem = pipe->capq.bufs[i]->priv; -		vm_mem->vaddr = frame; -	} - -	return ret; - -error: -	while (i--) { -		vm_mem = pipe->capq.bufs[i]->priv; -		ia_css_frame_free(vm_mem->vaddr); -	} - -	if (asd->vf_frame) -		ia_css_frame_free(asd->vf_frame); - -	return -ENOMEM; -} - -/* application query the status of a buffer */ -static int atomisp_querybuf(struct file *file, void *fh, -			    struct v4l2_buffer *buf) -{ -	struct video_device *vdev = video_devdata(file); -	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); - -	return videobuf_querybuf(&pipe->capq, buf); -} - -/* - * Applications call the VIDIOC_QBUF ioctl to enqueue an empty (capturing) or - * filled (output) buffer in the drivers incoming queue. - */ -static int atomisp_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf) +static int atomisp_qbuf_wrapper(struct file *file, void *fh, struct v4l2_buffer *buf)  { -	static const int NOFLUSH_FLAGS = V4L2_BUF_FLAG_NO_CACHE_INVALIDATE | -					 V4L2_BUF_FLAG_NO_CACHE_CLEAN;  	struct video_device *vdev = video_devdata(file);  	struct atomisp_device *isp = video_get_drvdata(vdev);  	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); -	struct atomisp_sub_device *asd = pipe->asd; -	struct videobuf_buffer *vb; -	struct videobuf_vmalloc_memory *vm_mem; -	struct ia_css_frame_info frame_info; -	struct ia_css_frame *handle = NULL; -	u32 length; -	u32 pgnr; -	int ret; - -	ret = atomisp_pipe_check(pipe, false); -	if (ret) -		return ret; - -	if (!buf || buf->index >= VIDEO_MAX_FRAME || -	    !pipe->capq.bufs[buf->index]) { -		dev_err(isp->dev, "Invalid index for qbuf.\n"); -		return -EINVAL; -	} - -	/* -	 * For userptr type frame, we convert user space address to physic -	 * address and reprograme out page table properly -	 */ -	if (buf->memory == V4L2_MEMORY_USERPTR) { -		if (offset_in_page(buf->m.userptr)) { -			dev_err(isp->dev, "Error userptr is not page aligned.\n"); -			return -EINVAL; -		} - -		vb = pipe->capq.bufs[buf->index]; -		vm_mem = vb->priv; -		if (!vm_mem) -			return -EINVAL; - -		length = vb->bsize; -		pgnr = (length + (PAGE_SIZE - 1)) >> PAGE_SHIFT; - -		if (vb->baddr == buf->m.userptr && vm_mem->vaddr) -			goto done; - -		if (atomisp_get_css_frame_info(asd, -					       atomisp_subdev_source_pad(vdev), &frame_info)) -			return -EIO; - -		ret = ia_css_frame_map(&handle, &frame_info, -					    (void __user *)buf->m.userptr, -					    pgnr); -		if (ret) { -			dev_err(isp->dev, "Failed to map user buffer\n"); -			return ret; -		} - -		if (vm_mem->vaddr) { -			mutex_lock(&pipe->capq.vb_lock); -			ia_css_frame_free(vm_mem->vaddr); -			vm_mem->vaddr = NULL; -			vb->state = VIDEOBUF_NEEDS_INIT; -			mutex_unlock(&pipe->capq.vb_lock); -		} - -		vm_mem->vaddr = handle; - -		buf->flags &= ~V4L2_BUF_FLAG_MAPPED; -		buf->flags |= V4L2_BUF_FLAG_QUEUED; -		buf->flags &= ~V4L2_BUF_FLAG_DONE; -	} else if (buf->memory == V4L2_MEMORY_MMAP) { -		buf->flags |= V4L2_BUF_FLAG_MAPPED; -		buf->flags |= V4L2_BUF_FLAG_QUEUED; -		buf->flags &= ~V4L2_BUF_FLAG_DONE; - -		/* -		 * For mmap, frames were allocated at request buffers -		 */ -	} - -done: -	if (!((buf->flags & NOFLUSH_FLAGS) == NOFLUSH_FLAGS)) -		wbinvd(); +	/* FIXME this abuse of buf->reserved2 comes from the original atomisp buffer handling */  	if (!atomisp_is_vf_pipe(pipe) &&  	    (buf->reserved2 & ATOMISP_BUFFER_HAS_PER_FRAME_SETTING)) {  		/* this buffer will have a per-frame parameter */ @@ -1284,90 +1086,27 @@ done:  		pipe->frame_request_config_id[buf->index] = 0;  	} -	pipe->frame_params[buf->index] = NULL; - -	mutex_unlock(&isp->mutex); -	ret = videobuf_qbuf(&pipe->capq, buf); -	mutex_lock(&isp->mutex); -	if (ret) -		return ret; - -	/* TODO: do this better, not best way to queue to css */ -	if (asd->streaming == ATOMISP_DEVICE_STREAMING_ENABLED) { -		if (!list_empty(&pipe->buffers_waiting_for_param)) { -			atomisp_handle_parameter_and_buffer(pipe); -		} else { -			atomisp_qbuffers_to_css(asd); -		} -	} - -	/* -	 * Workaround: Due to the design of HALv3, -	 * sometimes in ZSL or SDV mode HAL needs to -	 * capture multiple images within one streaming cycle. -	 * But the capture number cannot be determined by HAL. -	 * So HAL only sets the capture number to be 1 and queue multiple -	 * buffers. Atomisp driver needs to check this case and re-trigger -	 * CSS to do capture when new buffer is queued. -	 */ -	if (asd->continuous_mode->val && -	    atomisp_subdev_source_pad(vdev) -	    == ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE && -	    pipe->capq.streaming && -	    !asd->enable_raw_buffer_lock->val && -	    asd->params.offline_parm.num_captures == 1) { -			asd->pending_capture_request++; -			dev_dbg(isp->dev, "Add one pending capture request.\n"); -	} - -	dev_dbg(isp->dev, "qbuf buffer %d (%s) for asd%d\n", buf->index, -		vdev->name, asd->index); - -	return 0; +	return vb2_ioctl_qbuf(file, fh, buf);  } -static int __get_frame_exp_id(struct atomisp_video_pipe *pipe, -			      struct v4l2_buffer *buf) -{ -	struct videobuf_vmalloc_memory *vm_mem; -	struct ia_css_frame *handle; -	int i; - -	for (i = 0; pipe->capq.bufs[i]; i++) { -		vm_mem = pipe->capq.bufs[i]->priv; -		handle = vm_mem->vaddr; -		if (buf->index == pipe->capq.bufs[i]->i && handle) -			return handle->exp_id; -	} -	return -EINVAL; -} - -/* - * Applications call the VIDIOC_DQBUF ioctl to dequeue a filled (capturing) or - * displayed (output buffer)from the driver's outgoing queue - */ -static int atomisp_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf) +static int atomisp_dqbuf_wrapper(struct file *file, void *fh, struct v4l2_buffer *buf)  {  	struct video_device *vdev = video_devdata(file);  	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev);  	struct atomisp_sub_device *asd = pipe->asd;  	struct atomisp_device *isp = video_get_drvdata(vdev); +	struct ia_css_frame *frame; +	struct vb2_buffer *vb;  	int ret; -	ret = atomisp_pipe_check(pipe, false); +	ret = vb2_ioctl_dqbuf(file, fh, buf);  	if (ret)  		return ret; -	mutex_unlock(&isp->mutex); -	ret = videobuf_dqbuf(&pipe->capq, buf, file->f_flags & O_NONBLOCK); -	mutex_lock(&isp->mutex); -	if (ret) { -		if (ret != -EAGAIN) -			dev_dbg(isp->dev, "<%s: %d\n", __func__, ret); -		return ret; -	} +	vb = pipe->vb_queue.bufs[buf->index]; +	frame = vb_to_frame(vb); -	buf->bytesused = pipe->pix.sizeimage; +	/* FIXME this abuse of buf->reserved* comes from the original atomisp buffer handling */  	buf->reserved = asd->frame_status[buf->index];  	/* @@ -1378,7 +1117,7 @@ static int atomisp_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)  	 */  	buf->reserved &= 0x0000ffff;  	if (!(buf->flags & V4L2_BUF_FLAG_ERROR)) -		buf->reserved |= __get_frame_exp_id(pipe, buf) << 16; +		buf->reserved |= frame->exp_id;  	buf->reserved2 = pipe->frame_config_id[buf->index];  	dev_dbg(isp->dev, @@ -1506,36 +1245,26 @@ static void atomisp_dma_burst_len_cfg(struct atomisp_sub_device *asd)  		atomisp_css2_hw_store_32(DMA_BURST_SIZE_REG, 0x00);  } -/* - * This ioctl start the capture during streaming I/O. - */ -static int atomisp_streamon(struct file *file, void *fh, -			    enum v4l2_buf_type type) +int atomisp_start_streaming(struct vb2_queue *vq, unsigned int count)  { -	struct video_device *vdev = video_devdata(file); -	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); +	struct atomisp_video_pipe *pipe = vq_to_pipe(vq);  	struct atomisp_sub_device *asd = pipe->asd; -	struct atomisp_device *isp = video_get_drvdata(vdev); +	struct video_device *vdev = &pipe->vdev; +	struct atomisp_device *isp = asd->isp;  	struct pci_dev *pdev = to_pci_dev(isp->dev);  	enum ia_css_pipe_id css_pipe_id;  	unsigned int sensor_start_stream;  	unsigned long irqflags;  	int ret; +	mutex_lock(&isp->mutex); +  	dev_dbg(isp->dev, "Start stream on pad %d for asd%d\n",  		atomisp_subdev_source_pad(vdev), asd->index); -	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { -		dev_dbg(isp->dev, "unsupported v4l2 buf type\n"); -		return -EINVAL; -	} -  	ret = atomisp_pipe_check(pipe, false);  	if (ret) -		return ret; - -	if (pipe->capq.streaming) -		return 0; +		goto out_unlock;  	/* Input system HW workaround */  	atomisp_dma_burst_len_cfg(asd); @@ -1546,18 +1275,6 @@ static int atomisp_streamon(struct file *file, void *fh,  	 */  	sensor_start_stream = atomisp_sensor_start_stream(asd); -	spin_lock_irqsave(&pipe->irq_lock, irqflags); -	if (list_empty(&pipe->capq.stream)) { -		spin_unlock_irqrestore(&pipe->irq_lock, irqflags); -		dev_dbg(isp->dev, "no buffer in the queue\n"); -		return -EINVAL; -	} -	spin_unlock_irqrestore(&pipe->irq_lock, irqflags); - -	ret = videobuf_streamon(&pipe->capq); -	if (ret) -		return ret; -  	/* Reset pending capture request count. */  	asd->pending_capture_request = 0; @@ -1578,8 +1295,10 @@ static int atomisp_streamon(struct file *file, void *fh,  				mutex_unlock(&isp->mutex);  				ret = wait_for_completion_interruptible(&asd->init_done);  				mutex_lock(&isp->mutex); -				if (ret != 0) -					return -ERESTARTSYS; +				if (ret) { +					ret = -ERESTARTSYS; +					goto out_unlock; +				}  			}  			/* handle per_frame_setting parameter and buffers */ @@ -1601,12 +1320,15 @@ static int atomisp_streamon(struct file *file, void *fh,  					asd->params.offline_parm.num_captures,  					asd->params.offline_parm.skip_frames,  					asd->params.offline_parm.offset); -				if (ret) -					return -EINVAL; +				if (ret) { +					ret = -EINVAL; +					goto out_unlock; +				}  			}  		}  		atomisp_qbuffers_to_css(asd); -		return 0; +		ret = 0; +		goto out_unlock;  	}  	if (asd->streaming == ATOMISP_DEVICE_STREAMING_ENABLED) { @@ -1631,8 +1353,10 @@ static int atomisp_streamon(struct file *file, void *fh,  	asd->params.dvs_6axis = NULL;  	ret = atomisp_css_start(asd, css_pipe_id, false); -	if (ret) -		return ret; +	if (ret) { +		atomisp_flush_video_pipe(pipe, true); +		goto out_unlock; +	}  	spin_lock_irqsave(&isp->lock, irqflags);  	asd->streaming = ATOMISP_DEVICE_STREAMING_ENABLED; @@ -1652,8 +1376,10 @@ static int atomisp_streamon(struct file *file, void *fh,  	atomisp_qbuffers_to_css(asd);  	/* Only start sensor when the last streaming instance started */ -	if (atomisp_subdev_streaming_count(asd) < sensor_start_stream) -		return 0; +	if (atomisp_subdev_streaming_count(asd) < sensor_start_stream) { +		ret = 0; +		goto out_unlock; +	}  start_sensor:  	if (isp->flash) { @@ -1684,7 +1410,7 @@ start_sensor:  		ret = atomisp_stream_on_master_slave_sensor(isp, false);  		if (ret) {  			dev_err(isp->dev, "master slave sensor stream on failed!\n"); -			return ret; +			goto out_unlock;  		}  		goto start_delay_wq;  	} else if (asd->depth_mode->val && (atomisp_streaming_count(isp) < @@ -1706,7 +1432,8 @@ start_sensor:  		spin_lock_irqsave(&isp->lock, irqflags);  		asd->streaming = ATOMISP_DEVICE_STREAMING_DISABLED;  		spin_unlock_irqrestore(&isp->lock, irqflags); -		return -EINVAL; +		ret = -EINVAL; +		goto out_unlock;  	}  start_delay_wq: @@ -1722,35 +1449,44 @@ start_delay_wq:  		asd->delayed_init = ATOMISP_DELAYED_INIT_NOT_QUEUED;  	} -	return 0; +out_unlock: +	mutex_unlock(&isp->mutex); +	return ret;  } -int atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) +void atomisp_stop_streaming(struct vb2_queue *vq)  { -	struct video_device *vdev = video_devdata(file); -	struct atomisp_device *isp = video_get_drvdata(vdev); -	struct pci_dev *pdev = to_pci_dev(isp->dev); -	struct atomisp_video_pipe *pipe = atomisp_to_video_pipe(vdev); +	struct atomisp_video_pipe *pipe = vq_to_pipe(vq);  	struct atomisp_sub_device *asd = pipe->asd; -	struct atomisp_video_pipe *capture_pipe = NULL; -	struct atomisp_video_pipe *vf_pipe = NULL; -	struct atomisp_video_pipe *preview_pipe = NULL; -	struct atomisp_video_pipe *video_pipe = NULL; -	struct videobuf_buffer *vb, *_vb; +	struct video_device *vdev = &pipe->vdev; +	struct atomisp_device *isp = asd->isp; +	struct pci_dev *pdev = to_pci_dev(isp->dev); +	bool recreate_streams[MAX_STREAM_NUM] = {0};  	enum ia_css_pipe_id css_pipe_id; -	int ret; -	unsigned long flags;  	bool first_streamoff = false; +	unsigned long flags; +	int i, ret; + +	mutex_lock(&isp->mutex);  	dev_dbg(isp->dev, "Stop stream on pad %d for asd%d\n",  		atomisp_subdev_source_pad(vdev), asd->index); -	lockdep_assert_held(&isp->mutex); - -	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { -		dev_dbg(isp->dev, "unsupported v4l2 buf type\n"); -		return -EINVAL; -	} +	/* +	 * There is no guarantee that the buffers queued to / owned by the ISP +	 * will properly be returned to the queue when stopping. Set a flag to +	 * avoid new buffers getting queued and then wait for all the current +	 * buffers to finish. +	 */ +	pipe->stopping = true; +	mutex_unlock(&isp->mutex); +	/* wait max 1 second */ +	ret = wait_event_timeout(pipe->vb_queue.done_wq, +				 atomisp_buffers_in_css(pipe) == 0, HZ); +	mutex_lock(&isp->mutex); +	pipe->stopping = false; +	if (ret == 0) +		dev_warn(isp->dev, "Warning timeout waiting for CSS to return buffers\n");  	/*  	 * do only videobuf_streamoff for capture & vf pipes in @@ -1766,36 +1502,10 @@ int atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type)  								      0, 0, 0);  			atomisp_freq_scaling(isp, ATOMISP_DFS_MODE_AUTO, false);  		} -		/* -		 * Currently there is no way to flush buffers queued to css. -		 * When doing videobuf_streamoff, active buffers will be -		 * marked as VIDEOBUF_NEEDS_INIT. HAL will be able to use -		 * these buffers again, and these buffers might be queued to -		 * css more than once! Warn here, if HAL has not dequeued all -		 * buffers back before calling streamoff. -		 */ -		if (pipe->buffers_in_css != 0) { -			WARN(1, "%s: buffers of vdev %s still in CSS!\n", -			     __func__, pipe->vdev.name); - -			/* -			 * Buffers remained in css maybe dequeued out in the -			 * next stream on, while this will causes serious -			 * issues as buffers already get invalid after -			 * previous stream off. -			 * -			 * No way to flush buffers but to reset the whole css -			 */ -			dev_warn(isp->dev, "Reset CSS to clean up css buffers.\n"); -			atomisp_css_flush(isp); -		} -		return videobuf_streamoff(&pipe->capq); +		goto out_unlock;  	} -	if (!pipe->capq.streaming) -		return 0; -  	if (asd->streaming == ATOMISP_DEVICE_STREAMING_ENABLED)  		first_streamoff = true; @@ -1806,12 +1516,8 @@ int atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type)  		asd->streaming = ATOMISP_DEVICE_STREAMING_STOPPING;  	spin_unlock_irqrestore(&isp->lock, flags); -	if (!first_streamoff) { -		ret = videobuf_streamoff(&pipe->capq); -		if (ret) -			return ret; +	if (!first_streamoff)  		goto stopsensor; -	}  	atomisp_clear_css_buffer_counters(asd);  	atomisp_css_irq_enable(isp, IA_CSS_IRQ_INFO_CSS_RECEIVER_SOF, false); @@ -1824,48 +1530,12 @@ int atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type)  	css_pipe_id = atomisp_get_css_pipe_id(asd);  	atomisp_css_stop(asd, css_pipe_id, false); -	/* cancel work queue*/ -	if (asd->video_out_capture.users) { -		capture_pipe = &asd->video_out_capture; -		wake_up_interruptible(&capture_pipe->capq.wait); -	} -	if (asd->video_out_vf.users) { -		vf_pipe = &asd->video_out_vf; -		wake_up_interruptible(&vf_pipe->capq.wait); -	} -	if (asd->video_out_preview.users) { -		preview_pipe = &asd->video_out_preview; -		wake_up_interruptible(&preview_pipe->capq.wait); -	} -	if (asd->video_out_video_capture.users) { -		video_pipe = &asd->video_out_video_capture; -		wake_up_interruptible(&video_pipe->capq.wait); -	} -	ret = videobuf_streamoff(&pipe->capq); -	if (ret) -		return ret; - -	/* cleanup css here */ -	/* no need for this, as ISP will be reset anyway */ -	/*atomisp_flush_bufs_in_css(isp);*/ - -	spin_lock_irqsave(&pipe->irq_lock, flags); -	list_for_each_entry_safe(vb, _vb, &pipe->activeq, queue) { -		vb->state = VIDEOBUF_PREPARED; -		list_del(&vb->queue); -	} -	list_for_each_entry_safe(vb, _vb, &pipe->buffers_waiting_for_param, queue) { -		vb->state = VIDEOBUF_PREPARED; -		list_del(&vb->queue); -		pipe->frame_request_config_id[vb->i] = 0; -	} -	spin_unlock_irqrestore(&pipe->irq_lock, flags); +	atomisp_flush_video_pipe(pipe, true);  	atomisp_subdev_cleanup_pending_events(asd);  stopsensor: -	if (atomisp_subdev_streaming_count(asd) + 1 -	    != atomisp_sensor_start_stream(asd)) -		return 0; +	if (atomisp_subdev_streaming_count(asd) != atomisp_sensor_start_stream(asd)) +		goto out_unlock;  	ret = v4l2_subdev_call(isp->inputs[asd->input_curr].camera,  			       video, s_stream, 0); @@ -1878,7 +1548,7 @@ stopsensor:  	/* if other streams are running, isp should not be powered off */  	if (atomisp_streaming_count(isp)) {  		atomisp_css_flush(isp); -		return 0; +		goto out_unlock;  	}  	/* Disable the CSI interface on ANN B0/K0 */ @@ -1894,50 +1564,45 @@ stopsensor:  	 * ISP work around, need to reset isp  	 * Is it correct time to reset ISP when first node does streamoff?  	 */ -	if (isp->sw_contex.power_state == ATOM_ISP_POWER_UP) { -		unsigned int i; -		bool recreate_streams[MAX_STREAM_NUM] = {0}; - -		if (isp->isp_timeout) -			dev_err(isp->dev, "%s: Resetting with WA activated", -				__func__); -		/* -		 * It is possible that the other asd stream is in the stage -		 * that v4l2_setfmt is just get called on it, which will -		 * create css stream on that stream. But at this point, there -		 * is no way to destroy the css stream created on that stream. -		 * -		 * So force stream destroy here. -		 */ -		for (i = 0; i < isp->num_of_streams; i++) { -			if (isp->asd[i].stream_prepared) { -				atomisp_destroy_pipes_stream_force(&isp-> -								   asd[i]); -				recreate_streams[i] = true; -			} +	if (isp->isp_timeout) +		dev_err(isp->dev, "%s: Resetting with WA activated", +			__func__); +	/* +	 * It is possible that the other asd stream is in the stage +	 * that v4l2_setfmt is just get called on it, which will +	 * create css stream on that stream. But at this point, there +	 * is no way to destroy the css stream created on that stream. +	 * +	 * So force stream destroy here. +	 */ +	for (i = 0; i < isp->num_of_streams; i++) { +		if (isp->asd[i].stream_prepared) { +			atomisp_destroy_pipes_stream_force(&isp->asd[i]); +			recreate_streams[i] = true;  		} +	} -		/* disable  PUNIT/ISP acknowlede/handshake - SRSE=3 */ -		pci_write_config_dword(pdev, PCI_I_CONTROL, -				       isp->saved_regs.i_control | MRFLD_PCI_I_CONTROL_SRSE_RESET_MASK); -		dev_err(isp->dev, "atomisp_reset"); -		atomisp_reset(isp); -		for (i = 0; i < isp->num_of_streams; i++) { -			if (recreate_streams[i]) { -				int ret2; - -				ret2 = atomisp_create_pipes_stream(&isp->asd[i]); -				if (ret2) { -					dev_err(isp->dev, "%s error re-creating streams: %d\n", -						__func__, ret2); -					if (!ret) -						ret = ret2; -				} +	/* disable  PUNIT/ISP acknowlede/handshake - SRSE=3 */ +	pci_write_config_dword(pdev, PCI_I_CONTROL, +			       isp->saved_regs.i_control | MRFLD_PCI_I_CONTROL_SRSE_RESET_MASK); +	dev_err(isp->dev, "atomisp_reset"); +	atomisp_reset(isp); +	for (i = 0; i < isp->num_of_streams; i++) { +		if (recreate_streams[i]) { +			int ret2; + +			ret2 = atomisp_create_pipes_stream(&isp->asd[i]); +			if (ret2) { +				dev_err(isp->dev, "%s error re-creating streams: %d\n", +					__func__, ret2); +				if (!ret) +					ret = ret2;  			}  		} -		isp->isp_timeout = false;  	} -	return ret; +	isp->isp_timeout = false; +out_unlock: +	mutex_unlock(&isp->mutex);  }  /* @@ -2725,13 +2390,13 @@ const struct v4l2_ioctl_ops atomisp_ioctl_ops = {  	.vidioc_enum_fmt_vid_cap = atomisp_enum_fmt_cap,  	.vidioc_try_fmt_vid_cap = atomisp_try_fmt_cap,  	.vidioc_g_fmt_vid_cap = atomisp_g_fmt_cap, -	.vidioc_s_fmt_vid_cap = atomisp_set_fmt, -	.vidioc_reqbufs = atomisp_reqbufs, -	.vidioc_querybuf = atomisp_querybuf, -	.vidioc_qbuf = atomisp_qbuf, -	.vidioc_dqbuf = atomisp_dqbuf, -	.vidioc_streamon = atomisp_streamon, -	.vidioc_streamoff = atomisp_streamoff, +	.vidioc_s_fmt_vid_cap = atomisp_s_fmt_cap, +	.vidioc_reqbufs = vb2_ioctl_reqbufs, +	.vidioc_querybuf = vb2_ioctl_querybuf, +	.vidioc_qbuf = atomisp_qbuf_wrapper, +	.vidioc_dqbuf = atomisp_dqbuf_wrapper, +	.vidioc_streamon = vb2_ioctl_streamon, +	.vidioc_streamoff = vb2_ioctl_streamoff,  	.vidioc_default = atomisp_vidioc_default,  	.vidioc_s_parm = atomisp_s_parm,  	.vidioc_g_parm = atomisp_g_parm, diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.h b/drivers/staging/media/atomisp/pci/atomisp_ioctl.h index c660f631d371..59e071f035f9 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.h +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.h @@ -39,14 +39,12 @@ int atomisp_pipe_check(struct atomisp_video_pipe *pipe, bool streaming_ok);  int atomisp_alloc_css_stat_bufs(struct atomisp_sub_device *asd,  				uint16_t stream_id); -int atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type); -int atomisp_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *req); +int atomisp_start_streaming(struct vb2_queue *vq, unsigned int count); +void atomisp_stop_streaming(struct vb2_queue *vq);  enum ia_css_pipe_id atomisp_get_css_pipe_id(struct atomisp_sub_device  	*asd); -void atomisp_videobuf_free_buf(struct videobuf_buffer *vb); -  extern const struct v4l2_ioctl_ops atomisp_ioctl_ops;  unsigned int atomisp_streaming_count(struct atomisp_device *isp); @@ -57,4 +55,8 @@ long atomisp_compat_ioctl32(struct file *file,  int atomisp_stream_on_master_slave_sensor(struct atomisp_device *isp,  	bool isp_timeout); + +int atomisp_start_streaming(struct vb2_queue *vq, unsigned int count); +void atomisp_stop_streaming(struct vb2_queue *vq); +  #endif /* __ATOMISP_IOCTL_H__ */ diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.c b/drivers/staging/media/atomisp/pci/atomisp_subdev.c index 847dfee6ad78..cadc468b4c2f 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_subdev.c +++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.c @@ -1064,6 +1064,8 @@ static void atomisp_init_subdev_pipe(struct atomisp_sub_device *asd,  	pipe->asd = asd;  	pipe->isp = asd->isp;  	spin_lock_init(&pipe->irq_lock); +	mutex_init(&pipe->vb_queue_mutex); +	INIT_LIST_HEAD(&pipe->buffers_in_css);  	INIT_LIST_HEAD(&pipe->activeq);  	INIT_LIST_HEAD(&pipe->buffers_waiting_for_param);  	INIT_LIST_HEAD(&pipe->per_frame_params); diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.h b/drivers/staging/media/atomisp/pci/atomisp_subdev.h index a1f4da35235d..bd2872cbb50c 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_subdev.h +++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.h @@ -21,8 +21,7 @@  #include <media/v4l2-ctrls.h>  #include <media/v4l2-device.h>  #include <media/v4l2-subdev.h> -#include <media/videobuf-core.h> - +#include <media/videobuf2-v4l2.h>  #include "atomisp_common.h"  #include "atomisp_compat.h"  #include "atomisp_v4l2.h" @@ -69,7 +68,12 @@ struct atomisp_video_pipe {  	struct video_device vdev;  	enum v4l2_buf_type type;  	struct media_pad pad; -	struct videobuf_queue capq; +	struct vb2_queue vb_queue; +	/* Lock for vb_queue, when also taking isp->mutex this must be taken first! */ +	struct mutex vb_queue_mutex; +	/* List of video-buffers handed over to the CSS  */ +	struct list_head buffers_in_css; +	/* List of video-buffers handed over to the driver, but not yet to the CSS */  	struct list_head activeq;  	/*  	 * the buffers waiting for per-frame parameters, this is only valid @@ -79,10 +83,13 @@ struct atomisp_video_pipe {  	/* the link list to store per_frame parameters */  	struct list_head per_frame_params; +	/* Filled through atomisp_get_css_frame_info() on queue setup */ +	struct ia_css_frame_info frame_info; +  	/* Store here the initial run mode */  	unsigned int default_run_mode; - -	unsigned int buffers_in_css; +	/* Set from streamoff to disallow queuing further buffers in CSS */ +	bool stopping;  	/*  	 * irq_lock is used to protect video buffer state change operations and @@ -110,6 +117,11 @@ struct atomisp_video_pipe {  	struct atomisp_css_params_with_list *frame_params[VIDEO_MAX_FRAME];  }; +#define vq_to_pipe(queue) \ +	container_of(queue, struct atomisp_video_pipe, vb_queue) + +#define vb_to_pipe(vb) vq_to_pipe((vb)->vb2_queue) +  struct atomisp_pad_format {  	struct v4l2_mbus_framefmt fmt;  	struct v4l2_rect crop; diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c index d5bb9906ca6f..e786b81921da 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c +++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c @@ -573,11 +573,7 @@ static int atomisp_mrfld_pre_power_down(struct atomisp_device *isp)  	unsigned long flags;  	spin_lock_irqsave(&isp->lock, flags); -	if (isp->sw_contex.power_state == ATOM_ISP_POWER_DOWN) { -		spin_unlock_irqrestore(&isp->lock, flags); -		dev_dbg(isp->dev, "<%s %d.\n", __func__, __LINE__); -		return 0; -	} +  	/*  	 * MRFLD HAS requirement: cannot power off i-unit if  	 * ISP has IRQ not serviced. @@ -724,62 +720,51 @@ static int atomisp_mrfld_power(struct atomisp_device *isp, bool enable)  	return -EBUSY;  } -/* Workaround for pmu_nc_set_power_state not ready in MRFLD */ -int atomisp_mrfld_power_down(struct atomisp_device *isp) -{ -	return atomisp_mrfld_power(isp, false); -} - -/* Workaround for pmu_nc_set_power_state not ready in MRFLD */ -int atomisp_mrfld_power_up(struct atomisp_device *isp) -{ -	return atomisp_mrfld_power(isp, true); -} - -int atomisp_runtime_suspend(struct device *dev) +int atomisp_power_off(struct device *dev)  { -	struct atomisp_device *isp = (struct atomisp_device *) -				     dev_get_drvdata(dev); +	struct atomisp_device *isp = dev_get_drvdata(dev); +	struct pci_dev *pdev = to_pci_dev(dev);  	int ret; +	u32 reg; + +	atomisp_css_uninit(isp);  	ret = atomisp_mrfld_pre_power_down(isp);  	if (ret)  		return ret; -	/*Turn off the ISP d-phy*/ -	ret = atomisp_ospm_dphy_down(isp); -	if (ret) -		return ret; +	/* +	 * MRFLD IUNIT DPHY is located in an always-power-on island +	 * MRFLD HW design need all CSI ports are disabled before +	 * powering down the IUNIT. +	 */ +	pci_read_config_dword(pdev, MRFLD_PCI_CSI_CONTROL, ®); +	reg |= MRFLD_ALL_CSI_PORTS_OFF_MASK; +	pci_write_config_dword(pdev, MRFLD_PCI_CSI_CONTROL, reg); +  	cpu_latency_qos_update_request(&isp->pm_qos, PM_QOS_DEFAULT_VALUE); -	return atomisp_mrfld_power_down(isp); +	return atomisp_mrfld_power(isp, false);  } -int atomisp_runtime_resume(struct device *dev) +int atomisp_power_on(struct device *dev)  {  	struct atomisp_device *isp = (struct atomisp_device *)  				     dev_get_drvdata(dev);  	int ret; -	ret = atomisp_mrfld_power_up(isp); +	ret = atomisp_mrfld_power(isp, true);  	if (ret)  		return ret;  	cpu_latency_qos_update_request(&isp->pm_qos, isp->max_isr_latency); -	if (isp->sw_contex.power_state == ATOM_ISP_POWER_DOWN) { -		/*Turn on ISP d-phy */ -		ret = atomisp_ospm_dphy_up(isp); -		if (ret) { -			dev_err(isp->dev, "Failed to power up ISP!.\n"); -			return -EINVAL; -		} -	}  	/*restore register values for iUnit and iUnitPHY registers*/  	if (isp->saved_regs.pcicmdsts)  		atomisp_restore_iunit_reg(isp);  	atomisp_freq_scaling(isp, ATOMISP_DFS_MODE_LOW, true); -	return 0; + +	return atomisp_css_init(isp);  }  static int __maybe_unused atomisp_suspend(struct device *dev) @@ -789,7 +774,6 @@ static int __maybe_unused atomisp_suspend(struct device *dev)  	/* FIXME: only has one isp_subdev at present */  	struct atomisp_sub_device *asd = &isp->asd[0];  	unsigned long flags; -	int ret;  	/*  	 * FIXME: Suspend is not supported by sensors. Abort if any video @@ -806,45 +790,12 @@ static int __maybe_unused atomisp_suspend(struct device *dev)  	}  	spin_unlock_irqrestore(&isp->lock, flags); -	ret = atomisp_mrfld_pre_power_down(isp); -	if (ret) -		return ret; - -	/*Turn off the ISP d-phy */ -	ret = atomisp_ospm_dphy_down(isp); -	if (ret) { -		dev_err(isp->dev, "fail to power off ISP\n"); -		return ret; -	} -	cpu_latency_qos_update_request(&isp->pm_qos, PM_QOS_DEFAULT_VALUE); -	return atomisp_mrfld_power_down(isp); +	return atomisp_power_off(dev);  }  static int __maybe_unused atomisp_resume(struct device *dev)  { -	struct atomisp_device *isp = (struct atomisp_device *) -				     dev_get_drvdata(dev); -	int ret; - -	ret = atomisp_mrfld_power_up(isp); -	if (ret) -		return ret; - -	cpu_latency_qos_update_request(&isp->pm_qos, isp->max_isr_latency); - -	/*Turn on ISP d-phy */ -	ret = atomisp_ospm_dphy_up(isp); -	if (ret) { -		dev_err(isp->dev, "Failed to power up ISP!.\n"); -		return -EINVAL; -	} - -	/*restore register values for iUnit and iUnitPHY registers*/ -	if (isp->saved_regs.pcicmdsts) -		atomisp_restore_iunit_reg(isp); - -	atomisp_freq_scaling(isp, ATOMISP_DFS_MODE_LOW, true); -	return 0; +	return atomisp_power_on(dev);  }  int atomisp_csi_lane_config(struct atomisp_device *isp) @@ -1459,7 +1410,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i  	isp->dev = &pdev->dev;  	isp->base = pcim_iomap_table(pdev)[ATOM_ISP_PCI_BAR]; -	isp->sw_contex.power_state = ATOM_ISP_POWER_UP;  	isp->saved_regs.ispmmadr = start;  	dev_dbg(&pdev->dev, "atomisp mmio base: %p\n", isp->base); @@ -1723,10 +1673,8 @@ load_fw_fail:  	atomisp_msi_irq_uninit(isp); -	atomisp_ospm_dphy_down(isp); -  	/* Address later when we worry about the ...field chips */ -	if (IS_ENABLED(CONFIG_PM) && atomisp_mrfld_power_down(isp)) +	if (IS_ENABLED(CONFIG_PM) && atomisp_mrfld_power(isp, false))  		dev_err(&pdev->dev, "Failed to switch off ISP\n");  atomisp_dev_alloc_fail: @@ -1774,8 +1722,8 @@ static const struct pci_device_id atomisp_pci_tbl[] = {  MODULE_DEVICE_TABLE(pci, atomisp_pci_tbl);  static const struct dev_pm_ops atomisp_pm_ops = { -	.runtime_suspend = atomisp_runtime_suspend, -	.runtime_resume = atomisp_runtime_resume, +	.runtime_suspend = atomisp_power_off, +	.runtime_resume = atomisp_power_on,  	.suspend = atomisp_suspend,  	.resume = atomisp_resume,  }; diff --git a/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_binarydesc.h b/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_binarydesc.h index 965cfda50707..e42eeaeb3ee4 100644 --- a/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_binarydesc.h +++ b/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_binarydesc.h @@ -16,6 +16,8 @@  #ifndef __IA_CSS_PIPE_BINARYDESC_H__  #define __IA_CSS_PIPE_BINARYDESC_H__ +#include <linux/math.h> +  #include <ia_css_types.h>		/* ia_css_pipe */  #include <ia_css_frame_public.h>	/* ia_css_frame_info */  #include <ia_css_binary.h>		/* ia_css_binary_descr */ @@ -56,17 +58,12 @@ void ia_css_pipe_get_vfpp_binarydesc(   *   * @param[in] bds_factor: The bayer downscaling factor.   *		(= The bds_factor member in the sh_css_bds_factor structure.) - * @param[out] bds_factor_numerator: The numerator of the bayer downscaling factor. - *		(= The numerator member in the sh_css_bds_factor structure.) - * @param[out] bds_factor_denominator: The denominator of the bayer downscaling factor. - *		(= The denominator member in the sh_css_bds_factor structure.) + * @param[out] bds: The rational fraction of the bayer downscaling factor. + *		(= The respective member in the sh_css_bds_factor structure.)   * @return	0 or error code upon error.   *   */ -int sh_css_bds_factor_get_numerator_denominator( -    unsigned int bds_factor, -    unsigned int *bds_factor_numerator, -    unsigned int *bds_factor_denominator); +int sh_css_bds_factor_get_fract(unsigned int bds_factor, struct u32_fract *bds);  /* @brief Get a binary descriptor for preview stage.   * diff --git a/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_stagedesc.h b/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_stagedesc.h index 40c8145a0797..7a0c988d89ee 100644 --- a/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_stagedesc.h +++ b/drivers/staging/media/atomisp/pci/camera/pipe/interface/ia_css_pipe_stagedesc.h @@ -38,11 +38,6 @@ void ia_css_pipe_get_firmwares_stage_desc(      const struct ia_css_fw_info *fw,      unsigned int mode); -void ia_css_pipe_get_acc_stage_desc( -    struct ia_css_pipeline_stage_desc *stage_desc, -    struct ia_css_binary *binary, -    struct ia_css_fw_info *fw); -  void ia_css_pipe_get_sp_func_stage_desc(      struct ia_css_pipeline_stage_desc *stage_desc,      struct ia_css_frame *out_frame, diff --git a/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_binarydesc.c b/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_binarydesc.c index 7dd0e4a53c8b..06664ce75b60 100644 --- a/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_binarydesc.c +++ b/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_binarydesc.c @@ -13,6 +13,9 @@   * more details.   */ +#include <linux/kernel.h> +#include <linux/math.h> +  #include "ia_css_pipe_binarydesc.h"  #include "ia_css_frame_format.h"  #include "ia_css_pipe.h" @@ -23,7 +26,6 @@  #include <assert_support.h>  /* HRT_GDC_N */  #include "gdc_device.h" -#include <linux/kernel.h>  /* This module provides a binary descriptions to used to find a binary. Since,   * every stage is associated with a binary, it implicity helps stage @@ -126,40 +128,29 @@ void ia_css_pipe_get_vfpp_binarydesc(  	IA_CSS_LEAVE_PRIVATE("");  } -static struct sh_css_bds_factor bds_factors_list[] = { -	{1, 1, SH_CSS_BDS_FACTOR_1_00}, -	{5, 4, SH_CSS_BDS_FACTOR_1_25}, -	{3, 2, SH_CSS_BDS_FACTOR_1_50}, -	{2, 1, SH_CSS_BDS_FACTOR_2_00}, -	{9, 4, SH_CSS_BDS_FACTOR_2_25}, -	{5, 2, SH_CSS_BDS_FACTOR_2_50}, -	{3, 1, SH_CSS_BDS_FACTOR_3_00}, -	{4, 1, SH_CSS_BDS_FACTOR_4_00}, -	{9, 2, SH_CSS_BDS_FACTOR_4_50}, -	{5, 1, SH_CSS_BDS_FACTOR_5_00}, -	{6, 1, SH_CSS_BDS_FACTOR_6_00}, -	{8, 1, SH_CSS_BDS_FACTOR_8_00} +static struct u32_fract bds_factors_list[] = { +	[SH_CSS_BDS_FACTOR_1_00] = {1, 1}, +	[SH_CSS_BDS_FACTOR_1_25] = {5, 4}, +	[SH_CSS_BDS_FACTOR_1_50] = {3, 2}, +	[SH_CSS_BDS_FACTOR_2_00] = {2, 1}, +	[SH_CSS_BDS_FACTOR_2_25] = {9, 4}, +	[SH_CSS_BDS_FACTOR_2_50] = {5, 2}, +	[SH_CSS_BDS_FACTOR_3_00] = {3, 1}, +	[SH_CSS_BDS_FACTOR_4_00] = {4, 1}, +	[SH_CSS_BDS_FACTOR_4_50] = {9, 2}, +	[SH_CSS_BDS_FACTOR_5_00] = {5, 1}, +	[SH_CSS_BDS_FACTOR_6_00] = {6, 1}, +	[SH_CSS_BDS_FACTOR_8_00] = {8, 1},  }; -int sh_css_bds_factor_get_numerator_denominator( -    unsigned int bds_factor, -    unsigned int *bds_factor_numerator, -    unsigned int *bds_factor_denominator) +int sh_css_bds_factor_get_fract(unsigned int bds_factor, struct u32_fract *bds)  { -	unsigned int i; - -	/* Loop over all bds factors until a match is found */ -	for (i = 0; i < ARRAY_SIZE(bds_factors_list); i++) { -		if (bds_factors_list[i].bds_factor == bds_factor) { -			*bds_factor_numerator = bds_factors_list[i].numerator; -			*bds_factor_denominator = bds_factors_list[i].denominator; -			return 0; -		} -	} +	/* Throw an error since bds_factor cannot be found in bds_factors_list */ +	if (bds_factor >= ARRAY_SIZE(bds_factors_list)) +		return -EINVAL; -	/* Throw an error since bds_factor cannot be found -	in bds_factors_list */ -	return -EINVAL; +	*bds = bds_factors_list[bds_factor]; +	return 0;  }  int binarydesc_calculate_bds_factor( @@ -194,7 +185,7 @@ int binarydesc_calculate_bds_factor(  			    (out_h * num / den <= in_h);  		if (cond) { -			*bds_factor = bds_factors_list[i].bds_factor; +			*bds_factor = i;  			return 0;  		}  	} diff --git a/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_stagedesc.c b/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_stagedesc.c index 82a24aabe8ce..6c93fa1c683b 100644 --- a/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_stagedesc.c +++ b/drivers/staging/media/atomisp/pci/camera/pipe/src/pipe_stagedesc.c @@ -74,27 +74,6 @@ void ia_css_pipe_get_firmwares_stage_desc(  	stage_desc->vf_frame = vf_frame;  } -void ia_css_pipe_get_acc_stage_desc( -    struct ia_css_pipeline_stage_desc *stage_desc, -    struct ia_css_binary *binary, -    struct ia_css_fw_info *fw) -{ -	unsigned int i; - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, -			    "ia_css_pipe_get_acc_stage_desc() enter:\n"); -	stage_desc->binary = binary; -	stage_desc->firmware = fw; -	stage_desc->sp_func = IA_CSS_PIPELINE_NO_FUNC; -	stage_desc->max_input_width = 0; -	stage_desc->mode = IA_CSS_BINARY_MODE_VF_PP; -	stage_desc->in_frame = NULL; -	for (i = 0; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) { -		stage_desc->out_frame[i] = NULL; -	} -	stage_desc->vf_frame = NULL; -} -  void ia_css_pipe_get_sp_func_stage_desc(      struct ia_css_pipeline_stage_desc *stage_desc,      struct ia_css_frame *out_frame, diff --git a/drivers/staging/media/atomisp/pci/css_2401_system/host/pixelgen_private.h b/drivers/staging/media/atomisp/pci/css_2401_system/host/pixelgen_private.h index 1c7938d8ccb5..8f79424bedb2 100644 --- a/drivers/staging/media/atomisp/pci/css_2401_system/host/pixelgen_private.h +++ b/drivers/staging/media/atomisp/pci/css_2401_system/host/pixelgen_private.h @@ -161,7 +161,7 @@ STORAGE_CLASS_PIXELGEN_C void pixelgen_ctrl_dump_state(  		     state->syng_stat_fcnt);  	ia_css_print("Pixel Generator ID %d syng stat done  0x%x\n", ID,  		     state->syng_stat_done); -	ia_css_print("Pixel Generator ID %d tpg modee  0x%x\n", ID, state->tpg_mode); +	ia_css_print("Pixel Generator ID %d tpg mode  0x%x\n", ID, state->tpg_mode);  	ia_css_print("Pixel Generator ID %d tpg hcnt mask  0x%x\n", ID,  		     state->tpg_hcnt_mask);  	ia_css_print("Pixel Generator ID %d tpg hcnt mask  0x%x\n", ID, diff --git a/drivers/staging/media/atomisp/pci/hmm/hmm.c b/drivers/staging/media/atomisp/pci/hmm/hmm.c index fc6cfe9f7744..bb12644fd033 100644 --- a/drivers/staging/media/atomisp/pci/hmm/hmm.c +++ b/drivers/staging/media/atomisp/pci/hmm/hmm.c @@ -41,11 +41,9 @@ static bool hmm_initialized;  /*   * p: private - * s: shared - * u: user - * i: ion + * v: vmalloc   */ -static const char hmm_bo_type_string[] = "psui"; +static const char hmm_bo_type_string[] = "pv";  static ssize_t bo_show(struct device *dev, struct device_attribute *attr,  		       char *buf, struct list_head *bo_list, bool active) @@ -168,7 +166,8 @@ void hmm_cleanup(void)  	hmm_initialized = false;  } -static ia_css_ptr __hmm_alloc(size_t bytes, enum hmm_bo_type type, const void __user *userptr) +static ia_css_ptr __hmm_alloc(size_t bytes, enum hmm_bo_type type, +			      void *vmalloc_addr)  {  	unsigned int pgnr;  	struct hmm_buffer_object *bo; @@ -192,7 +191,7 @@ static ia_css_ptr __hmm_alloc(size_t bytes, enum hmm_bo_type type, const void __  	}  	/* Allocate pages for memory */ -	ret = hmm_bo_alloc_pages(bo, type, userptr); +	ret = hmm_bo_alloc_pages(bo, type, vmalloc_addr);  	if (ret) {  		dev_err(atomisp_dev, "hmm_bo_alloc_pages failed.\n");  		goto alloc_page_err; @@ -205,9 +204,8 @@ static ia_css_ptr __hmm_alloc(size_t bytes, enum hmm_bo_type type, const void __  		goto bind_err;  	} -	dev_dbg(atomisp_dev, -		"%s: pages: 0x%08x (%zu bytes), type: %d, user ptr %p\n", -		__func__, bo->start, bytes, type, userptr); +	dev_dbg(atomisp_dev, "pages: 0x%08x (%zu bytes), type: %d, vmalloc %p\n", +		bo->start, bytes, type, vmalloc);  	return bo->start; @@ -224,9 +222,9 @@ ia_css_ptr hmm_alloc(size_t bytes)  	return __hmm_alloc(bytes, HMM_BO_PRIVATE, NULL);  } -ia_css_ptr hmm_create_from_userdata(size_t bytes, const void __user *userptr) +ia_css_ptr hmm_create_from_vmalloc_buf(size_t bytes, void *vmalloc_addr)  { -	return __hmm_alloc(bytes, HMM_BO_USER, userptr); +	return __hmm_alloc(bytes, HMM_BO_VMALLOC, vmalloc_addr);  }  void hmm_free(ia_css_ptr virt) diff --git a/drivers/staging/media/atomisp/pci/hmm/hmm_bo.c b/drivers/staging/media/atomisp/pci/hmm/hmm_bo.c index a5fd6d38d3c4..5e53eed8ae95 100644 --- a/drivers/staging/media/atomisp/pci/hmm/hmm_bo.c +++ b/drivers/staging/media/atomisp/pci/hmm/hmm_bo.c @@ -638,6 +638,7 @@ static int alloc_private_pages(struct hmm_buffer_object *bo)  	ret = alloc_pages_bulk_array(gfp, bo->pgnr, bo->pages);  	if (ret != bo->pgnr) {  		free_pages_bulk_array(ret, bo->pages); +		dev_err(atomisp_dev, "alloc_pages_bulk_array() failed\n");  		return -ENOMEM;  	} @@ -651,61 +652,34 @@ static int alloc_private_pages(struct hmm_buffer_object *bo)  	return 0;  } -static void free_user_pages(struct hmm_buffer_object *bo, -			    unsigned int page_nr) +static int alloc_vmalloc_pages(struct hmm_buffer_object *bo, void *vmalloc_addr)  { +	void *vaddr = vmalloc_addr;  	int i; -	for (i = 0; i < page_nr; i++) -		put_page(bo->pages[i]); -} - -/* - * Convert user space virtual address into pages list - */ -static int alloc_user_pages(struct hmm_buffer_object *bo, -			    const void __user *userptr) -{ -	int page_nr; - -	userptr = untagged_addr(userptr); - -	/* Handle frame buffer allocated in user space */ -	mutex_unlock(&bo->mutex); -	page_nr = get_user_pages_fast((unsigned long)userptr, bo->pgnr, 1, bo->pages); -	mutex_lock(&bo->mutex); - -	/* can be written by caller, not forced */ -	if (page_nr != bo->pgnr) { -		dev_err(atomisp_dev, -			"get_user_pages err: bo->pgnr = %d, pgnr actually pinned = %d.\n", -			bo->pgnr, page_nr); -		if (page_nr < 0) -			page_nr = 0; -		goto out_of_mem; +	for (i = 0; i < bo->pgnr; i++) { +		bo->pages[i] = vmalloc_to_page(vaddr); +		if (!bo->pages[i]) { +			dev_err(atomisp_dev, "Error could not get page %d of vmalloc buf\n", i); +			return -ENOMEM; +		} +		vaddr += PAGE_SIZE;  	}  	return 0; - -out_of_mem: - -	free_user_pages(bo, page_nr); - -	return -ENOMEM;  }  /*   * allocate/free physical pages for the bo.   *   * type indicate where are the pages from. currently we have 3 types - * of memory: HMM_BO_PRIVATE, HMM_BO_USER. + * of memory: HMM_BO_PRIVATE, HMM_BO_VMALLOC.   * - * userptr is only valid when type is HMM_BO_USER, it indicates - * the start address from user space task. + * vmalloc_addr is only valid when type is HMM_BO_VMALLOC.   */  int hmm_bo_alloc_pages(struct hmm_buffer_object *bo,  		       enum hmm_bo_type type, -		       const void __user *userptr) +		       void *vmalloc_addr)  {  	int ret = -EINVAL; @@ -720,14 +694,10 @@ int hmm_bo_alloc_pages(struct hmm_buffer_object *bo,  		goto alloc_err;  	} -	/* -	 * TO DO: -	 * add HMM_BO_USER type -	 */  	if (type == HMM_BO_PRIVATE) {  		ret = alloc_private_pages(bo); -	} else if (type == HMM_BO_USER) { -		ret = alloc_user_pages(bo, userptr); +	} else if (type == HMM_BO_VMALLOC) { +		ret = alloc_vmalloc_pages(bo, vmalloc_addr);  	} else {  		dev_err(atomisp_dev, "invalid buffer type.\n");  		ret = -EINVAL; @@ -771,8 +741,8 @@ void hmm_bo_free_pages(struct hmm_buffer_object *bo)  	if (bo->type == HMM_BO_PRIVATE)  		free_private_bo_pages(bo); -	else if (bo->type == HMM_BO_USER) -		free_user_pages(bo, bo->pgnr); +	else if (bo->type == HMM_BO_VMALLOC) +		; /* No-op, nothing to do */  	else  		dev_err(atomisp_dev, "invalid buffer type.\n"); diff --git a/drivers/staging/media/atomisp/pci/ia_css_frame_public.h b/drivers/staging/media/atomisp/pci/ia_css_frame_public.h index 514d933f934d..7ba464abf447 100644 --- a/drivers/staging/media/atomisp/pci/ia_css_frame_public.h +++ b/drivers/staging/media/atomisp/pci/ia_css_frame_public.h @@ -20,6 +20,7 @@   * This file contains structs to describe various frame-formats supported by the ISP.   */ +#include <media/videobuf2-v4l2.h>  #include <type_support.h>  #include "ia_css_err.h"  #include "ia_css_types.h" @@ -146,7 +147,18 @@ enum ia_css_frame_flash_state {   *  This is the main structure used for all input and output images.   */  struct ia_css_frame { -	struct ia_css_frame_info info; /** info struct describing the frame */ +	/* +	 * The videobuf2 core will allocate buffers including room for private +	 * data (the rest of struct ia_css_frame). The vb2_v4l2_buffer must +	 * be the first member for this to work! +	 * Note the atomisp code also uses ia_css_frame-s which are not used +	 * as v4l2-buffers in some places. In this case the vb2 member will +	 * be unused. +	 */ +	struct vb2_v4l2_buffer vb; +	/* List-head for linking into the activeq or buffers_waiting_for_param list */ +	struct list_head queue; +	struct ia_css_frame_info frame_info; /** info struct describing the frame */  	ia_css_ptr   data;	       /** pointer to start of image data */  	unsigned int data_bytes;       /** size of image data in bytes */  	/* LA: move this to ia_css_buffer */ @@ -183,22 +195,16 @@ struct ia_css_frame {  		       info.format */  }; +#define vb_to_frame(vb2) \ +	container_of(to_vb2_v4l2_buffer(vb2), struct ia_css_frame, vb) +  #define DEFAULT_FRAME { \ -	.info			= IA_CSS_BINARY_DEFAULT_FRAME_INFO, \ +	.frame_info		= IA_CSS_BINARY_DEFAULT_FRAME_INFO, \  	.dynamic_queue_id	= SH_CSS_INVALID_QUEUE_ID, \  	.buf_type		= IA_CSS_BUFFER_TYPE_INVALID, \  	.flash_state		= IA_CSS_FRAME_FLASH_STATE_NONE, \  } -/* @brief Fill a frame with zeros - * - * @param	frame		The frame. - * @return	None - * - * Fill a frame with pixel values of zero - */ -void ia_css_frame_zero(struct ia_css_frame *frame); -  /* @brief Allocate a CSS frame structure   *   * @param	frame		The allocated frame. @@ -220,6 +226,17 @@ ia_css_frame_allocate(struct ia_css_frame **frame,  		      unsigned int stride,  		      unsigned int raw_bit_depth); +/* @brief Initialize a CSS frame structure using a frame info structure. + * + * @param	frame	The allocated frame. + * @param[in]	info	The frame info structure. + * @return		The error code. + * + * Initialize a frame using the resolution and format from a frame info struct. + */ +int ia_css_frame_init_from_info(struct ia_css_frame *frame, +				const struct ia_css_frame_info *info); +  /* @brief Allocate a CSS frame structure using a frame info structure.   *   * @param	frame	The allocated frame. @@ -244,69 +261,10 @@ ia_css_frame_allocate_from_info(struct ia_css_frame **frame,  void  ia_css_frame_free(struct ia_css_frame *frame); -/* @brief Allocate a CSS frame structure using a frame info structure. - * - * @param	frame	The allocated frame. - * @param[in]	info	The frame info structure. - * @return		The error code. - * - * Allocate an empty CSS frame with no data buffer using the parameters - * in the frame info. - */ -int -ia_css_frame_create_from_info(struct ia_css_frame **frame, -			      const struct ia_css_frame_info *info); - -/* @brief Set a mapped data buffer to a CSS frame - * - * @param[in]	frame       Valid CSS frame pointer - * @param[in]	mapped_data  Mapped data buffer to be assigned to the CSS frame - * @param[in]	data_size_bytes  Size of the mapped_data in bytes - * @return      The error code. - * - * Sets a mapped data buffer to this frame. This function can be called multiple - * times with different buffers or NULL to reset the data pointer. This API - * would not try free the mapped_data and its the callers responsiblity to - * free the mapped_data buffer. However if ia_css_frame_free() is called and - * the frame had a valid data buffer, it would be freed along with the frame. - */ -int -ia_css_frame_set_data(struct ia_css_frame *frame, -		      const ia_css_ptr   mapped_data, -		      size_t data_size_bytes); - -/* @brief Map an existing frame data pointer to a CSS frame. - * - * @param	frame		Pointer to the frame to be initialized - * @param[in]	info		The frame info. - * @param[in]	data		Pointer to the allocated frame data. - * @param[in]	attribute	Attributes to be passed to mmgr_mmap. - * @param[in]	context		Pointer to the a context to be passed to mmgr_mmap. - * @return			The allocated frame structure. - * - * This function maps a pre-allocated pointer into a CSS frame. This can be - * used when an upper software layer is responsible for allocating the frame - * data and it wants to share that frame pointer with the CSS code. - * This function will fill the CSS frame structure just like - * ia_css_frame_allocate() does, but instead of allocating the memory, it will - * map the pre-allocated memory into the CSS address space. - */ -int -ia_css_frame_map(struct ia_css_frame **frame, -		 const struct ia_css_frame_info *info, -		 const void __user *data, -		 unsigned int pgnr); - -/* @brief Unmap a CSS frame structure. - * - * @param[in]	frame	Pointer to the CSS frame. - * @return	None - * - * This function unmaps the frame data pointer within a CSS frame and - * then frees the CSS frame structure. Use this for frame pointers created - * using ia_css_frame_map(). - */ -void -ia_css_frame_unmap(struct ia_css_frame *frame); +static inline const struct ia_css_frame_info * +ia_css_frame_get_info(const struct ia_css_frame *frame) +{ +	return frame ? &frame->frame_info : NULL; +}  #endif /* __IA_CSS_FRAME_PUBLIC_H */ diff --git a/drivers/staging/media/atomisp/pci/ia_css_pipe.h b/drivers/staging/media/atomisp/pci/ia_css_pipe.h index fb58535bff40..22522968b9e6 100644 --- a/drivers/staging/media/atomisp/pci/ia_css_pipe.h +++ b/drivers/staging/media/atomisp/pci/ia_css_pipe.h @@ -37,7 +37,6 @@ struct ia_css_preview_settings {  	struct ia_css_pipe *copy_pipe;  	struct ia_css_pipe *capture_pipe; -	struct ia_css_pipe *acc_pipe;  };  #define IA_CSS_DEFAULT_PREVIEW_SETTINGS { \ @@ -156,7 +155,7 @@ struct ia_css_pipe {  #define IA_CSS_DEFAULT_PIPE { \  	.config			= DEFAULT_PIPE_CONFIG, \  	.info			= DEFAULT_PIPE_INFO, \ -	.mode			= IA_CSS_PIPE_ID_ACC, /* (pipe_id) */ \ +	.mode			= IA_CSS_PIPE_ID_VIDEO, /* (pipe_id) */ \  	.pipeline		= DEFAULT_PIPELINE, \  	.output_info		= {IA_CSS_BINARY_DEFAULT_FRAME_INFO}, \  	.bds_output_info	= IA_CSS_BINARY_DEFAULT_FRAME_INFO, \ diff --git a/drivers/staging/media/atomisp/pci/ia_css_pipe_public.h b/drivers/staging/media/atomisp/pci/ia_css_pipe_public.h index 7352cbf779fb..8ac1586dce4e 100644 --- a/drivers/staging/media/atomisp/pci/ia_css_pipe_public.h +++ b/drivers/staging/media/atomisp/pci/ia_css_pipe_public.h @@ -45,7 +45,6 @@ enum ia_css_pipe_mode {  	IA_CSS_PIPE_MODE_PREVIEW,	/** Preview pipe */  	IA_CSS_PIPE_MODE_VIDEO,		/** Video pipe */  	IA_CSS_PIPE_MODE_CAPTURE,	/** Still capture pipe */ -	IA_CSS_PIPE_MODE_ACC,		/** Accelerated pipe */  	IA_CSS_PIPE_MODE_COPY,		/** Copy pipe, only used for embedded/image data copying */  	IA_CSS_PIPE_MODE_YUVPP,		/** YUV post processing pipe, used for all use cases with YUV input,  									for SoC sensor and external ISP */ @@ -95,21 +94,11 @@ struct ia_css_pipe_config {  	/** output of YUV scaling */  	struct ia_css_frame_info vf_output_info[IA_CSS_PIPE_MAX_OUTPUT_STAGE];  	/** output of VF YUV scaling */ -	struct ia_css_fw_info *acc_extension; -	/** Pipeline extension accelerator */ -	struct ia_css_fw_info **acc_stages; -	/** Standalone accelerator stages */ -	u32 num_acc_stages; -	/** Number of standalone accelerator stages */  	struct ia_css_capture_config default_capture_config;  	/** Default capture config for initial capture pipe configuration. */  	struct ia_css_resolution dvs_envelope; /** temporary */  	enum ia_css_frame_delay dvs_frame_delay;  	/** indicates the DVS loop delay in frame periods */ -	int acc_num_execs; -	/** For acceleration pipes only: determine how many times the pipe -	     should be run. Setting this to -1 means it will run until -	     stopped. */  	bool enable_dz;  	/** Disabling digital zoom for a pipeline, if this is set to false,  	     then setting a zoom factor will have no effect. @@ -153,7 +142,6 @@ struct ia_css_pipe_config {  	.vf_output_info		= {IA_CSS_BINARY_DEFAULT_FRAME_INFO}, \  	.default_capture_config	= DEFAULT_CAPTURE_CONFIG, \  	.dvs_frame_delay	= IA_CSS_FRAME_DELAY_1, \ -	.acc_num_execs		= -1, \  }  /* Pipe info, this struct describes properties of a pipe after it's stream has @@ -224,9 +212,6 @@ struct ia_css_pipe_info {  		{{0, 0}, 0, 0, 0, 0}, // second_output_info  		{{0, 0}, 0, 0, 0, 0}, // vf_output_info  		{{0, 0}, 0, 0, 0, 0}, // second_vf_output_info -		NULL,   // acc_extension -		NULL,   // acc_stages -		0,      // num_acc_stages  		{  			IA_CSS_CAPTURE_MODE_RAW, // mode  			false, // enable_xnr @@ -234,7 +219,6 @@ struct ia_css_pipe_info {  		},      // default_capture_config  		{0, 0}, // dvs_envelope  		1,      // dvs_frame_delay -		-1,     // acc_num_execs  		true,   // enable_dz  		NULL,   // p_isp_config  	}; @@ -426,59 +410,6 @@ int  ia_css_pipe_dequeue_buffer(struct ia_css_pipe *pipe,  			   struct ia_css_buffer *buffer); -/* @brief  Set the state (Enable or Disable) of the Extension stage in the - *          given pipe. - * @param[in] pipe         Pipe handle. - * @param[in] fw_handle    Extension firmware Handle (ia_css_fw_info.handle) - * @param[in] enable       Enable Flag (1 to enable ; 0 to disable) - * - * @return - * 0			: Success - * -EINVAL		: Invalid Parameters - * -EBUSY	: Inactive QOS Pipe - *					(No active stream with this pipe) - * - * This function will request state change (enable or disable) for the Extension - * stage (firmware handle) in the given pipe. - * - * Note: - *	1. Extension can be enabled/disabled only on QOS Extensions - *	2. Extension can be enabled/disabled only with an active QOS Pipe - *	3. Initial(Default) state of QOS Extensions is Disabled - *	4. State change cannot be guaranteed immediately OR on frame boundary - * - */ -int -ia_css_pipe_set_qos_ext_state(struct ia_css_pipe *pipe, -			      u32 fw_handle, -			      bool  enable); - -/* @brief  Get the state (Enable or Disable) of the Extension stage in the - *          given pipe. - * @param[in]  pipe        Pipe handle. - * @param[in]  fw_handle   Extension firmware Handle (ia_css_fw_info.handle) - * @param[out] *enable     Enable Flag - * - * @return - * 0			: Success - * -EINVAL		: Invalid Parameters - * -EBUSY	: Inactive QOS Pipe - *					(No active stream with this pipe) - * - * This function will query the state of the Extension stage (firmware handle) - * in the given Pipe. - * - * Note: - *	1. Extension state can be queried only on QOS Extensions - *	2. Extension can be enabled/disabled only with an active QOS Pipe - *	3. Initial(Default) state of QOS Extensions is Disabled. - * - */ -int -ia_css_pipe_get_qos_ext_state(struct ia_css_pipe *pipe, -			      u32 fw_handle, -			      bool *enable); -  /* @brief Get selected configuration settings   * @param[in]	pipe	The pipe.   * @param[out]	config	Configuration settings. diff --git a/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.c b/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.c index c7d88552dfde..0091e2a3da52 100644 --- a/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.c +++ b/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.c @@ -28,9 +28,7 @@ int ia_css_bayer_io_config(const struct ia_css_binary      *binary,  	const struct ia_css_frame *in_frame = args->in_frame;  	const struct ia_css_frame **out_frames = (const struct ia_css_frame **)  		&args->out_frame; -	const struct ia_css_frame_info *in_frame_info = (in_frame) ? &in_frame->info : -		&binary->in_frame_info; - +	const struct ia_css_frame_info *in_frame_info = ia_css_frame_get_info(in_frame);  	const unsigned int ddr_bits_per_element = sizeof(short) * 8;  	const unsigned int ddr_elems_per_word = ceil_div(HIVE_ISP_DDR_WORD_BITS,  						ddr_bits_per_element); @@ -80,12 +78,12 @@ int ia_css_bayer_io_config(const struct ia_css_binary      *binary,  				    "ia_css_bayer_io_config() put part enter:\n");  #endif -		ret = ia_css_dma_configure_from_info(&config, &out_frames[0]->info); +		ret = ia_css_dma_configure_from_info(&config, &out_frames[0]->frame_info);  		if (ret)  			return ret;  		to->base_address = out_frames[0]->data; -		to->width = out_frames[0]->info.res.width; -		to->height = out_frames[0]->info.res.height; +		to->width = out_frames[0]->frame_info.res.width; +		to->height = out_frames[0]->frame_info.res.height;  		to->stride = config.stride;  		to->ddr_elems_per_word = ddr_elems_per_word; diff --git a/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io.host.c b/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io.host.c index 7d2ef6e26ee6..32c504a950ce 100644 --- a/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io.host.c +++ b/drivers/staging/media/atomisp/pci/isp/kernels/ipu2_io_ls/yuv444_io_ls/ia_css_yuv444_io.host.c @@ -28,9 +28,7 @@ int ia_css_yuv444_io_config(const struct ia_css_binary      *binary,  	const struct ia_css_frame *in_frame = args->in_frame;  	const struct ia_css_frame **out_frames = (const struct ia_css_frame **)  		&args->out_frame; -	const struct ia_css_frame_info *in_frame_info = (in_frame) ? &in_frame->info : -		&binary->in_frame_info; - +	const struct ia_css_frame_info *in_frame_info = ia_css_frame_get_info(in_frame);  	const unsigned int ddr_bits_per_element = sizeof(short) * 8;  	const unsigned int ddr_elems_per_word = ceil_div(HIVE_ISP_DDR_WORD_BITS,  						ddr_bits_per_element); @@ -81,13 +79,13 @@ int ia_css_yuv444_io_config(const struct ia_css_binary      *binary,  				    "ia_css_yuv444_io_config() put part enter:\n");  #endif -		ret = ia_css_dma_configure_from_info(&config, &out_frames[0]->info); +		ret = ia_css_dma_configure_from_info(&config, &out_frames[0]->frame_info);  		if (ret)  			return ret;  		to->base_address = out_frames[0]->data; -		to->width = out_frames[0]->info.res.width; -		to->height = out_frames[0]->info.res.height; +		to->width = out_frames[0]->frame_info.res.width; +		to->height = out_frames[0]->frame_info.res.height;  		to->stride = config.stride;  		to->ddr_elems_per_word = ddr_elems_per_word; diff --git a/drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.c b/drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.c index 08ed916a7eb8..9288a7a37b37 100644 --- a/drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.c +++ b/drivers/staging/media/atomisp/pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.c @@ -30,7 +30,7 @@ int ia_css_ref_config(struct sh_css_isp_ref_isp_config *to,  	int ret;  	if (from->ref_frames[0]) { -		ret = ia_css_dma_configure_from_info(&to->port_b, &from->ref_frames[0]->info); +		ret = ia_css_dma_configure_from_info(&to->port_b, &from->ref_frames[0]->frame_info);  		if (ret)  			return ret;  		to->width_a_over_b = elems_a / to->port_b.elems; diff --git a/drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.c b/drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.c index 53050c0c49fc..a5fea753ec64 100644 --- a/drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.c +++ b/drivers/staging/media/atomisp/pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.c @@ -79,11 +79,11 @@ int ia_css_tnr_config(struct sh_css_isp_tnr_isp_config *to,  	unsigned int i;  	int ret; -	ret = ia_css_dma_configure_from_info(&to->port_b, &from->tnr_frames[0]->info); +	ret = ia_css_dma_configure_from_info(&to->port_b, &from->tnr_frames[0]->frame_info);  	if (ret)  		return ret;  	to->width_a_over_b = elems_a / to->port_b.elems; -	to->frame_height = from->tnr_frames[0]->info.res.height; +	to->frame_height = from->tnr_frames[0]->frame_info.res.height;  	for (i = 0; i < NUM_VIDEO_TNR_FRAMES; i++) {  		to->tnr_frame_addr[i] = from->tnr_frames[i]->data +  					from->tnr_frames[i]->planes.yuyv.offset; diff --git a/drivers/staging/media/atomisp/pci/runtime/binary/src/binary.c b/drivers/staging/media/atomisp/pci/runtime/binary/src/binary.c index 406ed5fb4c6a..768da86b8c2c 100644 --- a/drivers/staging/media/atomisp/pci/runtime/binary/src/binary.c +++ b/drivers/staging/media/atomisp/pci/runtime/binary/src/binary.c @@ -13,6 +13,8 @@   * more details.   */ +#include <linux/math.h> +  #include <math_support.h>  #include <gdc_device.h>	/* HR_GDC_N */ @@ -128,16 +130,8 @@ ia_css_binary_compute_shading_table_bayer_origin(  {  	int err; -	/* Numerator and denominator of the fixed bayer downscaling factor. -	(numerator >= denominator) */ -	unsigned int bds_num, bds_den; - -	/* Horizontal/Vertical ratio of bayer scaling -	between input area and output area. */ -	unsigned int bs_hor_ratio_in; -	unsigned int bs_hor_ratio_out; -	unsigned int bs_ver_ratio_in; -	unsigned int bs_ver_ratio_out; +	/* Rational fraction of the fixed bayer downscaling factor. */ +	struct u32_fract bds;  	/* Left padding set by InputFormatter. */  	unsigned int left_padding_bqs;			/* in bqs */ @@ -158,19 +152,11 @@ ia_css_binary_compute_shading_table_bayer_origin(  	unsigned int bad_bqs_on_top_before_bs;	/* in bqs */  	unsigned int bad_bqs_on_top_after_bs;	/* in bqs */ -	/* Get the numerator and denominator of bayer downscaling factor. */ -	err = sh_css_bds_factor_get_numerator_denominator -	(required_bds_factor, &bds_num, &bds_den); +	/* Get the rational fraction of bayer downscaling factor. */ +	err = sh_css_bds_factor_get_fract(required_bds_factor, &bds);  	if (err)  		return err; -	/* Set the horizontal/vertical ratio of bayer scaling -	between input area and output area. */ -	bs_hor_ratio_in  = bds_num; -	bs_hor_ratio_out = bds_den; -	bs_ver_ratio_in  = bds_num; -	bs_ver_ratio_out = bds_den; -  	/* Set the left padding set by InputFormatter. (ifmtr.c) */  	if (stream_config->left_padding == -1)  		left_padding_bqs = _ISP_BQS(binary->left_padding); @@ -228,18 +214,18 @@ ia_css_binary_compute_shading_table_bayer_origin(  	located on the shading table during the shading correction. */  	res->sc_bayer_origin_x_bqs_on_shading_table =  		((left_padding_adjusted_bqs + bad_bqs_on_left_before_bs) -		* bs_hor_ratio_out + bs_hor_ratio_in / 2) / bs_hor_ratio_in +		* bds.denominator + bds.numerator / 2) / bds.numerator  		+ bad_bqs_on_left_after_bs; -	/* "+ bs_hor_ratio_in/2": rounding for division by bs_hor_ratio_in */ +	/* "+ bds.numerator / 2": rounding for division by bds.numerator */  	res->sc_bayer_origin_y_bqs_on_shading_table = -		(bad_bqs_on_top_before_bs * bs_ver_ratio_out + bs_ver_ratio_in / 2) / bs_ver_ratio_in +		(bad_bqs_on_top_before_bs * bds.denominator + bds.numerator / 2) / bds.numerator  		+ bad_bqs_on_top_after_bs; -	/* "+ bs_ver_ratio_in/2": rounding for division by bs_ver_ratio_in */ +	/* "+ bds.numerator / 2": rounding for division by bds.numerator */ -	res->bayer_scale_hor_ratio_in  = (uint32_t)bs_hor_ratio_in; -	res->bayer_scale_hor_ratio_out = (uint32_t)bs_hor_ratio_out; -	res->bayer_scale_ver_ratio_in  = (uint32_t)bs_ver_ratio_in; -	res->bayer_scale_ver_ratio_out = (uint32_t)bs_ver_ratio_out; +	res->bayer_scale_hor_ratio_in  = bds.numerator; +	res->bayer_scale_hor_ratio_out = bds.denominator; +	res->bayer_scale_ver_ratio_in  = bds.numerator; +	res->bayer_scale_ver_ratio_out = bds.denominator;  	return err;  } diff --git a/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c b/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c index 3d269bd23207..bb6204cb42c5 100644 --- a/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c +++ b/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c @@ -133,7 +133,6 @@ static const char *const pipe_id_to_str[] = {  	/* [IA_CSS_PIPE_ID_VIDEO]     =*/ "video",  	/* [IA_CSS_PIPE_ID_CAPTURE]   =*/ "capture",  	/* [IA_CSS_PIPE_ID_YUVPP]     =*/ "yuvpp", -	/* [IA_CSS_PIPE_ID_ACC]       =*/ "accelerator"  };  static char dot_id_input_bin[SH_CSS_MAX_BINARY_NAME + 10]; @@ -1301,11 +1300,11 @@ void ia_css_debug_frame_print(const struct ia_css_frame *frame,  	data = (char *)HOST_ADDRESS(frame->data);  	ia_css_debug_dtrace(2, "frame %s (%p):\n", descr, frame);  	ia_css_debug_dtrace(2, "  resolution    = %dx%d\n", -			    frame->info.res.width, frame->info.res.height); +			    frame->frame_info.res.width, frame->frame_info.res.height);  	ia_css_debug_dtrace(2, "  padded width  = %d\n", -			    frame->info.padded_width); -	ia_css_debug_dtrace(2, "  format        = %d\n", frame->info.format); -	switch (frame->info.format) { +			    frame->frame_info.padded_width); +	ia_css_debug_dtrace(2, "  format        = %d\n", frame->frame_info.format); +	switch (frame->frame_info.format) {  	case IA_CSS_FRAME_FORMAT_NV12:  	case IA_CSS_FRAME_FORMAT_NV16:  	case IA_CSS_FRAME_FORMAT_NV21: @@ -2565,11 +2564,11 @@ ia_css_debug_pipe_graph_dump_frame(  	dtrace_dot(  	    "node [shape = box, fixedsize=true, width=2, height=0.7]; \"%p\" [label = \"%s\\n%d(%d) x %d, %dbpp\\n%s\"];",  	    frame, -	    debug_frame_format2str(frame->info.format), -	    frame->info.res.width, -	    frame->info.padded_width, -	    frame->info.res.height, -	    frame->info.raw_bit_depth, +	    debug_frame_format2str(frame->frame_info.format), +	    frame->frame_info.res.width, +	    frame->frame_info.padded_width, +	    frame->frame_info.res.height, +	    frame->frame_info.raw_bit_depth,  	    bufinfo);  	if (in_frame) { @@ -2866,10 +2865,10 @@ ia_css_debug_pipe_graph_dump_sp_raw_copy(  	snprintf(ring_buffer, sizeof(ring_buffer),  		 "node [shape = box, fixedsize=true, width=2, height=0.7]; \"%p\" [label = \"%s\\n%d(%d) x %d\\nRingbuffer\"];",  		 out_frame, -		 debug_frame_format2str(out_frame->info.format), -		 out_frame->info.res.width, -		 out_frame->info.padded_width, -		 out_frame->info.res.height); +		 debug_frame_format2str(out_frame->frame_info.format), +		 out_frame->frame_info.res.width, +		 out_frame->frame_info.padded_width, +		 out_frame->frame_info.res.height);  	dtrace_dot(ring_buffer); @@ -2989,16 +2988,10 @@ ia_css_debug_dump_pipe_config(  		ia_css_debug_dump_frame_info(&config->vf_output_info[i],  					     "vf_output_info");  	} -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "acc_extension: %p\n", -			    config->acc_extension); -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "num_acc_stages: %d\n", -			    config->num_acc_stages);  	ia_css_debug_dump_capture_config(&config->default_capture_config);  	ia_css_debug_dump_resolution(&config->dvs_envelope, "dvs_envelope");  	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "dvs_frame_delay: %d\n",  			    config->dvs_frame_delay); -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "acc_num_execs: %d\n", -			    config->acc_num_execs);  	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "enable_dz: %d\n",  			    config->enable_dz);  	IA_CSS_LEAVE_PRIVATE(""); diff --git a/drivers/staging/media/atomisp/pci/runtime/frame/src/frame.c b/drivers/staging/media/atomisp/pci/runtime/frame/src/frame.c index 5a7058320ee6..83bb42e05421 100644 --- a/drivers/staging/media/atomisp/pci/runtime/frame/src/frame.c +++ b/drivers/staging/media/atomisp/pci/runtime/frame/src/frame.c @@ -88,12 +88,6 @@ ia_css_elems_bytes_from_info(  **	CSS API functions, exposed by ia_css.h  **************************************************************************/ -void ia_css_frame_zero(struct ia_css_frame *frame) -{ -	assert(frame); -	hmm_set(frame->data, 0, frame->data_bytes); -} -  int ia_css_frame_allocate_from_info(struct ia_css_frame **frame,  	const struct ia_css_frame_info *info)  { @@ -143,121 +137,6 @@ int ia_css_frame_allocate(struct ia_css_frame **frame,  	return err;  } -int ia_css_frame_map(struct ia_css_frame **frame, -				 const struct ia_css_frame_info *info, -				 const void __user *data, -				 unsigned int pgnr) -{ -	int err = 0; -	struct ia_css_frame *me; - -	assert(frame); - -	/* Create the frame structure */ -	err = ia_css_frame_create_from_info(&me, info); - -	if (err) -		return err; - -	if (pgnr < ((PAGE_ALIGN(me->data_bytes)) >> PAGE_SHIFT)) { -		dev_err(atomisp_dev, -			"user space memory size is less than the expected size..\n"); -		err = -ENOMEM; -		goto error; -	} else if (pgnr > ((PAGE_ALIGN(me->data_bytes)) >> PAGE_SHIFT)) { -		dev_err(atomisp_dev, -			"user space memory size is large than the expected size..\n"); -		err = -ENOMEM; -		goto error; -	} - -	me->data = hmm_create_from_userdata(me->data_bytes, data); -	if (me->data == mmgr_NULL) -		err = -EINVAL; - -error: -	if (err) { -		kvfree(me); -		me = NULL; -	} - -	*frame = me; - -	return err; -} - -int ia_css_frame_create_from_info(struct ia_css_frame **frame, -	const struct ia_css_frame_info *info) -{ -	int err = 0; -	struct ia_css_frame *me; - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -			    "ia_css_frame_create_from_info() enter:\n"); -	if (!frame || !info) { -		ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -				    "ia_css_frame_create_from_info() leave: invalid arguments\n"); -		return -EINVAL; -	} - -	me = frame_create(info->res.width, -			  info->res.height, -			  info->format, -			  info->padded_width, -			  info->raw_bit_depth, -			  false); -	if (!me) { -		ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -				    "ia_css_frame_create_from_info() leave: frame create failed\n"); -		return -ENOMEM; -	} - -	err = ia_css_frame_init_planes(me); - -	if (err) { -		kvfree(me); -		me = NULL; -	} - -	*frame = me; - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -			    "ia_css_frame_create_from_info() leave:\n"); - -	return err; -} - -int ia_css_frame_set_data(struct ia_css_frame *frame, -				      const ia_css_ptr mapped_data, -				      size_t data_bytes) -{ -	int err = 0; - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -			    "ia_css_frame_set_data() enter:\n"); -	if (!frame) { -		ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -				    "ia_css_frame_set_data() leave: NULL frame\n"); -		return -EINVAL; -	} - -	/* If we are setting a valid data. -	 * Make sure that there is enough -	 * room for the expected frame format -	 */ -	if ((mapped_data != mmgr_NULL) && (frame->data_bytes > data_bytes)) { -		ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -				    "ia_css_frame_set_data() leave: invalid arguments\n"); -		return -EINVAL; -	} - -	frame->data = mapped_data; - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ia_css_frame_set_data() leave:\n"); - -	return err; -} -  void ia_css_frame_free(struct ia_css_frame *frame)  {  	IA_CSS_ENTER_PRIVATE("frame = %p", frame); @@ -286,32 +165,32 @@ int ia_css_frame_init_planes(struct ia_css_frame *frame)  {  	assert(frame); -	switch (frame->info.format) { +	switch (frame->frame_info.format) {  	case IA_CSS_FRAME_FORMAT_MIPI:  		dev_err(atomisp_dev,  			"%s: unexpected use of IA_CSS_FRAME_FORMAT_MIPI\n", __func__);  		return -EINVAL;  	case IA_CSS_FRAME_FORMAT_RAW_PACKED:  		frame_init_raw_single_plane(frame, &frame->planes.raw, -					    frame->info.res.height, -					    frame->info.padded_width, -					    frame->info.raw_bit_depth); +					    frame->frame_info.res.height, +					    frame->frame_info.padded_width, +					    frame->frame_info.raw_bit_depth);  		break;  	case IA_CSS_FRAME_FORMAT_RAW:  		frame_init_single_plane(frame, &frame->planes.raw, -					frame->info.res.height, -					frame->info.padded_width, -					frame->info.raw_bit_depth <= 8 ? 1 : 2); +					frame->frame_info.res.height, +					frame->frame_info.padded_width, +					frame->frame_info.raw_bit_depth <= 8 ? 1 : 2);  		break;  	case IA_CSS_FRAME_FORMAT_RGB565:  		frame_init_single_plane(frame, &frame->planes.rgb, -					frame->info.res.height, -					frame->info.padded_width, 2); +					frame->frame_info.res.height, +					frame->frame_info.padded_width, 2);  		break;  	case IA_CSS_FRAME_FORMAT_RGBA888:  		frame_init_single_plane(frame, &frame->planes.rgb, -					frame->info.res.height, -					frame->info.padded_width * 4, 1); +					frame->frame_info.res.height, +					frame->frame_info.padded_width * 4, 1);  		break;  	case IA_CSS_FRAME_FORMAT_PLANAR_RGB888:  		frame_init_rgb_planes(frame, 1); @@ -324,14 +203,14 @@ int ia_css_frame_init_planes(struct ia_css_frame *frame)  	case IA_CSS_FRAME_FORMAT_CSI_MIPI_YUV420_8:  	case IA_CSS_FRAME_FORMAT_CSI_MIPI_LEGACY_YUV420_8:  		frame_init_single_plane(frame, &frame->planes.yuyv, -					frame->info.res.height, -					frame->info.padded_width * 2, 1); +					frame->frame_info.res.height, +					frame->frame_info.padded_width * 2, 1);  		break;  	case IA_CSS_FRAME_FORMAT_YUV_LINE:  		/* Needs 3 extra lines to allow vf_pp prefetching */  		frame_init_single_plane(frame, &frame->planes.yuyv, -					frame->info.res.height * 3 / 2 + 3, -					frame->info.padded_width, 1); +					frame->frame_info.res.height * 3 / 2 + 3, +					frame->frame_info.padded_width, 1);  		break;  	case IA_CSS_FRAME_FORMAT_NV11:  		frame_init_nv_planes(frame, 4, 1, 1); @@ -380,8 +259,8 @@ int ia_css_frame_init_planes(struct ia_css_frame *frame)  		break;  	case IA_CSS_FRAME_FORMAT_BINARY_8:  		frame_init_single_plane(frame, &frame->planes.binary.data, -					frame->info.res.height, -					frame->info.padded_width, 1); +					frame->frame_info.res.height, +					frame->frame_info.padded_width, 1);  		frame->planes.binary.size = 0;  		break;  	default: @@ -510,8 +389,8 @@ bool ia_css_frame_is_same_type(const struct ia_css_frame *frame_a,  			       const struct ia_css_frame *frame_b)  {  	bool is_equal = false; -	const struct ia_css_frame_info *info_a = &frame_a->info, -						*info_b = &frame_b->info; +	const struct ia_css_frame_info *info_a = &frame_a->frame_info; +	const struct ia_css_frame_info *info_b = &frame_b->frame_info;  	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,  			    "ia_css_frame_is_same_type() enter:\n"); @@ -613,8 +492,8 @@ static void frame_init_nv_planes(struct ia_css_frame *frame,  				 unsigned int vertical_decimation,  				 unsigned int bytes_per_element)  { -	unsigned int y_width = frame->info.padded_width; -	unsigned int y_height = frame->info.res.height; +	unsigned int y_width = frame->frame_info.padded_width; +	unsigned int y_height = frame->frame_info.res.height;  	unsigned int uv_width;  	unsigned int uv_height;  	unsigned int y_bytes; @@ -627,7 +506,7 @@ static void frame_init_nv_planes(struct ia_css_frame *frame,  	uv_width = 2 * (y_width / horizontal_decimation);  	uv_height = y_height / vertical_decimation; -	if (frame->info.format == IA_CSS_FRAME_FORMAT_NV12_TILEY) { +	if (frame->frame_info.format == IA_CSS_FRAME_FORMAT_NV12_TILEY) {  		y_width   = CEIL_MUL(y_width,   NV12_TILEY_TILE_WIDTH);  		uv_width  = CEIL_MUL(uv_width,  NV12_TILEY_TILE_WIDTH);  		y_height  = CEIL_MUL(y_height,  NV12_TILEY_TILE_HEIGHT); @@ -652,8 +531,8 @@ static void frame_init_yuv_planes(struct ia_css_frame *frame,  				  bool swap_uv,  				  unsigned int bytes_per_element)  { -	unsigned int y_width = frame->info.padded_width, -		     y_height = frame->info.res.height, +	unsigned int y_width = frame->frame_info.padded_width, +		     y_height = frame->frame_info.res.height,  		     uv_width = y_width / horizontal_decimation,  		     uv_height = y_height / vertical_decimation,  		     y_stride, y_bytes, uv_bytes, uv_stride; @@ -682,8 +561,8 @@ static void frame_init_yuv_planes(struct ia_css_frame *frame,  static void frame_init_rgb_planes(struct ia_css_frame *frame,  				  unsigned int bytes_per_element)  { -	unsigned int width = frame->info.res.width, -		     height = frame->info.res.height, stride, bytes; +	unsigned int width = frame->frame_info.res.width, +		     height = frame->frame_info.res.height, stride, bytes;  	stride = width * bytes_per_element;  	bytes = stride * height; @@ -698,8 +577,8 @@ static void frame_init_rgb_planes(struct ia_css_frame *frame,  static void frame_init_qplane6_planes(struct ia_css_frame *frame)  { -	unsigned int width = frame->info.padded_width / 2, -		     height = frame->info.res.height / 2, bytes, stride; +	unsigned int width = frame->frame_info.padded_width / 2, +		     height = frame->frame_info.res.height / 2, bytes, stride;  	stride = width * 2;  	bytes = stride * height; @@ -781,11 +660,11 @@ static struct ia_css_frame *frame_create(unsigned int width,  		return NULL;  	memset(me, 0, sizeof(*me)); -	me->info.res.width = width; -	me->info.res.height = height; -	me->info.format = format; -	me->info.padded_width = padded_width; -	me->info.raw_bit_depth = raw_bit_depth; +	me->frame_info.res.width = width; +	me->frame_info.res.height = height; +	me->frame_info.format = format; +	me->frame_info.padded_width = padded_width; +	me->frame_info.raw_bit_depth = raw_bit_depth;  	me->valid = valid;  	me->data_bytes = 0;  	me->data = mmgr_NULL; @@ -847,3 +726,19 @@ void ia_css_resolution_to_sp_resolution(  	to->width  = (uint16_t)from->width;  	to->height = (uint16_t)from->height;  } + +int ia_css_frame_init_from_info(struct ia_css_frame *frame, +				const struct ia_css_frame_info *frame_info) +{ +	frame->frame_info.res.width = frame_info->res.width; +	frame->frame_info.res.height = frame_info->res.height; +	frame->frame_info.format = frame_info->format; +	frame->frame_info.padded_width = frame_info->padded_width; +	frame->frame_info.raw_bit_depth = frame_info->raw_bit_depth; +	frame->valid = true; +	/* To indicate it is not valid frame. */ +	frame->dynamic_queue_id = SH_CSS_INVALID_QUEUE_ID; +	frame->buf_type = IA_CSS_BUFFER_TYPE_INVALID; + +	return ia_css_frame_init_planes(frame); +} diff --git a/drivers/staging/media/atomisp/pci/runtime/pipeline/interface/ia_css_pipeline.h b/drivers/staging/media/atomisp/pci/runtime/pipeline/interface/ia_css_pipeline.h index de2c526a58ae..222c381ff3b9 100644 --- a/drivers/staging/media/atomisp/pci/runtime/pipeline/interface/ia_css_pipeline.h +++ b/drivers/staging/media/atomisp/pci/runtime/pipeline/interface/ia_css_pipeline.h @@ -54,7 +54,6 @@ struct ia_css_pipeline {  	unsigned int inout_port_config;  	int num_execs;  	bool acquire_isp_each_stage; -	u32 pipe_qos_config;  };  #define DEFAULT_PIPELINE { \ @@ -65,7 +64,6 @@ struct ia_css_pipeline {  	.dvs_frame_delay	= IA_CSS_FRAME_DELAY_1, \  	.num_execs		= -1, \  	.acquire_isp_each_stage	= true, \ -	.pipe_qos_config	= QOS_INVALID \  }  /* Stage descriptor used to create a new stage in the pipeline */ diff --git a/drivers/staging/media/atomisp/pci/runtime/pipeline/src/pipeline.c b/drivers/staging/media/atomisp/pci/runtime/pipeline/src/pipeline.c index dfc50247ea8e..e9e187649a65 100644 --- a/drivers/staging/media/atomisp/pci/runtime/pipeline/src/pipeline.c +++ b/drivers/staging/media/atomisp/pci/runtime/pipeline/src/pipeline.c @@ -774,14 +774,6 @@ ia_css_pipeline_configure_inout_port(struct ia_css_pipeline *me,  					    (uint8_t)SH_CSS_PORT_OUTPUT,  					    (uint8_t)SH_CSS_HOST_TYPE, 1);  		break; -	case IA_CSS_PIPE_ID_ACC: -		SH_CSS_PIPE_PORT_CONFIG_SET(me->inout_port_config, -					    (uint8_t)SH_CSS_PORT_INPUT, -					    (uint8_t)SH_CSS_HOST_TYPE, 1); -		SH_CSS_PIPE_PORT_CONFIG_SET(me->inout_port_config, -					    (uint8_t)SH_CSS_PORT_OUTPUT, -					    (uint8_t)SH_CSS_HOST_TYPE, 1); -		break;  	default:  		break;  	} diff --git a/drivers/staging/media/atomisp/pci/sh_css.c b/drivers/staging/media/atomisp/pci/sh_css.c index da96aaffebc1..726cb7aa4ecd 100644 --- a/drivers/staging/media/atomisp/pci/sh_css.c +++ b/drivers/staging/media/atomisp/pci/sh_css.c @@ -209,13 +209,6 @@ ia_css_pipe_check_format(struct ia_css_pipe *pipe,  			 enum ia_css_frame_format format);  /* ISP 2401 */ -static int -ia_css_pipe_load_extension(struct ia_css_pipe *pipe, -			   struct ia_css_fw_info *firmware); - -static void -ia_css_pipe_unload_extension(struct ia_css_pipe *pipe, -			     struct ia_css_fw_info *firmware);  static void  ia_css_reset_defaults(struct sh_css *css); @@ -287,10 +280,6 @@ init_out_frameinfo_defaults(struct ia_css_pipe *pipe,  			    struct ia_css_frame *out_frame, unsigned int idx);  static int -sh_css_pipeline_add_acc_stage(struct ia_css_pipeline *pipeline, -			      const void *acc_fw); - -static int  alloc_continuous_frames(struct ia_css_pipe *pipe, bool init_time);  static void @@ -329,9 +318,6 @@ create_host_capture_pipeline(struct ia_css_pipe *pipe);  static int  create_host_yuvpp_pipeline(struct ia_css_pipe *pipe); -static int -create_host_acc_pipeline(struct ia_css_pipe *pipe); -  static unsigned int  sh_css_get_sw_interrupt_value(unsigned int irq); @@ -362,12 +348,6 @@ static struct sh_css_hmm_buffer_record  *sh_css_hmm_buffer_record_validate(ia_css_ptr ddr_buffer_addr,  				   enum ia_css_buffer_type type); -void -ia_css_get_acc_configs( -    struct ia_css_pipe *pipe, -    struct ia_css_isp_config *config); - -  #ifdef ISP2401  static unsigned int get_crop_lines_for_bayer_order(const struct  	ia_css_stream_config *config); @@ -1649,15 +1629,6 @@ ia_css_enable_isys_event_queue(bool enable)  	return 0;  } -/* For Acceleration API: Flush FW (shared buffer pointer) arguments */ -void -sh_css_flush(struct ia_css_acc_fw *fw) -{ -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "sh_css_flush() enter:\n"); -	if ((fw) && (my_css.flush)) -		my_css.flush(fw); -} -  /*   * Mapping sp threads. Currently, this is done when a stream is created and   * pipelines are ready to be converted to sp pipelines. Be careful if you are @@ -1670,7 +1641,6 @@ map_sp_threads(struct ia_css_stream *stream, bool map)  	struct ia_css_pipe *main_pipe = NULL;  	struct ia_css_pipe *copy_pipe = NULL;  	struct ia_css_pipe *capture_pipe = NULL; -	struct ia_css_pipe *acc_pipe = NULL;  	int err = 0;  	enum ia_css_pipe_id pipe_id; @@ -1691,7 +1661,6 @@ map_sp_threads(struct ia_css_stream *stream, bool map)  	case IA_CSS_PIPE_ID_PREVIEW:  		copy_pipe    = main_pipe->pipe_settings.preview.copy_pipe;  		capture_pipe = main_pipe->pipe_settings.preview.capture_pipe; -		acc_pipe     = main_pipe->pipe_settings.preview.acc_pipe;  		break;  	case IA_CSS_PIPE_ID_VIDEO: @@ -1700,14 +1669,10 @@ map_sp_threads(struct ia_css_stream *stream, bool map)  		break;  	case IA_CSS_PIPE_ID_CAPTURE: -	case IA_CSS_PIPE_ID_ACC:  	default:  		break;  	} -	if (acc_pipe) -		ia_css_pipeline_map(acc_pipe->pipe_num, map); -  	if (capture_pipe)  		ia_css_pipeline_map(capture_pipe->pipe_num, map); @@ -1735,7 +1700,6 @@ static int  create_host_pipeline_structure(struct ia_css_stream *stream)  {  	struct ia_css_pipe *copy_pipe = NULL, *capture_pipe = NULL; -	struct ia_css_pipe *acc_pipe = NULL;  	enum ia_css_pipe_id pipe_id;  	struct ia_css_pipe *main_pipe = NULL;  	int err = 0; @@ -1763,7 +1727,6 @@ create_host_pipeline_structure(struct ia_css_stream *stream)  		copy_pipe_delay = main_pipe->dvs_frame_delay;  		capture_pipe = main_pipe->pipe_settings.preview.capture_pipe;  		capture_pipe_delay = IA_CSS_FRAME_DELAY_0; -		acc_pipe     = main_pipe->pipe_settings.preview.acc_pipe;  		err = ia_css_pipeline_create(&main_pipe->pipeline, main_pipe->mode,  					     main_pipe->pipe_num, main_pipe->dvs_frame_delay);  		break; @@ -1787,11 +1750,6 @@ create_host_pipeline_structure(struct ia_css_stream *stream)  					     main_pipe->pipe_num, main_pipe->dvs_frame_delay);  		break; -	case IA_CSS_PIPE_ID_ACC: -		err = ia_css_pipeline_create(&main_pipe->pipeline, main_pipe->mode, -					     main_pipe->pipe_num, main_pipe->dvs_frame_delay); -		break; -  	default:  		err = -EINVAL;  	} @@ -1808,10 +1766,6 @@ create_host_pipeline_structure(struct ia_css_stream *stream)  					     capture_pipe->pipe_num,  					     capture_pipe_delay); -	if (!(err) && acc_pipe) -		err = ia_css_pipeline_create(&acc_pipe->pipeline, acc_pipe->mode, -					     acc_pipe->pipe_num, main_pipe->dvs_frame_delay); -  	/* DH regular multi pipe - not continuous mode: create the next pipelines too */  	if (!stream->config.continuous) {  		int i; @@ -1837,7 +1791,6 @@ static int  create_host_pipeline(struct ia_css_stream *stream)  {  	struct ia_css_pipe *copy_pipe = NULL, *capture_pipe = NULL; -	struct ia_css_pipe *acc_pipe = NULL;  	enum ia_css_pipe_id pipe_id;  	struct ia_css_pipe *main_pipe = NULL;  	int err = 0; @@ -1881,27 +1834,17 @@ create_host_pipeline(struct ia_css_stream *stream)  		}  	} -#if !defined(ISP2401)  	/* old isys: need to allocate_mipi_frames() even in IA_CSS_PIPE_MODE_COPY */ -	if (pipe_id != IA_CSS_PIPE_ID_ACC) { -		err = allocate_mipi_frames(main_pipe, &stream->info); -		if (err) -			goto ERR; -	} -#elif defined(ISP2401) -	if ((pipe_id != IA_CSS_PIPE_ID_ACC) && -	    (main_pipe->config.mode != IA_CSS_PIPE_MODE_COPY)) { +	if (!IS_ISP2401 || main_pipe->config.mode != IA_CSS_PIPE_MODE_COPY) {  		err = allocate_mipi_frames(main_pipe, &stream->info);  		if (err)  			goto ERR;  	} -#endif  	switch (pipe_id) {  	case IA_CSS_PIPE_ID_PREVIEW:  		copy_pipe    = main_pipe->pipe_settings.preview.copy_pipe;  		capture_pipe = main_pipe->pipe_settings.preview.capture_pipe; -		acc_pipe     = main_pipe->pipe_settings.preview.acc_pipe;  		max_input_width =  		    main_pipe->pipe_settings.preview.preview_binary.info->sp.input.max_width; @@ -1935,12 +1878,6 @@ create_host_pipeline(struct ia_css_stream *stream)  		break; -	case IA_CSS_PIPE_ID_ACC: -		err = create_host_acc_pipeline(main_pipe); -		if (err) -			goto ERR; - -		break;  	default:  		err = -EINVAL;  	} @@ -1960,12 +1897,6 @@ create_host_pipeline(struct ia_css_stream *stream)  			goto ERR;  	} -	if (acc_pipe) { -		err = create_host_acc_pipeline(acc_pipe); -		if (err) -			goto ERR; -	} -  	/* DH regular multi pipe - not continuous mode: create the next pipelines too */  	if (!stream->config.continuous) {  		int i; @@ -1984,9 +1915,6 @@ create_host_pipeline(struct ia_css_stream *stream)  			case IA_CSS_PIPE_ID_YUVPP:  				err = create_host_yuvpp_pipeline(stream->pipes[i]);  				break; -			case IA_CSS_PIPE_ID_ACC: -				err = create_host_acc_pipeline(stream->pipes[i]); -				break;  			default:  				err = -EINVAL;  			} @@ -2037,9 +1965,6 @@ init_pipe_defaults(enum ia_css_pipe_mode mode,  		pipe->mode = IA_CSS_PIPE_ID_VIDEO;  		memcpy(&pipe->pipe_settings.video, &video, sizeof(video));  		break; -	case IA_CSS_PIPE_MODE_ACC: -		pipe->mode = IA_CSS_PIPE_ID_ACC; -		break;  	case IA_CSS_PIPE_MODE_COPY:  		pipe->mode = IA_CSS_PIPE_ID_CAPTURE;  		break; @@ -2156,27 +2081,6 @@ find_pipe_by_num(uint32_t pipe_num)  	return NULL;  } -static void sh_css_pipe_free_acc_binaries( -    struct ia_css_pipe *pipe) -{ -	struct ia_css_pipeline *pipeline; -	struct ia_css_pipeline_stage *stage; - -	if (!pipe) { -		IA_CSS_ERROR("NULL input pointer"); -		return; -	} -	pipeline = &pipe->pipeline; - -	/* loop through the stages and unload them */ -	for (stage = pipeline->stages; stage; stage = stage->next) { -		struct ia_css_fw_info *firmware = (struct ia_css_fw_info *) -						  stage->firmware; -		if (firmware) -			ia_css_pipe_unload_extension(pipe, firmware); -	} -} -  int  ia_css_pipe_destroy(struct ia_css_pipe *pipe)  { @@ -2241,9 +2145,6 @@ ia_css_pipe_destroy(struct ia_css_pipe *pipe)  		ia_css_frame_free_multiple(MAX_NUM_VIDEO_DELAY_FRAMES,  					   pipe->pipe_settings.capture.delay_frames);  		break; -	case IA_CSS_PIPE_MODE_ACC: -		sh_css_pipe_free_acc_binaries(pipe); -		break;  	case IA_CSS_PIPE_MODE_COPY:  		break;  	case IA_CSS_PIPE_MODE_YUVPP: @@ -2261,10 +2162,6 @@ ia_css_pipe_destroy(struct ia_css_pipe *pipe)  	ia_css_pipeline_destroy(&pipe->pipeline);  	pipe_release_pipe_num(ia_css_pipe_get_pipe_num(pipe)); -	/* Temporarily, not every sh_css_pipe has an acc_extension. */ -	if (pipe->config.acc_extension) -		ia_css_pipe_unload_extension(pipe, pipe->config.acc_extension); -  	kfree(pipe);  	IA_CSS_LEAVE("err = %d", err);  	return err; @@ -3060,7 +2957,7 @@ init_vf_frameinfo_defaults(struct ia_css_pipe *pipe,  	assert(vf_frame); -	sh_css_pipe_get_viewfinder_frame_info(pipe, &vf_frame->info, idx); +	sh_css_pipe_get_viewfinder_frame_info(pipe, &vf_frame->frame_info, idx);  	vf_frame->flash_state = IA_CSS_FRAME_FLASH_STATE_NONE;  	ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id);  	ia_css_query_internal_queue_id(IA_CSS_BUFFER_TYPE_VF_OUTPUT_FRAME + idx, thread_id, &queue_id); @@ -3229,31 +3126,31 @@ init_in_frameinfo_memory_defaults(struct ia_css_pipe *pipe,  	assert(frame);  	in_frame = frame; -	in_frame->info.format = format; +	in_frame->frame_info.format = format;  #ifdef ISP2401  	if (format == IA_CSS_FRAME_FORMAT_RAW) -		in_frame->info.format = (pipe->stream->config.pack_raw_pixels) ? +		in_frame->frame_info.format = (pipe->stream->config.pack_raw_pixels) ?  		IA_CSS_FRAME_FORMAT_RAW_PACKED : IA_CSS_FRAME_FORMAT_RAW;  #endif -	in_frame->info.res.width = pipe->stream->config.input_config.input_res.width; -	in_frame->info.res.height = pipe->stream->config.input_config.input_res.height; -	in_frame->info.raw_bit_depth = -	ia_css_pipe_util_pipe_input_format_bpp(pipe); -	ia_css_frame_info_set_width(&in_frame->info, pipe->stream->config.input_config.input_res.width, 0); +	in_frame->frame_info.res.width = pipe->stream->config.input_config.input_res.width; +	in_frame->frame_info.res.height = pipe->stream->config.input_config.input_res.height; +	in_frame->frame_info.raw_bit_depth = ia_css_pipe_util_pipe_input_format_bpp(pipe); +	ia_css_frame_info_set_width(&in_frame->frame_info, +				    pipe->stream->config.input_config.input_res.width, 0);  	in_frame->flash_state = IA_CSS_FRAME_FLASH_STATE_NONE;  	ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id);  	ia_css_query_internal_queue_id(IA_CSS_BUFFER_TYPE_INPUT_FRAME, thread_id, &queue_id);  	in_frame->dynamic_queue_id = queue_id;  	in_frame->buf_type = IA_CSS_BUFFER_TYPE_INPUT_FRAME;  #ifdef ISP2401 -	ia_css_get_crop_offsets(pipe, &in_frame->info); +	ia_css_get_crop_offsets(pipe, &in_frame->frame_info);  #endif  	err = ia_css_frame_init_planes(in_frame); -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, -			    "init_in_frameinfo_memory_defaults() bayer_order = %d:\n", in_frame->info.raw_bayer_order); +	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "%s() bayer_order = %d\n", +			    __func__, in_frame->frame_info.raw_bayer_order);  	return err;  } @@ -3268,7 +3165,7 @@ init_out_frameinfo_defaults(struct ia_css_pipe *pipe,  	assert(out_frame); -	sh_css_pipe_get_output_frame_info(pipe, &out_frame->info, idx); +	sh_css_pipe_get_output_frame_info(pipe, &out_frame->frame_info, idx);  	out_frame->flash_state = IA_CSS_FRAME_FLASH_STATE_NONE;  	ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id);  	ia_css_query_internal_queue_id(IA_CSS_BUFFER_TYPE_OUTPUT_FRAME + idx, thread_id, &queue_id); @@ -3433,31 +3330,6 @@ static int create_host_video_pipeline(struct ia_css_pipe *pipe)  		}  	} -	/* Append Extension on Video out, if enabled */ -	if (!need_vf_pp && video_stage && pipe->config.acc_extension && -	    (pipe->config.acc_extension->info.isp.type == IA_CSS_ACC_OUTPUT)) { -		struct ia_css_frame *out = NULL; -		struct ia_css_frame *in = NULL; - -		if ((pipe->config.acc_extension->info.isp.sp.enable.output) && -		    (pipe->config.acc_extension->info.isp.sp.enable.in_frame) && -		    (pipe->config.acc_extension->info.isp.sp.enable.out_frame)) { -			/* In/Out Frame mapping to support output frame extension.*/ -			out = video_stage->args.out_frame[0]; -			err = ia_css_frame_allocate_from_info(&in, &pipe->output_info[0]); -			if (err) -				goto ERR; -			video_stage->args.out_frame[0] = in; -		} - -		err = add_firmwares(me, video_binary, pipe->output_stage, -				    last_output_firmware(pipe->output_stage), -				    IA_CSS_BINARY_MODE_VIDEO, -				    in, out, NULL, &video_stage, NULL); -		if (err) -			goto ERR; -	} -  	if (need_yuv_pp && video_stage) {  		struct ia_css_frame *tmp_in_frame = video_stage->args.out_frame[0];  		struct ia_css_frame *tmp_out_frame = NULL; @@ -3489,45 +3361,6 @@ ERR:  	return err;  } -static int -create_host_acc_pipeline(struct ia_css_pipe *pipe) -{ -	int err = 0; -	const struct ia_css_fw_info *fw; -	unsigned int i; - -	IA_CSS_ENTER_PRIVATE("pipe = %p", pipe); -	if ((!pipe) || (!pipe->stream)) { -		IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL); -		return -EINVAL; -	} - -	pipe->pipeline.num_execs = pipe->config.acc_num_execs; -	/* Reset pipe_qos_config to default disable all QOS extension stages */ -	if (pipe->config.acc_extension) -		pipe->pipeline.pipe_qos_config = 0; - -	for (fw = pipe->vf_stage; fw; fw = fw->next) { -		err = sh_css_pipeline_add_acc_stage(&pipe->pipeline, fw); -		if (err) -			goto ERR; -	} - -	for (i = 0; i < pipe->config.num_acc_stages; i++) { -		struct ia_css_fw_info *fw = pipe->config.acc_stages[i]; - -		err = sh_css_pipeline_add_acc_stage(&pipe->pipeline, fw); -		if (err) -			goto ERR; -	} - -	ia_css_pipeline_finalize_stages(&pipe->pipeline, pipe->stream->config.continuous); - -ERR: -	IA_CSS_LEAVE_ERR_PRIVATE(err); -	return err; -} -  /* Create stages for preview */  static int  create_host_preview_pipeline(struct ia_css_pipe *pipe) @@ -3690,7 +3523,6 @@ preview_start(struct ia_css_pipe *pipe)  {  	int err = 0;  	struct ia_css_pipe *copy_pipe, *capture_pipe; -	struct ia_css_pipe *acc_pipe;  	enum sh_css_pipe_config_override copy_ovrd;  	enum ia_css_input_mode preview_pipe_input_mode;  	unsigned int thread_id; @@ -3705,7 +3537,6 @@ preview_start(struct ia_css_pipe *pipe)  	copy_pipe    = pipe->pipe_settings.preview.copy_pipe;  	capture_pipe = pipe->pipe_settings.preview.capture_pipe; -	acc_pipe     = pipe->pipe_settings.preview.acc_pipe;  	sh_css_metrics_start_frame(); @@ -3764,22 +3595,6 @@ preview_start(struct ia_css_pipe *pipe)  					(enum mipi_port_id)0);  	} -	if (acc_pipe) { -		sh_css_sp_init_pipeline(&acc_pipe->pipeline, -					IA_CSS_PIPE_ID_ACC, -					(uint8_t)ia_css_pipe_get_pipe_num(acc_pipe), -					false, -					pipe->stream->config.pixels_per_clock == 2, -					false, /* continuous */ -					false, /* offline */ -					pipe->required_bds_factor, -					0, -					IA_CSS_INPUT_MODE_MEMORY, -					NULL, -					NULL, -					(enum mipi_port_id)0); -	} -  	start_pipe(pipe, copy_ovrd, preview_pipe_input_mode);  	IA_CSS_LEAVE_ERR_PRIVATE(err); @@ -3850,9 +3665,7 @@ ia_css_pipe_enqueue_buffer(struct ia_css_pipe *pipe,  	pipeline = &pipe->pipeline; -	assert(pipeline || -	       pipe_id == IA_CSS_PIPE_ID_COPY || -	       pipe_id == IA_CSS_PIPE_ID_ACC); +	assert(pipeline || pipe_id == IA_CSS_PIPE_ID_COPY);  	assert(sizeof(NULL) <= sizeof(ddr_buffer.kernel_ptr));  	ddr_buffer.kernel_ptr = HOST_ADDRESS(NULL); @@ -4146,7 +3959,7 @@ ia_css_pipe_dequeue_buffer(struct ia_css_pipe *pipe,  				if (!frame->valid)  					pipe->num_invalid_frames--; -				if (frame->info.format == IA_CSS_FRAME_FORMAT_BINARY_8) { +				if (frame->frame_info.format == IA_CSS_FRAME_FORMAT_BINARY_8) {  #ifdef ISP2401  					frame->planes.binary.size = frame->data_bytes;  #else @@ -4442,16 +4255,6 @@ ia_css_dequeue_isys_event(struct ia_css_event *event)  	return err;  } -static void -acc_start(struct ia_css_pipe *pipe) -{ -	assert(pipe); -	assert(pipe->stream); - -	start_pipe(pipe, SH_CSS_PIPE_CONFIG_OVRD_NO_OVRD, -		   pipe->stream->config.mode); -} -  static int  sh_css_pipe_start(struct ia_css_stream *stream)  { @@ -4496,9 +4299,6 @@ sh_css_pipe_start(struct ia_css_stream *stream)  	case IA_CSS_PIPE_ID_YUVPP:  		err = yuvpp_start(pipe);  		break; -	case IA_CSS_PIPE_ID_ACC: -		acc_start(pipe); -		break;  	default:  		err = -EINVAL;  	} @@ -4524,10 +4324,6 @@ sh_css_pipe_start(struct ia_css_stream *stream)  				stream->pipes[i]->stop_requested = false;  				err = yuvpp_start(stream->pipes[i]);  				break; -			case IA_CSS_PIPE_ID_ACC: -				stream->pipes[i]->stop_requested = false; -				acc_start(stream->pipes[i]); -				break;  			default:  				err = -EINVAL;  			} @@ -4620,22 +4416,6 @@ sh_css_pipe_start(struct ia_css_stream *stream)  		    (uint8_t)thread_id, 0,  0);  	} -	/* in case of PREVIEW mode, check whether QOS acc_pipe is available, then start the qos pipe */ -	if (pipe_id == IA_CSS_PIPE_ID_PREVIEW) { -		struct ia_css_pipe *acc_pipe = NULL; - -		acc_pipe = pipe->pipe_settings.preview.acc_pipe; - -		if (acc_pipe) { -			ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(acc_pipe), -							 &thread_id); -			/* by the time we reach here q is initialized and handle is available.*/ -			ia_css_bufq_enqueue_psys_event( -			    IA_CSS_PSYS_SW_EVENT_START_STREAM, -			    (uint8_t)thread_id, 0, 0); -		} -	} -  	stream->started = true;  	IA_CSS_LEAVE_ERR_PRIVATE(err); @@ -6861,8 +6641,6 @@ sh_css_pipe_load_binaries(struct ia_css_pipe *pipe)  	case IA_CSS_PIPE_ID_YUVPP:  		err = load_yuvpp_binaries(pipe);  		break; -	case IA_CSS_PIPE_ID_ACC: -		break;  	default:  		err = -EINVAL;  		break; @@ -7102,7 +6880,7 @@ create_host_yuvpp_pipeline(struct ia_css_pipe *pipe)  			/* we use output port 1 as internal output port */  			tmp_in_frame = yuv_scaler_stage->args.out_frame[1];  			if (pipe->pipe_settings.yuvpp.is_output_stage[i]) { -				if (tmp_vf_frame && (tmp_vf_frame->info.res.width != 0)) { +				if (tmp_vf_frame && (tmp_vf_frame->frame_info.res.width != 0)) {  					in_frame = yuv_scaler_stage->args.out_vf_frame;  					err = add_vf_pp_stage(pipe, in_frame,  							      tmp_vf_frame, @@ -7118,7 +6896,7 @@ create_host_yuvpp_pipeline(struct ia_css_pipe *pipe)  			}  		}  	} else if (copy_stage) { -		if (vf_frame[0] && vf_frame[0]->info.res.width != 0) { +		if (vf_frame[0] && vf_frame[0]->frame_info.res.width != 0) {  			in_frame = copy_stage->args.out_vf_frame;  			err = add_vf_pp_stage(pipe, in_frame, vf_frame[0],  					      &vf_pp_binary[0], &vf_pp_stage); @@ -7158,10 +6936,10 @@ create_host_copy_pipeline(struct ia_css_pipe *pipe,  	if (copy_on_sp(pipe) &&  	    pipe->stream->config.input_config.format == ATOMISP_INPUT_FORMAT_BINARY_8) { -		ia_css_frame_info_init(&out_frame->info, JPEG_BYTES, 1, +		ia_css_frame_info_init(&out_frame->frame_info, JPEG_BYTES, 1,  				       IA_CSS_FRAME_FORMAT_BINARY_8, 0); -	} else if (out_frame->info.format == IA_CSS_FRAME_FORMAT_RAW) { -		out_frame->info.raw_bit_depth = +	} else if (out_frame->frame_info.format == IA_CSS_FRAME_FORMAT_RAW) { +		out_frame->frame_info.raw_bit_depth =  		ia_css_pipe_util_pipe_input_format_bpp(pipe);  	} @@ -7200,7 +6978,7 @@ create_host_isyscopy_capture_pipeline(struct ia_css_pipe *pipe)  	ia_css_pipeline_clean(me);  	/* Construct out_frame info */ -	err = sh_css_pipe_get_output_frame_info(pipe, &out_frame->info, 0); +	err = sh_css_pipe_get_output_frame_info(pipe, &out_frame->frame_info, 0);  	if (err)  		return err;  	out_frame->flash_state = IA_CSS_FRAME_FLASH_STATE_NONE; @@ -7755,154 +7533,6 @@ ia_css_stream_end_input_frame(const struct ia_css_stream *stream)  	ia_css_inputfifo_end_frame(stream->config.channel_id);  } -static void -append_firmware(struct ia_css_fw_info **l, struct ia_css_fw_info *firmware) -{ -	IA_CSS_ENTER_PRIVATE("l = %p, firmware = %p", l, firmware); -	if (!l) { -		IA_CSS_ERROR("NULL fw_info"); -		IA_CSS_LEAVE_PRIVATE(""); -		return; -	} -	while (*l) -		l = &(*l)->next; -	*l = firmware; -	/* when multiple acc extensions are loaded, 'next' can be not NULL */ -	/*firmware->next = NULL;*/ -	IA_CSS_LEAVE_PRIVATE(""); -} - -static void -remove_firmware(struct ia_css_fw_info **l, struct ia_css_fw_info *firmware) -{ -	assert(*l); -	assert(firmware); -	(void)l; -	(void)firmware; -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "remove_firmware() enter:\n"); - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, "remove_firmware() leave:\n"); -	return; /* removing single and multiple firmware is handled in acc_unload_extension() */ -} - -static int upload_isp_code(struct ia_css_fw_info *firmware) -{ -	ia_css_ptr binary; - -	if (!firmware) { -		IA_CSS_ERROR("NULL input parameter"); -		return -EINVAL; -	} -	binary = firmware->info.isp.xmem_addr; - -	if (!binary) { -		unsigned int size = firmware->blob.size; -		const unsigned char *blob; -		const unsigned char *binary_name; - -		binary_name = -		    (const unsigned char *)(IA_CSS_EXT_ISP_PROG_NAME( -						firmware)); -		blob = binary_name + -			strlen((const char *)binary_name) + -			1; -		binary = sh_css_load_blob(blob, size); -		firmware->info.isp.xmem_addr = binary; -	} - -	if (!binary) -		return -ENOMEM; -	return 0; -} - -static int -acc_load_extension(struct ia_css_fw_info *firmware) -{ -	int err; -	struct ia_css_fw_info *hd = firmware; - -	while (hd) { -		err = upload_isp_code(hd); -		if (err) -			return err; -		hd = hd->next; -	} - -	if (!firmware) -		return -EINVAL; -	firmware->loaded = true; -	return 0; -} - -static void -acc_unload_extension(struct ia_css_fw_info *firmware) -{ -	struct ia_css_fw_info *hd = firmware; -	struct ia_css_fw_info *hdn = NULL; - -	if (!firmware) /* should not happen */ -		return; -	/* unload and remove multiple firmwares */ -	while (hd) { -		hdn = (hd->next) ? &(*hd->next) : NULL; -		if (hd->info.isp.xmem_addr) { -			hmm_free(hd->info.isp.xmem_addr); -			hd->info.isp.xmem_addr = mmgr_NULL; -		} -		hd->isp_code = NULL; -		hd->next = NULL; -		hd = hdn; -	} - -	firmware->loaded = false; -} - -/* Load firmware for extension */ -static int -ia_css_pipe_load_extension(struct ia_css_pipe *pipe, -			   struct ia_css_fw_info *firmware) -{ -	int err = 0; - -	IA_CSS_ENTER_PRIVATE("fw = %p pipe = %p", firmware, pipe); - -	if ((!firmware) || (!pipe)) { -		IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL); -		return -EINVAL; -	} - -	if (firmware->info.isp.type == IA_CSS_ACC_OUTPUT) -		append_firmware(&pipe->output_stage, firmware); -	else if (firmware->info.isp.type == IA_CSS_ACC_VIEWFINDER) -		append_firmware(&pipe->vf_stage, firmware); -	err = acc_load_extension(firmware); - -	IA_CSS_LEAVE_ERR_PRIVATE(err); -	return err; -} - -/* Unload firmware for extension */ -static void -ia_css_pipe_unload_extension(struct ia_css_pipe *pipe, -			     struct ia_css_fw_info *firmware) -{ -	IA_CSS_ENTER_PRIVATE("fw = %p pipe = %p", firmware, pipe); - -	if ((!firmware) || (!pipe)) { -		IA_CSS_ERROR("NULL input parameters"); -		IA_CSS_LEAVE_PRIVATE(""); -		return; -	} - -	if (firmware->info.isp.type == IA_CSS_ACC_OUTPUT) -		remove_firmware(&pipe->output_stage, firmware); -	else if (firmware->info.isp.type == IA_CSS_ACC_VIEWFINDER) -		remove_firmware(&pipe->vf_stage, firmware); -	acc_unload_extension(firmware); - -	IA_CSS_LEAVE_PRIVATE(""); -} -  bool  ia_css_pipeline_uses_params(struct ia_css_pipeline *me)  { @@ -7924,35 +7554,6 @@ ia_css_pipeline_uses_params(struct ia_css_pipeline *me)  	return false;  } -static int -sh_css_pipeline_add_acc_stage(struct ia_css_pipeline *pipeline, -			      const void *acc_fw) -{ -	struct ia_css_fw_info *fw = (struct ia_css_fw_info *)acc_fw; -	/* In QoS case, load_extension already called, so skipping */ -	int	err = 0; - -	if (!fw->loaded) -		err = acc_load_extension(fw); - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -			    "sh_css_pipeline_add_acc_stage() enter: pipeline=%p, acc_fw=%p\n", -			    pipeline, acc_fw); - -	if (!err) { -		struct ia_css_pipeline_stage_desc stage_desc; - -		ia_css_pipe_get_acc_stage_desc(&stage_desc, NULL, fw); -		err = ia_css_pipeline_create_and_add_stage(pipeline, -							   &stage_desc, -							   NULL); -	} - -	ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, -			    "sh_css_pipeline_add_acc_stage() leave: return_err=%d\n", err); -	return err; -} -  /*   * @brief Tag a specific frame in continuous capture.   * Refer to "sh_css_internal.h" for details. @@ -8177,26 +7778,6 @@ void ia_css_stream_config_defaults(struct ia_css_stream_config *stream_config)  	stream_config->source.port.rxcount = 0x04040404;  } -static int -ia_css_acc_pipe_create(struct ia_css_pipe *pipe) -{ -	int err = 0; - -	if (!pipe) { -		IA_CSS_ERROR("NULL input parameter"); -		return -EINVAL; -	} - -	/* There is not meaning for num_execs = 0 semantically. Run at least once. */ -	if (pipe->config.acc_num_execs == 0) -		pipe->config.acc_num_execs = 1; - -	if (pipe->config.acc_extension) -		err = ia_css_pipe_load_extension(pipe, pipe->config.acc_extension); - -	return err; -} -  int ia_css_pipe_create(const struct ia_css_pipe_config *config,  		       struct ia_css_pipe **pipe)  { @@ -8257,23 +7838,6 @@ ia_css_pipe_create_extra(const struct ia_css_pipe_config *config,  	else  		ia_css_pipe_extra_config_defaults(&internal_pipe->extra_config); -	if (config->mode == IA_CSS_PIPE_MODE_ACC) { -		/* -		 * Temporary hack to migrate acceleration to CSS 2.0. -		 * In the future the code for all pipe types should be -		 * unified. -		 */ -		*pipe = internal_pipe; -		if (!internal_pipe->config.acc_extension && -		    internal_pipe->config.num_acc_stages == -		    0) { /* if no acc binary and no standalone stage */ -			*pipe = NULL; -			IA_CSS_LEAVE_ERR_PRIVATE(0); -			return 0; -		} -		return ia_css_acc_pipe_create(internal_pipe); -	} -  	/*  	 * Use config value when dvs_frame_delay setting equal to 2,  	 * otherwise always 1 by default @@ -8368,15 +7932,6 @@ ia_css_pipe_create_extra(const struct ia_css_pipe_config *config,  			}  		}  	} -	if (internal_pipe->config.acc_extension) { -		err = ia_css_pipe_load_extension(internal_pipe, -						 internal_pipe->config.acc_extension); -		if (err) { -			IA_CSS_LEAVE_ERR_PRIVATE(err); -			kvfree(internal_pipe); -			return err; -		} -	}  	/* set all info to zeroes first */  	memset(&internal_pipe->info, 0, sizeof(internal_pipe->info)); @@ -8525,57 +8080,6 @@ find_pipe(struct ia_css_pipe *pipes[], unsigned int num_pipes,  }  static int -ia_css_acc_stream_create(struct ia_css_stream *stream) -{ -	int i; -	int err = 0; - -	IA_CSS_ENTER_PRIVATE("stream = %p", stream); - -	if (!stream) { -		IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL); -		return -EINVAL; -	} - -	for (i = 0;  i < stream->num_pipes; i++) { -		struct ia_css_pipe *pipe = stream->pipes[i]; - -		if (!pipe) { -			IA_CSS_LEAVE_ERR_PRIVATE(-EINVAL); -			return -EINVAL; -		} - -		pipe->stream = stream; -	} - -	/* Map SP threads before doing anything. */ -	err = map_sp_threads(stream, true); -	if (err) { -		IA_CSS_LEAVE_ERR_PRIVATE(err); -		return err; -	} - -	for (i = 0;  i < stream->num_pipes; i++) { -		struct ia_css_pipe *pipe = stream->pipes[i]; - -		assert(pipe); -		ia_css_pipe_map_queue(pipe, true); -	} - -	err = create_host_pipeline_structure(stream); -	if (err) { -		IA_CSS_LEAVE_ERR_PRIVATE(err); -		return err; -	} - -	stream->started = false; - -	IA_CSS_LEAVE_ERR_PRIVATE(0); - -	return 0; -} - -static int  metadata_info_init(const struct ia_css_metadata_config *mdc,  		   struct ia_css_metadata_info *md)  { @@ -8807,11 +8311,6 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,  		goto ERR;  	IA_CSS_LOG("isp_params_configs: %p", curr_stream->isp_params_configs); -	if (num_pipes == 1 && pipes[0]->config.mode == IA_CSS_PIPE_MODE_ACC) { -		*stream = curr_stream; -		err = ia_css_acc_stream_create(curr_stream); -		goto ERR; -	}  	/* sensor binning */  	if (!spcopyonly) {  		sensor_binning_changed = @@ -8832,7 +8331,6 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,  		/* Search for the preview pipe and create the copy pipe */  		struct ia_css_pipe *preview_pipe;  		struct ia_css_pipe *video_pipe; -		struct ia_css_pipe *acc_pipe;  		struct ia_css_pipe *capture_pipe = NULL;  		struct ia_css_pipe *copy_pipe = NULL; @@ -8847,11 +8345,7 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,  					 IA_CSS_PIPE_MODE_PREVIEW, false);  		video_pipe = find_pipe(pipes, num_pipes,  				       IA_CSS_PIPE_MODE_VIDEO, false); -		acc_pipe = find_pipe(pipes, num_pipes, IA_CSS_PIPE_MODE_ACC, -				     false); -		if (acc_pipe && num_pipes == 2 && curr_stream->cont_capt) -			curr_stream->cont_capt = -			    false; /* preview + QoS case will not need cont_capt switch */ +  		if (curr_stream->cont_capt) {  			capture_pipe = find_pipe(pipes, num_pipes,  						 IA_CSS_PIPE_MODE_CAPTURE, @@ -8888,9 +8382,6 @@ ia_css_stream_create(const struct ia_css_stream_config *stream_config,  		}  		if (video_pipe && curr_stream->cont_capt)  			video_pipe->pipe_settings.video.capture_pipe = capture_pipe; - -		if (preview_pipe && acc_pipe) -			preview_pipe->pipe_settings.preview.acc_pipe = acc_pipe;  	}  	for (i = 0; i < num_pipes; i++) {  		curr_pipe = pipes[i]; @@ -9738,13 +9229,6 @@ void ia_css_pipe_map_queue(struct ia_css_pipe *pipe, bool map)  		if (!pipe->stream->config.continuous)  			ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_OUTPUT_FRAME, map);  		ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_METADATA, map); -	} else if (pipe->mode == IA_CSS_PIPE_ID_ACC) { -		if (need_input_queue) -			ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_INPUT_FRAME, map); -		ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_OUTPUT_FRAME, map); -		ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_PARAMETER_SET, map); -		ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_PER_FRAME_PARAMETER_SET, map); -		ia_css_queue_map(thread_id, IA_CSS_BUFFER_TYPE_METADATA, map);  	} else if (pipe->mode == IA_CSS_PIPE_ID_YUVPP) {  		unsigned int idx; @@ -9795,92 +9279,6 @@ ia_css_unlock_raw_frame(struct ia_css_stream *stream, uint32_t exp_id)  	return ret;  } -/* - * @brief	Set the state (Enable or Disable) of the Extension stage in the - *		given pipe. - */ -int -ia_css_pipe_set_qos_ext_state(struct ia_css_pipe *pipe, uint32_t fw_handle, -			      bool enable) -{ -	unsigned int thread_id; -	struct ia_css_pipeline_stage *stage; -	int err = 0; - -	IA_CSS_ENTER(""); - -	/* Parameter Check */ -	if (!pipe || !pipe->stream) { -		IA_CSS_ERROR("Invalid Pipe."); -		err = -EINVAL; -	} else if (!(pipe->config.acc_extension)) { -		IA_CSS_ERROR("Invalid Pipe(No Extension Firmware)"); -		err = -EINVAL; -	} else if (!sh_css_sp_is_running()) { -		IA_CSS_ERROR("Leaving: queue unavailable."); -		err = -EBUSY; -	} else { -		/* Query the threadid and stage_num for the Extension firmware*/ -		ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id); -		err = ia_css_pipeline_get_stage_from_fw(&pipe->pipeline, fw_handle, &stage); -		if (!err) { -			/* Set the Extension State;. TODO: Add check for stage firmware.type (QOS)*/ -			err = ia_css_bufq_enqueue_psys_event( -			    (uint8_t)IA_CSS_PSYS_SW_EVENT_STAGE_ENABLE_DISABLE, -			    (uint8_t)thread_id, -			    (uint8_t)stage->stage_num, -			    enable ? 1 : 0); -			if (!err) { -				if (enable) -					SH_CSS_QOS_STAGE_ENABLE(&sh_css_sp_group.pipe[thread_id], stage->stage_num); -				else -					SH_CSS_QOS_STAGE_DISABLE(&sh_css_sp_group.pipe[thread_id], stage->stage_num); -			} -		} -	} -	IA_CSS_LEAVE("err:%d handle:%u enable:%d", err, fw_handle, enable); -	return err; -} - -/* - * @brief	Get the state (Enable or Disable) of the Extension stage in the - * given pipe. - */ -int -ia_css_pipe_get_qos_ext_state(struct ia_css_pipe *pipe, uint32_t fw_handle, -			      bool *enable) -{ -	struct ia_css_pipeline_stage *stage; -	unsigned int thread_id; -	int err = 0; - -	IA_CSS_ENTER(""); - -	/* Parameter Check */ -	if (!pipe || !pipe->stream) { -		IA_CSS_ERROR("Invalid Pipe."); -		err = -EINVAL; -	} else if (!(pipe->config.acc_extension)) { -		IA_CSS_ERROR("Invalid Pipe (No Extension Firmware)."); -		err = -EINVAL; -	} else if (!sh_css_sp_is_running()) { -		IA_CSS_ERROR("Leaving: queue unavailable."); -		err = -EBUSY; -	} else { -		/* Query the threadid and stage_num corresponding to the Extension firmware*/ -		ia_css_pipeline_get_sp_thread_id(ia_css_pipe_get_pipe_num(pipe), &thread_id); -		err = ia_css_pipeline_get_stage_from_fw(&pipe->pipeline, fw_handle, &stage); - -		if (!err) { -			/* Get the Extension State */ -			*enable = (SH_CSS_QOS_STAGE_IS_ENABLED(&sh_css_sp_group.pipe[thread_id], -								stage->stage_num)) ? true : false; -		} -	} -	IA_CSS_LEAVE("err:%d handle:%u enable:%d", err, fw_handle, *enable); -	return err; -} -  static void  sh_css_hmm_buffer_record_init(void)  { diff --git a/drivers/staging/media/atomisp/pci/sh_css_internal.h b/drivers/staging/media/atomisp/pci/sh_css_internal.h index 435b3cedd1c3..d98f1323441e 100644 --- a/drivers/staging/media/atomisp/pci/sh_css_internal.h +++ b/drivers/staging/media/atomisp/pci/sh_css_internal.h @@ -488,16 +488,6 @@ ia_css_metadata_free_multiple(unsigned int num_bufs,  /* Macro for handling pipe_qos_config */  #define QOS_INVALID                  (~0U) -#define QOS_ALL_STAGES_DISABLED      (0U) -#define QOS_STAGE_MASK(num)          (0x00000001 << num) -#define SH_CSS_IS_QOS_PIPE(pipe)               ((pipe)->pipe_qos_config != QOS_INVALID) -#define SH_CSS_QOS_STAGE_ENABLE(pipe, num)     ((pipe)->pipe_qos_config |= QOS_STAGE_MASK(num)) -#define SH_CSS_QOS_STAGE_DISABLE(pipe, num)    ((pipe)->pipe_qos_config &= ~QOS_STAGE_MASK(num)) -#define SH_CSS_QOS_STAGE_IS_ENABLED(pipe, num) ((pipe)->pipe_qos_config & QOS_STAGE_MASK(num)) -#define SH_CSS_QOS_STAGE_IS_ALL_DISABLED(pipe) ((pipe)->pipe_qos_config == QOS_ALL_STAGES_DISABLED) -#define SH_CSS_QOS_MODE_PIPE_ADD(mode, pipe)    ((mode) |= (0x1 << (pipe)->pipe_id)) -#define SH_CSS_QOS_MODE_PIPE_REMOVE(mode, pipe) ((mode) &= ~(0x1 << (pipe)->pipe_id)) -#define SH_CSS_IS_QOS_ONLY_MODE(mode)           ((mode) == (0x1 << IA_CSS_PIPE_ID_ACC))  /* Information for a pipeline */  struct sh_css_sp_pipeline { @@ -907,9 +897,6 @@ sh_css_params_init(void);  void  sh_css_params_uninit(void); -/* For Acceleration API: Flush FW (shared buffer pointer) arguments */ -void sh_css_flush(struct ia_css_acc_fw *fw); -  void  sh_css_binary_args_reset(struct sh_css_binary_args *args); diff --git a/drivers/staging/media/atomisp/pci/sh_css_legacy.h b/drivers/staging/media/atomisp/pci/sh_css_legacy.h index 567c8d6dcc2c..cdf239b070a8 100644 --- a/drivers/staging/media/atomisp/pci/sh_css_legacy.h +++ b/drivers/staging/media/atomisp/pci/sh_css_legacy.h @@ -32,7 +32,6 @@ enum ia_css_pipe_id {  	IA_CSS_PIPE_ID_VIDEO,  	IA_CSS_PIPE_ID_CAPTURE,  	IA_CSS_PIPE_ID_YUVPP, -	IA_CSS_PIPE_ID_ACC,  	IA_CSS_PIPE_ID_NUM  }; diff --git a/drivers/staging/media/atomisp/pci/sh_css_param_shading.c b/drivers/staging/media/atomisp/pci/sh_css_param_shading.c index 41a4c9162319..5b43cc656269 100644 --- a/drivers/staging/media/atomisp/pci/sh_css_param_shading.c +++ b/drivers/staging/media/atomisp/pci/sh_css_param_shading.c @@ -13,6 +13,7 @@   * more details.   */ +#include <linux/math.h>  #include <linux/slab.h>  #include <math_support.h> @@ -239,10 +240,9 @@ prepare_shading_table(const struct ia_css_shading_table *in_table,  {  	unsigned int input_width, input_height, table_width, table_height, i;  	unsigned int left_padding, top_padding, left_cropping; -	unsigned int bds_numerator, bds_denominator; -	int right_padding; -  	struct ia_css_shading_table *result; +	struct u32_fract bds; +	int right_padding;  	assert(target_table);  	assert(binary); @@ -265,17 +265,16 @@ prepare_shading_table(const struct ia_css_shading_table *in_table,  	left_cropping = (binary->info->sp.pipeline.left_cropping == 0) ?  			binary->dvs_envelope.width : 2 * ISP_VEC_NELEMS; -	sh_css_bds_factor_get_numerator_denominator -	(bds_factor, &bds_numerator, &bds_denominator); +	sh_css_bds_factor_get_fract(bds_factor, &bds);  	left_padding  = (left_padding + binary->info->sp.pipeline.left_cropping) * -			bds_numerator / bds_denominator - +			bds.numerator / bds.denominator -  			binary->info->sp.pipeline.left_cropping;  	right_padding = (binary->internal_frame_info.res.width - -			 binary->effective_in_frame_res.width * bds_denominator / -			 bds_numerator - left_cropping) * bds_numerator / bds_denominator; -	top_padding = binary->info->sp.pipeline.top_cropping * bds_numerator / -		      bds_denominator - +			 binary->effective_in_frame_res.width * bds.denominator / +			 bds.numerator - left_cropping) * bds.numerator / bds.denominator; +	top_padding = binary->info->sp.pipeline.top_cropping * bds.numerator / +		      bds.denominator -  		      binary->info->sp.pipeline.top_cropping;  	/* diff --git a/drivers/staging/media/atomisp/pci/sh_css_params.c b/drivers/staging/media/atomisp/pci/sh_css_params.c index 67915d76a87f..f08564f58242 100644 --- a/drivers/staging/media/atomisp/pci/sh_css_params.c +++ b/drivers/staging/media/atomisp/pci/sh_css_params.c @@ -936,8 +936,8 @@ sh_css_set_black_frame(struct ia_css_stream *stream,  	assert(raw_black_frame);  	params = stream->isp_params_configs; -	height = raw_black_frame->info.res.height; -	width = raw_black_frame->info.padded_width; +	height = raw_black_frame->frame_info.res.height; +	width = raw_black_frame->frame_info.padded_width;  	ptr = raw_black_frame->data  	+ raw_black_frame->planes.raw.offset; @@ -1187,16 +1187,15 @@ ia_css_process_zoom_and_motion(  			const struct sh_css_binary_args *args = &stage->args;  			const struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS] = {NULL}; -			if (args->out_frame[0]) -				out_infos[0] = &args->out_frame[0]->info; +			out_infos[0] = ia_css_frame_get_info(args->out_frame[0]); +  			info = &stage->firmware->info.isp;  			ia_css_binary_fill_info(info, false, false,  						ATOMISP_INPUT_FORMAT_RAW_10, -						args->in_frame  ? &args->in_frame->info  : NULL, +						ia_css_frame_get_info(args->in_frame),  						NULL,  						out_infos, -						args->out_vf_frame ? &args->out_vf_frame->info -						: NULL, +						ia_css_frame_get_info(args->out_vf_frame),  						&tmp_binary,  						NULL,  						-1, true); @@ -3461,10 +3460,10 @@ sh_css_params_write_to_ddr_internal(  			if (stage->args.delay_frames[0]) {  				/*When delay frames are present(as in case of video),  				they are used for dvs. Configure DVS using those params*/ -				dvs_in_frame_info = &stage->args.delay_frames[0]->info; +				dvs_in_frame_info = &stage->args.delay_frames[0]->frame_info;  			} else {  				/*Otherwise, use input frame to configure DVS*/ -				dvs_in_frame_info = &stage->args.in_frame->info; +				dvs_in_frame_info = &stage->args.in_frame->frame_info;  			}  			/* Generate default DVS unity table on start up*/ diff --git a/drivers/staging/media/atomisp/pci/sh_css_sp.c b/drivers/staging/media/atomisp/pci/sh_css_sp.c index 615500a7d3c4..0dd58a7fe2cc 100644 --- a/drivers/staging/media/atomisp/pci/sh_css_sp.c +++ b/drivers/staging/media/atomisp/pci/sh_css_sp.c @@ -277,10 +277,10 @@ sh_css_sp_start_raw_copy(struct ia_css_frame *out_frame,  	ia_css_pipeline_get_sp_thread_id(pipe_num, &thread_id);  	pipe = &sh_css_sp_group.pipe[thread_id]; -	pipe->copy.raw.height	    = out_frame->info.res.height; -	pipe->copy.raw.width	    = out_frame->info.res.width; -	pipe->copy.raw.padded_width  = out_frame->info.padded_width; -	pipe->copy.raw.raw_bit_depth = out_frame->info.raw_bit_depth; +	pipe->copy.raw.height	    = out_frame->frame_info.res.height; +	pipe->copy.raw.width	    = out_frame->frame_info.res.width; +	pipe->copy.raw.padded_width  = out_frame->frame_info.padded_width; +	pipe->copy.raw.raw_bit_depth = out_frame->frame_info.raw_bit_depth;  	pipe->copy.raw.max_input_width = max_input_width;  	pipe->num_stages = 1;  	pipe->pipe_id = pipe_id; @@ -351,10 +351,10 @@ sh_css_sp_start_isys_copy(struct ia_css_frame *out_frame,  	ia_css_pipeline_get_sp_thread_id(pipe_num, &thread_id);  	pipe = &sh_css_sp_group.pipe[thread_id]; -	pipe->copy.raw.height		= out_frame->info.res.height; -	pipe->copy.raw.width		= out_frame->info.res.width; -	pipe->copy.raw.padded_width	= out_frame->info.padded_width; -	pipe->copy.raw.raw_bit_depth	= out_frame->info.raw_bit_depth; +	pipe->copy.raw.height		= out_frame->frame_info.res.height; +	pipe->copy.raw.width		= out_frame->frame_info.res.width; +	pipe->copy.raw.padded_width	= out_frame->frame_info.padded_width; +	pipe->copy.raw.raw_bit_depth	= out_frame->frame_info.raw_bit_depth;  	pipe->copy.raw.max_input_width	= max_input_width;  	pipe->num_stages		= 1;  	pipe->pipe_id			= pipe_id; @@ -451,9 +451,9 @@ sh_css_copy_frame_to_spframe(struct ia_css_frame_sp *sp_frame_out,  					    frame_in->data,  					    frame_in->buf_type); -	ia_css_frame_info_to_frame_sp_info(&sp_frame_out->info, &frame_in->info); +	ia_css_frame_info_to_frame_sp_info(&sp_frame_out->info, &frame_in->frame_info); -	switch (frame_in->info.format) { +	switch (frame_in->frame_info.format) {  	case IA_CSS_FRAME_FORMAT_RAW_PACKED:  	case IA_CSS_FRAME_FORMAT_RAW:  		sp_frame_out->planes.raw.offset = frame_in->planes.raw.offset; @@ -536,7 +536,7 @@ set_input_frame_buffer(const struct ia_css_frame *frame)  	if (!frame)  		return -EINVAL; -	switch (frame->info.format) { +	switch (frame->frame_info.format) {  	case IA_CSS_FRAME_FORMAT_QPLANE6:  	case IA_CSS_FRAME_FORMAT_YUV420_16:  	case IA_CSS_FRAME_FORMAT_RAW_PACKED: @@ -567,7 +567,7 @@ set_output_frame_buffer(const struct ia_css_frame *frame,  	if (!frame)  		return -EINVAL; -	switch (frame->info.format) { +	switch (frame->frame_info.format) {  	case IA_CSS_FRAME_FORMAT_YUV420:  	case IA_CSS_FRAME_FORMAT_YUV422:  	case IA_CSS_FRAME_FORMAT_YUV444: @@ -608,7 +608,7 @@ set_view_finder_buffer(const struct ia_css_frame *frame)  	if (!frame)  		return -EINVAL; -	switch (frame->info.format) { +	switch (frame->frame_info.format) {  	/* the dual output pin */  	case IA_CSS_FRAME_FORMAT_NV12:  	case IA_CSS_FRAME_FORMAT_NV12_16: @@ -819,34 +819,35 @@ static int configure_isp_from_args(const struct sh_css_sp_pipeline *pipeline,  	ret = ia_css_fpn_configure(binary,  &binary->in_frame_info);  	if (ret)  		return ret; -	ret = ia_css_crop_configure(binary, &args->delay_frames[0]->info); +	ret = ia_css_crop_configure(binary, ia_css_frame_get_info(args->delay_frames[0]));  	if (ret)  		return ret;  	ret = ia_css_qplane_configure(pipeline, binary, &binary->in_frame_info);  	if (ret)  		return ret; -	ret = ia_css_output0_configure(binary, &args->out_frame[0]->info); +	ret = ia_css_output0_configure(binary, ia_css_frame_get_info(args->out_frame[0]));  	if (ret)  		return ret; -	ret = ia_css_output1_configure(binary, &args->out_vf_frame->info); +	ret = ia_css_output1_configure(binary, ia_css_frame_get_info(args->out_vf_frame));  	if (ret)  		return ret;  	ret = ia_css_copy_output_configure(binary, args->copy_output);  	if (ret)  		return ret; -	ret = ia_css_output0_configure(binary, &args->out_frame[0]->info); +	ret = ia_css_output0_configure(binary, ia_css_frame_get_info(args->out_frame[0]));  	if (ret)  		return ret; -	ret = ia_css_iterator_configure(binary, &args->in_frame->info); +	ret = ia_css_iterator_configure(binary, ia_css_frame_get_info(args->in_frame));  	if (ret)  		return ret; -	ret = ia_css_dvs_configure(binary, &args->out_frame[0]->info); +	ret = ia_css_dvs_configure(binary, ia_css_frame_get_info(args->out_frame[0]));  	if (ret)  		return ret; -	ret = ia_css_output_configure(binary, &args->out_frame[0]->info); +	ret = ia_css_output_configure(binary, ia_css_frame_get_info(args->out_frame[0]));  	if (ret)  		return ret; -	ret = ia_css_raw_configure(pipeline, binary, &args->in_frame->info, &binary->in_frame_info, two_ppc, deinterleaved); +	ret = ia_css_raw_configure(pipeline, binary, ia_css_frame_get_info(args->in_frame), +				   &binary->in_frame_info, two_ppc, deinterleaved);  	if (ret)  		return ret; @@ -1037,7 +1038,7 @@ sh_css_sp_init_stage(struct ia_css_binary *binary,  		return -EINVAL;  	if (args->in_frame) -		ia_css_get_crop_offsets(pipe, &args->in_frame->info); +		ia_css_get_crop_offsets(pipe, &args->in_frame->frame_info);  	else  		ia_css_get_crop_offsets(pipe, &binary->in_frame_info);  #else @@ -1124,15 +1125,14 @@ sp_init_stage(struct ia_css_pipeline_stage *stage,  		const struct ia_css_frame_info *out_infos[IA_CSS_BINARY_MAX_OUTPUT_PORTS] = {NULL};  		if (args->out_frame[0]) -			out_infos[0] = &args->out_frame[0]->info; +			out_infos[0] = &args->out_frame[0]->frame_info;  		info = &firmware->info.isp;  		ia_css_binary_fill_info(info, false, false,  					ATOMISP_INPUT_FORMAT_RAW_10, -					args->in_frame  ? &args->in_frame->info  : NULL, +					ia_css_frame_get_info(args->in_frame),  					NULL,  					out_infos, -					args->out_vf_frame ? &args->out_vf_frame->info -					: NULL, +					ia_css_frame_get_info(args->out_vf_frame),  					&tmp_binary,  					NULL,  					-1, true); @@ -1266,7 +1266,7 @@ sh_css_sp_init_pipeline(struct ia_css_pipeline *me,  	sh_css_sp_group.pipe[thread_id].thread_id = thread_id;  	sh_css_sp_group.pipe[thread_id].pipe_num = pipe_num;  	sh_css_sp_group.pipe[thread_id].num_execs = me->num_execs; -	sh_css_sp_group.pipe[thread_id].pipe_qos_config = me->pipe_qos_config; +	sh_css_sp_group.pipe[thread_id].pipe_qos_config = QOS_INVALID;  	sh_css_sp_group.pipe[thread_id].required_bds_factor = required_bds_factor;  	sh_css_sp_group.pipe[thread_id].input_system_mode  	= (uint32_t)input_mode; |