|
@@ -1,7 +1,7 @@
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
/*
|
|
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
|
|
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
*/
|
|
|
|
|
|
#include <media/cam_defs.h>
|
|
@@ -767,8 +767,8 @@ static int cam_isp_io_buf_get_entries_util(
|
|
|
&buf_info->scratch_check_cfg->ife_scratch_res_info,
|
|
|
io_cfg->resource_type);
|
|
|
}
|
|
|
-
|
|
|
*hw_mgr_res = &buf_info->res_list_isp_out[buf_info->out_map[res_id]];
|
|
|
+
|
|
|
if ((*hw_mgr_res)->res_type == CAM_ISP_RESOURCE_UNINT) {
|
|
|
CAM_ERR(CAM_ISP, "io res id:%d not valid",
|
|
|
io_cfg->resource_type);
|
|
@@ -1220,13 +1220,14 @@ int cam_isp_add_io_buffers(struct cam_isp_io_buf_info *io_info)
|
|
|
}
|
|
|
|
|
|
disabled_wm_mask = (prepare_hw_data->wm_bitmask ^ cfg_io_mask);
|
|
|
+
|
|
|
if ((io_info->base->hw_type == CAM_ISP_HW_TYPE_TFE) && disabled_wm_mask) {
|
|
|
for (j = 0; j < io_info->out_max; j++) {
|
|
|
rc = cam_isp_add_disable_wm_update(io_info->prepare,
|
|
|
- &io_info->res_list_isp_out[j],
|
|
|
+ &io_info->res_list_isp_out[io_info->out_map[j]],
|
|
|
io_info->base->idx, io_info->kmd_buf_info,
|
|
|
- disabled_wm_mask,
|
|
|
- &io_info->kmd_buf_info->used_bytes);
|
|
|
+ &disabled_wm_mask,
|
|
|
+ io_info);
|
|
|
if (rc) {
|
|
|
CAM_ERR_RATE_LIMIT(CAM_ISP, "Disable out res %d failed",
|
|
|
j, rc);
|
|
@@ -1263,8 +1264,8 @@ int cam_isp_add_disable_wm_update(
|
|
|
struct cam_isp_hw_mgr_res *isp_hw_res,
|
|
|
uint32_t base_idx,
|
|
|
struct cam_kmd_buf_info *kmd_buf_info,
|
|
|
- uint64_t wm_mask,
|
|
|
- uint32_t *io_cfg_used_bytes)
|
|
|
+ uint64_t *wm_mask,
|
|
|
+ struct cam_isp_io_buf_info *io_info)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
struct cam_hw_intf *hw_intf;
|
|
@@ -1281,23 +1282,25 @@ int cam_isp_add_disable_wm_update(
|
|
|
res = isp_hw_res->hw_res[i];
|
|
|
if (res->hw_intf->hw_idx != base_idx)
|
|
|
continue;
|
|
|
- if (!(wm_mask & (1 << res->res_id))) {
|
|
|
+ if (!(*wm_mask & (1 << res->res_id))) {
|
|
|
CAM_DBG(CAM_ISP, "No need to disable out res %d", res->res_id);
|
|
|
continue;
|
|
|
}
|
|
|
- if (kmd_buf_info->size > (kmd_buf_info->used_bytes +
|
|
|
- (*io_cfg_used_bytes))) {
|
|
|
- kmd_buf_remain_size = kmd_buf_info->size -
|
|
|
- (kmd_buf_info->used_bytes +
|
|
|
- (*io_cfg_used_bytes));
|
|
|
+
|
|
|
+ *wm_mask &= ~BIT(res->res_id);
|
|
|
+
|
|
|
+ if (kmd_buf_info->used_bytes < kmd_buf_info->size) {
|
|
|
+ kmd_buf_remain_size = kmd_buf_info->size - kmd_buf_info->used_bytes;
|
|
|
} else {
|
|
|
- CAM_ERR(CAM_ISP, "no free mem %d %d", kmd_buf_info->size,
|
|
|
- kmd_buf_info->used_bytes + (*io_cfg_used_bytes));
|
|
|
- rc = -EINVAL;
|
|
|
- return rc;
|
|
|
+ CAM_ERR(CAM_ISP,
|
|
|
+ "no free kmd memory for base=%d bytes_used=%u buf_size=%u",
|
|
|
+ base_idx, kmd_buf_info->used_bytes, kmd_buf_info->size);
|
|
|
+ rc = -EINVAL;
|
|
|
+ return rc;
|
|
|
}
|
|
|
+
|
|
|
wm_update.cmd.cmd_buf_addr = kmd_buf_info->cpu_addr +
|
|
|
- kmd_buf_info->used_bytes/4 + (*io_cfg_used_bytes)/4;
|
|
|
+ kmd_buf_info->used_bytes/4;
|
|
|
wm_update.cmd.size = kmd_buf_remain_size;
|
|
|
wm_update.cmd_type = CAM_ISP_HW_CMD_BUS_WM_DISABLE;
|
|
|
wm_update.res = res;
|
|
@@ -1311,9 +1314,11 @@ int cam_isp_add_disable_wm_update(
|
|
|
return rc;
|
|
|
}
|
|
|
CAM_DBG(CAM_ISP,
|
|
|
- "Out res %d disable update added hw_id %d cdm_idx %d",
|
|
|
- res->res_id, res->hw_intf->hw_idx, base_idx);
|
|
|
- (*io_cfg_used_bytes) += wm_update.cmd.used_bytes;
|
|
|
+ "Out res %d disable update added hw_id %d cdm_idx %d split id: %d",
|
|
|
+ res->res_id, res->hw_intf->hw_idx, base_idx, i);
|
|
|
+
|
|
|
+ io_info->kmd_buf_info->used_bytes += wm_update.cmd.used_bytes;
|
|
|
+ io_info->kmd_buf_info->offset += wm_update.cmd.used_bytes;
|
|
|
}
|
|
|
return rc;
|
|
|
}
|