/*  
    This file is provided under a dual BSD/GPLv2 license.  When using or 
    redistributing this file, you may do so under either license.
    
    GPL LICENSE SUMMARY
    
    Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
    
    This program is free software; you can redistribute it and/or modify 
    it under the terms of version 2 of the GNU General Public License 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.

    You should have received a copy of the GNU General Public License 
    along with this program; if not, write to the Free Software 
    Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
    The full GNU General Public License is included in this distribution 
    in the file called LICENSE.GPL.

    Contact Information:

    BSD LICENSE 

    Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without 
    modification, are permitted provided that the following conditions 
    are met:

    * Redistributions of source code must retain the above copyright 
    notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright 
    notice, this list of conditions and the following disclaimer in 
    the documentation and/or other materials provided with the 
    distribution.
    * Neither the name of Intel Corporation nor the names of its 
    contributors may be used to endorse or promote products derived 
    from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/
                             
#ifndef VIDDEC_FW_PARSER_HOST_H
#define VIDDEC_FW_PARSER_HOST_H
                             
#ifdef __cplusplus
extern "C" {
#endif
#include "viddec_fw_common_defs.h"
    
/** @weakgroup viddec Fw Parser interface Functions */
/** @ingroup viddec_fw_parser */
/*@{*/

/**
   This function returns the size required for loading fw.
   @retval  size : Required size.
*/
    uint32_t viddec_fw_parser_query_fwsize(void);
    
/**
   This function loads Parser Firmware and initialises necessary state information.This a synchronous message to FW.
   @param[in] phys                : Physical address on where firmware should be loaded.
   @param[in] len                 : Length of data allocated at phys.
   @retval VIDDEC_FW_SUCCESS      : Successfully loaded firmware.
   @retval VIDDEC_FW_FAILURE      : Failed to communicate with firmware.
   @retval VIDDEC_FW_NORESOURCES  : Failed to allocate resources for Loading firmware.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_loadfw(uint32_t phys, uint32_t len);

/**
   This function returns the size required opening a stream. This a synchronous message to FW.
   @param[in] codec_type          : Type of codec that we want information about.
   @param[out] num_wklds          : Number of wklds required for initialisation.
   @param[out] size               : Size of memory required for opening a stream.
*/
    void viddec_fw_parser_query_streamsize(uint32_t codec_type, uint32_t *num_wklds, uint32_t *size);

/**
   This function opens requested codec.This a synchronous message to FW.
   @param[in] codec_type          : Type of codec that we want to open.
   @param[in] phys                : Physical address of allocated memory for this codec.
   @param[in] prority             : Priority of stream. 1 for realtime and 0 for background.
   @param[out] strm_handle        : Handle of the opened stream.
   @retval VIDDEC_FW_SUCCESS      : Successfully Opened the stream.
   @retval VIDDEC_FW_FAILURE      : Failed to Open a stream.
   @retval VIDDEC_FW_NORESOURCES  : Failed to Open a stream as we are out of resources.
*/    
    uint32_t viddec_fw_parser_openstream(uint32_t codec_type, uint32_t *strm_handle, uint32_t phys, uint32_t priority);

/**
   This function closes stream.This a synchronous message to FW.
   For the close stream to be effective, host has to do flush with discard first and then close the stream.
   @param[in] strm_handle        : Handle of the stream to close.
*/
    void viddec_fw_parser_closestream(uint32_t strm_handle);

/**
   This function flushes the current stream. This is a synchronous message to FW.
   Before calling this function the host has to make sure the output queue of the firmware
   is empty. After this function is executed the FW will read all entries in input
   es buffer queue into a free or partial workload and push it into output queue.
   After this operation the host has to read all entries in output queue again to
   finish the flush operation.
   @param[in] flush_type          : Type of flush we want to perform.ex:flush and discard.  
   @param[in]  strm_handle        : Handle of the stream we want to flush.
   @retval VIDDEC_FW_SUCCESS      : Successfully flushed the stream.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
   @retval VIDDEC_FW_NEED_FREE_WKLD  : Failed to flush sice a free wkld was not available.
*/
    uint32_t viddec_fw_parser_flushstream(uint32_t strm_handle, uint32_t flush_type);
    
