/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef _CAM_FD_HW_MGR_H_
#define _CAM_FD_HW_MGR_H_

#include <linux/module.h>
#include <linux/kernel.h>

#include <media/cam_fd.h>
#include "cam_hw.h"
#include "cam_hw_intf.h"
#include "cam_cpas_api.h"
#include "cam_debug_util.h"
#include "cam_hw_mgr_intf.h"
#include "cam_req_mgr_workq.h"
#include "cam_fd_hw_intf.h"

#define CAM_FD_HW_MAX            1
#define CAM_FD_WORKQ_NUM_TASK    10

struct cam_fd_hw_mgr;

/**
 * enum cam_fd_mgr_work_type - Type of worker task
 *
 * @CAM_FD_WORK_FRAME : Work type indicating frame task
 * @CAM_FD_WORK_IRQ   : Work type indicating irq task
 */
enum cam_fd_mgr_work_type {
	CAM_FD_WORK_FRAME,
	CAM_FD_WORK_IRQ,
};

/**
 * struct cam_fd_hw_mgr_ctx : FD HW Mgr context
 *
 * @list            : List pointer used to maintain this context
 *                    in free, used list
 * @ctx_index       : Index of this context
 * @ctx_in_use      : Whether this context is in use
 * @event_cb        : Event callback pointer to notify cam core context
 * @cb_priv         : Event callback private pointer
 * @hw_mgr          : Pointer to hw manager
 * @get_raw_results : Whether this context needs raw results
 * @mode            : Mode in which this context runs
 * @device_index    : HW Device used by this context
 * @ctx_hw_private  : HW layer's private context pointer for this context
 * @priority        : Priority of this context
 */
struct cam_fd_hw_mgr_ctx {
	struct list_head               list;
	uint32_t                       ctx_index;
	bool                           ctx_in_use;
	cam_hw_event_cb_func           event_cb;
	void                          *cb_priv;
	struct cam_fd_hw_mgr          *hw_mgr;
	bool                           get_raw_results;
	enum cam_fd_hw_mode            mode;
	int32_t                        device_index;
	void                          *ctx_hw_private;
	uint32_t                       priority;
};

/**
 * struct cam_fd_device : FD HW Device
 *
 * @hw_caps          : This FD device's capabilities
 * @hw_intf          : FD device's interface information
 * @ready_to_process : Whether this device is ready to process next frame
 * @num_ctxts        : Number of context currently running on this device
 * @valid            : Whether this device is valid
 * @lock             : Lock used for protectin
 */
struct cam_fd_device {
	struct cam_fd_hw_caps    hw_caps;
	struct cam_hw_intf      *hw_intf;
	bool                     ready_to_process;
	uint32_t                 num_ctxts;
	bool                     valid;
	struct mutex             lock;
};

/**
 * struct cam_fd_mgr_frame_request : Frame request information maintained
 *                                   in HW Mgr layer
 *
 * @list                  : List pointer used to maintain this request in
 *                          free, pending, processing request lists
 * @request_id            : Request ID corresponding to this request
 * @hw_ctx                : HW context from which this request is coming
 * @hw_req_private        : HW layer's private information specific to
 *                          this request
 * @hw_update_entries     : HW update entries corresponding to this request
 *                          which needs to be submitted to HW through CDM
 * @num_hw_update_entries : Number of HW update entries
 */
struct cam_fd_mgr_frame_request {
	struct list_head               list;
	uint64_t                       request_id;
	struct cam_fd_hw_mgr_ctx      *hw_ctx;
	struct cam_fd_hw_req_private   hw_req_private;
	struct cam_hw_update_entry     hw_update_entries[CAM_FD_MAX_HW_ENTRIES];
	uint32_t                       num_hw_update_entries;
};

/**
 * struct cam_fd_mgr_work_data : HW Mgr work data information
 *
 * @type     : Type of work
 * @irq_type : IRQ type when this work is queued because of irq callback
 */
struct cam_fd_mgr_work_data {
	enum cam_fd_mgr_work_type      type;
	enum cam_fd_hw_irq_type        irq_type;
};

/**
 * struct cam_fd_hw_mgr : FD HW Mgr information
 *
 * @free_ctx_list             : List of free contexts available for acquire
 * @used_ctx_list             : List of contexts that are acquired
 * @frame_free_list           : List of free frame requests available
 * @frame_pending_list_high   : List of high priority frame requests pending
 *                              for processing
 * @frame_pending_list_normal : List of normal priority frame requests pending
 *                              for processing
 * @frame_processing_list     : List of frame requests currently being
 *                              processed currently. Generally maximum one
 *                              request would be present in this list
 * @hw_mgr_mutex              : Mutex to protect hw mgr data when accessed
 *                              from multiple threads
 * @hw_mgr_slock              : Spin lock to protect hw mgr data when accessed
 *                              from multiple threads
 * @ctx_mutex                 : Mutex to protect context list
 * @frame_req_mutex           : Mutex to protect frame request list
 * @device_iommu              : Device IOMMU information
 * @cdm_iommu                 : CDM IOMMU information
 * @hw_device                 : Underlying HW device information
 * @num_devices               : Number of HW devices available
 * @raw_results_available     : Whether raw results available in this driver
 * @supported_modes           : Supported modes by this driver
 * @ctx_pool                  : List of context
 * @frame_req                 : List of frame requests
 * @work                      : Worker handle
 * @work_data                 : Worker data
 * @fd_caps                   : FD driver capabilities
 */
struct cam_fd_hw_mgr {
	struct list_head                   free_ctx_list;
	struct list_head                   used_ctx_list;
	struct list_head                   frame_free_list;
	struct list_head                   frame_pending_list_high;
	struct list_head                   frame_pending_list_normal;
	struct list_head                   frame_processing_list;
	struct mutex                       hw_mgr_mutex;
	spinlock_t                         hw_mgr_slock;
	struct mutex                       ctx_mutex;
	struct mutex                       frame_req_mutex;
	struct cam_iommu_handle            device_iommu;
	struct cam_iommu_handle            cdm_iommu;
	struct cam_fd_device               hw_device[CAM_FD_HW_MAX];
	uint32_t                           num_devices;
	bool                               raw_results_available;
	uint32_t                           supported_modes;
	struct cam_fd_hw_mgr_ctx           ctx_pool[CAM_CTX_MAX];
	struct cam_fd_mgr_frame_request    frame_req[CAM_CTX_REQ_MAX];
	struct cam_req_mgr_core_workq     *work;
	struct cam_fd_mgr_work_data        work_data[CAM_FD_WORKQ_NUM_TASK];
	struct cam_fd_query_cap_cmd        fd_caps;
};

#endif /* _CAM_FD_HW_MGR_H_ */
