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

Commit 25fc5107 authored by Karthik Anantha Ram's avatar Karthik Anantha Ram
Browse files

msm: camera: reqmgr: Handle inject delay per req_id



Currently inject delay is incorporated as part of the pd table.
This change applies the delay for the specified request thereby
ensuring that when multiple requests are added we don't manipulate
the inject delay in the wrong way.

Change-Id: I29fdee97531891bcd9d3087fbef17caa0a461bf7
Signed-off-by: default avatarKarthik Anantha Ram <kartanan@codeaurora.org>
parent 5d8d7e5d
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -183,6 +183,7 @@ static int __cam_req_mgr_traverse(struct cam_req_mgr_traverse *traverse_data)
	int32_t                      curr_idx = traverse_data->idx;
	struct cam_req_mgr_req_tbl  *tbl;
	struct cam_req_mgr_apply    *apply_data;
	struct cam_req_mgr_tbl_slot *slot = NULL;

	if (!traverse_data->tbl || !traverse_data->apply_data) {
		CAM_ERR(CAM_CRM, "NULL pointer %pK %pK",
@@ -193,17 +194,18 @@ static int __cam_req_mgr_traverse(struct cam_req_mgr_traverse *traverse_data)

	tbl = traverse_data->tbl;
	apply_data = traverse_data->apply_data;
	slot = &tbl->slot[curr_idx];
	CAM_DBG(CAM_CRM,
		"Enter pd %d idx %d state %d skip %d status %d skip_idx %d",
		tbl->pd, curr_idx, tbl->slot[curr_idx].state,
		tbl->skip_traverse, traverse_data->in_q->slot[curr_idx].status,
		traverse_data->in_q->slot[curr_idx].skip_idx);

	if ((tbl->inject_delay > 0) &&
	if ((slot->inject_delay > 0) &&
		(traverse_data->self_link == true)) {
		CAM_DBG(CAM_CRM, "Injecting Delay of one frame");
		apply_data[tbl->pd].req_id = -1;
		tbl->inject_delay--;
		slot->inject_delay--;
		/* This pd table is not ready to proceed with asked idx */
		SET_FAILURE_BIT(traverse_data->result, tbl->pd);
		return -EAGAIN;
@@ -1593,10 +1595,13 @@ int cam_req_mgr_process_add_req(void *priv, void *data)
		goto end;
	}

	if (add_req->skip_before_applying > tbl->inject_delay)
		tbl->inject_delay = add_req->skip_before_applying;

	slot = &tbl->slot[idx];
	if (add_req->skip_before_applying > slot->inject_delay) {
		slot->inject_delay = add_req->skip_before_applying;
		CAM_DBG(CAM_CRM, "Req_id %llu injecting delay %u",
			add_req->req_id, add_req->skip_before_applying);
	}

	if (slot->state != CRM_REQ_STATE_PENDING &&
		slot->state != CRM_REQ_STATE_EMPTY) {
		CAM_WARN(CAM_CRM, "Unexpected state %d for slot %d map %x",
+2 −2
Original line number Diff line number Diff line
@@ -166,11 +166,13 @@ struct cam_req_mgr_apply {
 * @idx           : slot index
 * @req_ready_map : mask tracking which all devices have request ready
 * @state         : state machine for life cycle of a slot
 * @inject_delay  : insert extra bubbling for flash type of use cases
 */
struct cam_req_mgr_tbl_slot {
	int32_t             idx;
	uint32_t            req_ready_map;
	enum crm_req_state  state;
	uint32_t            inject_delay;
};

/**
@@ -185,7 +187,6 @@ struct cam_req_mgr_tbl_slot {
 * @pd_delta      : differnce between this table's pipeline delay and next
 * @num_slots     : number of request slots present in the table
 * @slot          : array of slots tracking requests availability at devices
 * @inject_delay  : insert extra bubbling for flash type of use cases
 */
struct cam_req_mgr_req_tbl {
	int32_t                     id;
@@ -197,7 +198,6 @@ struct cam_req_mgr_req_tbl {
	int32_t                     pd_delta;
	int32_t                     num_slots;
	struct cam_req_mgr_tbl_slot slot[MAX_REQ_SLOTS];
	uint32_t                    inject_delay;
};

/**