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:
Jigar Agrawal
2020-08-28 19:32:46 -07:00
parent 876c0a9b3a
commit 5298a2471e
12 changed files with 107 additions and 68 deletions

View File

@@ -503,7 +503,6 @@ struct cam_cdm_bl_fifo {
* @gen_irq: memory region in which gen_irq command will be written * @gen_irq: memory region in which gen_irq command will be written
* @cpas_handle: handle for cpas driver * @cpas_handle: handle for cpas driver
* @arbitration: type of arbitration to be used for the CDM * @arbitration: type of arbitration to be used for the CDM
* @rst_done_cnt: CMD reset done count
*/ */
struct cam_cdm { struct cam_cdm {
uint32_t index; uint32_t index;
@@ -526,13 +525,13 @@ struct cam_cdm {
struct cam_cdm_hw_mem gen_irq[CAM_CDM_BL_FIFO_MAX]; struct cam_cdm_hw_mem gen_irq[CAM_CDM_BL_FIFO_MAX];
uint32_t cpas_handle; uint32_t cpas_handle;
enum cam_cdm_arbitration arbitration; 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 - CDM hw custom dt data */
struct cam_cdm_private_dt_data { struct cam_cdm_private_dt_data {
bool dt_cdm_shared; bool dt_cdm_shared;
bool config_fifo; bool config_fifo;
bool is_single_ctx_cdm;
uint8_t priority_group; uint8_t priority_group;
uint32_t fifo_depth[CAM_CDM_BL_FIFO_MAX]; uint32_t fifo_depth[CAM_CDM_BL_FIFO_MAX];
uint32_t dt_num_supported_clients; 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 - CDM mgr interface device struct */
struct cam_cdm_intf_mgr { struct cam_cdm_intf_mgr {
bool probe_done; bool probe_done;
struct cam_cdm_intf_devices nodes[CAM_CDM_INTF_MGR_MAX_SUPPORTED_CDM];
uint32_t cdm_count; uint32_t cdm_count;
uint32_t dt_supported_hw_cdm; uint32_t dt_supported_hw_cdm;
int32_t refcount; 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, int cam_cdm_intf_register_hw_cdm(struct cam_hw_intf *hw,

View File

@@ -66,14 +66,13 @@ static const struct of_device_id msm_cam_hw_cdm_dt_match[] = {
.data = &cam_cdm_2_1_reg_offset, .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, .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, .data = &cam_cdm_2_1_reg_offset,
}, },
{}
}; };
static enum cam_cdm_id cam_hw_cdm_get_id_by_name(char *name) 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, if (strnstr(name, CAM_HW_CDM_CPAS_NAME_2_1,
strlen(CAM_HW_CDM_CPAS_NAME_2_1))) strlen(CAM_HW_CDM_CPAS_NAME_2_1)))
return CAM_CDM_CPAS; 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, if (strnstr(name, CAM_HW_CDM_OPE_NAME_2_1,
strlen(CAM_HW_CDM_OPE_NAME_2_1))) strlen(CAM_HW_CDM_OPE_NAME_2_1)))
return CAM_CDM_OPE; 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; 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( void cam_hw_cdm_dump_core_debug_registers(
struct cam_hw_info *cdm_hw) struct cam_hw_info *cdm_hw)
{ {
uint32_t dump_reg, core_dbg; uint32_t dump_reg, dump_reg1, dump_reg2, core_dbg;
int i; int i;
struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info; 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_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_hw_cdm_dump_bl_fifo_data(cdm_hw);
CAM_INFO(CAM_CDM, "CDM HW default dump"); 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); core->offsets->cmn_reg->core_cfg, &dump_reg);
CAM_INFO(CAM_CDM, "CDM HW core cfg=%x", dump_reg); CAM_INFO(CAM_CDM, "CDM HW core cfg=%x", dump_reg);
for (i = 0; i < for (i = 0; i < core->offsets->reg_data->num_bl_fifo_irq; i++) {
core->offsets->reg_data->num_bl_fifo_irq;
i++) {
cam_cdm_read_hw_reg(cdm_hw, cam_cdm_read_hw_reg(cdm_hw,
core->offsets->irq_reg[i]->irq_status, &dump_reg); core->offsets->irq_reg[i]->irq_status, &dump_reg);
CAM_INFO(CAM_CDM, "CDM HW irq status%d=%x", i, 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; arbitration = CAM_CDM_ARBITRATION_NONE;
goto end; goto end;
} }
switch (id) { switch (id) {
case CAM_CDM_CPAS: case CAM_CDM_CPAS:
arbitration = CAM_CDM_ARBITRATION_ROUND_ROBIN; 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) int cam_hw_cdm_set_cdm_blfifo_cfg(struct cam_hw_info *cdm_hw)
{ {
uint32_t blfifo_cfg_mask = 0;
int rc = 0, i; int rc = 0, i;
struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info; 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++) { 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, rc = cam_cdm_write_hw_reg(cdm_hw,
core->offsets->irq_reg[i]->irq_mask, 0x70003); core->offsets->irq_reg[i]->irq_mask, 0x70003);
if (rc) { 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) { if (core->hw_version >= CAM_CDM_VERSION_2_0) {
for (i = 0; i < core->offsets->reg_data->num_bl_fifo; i++) { for (i = 0; i < core->offsets->reg_data->num_bl_fifo; i++) {
blfifo_cfg_mask = blfifo_cfg_mask | rc = cam_cdm_write_hw_reg(cdm_hw,
(core->bl_fifo[i].bl_depth core->offsets->bl_fifo_reg[i]->bl_fifo_cfg,
core->bl_fifo[i].bl_depth
<< CAM_CDM_BL_FIFO_LENGTH_CFG_SHIFT); << 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) { if (rc) {
CAM_ERR(CAM_CDM, CAM_ERR(CAM_CDM,
"Unable to write to cdm irq mask register"); "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; int rc;
struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info; struct cam_cdm *core = (struct cam_cdm *)cdm_hw->core_info;
struct cam_cdm_private_dt_data *pvt_data = 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 | cfg_mask = cfg_mask |
CAM_CDM_AHB_STOP_ON_ERROR| 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 (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; cfg_mask = cfg_mask | CAM_CDM_IMPLICIT_WAIT_EN;
if (core->arbitration == CAM_CDM_ARBITRATION_ROUND_ROBIN) 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_hw_info *cdm_hw = data;
struct cam_cdm *cdm_core = cdm_hw->core_info; struct cam_cdm *cdm_core = cdm_hw->core_info;
struct cam_cdm_work_payload *payload[CAM_CDM_BL_FIFO_MAX] = {0}; 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 user_data = 0;
uint32_t irq_status[CAM_CDM_BL_FIFO_MAX] = {0}; uint32_t irq_status[CAM_CDM_BL_FIFO_MAX] = {0};
uint32_t irq_context_summary = 0xF; uint32_t irq_context_summary = 0xF;
@@ -1332,7 +1328,7 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
continue; continue;
if (irq_status[i] & CAM_CDM_IRQ_STATUS_RST_DONE_MASK) { if (irq_status[i] & CAM_CDM_IRQ_STATUS_RST_DONE_MASK) {
cdm_core->rst_done_cnt++; rst_done_cnt++;
continue; continue;
} }
@@ -1391,17 +1387,15 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
kfree(payload[i]); kfree(payload[i]);
} }
} }
if (cdm_core->rst_done_cnt == if (rst_done_cnt == cdm_core->offsets->reg_data->num_bl_fifo_irq) {
cdm_core->offsets->reg_data->num_bl_fifo_irq) {
CAM_DBG(CAM_CDM, "CDM HW reset done IRQ"); CAM_DBG(CAM_CDM, "CDM HW reset done IRQ");
complete(&cdm_core->reset_complete); complete(&cdm_core->reset_complete);
} }
if (cdm_core->rst_done_cnt && if (rst_done_cnt &&
cdm_core->rst_done_cnt != (rst_done_cnt != cdm_core->offsets->reg_data->num_bl_fifo_irq))
cdm_core->offsets->reg_data->num_bl_fifo_irq)
CAM_INFO(CAM_CDM, CAM_INFO(CAM_CDM,
"Reset IRQ received for %d fifos instead of %d", "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); cdm_core->offsets->reg_data->num_bl_fifo_irq);
return IRQ_HANDLED; 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.smmu_hdl = cdm_core->iommu_hdl.non_secure;
genirq_alloc_cmd.flags = CAM_MEM_FLAG_HW_READ_WRITE; genirq_alloc_cmd.flags = CAM_MEM_FLAG_HW_READ_WRITE;
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;
genirq_alloc_cmd.size = (8 * genirq_alloc_cmd.size = (8 *
cdm_core->bl_fifo[i].bl_depth); cdm_core->bl_fifo[i].bl_depth);
rc = cam_mem_mgr_request_mem(&genirq_alloc_cmd, 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); mutex_lock(&cdm_core->bl_fifo[i].fifo_lock);
set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status); set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status);
cdm_core->rst_done_cnt = 0;
reinit_completion(&cdm_core->reset_complete); reinit_completion(&cdm_core->reset_complete);
/* First pause CDM, If it fails still proceed to reset CDM HW */ /* 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); usleep_range(1000, 1010);
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;
reset_val = reset_val | reset_val = reset_val |
(1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT)); (1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT));
if (cam_cdm_write_hw_reg(cdm_hw, 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++) for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++)
mutex_lock(&cdm_core->bl_fifo[i].fifo_lock); mutex_lock(&cdm_core->bl_fifo[i].fifo_lock);
cdm_core->rst_done_cnt = 0;
reinit_completion(&cdm_core->reset_complete); reinit_completion(&cdm_core->reset_complete);
set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status); set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status);
set_bit(CAM_CDM_FLUSH_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); cam_hw_cdm_dump_core_debug_registers(cdm_hw);
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;
reset_val = reset_val | reset_val = reset_val |
(1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT)); (1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT));
if (cam_cdm_write_hw_reg(cdm_hw, if (cam_cdm_write_hw_reg(cdm_hw,
@@ -1811,10 +1813,14 @@ int cam_hw_cdm_init(void *hw_priv,
goto disable_return; goto disable_return;
} else { } else {
CAM_DBG(CAM_CDM, "CDM Init success"); 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, cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->irq_reg[i]->irq_mask, cdm_core->offsets->irq_reg[i]->irq_mask,
0x70003); 0x70003);
}
rc = 0; rc = 0;
goto end; 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); set_bit(CAM_CDM_RESET_HW_STATUS, &cdm_core->cdm_status);
cdm_core->rst_done_cnt = 0;
reinit_completion(&cdm_core->reset_complete); reinit_completion(&cdm_core->reset_complete);
/* First pause CDM, If it fails still proceed to reset CDM HW */ /* 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); usleep_range(1000, 1010);
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;
reset_val = reset_val | reset_val = reset_val |
(1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT)); (1 << (i + CAM_CDM_BL_FIFO_FLUSH_SHIFT));
if (cam_cdm_write_hw_reg(cdm_hw, 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; goto release_private_mem;
} }
cdm_core->rst_done_cnt = 0;
init_completion(&cdm_core->reset_complete); init_completion(&cdm_core->reset_complete);
cdm_hw_intf->hw_priv = cdm_hw; cdm_hw_intf->hw_priv = cdm_hw;
cdm_hw_intf->hw_ops.get_hw_caps = cam_cdm_get_caps; cdm_hw_intf->hw_ops.get_hw_caps = cam_cdm_get_caps;

View File

@@ -22,6 +22,7 @@ enum cam_cdm_id {
CAM_CDM_IPE1, CAM_CDM_IPE1,
CAM_CDM_BPS, CAM_CDM_BPS,
CAM_CDM_VFE, CAM_CDM_VFE,
CAM_CDM_RT,
CAM_CDM_MAX CAM_CDM_MAX
}; };

View File

@@ -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", rc = of_property_read_u8(pdev->dev.of_node, "cdm-priority-group",
&cdm_pvt_data->priority_group); &cdm_pvt_data->priority_group);
if (rc < 0) { if (rc < 0) {

View File

@@ -14,8 +14,8 @@
#define CAM_HW_CDM_CPAS_NAME_2_0 "qcom,cam-cpas-cdm2_0" #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_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_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_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, int cam_hw_cdm_soc_get_dt_properties(struct cam_hw_info *cdm_hw,
const struct of_device_id *table); const struct of_device_id *table);

View File

@@ -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; uint32_t total_pd_port = 0;
struct cam_isp_acquire_hw_info *acquire_hw_info = NULL; struct cam_isp_acquire_hw_info *acquire_hw_info = NULL;
uint32_t input_size = 0; uint32_t input_size = 0;
uint32_t hw_version;
CAM_DBG(CAM_ISP, "Enter..."); CAM_DBG(CAM_ISP, "Enter...");
@@ -3110,15 +3109,16 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args)
goto free_cdm; goto free_cdm;
} }
cam_cpas_get_cpas_hw_version(&hw_version); cam_cpas_get_cpas_hw_version(&ife_ctx->hw_version);
ife_ctx->hw_version = hw_version;
if (ife_ctx->is_dual) if (ife_ctx->is_dual)
memcpy(cdm_acquire.identifier, "dualife", sizeof("dualife")); memcpy(cdm_acquire.identifier, "dualife", sizeof("dualife"));
else else
memcpy(cdm_acquire.identifier, "ife", sizeof("ife")); memcpy(cdm_acquire.identifier, "ife", sizeof("ife"));
cdm_acquire.cell_index = ife_ctx->base[0].idx; 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.handle = 0;
cdm_acquire.userdata = ife_ctx; cdm_acquire.userdata = ife_ctx;
cdm_acquire.base_array_cnt = CAM_IFE_HW_NUM_MAX; cdm_acquire.base_array_cnt = CAM_IFE_HW_NUM_MAX;
@@ -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", "Successfully acquired CDM Id: %d, CDM HW hdl=%x, is_dual=%d",
cdm_acquire.id, cdm_acquire.handle, ife_ctx->is_dual); cdm_acquire.id, cdm_acquire.handle, ife_ctx->is_dual);
ife_ctx->cdm_handle = cdm_acquire.handle; ife_ctx->cdm_handle = cdm_acquire.handle;
ife_ctx->cdm_id = cdm_acquire.id;
if (cdm_acquire.id == CAM_CDM_IFE) if (cdm_acquire.id == CAM_CDM_IFE)
ife_ctx->internal_cdm = true; ife_ctx->internal_cdm = true;
atomic_set(&ife_ctx->cdm_done, 1); 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_pix_port = 0;
uint32_t total_rdi_port = 0; uint32_t total_rdi_port = 0;
uint32_t in_port_length = 0; uint32_t in_port_length = 0;
uint32_t hw_version;
CAM_DBG(CAM_ISP, "Enter..."); 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; goto free_res;
} }
cam_cpas_get_cpas_hw_version(&hw_version); cam_cpas_get_cpas_hw_version(&ife_ctx->hw_version);
ife_ctx->hw_version = hw_version;
ife_ctx->internal_cdm = false; ife_ctx->internal_cdm = false;
if (ife_ctx->is_dual) 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) if (cdm_acquire.id == CAM_CDM_IFE)
ife_ctx->internal_cdm = true; ife_ctx->internal_cdm = true;
ife_ctx->cdm_handle = cdm_acquire.handle; ife_ctx->cdm_handle = cdm_acquire.handle;
ife_ctx->cdm_id = cdm_acquire.id;
atomic_set(&ife_ctx->cdm_done, 1); atomic_set(&ife_ctx->cdm_done, 1);
acquire_args->ctxt_to_hw_map = ife_ctx; 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; bool frame_header_enable = false;
struct cam_isp_prepare_hw_update_data *prepare_hw_data; struct cam_isp_prepare_hw_update_data *prepare_hw_data;
struct cam_isp_frame_header_info frame_header_info; 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) { if (!hw_mgr_priv || !prepare_hw_update_args) {
CAM_ERR(CAM_ISP, "Invalid 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 */ /* Add change base */
if (!ctx->internal_cdm) { 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, rc = cam_isp_add_change_base(prepare,
&ctx->res_list_ife_src, &ctx->res_list_ife_src,
ctx->base[i].idx, &kmd_buf); &change_base_info, &kmd_buf);
if (rc) { if (rc) {
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,
"Failed in change base i=%d, idx=%d, rc=%d", "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 */ /* add reg update commands */
for (i = 0; i < ctx->num_base; i++) { 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 */ /* Add change base */
if (!ctx->internal_cdm) { if (!ctx->internal_cdm) {
rc = cam_isp_add_change_base(prepare, rc = cam_isp_add_change_base(prepare,
&ctx->res_list_ife_src, &ctx->res_list_ife_src,
ctx->base[i].idx, &kmd_buf); &change_base_info, &kmd_buf);
if (rc) { if (rc) {
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,

View File

@@ -74,6 +74,7 @@ struct cam_ife_hw_mgr_debug {
* @cdm_ops cdm util operation pointer for building * @cdm_ops cdm util operation pointer for building
* cdm commands * cdm commands
* @cdm_cmd cdm base and length request pointer * @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 * @sof_cnt sof count value per core, used for dual VFE
* @epoch_cnt epoch 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 * @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; uint32_t cdm_handle;
struct cam_cdm_utils_ops *cdm_ops; struct cam_cdm_utils_ops *cdm_ops;
struct cam_cdm_bl_request *cdm_cmd; struct cam_cdm_bl_request *cdm_cmd;
enum cam_cdm_id cdm_id;
uint32_t sof_cnt[CAM_IFE_HW_NUM_MAX]; uint32_t sof_cnt[CAM_IFE_HW_NUM_MAX];
uint32_t epoch_cnt[CAM_IFE_HW_NUM_MAX]; uint32_t epoch_cnt[CAM_IFE_HW_NUM_MAX];
uint32_t eof_cnt[CAM_IFE_HW_NUM_MAX]; uint32_t eof_cnt[CAM_IFE_HW_NUM_MAX];

View File

@@ -4008,6 +4008,7 @@ static int cam_tfe_mgr_prepare_hw_update(void *hw_mgr_priv,
bool fill_fence = true; bool fill_fence = true;
struct cam_isp_prepare_hw_update_data *prepare_hw_data; struct cam_isp_prepare_hw_update_data *prepare_hw_data;
struct cam_isp_frame_header_info frame_header_info; 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) { if (!hw_mgr_priv || !prepare_hw_update_args) {
CAM_ERR(CAM_ISP, "Invalid 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", "change base i=%d, idx=%d",
i, ctx->base[i].idx); 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 */ /* Add change base */
rc = cam_isp_add_change_base(prepare, &ctx->res_list_tfe_in, 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) { if (rc) {
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,
"Failed in change base i=%d, idx=%d, rc=%d", "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 */ /* add reg update commands */
for (i = 0; i < ctx->num_base; i++) { 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 */ /* Add change base */
rc = cam_isp_add_change_base(prepare, &ctx->res_list_tfe_in, 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) { if (rc) {
CAM_ERR(CAM_ISP, CAM_ERR(CAM_ISP,
"Failed in change base adding reg_update cmd i=%d, idx=%d, rc=%d", "Failed in change base adding reg_update cmd i=%d, idx=%d, rc=%d",

View File

@@ -15,7 +15,7 @@
int cam_isp_add_change_base( int cam_isp_add_change_base(
struct cam_hw_prepare_update_args *prepare, struct cam_hw_prepare_update_args *prepare,
struct list_head *res_list_isp_src, 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) struct cam_kmd_buf_info *kmd_buf_info)
{ {
int rc = -EINVAL; int rc = -EINVAL;
@@ -44,10 +44,11 @@ int cam_isp_add_change_base(
continue; continue;
res = hw_mgr_res->hw_res[i]; 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; continue;
get_base.res = res; 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_type = CAM_ISP_HW_CMD_GET_CHANGE_BASE;
get_base.cmd.cmd_buf_addr = kmd_buf_info->cpu_addr + get_base.cmd.cmd_buf_addr = kmd_buf_info->cpu_addr +
kmd_buf_info->used_bytes/4; kmd_buf_info->used_bytes/4;

View File

@@ -12,6 +12,7 @@
#include "cam_isp_hw_mgr.h" #include "cam_isp_hw_mgr.h"
#include "cam_hw_intf.h" #include "cam_hw_intf.h"
#include "cam_packet_util.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 - isp cdm packet type*/
enum cam_isp_cdm_bl_type { enum cam_isp_cdm_bl_type {
@@ -47,6 +48,17 @@ struct cam_isp_frame_header_info {
uint32_t frame_header_res_id; 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() * cam_isp_add_change_base()
* *
@@ -56,8 +68,7 @@ struct cam_isp_frame_header_info {
* *
* @prepare: Contain the packet and HW update variables * @prepare: Contain the packet and HW update variables
* @res_list_isp_src: Resource list for IFE/VFE source * @res_list_isp_src: Resource list for IFE/VFE source
* @base_idx: Base or dev index of the IFE/VFE HW instance for * @change_base_args: Arguments for Change base function
* which change change base need to be added
* @kmd_buf_info: Kmd buffer to store the change base command * @kmd_buf_info: Kmd buffer to store the change base command
* @return: 0 for success * @return: 0 for success
* -EINVAL for Fail * -EINVAL for Fail
@@ -65,7 +76,7 @@ struct cam_isp_frame_header_info {
int cam_isp_add_change_base( int cam_isp_add_change_base(
struct cam_hw_prepare_update_args *prepare, struct cam_hw_prepare_update_args *prepare,
struct list_head *res_list_isp_src, 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); struct cam_kmd_buf_info *kmd_buf_info);
/* /*

View File

@@ -12,6 +12,7 @@
#include "cam_soc_util.h" #include "cam_soc_util.h"
#include "cam_irq_controller.h" #include "cam_irq_controller.h"
#include "cam_hw_intf.h" #include "cam_hw_intf.h"
#include "cam_cdm_intf_api.h"
/* Maximum length of tag while dumping */ /* Maximum length of tag while dumping */
#define CAM_ISP_HW_DUMP_TAG_MAX_LEN 32 #define CAM_ISP_HW_DUMP_TAG_MAX_LEN 32
@@ -273,12 +274,14 @@ struct cam_isp_hw_get_res_for_mid {
* *
* @res: Resource node * @res: Resource node
* @cmd_type: Command type for which to get update * @cmd_type: Command type for which to get update
* @cdm_id : CDM id
* @cmd: Command buffer information * @cmd: Command buffer information
* *
*/ */
struct cam_isp_hw_get_cmd_update { struct cam_isp_hw_get_cmd_update {
struct cam_isp_resource_node *res; struct cam_isp_resource_node *res;
enum cam_isp_hw_cmd_type cmd_type; enum cam_isp_hw_cmd_type cmd_type;
enum cam_cdm_id cdm_id;
struct cam_isp_hw_cmd_buf_update cmd; struct cam_isp_hw_cmd_buf_update cmd;
union { union {
void *data; void *data;

View File

@@ -14,6 +14,7 @@
#define CAM_VFE_HW_NUM_MAX 7 #define CAM_VFE_HW_NUM_MAX 7
#define VFE_CORE_BASE_IDX 0 #define VFE_CORE_BASE_IDX 0
#define RT_BASE_IDX 2
/* /*
* VBIF and BUS do not exist on same HW. * VBIF and BUS do not exist on same HW.
* Hence both can be 1 below. * Hence both can be 1 below.