msm: camera: cdm: Support CDM2.1 for new Chipset
Add support single-context CDM for CDM2.1. CRs-fixed: 2770438 Change-Id: I894ebc9fc770fe25c7cd1c18099d3c06af319245 Signed-off-by: Jigar Agrawal <jigar@codeaurora.org>
This commit is contained in:
@@ -503,7 +503,6 @@ struct cam_cdm_bl_fifo {
|
||||
* @gen_irq: memory region in which gen_irq command will be written
|
||||
* @cpas_handle: handle for cpas driver
|
||||
* @arbitration: type of arbitration to be used for the CDM
|
||||
* @rst_done_cnt: CMD reset done count
|
||||
*/
|
||||
struct cam_cdm {
|
||||
uint32_t index;
|
||||
@@ -526,13 +525,13 @@ struct cam_cdm {
|
||||
struct cam_cdm_hw_mem gen_irq[CAM_CDM_BL_FIFO_MAX];
|
||||
uint32_t cpas_handle;
|
||||
enum cam_cdm_arbitration arbitration;
|
||||
uint32_t rst_done_cnt;
|
||||
};
|
||||
|
||||
/* struct cam_cdm_private_dt_data - CDM hw custom dt data */
|
||||
struct cam_cdm_private_dt_data {
|
||||
bool dt_cdm_shared;
|
||||
bool config_fifo;
|
||||
bool is_single_ctx_cdm;
|
||||
uint8_t priority_group;
|
||||
uint32_t fifo_depth[CAM_CDM_BL_FIFO_MAX];
|
||||
uint32_t dt_num_supported_clients;
|
||||
@@ -550,10 +549,10 @@ struct cam_cdm_intf_devices {
|
||||
/* struct cam_cdm_intf_mgr - CDM mgr interface device struct */
|
||||
struct cam_cdm_intf_mgr {
|
||||
bool probe_done;
|
||||
struct cam_cdm_intf_devices nodes[CAM_CDM_INTF_MGR_MAX_SUPPORTED_CDM];
|
||||
uint32_t cdm_count;
|
||||
uint32_t dt_supported_hw_cdm;
|
||||
int32_t refcount;
|
||||
struct cam_cdm_intf_devices nodes[CAM_CDM_INTF_MGR_MAX_SUPPORTED_CDM];
|
||||
};
|
||||
|
||||
int cam_cdm_intf_register_hw_cdm(struct cam_hw_intf *hw,
|
||||
|
@@ -66,14 +66,13 @@ static const struct of_device_id msm_cam_hw_cdm_dt_match[] = {
|
||||
.data = &cam_cdm_2_1_reg_offset,
|
||||
},
|
||||
{
|
||||
.compatible = CAM_HW_CDM_OPE_NAME_2_1,
|
||||
.compatible = CAM_HW_CDM_RT_NAME_2_1,
|
||||
.data = &cam_cdm_2_1_reg_offset,
|
||||
},
|
||||
{
|
||||
.compatible = CAM_HW_CDM_IFE_NAME_2_1,
|
||||
.compatible = CAM_HW_CDM_OPE_NAME_2_1,
|
||||
.data = &cam_cdm_2_1_reg_offset,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static enum cam_cdm_id cam_hw_cdm_get_id_by_name(char *name)
|
||||
@@ -102,12 +101,12 @@ static enum cam_cdm_id cam_hw_cdm_get_id_by_name(char *name)
|
||||
if (strnstr(name, CAM_HW_CDM_CPAS_NAME_2_1,
|
||||
strlen(CAM_HW_CDM_CPAS_NAME_2_1)))
|
||||
return CAM_CDM_CPAS;
|
||||
if (strnstr(name, CAM_HW_CDM_RT_NAME_2_1,
|
||||
strlen(CAM_HW_CDM_RT_NAME_2_1)))
|
||||
return CAM_CDM_RT;
|
||||
if (strnstr(name, CAM_HW_CDM_OPE_NAME_2_1,
|
||||
strlen(CAM_HW_CDM_OPE_NAME_2_1)))
|
||||
return CAM_CDM_OPE;
|
||||
if (strnstr(name, CAM_HW_CDM_IFE_NAME_2_1,
|
||||
strlen(CAM_HW_CDM_IFE_NAME_2_1)))
|
||||
return CAM_CDM_IFE;
|
||||
|
||||
return CAM_CDM_MAX;
|
||||
}
|
||||
@@ -320,7 +319,7 @@ void cam_hw_cdm_dump_bl_fifo_data(struct cam_hw_info *cdm_hw)
|
||||
void cam_hw_cdm_dump_core_debug_registers(
|
||||
struct cam_hw_info *cdm_hw)
|
||||
{
|
||||
uint32_t dump_reg, core_dbg;
|
||||
uint32_t dump_reg, dump_reg1, dump_reg2, core_dbg;
|
||||
int i;
|
||||
struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info;
|
||||
|
||||
@@ -353,6 +352,19 @@ void cam_hw_cdm_dump_core_debug_registers(
|
||||
CAM_INFO(CAM_CDM, "CDM HW AHB dump not enable");
|
||||
}
|
||||
|
||||
cam_cdm_read_hw_reg(cdm_hw,
|
||||
core->offsets->cmn_reg->icl_reg->data_regs->icl_inv_data,
|
||||
&dump_reg);
|
||||
cam_cdm_read_hw_reg(cdm_hw,
|
||||
core->offsets->cmn_reg->icl_reg->misc_regs->icl_inv_bl_addr,
|
||||
&dump_reg1);
|
||||
cam_cdm_read_hw_reg(cdm_hw,
|
||||
core->offsets->cmn_reg->icl_reg->misc_regs->icl_status,
|
||||
&dump_reg2);
|
||||
CAM_INFO(CAM_CDM,
|
||||
"Last Inv Cmd Log(ICL)Status: 0x%x, Last Inv cmd: 0x%x, Last Inv bl_addr: 0x%x",
|
||||
dump_reg2, dump_reg, dump_reg1);
|
||||
|
||||
cam_hw_cdm_dump_bl_fifo_data(cdm_hw);
|
||||
|
||||
CAM_INFO(CAM_CDM, "CDM HW default dump");
|
||||
@@ -360,9 +372,7 @@ void cam_hw_cdm_dump_core_debug_registers(
|
||||
core->offsets->cmn_reg->core_cfg, &dump_reg);
|
||||
CAM_INFO(CAM_CDM, "CDM HW core cfg=%x", dump_reg);
|
||||
|
||||
for (i = 0; i <
|
||||
core->offsets->reg_data->num_bl_fifo_irq;
|
||||
i++) {
|
||||
for (i = 0; i < core->offsets->reg_data->num_bl_fifo_irq; i++) {
|
||||
cam_cdm_read_hw_reg(cdm_hw,
|
||||
core->offsets->irq_reg[i]->irq_status, &dump_reg);
|
||||
CAM_INFO(CAM_CDM, "CDM HW irq status%d=%x", i, dump_reg);
|
||||
@@ -412,7 +422,6 @@ enum cam_cdm_arbitration cam_cdm_get_arbitration_type(
|
||||
arbitration = CAM_CDM_ARBITRATION_NONE;
|
||||
goto end;
|
||||
}
|
||||
|
||||
switch (id) {
|
||||
case CAM_CDM_CPAS:
|
||||
arbitration = CAM_CDM_ARBITRATION_ROUND_ROBIN;
|
||||
@@ -427,14 +436,13 @@ end:
|
||||
|
||||
int cam_hw_cdm_set_cdm_blfifo_cfg(struct cam_hw_info *cdm_hw)
|
||||
{
|
||||
uint32_t blfifo_cfg_mask = 0;
|
||||
int rc = 0, i;
|
||||
struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info;
|
||||
|
||||
blfifo_cfg_mask = blfifo_cfg_mask |
|
||||
CAM_CDM_BL_FIFO_REQ_SIZE_MAX;
|
||||
|
||||
for (i = 0; i < core->offsets->reg_data->num_bl_fifo_irq; i++) {
|
||||
if (!core->bl_fifo[i].bl_depth)
|
||||
continue;
|
||||
|
||||
rc = cam_cdm_write_hw_reg(cdm_hw,
|
||||
core->offsets->irq_reg[i]->irq_mask, 0x70003);
|
||||
if (rc) {
|
||||
@@ -447,24 +455,10 @@ int cam_hw_cdm_set_cdm_blfifo_cfg(struct cam_hw_info *cdm_hw)
|
||||
|
||||
if (core->hw_version >= CAM_CDM_VERSION_2_0) {
|
||||
for (i = 0; i < core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
blfifo_cfg_mask = blfifo_cfg_mask |
|
||||
(core->bl_fifo[i].bl_depth
|
||||
rc = cam_cdm_write_hw_reg(cdm_hw,
|
||||
core->offsets->bl_fifo_reg[i]->bl_fifo_cfg,
|
||||
core->bl_fifo[i].bl_depth
|
||||
<< CAM_CDM_BL_FIFO_LENGTH_CFG_SHIFT);
|
||||
rc = cam_cdm_write_hw_reg(cdm_hw,
|
||||
core->offsets->bl_fifo_reg[i]->bl_fifo_cfg,
|
||||
blfifo_cfg_mask);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_CDM,
|
||||
"Unable to write to cdm irq mask register");
|
||||
rc = -EIO;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
rc = cam_cdm_write_hw_reg(cdm_hw,
|
||||
core->offsets->bl_fifo_reg[i]->bl_fifo_cfg,
|
||||
blfifo_cfg_mask);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_CDM,
|
||||
"Unable to write to cdm irq mask register");
|
||||
@@ -484,7 +478,7 @@ int cam_hw_cdm_set_cdm_core_cfg(struct cam_hw_info *cdm_hw)
|
||||
int rc;
|
||||
struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info;
|
||||
struct cam_cdm_private_dt_data *pvt_data =
|
||||
pvt_data = cdm_hw->soc_info.soc_private;
|
||||
(struct cam_cdm_private_dt_data *)cdm_hw->soc_info.soc_private;
|
||||
|
||||
cfg_mask = cfg_mask |
|
||||
CAM_CDM_AHB_STOP_ON_ERROR|
|
||||
@@ -501,7 +495,8 @@ int cam_hw_cdm_set_cdm_core_cfg(struct cam_hw_info *cdm_hw)
|
||||
}
|
||||
|
||||
if (cdm_version >= CAM_CDM_VERSION_2_0) {
|
||||
if (core->id != CAM_CDM_CPAS)
|
||||
if (core->id != CAM_CDM_CPAS &&
|
||||
(!pvt_data->is_single_ctx_cdm))
|
||||
cfg_mask = cfg_mask | CAM_CDM_IMPLICIT_WAIT_EN;
|
||||
|
||||
if (core->arbitration == CAM_CDM_ARBITRATION_ROUND_ROBIN)
|
||||
@@ -1281,6 +1276,7 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
|
||||
struct cam_hw_info *cdm_hw = data;
|
||||
struct cam_cdm *cdm_core = cdm_hw->core_info;
|
||||
struct cam_cdm_work_payload *payload[CAM_CDM_BL_FIFO_MAX] = {0};
|
||||
uint8_t rst_done_cnt = 0;
|
||||
uint32_t user_data = 0;
|
||||
uint32_t irq_status[CAM_CDM_BL_FIFO_MAX] = {0};
|
||||
uint32_t irq_context_summary = 0xF;
|
||||
@@ -1332,7 +1328,7 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
|
||||
continue;
|
||||
|
||||
if (irq_status[i] & CAM_CDM_IRQ_STATUS_RST_DONE_MASK) {
|
||||
cdm_core->rst_done_cnt++;
|
||||
rst_done_cnt++;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1391,17 +1387,15 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
|
||||
kfree(payload[i]);
|
||||
}
|
||||
}
|
||||
if (cdm_core->rst_done_cnt ==
|
||||
cdm_core->offsets->reg_data->num_bl_fifo_irq) {
|
||||
if (rst_done_cnt == cdm_core->offsets->reg_data->num_bl_fifo_irq) {
|
||||
CAM_DBG(CAM_CDM, "CDM HW reset done IRQ");
|
||||
complete(&cdm_core->reset_complete);
|
||||
}
|
||||
if (cdm_core->rst_done_cnt &&
|
||||
cdm_core->rst_done_cnt !=
|
||||
cdm_core->offsets->reg_data->num_bl_fifo_irq)
|
||||
if (rst_done_cnt &&
|
||||
(rst_done_cnt != cdm_core->offsets->reg_data->num_bl_fifo_irq))
|
||||
CAM_INFO(CAM_CDM,
|
||||
"Reset IRQ received for %d fifos instead of %d",
|
||||
cdm_core->rst_done_cnt,
|
||||
rst_done_cnt,
|
||||
cdm_core->offsets->reg_data->num_bl_fifo_irq);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1422,6 +1416,9 @@ int cam_hw_cdm_alloc_genirq_mem(void *hw_priv)
|
||||
genirq_alloc_cmd.smmu_hdl = cdm_core->iommu_hdl.non_secure;
|
||||
genirq_alloc_cmd.flags = CAM_MEM_FLAG_HW_READ_WRITE;
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
if (!cdm_core->bl_fifo[i].bl_depth)
|
||||
continue;
|
||||
|
||||
genirq_alloc_cmd.size = (8 *
|
||||
cdm_core->bl_fifo[i].bl_depth);
|
||||
rc = cam_mem_mgr_request_mem(&genirq_alloc_cmd,
|
||||
@@ -1478,7 +1475,7 @@ int cam_hw_cdm_reset_hw(struct cam_hw_info *cdm_hw, uint32_t handle)
|
||||
mutex_lock(&cdm_core->bl_fifo[i].fifo_lock);
|
||||
|
||||
set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status);
|
||||
cdm_core->rst_done_cnt = 0;
|
||||
|
||||
reinit_completion(&cdm_core->reset_complete);
|
||||
|
||||
/* First pause CDM, If it fails still proceed to reset CDM HW */
|
||||
@@ -1486,6 +1483,9 @@ int cam_hw_cdm_reset_hw(struct cam_hw_info *cdm_hw, uint32_t handle)
|
||||
usleep_range(1000, 1010);
|
||||
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
if (!cdm_core->bl_fifo[i].bl_depth)
|
||||
continue;
|
||||
|
||||
reset_val = reset_val |
|
||||
(1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT));
|
||||
if (cam_cdm_write_hw_reg(cdm_hw,
|
||||
@@ -1549,7 +1549,6 @@ int cam_hw_cdm_handle_error_info(
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++)
|
||||
mutex_lock(&cdm_core->bl_fifo[i].fifo_lock);
|
||||
|
||||
cdm_core->rst_done_cnt = 0;
|
||||
reinit_completion(&cdm_core->reset_complete);
|
||||
set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status);
|
||||
set_bit(CAM_CDM_FLUSH_HW_STATUS, &cdm_core->cdm_status);
|
||||
@@ -1578,6 +1577,9 @@ int cam_hw_cdm_handle_error_info(
|
||||
cam_hw_cdm_dump_core_debug_registers(cdm_hw);
|
||||
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
if (!cdm_core->bl_fifo[i].bl_depth)
|
||||
continue;
|
||||
|
||||
reset_val = reset_val |
|
||||
(1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT));
|
||||
if (cam_cdm_write_hw_reg(cdm_hw,
|
||||
@@ -1811,10 +1813,14 @@ int cam_hw_cdm_init(void *hw_priv,
|
||||
goto disable_return;
|
||||
} else {
|
||||
CAM_DBG(CAM_CDM, "CDM Init success");
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++)
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
if (!cdm_core->bl_fifo[i].bl_depth)
|
||||
continue;
|
||||
|
||||
cam_cdm_write_hw_reg(cdm_hw,
|
||||
cdm_core->offsets->irq_reg[i]->irq_mask,
|
||||
0x70003);
|
||||
}
|
||||
rc = 0;
|
||||
goto end;
|
||||
}
|
||||
@@ -1860,7 +1866,6 @@ int cam_hw_cdm_deinit(void *hw_priv,
|
||||
}
|
||||
|
||||
set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status);
|
||||
cdm_core->rst_done_cnt = 0;
|
||||
reinit_completion(&cdm_core->reset_complete);
|
||||
|
||||
/* First pause CDM, If it fails still proceed to reset CDM HW */
|
||||
@@ -1868,6 +1873,9 @@ int cam_hw_cdm_deinit(void *hw_priv,
|
||||
usleep_range(1000, 1010);
|
||||
|
||||
for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++) {
|
||||
if (!cdm_core->bl_fifo[i].bl_depth)
|
||||
continue;
|
||||
|
||||
reset_val = reset_val |
|
||||
(1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT));
|
||||
if (cam_cdm_write_hw_reg(cdm_hw,
|
||||
@@ -1973,7 +1981,6 @@ static int cam_hw_cdm_component_bind(struct device *dev,
|
||||
goto release_private_mem;
|
||||
}
|
||||
|
||||
cdm_core->rst_done_cnt = 0;
|
||||
init_completion(&cdm_core->reset_complete);
|
||||
cdm_hw_intf->hw_priv = cdm_hw;
|
||||
cdm_hw_intf->hw_ops.get_hw_caps = cam_cdm_get_caps;
|
||||
|
@@ -22,6 +22,7 @@ enum cam_cdm_id {
|
||||
CAM_CDM_IPE1,
|
||||
CAM_CDM_BPS,
|
||||
CAM_CDM_VFE,
|
||||
CAM_CDM_RT,
|
||||
CAM_CDM_MAX
|
||||
};
|
||||
|
||||
|
@@ -114,6 +114,10 @@ int cam_cdm_soc_load_dt_private(struct platform_device *pdev,
|
||||
|
||||
}
|
||||
|
||||
cdm_pvt_data->is_single_ctx_cdm =
|
||||
of_property_read_bool(pdev->dev.of_node,
|
||||
"single-context-cdm");
|
||||
|
||||
rc = of_property_read_u8(pdev->dev.of_node, "cdm-priority-group",
|
||||
&cdm_pvt_data->priority_group);
|
||||
if (rc < 0) {
|
||||
|
@@ -14,8 +14,8 @@
|
||||
#define CAM_HW_CDM_CPAS_NAME_2_0 "qcom,cam-cpas-cdm2_0"
|
||||
#define CAM_HW_CDM_OPE_NAME_2_0 "qcom,cam-ope-cdm2_0"
|
||||
#define CAM_HW_CDM_CPAS_NAME_2_1 "qcom,cam-cpas-cdm2_1"
|
||||
#define CAM_HW_CDM_RT_NAME_2_1 "qcom,cam-rt-cdm2_1"
|
||||
#define CAM_HW_CDM_OPE_NAME_2_1 "qcom,cam-ope-cdm2_1"
|
||||
#define CAM_HW_CDM_IFE_NAME_2_1 "qcom,cam-ife-cdm2_1"
|
||||
|
||||
int cam_hw_cdm_soc_get_dt_properties(struct cam_hw_info *cdm_hw,
|
||||
const struct of_device_id *table);
|
||||
|
@@ -3001,7 +3001,6 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args)
|
||||
uint32_t total_pd_port = 0;
|
||||
struct cam_isp_acquire_hw_info *acquire_hw_info = NULL;
|
||||
uint32_t input_size = 0;
|
||||
uint32_t hw_version;
|
||||
|
||||
CAM_DBG(CAM_ISP, "Enter...");
|
||||
|
||||
@@ -3110,14 +3109,15 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args)
|
||||
goto free_cdm;
|
||||
}
|
||||
|
||||
cam_cpas_get_cpas_hw_version(&hw_version);
|
||||
ife_ctx->hw_version = hw_version;
|
||||
|
||||
cam_cpas_get_cpas_hw_version(&ife_ctx->hw_version);
|
||||
if (ife_ctx->is_dual)
|
||||
memcpy(cdm_acquire.identifier, "dualife", sizeof("dualife"));
|
||||
else
|
||||
memcpy(cdm_acquire.identifier, "ife", sizeof("ife"));
|
||||
|
||||
if (ife_ctx->is_dual)
|
||||
cdm_acquire.cell_index = ife_ctx->master_hw_idx;
|
||||
else
|
||||
cdm_acquire.cell_index = ife_ctx->base[0].idx;
|
||||
cdm_acquire.handle = 0;
|
||||
cdm_acquire.userdata = ife_ctx;
|
||||
@@ -3141,6 +3141,7 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args)
|
||||
"Successfully acquired CDM Id: %d, CDM HW hdl=%x, is_dual=%d",
|
||||
cdm_acquire.id, cdm_acquire.handle, ife_ctx->is_dual);
|
||||
ife_ctx->cdm_handle = cdm_acquire.handle;
|
||||
ife_ctx->cdm_id = cdm_acquire.id;
|
||||
if (cdm_acquire.id == CAM_CDM_IFE)
|
||||
ife_ctx->internal_cdm = true;
|
||||
atomic_set(&ife_ctx->cdm_done, 1);
|
||||
@@ -3242,7 +3243,6 @@ static int cam_ife_mgr_acquire_dev(void *hw_mgr_priv, void *acquire_hw_args)
|
||||
uint32_t total_pix_port = 0;
|
||||
uint32_t total_rdi_port = 0;
|
||||
uint32_t in_port_length = 0;
|
||||
uint32_t hw_version;
|
||||
|
||||
CAM_DBG(CAM_ISP, "Enter...");
|
||||
|
||||
@@ -3375,8 +3375,7 @@ static int cam_ife_mgr_acquire_dev(void *hw_mgr_priv, void *acquire_hw_args)
|
||||
goto free_res;
|
||||
}
|
||||
|
||||
cam_cpas_get_cpas_hw_version(&hw_version);
|
||||
ife_ctx->hw_version = hw_version;
|
||||
cam_cpas_get_cpas_hw_version(&ife_ctx->hw_version);
|
||||
ife_ctx->internal_cdm = false;
|
||||
|
||||
if (ife_ctx->is_dual)
|
||||
@@ -3408,6 +3407,7 @@ static int cam_ife_mgr_acquire_dev(void *hw_mgr_priv, void *acquire_hw_args)
|
||||
if (cdm_acquire.id == CAM_CDM_IFE)
|
||||
ife_ctx->internal_cdm = true;
|
||||
ife_ctx->cdm_handle = cdm_acquire.handle;
|
||||
ife_ctx->cdm_id = cdm_acquire.id;
|
||||
atomic_set(&ife_ctx->cdm_done, 1);
|
||||
|
||||
acquire_args->ctxt_to_hw_map = ife_ctx;
|
||||
@@ -6219,6 +6219,7 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
|
||||
bool frame_header_enable = false;
|
||||
struct cam_isp_prepare_hw_update_data *prepare_hw_data;
|
||||
struct cam_isp_frame_header_info frame_header_info;
|
||||
struct cam_isp_change_base_args change_base_info = {0};
|
||||
|
||||
if (!hw_mgr_priv || !prepare_hw_update_args) {
|
||||
CAM_ERR(CAM_ISP, "Invalid args");
|
||||
@@ -6289,9 +6290,11 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
|
||||
|
||||
/* Add change base */
|
||||
if (!ctx->internal_cdm) {
|
||||
change_base_info.base_idx = ctx->base[i].idx;
|
||||
change_base_info.cdm_id = ctx->cdm_id;
|
||||
rc = cam_isp_add_change_base(prepare,
|
||||
&ctx->res_list_ife_src,
|
||||
ctx->base[i].idx, &kmd_buf);
|
||||
&change_base_info, &kmd_buf);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
"Failed in change base i=%d, idx=%d, rc=%d",
|
||||
@@ -6401,11 +6404,13 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
|
||||
|
||||
/* add reg update commands */
|
||||
for (i = 0; i < ctx->num_base; i++) {
|
||||
change_base_info.base_idx = ctx->base[i].idx;
|
||||
change_base_info.cdm_id = ctx->cdm_id;
|
||||
/* Add change base */
|
||||
if (!ctx->internal_cdm) {
|
||||
rc = cam_isp_add_change_base(prepare,
|
||||
&ctx->res_list_ife_src,
|
||||
ctx->base[i].idx, &kmd_buf);
|
||||
&change_base_info, &kmd_buf);
|
||||
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
|
@@ -74,6 +74,7 @@ struct cam_ife_hw_mgr_debug {
|
||||
* @cdm_ops cdm util operation pointer for building
|
||||
* cdm commands
|
||||
* @cdm_cmd cdm base and length request pointer
|
||||
* @cdm_id cdm id of the acquired cdm
|
||||
* @sof_cnt sof count value per core, used for dual VFE
|
||||
* @epoch_cnt epoch count value per core, used for dual VFE
|
||||
* @eof_cnt eof count value per core, used for dual VFE
|
||||
@@ -130,7 +131,7 @@ struct cam_ife_hw_mgr_ctx {
|
||||
uint32_t cdm_handle;
|
||||
struct cam_cdm_utils_ops *cdm_ops;
|
||||
struct cam_cdm_bl_request *cdm_cmd;
|
||||
|
||||
enum cam_cdm_id cdm_id;
|
||||
uint32_t sof_cnt[CAM_IFE_HW_NUM_MAX];
|
||||
uint32_t epoch_cnt[CAM_IFE_HW_NUM_MAX];
|
||||
uint32_t eof_cnt[CAM_IFE_HW_NUM_MAX];
|
||||
|
@@ -4008,6 +4008,7 @@ static int cam_tfe_mgr_prepare_hw_update(void *hw_mgr_priv,
|
||||
bool fill_fence = true;
|
||||
struct cam_isp_prepare_hw_update_data *prepare_hw_data;
|
||||
struct cam_isp_frame_header_info frame_header_info;
|
||||
struct cam_isp_change_base_args change_base_info = {0};
|
||||
|
||||
if (!hw_mgr_priv || !prepare_hw_update_args) {
|
||||
CAM_ERR(CAM_ISP, "Invalid args");
|
||||
@@ -4060,9 +4061,12 @@ static int cam_tfe_mgr_prepare_hw_update(void *hw_mgr_priv,
|
||||
"change base i=%d, idx=%d",
|
||||
i, ctx->base[i].idx);
|
||||
|
||||
change_base_info.base_idx = ctx->base[i].idx;
|
||||
change_base_info.cdm_id = CAM_CDM_MAX;
|
||||
|
||||
/* Add change base */
|
||||
rc = cam_isp_add_change_base(prepare, &ctx->res_list_tfe_in,
|
||||
ctx->base[i].idx, &kmd_buf);
|
||||
&change_base_info, &kmd_buf);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
"Failed in change base i=%d, idx=%d, rc=%d",
|
||||
@@ -4157,9 +4161,11 @@ static int cam_tfe_mgr_prepare_hw_update(void *hw_mgr_priv,
|
||||
|
||||
/* add reg update commands */
|
||||
for (i = 0; i < ctx->num_base; i++) {
|
||||
change_base_info.base_idx = ctx->base[i].idx;
|
||||
change_base_info.cdm_id = CAM_CDM_MAX;
|
||||
/* Add change base */
|
||||
rc = cam_isp_add_change_base(prepare, &ctx->res_list_tfe_in,
|
||||
ctx->base[i].idx, &kmd_buf);
|
||||
&change_base_info, &kmd_buf);
|
||||
if (rc) {
|
||||
CAM_ERR(CAM_ISP,
|
||||
"Failed in change base adding reg_update cmd i=%d, idx=%d, rc=%d",
|
||||
|
@@ -15,7 +15,7 @@
|
||||
int cam_isp_add_change_base(
|
||||
struct cam_hw_prepare_update_args *prepare,
|
||||
struct list_head *res_list_isp_src,
|
||||
uint32_t base_idx,
|
||||
struct cam_isp_change_base_args *change_base_args,
|
||||
struct cam_kmd_buf_info *kmd_buf_info)
|
||||
{
|
||||
int rc = -EINVAL;
|
||||
@@ -44,10 +44,11 @@ int cam_isp_add_change_base(
|
||||
continue;
|
||||
|
||||
res = hw_mgr_res->hw_res[i];
|
||||
if (res->hw_intf->hw_idx != base_idx)
|
||||
if (res->hw_intf->hw_idx != change_base_args->base_idx)
|
||||
continue;
|
||||
|
||||
get_base.res = res;
|
||||
get_base.cdm_id = change_base_args->cdm_id;
|
||||
get_base.cmd_type = CAM_ISP_HW_CMD_GET_CHANGE_BASE;
|
||||
get_base.cmd.cmd_buf_addr = kmd_buf_info->cpu_addr +
|
||||
kmd_buf_info->used_bytes/4;
|
||||
|
@@ -12,6 +12,7 @@
|
||||
#include "cam_isp_hw_mgr.h"
|
||||
#include "cam_hw_intf.h"
|
||||
#include "cam_packet_util.h"
|
||||
#include "cam_cdm_intf_api.h"
|
||||
|
||||
/* enum cam_isp_cdm_bl_type - isp cdm packet type*/
|
||||
enum cam_isp_cdm_bl_type {
|
||||
@@ -47,6 +48,17 @@ struct cam_isp_frame_header_info {
|
||||
uint32_t frame_header_res_id;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct cam_isp_change_base_args
|
||||
*
|
||||
* @cdm_id: CDM id
|
||||
* @base_idx: Base index
|
||||
*/
|
||||
struct cam_isp_change_base_args {
|
||||
enum cam_cdm_id cdm_id;
|
||||
uint32_t base_idx;
|
||||
};
|
||||
|
||||
/*
|
||||
* cam_isp_add_change_base()
|
||||
*
|
||||
@@ -56,8 +68,7 @@ struct cam_isp_frame_header_info {
|
||||
*
|
||||
* @prepare: Contain the packet and HW update variables
|
||||
* @res_list_isp_src: Resource list for IFE/VFE source
|
||||
* @base_idx: Base or dev index of the IFE/VFE HW instance for
|
||||
* which change change base need to be added
|
||||
* @change_base_args: Arguments for Change base function
|
||||
* @kmd_buf_info: Kmd buffer to store the change base command
|
||||
* @return: 0 for success
|
||||
* -EINVAL for Fail
|
||||
@@ -65,7 +76,7 @@ struct cam_isp_frame_header_info {
|
||||
int cam_isp_add_change_base(
|
||||
struct cam_hw_prepare_update_args *prepare,
|
||||
struct list_head *res_list_isp_src,
|
||||
uint32_t base_idx,
|
||||
struct cam_isp_change_base_args *change_base_args,
|
||||
struct cam_kmd_buf_info *kmd_buf_info);
|
||||
|
||||
/*
|
||||
|
@@ -12,6 +12,7 @@
|
||||
#include "cam_soc_util.h"
|
||||
#include "cam_irq_controller.h"
|
||||
#include "cam_hw_intf.h"
|
||||
#include "cam_cdm_intf_api.h"
|
||||
|
||||
/* Maximum length of tag while dumping */
|
||||
#define CAM_ISP_HW_DUMP_TAG_MAX_LEN 32
|
||||
@@ -273,12 +274,14 @@ struct cam_isp_hw_get_res_for_mid {
|
||||
*
|
||||
* @res: Resource node
|
||||
* @cmd_type: Command type for which to get update
|
||||
* @cdm_id : CDM id
|
||||
* @cmd: Command buffer information
|
||||
*
|
||||
*/
|
||||
struct cam_isp_hw_get_cmd_update {
|
||||
struct cam_isp_resource_node *res;
|
||||
enum cam_isp_hw_cmd_type cmd_type;
|
||||
enum cam_cdm_id cdm_id;
|
||||
struct cam_isp_hw_cmd_buf_update cmd;
|
||||
union {
|
||||
void *data;
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#define CAM_VFE_HW_NUM_MAX 7
|
||||
|
||||
#define VFE_CORE_BASE_IDX 0
|
||||
#define RT_BASE_IDX 2
|
||||
/*
|
||||
* VBIF and BUS do not exist on same HW.
|
||||
* Hence both can be 1 below.
|
||||
|
Reference in New Issue
Block a user