/**
   This function sends an input es buffer.
   @param[in] strm_handle         : The handle of stream that we want to send es buffer to.
   @param[in] message             : The es buffer we want to send.
   @retval VIDDEC_FW_SUCCESS      : Successfully Sent the message.
   @retval VIDDEC_FW_PORT_FULL    : Port to fw full unsuccesful in sending message.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_send(uint32_t strm_handle, ipc_msg_data *message);

/**
   This function gets the next processed workload. The host is required to add free workloads
   to keep the parser busy. The FW will stall when it doesn't have enough workloads(2) to continue.
   @param[in] strm_handle         : The handle of stream that we want to read workload from.
   @param[out] message            : The workload descriptor.
   @retval VIDDEC_FW_SUCCESS      : Successfully Sent the message.
   @retval VIDDEC_FW_PORT_EMPTY   : Workload port is empty,unsuccesful in reading wkld.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_recv(uint32_t strm_handle, ipc_msg_data *message);

/**
   This function adds a free workload to current stream.
   @param[in] strm_handle         : The handle of stream that we want to write workload to.
   @param[out] message            : The workload descriptor.
   @retval VIDDEC_FW_SUCCESS      : Successfully Sent the message.
   @retval VIDDEC_FW_PORT_FULL    : Workload port is full,unsuccesful in writing wkld.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_addwkld(uint32_t strm_handle, ipc_msg_data *message);

/**
   This function enables or disables Interrupts for a stream. By default the FW will always enable interrupts.
   The driver can disable/enable Interrupts if it needs for this particular stream.

   @param[in] strm_handle         : The handle of stream that we want to get mask from
   @param[in] mask                : This is read as boolean variable, true to enable, false to disable.
   @retval VIDDEC_FW_SUCCESS      : Successfully set mask.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_set_interruptmask(uint32_t strm_handle, uint32_t mask);
/**
   This function gets the interrupt status for current stream. 
   When the host gets Interrupted since its a global interrupt it's expected that host will look at all active streams,
   by calling this function. The status is what the FW thinks the current state of stream is. The status information that
   FW provides is complete information on all possible events that are defined. The host should only access this information
   in its ISR at which state FW doesn't modify this information.

   @param[in] strm_handle         : The handle of stream that we want to get mask from
   @param[out] status             : The status of the stream based on viddec_fw_parser_int_status_t enum.
   @retval VIDDEC_FW_SUCCESS      : Successfully in reading status.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_getstatus(uint32_t strm_handle, uint32_t *status);
    
/**
   This function allows to set stream attributes that are supported.
   @param[in] strm_handle         : The handle of stream that we want to set attribute on.
   @param[in] type                : The type of attribute we want to set, this should be one of items in viddec_fw_stream_attributes_t.
   @param[in] value               : The value of the type that we want to set.
   @retval VIDDEC_FW_SUCCESS      : Successfully Set the attribute.
   @retval VIDDEC_FW_INVALID_PARAM: The input parameters are not valid.
*/
    uint32_t viddec_fw_parser_set_stream_attributes(uint32_t strm_handle, uint32_t type, uint32_t value);

/**
   This function allows to get current status of all the parser queues. If the current stream is active we return
   number of inout messages that can be written to input queue, no of messages in output queue and number of
   free available workloads the stream has.
   Normally this is called when Host receives an interrupt from parser, In which case before releasing the INT
   Host will try its best to keep the FW busy. We always get a interrupt if we passed the watermark on input or
   a workload was pushed into output and INT line is free. If host holds onto INT when firmware tries to send an INT
   FW would send the Interrupt after host releases INT. Since we have EDGE triggered interrupts we cannot guarantee
   one interrupt per frame, ex: If three frames are generated and after the first frame FW was able to provide an INT
   to host, but host held on to INT while the FW finished the next two frames, after host releases the INT the FW will
   give only one INT and host should try to empty output queue.
   @param[in] strm_handle         : The handle of stream that we want to get status of queues.
   @param[out] status             : The status of each queue gets updated in here.
   @retval VIDDEC_FW_SUCCESS      : Successfully Got the status information.
   @retval VIDDEC_FW_INVALID_PARAM: Invalid parameter in this case an inactive stream.
*/
    uint32_t viddec_fw_parser_get_queue_status(uint32_t strm_handle, viddec_fw_q_status_t *status);

/**
   This function unloads Parser Firmware and free's the resources allocated in Load fw.
   If this function is called before load fw it will crash with a segmentation fault.
*/    
    void viddec_fw_parser_deinit(void);

/**
   This function gets the major and minor revison numbers of the loaded firmware.
   @param[out] major              : The major revision numner.
   @param[out] minor              : The minor revision number.
   @param[out] build              : The Internal Build number.
*/
    void viddec_fw_parser_get_version_number(unsigned int *major, unsigned int *minor, unsigned int *build);
    
/**
   This function clears the global interrupt. This is the last thing host calls before exiting ISR.
*/
    void viddec_fw_parser_clear_global_interrupt(void);

/*@}*/
#ifdef __cplusplus
}
#endif

#endif//#ifndef VIDDEC_FW_PARSER_HOST_H
