msm: camera: cdm: Correct the CDM iommu handle

Correct the CDM iommu handler by changing the
false pid and mid values written in the cdm
header file. Also, adding a support to read the
pid and mid from the dtsi file, since there is
already support for the PID values available in the
dtsi.

CRs-fixed: 2982542
Change-Id: I319a32fdcba44a6a96b79e4e67b0a2cc0e01bc4c
Signed-off-by: Jigar Agrawal <jigar@codeaurora.org>
This commit is contained in:
Jigar Agrawal
2021-07-01 11:35:10 -07:00
committed by Gerrit - the friendly Code Review server
parent 02f11b69c4
commit 42d92dea61
4 changed files with 28 additions and 33 deletions

View File

@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/* /*
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
*/ */
#ifndef _CAM_CDM_H_ #ifndef _CAM_CDM_H_
@@ -132,14 +132,6 @@
CAM_CDM_IRQ_STATUS_ERROR_OVER_FLOW_MASK | \ CAM_CDM_IRQ_STATUS_ERROR_OVER_FLOW_MASK | \
CAM_CDM_IRQ_STATUS_ERROR_AHB_BUS_MASK) CAM_CDM_IRQ_STATUS_ERROR_AHB_BUS_MASK)
struct cam_cdm_pid_mid_data {
int cdm_pid;
int cdm_mid;
int ope_cdm_pid;
int ope_cdm_mid;
};
/* Structure to store hw version info */ /* Structure to store hw version info */
struct cam_version_reg { struct cam_version_reg {
uint32_t hw_version; uint32_t hw_version;
@@ -383,7 +375,6 @@ struct cam_cdm_common_regs {
const struct cam_cdm_icl_regs *icl_reg; const struct cam_cdm_icl_regs *icl_reg;
uint32_t spare; uint32_t spare;
uint32_t priority_group_bit_offset; uint32_t priority_group_bit_offset;
struct cam_cdm_pid_mid_data *cdm_pid_mid_info;
}; };
/** /**
@@ -570,6 +561,8 @@ struct cam_cdm_private_dt_data {
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;
uint32_t pid;
uint32_t mid;
const char *dt_cdm_client_name[CAM_PER_CDM_MAX_REGISTERED_CLIENTS]; const char *dt_cdm_client_name[CAM_PER_CDM_MAX_REGISTERED_CLIENTS];
}; };

View File

@@ -737,6 +737,10 @@ bool cam_hw_cdm_bl_write(
{ {
struct cam_cdm *cdm_core = (struct cam_cdm *)cdm_hw->core_info; struct cam_cdm *cdm_core = (struct cam_cdm *)cdm_hw->core_info;
CAM_DBG(CAM_CDM, "%s%d Base: 0x%x, Len: %u, Tag: %u, set_arb: %u, fifo_idx: %u",
cdm_hw->soc_info.label_name, cdm_hw->soc_info.index,
src, len, tag, set_arb, fifo_idx);
if (cam_cdm_write_hw_reg(cdm_hw, if (cam_cdm_write_hw_reg(cdm_hw,
cdm_core->offsets->bl_fifo_reg[fifo_idx]->bl_fifo_base, cdm_core->offsets->bl_fifo_reg[fifo_idx]->bl_fifo_base,
src)) { src)) {
@@ -1487,25 +1491,24 @@ static void cam_hw_cdm_iommu_fault_handler(struct cam_smmu_pf_info *pf_info)
{ {
struct cam_hw_info *cdm_hw = NULL; struct cam_hw_info *cdm_hw = NULL;
struct cam_cdm *core = NULL; struct cam_cdm *core = NULL;
struct cam_cdm_pid_mid_data *pid_mid_info = NULL; struct cam_cdm_private_dt_data *pvt_data;
int i; int i;
if (!pf_info) {
CAM_ERR(CAM_CDM, "pf_info is null");
return;
}
if (pf_info->token) { if (pf_info->token) {
cdm_hw = (struct cam_hw_info *)pf_info->token; cdm_hw = (struct cam_hw_info *)pf_info->token;
core = (struct cam_cdm *)cdm_hw->core_info; core = (struct cam_cdm *)cdm_hw->core_info;
pid_mid_info = core->offsets->cmn_reg->cdm_pid_mid_info; pvt_data = (struct cam_cdm_private_dt_data *) cdm_hw->soc_info.soc_private;
CAM_ERR_RATE_LIMIT(CAM_CDM, "Page fault iova addr %pK\n", CAM_ERR_RATE_LIMIT(CAM_CDM, "Page fault iova addr %pK\n",
(void *)pf_info->iova); (void *)pf_info->iova);
if (pid_mid_info) { /* Check if the PID and MID are valid, if not handle the pf */
/* if ((pvt_data->pid >= 0) && (pvt_data->mid >= 0)) {
* If its CDM or OPE CDM then only handle the pf for CDM if (((pf_info->pid == pvt_data->pid) && (pf_info->mid == pvt_data->mid)))
* else return.
*/
if (((pf_info->pid == pid_mid_info->cdm_pid) &&
(pf_info->mid == pid_mid_info->cdm_mid)) ||
((pf_info->pid == pid_mid_info->ope_cdm_pid) &&
(pf_info->mid == pid_mid_info->ope_cdm_mid)))
goto handle_cdm_pf; goto handle_cdm_pf;
else else
return; return;

View File

@@ -1,17 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/* /*
* Copyright (c) 2020, The Linux Foundation. All rights reserved. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
*/ */
#include "cam_cdm.h" #include "cam_cdm.h"
struct cam_cdm_pid_mid_data cdm_hw_2_1_pid_mid_data = {
.cdm_pid = 2,
.cdm_mid = 0,
.ope_cdm_pid = 0,
.ope_cdm_mid = 2,
};
struct cam_cdm_bl_pending_req_reg_params cdm_hw_2_1_bl_pending_req0 = { struct cam_cdm_bl_pending_req_reg_params cdm_hw_2_1_bl_pending_req0 = {
.rb_offset = 0x6c, .rb_offset = 0x6c,
.rb_mask = 0x1ff, .rb_mask = 0x1ff,
@@ -233,7 +226,6 @@ static struct cam_cdm_common_regs cdm_hw_2_1_cmn_reg_offset = {
.icl_reg = &cdm_2_1_icl, .icl_reg = &cdm_2_1_icl,
.spare = 0x3fc, .spare = 0x3fc,
.priority_group_bit_offset = 20, .priority_group_bit_offset = 20,
.cdm_pid_mid_info = &cdm_hw_2_1_pid_mid_data,
}; };
static struct cam_cdm_common_reg_data cdm_hw_2_1_cmn_reg_data = { static struct cam_cdm_common_reg_data cdm_hw_2_1_cmn_reg_data = {

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
/* /*
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
*/ */
#include <linux/delay.h> #include <linux/delay.h>
@@ -115,8 +115,15 @@ int cam_cdm_soc_load_dt_private(struct platform_device *pdev,
} }
cdm_pvt_data->is_single_ctx_cdm = cdm_pvt_data->is_single_ctx_cdm =
of_property_read_bool(pdev->dev.of_node, of_property_read_bool(pdev->dev.of_node, "single-context-cdm");
"single-context-cdm");
rc = of_property_read_u32(pdev->dev.of_node, "cam_hw_pid", &cdm_pvt_data->pid);
if (rc)
cdm_pvt_data->pid = -1;
rc = of_property_read_u32(pdev->dev.of_node, "cam-hw-mid", &cdm_pvt_data->mid);
if (rc)
cdm_pvt_data->mid = -1;
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);