Merge "msm: camera: isp: Reduce traffic for shutter notification" into camera-kernel.lnx.5.0

This commit is contained in:
Camera Software Integration
2021-10-04 17:32:47 -07:00
committed by Gerrit - the friendly Code Review server
5 changed files with 88 additions and 0 deletions

View File

@@ -866,6 +866,33 @@ static void __cam_isp_ctx_send_sof_boot_timestamp(
request_id); request_id);
} }
static void __cam_isp_ctx_send_unified_timestamp(
struct cam_isp_context *ctx_isp, uint64_t request_id)
{
struct cam_req_mgr_message req_msg;
req_msg.session_hdl = ctx_isp->base->session_hdl;
req_msg.u.frame_msg_v2.frame_id = ctx_isp->frame_id;
req_msg.u.frame_msg_v2.request_id = request_id;
req_msg.u.frame_msg_v2.timestamps[CAM_REQ_SOF_QTIMER_TIMESTAMP] =
(request_id == 0) ? 0 : ctx_isp->sof_timestamp_val;
req_msg.u.frame_msg_v2.timestamps[CAM_REQ_BOOT_TIMESTAMP] = ctx_isp->boot_timestamp;
req_msg.u.frame_msg_v2.link_hdl = ctx_isp->base->link_hdl;
req_msg.u.frame_msg_v2.frame_id_meta = ctx_isp->frame_id_meta;
CAM_DBG(CAM_ISP,
"link hdl 0x%x request id:%lld frame number:%lld SOF time stamp:0x%llx ctx %d\
boot time stamp:0x%llx", ctx_isp->base->link_hdl, request_id,
ctx_isp->frame_id, ctx_isp->sof_timestamp_val,ctx_isp->base->ctx_id,
ctx_isp->boot_timestamp);
if (cam_req_mgr_notify_message(&req_msg,
V4L_EVENT_CAM_REQ_MGR_SOF_UNIFIED_TS, V4L_EVENT_CAM_REQ_MGR_EVENT))
CAM_ERR(CAM_ISP,
"Error in notifying the sof and boot time for req id:%lld",
request_id);
}
static void __cam_isp_ctx_send_sof_timestamp_frame_header( static void __cam_isp_ctx_send_sof_timestamp_frame_header(
struct cam_isp_context *ctx_isp, uint32_t *frame_header_cpu_addr, struct cam_isp_context *ctx_isp, uint32_t *frame_header_cpu_addr,
uint64_t request_id, uint32_t sof_event_status) uint64_t request_id, uint32_t sof_event_status)
@@ -908,6 +935,12 @@ static void __cam_isp_ctx_send_sof_timestamp(
{ {
struct cam_req_mgr_message req_msg; struct cam_req_mgr_message req_msg;
if ((ctx_isp->v4l2_event_sub_ids & (1 << V4L_EVENT_CAM_REQ_MGR_SOF_UNIFIED_TS))
&& !ctx_isp->use_frame_header_ts) {
__cam_isp_ctx_send_unified_timestamp(ctx_isp,request_id);
return;
}
if ((ctx_isp->use_frame_header_ts) || (request_id == 0)) if ((ctx_isp->use_frame_header_ts) || (request_id == 0))
goto end; goto end;
@@ -4786,6 +4819,7 @@ static int __cam_isp_ctx_release_dev_in_top_state(struct cam_context *ctx,
ctx_isp->offline_context = false; ctx_isp->offline_context = false;
ctx_isp->rdi_only_context = false; ctx_isp->rdi_only_context = false;
ctx_isp->req_info.last_bufdone_req_id = 0; ctx_isp->req_info.last_bufdone_req_id = 0;
ctx_isp->v4l2_event_sub_ids = 0;
atomic64_set(&ctx_isp->state_monitor_head, -1); atomic64_set(&ctx_isp->state_monitor_head, -1);
for (i = 0; i < CAM_ISP_CTX_EVENT_MAX; i++) for (i = 0; i < CAM_ISP_CTX_EVENT_MAX; i++)
@@ -5102,6 +5136,8 @@ static int __cam_isp_ctx_acquire_dev_in_available(struct cam_context *ctx,
cmd->session_handle, cmd->num_resources, cmd->session_handle, cmd->num_resources,
cmd->handle_type, cmd->resource_hdl); cmd->handle_type, cmd->resource_hdl);
ctx_isp->v4l2_event_sub_ids = cam_req_mgr_get_id_subscribed();
if (cmd->num_resources == CAM_API_COMPAT_CONSTANT) { if (cmd->num_resources == CAM_API_COMPAT_CONSTANT) {
ctx_isp->split_acquire = true; ctx_isp->split_acquire = true;
CAM_DBG(CAM_ISP, "Acquire dev handle"); CAM_DBG(CAM_ISP, "Acquire dev handle");
@@ -6576,6 +6612,7 @@ int cam_isp_context_init(struct cam_isp_context *ctx,
ctx->reported_req_id = 0; ctx->reported_req_id = 0;
ctx->bubble_frame_cnt = 0; ctx->bubble_frame_cnt = 0;
ctx->req_info.last_bufdone_req_id = 0; ctx->req_info.last_bufdone_req_id = 0;
ctx->v4l2_event_sub_ids = 0;
ctx->hw_ctx = NULL; ctx->hw_ctx = NULL;
ctx->substate_activated = CAM_ISP_CTX_ACTIVATED_SOF; ctx->substate_activated = CAM_ISP_CTX_ACTIVATED_SOF;

View File

@@ -274,6 +274,7 @@ struct cam_isp_context_event_record {
* @workq: Worker thread for offline ife * @workq: Worker thread for offline ife
* @trigger_id: ID provided by CRM for each ctx on the link * @trigger_id: ID provided by CRM for each ctx on the link
* @last_bufdone_err_apply_req_id: last bufdone error apply request id * @last_bufdone_err_apply_req_id: last bufdone error apply request id
* @v4l2_event_sub_ids contains individual bits representing subscribed v4l2 ids
* *
*/ */
struct cam_isp_context { struct cam_isp_context {
@@ -323,6 +324,7 @@ struct cam_isp_context {
struct cam_req_mgr_core_workq *workq; struct cam_req_mgr_core_workq *workq;
int32_t trigger_id; int32_t trigger_id;
int64_t last_bufdone_err_apply_req_id; int64_t last_bufdone_err_apply_req_id;
uint32_t v4l2_event_sub_ids;
}; };
/** /**

View File

@@ -279,13 +279,21 @@ static struct v4l2_subscribed_event_ops g_cam_v4l2_ops = {
static int cam_subscribe_event(struct v4l2_fh *fh, static int cam_subscribe_event(struct v4l2_fh *fh,
const struct v4l2_event_subscription *sub) const struct v4l2_event_subscription *sub)
{ {
g_dev.v4l2_sub_ids |= 1 << sub->id;
return v4l2_event_subscribe(fh, sub, CAM_REQ_MGR_EVENT_MAX, return v4l2_event_subscribe(fh, sub, CAM_REQ_MGR_EVENT_MAX,
&g_cam_v4l2_ops); &g_cam_v4l2_ops);
} }
uint32_t cam_req_mgr_get_id_subscribed(void)
{
return g_dev.v4l2_sub_ids;
}
EXPORT_SYMBOL(cam_req_mgr_get_id_subscribed);
static int cam_unsubscribe_event(struct v4l2_fh *fh, static int cam_unsubscribe_event(struct v4l2_fh *fh,
const struct v4l2_event_subscription *sub) const struct v4l2_event_subscription *sub)
{ {
g_dev.v4l2_sub_ids &= ~(1 << sub->id);
return v4l2_event_unsubscribe(fh, sub); return v4l2_event_unsubscribe(fh, sub);
} }

View File

@@ -16,6 +16,7 @@
* @dev_lock: lock for the subdevice count. * @dev_lock: lock for the subdevice count.
* @state: state of the root device. * @state: state of the root device.
* @open_cnt: open count of subdev * @open_cnt: open count of subdev
* @v4l2_sub_ids: bits representing v4l2 event ids subscribed or not
* @cam_lock: per file handle lock * @cam_lock: per file handle lock
* @cam_eventq: event queue * @cam_eventq: event queue
* @cam_eventq_lock: lock for event queue * @cam_eventq_lock: lock for event queue
@@ -28,6 +29,7 @@ struct cam_req_mgr_device {
struct mutex dev_lock; struct mutex dev_lock;
bool state; bool state;
int32_t open_cnt; int32_t open_cnt;
uint32_t v4l2_sub_ids;
struct mutex cam_lock; struct mutex cam_lock;
struct v4l2_fh *cam_eventq; struct v4l2_fh *cam_eventq;
spinlock_t cam_eventq_lock; spinlock_t cam_eventq_lock;
@@ -52,4 +54,8 @@ int cam_req_mgr_init(void);
*/ */
void cam_req_mgr_exit(void); void cam_req_mgr_exit(void);
/**
* @brief : API to get V4L2 eventIDs subscribed by UMD.
*/
uint32_t cam_req_mgr_get_id_subscribed(void);
#endif /* _CAM_REQ_MGR_DEV_H_ */ #endif /* _CAM_REQ_MGR_DEV_H_ */

View File

@@ -57,6 +57,7 @@
#define V4L_EVENT_CAM_REQ_MGR_SOF_BOOT_TS 2 #define V4L_EVENT_CAM_REQ_MGR_SOF_BOOT_TS 2
#define V4L_EVENT_CAM_REQ_MGR_CUSTOM_EVT 3 #define V4L_EVENT_CAM_REQ_MGR_CUSTOM_EVT 3
#define V4L_EVENT_CAM_REQ_MGR_NODE_EVENT 4 #define V4L_EVENT_CAM_REQ_MGR_NODE_EVENT 4
#define V4L_EVENT_CAM_REQ_MGR_SOF_UNIFIED_TS 5
/* SOF Event status */ /* SOF Event status */
#define CAM_REQ_MGR_SOF_EVENT_SUCCESS 0 #define CAM_REQ_MGR_SOF_EVENT_SUCCESS 0
@@ -507,6 +508,39 @@ struct cam_req_mgr_frame_msg {
__u32 reserved; __u32 reserved;
}; };
/**
* enum cam_req_msg_timestamp_type - Identifies index of timestamps
*
* @CAM_REQ_SOF_QTIMER_TIMESTAMP: SOF qtimer timestamp
* @CAM_REQ_BOOT_TIMESTAMP: SOF boot timestamp
* @CAM_REQ_TIMESTAMP_TYPE: Max enum index for timestamp type
*
*/
enum cam_req_msg_timestamp_type {
CAM_REQ_SOF_QTIMER_TIMESTAMP = 0,
CAM_REQ_BOOT_TIMESTAMP,
CAM_REQ_TIMESTAMP_MAX
};
/**
* struct cam_req_mgr_frame_msg
* @request_id: request id of the frame
* @frame_id: frame id of the frame
* @timestamps: array for all the supported timestamps
* @link_hdl: link handle associated with this message
* @frame_id_meta: refers to the meta for
* that frame in specific usecases
* @reserved: reserved for future addtions and max size for structure can be 64 bytes
*/
struct cam_req_mgr_frame_msg_v2 {
__u64 request_id;
__u64 frame_id;
__u64 timestamps[CAM_REQ_TIMESTAMP_MAX];
__s32 link_hdl;
__u32 frame_id_meta;
__u32 reserved[4];
};
/** /**
* struct cam_req_mgr_custom_msg * struct cam_req_mgr_custom_msg
* @custom_type: custom type * @custom_type: custom type
@@ -573,6 +607,7 @@ struct cam_req_mgr_message {
union { union {
struct cam_req_mgr_error_msg err_msg; struct cam_req_mgr_error_msg err_msg;
struct cam_req_mgr_frame_msg frame_msg; struct cam_req_mgr_frame_msg frame_msg;
struct cam_req_mgr_frame_msg_v2 frame_msg_v2;
struct cam_req_mgr_custom_msg custom_msg; struct cam_req_mgr_custom_msg custom_msg;
struct cam_req_mgr_node_msg node_msg; struct cam_req_mgr_node_msg node_msg;
} u; } u;