msm: camera: isp: Improve debug infrastructure
Address enabling CSID IRQs on SOF freeze. Enable the input IRQ events when state machine encounters congestion as well. CRs-Fixed: 3309151 Change-Id: Ib7611167444a795dd14339cb689a0e116e30b5fd Signed-off-by: Karthik Anantha Ram <quic_kartanan@quicinc.com>
This commit is contained in:

committed by
“Savita

parent
fabd2314a9
commit
8737f407d3
@@ -116,6 +116,28 @@ static void __cam_isp_ctx_update_event_record(
|
|||||||
ctx_isp->event_record[event][iterator].timestamp = cur_time;
|
ctx_isp->event_record[event][iterator].timestamp = cur_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __cam_isp_ctx_handle_sof_freeze_evt(
|
||||||
|
struct cam_context *ctx)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
struct cam_isp_context *ctx_isp;
|
||||||
|
struct cam_hw_cmd_args hw_cmd_args;
|
||||||
|
struct cam_isp_hw_cmd_args isp_hw_cmd_args;
|
||||||
|
|
||||||
|
ctx_isp = (struct cam_isp_context *)ctx->ctx_priv;
|
||||||
|
hw_cmd_args.ctxt_to_hw_map = ctx->ctxt_to_hw_map;
|
||||||
|
hw_cmd_args.cmd_type = CAM_HW_MGR_CMD_INTERNAL;
|
||||||
|
isp_hw_cmd_args.cmd_type = CAM_ISP_HW_MGR_CMD_SOF_DEBUG;
|
||||||
|
isp_hw_cmd_args.u.sof_irq_enable = 1;
|
||||||
|
hw_cmd_args.u.internal_args = (void *)&isp_hw_cmd_args;
|
||||||
|
|
||||||
|
rc = ctx->hw_mgr_intf->hw_cmd(ctx->hw_mgr_intf->hw_mgr_priv,
|
||||||
|
&hw_cmd_args);
|
||||||
|
|
||||||
|
ctx_isp->sof_dbg_irq_en = true;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static void *cam_isp_ctx_user_dump_events(
|
static void *cam_isp_ctx_user_dump_events(
|
||||||
void *dump_struct, uint8_t *addr_ptr)
|
void *dump_struct, uint8_t *addr_ptr)
|
||||||
{
|
{
|
||||||
@@ -1369,10 +1391,11 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void __cam_isp_ctx_handle_buf_done_fail_log(
|
static void __cam_isp_ctx_handle_buf_done_fail_log(
|
||||||
uint64_t request_id, struct cam_isp_ctx_req *req_isp,
|
struct cam_isp_context *ctx_isp, uint64_t request_id,
|
||||||
uint32_t isp_device_type)
|
struct cam_isp_ctx_req *req_isp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
struct cam_context *ctx = ctx_isp->base;
|
||||||
const char *handle_type;
|
const char *handle_type;
|
||||||
|
|
||||||
if (req_isp->num_fence_map_out >= CAM_ISP_CTX_RES_MAX) {
|
if (req_isp->num_fence_map_out >= CAM_ISP_CTX_RES_MAX) {
|
||||||
@@ -1391,7 +1414,8 @@ static void __cam_isp_ctx_handle_buf_done_fail_log(
|
|||||||
for (i = 0; i < req_isp->num_fence_map_out; i++) {
|
for (i = 0; i < req_isp->num_fence_map_out; i++) {
|
||||||
if (req_isp->fence_map_out[i].sync_id != -1) {
|
if (req_isp->fence_map_out[i].sync_id != -1) {
|
||||||
handle_type = __cam_isp_resource_handle_id_to_type(
|
handle_type = __cam_isp_resource_handle_id_to_type(
|
||||||
isp_device_type, req_isp->fence_map_out[i].resource_handle);
|
ctx_isp->isp_device_type,
|
||||||
|
req_isp->fence_map_out[i].resource_handle);
|
||||||
|
|
||||||
trace_cam_log_event("Buf_done Congestion",
|
trace_cam_log_event("Buf_done Congestion",
|
||||||
handle_type, request_id, req_isp->fence_map_out[i].sync_id);
|
handle_type, request_id, req_isp->fence_map_out[i].sync_id);
|
||||||
@@ -1403,6 +1427,9 @@ static void __cam_isp_ctx_handle_buf_done_fail_log(
|
|||||||
req_isp->fence_map_out[i].sync_id);
|
req_isp->fence_map_out[i].sync_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ctx_isp->sof_dbg_irq_en)
|
||||||
|
__cam_isp_ctx_handle_sof_freeze_evt(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cam_isp_context_reset_internal_recovery_params(
|
static void __cam_isp_context_reset_internal_recovery_params(
|
||||||
@@ -1413,6 +1440,7 @@ static void __cam_isp_context_reset_internal_recovery_params(
|
|||||||
ctx_isp->recovery_req_id = 0;
|
ctx_isp->recovery_req_id = 0;
|
||||||
ctx_isp->aeb_error_cnt = 0;
|
ctx_isp->aeb_error_cnt = 0;
|
||||||
ctx_isp->bubble_frame_cnt = 0;
|
ctx_isp->bubble_frame_cnt = 0;
|
||||||
|
ctx_isp->sof_dbg_irq_en = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cam_isp_context_try_internal_recovery(
|
static int __cam_isp_context_try_internal_recovery(
|
||||||
@@ -4430,9 +4458,8 @@ static int __cam_isp_ctx_apply_req_in_activated_state(
|
|||||||
if (active_req) {
|
if (active_req) {
|
||||||
active_req_isp =
|
active_req_isp =
|
||||||
(struct cam_isp_ctx_req *) active_req->req_priv;
|
(struct cam_isp_ctx_req *) active_req->req_priv;
|
||||||
__cam_isp_ctx_handle_buf_done_fail_log(
|
__cam_isp_ctx_handle_buf_done_fail_log(ctx_isp,
|
||||||
active_req->request_id, active_req_isp,
|
active_req->request_id, active_req_isp);
|
||||||
ctx_isp->isp_device_type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = -EFAULT;
|
rc = -EFAULT;
|
||||||
@@ -5134,6 +5161,7 @@ static int __cam_isp_ctx_flush_req_in_top_state(
|
|||||||
|
|
||||||
end:
|
end:
|
||||||
ctx_isp->bubble_frame_cnt = 0;
|
ctx_isp->bubble_frame_cnt = 0;
|
||||||
|
ctx_isp->sof_dbg_irq_en = false;
|
||||||
atomic_set(&ctx_isp->process_bubble, 0);
|
atomic_set(&ctx_isp->process_bubble, 0);
|
||||||
atomic_set(&ctx_isp->rxd_epoch, 0);
|
atomic_set(&ctx_isp->rxd_epoch, 0);
|
||||||
atomic_set(&ctx_isp->internal_recovery_set, 0);
|
atomic_set(&ctx_isp->internal_recovery_set, 0);
|
||||||
@@ -7048,6 +7076,7 @@ static inline void __cam_isp_context_reset_ctx_params(
|
|||||||
ctx_isp->bubble_frame_cnt = 0;
|
ctx_isp->bubble_frame_cnt = 0;
|
||||||
ctx_isp->recovery_req_id = 0;
|
ctx_isp->recovery_req_id = 0;
|
||||||
ctx_isp->aeb_error_cnt = 0;
|
ctx_isp->aeb_error_cnt = 0;
|
||||||
|
ctx_isp->sof_dbg_irq_en = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cam_isp_ctx_start_dev_in_ready(struct cam_context *ctx,
|
static int __cam_isp_ctx_start_dev_in_ready(struct cam_context *ctx,
|
||||||
@@ -7286,6 +7315,7 @@ static int __cam_isp_ctx_stop_dev_in_activated_unlock(
|
|||||||
ctx_isp->last_applied_req_id = 0;
|
ctx_isp->last_applied_req_id = 0;
|
||||||
ctx_isp->req_info.last_bufdone_req_id = 0;
|
ctx_isp->req_info.last_bufdone_req_id = 0;
|
||||||
ctx_isp->bubble_frame_cnt = 0;
|
ctx_isp->bubble_frame_cnt = 0;
|
||||||
|
ctx_isp->sof_dbg_irq_en = false;
|
||||||
atomic_set(&ctx_isp->process_bubble, 0);
|
atomic_set(&ctx_isp->process_bubble, 0);
|
||||||
atomic_set(&ctx_isp->internal_recovery_set, 0);
|
atomic_set(&ctx_isp->internal_recovery_set, 0);
|
||||||
atomic_set(&ctx_isp->rxd_epoch, 0);
|
atomic_set(&ctx_isp->rxd_epoch, 0);
|
||||||
@@ -7383,25 +7413,6 @@ static int __cam_isp_ctx_link_resume(struct cam_context *ctx)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cam_isp_ctx_handle_sof_freeze_evt(
|
|
||||||
struct cam_context *ctx)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
struct cam_hw_cmd_args hw_cmd_args;
|
|
||||||
struct cam_isp_hw_cmd_args isp_hw_cmd_args;
|
|
||||||
|
|
||||||
hw_cmd_args.ctxt_to_hw_map = ctx->ctxt_to_hw_map;
|
|
||||||
hw_cmd_args.cmd_type = CAM_HW_MGR_CMD_INTERNAL;
|
|
||||||
isp_hw_cmd_args.cmd_type = CAM_ISP_HW_MGR_CMD_SOF_DEBUG;
|
|
||||||
isp_hw_cmd_args.u.sof_irq_enable = 1;
|
|
||||||
hw_cmd_args.u.internal_args = (void *)&isp_hw_cmd_args;
|
|
||||||
|
|
||||||
rc = ctx->hw_mgr_intf->hw_cmd(ctx->hw_mgr_intf->hw_mgr_priv,
|
|
||||||
&hw_cmd_args);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __cam_isp_ctx_reset_and_recover(
|
static int __cam_isp_ctx_reset_and_recover(
|
||||||
bool skip_resume, struct cam_context *ctx)
|
bool skip_resume, struct cam_context *ctx)
|
||||||
{
|
{
|
||||||
|
@@ -282,6 +282,7 @@ struct cam_isp_context_event_record {
|
|||||||
* @custom_enabled: Custom HW enabled for this ctx
|
* @custom_enabled: Custom HW enabled for this ctx
|
||||||
* @use_frame_header_ts: Use frame header for qtimer ts
|
* @use_frame_header_ts: Use frame header for qtimer ts
|
||||||
* @support_consumed_addr: Indicate whether HW has last consumed addr reg
|
* @support_consumed_addr: Indicate whether HW has last consumed addr reg
|
||||||
|
* @sof_dbg_irq_en: Indicates whether ISP context has enabled debug irqs
|
||||||
* @apply_in_progress Whether request apply is in progress
|
* @apply_in_progress Whether request apply is in progress
|
||||||
* @use_default_apply: Use default settings in case of frame skip
|
* @use_default_apply: Use default settings in case of frame skip
|
||||||
* @init_timestamp: Timestamp at which this context is initialized
|
* @init_timestamp: Timestamp at which this context is initialized
|
||||||
@@ -339,6 +340,7 @@ struct cam_isp_context {
|
|||||||
bool custom_enabled;
|
bool custom_enabled;
|
||||||
bool use_frame_header_ts;
|
bool use_frame_header_ts;
|
||||||
bool support_consumed_addr;
|
bool support_consumed_addr;
|
||||||
|
bool sof_dbg_irq_en;
|
||||||
atomic_t apply_in_progress;
|
atomic_t apply_in_progress;
|
||||||
atomic_t internal_recovery_set;
|
atomic_t internal_recovery_set;
|
||||||
bool use_default_apply;
|
bool use_default_apply;
|
||||||
|
@@ -11801,27 +11801,30 @@ static int cam_ife_mgr_sof_irq_debug(
|
|||||||
uint32_t sof_irq_enable)
|
uint32_t sof_irq_enable)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
uint32_t i = 0;
|
uint32_t i = 0, hw_idx;
|
||||||
struct cam_isp_hw_mgr_res *hw_mgr_res = NULL;
|
struct cam_isp_hw_mgr_res *hw_mgr_res = NULL;
|
||||||
struct cam_hw_intf *hw_intf = NULL;
|
|
||||||
struct cam_isp_resource_node *rsrc_node = NULL;
|
struct cam_isp_resource_node *rsrc_node = NULL;
|
||||||
|
struct cam_ife_hw_mgr *hw_mgr = ctx->hw_mgr;
|
||||||
|
|
||||||
list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_csid, list) {
|
/* Per CSID enablement will enable for all paths */
|
||||||
for (i = 0; i < CAM_ISP_HW_SPLIT_MAX; i++) {
|
for (i = 0; i < ctx->num_base; i++) {
|
||||||
if (!hw_mgr_res->hw_res[i])
|
if (ctx->base[i].hw_type != CAM_ISP_HW_TYPE_CSID)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hw_intf = hw_mgr_res->hw_res[i]->hw_intf;
|
hw_idx = ctx->base[i].idx;
|
||||||
if (hw_intf->hw_ops.process_cmd) {
|
if (hw_mgr->csid_devices[hw_idx]) {
|
||||||
rc |= hw_intf->hw_ops.process_cmd(
|
rc |= hw_mgr->csid_devices[hw_idx]->hw_ops.process_cmd(
|
||||||
hw_intf->hw_priv,
|
hw_mgr->csid_devices[hw_idx]->hw_priv,
|
||||||
CAM_IFE_CSID_SOF_IRQ_DEBUG,
|
CAM_IFE_CSID_SOF_IRQ_DEBUG,
|
||||||
&sof_irq_enable,
|
&sof_irq_enable, sizeof(sof_irq_enable));
|
||||||
sizeof(sof_irq_enable));
|
if (rc)
|
||||||
}
|
CAM_DBG(CAM_ISP,
|
||||||
|
"Failed to set CSID_%u sof irq debug cfg rc: %d",
|
||||||
|
hw_idx, rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* legacy IFE CAMIF */
|
||||||
list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) {
|
list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) {
|
||||||
for (i = 0; i < CAM_ISP_HW_SPLIT_MAX; i++) {
|
for (i = 0; i < CAM_ISP_HW_SPLIT_MAX; i++) {
|
||||||
if (!hw_mgr_res->hw_res[i])
|
if (!hw_mgr_res->hw_res[i])
|
||||||
|
@@ -265,7 +265,7 @@ static int cam_ife_csid_ver2_sof_irq_debug(
|
|||||||
struct cam_ife_csid_ver2_reg_info *csid_reg;
|
struct cam_ife_csid_ver2_reg_info *csid_reg;
|
||||||
struct cam_ife_csid_ver2_path_cfg *path_cfg;
|
struct cam_ife_csid_ver2_path_cfg *path_cfg;
|
||||||
struct cam_isp_resource_node *res;
|
struct cam_isp_resource_node *res;
|
||||||
uint32_t irq_mask[CAM_IFE_CSID_IRQ_REG_MAX] = {0};
|
uint32_t irq_mask = 0;
|
||||||
uint32_t data_idx;
|
uint32_t data_idx;
|
||||||
|
|
||||||
if (*((uint32_t *)cmd_args) == 1)
|
if (*((uint32_t *)cmd_args) == 1)
|
||||||
@@ -293,12 +293,12 @@ static int cam_ife_csid_ver2_sof_irq_debug(
|
|||||||
if (!path_cfg || !path_cfg->irq_handle)
|
if (!path_cfg || !path_cfg->irq_handle)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
irq_mask[path_cfg->irq_reg_idx] =
|
/* Assuming controller has only 1 register set */
|
||||||
IFE_CSID_VER2_PATH_INFO_INPUT_SOF;
|
irq_mask = IFE_CSID_VER2_PATH_INFO_INPUT_SOF;
|
||||||
cam_irq_controller_update_irq(
|
cam_irq_controller_update_irq(
|
||||||
csid_hw->path_irq_controller[res->res_id],
|
csid_hw->path_irq_controller[res->res_id],
|
||||||
path_cfg->irq_handle,
|
path_cfg->irq_handle,
|
||||||
sof_irq_enable, irq_mask);
|
sof_irq_enable, &irq_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sof_irq_enable) {
|
if (sof_irq_enable) {
|
||||||
@@ -315,11 +315,13 @@ static int cam_ife_csid_ver2_sof_irq_debug(
|
|||||||
csid_hw->hw_intf->hw_idx,
|
csid_hw->hw_intf->hw_idx,
|
||||||
(sof_irq_enable) ? "enabled" : "disabled");
|
(sof_irq_enable) ? "enabled" : "disabled");
|
||||||
|
|
||||||
CAM_INFO(CAM_ISP, "Notify CSIPHY: %d",
|
if (sof_irq_enable) {
|
||||||
|
CAM_INFO(CAM_ISP, "Notify CSIPHY: %d",
|
||||||
csid_hw->rx_cfg.phy_sel - 1);
|
csid_hw->rx_cfg.phy_sel - 1);
|
||||||
|
|
||||||
cam_subdev_notify_message(CAM_CSIPHY_DEVICE_TYPE,
|
cam_subdev_notify_message(CAM_CSIPHY_DEVICE_TYPE,
|
||||||
CAM_SUBDEV_MESSAGE_REG_DUMP, (void *)&data_idx);
|
CAM_SUBDEV_MESSAGE_REG_DUMP, (void *)&data_idx);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user