Merge "msm: camera: reqmgr: On bubble reset appropriate slots" into camera-kernel.lnx.6.0
This commit is contained in:

zatwierdzone przez
Gerrit - the friendly Code Review server

commit
186193bb8f
@@ -817,8 +817,8 @@ static int __cam_req_mgr_check_next_req_slot(
|
||||
*/
|
||||
if (slot->status == CRM_SLOT_STATUS_REQ_APPLIED) {
|
||||
CAM_WARN(CAM_CRM,
|
||||
"slot[%d] wasn't reset, reset it now",
|
||||
idx);
|
||||
"slot [idx: %d req: %lld last_applied_idx: %d] was not reset, reset it now",
|
||||
idx, in_q->slot[idx].req_id, in_q->last_applied_idx);
|
||||
if (in_q->last_applied_idx == idx) {
|
||||
CAM_WARN(CAM_CRM,
|
||||
"last_applied_idx: %d",
|
||||
@@ -2986,6 +2986,7 @@ void __cam_req_mgr_apply_on_bubble(
|
||||
int cam_req_mgr_process_error(void *priv, void *data)
|
||||
{
|
||||
int rc = 0, idx = -1;
|
||||
int i, slot_diff;
|
||||
struct cam_req_mgr_error_notify *err_info = NULL;
|
||||
struct cam_req_mgr_core_link *link = NULL;
|
||||
struct cam_req_mgr_req_queue *in_q = NULL;
|
||||
@@ -3017,8 +3018,8 @@ int cam_req_mgr_process_error(void *priv, void *data)
|
||||
"req_id %lld not found in input queue",
|
||||
err_info->req_id);
|
||||
} else {
|
||||
CAM_DBG(CAM_CRM, "req_id %lld found at idx %d",
|
||||
err_info->req_id, idx);
|
||||
CAM_DBG(CAM_CRM, "req_id %lld found at idx %d last_applied %d",
|
||||
err_info->req_id, idx, in_q->last_applied_idx);
|
||||
slot = &in_q->slot[idx];
|
||||
if (!slot->recover) {
|
||||
CAM_WARN(CAM_CRM,
|
||||
@@ -3045,13 +3046,31 @@ int cam_req_mgr_process_error(void *priv, void *data)
|
||||
in_q->slot[idx].sync_mode = 0;
|
||||
}
|
||||
|
||||
/* The next req may also be applied */
|
||||
/*
|
||||
* Reset till last applied, even if there are scheduling delays
|
||||
* we start fresh from the request on which bubble has
|
||||
* been reported
|
||||
*/
|
||||
idx = in_q->rd_idx;
|
||||
__cam_req_mgr_inc_idx(&idx, 1,
|
||||
link->req.l_tbl->num_slots);
|
||||
if (in_q->last_applied_idx >= 0) {
|
||||
slot_diff = in_q->last_applied_idx - idx;
|
||||
if (slot_diff < 0)
|
||||
slot_diff += link->req.l_tbl->num_slots;
|
||||
} else {
|
||||
/* Next req at the minimum may be applied */
|
||||
slot_diff = 1;
|
||||
}
|
||||
|
||||
if (in_q->slot[idx].status == CRM_SLOT_STATUS_REQ_APPLIED)
|
||||
in_q->slot[idx].status = CRM_SLOT_STATUS_REQ_ADDED;
|
||||
for (i = 0; i < slot_diff; i++) {
|
||||
__cam_req_mgr_inc_idx(&idx, 1,
|
||||
link->req.l_tbl->num_slots);
|
||||
|
||||
CAM_DBG(CAM_CRM,
|
||||
"Recovery on idx: %d reset slot [idx: %d status: %d]",
|
||||
in_q->rd_idx, idx, in_q->slot[idx].status);
|
||||
if (in_q->slot[idx].status == CRM_SLOT_STATUS_REQ_APPLIED)
|
||||
in_q->slot[idx].status = CRM_SLOT_STATUS_REQ_ADDED;
|
||||
}
|
||||
|
||||
spin_lock_bh(&link->link_state_spin_lock);
|
||||
link->state = CAM_CRM_LINK_STATE_ERR;
|
||||
|
Reference in New Issue
Block a user