/*
<:copyright-BRCM:2016:DUAL/GPL:standard

   Broadcom Proprietary and Confidential.(c) 2016 Broadcom
   All Rights Reserved

Unless you and Broadcom execute a separate written software license
agreement governing use of this software, this software is licensed
to you under the terms of the GNU General Public License version 2
(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
with the following added to such license:

   As a special exception, the copyright holders of this software give
   you permission to link this software with independent modules, and
   to copy and distribute the resulting executable under terms of your
   choice, provided that you also meet, for each linked independent
   module, the terms and conditions of the license of that module.
   An independent module is a module which is not derived from this
   software.  The special exception does not apply to any modifications
   of the software.

Not withstanding the above, under no circumstances may you combine
this software in any way with any other Broadcom software provided
under a license other than the GPL, without Broadcom's express prior
written consent.

:>
 */

#ifndef _BCMOLT_DEV_CTRL_H_
#define _BCMOLT_DEV_CTRL_H_

#include <bcmos_system.h>
#include <bcmolt_msg.h>
#include <bcmolt_model_types.h>
#include "bcm_keep_alive.h"
#include "bcmolt_fld.h"
#include "bcmolt_sw_error.h"

typedef int (*bcmolt_dev_ctrl_cb_image_read)(
    bcmolt_devid device,
    bcmolt_device_image_type image_type,
    uint32_t offset,
    uint8_t *buf,
    uint32_t buf_size);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_system_mode_validate)(bcmolt_devid device, bcmolt_system_mode system_mode);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_device_off)(bcmolt_devid device);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_device_on)(bcmolt_devid device);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_device_is_running)(bcmolt_devid device, bcmos_bool *is_running);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_host_reset)(void);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_pcie_channel_prepare)(bcmolt_devid device);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_pcie_channel_remove)(bcmolt_devid device);
typedef bcmos_errno (*bcmolt_dev_ctrl_cb_pcie_status_get)(bcmolt_devid device, bcmos_bool *is_prepared);

typedef struct
{
    bcmolt_dev_ctrl_cb_system_mode_validate    system_mode_validate_cb;
    bcmolt_dev_ctrl_cb_image_read              image_read_cb;
    bcmolt_dev_ctrl_cb_device_off              device_off_cb;
    bcmolt_dev_ctrl_cb_device_on               device_on_cb;
    bcmolt_dev_ctrl_cb_device_is_running       device_is_running_cb;
    bcmolt_dev_ctrl_cb_host_reset              host_reset_cb;
    bcmolt_dev_ctrl_cb_pcie_channel_prepare    pcie_channel_prepare_cb;
    bcmolt_dev_ctrl_cb_pcie_channel_remove     pcie_channel_remove_cb;
} bcmolt_dev_ctrl_params;

#define DEVICE_CONTROL_MSG_QUEUE_SIZE  BCMOS_MSG_POOL_DEFAULT_SIZE
#define IMAGE_BUF_SIZE                 (1 * 1024 * 1024) /* 1MB */
#define BOOT_SEQ_POLL_INTERVAL_SEC     1
#define BOOT_SEQ_POLLING_MAX_NUMBER    5
#define DDR_TEST_POLLING_MAX_NUMBER    20
#define DEVICE_CONTROL_CONFIG_TIME_US  (15 * 1000000) /* 15 seconds */
#define DEVICE_CONTROL_CONNECT_TIME_US (40 * 1000000) /* 40 seconds */
#define CONFIG_SEND_MAX_NUMBER         2
#define FILE_PATH_LEN                  128
#define HOST_DMA_RX_DEFAULT_QUEUE_SIZE 128
#define HOST_DMA_TX_DEFAULT_QUEUE_SIZE 128
#define EXCEPTION_LOG_MONITOR_INTERVAL (5 * 1000000) /* 5 second */
#define DEVICE_RESPONSE_TIMEOUT_LENGTH (2 * 100000)  /* 200 milliseconds */
#define HOST_RESET_DELAY_US            100000 /* how long to wait before resetting the host via callback (100ms) */

/* indicates successful connection - used internally, no need to expose this in the host-facing enum */
#define BCMOLT_HOST_CONNECTION_FAIL_REASON_NONE ((bcmolt_host_connection_fail_reason)0xFF)

