blob: 899d8ed70cb01424fd837a3124f64fd7bb60cf50 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*/
#ifndef _CAM_REQ_MGR_INTERFACE_H
#define _CAM_REQ_MGR_INTERFACE_H
#include <linux/types.h>
#include <media/cam_req_mgr.h>
#include "cam_req_mgr_core_defs.h"
#include "cam_req_mgr_util.h"
struct cam_req_mgr_trigger_notify;
struct cam_req_mgr_error_notify;
struct cam_req_mgr_add_request;
struct cam_req_mgr_timer_notify;
struct cam_req_mgr_notify_stop;
struct cam_req_mgr_device_info;
struct cam_req_mgr_core_dev_link_setup;
struct cam_req_mgr_apply_request;
struct cam_req_mgr_flush_request;
struct cam_req_mgr_link_evt_data;
struct cam_req_mgr_dump_info;
#define SKIP_NEXT_FRAME 0x100
/* Request Manager -- camera device driver interface */
/**
* @brief: camera kernel drivers to cam req mgr communication
*
* @cam_req_mgr_notify_trigger: for device which generates trigger to inform CRM
* @cam_req_mgr_notify_err : device use this to inform about different errors
* @cam_req_mgr_add_req : to info CRm about new rqeuest received from
* userspace
*/
typedef int (*cam_req_mgr_notify_trigger)(
struct cam_req_mgr_trigger_notify *);
typedef int (*cam_req_mgr_notify_err)(struct cam_req_mgr_error_notify *);
typedef int (*cam_req_mgr_add_req)(struct cam_req_mgr_add_request *);
typedef int (*cam_req_mgr_notify_timer)(struct cam_req_mgr_timer_notify *);
typedef int (*cam_req_mgr_notify_stop)(struct cam_req_mgr_notify_stop *);
/**
* @brief: cam req mgr to camera device drivers
*
* @cam_req_mgr_get_dev_info: to fetch details about device linked
* @cam_req_mgr_link_setup : to establish link with device for a session
* @cam_req_mgr_notify_err : to broadcast error happened on link for request id
* @cam_req_mgr_apply_req : CRM asks device to apply certain request id.
* @cam_req_mgr_flush_req : Flush or cancel request
* cam_req_mgr_process_evt : generic events
* @cam_req_mgr_dump_req : dump request
*/
typedef int (*cam_req_mgr_get_dev_info) (struct cam_req_mgr_device_info *);
typedef int (*cam_req_mgr_link_setup)(
struct cam_req_mgr_core_dev_link_setup *);
typedef int (*cam_req_mgr_apply_req)(struct cam_req_mgr_apply_request *);
typedef int (*cam_req_mgr_flush_req)(struct cam_req_mgr_flush_request *);
typedef int (*cam_req_mgr_process_evt)(struct cam_req_mgr_link_evt_data *);
typedef int (*cam_req_mgr_dump_req)(struct cam_req_mgr_dump_info *);
/**
* @brief : cam_req_mgr_crm_cb - func table
*
* @notify_trigger : payload for trigger indication event
* @notify_err : payload for different error occurred at device
* @add_req : payload to inform which device and what request is received
* @notify_stop : payload to inform stop event
*/
struct cam_req_mgr_crm_cb {
cam_req_mgr_notify_trigger notify_trigger;
cam_req_mgr_notify_err notify_err;
cam_req_mgr_add_req add_req;
cam_req_mgr_notify_timer notify_timer;
cam_req_mgr_notify_stop notify_stop;
};
/**
* @brief : cam_req_mgr_kmd_ops - func table
*
* @get_dev_info : payload to fetch device details
* @link_setup : payload to establish link with device
* @apply_req : payload to apply request id on a device linked
* @flush_req : payload to flush request
* @process_evt : payload to generic event
* @dump_req : payload to dump request
*/
struct cam_req_mgr_kmd_ops {
cam_req_mgr_get_dev_info get_dev_info;
cam_req_mgr_link_setup link_setup;
cam_req_mgr_apply_req apply_req;
cam_req_mgr_flush_req flush_req;
cam_req_mgr_process_evt process_evt;
cam_req_mgr_dump_req dump_req;
};
/**
* enum cam_pipeline_delay
* @brief : enumerator for different pipeline delays in camera
*
* @DELAY_0 : device processed settings on same frame
* @DELAY_1 : device processed settings after 1 frame
* @DELAY_2 : device processed settings after 2 frames
* @DELAY_MAX : maximum supported pipeline delay
*/
enum cam_pipeline_delay {
CAM_PIPELINE_DELAY_0,
CAM_PIPELINE_DELAY_1,
CAM_PIPELINE_DELAY_2,
CAM_PIPELINE_DELAY_MAX,
};
/**
* @CAM_TRIGGER_POINT_SOF : Trigger point for SOF
* @CAM_TRIGGER_POINT_EOF : Trigger point for EOF
*/
#define CAM_TRIGGER_POINT_SOF (1 << 0)
#define CAM_TRIGGER_POINT_EOF (1 << 1)
/**
* enum cam_req_status
* @brief : enumerator for request status
*
* @SUCCESS : device processed settings successfully
* @FAILED : device processed settings failed
* @MAX : invalid status value
*/
enum cam_req_status {
CAM_REQ_STATUS_SUCCESS,
CAM_REQ_STATUS_FAILED,
CAM_REQ_STATUS_MAX,
};
/**
* enum cam_req_mgr_device_error
* @brief : enumerator for different errors occurred at device
*
* @NOT_FOUND : settings asked by request manager is not found
* @BUBBLE : device hit timing issue and is able to recover
* @FATAL : device is in bad shape and can not recover from error
* @PAGE_FAULT : Page fault while accessing memory
* @OVERFLOW : Bus Overflow for IFE/VFE
* @TIMEOUT : Timeout from cci or bus.
* @MAX : Invalid error value
*/
enum cam_req_mgr_device_error {
CRM_KMD_ERR_NOT_FOUND,
CRM_KMD_ERR_BUBBLE,
CRM_KMD_ERR_FATAL,
CRM_KMD_ERR_PAGE_FAULT,
CRM_KMD_ERR_OVERFLOW,
CRM_KMD_ERR_TIMEOUT,
CRM_KMD_ERR_STOPPED,
CRM_KMD_ERR_MAX,
};
/**
* enum cam_req_mgr_device_id
* @brief : enumerator for different devices in subsystem
*
* @CAM_REQ_MGR : request manager itself
* @SENSOR : sensor device
* @FLASH : LED flash or dual LED device
* @ACTUATOR : lens mover
* @IFE : Image processing device
* @CUSTOM : Custom HW block
* @EXTERNAL_1 : third party device
* @EXTERNAL_2 : third party device
* @EXTERNAL_3 : third party device
* @MAX : invalid device id
*/
enum cam_req_mgr_device_id {
CAM_REQ_MGR_DEVICE,
CAM_REQ_MGR_DEVICE_SENSOR,
CAM_REQ_MGR_DEVICE_FLASH,
CAM_REQ_MGR_DEVICE_ACTUATOR,
CAM_REQ_MGR_DEVICE_IFE,
CAM_REQ_MGR_DEVICE_CUSTOM_HW,
CAM_REQ_MGR_DEVICE_EXTERNAL_1,
CAM_REQ_MGR_DEVICE_EXTERNAL_2,
CAM_REQ_MGR_DEVICE_EXTERNAL_3,
CAM_REQ_MGR_DEVICE_ID_MAX,
};
/* Camera device driver to Req Mgr device interface */
/**
* enum cam_req_mgr_link_evt_type
* @CAM_REQ_MGR_LINK_EVT_ERR : error on the link from any of the
* connected devices
* @CAM_REQ_MGR_LINK_EVT_PAUSE : to pause the link
* @CAM_REQ_MGR_LINK_EVT_RESUME : resumes the link which was paused
* @CAM_REQ_MGR_LINK_EVT_SOF_FREEZE : request manager has detected an sof freeze
* @CAM_REQ_MGR_LINK_EVT_MAX : invalid event type
*/
enum cam_req_mgr_link_evt_type {
CAM_REQ_MGR_LINK_EVT_ERR,
CAM_REQ_MGR_LINK_EVT_PAUSE,
CAM_REQ_MGR_LINK_EVT_RESUME,
CAM_REQ_MGR_LINK_EVT_SOF_FREEZE,
CAM_REQ_MGR_LINK_EVT_MAX,
};
/**
* struct cam_req_mgr_trigger_notify
* @link_hdl : link identifier
* @dev_hdl : device handle which has sent this req id
* @frame_id : frame id for internal tracking
* @trigger : trigger point of this notification, CRM will send apply
* only to the devices which subscribe to this point.
* @sof_timestamp_val: Captured time stamp value at sof hw event
* @req_id : req id which returned buf_done
* @trigger_id: ID to differentiate between the trigger devices
*/
struct cam_req_mgr_trigger_notify {
int32_t link_hdl;
int32_t dev_hdl;
int64_t frame_id;
uint32_t trigger;
uint64_t sof_timestamp_val;
uint64_t req_id;
int32_t trigger_id;
};
/**
* struct cam_req_mgr_timer_notify
* @link_hdl : link identifier
* @dev_hdl : device handle which has sent this req id
* @frame_id : frame id for internal tracking
* @state : timer state i.e ON or OFF
*/
struct cam_req_mgr_timer_notify {
int32_t link_hdl;
int32_t dev_hdl;
bool state;
};
/**
* struct cam_req_mgr_error_notify
* @link_hdl : link identifier
* @dev_hdl : device handle which has sent this req id
* @req_id : req id which hit error
* @frame_id : frame id for internal tracking
* @trigger : trigger point of this notification, CRM will send apply
* @sof_timestamp_val : Captured time stamp value at sof hw event
* @error : what error device hit while processing this req
*/
struct cam_req_mgr_error_notify {
int32_t link_hdl;
int32_t dev_hdl;
uint64_t req_id;
int64_t frame_id;
uint32_t trigger;
uint64_t sof_timestamp_val;
enum cam_req_mgr_device_error error;
};
/**
* struct cam_req_mgr_add_request
* @link_hdl : link identifier
* @dev_hdl : device handle which has sent this req id
* @req_id : req id which device is ready to process
* @skip_before_applying : before applying req mgr introduce bubble
* by not sending request to device/s.
* ex: IFE and Flash
*/
struct cam_req_mgr_add_request {
int32_t link_hdl;
int32_t dev_hdl;
uint64_t req_id;
uint32_t skip_before_applying;
};
/**
* struct cam_req_mgr_notify_stop
* @link_hdl : link identifier
*
*/
struct cam_req_mgr_notify_stop {
int32_t link_hdl;
};
/* CRM to KMD devices */
/**
* struct cam_req_mgr_device_info
* @dev_hdl : Input_param : device handle for reference
* @name : link link or unlink
* @dev_id : device id info
* @p_delay : delay between time settings applied and take effect
* @trigger : Trigger point for the client
* @trigger_on : This device provides trigger
*/
struct cam_req_mgr_device_info {
int32_t dev_hdl;
char name[256];
enum cam_req_mgr_device_id dev_id;
enum cam_pipeline_delay p_delay;
uint32_t trigger;
bool trigger_on;
};
/**
* struct cam_req_mgr_core_dev_link_setup
* @link_enable : link link or unlink
* @link_hdl : link identifier
* @dev_hdl : device handle for reference
* @max_delay : max pipeline delay on this link
* @crm_cb : callback funcs to communicate with req mgr
* @subscribe_event : the mask of trigger points this link subscribes
* @trigger_id : Unique ID provided to the triggering device
*/
struct cam_req_mgr_core_dev_link_setup {
int32_t link_enable;
int32_t link_hdl;
int32_t dev_hdl;
enum cam_pipeline_delay max_delay;
struct cam_req_mgr_crm_cb *crm_cb;
uint32_t subscribe_event;
int32_t trigger_id;
};
/**
* struct cam_req_mgr_apply_request
* @link_hdl : link identifier
* @dev_hdl : device handle for cross check
* @request_id : request id settings to apply
* @report_if_bubble : report to crm if failure in applying
* @trigger_point : the trigger point of this apply
* @re_apply : to skip re_apply for buf_done request
*
*/
struct cam_req_mgr_apply_request {
int32_t link_hdl;
int32_t dev_hdl;
uint64_t request_id;
int32_t report_if_bubble;
uint32_t trigger_point;
bool re_apply;
};
/**
* struct cam_req_mgr_flush_request
* @link_hdl : link identifier
* @dev_hdl : device handle for cross check
* @type : cancel request type flush all or a request
* @request_id : request id to cancel
*
*/
struct cam_req_mgr_flush_request {
int32_t link_hdl;
int32_t dev_hdl;
uint32_t type;
uint64_t req_id;
};
/**
* struct cam_req_mgr_event_data
* @link_hdl : link handle
* @req_id : request id
*
*/
struct cam_req_mgr_link_evt_data {
int32_t link_hdl;
int32_t dev_hdl;
uint64_t req_id;
enum cam_req_mgr_link_evt_type evt_type;
union {
enum cam_req_mgr_device_error error;
} u;
};
/**
* struct cam_req_mgr_send_request
* @link_hdl : link identifier
* @idx : slot idx
*
*/
struct cam_req_mgr_send_request {
int32_t link_hdl;
struct cam_req_mgr_req_queue *in_q;
};
/**
* struct cam_req_mgr_dump_info
* @req_id : request id to dump
* @offset : offset of buffer
* @error_type : error type
* @buf_handle : buf handle
* @link_hdl : link identifier
* @dev_hdl : device handle for cross check
*
*/
struct cam_req_mgr_dump_info {
uint64_t req_id;
size_t offset;
uint32_t error_type;
uint32_t buf_handle;
int32_t link_hdl;
int32_t dev_hdl;
};
#endif