msm: camera: icp: Multiple ICPs Log Enhancement
Modifying the info/error/dbg logs in hw mgr, context and hfi layers to spit out relevant info to determine which ICP device is running the execution. Change type defination of hw_dev_type to enum in local instances in functions and the field of hw ctx struct. CRs-Fixed: 3361905 Change-Id: Ib50208eaf243c50678d07845461c750b36d19bf9 Signed-off-by: Petar Ivanov <quic_pivanov@quicinc.com> Signed-off-by: Sokchetra Eung <quic_eung@quicinc.com>
This commit is contained in:

committed by
Camera Software Integration

parent
92e59f3c6a
commit
5614df0d47
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
@@ -37,18 +37,18 @@ static int cam_icp_context_dump_active_request(void *data, void *args)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAM_INFO(CAM_ICP, "iommu fault for icp ctx %d state %d",
|
CAM_INFO(CAM_ICP, "[%s] iommu fault for icp ctx %d state %d",
|
||||||
ctx->ctx_id, ctx->state);
|
ctx->dev_name, ctx->ctx_id, ctx->state);
|
||||||
|
|
||||||
list_for_each_entry_safe(req, req_temp,
|
list_for_each_entry_safe(req, req_temp,
|
||||||
&ctx->active_req_list, list) {
|
&ctx->active_req_list, list) {
|
||||||
CAM_INFO(CAM_ICP, "Active req_id: %llu ctx_id: %u",
|
CAM_INFO(CAM_ICP, "[%s] ctx[%u]: Active req_id: %llu",
|
||||||
req->request_id, ctx->ctx_id);
|
ctx->dev_name, ctx->ctx_id, req->request_id);
|
||||||
|
|
||||||
rc = cam_context_dump_pf_info_to_hw(ctx, pf_args, &req->pf_data);
|
rc = cam_context_dump_pf_info_to_hw(ctx, pf_args, &req->pf_data);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Failed to dump pf info ctx_id: %u state: %d",
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Failed to dump pf info.ctx->state: %d",
|
||||||
ctx->ctx_id, ctx->state);
|
ctx->dev_name, ctx->ctx_id, ctx->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -61,7 +61,8 @@ static int cam_icp_context_dump_active_request(void *data, void *args)
|
|||||||
rc = cam_context_send_pf_evt(ctx, pf_args);
|
rc = cam_context_send_pf_evt(ctx, pf_args);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP,
|
CAM_ERR(CAM_ICP,
|
||||||
"Failed to notify PF event to userspace rc: %d", rc);
|
"[%s] ctx[%u]: Failed to notify PF event to userspace rc: %d",
|
||||||
|
ctx->dev_name, ctx->ctx_id, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -80,8 +81,8 @@ static int cam_icp_context_mini_dump(void *priv, void *args)
|
|||||||
ctx = (struct cam_context *)priv;
|
ctx = (struct cam_context *)priv;
|
||||||
rc = cam_context_mini_dump(ctx, args);
|
rc = cam_context_mini_dump(ctx, args);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "ctx [id: %u name: %s] Mini Dump failed rc %d", ctx->dev_name,
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Mini Dump failed rc %d",
|
||||||
ctx->ctx_id, rc);
|
ctx->dev_name, ctx->ctx_id, rc);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -94,7 +95,7 @@ static int __cam_icp_acquire_dev_in_available(struct cam_context *ctx,
|
|||||||
rc = cam_context_acquire_dev_to_hw(ctx, cmd);
|
rc = cam_context_acquire_dev_to_hw(ctx, cmd);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
ctx->state = CAM_CTX_ACQUIRED;
|
ctx->state = CAM_CTX_ACQUIRED;
|
||||||
trace_cam_context_state("ICP", ctx);
|
trace_cam_context_state(ctx->dev_name, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -109,10 +110,11 @@ static int __cam_icp_release_dev_in_acquired(struct cam_context *ctx,
|
|||||||
|
|
||||||
rc = cam_context_release_dev_to_hw(ctx, cmd);
|
rc = cam_context_release_dev_to_hw(ctx, cmd);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Unable to release device");
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Unable to release device",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
|
|
||||||
ctx->state = CAM_CTX_AVAILABLE;
|
ctx->state = CAM_CTX_AVAILABLE;
|
||||||
trace_cam_context_state("ICP", ctx);
|
trace_cam_context_state(ctx->dev_name, ctx);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +126,7 @@ static int __cam_icp_start_dev_in_acquired(struct cam_context *ctx,
|
|||||||
rc = cam_context_start_dev_to_hw(ctx, cmd);
|
rc = cam_context_start_dev_to_hw(ctx, cmd);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
ctx->state = CAM_CTX_READY;
|
ctx->state = CAM_CTX_READY;
|
||||||
trace_cam_context_state("ICP", ctx);
|
trace_cam_context_state(ctx->dev_name, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -138,7 +140,8 @@ static int __cam_icp_dump_dev_in_ready(
|
|||||||
|
|
||||||
rc = cam_context_dump_dev_to_hw(ctx, cmd);
|
rc = cam_context_dump_dev_to_hw(ctx, cmd);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Failed to dump device");
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Failed to dump device",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -150,7 +153,8 @@ static int __cam_icp_flush_dev_in_ready(struct cam_context *ctx,
|
|||||||
|
|
||||||
rc = cam_context_flush_dev_to_hw(ctx, cmd);
|
rc = cam_context_flush_dev_to_hw(ctx, cmd);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Failed to flush device");
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Failed to flush device",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -177,7 +181,8 @@ static int __cam_icp_config_dev_in_ready(struct cam_context *ctx,
|
|||||||
if ((len < sizeof(struct cam_packet)) ||
|
if ((len < sizeof(struct cam_packet)) ||
|
||||||
(cmd->offset >= (len - sizeof(struct cam_packet)))) {
|
(cmd->offset >= (len - sizeof(struct cam_packet)))) {
|
||||||
CAM_ERR(CAM_CTXT,
|
CAM_ERR(CAM_CTXT,
|
||||||
"Invalid offset, len: %zu cmd offset: %llu sizeof packet: %zu",
|
"[%s] ctx[%u]: Invalid offset, len: %zu cmd offset: %llu sizeof packet: %zu",
|
||||||
|
ctx->dev_name, ctx->ctx_id,
|
||||||
len, cmd->offset, sizeof(struct cam_packet));
|
len, cmd->offset, sizeof(struct cam_packet));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@@ -188,7 +193,8 @@ static int __cam_icp_config_dev_in_ready(struct cam_context *ctx,
|
|||||||
|
|
||||||
rc = cam_packet_util_validate_packet(packet, remain_len);
|
rc = cam_packet_util_validate_packet(packet, remain_len);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
CAM_ERR(CAM_CTXT, "Invalid packet params, remain length: %zu",
|
CAM_ERR(CAM_CTXT, "[%s] ctx[%u]: Invalid packet params, remain length: %zu",
|
||||||
|
ctx->dev_name, ctx->ctx_id,
|
||||||
remain_len);
|
remain_len);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -204,7 +210,8 @@ static int __cam_icp_config_dev_in_ready(struct cam_context *ctx,
|
|||||||
rc = cam_context_prepare_dev_to_hw(ctx, cmd);
|
rc = cam_context_prepare_dev_to_hw(ctx, cmd);
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Failed to prepare device");
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]:Failed to prepare device",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -216,10 +223,11 @@ static int __cam_icp_stop_dev_in_ready(struct cam_context *ctx,
|
|||||||
|
|
||||||
rc = cam_context_stop_dev_to_hw(ctx);
|
rc = cam_context_stop_dev_to_hw(ctx);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Failed to stop device");
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Failed to stop device",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
|
|
||||||
ctx->state = CAM_CTX_ACQUIRED;
|
ctx->state = CAM_CTX_ACQUIRED;
|
||||||
trace_cam_context_state("ICP", ctx);
|
trace_cam_context_state(ctx->dev_name, ctx);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +238,8 @@ static int __cam_icp_release_dev_in_ready(struct cam_context *ctx,
|
|||||||
|
|
||||||
rc = __cam_icp_stop_dev_in_ready(ctx, NULL);
|
rc = __cam_icp_stop_dev_in_ready(ctx, NULL);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP, "Failed to stop device");
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Failed to stop device",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
|
|
||||||
rc = __cam_icp_release_dev_in_acquired(ctx, cmd);
|
rc = __cam_icp_release_dev_in_acquired(ctx, cmd);
|
||||||
if (rc)
|
if (rc)
|
||||||
@@ -239,7 +248,7 @@ static int __cam_icp_release_dev_in_ready(struct cam_context *ctx,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t get_error_code(uint32_t err_type)
|
static uint32_t cam_icp_context_get_error_code(uint32_t err_type)
|
||||||
{
|
{
|
||||||
switch (err_type) {
|
switch (err_type) {
|
||||||
case CAM_ICP_HW_ERROR_NO_MEM:
|
case CAM_ICP_HW_ERROR_NO_MEM:
|
||||||
@@ -269,12 +278,11 @@ static int __cam_icp_notify_v4l2_err_evt(struct cam_context *ctx,
|
|||||||
V4L_EVENT_CAM_REQ_MGR_EVENT);
|
V4L_EVENT_CAM_REQ_MGR_EVENT);
|
||||||
if (rc)
|
if (rc)
|
||||||
CAM_ERR(CAM_ICP,
|
CAM_ERR(CAM_ICP,
|
||||||
"Error in notifying the error time for req id:%lld ctx %u",
|
"[%s] ctx[%u]: Error in notifying the error time for req id:%lld",
|
||||||
request_id,
|
ctx->dev_name, ctx->ctx_id, request_id);
|
||||||
ctx->ctx_id);
|
|
||||||
|
|
||||||
CAM_INFO(CAM_ICP,
|
CAM_INFO(CAM_ICP,
|
||||||
"CTX: [%s][%d] notifying error to userspace err type: %d, err code: %u, req id: %llu",
|
"[%s] ctx[%u]: notifying error to userspace err type: %d, err code: %u, req id: %llu",
|
||||||
ctx->dev_name, ctx->ctx_id, err_type, err_code, request_id);
|
ctx->dev_name, ctx->ctx_id, err_type, err_code, request_id);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -287,7 +295,7 @@ static int cam_icp_ctx_handle_fatal_error(void *ctx, void *err_evt_data)
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
err_evt = (struct cam_icp_hw_error_evt_data *)err_evt_data;
|
err_evt = (struct cam_icp_hw_error_evt_data *)err_evt_data;
|
||||||
err_code = get_error_code(err_evt->err_type);
|
err_code = cam_icp_context_get_error_code(err_evt->err_type);
|
||||||
|
|
||||||
rc = __cam_icp_notify_v4l2_err_evt(ctx, CAM_REQ_MGR_ERROR_TYPE_RECOVERY,
|
rc = __cam_icp_notify_v4l2_err_evt(ctx, CAM_REQ_MGR_ERROR_TYPE_RECOVERY,
|
||||||
err_code, err_evt->req_id);
|
err_code, err_evt->req_id);
|
||||||
@@ -358,16 +366,16 @@ static int cam_icp_context_validate_event_notify_injection(struct cam_context *c
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CAM_ERR(CAM_ICP,
|
CAM_ERR(CAM_ICP,
|
||||||
"Invalid error type: %u for error event injection err code: %u req id: %llu ctx id: %u dev hdl: %d",
|
"[%s] ctx[%u]: Invalid error type: %u for error event injection err code: %u req id: %llu dev hdl: %d",
|
||||||
err_evt_params->err_type, err_evt_params->err_code,
|
ctx->dev_name, ctx->ctx_id, err_evt_params->err_type,
|
||||||
req_id, ctx->ctx_id, ctx->dev_hdl);
|
err_evt_params->err_code, ctx->dev_hdl);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAM_INFO(CAM_ICP,
|
CAM_INFO(CAM_ICP,
|
||||||
"Inject ERR evt: err code: %u err type: %u req id: %llu ctx id: %u dev hdl: %d",
|
"[%s] ctx[%u]: Inject ERR evt: err code: %u err type: %u req id: %llu dev hdl: %d",
|
||||||
err_evt_params->err_code, err_evt_params->err_type,
|
ctx->dev_name, ctx->ctx_id, err_evt_params->err_code,
|
||||||
req_id, ctx->ctx_id, ctx->dev_hdl);
|
err_evt_params->err_type, req_id, ctx->dev_hdl);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case V4L_EVENT_CAM_REQ_MGR_PF_ERROR: {
|
case V4L_EVENT_CAM_REQ_MGR_PF_ERROR: {
|
||||||
@@ -378,24 +386,27 @@ static int cam_icp_context_validate_event_notify_injection(struct cam_context *c
|
|||||||
rc = cam_smmu_is_cb_non_fatal_fault_en(ctx->img_iommu_hdl, &non_fatal_en);
|
rc = cam_smmu_is_cb_non_fatal_fault_en(ctx->img_iommu_hdl, &non_fatal_en);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
CAM_ERR(CAM_ICP,
|
CAM_ERR(CAM_ICP,
|
||||||
"Fail to query whether device's cb has non-fatal enabled rc: %d",
|
"[%s] ctx[%u]: Fail to query whether device's cb has non-fatal enabled rc: %d",
|
||||||
rc);
|
ctx->dev_name, ctx->ctx_id, rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!non_fatal_en) {
|
if (!non_fatal_en) {
|
||||||
CAM_ERR(CAM_ICP,
|
CAM_ERR(CAM_ICP,
|
||||||
"Fail to inject page fault event notification. Page fault is fatal for ICP");
|
"[%s] ctx[%u]: Fail to inject page fault event notification. Page fault is fatal for ICP",
|
||||||
|
ctx->dev_name, ctx->ctx_id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAM_INFO(CAM_ICP,
|
CAM_INFO(CAM_ICP,
|
||||||
"Inject PF evt: req_id: %llu ctx id: %u dev hdl: %d ctx found: %hhu",
|
"[%s] ctx[%u]: Inject PF evt: req_id: %llu dev hdl: %d ctx found: %hhu",
|
||||||
req_id, ctx->ctx_id, ctx->dev_hdl, pf_evt_params->ctx_found);
|
ctx->dev_name, ctx->ctx_id,
|
||||||
|
req_id, ctx->dev_hdl, pf_evt_params->ctx_found);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
CAM_ERR(CAM_ICP, "Event notification type not supported: %u", evt_type);
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Event notification type not supported: %u",
|
||||||
|
ctx->dev_name, ctx->ctx_id, evt_type);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -422,18 +433,21 @@ static int cam_icp_context_inject_evt(void *context, void *evt_args)
|
|||||||
buf_err_params = &evt_params->u.buf_err_evt;
|
buf_err_params = &evt_params->u.buf_err_evt;
|
||||||
if (buf_err_params->sync_error > CAM_SYNC_ICP_EVENT_START ||
|
if (buf_err_params->sync_error > CAM_SYNC_ICP_EVENT_START ||
|
||||||
buf_err_params->sync_error < CAM_SYNC_ICP_EVENT_END) {
|
buf_err_params->sync_error < CAM_SYNC_ICP_EVENT_END) {
|
||||||
CAM_INFO(CAM_ICP, "Inject buffer sync error %u ctx id: %u req id %llu",
|
CAM_INFO(CAM_ICP, "[%s] ctx[%u]: Inject buffer sync error %u req id %llu",
|
||||||
buf_err_params->sync_error, ctx->ctx_id, evt_params->req_id);
|
ctx->dev_name, ctx->ctx_id, buf_err_params->sync_error,
|
||||||
|
evt_params->req_id);
|
||||||
} else {
|
} else {
|
||||||
CAM_ERR(CAM_ICP, "Invalid buffer sync error %u ctx id: %u req id %llu",
|
CAM_ERR(CAM_ICP, "[%s] ctx[%u]: Invalid buffer sync error %u req id %llu",
|
||||||
buf_err_params->sync_error, ctx->ctx_id, evt_params->req_id);
|
ctx->dev_name, ctx->ctx_id, buf_err_params->sync_error,
|
||||||
|
evt_params->req_id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rc = cam_icp_context_validate_event_notify_injection(ctx, evt_params);
|
rc = cam_icp_context_validate_event_notify_injection(ctx, evt_params);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
CAM_ERR(CAM_ICP,
|
CAM_ERR(CAM_ICP,
|
||||||
"Event notification injection failed validation rc: %d", rc);
|
"[%s] ctx[%u]: Event notification injection failed validation rc: %d",
|
||||||
|
ctx->dev_name, ctx->ctx_id, rc);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -523,7 +537,7 @@ int cam_icp_context_init(struct cam_icp_context *ctx, struct cam_hw_mgr_intf *hw
|
|||||||
rc = cam_context_init(ctx->base, icp_dev_name, CAM_ICP, ctx_id,
|
rc = cam_context_init(ctx->base, icp_dev_name, CAM_ICP, ctx_id,
|
||||||
NULL, hw_intf, ctx->req_base, CAM_CTX_ICP_REQ_MAX, img_iommu_hdl);
|
NULL, hw_intf, ctx->req_base, CAM_CTX_ICP_REQ_MAX, img_iommu_hdl);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
CAM_ERR(CAM_ICP, "Camera Context Base init failed");
|
CAM_ERR(CAM_ICP, "[%s] Camera Context Base init failed", icp_dev_name);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _HFI_INTF_H_
|
#ifndef _HFI_INTF_H_
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
#define HFI_NUM_MAX 2
|
#define HFI_NUM_MAX 2
|
||||||
#define HFI_HANDLE_INIT_VALUE HFI_NUM_MAX
|
#define HFI_HANDLE_INIT_VALUE HFI_NUM_MAX
|
||||||
|
|
||||||
|
#define HFI_CLIENT_NAME_LEN 32
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct hfi_mem
|
* struct hfi_mem
|
||||||
* @len: length of memory
|
* @len: length of memory
|
||||||
@@ -122,10 +124,11 @@ int cam_hfi_init(int client_handle, struct hfi_mem_info *hfi_mem,
|
|||||||
/**
|
/**
|
||||||
* cam_hfi_register() - function to register user as hfi client and retrieve handle
|
* cam_hfi_register() - function to register user as hfi client and retrieve handle
|
||||||
* @client_handle: client handle to be retrieved
|
* @client_handle: client handle to be retrieved
|
||||||
|
* @client_name: Name of the client to be registered
|
||||||
*
|
*
|
||||||
* Returns success(zero)/failure(non zero)
|
* Returns success(zero)/failure(non zero)
|
||||||
*/
|
*/
|
||||||
int cam_hfi_register(int *client_handle);
|
int cam_hfi_register(int *client_handle, const char *client_name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cam_hfi_unregister() - function to unregister hfi client
|
* cam_hfi_unregister() - function to unregister hfi client
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CAM_HFI_REG_H_
|
#ifndef _CAM_HFI_REG_H_
|
||||||
@@ -283,6 +283,7 @@ struct hfi_qtbl {
|
|||||||
* @msg_q_state: State of message queue
|
* @msg_q_state: State of message queue
|
||||||
* @priv: device private data
|
* @priv: device private data
|
||||||
* @dbg_lvl: debug level set to FW
|
* @dbg_lvl: debug level set to FW
|
||||||
|
* @client_name: hfi client's name
|
||||||
*/
|
*/
|
||||||
struct hfi_info {
|
struct hfi_info {
|
||||||
struct hfi_mem_info map;
|
struct hfi_mem_info map;
|
||||||
@@ -297,6 +298,7 @@ struct hfi_info {
|
|||||||
bool msg_q_state;
|
bool msg_q_state;
|
||||||
void *priv;
|
void *priv;
|
||||||
u64 dbg_lvl;
|
u64 dbg_lvl;
|
||||||
|
char client_name[HFI_CLIENT_NAME_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _CAM_HFI_REG_H_ */
|
#endif /* _CAM_HFI_REG_H_ */
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
@@ -87,8 +87,8 @@ static inline int hfi_get_client_info(int client_handle, struct hfi_info **hfi)
|
|||||||
|
|
||||||
*hfi = g_hfi.hfi[idx];
|
*hfi = g_hfi.hfi[idx];
|
||||||
if (!g_hfi.hfi[idx]) {
|
if (!g_hfi.hfi[idx]) {
|
||||||
CAM_ERR(CAM_HFI, "HFI interface not setup for client hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] HFI interface not setup for client hdl: %d",
|
||||||
client_handle);
|
g_hfi.hfi[idx]->client_name, client_handle);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,8 +137,8 @@ void cam_hfi_mini_dump(int client_handle, struct hfi_mini_dump_info *dst)
|
|||||||
|
|
||||||
hfi_mem = &hfi->map;
|
hfi_mem = &hfi->map;
|
||||||
if (!hfi_mem) {
|
if (!hfi_mem) {
|
||||||
CAM_ERR(CAM_HFI, "hfi mem info NULL... unable to dump queues for hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] hfi mem info NULL... unable to dump queues for hdl: %d",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,25 +165,23 @@ void cam_hfi_queue_dump(int client_handle, bool dump_queue_data)
|
|||||||
|
|
||||||
rc = hfi_get_client_info(client_handle, &hfi);
|
rc = hfi_get_client_info(client_handle, &hfi);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
CAM_ERR(CAM_HFI, "Failed to get hfi info rc: %d for hdl: %d",
|
CAM_ERR(CAM_HFI, "Failed to get hfi info rc:%d for hdl:%d",
|
||||||
rc, client_handle);
|
rc, client_handle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hfi_mem = &hfi->map;
|
hfi_mem = &hfi->map;
|
||||||
if (!hfi_mem) {
|
if (!hfi_mem) {
|
||||||
CAM_ERR(CAM_HFI, "mem info NULL... unable to dump queues for hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] mem info NULL... unable to dump queues for hdl: %d",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qtbl = (struct hfi_qtbl *)hfi_mem->qtbl.kva;
|
qtbl = (struct hfi_qtbl *)hfi_mem->qtbl.kva;
|
||||||
CAM_INFO(CAM_HFI,
|
CAM_INFO(CAM_HFI,
|
||||||
"hfi hdl: %u qtbl header: version=0x%08x tbl_size=%u numq=%u qhdr_size=%u",
|
"[%s] hfi hdl: %u qtbl header: version=0x%08x tbl_size=%u numq=%u qhdr_size=%u",
|
||||||
client_handle,
|
hfi->client_name, client_handle, qtbl->q_tbl_hdr.qtbl_version,
|
||||||
qtbl->q_tbl_hdr.qtbl_version,
|
qtbl->q_tbl_hdr.qtbl_size, qtbl->q_tbl_hdr.qtbl_num_q,
|
||||||
qtbl->q_tbl_hdr.qtbl_size,
|
|
||||||
qtbl->q_tbl_hdr.qtbl_num_q,
|
|
||||||
qtbl->q_tbl_hdr.qtbl_qhdr_size);
|
qtbl->q_tbl_hdr.qtbl_qhdr_size);
|
||||||
|
|
||||||
q_hdr = &qtbl->q_hdr[Q_CMD];
|
q_hdr = &qtbl->q_hdr[Q_CMD];
|
||||||
@@ -233,16 +231,17 @@ int hfi_write_cmd(int client_handle, void *cmd_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!cmd_ptr) {
|
if (!cmd_ptr) {
|
||||||
CAM_ERR(CAM_HFI, "command is null for hfi hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] command is null for hfi hdl: %d",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&hfi->cmd_q_lock);
|
mutex_lock(&hfi->cmd_q_lock);
|
||||||
if (hfi->hfi_state != HFI_READY ||
|
if (hfi->hfi_state != HFI_READY ||
|
||||||
!hfi->cmd_q_state) {
|
!hfi->cmd_q_state) {
|
||||||
CAM_ERR(CAM_HFI, "Invalid hfi state: %u cmd q state: %u hfi hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid hfi state: %u cmd q state: %u hfi hdl: %d",
|
||||||
hfi->hfi_state, hfi->cmd_q_state, client_handle);
|
hfi->client_name, hfi->hfi_state,
|
||||||
|
hfi->cmd_q_state, client_handle);
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -254,7 +253,8 @@ int hfi_write_cmd(int client_handle, void *cmd_ptr)
|
|||||||
|
|
||||||
size_in_words = (*(uint32_t *)cmd_ptr) >> BYTE_WORD_SHIFT;
|
size_in_words = (*(uint32_t *)cmd_ptr) >> BYTE_WORD_SHIFT;
|
||||||
if (!size_in_words) {
|
if (!size_in_words) {
|
||||||
CAM_DBG(CAM_HFI, "hfi hdl: %u word size is NULL");
|
CAM_DBG(CAM_HFI, "[%s] hfi hdl: %u word size is NULL",
|
||||||
|
hfi->client_name, client_handle);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -264,8 +264,8 @@ int hfi_write_cmd(int client_handle, void *cmd_ptr)
|
|||||||
(q->qhdr_q_size - (q->qhdr_write_idx - read_idx)) :
|
(q->qhdr_q_size - (q->qhdr_write_idx - read_idx)) :
|
||||||
(read_idx - q->qhdr_write_idx);
|
(read_idx - q->qhdr_write_idx);
|
||||||
if (empty_space <= size_in_words) {
|
if (empty_space <= size_in_words) {
|
||||||
CAM_ERR(CAM_HFI, "hfi hdl: %u failed: empty space %u, size_in_words %u",
|
CAM_ERR(CAM_HFI, "[%s] hfi hdl: %u failed: empty space %u, size_in_words %u",
|
||||||
empty_space, size_in_words);
|
hfi->client_name, client_handle, empty_space, size_in_words);
|
||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -325,20 +325,23 @@ int hfi_read_message(int client_handle, uint32_t *pmsg, uint8_t q_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!pmsg) {
|
if (!pmsg) {
|
||||||
CAM_ERR(CAM_HFI, "client hdl: %d Invalid msg", client_handle);
|
CAM_ERR(CAM_HFI, "[%s] client hdl: %d Invalid msg",
|
||||||
|
hfi->client_name, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!((q_id == Q_MSG) || (q_id == Q_DBG))) {
|
if (!((q_id == Q_MSG) || (q_id == Q_DBG))) {
|
||||||
CAM_ERR(CAM_HFI, "Invalid q :%u", q_id);
|
CAM_ERR(CAM_HFI, "[%s] Invalid q :%u",
|
||||||
|
hfi->client_name, q_id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&hfi->msg_q_lock);
|
mutex_lock(&hfi->msg_q_lock);
|
||||||
if (hfi->hfi_state != HFI_READY ||
|
if (hfi->hfi_state != HFI_READY ||
|
||||||
!hfi->msg_q_state) {
|
!hfi->msg_q_state) {
|
||||||
CAM_ERR(CAM_HFI, "Invalid hfi state:%u msg q state: %u hfi hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid hfi state:%u msg q state: %u hfi hdl: %d",
|
||||||
hfi->hfi_state, hfi->msg_q_state, client_handle);
|
hfi->client_name, hfi->hfi_state, hfi->msg_q_state,
|
||||||
|
client_handle);
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -347,8 +350,9 @@ int hfi_read_message(int client_handle, uint32_t *pmsg, uint8_t q_id,
|
|||||||
q = &q_tbl_ptr->q_hdr[q_id];
|
q = &q_tbl_ptr->q_hdr[q_id];
|
||||||
|
|
||||||
if (q->qhdr_read_idx == q->qhdr_write_idx) {
|
if (q->qhdr_read_idx == q->qhdr_write_idx) {
|
||||||
CAM_DBG(CAM_HFI, "hfi hdl: %d Q not ready, state:%u, r idx:%u, w idx:%u",
|
CAM_DBG(CAM_HFI, "[%s] hfi hdl: %d Q not ready, state:%u, r idx:%u, w idx:%u",
|
||||||
client_handle, hfi->hfi_state, q->qhdr_read_idx, q->qhdr_write_idx);
|
hfi->client_name, client_handle, hfi->hfi_state,
|
||||||
|
q->qhdr_read_idx, q->qhdr_write_idx);
|
||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -371,8 +375,9 @@ int hfi_read_message(int client_handle, uint32_t *pmsg, uint8_t q_id,
|
|||||||
|
|
||||||
if ((size_in_words == 0) ||
|
if ((size_in_words == 0) ||
|
||||||
(size_in_words > size_upper_bound)) {
|
(size_in_words > size_upper_bound)) {
|
||||||
CAM_ERR(CAM_HFI, "Invalid HFI message packet size - 0x%08x hfi hdl:%d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid HFI message packet size - 0x%08x hfi hdl:%d",
|
||||||
size_in_words << BYTE_WORD_SHIFT, client_handle);
|
hfi->client_name, size_in_words << BYTE_WORD_SHIFT,
|
||||||
|
client_handle);
|
||||||
q->qhdr_read_idx = q->qhdr_write_idx;
|
q->qhdr_read_idx = q->qhdr_write_idx;
|
||||||
rc = -EIO;
|
rc = -EIO;
|
||||||
goto err;
|
goto err;
|
||||||
@@ -406,14 +411,23 @@ int hfi_cmd_ubwc_config(int client_handle, uint32_t *ubwc_cfg)
|
|||||||
{
|
{
|
||||||
uint8_t *prop;
|
uint8_t *prop;
|
||||||
struct hfi_cmd_prop *dbg_prop;
|
struct hfi_cmd_prop *dbg_prop;
|
||||||
|
struct hfi_info *hfi;
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
|
int rc;
|
||||||
|
|
||||||
size = sizeof(struct hfi_cmd_prop) +
|
size = sizeof(struct hfi_cmd_prop) +
|
||||||
sizeof(struct hfi_cmd_ubwc_cfg);
|
sizeof(struct hfi_cmd_ubwc_cfg);
|
||||||
|
|
||||||
|
rc = hfi_get_client_info(client_handle, &hfi);
|
||||||
|
if (rc) {
|
||||||
|
CAM_ERR(CAM_HFI, "Failed to get hfi info rc: %d for hdl:%d",
|
||||||
|
rc, client_handle);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
CAM_DBG(CAM_HFI,
|
CAM_DBG(CAM_HFI,
|
||||||
"hfi hdl: %d size of ubwc %u, ubwc_cfg [rd-0x%x,wr-0x%x]",
|
"[%s] hfi hdl: %d size of ubwc %u, ubwc_cfg [rd-0x%x,wr-0x%x]",
|
||||||
client_handle, size, ubwc_cfg[0], ubwc_cfg[1]);
|
hfi->client_name, client_handle, size, ubwc_cfg[0], ubwc_cfg[1]);
|
||||||
|
|
||||||
prop = kzalloc(size, GFP_KERNEL);
|
prop = kzalloc(size, GFP_KERNEL);
|
||||||
if (!prop)
|
if (!prop)
|
||||||
@@ -438,14 +452,24 @@ int hfi_cmd_ubwc_config_ext(int client_handle, uint32_t *ubwc_ipe_cfg,
|
|||||||
{
|
{
|
||||||
uint8_t *prop;
|
uint8_t *prop;
|
||||||
struct hfi_cmd_prop *dbg_prop;
|
struct hfi_cmd_prop *dbg_prop;
|
||||||
|
struct hfi_info *hfi;
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = hfi_get_client_info(client_handle, &hfi);
|
||||||
|
if (rc) {
|
||||||
|
CAM_ERR(CAM_HFI, "Failed to get hfi info rc: %d for hdl:%d",
|
||||||
|
rc, client_handle);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
size = sizeof(struct hfi_cmd_prop) +
|
size = sizeof(struct hfi_cmd_prop) +
|
||||||
sizeof(struct hfi_cmd_ubwc_cfg_ext);
|
sizeof(struct hfi_cmd_ubwc_cfg_ext);
|
||||||
|
|
||||||
CAM_DBG(CAM_HFI,
|
CAM_DBG(CAM_HFI,
|
||||||
"hfi hdl: %d size of ubwc %u, ubwc_ipe_cfg[rd-0x%x,wr-0x%x] ubwc_bps_cfg[rd-0x%x,wr-0x%x] ubwc_ofe_cfg[rd-0x%x,wr-0x%x]",
|
"[%s] hfi hdl: %d size of ubwc %u, ubwc_ipe_cfg[rd-0x%x,wr-0x%x] ubwc_bps_cfg[rd-0x%x,wr-0x%x] ubwc_ofe_cfg[rd-0x%x,wr-0x%x]",
|
||||||
client_handle, size, ubwc_ipe_cfg[0], ubwc_ipe_cfg[1], ubwc_bps_cfg[0],
|
hfi->client_name, client_handle, size,
|
||||||
|
ubwc_ipe_cfg[0], ubwc_ipe_cfg[1], ubwc_bps_cfg[0],
|
||||||
ubwc_bps_cfg[1], ubwc_ofe_cfg[0], ubwc_ofe_cfg[1]);
|
ubwc_bps_cfg[1], ubwc_ofe_cfg[0], ubwc_ofe_cfg[1]);
|
||||||
|
|
||||||
prop = kzalloc(size, GFP_KERNEL);
|
prop = kzalloc(size, GFP_KERNEL);
|
||||||
@@ -536,8 +560,8 @@ int hfi_set_fw_dump_levels(int client_handle, uint32_t hang_dump_lvl,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAM_DBG(CAM_HFI, "hfi hdl: %d fw dump ENTER",
|
CAM_DBG(CAM_HFI, "[%s] hfi hdl: %d fw dump ENTER",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
|
|
||||||
size = sizeof(struct hfi_cmd_prop) + sizeof(uint32_t);
|
size = sizeof(struct hfi_cmd_prop) + sizeof(uint32_t);
|
||||||
prop = kzalloc(size, GFP_KERNEL);
|
prop = kzalloc(size, GFP_KERNEL);
|
||||||
@@ -560,11 +584,9 @@ int hfi_set_fw_dump_levels(int client_handle, uint32_t hang_dump_lvl,
|
|||||||
|
|
||||||
hfi_write_cmd(client_handle, prop);
|
hfi_write_cmd(client_handle, prop);
|
||||||
CAM_DBG(CAM_HFI,
|
CAM_DBG(CAM_HFI,
|
||||||
"hfi hdl: %d prop->size = %d prop->pkt_type = %d prop->num_prop = %d hang_dump_lvl = %u ram_dump_lvl = %u",
|
"[%s] hfi hdl: %d prop->size = %d prop->pkt_type = %d prop->num_prop = %d hang_dump_lvl = %u ram_dump_lvl = %u",
|
||||||
client_handle,
|
hfi->client_name, client_handle, fw_dump_level_switch_prop->size,
|
||||||
fw_dump_level_switch_prop->size,
|
fw_dump_level_switch_prop->pkt_type, fw_dump_level_switch_prop->num_prop,
|
||||||
fw_dump_level_switch_prop->pkt_type,
|
|
||||||
fw_dump_level_switch_prop->num_prop,
|
|
||||||
hang_dump_lvl, ram_dump_lvl);
|
hang_dump_lvl, ram_dump_lvl);
|
||||||
|
|
||||||
kfree(prop);
|
kfree(prop);
|
||||||
@@ -602,13 +624,14 @@ int hfi_send_freq_info(int client_handle, int32_t freq)
|
|||||||
dbg_prop->prop_data[1] = freq;
|
dbg_prop->prop_data[1] = freq;
|
||||||
|
|
||||||
CAM_DBG(CAM_HFI,
|
CAM_DBG(CAM_HFI,
|
||||||
"hfi hdl: %d\n"
|
"[%s] hfi hdl: %d\n"
|
||||||
"prop->size = %d\n"
|
"prop->size = %d\n"
|
||||||
"prop->pkt_type = %d\n"
|
"prop->pkt_type = %d\n"
|
||||||
"prop->num_prop = %d\n"
|
"prop->num_prop = %d\n"
|
||||||
"prop->prop_data[0] = %d\n"
|
"prop->prop_data[0] = %d\n"
|
||||||
"prop->prop_data[1] = %d\n"
|
"prop->prop_data[1] = %d\n"
|
||||||
"dbg_lvl = 0x%x\n",
|
"dbg_lvl = 0x%x\n",
|
||||||
|
hfi->client_name,
|
||||||
client_handle,
|
client_handle,
|
||||||
dbg_prop->size,
|
dbg_prop->size,
|
||||||
dbg_prop->pkt_type,
|
dbg_prop->pkt_type,
|
||||||
@@ -625,10 +648,13 @@ int hfi_send_freq_info(int client_handle, int32_t freq)
|
|||||||
int hfi_send_system_cmd(int client_handle, uint32_t type, uint64_t data, uint32_t size)
|
int hfi_send_system_cmd(int client_handle, uint32_t type, uint64_t data, uint32_t size)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
struct hfi_info *hfi;
|
||||||
|
|
||||||
if (!IS_VALID_HFI_INDEX(client_handle)) {
|
rc = hfi_get_client_info(client_handle, &hfi);
|
||||||
CAM_ERR(CAM_HFI, "Invalid client handle: %d", client_handle);
|
if (rc) {
|
||||||
return -EINVAL;
|
CAM_ERR(CAM_HFI, "Failed to get hfi info rc: %d for hdl: %d",
|
||||||
|
rc, client_handle);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -693,8 +719,8 @@ int hfi_send_system_cmd(int client_handle, uint32_t type, uint64_t data, uint32_
|
|||||||
case HFI_CMD_IPEBPS_ASYNC_COMMAND_INDIRECT:
|
case HFI_CMD_IPEBPS_ASYNC_COMMAND_INDIRECT:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
CAM_ERR(CAM_HFI, "command not supported: %u client handle: %d",
|
CAM_ERR(CAM_HFI, "[%s] command not supported: %u client handle: %d",
|
||||||
type, client_handle);
|
hfi->client_name, type, client_handle);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -751,8 +777,8 @@ int cam_hfi_resume(int client_handle)
|
|||||||
icp_base = hfi_iface_addr(hfi);
|
icp_base = hfi_iface_addr(hfi);
|
||||||
|
|
||||||
if (!icp_base) {
|
if (!icp_base) {
|
||||||
CAM_ERR(CAM_HFI, "invalid HFI interface address for hdl:%d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid HFI interface address for hdl:%d",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,15 +786,16 @@ int cam_hfi_resume(int client_handle)
|
|||||||
HFI_REG_ICP_HOST_INIT_RESPONSE,
|
HFI_REG_ICP_HOST_INIT_RESPONSE,
|
||||||
HFI_POLL_DELAY_US, HFI_POLL_TIMEOUT_US,
|
HFI_POLL_DELAY_US, HFI_POLL_TIMEOUT_US,
|
||||||
(uint32_t)UINT_MAX, ICP_INIT_RESP_SUCCESS, &status)) {
|
(uint32_t)UINT_MAX, ICP_INIT_RESP_SUCCESS, &status)) {
|
||||||
CAM_ERR(CAM_HFI, "response poll timed out: status=0x%08x hfi hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] response poll timed out: status=0x%08x hfi hdl: %d",
|
||||||
status, client_handle);
|
hfi->client_name, status, client_handle);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
hfi_irq_enable(hfi);
|
hfi_irq_enable(hfi);
|
||||||
|
|
||||||
fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
|
fw_version = cam_io_r(icp_base + HFI_REG_FW_VERSION);
|
||||||
CAM_DBG(CAM_HFI, "hfi hdl: %d fw version : [%x]", client_handle, fw_version);
|
CAM_DBG(CAM_HFI, "[%s] hfi hdl: %d fw version : [%x]",
|
||||||
|
hfi->client_name, client_handle, fw_version);
|
||||||
|
|
||||||
hfi_mem = &hfi->map;
|
hfi_mem = &hfi->map;
|
||||||
cam_io_w_mb((uint32_t)hfi_mem->qtbl.iova, icp_base + HFI_REG_QTBL_PTR);
|
cam_io_w_mb((uint32_t)hfi_mem->qtbl.iova, icp_base + HFI_REG_QTBL_PTR);
|
||||||
@@ -856,8 +883,8 @@ int cam_hfi_init(int client_handle, struct hfi_mem_info *hfi_mem,
|
|||||||
|
|
||||||
if (!hfi_mem || !hfi_ops || !priv) {
|
if (!hfi_mem || !hfi_ops || !priv) {
|
||||||
CAM_ERR(CAM_HFI,
|
CAM_ERR(CAM_HFI,
|
||||||
"invalid arg: hfi_mem=%pK hfi_ops=%pK priv=%pK hfi hdl:%d",
|
"[%s] Invalid arg: hfi_mem=%pK hfi_ops=%pK priv=%pK hfi hdl:%d",
|
||||||
hfi_mem, hfi_ops, priv, client_handle);
|
hfi->client_name, hfi_mem, hfi_ops, priv, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -976,8 +1003,8 @@ int cam_hfi_init(int client_handle, struct hfi_mem_info *hfi_mem,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CAM_ERR(CAM_HFI, "Invalid event driven mode :%u for hdl:%d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid event driven mode :%u for hdl:%d",
|
||||||
event_driven_mode, client_handle);
|
hfi->client_name, event_driven_mode, client_handle);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -986,8 +1013,8 @@ int cam_hfi_init(int client_handle, struct hfi_mem_info *hfi_mem,
|
|||||||
|
|
||||||
icp_base = hfi_iface_addr(hfi);
|
icp_base = hfi_iface_addr(hfi);
|
||||||
if (!icp_base) {
|
if (!icp_base) {
|
||||||
CAM_ERR(CAM_HFI, "invalid HFI interface address for hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid HFI interface address for hdl: %d",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto regions_fail;
|
goto regions_fail;
|
||||||
}
|
}
|
||||||
@@ -1029,7 +1056,8 @@ int cam_hfi_init(int client_handle, struct hfi_mem_info *hfi_mem,
|
|||||||
cam_io_w_mb((uint32_t)hfi_mem->hwmutex.len,
|
cam_io_w_mb((uint32_t)hfi_mem->hwmutex.len,
|
||||||
icp_base + HFI_REG_DEVICE_HWMUTEX_SIZE);
|
icp_base + HFI_REG_DEVICE_HWMUTEX_SIZE);
|
||||||
|
|
||||||
CAM_DBG(CAM_HFI, "HFI handle: %d", client_handle);
|
CAM_DBG(CAM_HFI, "[%s] HFI handle: %d",
|
||||||
|
hfi->client_name, client_handle);
|
||||||
|
|
||||||
CAM_DBG(CAM_HFI, "IO1 : [0x%x 0x%x] IO2 [0x%x 0x%x]",
|
CAM_DBG(CAM_HFI, "IO1 : [0x%x 0x%x] IO2 [0x%x 0x%x]",
|
||||||
hfi_mem->io_mem.iova, hfi_mem->io_mem.len,
|
hfi_mem->io_mem.iova, hfi_mem->io_mem.len,
|
||||||
@@ -1064,8 +1092,8 @@ int cam_hfi_init(int client_handle, struct hfi_mem_info *hfi_mem,
|
|||||||
HFI_REG_ICP_HOST_INIT_RESPONSE,
|
HFI_REG_ICP_HOST_INIT_RESPONSE,
|
||||||
HFI_POLL_DELAY_US, HFI_POLL_TIMEOUT_US,
|
HFI_POLL_DELAY_US, HFI_POLL_TIMEOUT_US,
|
||||||
(uint32_t)UINT_MAX, ICP_INIT_RESP_SUCCESS, &status)) {
|
(uint32_t)UINT_MAX, ICP_INIT_RESP_SUCCESS, &status)) {
|
||||||
CAM_ERR(CAM_HFI, "response poll timed out: status=0x%08x",
|
CAM_ERR(CAM_HFI, "[%s] hfi hdl:%u response poll timed out: status=0x%08x",
|
||||||
status);
|
hfi->client_name, client_handle, status);
|
||||||
rc = -ETIMEDOUT;
|
rc = -ETIMEDOUT;
|
||||||
goto regions_fail;
|
goto regions_fail;
|
||||||
}
|
}
|
||||||
@@ -1104,8 +1132,8 @@ void cam_hfi_deinit(int client_handle)
|
|||||||
|
|
||||||
if (cam_presil_mode_enabled()) {
|
if (cam_presil_mode_enabled()) {
|
||||||
CAM_DBG(CAM_HFI,
|
CAM_DBG(CAM_HFI,
|
||||||
"HFI hdl: %d SYS_RESET Needed in presil for back to back hfi_init success",
|
"[%s] HFI hdl: %d SYS_RESET Needed in presil for back to back hfi_init success",
|
||||||
client_handle);
|
hfi->client_name, client_handle);
|
||||||
hfi_send_system_cmd(client_handle, HFI_CMD_SYS_RESET, 0, 0);
|
hfi_send_system_cmd(client_handle, HFI_CMD_SYS_RESET, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1142,11 +1170,10 @@ static int hfi_get_free_index(uint32_t *free_index)
|
|||||||
return -EUSERS;
|
return -EUSERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cam_hfi_register(int *client_handle)
|
int cam_hfi_register(int *client_handle, const char *client_name)
|
||||||
{
|
{
|
||||||
struct hfi_info *hfi = NULL;
|
struct hfi_info *hfi = NULL;
|
||||||
uint32_t hfi_index;
|
int hfi_index, rc = 0;
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
if (!client_handle) {
|
if (!client_handle) {
|
||||||
CAM_ERR(CAM_HFI, "Client handle is NULL");
|
CAM_ERR(CAM_HFI, "Client handle is NULL");
|
||||||
@@ -1162,8 +1189,9 @@ int cam_hfi_register(int *client_handle)
|
|||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto failed_hfi_register;
|
goto failed_hfi_register;
|
||||||
}
|
}
|
||||||
CAM_ERR(CAM_HFI, "HFI client handle:%d is already established",
|
|
||||||
*client_handle);
|
CAM_ERR(CAM_HFI, "[%s] HFI client handle:%d is already established",
|
||||||
|
hfi->client_name, *client_handle);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
goto failed_hfi_register;
|
goto failed_hfi_register;
|
||||||
}
|
}
|
||||||
@@ -1190,6 +1218,7 @@ int cam_hfi_register(int *client_handle)
|
|||||||
g_hfi.hfi[hfi_index] = hfi;
|
g_hfi.hfi[hfi_index] = hfi;
|
||||||
g_hfi.num_hfi++;
|
g_hfi.num_hfi++;
|
||||||
*client_handle = HFI_GET_CLIENT_HANDLE(hfi_index);
|
*client_handle = HFI_GET_CLIENT_HANDLE(hfi_index);
|
||||||
|
memcpy(hfi->client_name, client_name, HFI_CLIENT_NAME_LEN);
|
||||||
mutex_unlock(&g_hfi_lock);
|
mutex_unlock(&g_hfi_lock);
|
||||||
|
|
||||||
mutex_init(&hfi->cmd_q_lock);
|
mutex_init(&hfi->cmd_q_lock);
|
||||||
@@ -1275,7 +1304,8 @@ int hfi_write_cmd(int client_handle, void *cmd_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!cmd_ptr) {
|
if (!cmd_ptr) {
|
||||||
CAM_ERR(CAM_HFI, "command is null for hfi hdl:%d", client_handle);
|
CAM_ERR(CAM_HFI, "[%s] command is null for hfi hdl:%d",
|
||||||
|
hfi->client_name, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1285,12 +1315,12 @@ int hfi_write_cmd(int client_handle, void *cmd_ptr)
|
|||||||
CAM_PRESIL_CLIENT_ID_CAMERA);
|
CAM_PRESIL_CLIENT_ID_CAMERA);
|
||||||
|
|
||||||
if ((presil_rc != CAM_PRESIL_SUCCESS) && (presil_rc != CAM_PRESIL_BLOCKED)) {
|
if ((presil_rc != CAM_PRESIL_SUCCESS) && (presil_rc != CAM_PRESIL_BLOCKED)) {
|
||||||
CAM_ERR(CAM_HFI, "hfi hdl: %d failed presil rc %d",
|
CAM_ERR(CAM_HFI, "[%s] hfi hdl: %d failed presil rc %d",
|
||||||
client_handle, presil_rc);
|
hfi->client_name, client_handle, presil_rc);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
} else {
|
} else {
|
||||||
CAM_DBG(CAM_HFI, "hfi hdl: %d presil rc %d",
|
CAM_DBG(CAM_HFI, "[%s] hfi hdl: %d presil rc %d",
|
||||||
client_handle, presil_rc);
|
hfi->client_name, client_handle, presil_rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&hfi->cmd_q_lock);
|
mutex_unlock(&hfi->cmd_q_lock);
|
||||||
@@ -1312,13 +1342,14 @@ int hfi_read_message(int client_handle, uint32_t *pmsg, uint8_t q_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!pmsg) {
|
if (!pmsg) {
|
||||||
CAM_ERR(CAM_HFI, "Invalid msg for hdl: %d", client_handle);
|
CAM_ERR(CAM_HFI, "[%s] Invalid msg for hdl: %d",
|
||||||
|
hfi->client_name, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (q_id > Q_DBG) {
|
if (q_id > Q_DBG) {
|
||||||
CAM_ERR(CAM_HFI, "Invalid q :%u hdl: %d",
|
CAM_ERR(CAM_HFI, "[%s] Invalid q :%u hdl: %d",
|
||||||
q_id, client_handle);
|
hfi->client_name, q_id, client_handle);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
mutex_lock(&hfi->msg_q_lock);
|
mutex_lock(&hfi->msg_q_lock);
|
||||||
@@ -1330,10 +1361,12 @@ int hfi_read_message(int client_handle, uint32_t *pmsg, uint8_t q_id,
|
|||||||
CAM_PRESIL_CLIENT_ID_CAMERA);
|
CAM_PRESIL_CLIENT_ID_CAMERA);
|
||||||
|
|
||||||
if ((presil_rc != CAM_PRESIL_SUCCESS) && (presil_rc != CAM_PRESIL_BLOCKED)) {
|
if ((presil_rc != CAM_PRESIL_SUCCESS) && (presil_rc != CAM_PRESIL_BLOCKED)) {
|
||||||
CAM_ERR(CAM_HFI, "hfi hdl: %d failed presil rc %d", client_handle, presil_rc);
|
CAM_ERR(CAM_HFI, "[%s] hfi hdl: %d failed presil rc %d",
|
||||||
|
hfi->client_name, client_handle, presil_rc);
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
} else {
|
} else {
|
||||||
CAM_DBG(CAM_HFI, "hfi hdl: %d presil rc %d", client_handle, presil_rc);
|
CAM_DBG(CAM_HFI, "[%s] hfi hdl: %d presil rc %d",
|
||||||
|
hfi->client_name, client_handle, presil_rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&hfi->msg_q_lock);
|
mutex_unlock(&hfi->msg_q_lock);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CAM_ICP_HW_MGR_H
|
#ifndef CAM_ICP_HW_MGR_H
|
||||||
@@ -88,6 +88,11 @@
|
|||||||
(hw_cap_mask) & BIT((hw_dev_type)); \
|
(hw_cap_mask) & BIT((hw_dev_type)); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define CAM_ICP_IS_VALID_HW_DEV_TYPE(type) \
|
||||||
|
({ \
|
||||||
|
((type) >= CAM_ICP_HW_ICP_V1) && ((type) < CAM_ICP_HW_MAX); \
|
||||||
|
})
|
||||||
|
|
||||||
struct hfi_mini_dump_info;
|
struct hfi_mini_dump_info;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -346,7 +351,7 @@ struct cam_icp_hw_ctx_data {
|
|||||||
char ctx_id_string[128];
|
char ctx_id_string[128];
|
||||||
struct cam_icp_ctx_perf_stats perf_stats;
|
struct cam_icp_ctx_perf_stats perf_stats;
|
||||||
struct cam_hw_inject_evt_param evt_inject_params;
|
struct cam_hw_inject_evt_param evt_inject_params;
|
||||||
uint32_t hw_dev_type;
|
enum cam_icp_hw_type hw_dev_type;
|
||||||
uint32_t hw_clk_type;
|
uint32_t hw_clk_type;
|
||||||
bool abort_timed_out;
|
bool abort_timed_out;
|
||||||
};
|
};
|
||||||
@@ -557,6 +562,7 @@ struct cam_icp_hw_ctx_mini_dump {
|
|||||||
/**
|
/**
|
||||||
* struct cam_icp_hw_mini_dump_info
|
* struct cam_icp_hw_mini_dump_info
|
||||||
*
|
*
|
||||||
|
* @hw_mgr_name: name of the hw mgr that is dumped
|
||||||
* @ctx: Context for minidump
|
* @ctx: Context for minidump
|
||||||
* @hfi_info: hfi info
|
* @hfi_info: hfi info
|
||||||
* @hfi_mem_info: hfi mem info
|
* @hfi_mem_info: hfi mem info
|
||||||
@@ -571,6 +577,7 @@ struct cam_icp_hw_ctx_mini_dump {
|
|||||||
* @icp_use_pil: Is PIL used
|
* @icp_use_pil: Is PIL used
|
||||||
*/
|
*/
|
||||||
struct cam_icp_hw_mini_dump_info {
|
struct cam_icp_hw_mini_dump_info {
|
||||||
|
char hw_mgr_name[CAM_ICP_HW_MGR_NAME_SIZE];
|
||||||
struct cam_icp_hw_ctx_mini_dump *ctx[CAM_ICP_CTX_MAX];
|
struct cam_icp_hw_ctx_mini_dump *ctx[CAM_ICP_CTX_MAX];
|
||||||
struct hfi_mini_dump_info hfi_info;
|
struct hfi_mini_dump_info hfi_info;
|
||||||
struct icp_hfi_mem_info hfi_mem_info;
|
struct icp_hfi_mem_info hfi_mem_info;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cam_debug_util.h"
|
#include "cam_debug_util.h"
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
uint32_t icp_request_cnt[CAM_ICP_MAX_ICP_HW_TYPE];
|
uint32_t icp_request_cnt[CAM_ICP_MAX_ICP_HW_TYPE];
|
||||||
|
|
||||||
static int cam_icp_get_device_num(uint32_t dev_type, uint32_t *num_dev)
|
static int cam_icp_get_device_num(enum cam_icp_hw_type dev_type, uint32_t *num_dev)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ static int cam_icp_get_device_num(uint32_t dev_type, uint32_t *num_dev)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cam_icp_alloc_processor_devs(struct device_node *np, int *icp_hw_type,
|
int cam_icp_alloc_processor_devs(struct device_node *np, enum cam_icp_hw_type *icp_hw_type,
|
||||||
struct cam_hw_intf ***devices, uint32_t *hw_dev_cnt, uint32_t *dev_cap_cnt)
|
struct cam_hw_intf ***devices, uint32_t *hw_dev_cnt, uint32_t *dev_cap_cnt)
|
||||||
{
|
{
|
||||||
uint32_t num_icp_found = 0, num_icp_listed;
|
uint32_t num_icp_found = 0, num_icp_listed;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cam_icp_v1_core.h"
|
#include "cam_icp_v1_core.h"
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief : Get ICP device type (ICP_V1/ICP_V2/...)
|
* @brief : Get ICP device type (ICP_V1/ICP_V2/...)
|
||||||
*/
|
*/
|
||||||
int cam_icp_alloc_processor_devs(struct device_node *np, int *icp_hw_type,
|
int cam_icp_alloc_processor_devs(struct device_node *np, enum cam_icp_hw_type *icp_hw_type,
|
||||||
struct cam_hw_intf ***devices, uint32_t *hw_dev_cnt, uint32_t *dev_cap_cnt);
|
struct cam_hw_intf ***devices, uint32_t *hw_dev_cnt, uint32_t *dev_cap_cnt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user