Merge "msm: camera: isp: Reduce traffic for shutter notification" into camera-kernel.lnx.5.0
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
4c38664b95
@@ -866,6 +866,33 @@ static void __cam_isp_ctx_send_sof_boot_timestamp(
|
||||
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(
|
||||
struct cam_isp_context *ctx_isp, uint32_t *frame_header_cpu_addr,
|
||||
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;
|
||||
|
||||
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))
|
||||
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->rdi_only_context = false;
|
||||
ctx_isp->req_info.last_bufdone_req_id = 0;
|
||||
ctx_isp->v4l2_event_sub_ids = 0;
|
||||
|
||||
atomic64_set(&ctx_isp->state_monitor_head, -1);
|
||||
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->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) {
|
||||
ctx_isp->split_acquire = true;
|
||||
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->bubble_frame_cnt = 0;
|
||||
ctx->req_info.last_bufdone_req_id = 0;
|
||||
ctx->v4l2_event_sub_ids = 0;
|
||||
|
||||
ctx->hw_ctx = NULL;
|
||||
ctx->substate_activated = CAM_ISP_CTX_ACTIVATED_SOF;
|
||||
|
@@ -274,6 +274,7 @@ struct cam_isp_context_event_record {
|
||||
* @workq: Worker thread for offline ife
|
||||
* @trigger_id: ID provided by CRM for each ctx on the link
|
||||
* @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 {
|
||||
@@ -323,6 +324,7 @@ struct cam_isp_context {
|
||||
struct cam_req_mgr_core_workq *workq;
|
||||
int32_t trigger_id;
|
||||
int64_t last_bufdone_err_apply_req_id;
|
||||
uint32_t v4l2_event_sub_ids;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -279,13 +279,21 @@ static struct v4l2_subscribed_event_ops g_cam_v4l2_ops = {
|
||||
static int cam_subscribe_event(struct v4l2_fh *fh,
|
||||
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,
|
||||
&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,
|
||||
const struct v4l2_event_subscription *sub)
|
||||
{
|
||||
g_dev.v4l2_sub_ids &= ~(1 << sub->id);
|
||||
return v4l2_event_unsubscribe(fh, sub);
|
||||
}
|
||||
|
||||
|
@@ -16,6 +16,7 @@
|
||||
* @dev_lock: lock for the subdevice count.
|
||||
* @state: state of the root device.
|
||||
* @open_cnt: open count of subdev
|
||||
* @v4l2_sub_ids: bits representing v4l2 event ids subscribed or not
|
||||
* @cam_lock: per file handle lock
|
||||
* @cam_eventq: event queue
|
||||
* @cam_eventq_lock: lock for event queue
|
||||
@@ -28,6 +29,7 @@ struct cam_req_mgr_device {
|
||||
struct mutex dev_lock;
|
||||
bool state;
|
||||
int32_t open_cnt;
|
||||
uint32_t v4l2_sub_ids;
|
||||
struct mutex cam_lock;
|
||||
struct v4l2_fh *cam_eventq;
|
||||
spinlock_t cam_eventq_lock;
|
||||
@@ -52,4 +54,8 @@ int cam_req_mgr_init(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_ */
|
||||
|
@@ -57,6 +57,7 @@
|
||||
#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_NODE_EVENT 4
|
||||
#define V4L_EVENT_CAM_REQ_MGR_SOF_UNIFIED_TS 5
|
||||
|
||||
/* SOF Event status */
|
||||
#define CAM_REQ_MGR_SOF_EVENT_SUCCESS 0
|
||||
@@ -507,6 +508,39 @@ struct cam_req_mgr_frame_msg {
|
||||
__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
|
||||
* @custom_type: custom type
|
||||
@@ -573,6 +607,7 @@ struct cam_req_mgr_message {
|
||||
union {
|
||||
struct cam_req_mgr_error_msg err_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_node_msg node_msg;
|
||||
} u;
|
||||
|
Reference in New Issue
Block a user