Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 087cdcd0 authored by Sridhar Gujje's avatar Sridhar Gujje
Browse files

Merge commit '83ad0691' into msm-4.9 - PC 131



* commit '83ad0691':
  msm: camera: isp: Enable the CSID crop
  msm: camera: csiphy: Reset device count on shutdown
  msm: camera: isp: State monitoring in isp for error logging
  msm: camera: isp: CSID global reset with software registers
  msm: camera: isp: Stop ife hw mgr tasklet after ife resource stop
  msm: camera: enables BPS callback for CPAS
  msm: camera: Code cleanup across KMD drivers
  msm: camera: isp: Add reset to deinit sequence

Change-Id: I7e03bffa446a369c8dfa48006b433ddcf4ff66cb
Signed-off-by: default avatarSridhar Gujje <sgujje@codeaurora.org>
parents 9d4600a1 83ad0691
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -537,8 +537,7 @@ int32_t cam_context_flush_ctx_to_hw(struct cam_context *ctx)
					CAM_ERR(CAM_CTXT,
					"Req: %llu already signalled, sync_id:%d",
					req->request_id,
						req->out_map_entries[i].
						sync_id);
					req->out_map_entries[i].sync_id);
					break;
				}
			}
@@ -629,6 +628,7 @@ int32_t cam_context_flush_req_to_hw(struct cam_context *ctx,
	struct cam_ctx_request *req = NULL;
	struct cam_hw_flush_args flush_args;
	uint32_t i;
	int32_t sync_id = 0;
	int rc = 0;

	CAM_DBG(CAM_CTXT, "[%s] E: NRT flush req", ctx->dev_name);
@@ -683,20 +683,20 @@ int32_t cam_context_flush_req_to_hw(struct cam_context *ctx,

	if (req) {
		if (flush_args.num_req_pending || flush_args.num_req_active) {
			for (i = 0; i < req->num_out_map_entries; i++)
				if (req->out_map_entries[i].sync_id != -1) {
					rc = cam_sync_signal(
						req->out_map_entries[i].sync_id,
			for (i = 0; i < req->num_out_map_entries; i++) {
				sync_id =
					req->out_map_entries[i].sync_id;
				if (sync_id != -1) {
					rc = cam_sync_signal(sync_id,
						CAM_SYNC_STATE_SIGNALED_ERROR);
					if (rc == -EALREADY) {
						CAM_ERR(CAM_CTXT,
						"Req: %llu already signalled, sync_id:%d",
							req->request_id,
							req->out_map_entries[i].
							sync_id);
						req->request_id, sync_id);
						break;
					}
				}
			}
			if (flush_args.num_req_active) {
				spin_lock(&ctx->lock);
				list_add_tail(&req->list, &ctx->free_req_list);
+14 −4
Original line number Diff line number Diff line
@@ -873,6 +873,7 @@ static int cam_cpas_hw_update_ahb_vote(struct cam_hw_info *cpas_hw,
	if (!CAM_CPAS_CLIENT_VALID(client_indx))
		return -EINVAL;

	mutex_lock(&cpas_hw->hw_mutex);
	mutex_lock(&cpas_core->client_mutex[client_indx]);

	if (!CAM_CPAS_CLIENT_STARTED(cpas_core, client_indx)) {
@@ -892,6 +893,7 @@ static int cam_cpas_hw_update_ahb_vote(struct cam_hw_info *cpas_hw,

unlock_client:
	mutex_unlock(&cpas_core->client_mutex[client_indx]);
	mutex_unlock(&cpas_hw->hw_mutex);
	return rc;
}

@@ -907,6 +909,7 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args,
	struct cam_axi_vote *axi_vote;
	enum cam_vote_level applied_level = CAM_SVS_VOTE;
	int rc;
	struct cam_cpas_private_soc *soc_private = NULL;

	if (!hw_priv || !start_args) {
		CAM_ERR(CAM_CPAS, "Invalid arguments %pK %pK",
@@ -922,6 +925,8 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args,

	cpas_hw = (struct cam_hw_info *)hw_priv;
	cpas_core = (struct cam_cpas *) cpas_hw->core_info;
	soc_private = (struct cam_cpas_private_soc *)
		cpas_hw->soc_info.soc_private;
	cmd_hw_start = (struct cam_cpas_hw_cmd_start *)start_args;
	client_indx = CAM_CPAS_GET_CLIENT_IDX(cmd_hw_start->client_handle);
	ahb_vote = cmd_hw_start->ahb_vote;
@@ -1005,8 +1010,9 @@ static int cam_cpas_hw_start(void *hw_priv, void *start_args,
	cpas_client->started = true;
	cpas_core->streamon_clients++;

	CAM_DBG(CAM_CPAS, "client_indx=%d, streamon_clients=%d",
		client_indx, cpas_core->streamon_clients);
	CAM_DBG(CAM_CPAS, "client=%s, streamon_clients=%d",
		soc_private->client_name[client_indx],
		cpas_core->streamon_clients);
done:
	mutex_unlock(&cpas_core->client_mutex[client_indx]);
	mutex_unlock(&cpas_hw->hw_mutex);
@@ -1028,6 +1034,7 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args,
	struct cam_cpas_client *cpas_client;
	struct cam_ahb_vote ahb_vote;
	struct cam_axi_vote axi_vote;
	struct cam_cpas_private_soc *soc_private = NULL;
	int rc = 0;
	long result;

@@ -1045,6 +1052,8 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args,

	cpas_hw = (struct cam_hw_info *)hw_priv;
	cpas_core = (struct cam_cpas *) cpas_hw->core_info;
	soc_private = (struct cam_cpas_private_soc *)
		cpas_hw->soc_info.soc_private;
	cmd_hw_stop = (struct cam_cpas_hw_cmd_stop *)stop_args;
	client_indx = CAM_CPAS_GET_CLIENT_IDX(cmd_hw_stop->client_handle);

@@ -1054,8 +1063,9 @@ static int cam_cpas_hw_stop(void *hw_priv, void *stop_args,
	mutex_lock(&cpas_hw->hw_mutex);
	mutex_lock(&cpas_core->client_mutex[client_indx]);

	CAM_DBG(CAM_CPAS, "client_indx=%d, streamon_clients=%d",
		client_indx, cpas_core->streamon_clients);
	CAM_DBG(CAM_CPAS, "client=%s, streamon_clients=%d",
		soc_private->client_name[client_indx],
		cpas_core->streamon_clients);

	if (!CAM_CPAS_CLIENT_STARTED(cpas_core, client_indx)) {
		CAM_ERR(CAM_CPAS, "Client %d is not started", client_indx);
+2 −2
Original line number Diff line number Diff line
@@ -261,8 +261,8 @@ enum bps_io_images {
};

struct frame_buffer {
	uint32_t buffer_ptr[MAX_NUM_OF_IMAGE_PLANES];
	uint32_t meta_buffer_ptr[MAX_NUM_OF_IMAGE_PLANES];
	uint32_t buf_ptr[MAX_NUM_OF_IMAGE_PLANES];
	uint32_t meta_buf_ptr[MAX_NUM_OF_IMAGE_PLANES];
} __packed;

struct bps_frame_process_data {
+36 −2
Original line number Diff line number Diff line
/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -33,6 +33,40 @@ static struct cam_bps_device_hw_info cam_bps_hw_info = {
};
EXPORT_SYMBOL(cam_bps_hw_info);

static bool cam_bps_cpas_cb(uint32_t client_handle, void *userdata,
	struct cam_cpas_irq_data *irq_data)
{
	bool error_handled = false;

	if (!irq_data)
		return error_handled;

	switch (irq_data->irq_type) {
	case CAM_CAMNOC_IRQ_IPE_BPS_UBWC_DECODE_ERROR:
		CAM_ERR_RATE_LIMIT(CAM_ICP,
			"IPE/BPS UBWC Decode error type=%d status=%x thr_err=%d, fcl_err=%d, len_md_err=%d, format_err=%d",
			irq_data->irq_type,
			irq_data->u.dec_err.decerr_status.value,
			irq_data->u.dec_err.decerr_status.thr_err,
			irq_data->u.dec_err.decerr_status.fcl_err,
			irq_data->u.dec_err.decerr_status.len_md_err,
			irq_data->u.dec_err.decerr_status.format_err);
		error_handled = true;
		break;
	case CAM_CAMNOC_IRQ_IPE_BPS_UBWC_ENCODE_ERROR:
		CAM_ERR_RATE_LIMIT(CAM_ICP,
			"IPE/BPS UBWC Encode error type=%d status=%x",
			irq_data->irq_type,
			irq_data->u.enc_err.encerr_status.value);
		error_handled = true;
		break;
	default:
		break;
	}

	return error_handled;
}

int cam_bps_register_cpas(struct cam_hw_soc_info *soc_info,
			struct cam_bps_device_core_info *core_info,
			uint32_t hw_idx)
@@ -42,7 +76,7 @@ int cam_bps_register_cpas(struct cam_hw_soc_info *soc_info,

	cpas_register_params.dev = &soc_info->pdev->dev;
	memcpy(cpas_register_params.identifier, "bps", sizeof("bps"));
	cpas_register_params.cam_cpas_client_cb = NULL;
	cpas_register_params.cam_cpas_client_cb = cam_bps_cpas_cb;
	cpas_register_params.cell_index = hw_idx;
	cpas_register_params.userdata = NULL;

+13 −14
Original line number Diff line number Diff line
@@ -308,8 +308,9 @@ static int32_t cam_icp_deinit_idle_clk(void *priv, void *data)
		ctx_data = &hw_mgr->ctx_data[i];
		mutex_lock(&ctx_data->ctx_mutex);
		if ((ctx_data->state == CAM_ICP_CTX_STATE_ACQUIRED) &&
			(ICP_DEV_TYPE_TO_CLK_TYPE(ctx_data->
			icp_dev_acquire_info->dev_type) == clk_info->hw_type)) {
			(ICP_DEV_TYPE_TO_CLK_TYPE(
			ctx_data->icp_dev_acquire_info->dev_type)
			== clk_info->hw_type)) {
			busy = cam_icp_frame_pending(ctx_data);
			if (busy) {
				mutex_unlock(&ctx_data->ctx_mutex);
@@ -2994,6 +2995,8 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr,
	uint64_t cpu_addr = 0;
	struct ipe_frame_process_data *frame_process_data = NULL;
	struct bps_frame_process_data *bps_frame_process_data = NULL;
	struct frame_set *ipe_set = NULL;
	struct frame_buffer *bps_bufs = NULL;

	cmd_desc = (struct cam_cmd_buf_desc *)
		((uint32_t *) &packet->payload + packet->cmd_buf_offset/4);
@@ -3042,14 +3045,11 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr,
		frame_process_data->cdm_buffer_addr = 0;
		frame_process_data->cdm_prog_base = 0;
		for (i = 0; i < frame_process_data->frames_in_batch; i++) {
			ipe_set = &frame_process_data->framesets[i];
			for (j = 0; j < IPE_IO_IMAGES_MAX; j++) {
				for (k = 0; k < MAX_NUM_OF_IMAGE_PLANES; k++) {
					frame_process_data->
					framesets[i].buffers[j].
					buffer_ptr[k] = 0;
					frame_process_data->
					framesets[i].buffers[j].
					meta_buffer_ptr[k] = 0;
					ipe_set->buffers[j].buf_ptr[k] = 0;
					ipe_set->buffers[j].meta_buf_ptr[k] = 0;
				}
			}
		}
@@ -3066,11 +3066,10 @@ static int cam_icp_mgr_process_cmd_desc(struct cam_icp_hw_mgr *hw_mgr,
		bps_frame_process_data->strip_lib_out_addr = 0;
		bps_frame_process_data->cdm_prog_addr = 0;
		for (i = 0; i < BPS_IO_IMAGES_MAX; i++) {
			bps_bufs = &bps_frame_process_data->buffers[i];
			for (j = 0; j < MAX_NUM_OF_IMAGE_PLANES; j++) {
				bps_frame_process_data->
				buffers[i].buffer_ptr[j] = 0;
				bps_frame_process_data->
				buffers[i].meta_buffer_ptr[j] = 0;
				bps_bufs->buf_ptr[j] = 0;
				bps_bufs->meta_buf_ptr[j] = 0;
			}
		}
	}
@@ -4028,8 +4027,8 @@ static int cam_icp_mgr_alloc_devs(struct device_node *of_node)
		CAM_ERR(CAM_ICP, "read num bps devices failed");
		goto num_bps_failed;
	}
	icp_hw_mgr.devices[CAM_ICP_DEV_BPS] = kzalloc(
		sizeof(struct cam_hw_intf *) * num_dev, GFP_KERNEL);
	icp_hw_mgr.devices[CAM_ICP_DEV_BPS] = kcalloc(num_dev,
		sizeof(struct cam_hw_intf *), GFP_KERNEL);
	if (!icp_hw_mgr.devices[CAM_ICP_DEV_BPS]) {
		rc = -ENOMEM;
		goto num_bps_failed;
Loading