typedef enum
{
    DEVICE_CONTROL_EVENT_DEVICE_CLEAR,
    DEVICE_CONTROL_EVENT_DEVICE_CONFIG_SET,
    DEVICE_CONTROL_EVENT_DEVICE_CONFIG_GET,
    DEVICE_CONTROL_EVENT_DEVICE_TIMER_TIMEOUT,
    DEVICE_CONTROL_EVENT_DEVICE_RECEIVED_ACK,
    DEVICE_CONTROL_EVENT_DEVICE_DISCONNECT,
    DEVICE_CONTROL_EVENT_DEVICE_CONNECT,
    DEVICE_CONTROL_EVENT_DEVICE_RESET,
    DEVICE_CONTROL_EVENT_CONNECTION_FAILURE,
    DEVICE_CONTROL_EVENT_CONNECTION_ESTABLISHED,
    DEVICE_CONTROL_EVENT_DEVICE_READY,
    DEVICE_CONTROL_EVENT_RUN_DDR_TEST,
    DEVICE_CONTROL_EVENT_DDR_TEST_COMPLETED,
    DEVICE_CONTROL_EVENT_DDR_TEST_TIMEOUT,

    DEVICE_CONTROL_EVENT__NUM_OF,
    DEVICE_CONTROL_EVENT_NO_EVENT = DEVICE_CONTROL_EVENT__NUM_OF
} dev_ctrl_event;

typedef enum
{
    DEV_CTRL_CONNECTING_STATE_ESTABLISHING, /* writing software via FLD, waiting for "connection established" */
    DEV_CTRL_CONNECTING_STATE_CONFIGURING,  /* connection established, cfg sent, waiting for "device ready" */
    DEV_CTRL_CONNECTING_STATE_STANDALONE,   /* connecting to a standalone device, waiting for "device ready" */
} dev_ctrl_connecting_state;

typedef struct
{
    char name[MAX_TASK_NAME_SIZE];
    bcmos_task task;
} dev_ctrl_task;

typedef struct
{
    char name[MAX_MODULE_NAME_SIZE];
    bcmos_module_id module_id;
} dev_ctrl_module;

typedef struct
{
    char name[MAX_TIMER_NAME_SIZE];
    bcmos_timer timer;
} dev_ctrl_timer;

typedef struct
{
    uint32_t pcie_addr;
} dev_ctrl_pcie;

typedef struct
{
    dev_ctrl_connecting_state state;
    uint32_t                  config_send_counter;
    uint32_t                  config_interval;
    dev_ctrl_timer            timer;
} dev_ctrl_connection;

typedef struct
{
    uint32_t             polling_counter;
    uint32_t             polling_interval;
    dev_ctrl_timer       timer;
} dev_ctrl_boot_seq;

typedef struct
{
    dev_ctrl_task           task_info;
    dev_ctrl_module         module_info;
    dev_ctrl_connection     connection_info;
    dev_ctrl_pcie           pcie_info;
    bcmos_keep_alive_info   ka_info;
    dev_ctrl_boot_seq       boot_seq_info;
    bcm_fld_device_info     fld_info;
    bcmolt_device_cfg_data  device_params;
    bcmolt_presence_mask    device_params_present;
    dev_ctrl_timer          exception_monitor_timer;
    uint16_t                corr_tag;
    bcmolt_msg *            last_message;
    dev_ctrl_timer          device_response_timer;
    dev_ctrl_timer          reset_delay_timer;
    bcmos_bool              is_host_reset_pending;
#ifdef ENABLE_LOG
    uint32_t                sram_log_offset;
    uint32_t                msgs_read;
#endif
    bcmolt_control_state    enable_tod;
#ifndef SIMULATION_BUILD
    uint32_t                trx_disable_mask;
#endif
    dev_ctrl_event last_event;
    bcmolt_host_connection_fail_reason conn_fail_reason;
    uint32_t sw_error_count;
    bcmolt_sw_error sw_errors[30];
    dev_log_id log_id;
} dev_ctrl_database;

typedef void (*dev_ctrl_sm_cb)(bcmolt_devid device, const bcmolt_msg *msg);

#define DEVICE_ID_FROM_MODULE_ID(module_id) ((bcmolt_devid)(module_id - BCMOS_MODULE_ID_DEV_CTRL_DEV0))
#define MODULE_ID_FROM_DEVICE_ID(device) ((bcmos_module_id)(device + BCMOS_MODULE_ID_DEV_CTRL_DEV0))

const char *bcm_str_device_state(bcmolt_device_state device_state);
const char *bcm_str_device_event(dev_ctrl_event device_event);
const char *bcm_str_host_connection_fail_reason(bcmolt_host_connection_fail_reason reason);
const char *bcm_str_host_connecting_state(dev_ctrl_connecting_state state);
void dev_ctrl_read_db(bcmolt_devid device, dev_ctrl_database *db);

bcmos_errno bcmolt_dev_ctrl_host_event_write(uint32_t device, uint32_t event);

/*Use different function signatures linux kernel device control and other*/
#if !defined(LINUX_USER_SPACE)
bcmos_errno bcmolt_dev_ctrl_init(bcmolt_dev_ctrl_params *params);
#else
bcmos_errno bcmolt_dev_ctrl_init(void);
#endif

void bcmolt_dev_ctrl_exit(void);

#endif
