blob: 784c80f5e1fe641f8476f9cc9739129128ab342f [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
*/
#ifndef _CAM_CUSTOM_CONTEXT_H_
#define _CAM_CUSTOM_CONTEXT_H_
#include <linux/spinlock.h>
#include <uapi/media/cam_custom.h>
#include <uapi/media/cam_defs.h>
#include "cam_context.h"
#include "cam_custom_hw_mgr_intf.h"
/*
* Maximum hw resource - This number is based on the maximum
* output port resource. The current maximum resource number
* is 2.
*/
#define CAM_CUSTOM_DEV_CTX_RES_MAX 2
#define CAM_CUSTOM_CTX_CFG_MAX 8
/* forward declaration */
struct cam_custom_context;
/**
* struct cam_custom_dev_ctx_req - Custom context request object
*
* @base: Common request object pointer
* @cfg: Custom hardware configuration array
* @num_cfg: Number of custom hardware configuration entries
* @fence_map_out: Output fence mapping array
* @num_fence_map_out: Number of the output fence map
* @fence_map_in: Input fence mapping array
* @num_fence_map_in: Number of input fence map
* @num_acked: Count to track acked entried for output.
* If count equals the number of fence out, it means
* the request has been completed.
* @hw_update_data: HW update data for this request
*
*/
struct cam_custom_dev_ctx_req {
struct cam_ctx_request *base;
struct cam_hw_update_entry cfg
[CAM_CUSTOM_CTX_CFG_MAX];
uint32_t num_cfg;
struct cam_hw_fence_map_entry fence_map_out
[CAM_CUSTOM_DEV_CTX_RES_MAX];
uint32_t num_fence_map_out;
struct cam_hw_fence_map_entry fence_map_in
[CAM_CUSTOM_DEV_CTX_RES_MAX];
uint32_t num_fence_map_in;
uint32_t num_acked;
struct cam_custom_prepare_hw_update_data hw_update_data;
};
/**
* struct cam_custom_context - Custom device context
* @base: custom device context object
* @state_machine: state machine for Custom device context
* @state: Common context state
* @hw_ctx: HW object returned by the acquire device command
* @init_received: Indicate whether init config packet is received
* @subscribe_event: The irq event mask that CRM subscribes to,
* custom HW will invoke CRM cb at those event.
* @active_req_cnt: Counter for the active request
* @frame_id: Frame id tracking for the custom context
* @hw_acquired: Flag to indicate if HW is acquired for this context
* @req_base: common request structure
* @req_custom: custom request structure
*
*/
struct cam_custom_context {
struct cam_context *base;
struct cam_ctx_ops *state_machine;
uint32_t state;
void *hw_ctx;
bool init_received;
uint32_t subscribe_event;
uint32_t active_req_cnt;
int64_t frame_id;
bool hw_acquired;
struct cam_ctx_request req_base[CAM_CTX_REQ_MAX];
struct cam_custom_dev_ctx_req req_custom[CAM_CTX_REQ_MAX];
};
/**
* cam_custom_dev_context_init()
*
* @brief: Initialization function for the custom context
*
* @ctx: Custom context obj to be initialized
* @bridge_ops: Bridge call back function
* @hw_intf: Cust hw manager interface
* @ctx_id: ID for this context
*
*/
int cam_custom_dev_context_init(struct cam_custom_context *ctx,
struct cam_context *ctx_base,
struct cam_req_mgr_kmd_ops *bridge_ops,
struct cam_hw_mgr_intf *hw_intf,
uint32_t ctx_id);
/**
* cam_custom_dev_context_deinit()
*
* @brief: Deinitialize function for the Custom context
*
* @ctx: Custom context obj to be deinitialized
*
*/
int cam_custom_dev_context_deinit(struct cam_custom_context *ctx);
#endif /* _CAM_CUSTOM_CONTEXT_H_ */