msm: camera: common: Add a check for 0 reg-val pairs in cdm command

Add a check for reg-val count=0 in reg_random command. Count=0 in
reg_random cdm command will throw an invalid command HW error.

CRs-Fixed: 2916477
Change-Id: Idb8654c3752963cf5a52147d350e291208b917d0
Signed-off-by: Jigar Agrawal <jigar@codeaurora.org>
This commit is contained in:
Jigar Agrawal
2021-04-05 15:11:55 -07:00
父節點 f77f1673d3
當前提交 b5c4f91b83
共有 11 個文件被更改,包括 389 次插入196 次删除

查看文件

@@ -154,6 +154,7 @@ static uint32_t *cam_ope_bus_rd_update(struct ope_hw *ope_hw_info,
uint32_t temp_reg[128] = {0};
uint32_t rm_id, header_size;
uint32_t rsc_type;
uint32_t *next_buff_addr = NULL;
struct cam_hw_prepare_update_args *prepare_args;
struct cam_ope_ctx *ctx_data;
struct cam_ope_request *ope_request;
@@ -306,10 +307,12 @@ static uint32_t *cam_ope_bus_rd_update(struct ope_hw *ope_hw_info,
io_port_cdm->s_cdm_info[l][idx].addr = kmd_buf;
io_port_cdm->num_s_cmd_bufs[l]++;
kmd_buf = cdm_ops->cdm_write_regrandom(
next_buff_addr = cdm_ops->cdm_write_regrandom(
kmd_buf, count/2, temp_reg);
prepare->kmd_buf_offset += ((count + header_size) *
sizeof(temp));
if (next_buff_addr > kmd_buf)
prepare->kmd_buf_offset +=
((count + header_size) * sizeof(temp));
kmd_buf = next_buff_addr;
CAM_DBG(CAM_OPE, "b:%d io:%d p:%d s:%d",
batch_idx, io_idx, k, l);
for (m = 0; m < count; m += 2)
@@ -340,6 +343,7 @@ static uint32_t *cam_ope_bus_rm_disable(struct ope_hw *ope_hw_info,
uint32_t count = 0;
uint32_t temp = 0;
uint32_t header_size;
uint32_t *next_buff_addr = NULL;
struct cam_ope_ctx *ctx_data;
struct ope_bus_rd_ctx *bus_rd_ctx;
struct cam_ope_bus_rd_reg *rd_reg;
@@ -398,11 +402,12 @@ static uint32_t *cam_ope_bus_rm_disable(struct ope_hw *ope_hw_info,
io_port_cdm->s_cdm_info[l][idx].addr = kmd_buf;
io_port_cdm->num_s_cmd_bufs[l]++;
kmd_buf = cdm_ops->cdm_write_regrandom(
next_buff_addr = cdm_ops->cdm_write_regrandom(
kmd_buf, count/2, temp_reg);
prepare->kmd_buf_offset += ((count + header_size) *
sizeof(temp));
if (next_buff_addr > kmd_buf)
prepare->kmd_buf_offset += ((count + header_size) *
sizeof(temp));
kmd_buf = next_buff_addr;
CAM_DBG(CAM_OPE, "RD cmd bufs = %d",
io_port_cdm->num_s_cmd_bufs[l]);
CAM_DBG(CAM_OPE, "stripe %d off:%d len:%d",
@@ -426,6 +431,7 @@ static int cam_ope_bus_rd_prepare(struct ope_hw *ope_hw_info,
uint32_t temp_reg[32] = {0};
uint32_t header_size;
uint32_t *kmd_buf;
uint32_t *next_buff_addr = NULL;
int is_rm_enabled;
struct cam_ope_dev_prepare_req *prepare;
struct cam_ope_ctx *ctx_data;
@@ -537,10 +543,12 @@ static int cam_ope_bus_rd_prepare(struct ope_hw *ope_hw_info,
io_port_cdm->go_cmd_offset =
prepare->kmd_buf_offset;
}
kmd_buf = cdm_ops->cdm_write_regrandom(
next_buff_addr = cdm_ops->cdm_write_regrandom(
kmd_buf, count/2, temp_reg);
prepare->kmd_buf_offset +=
((count + header_size) * sizeof(temp));
if (next_buff_addr > kmd_buf)
prepare->kmd_buf_offset +=
((count + header_size) * sizeof(temp));
kmd_buf = next_buff_addr;
CAM_DBG(CAM_OPE, "kmd_buf:%x,offset:%d",
kmd_buf, prepare->kmd_buf_offset);
CAM_DBG(CAM_OPE, "t_reg:%xcount: %d size:%d",

查看文件

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/of.h>
@@ -179,6 +179,7 @@ static uint32_t *cam_ope_bus_wr_update(struct ope_hw *ope_hw_info,
uint32_t temp = 0;
uint32_t wm_port_id;
uint32_t header_size;
uint32_t *next_buff_addr = NULL;
struct cam_hw_prepare_update_args *prepare_args;
struct cam_ope_ctx *ctx_data;
struct cam_ope_request *ope_request;
@@ -328,10 +329,12 @@ static uint32_t *cam_ope_bus_wr_update(struct ope_hw *ope_hw_info,
io_port_cdm->s_cdm_info[l][idx].addr = kmd_buf;
io_port_cdm->num_s_cmd_bufs[l]++;
kmd_buf = cdm_ops->cdm_write_regrandom(
next_buff_addr = cdm_ops->cdm_write_regrandom(
kmd_buf, count/2, temp_reg);
prepare->kmd_buf_offset += ((count + header_size) *
sizeof(temp));
if (next_buff_addr > kmd_buf)
prepare->kmd_buf_offset +=
((count + header_size) * sizeof(temp));
kmd_buf = next_buff_addr;
CAM_DBG(CAM_OPE, "b:%d io:%d p:%d s:%d",
batch_idx, io_idx, k, l);
@@ -366,6 +369,7 @@ static uint32_t *cam_ope_bus_wm_disable(struct ope_hw *ope_hw_info,
uint32_t temp = 0;
uint32_t wm_port_id;
uint32_t header_size;
uint32_t *next_buff_addr = NULL;
struct cam_ope_ctx *ctx_data;
struct ope_bus_wr_ctx *bus_wr_ctx;
struct cam_ope_bus_wr_reg *wr_reg;
@@ -426,10 +430,13 @@ static uint32_t *cam_ope_bus_wm_disable(struct ope_hw *ope_hw_info,
io_port_cdm->s_cdm_info[l][idx].addr = kmd_buf;
io_port_cdm->num_s_cmd_bufs[l]++;
kmd_buf = cdm_ops->cdm_write_regrandom(
next_buff_addr = cdm_ops->cdm_write_regrandom(
kmd_buf, count/2, temp_reg);
prepare->kmd_buf_offset += ((count + header_size) *
sizeof(temp));
if (next_buff_addr > kmd_buf)
prepare->kmd_buf_offset +=
((count + header_size) * sizeof(temp));
kmd_buf = next_buff_addr;
CAM_DBG(CAM_OPE, "WR cmd bufs = %d",
io_port_cdm->num_s_cmd_bufs[l]);