/*
 * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

#ifndef _WMI_TLV_HELPER_H_
#define _WMI_TLV_HELPER_H_

/*
 * Every command or event parameter structure will need a TLV definition.
 * The macro WMITLV_TABLE is used to help build this TLV definition. Inside this macro define, the
 * individual TLV's are specified. The parameters for WMITLV_ELEM are:
 * (1) the list of parameters that are passed unchanged from the WMITLV_TABLE. Currently, they are id,op,buf,len
 * (2) The TLV Tag. You should create a new tag for each cmd/event in WMITLV_TAG_ID. The name of the
 *     tag is <WMI_TLVTAG_STRUC_><CMD or Event ID name>. There are special tags,
 *     e.g. WMI_TLVTAG_ARRAY_UINT32 and WMI_TLVTAG_ARRAY_STRUC. WMI_TLVTAG_ARRAY_UINT32 is for a
 *     variable size array of UINT32 elements. WMI_TLVTAG_ARRAY_STRUC is for a varialbe size array
 *     of structures.
 * (3) type of the TLV. For WMI_TLVTAG_ARRAY_* tag, then it is the type of each element.
 * (4) Name of this TLV. It must be unique in this TLV TABLE.
 * (5) Either WMITLV_SIZE_FIX or WMITLV_SIZE_VAR to indicate if this TLV is variable size.
 *
 * Note: It is important that the last TLV_ELEM does not have the "\" character.
 */

/* Size of the TLV Header which is the Tag and Length fields */
#define WMI_TLV_HDR_SIZE   (1 * sizeof(A_UINT32))

/** TLV Helper macro to get the TLV Header given the pointer
 *  to the TLV buffer. */
#define WMITLV_GET_HDR(tlv_buf)        (((A_UINT32 *)(tlv_buf))[0])

/** TLV Helper macro to set the TLV Header given the pointer
 *  to the TLV buffer. */
#define WMITLV_SET_HDR(tlv_buf, tag, len) (((A_UINT32 *)(tlv_buf))[0]) = ((tag << 16) | (len & 0x0000FFFF))

/** TLV Helper macro to get the TLV Tag given the TLV header. */
#define WMITLV_GET_TLVTAG(tlv_header)  ((A_UINT32)((tlv_header)>>16))

/** TLV Helper macro to get the TLV Buffer Length (minus TLV
 *  header size) given the TLV header. */
#define WMITLV_GET_TLVLEN(tlv_header)  ((A_UINT32)((tlv_header) & 0x0000FFFF))

/** TLV Helper macro to get the TLV length from TLV structure size by removing TLV header size */
#define WMITLV_GET_STRUCT_TLVLEN(tlv_struct)    ((A_UINT32)(sizeof(tlv_struct)-WMI_TLV_HDR_SIZE))

/* Indicates whether the TLV is fixed size or variable length */
#define WMITLV_SIZE_FIX     0
#define WMITLV_SIZE_VAR     1

typedef struct {
	A_UINT32 tag_order;
	A_UINT32 tag_id;
	A_UINT32 tag_struct_size;
	A_UINT32 tag_varied_size;
	A_UINT32 tag_array_size;
	A_UINT32 cmd_num_tlv;
} wmitlv_attributes_struc;

/* Template structure definition for a variable size array of UINT32 */
typedef struct {
	A_UINT32 tlv_header;    /* TLV tag and len; tag equals WMI_TLVTAG_ARRAY_UINT32 */
	A_UINT32 uint32_array[1];       /* variable length Array of UINT32 */
} wmitlv_array_uint32;

/* Template structure definition for a variable size array of unknown structure */
typedef struct {
	A_UINT32 tlv_header;    /* TLV tag and len; tag equals WMI_TLVTAG_ARRAY_STRUC */
	A_UINT32 struc_array[1];        /* variable length Array of structures */
} wmitlv_array_struc;

/*
 * Used to fill in the "arr_size" parameter when it is not specified and hence, invalid. Can be used to
 * indicate if the original TLV definition specify this fixed array size.
 */
#define WMITLV_ARR_SIZE_INVALID  0x1FE

#define WMITLV_GET_TAG_NUM_TLV_ATTRIB(wmi_cmd_event_id)	     \
	WMI_TLV_HLPR_NUM_TLVS_FOR_ ## wmi_cmd_event_id

void
wmitlv_set_static_param_tlv_buf(void *param_tlv_buf,
				A_UINT32 max_tlvs_accomodated);

void
wmitlv_free_allocated_command_tlvs(A_UINT32 cmd_id, void **wmi_cmd_struct_ptr);

void
wmitlv_free_allocated_event_tlvs(A_UINT32 event_id, void **wmi_cmd_struct_ptr);

int
wmitlv_check_command_tlv_params(void *os_ctx, void *param_struc_ptr,
				A_UINT32 param_buf_len,
				A_UINT32 wmi_cmd_event_id);

int
wmitlv_check_event_tlv_params(void *os_ctx, void *param_struc_ptr,
			      A_UINT32 param_buf_len,
			      A_UINT32 wmi_cmd_event_id);

int
wmitlv_check_and_pad_command_tlvs(void *os_ctx, void *param_struc_ptr,
				  A_UINT32 param_buf_len,
				  A_UINT32 wmi_cmd_event_id,
				  void **wmi_cmd_struct_ptr);

int
wmitlv_check_and_pad_event_tlvs(void *os_ctx, void *param_struc_ptr,
				A_UINT32 param_buf_len,
				A_UINT32 wmi_cmd_event_id,
				void **wmi_cmd_struct_ptr);

/** This structure is the element for the Version WhiteList
 *  table. */
typedef struct {
	A_UINT32 major;
	A_UINT32 minor;
	A_UINT32 namespace_0;
	A_UINT32 namespace_1;
	A_UINT32 namespace_2;
	A_UINT32 namespace_3;
} wmi_whitelist_version_info;

struct _wmi_abi_version;        /* Forward declaration to make the ARM compiler happy */

int
wmi_cmp_and_set_abi_version(int num_whitelist,
			    wmi_whitelist_version_info *
			    version_whitelist_table,
			    struct _wmi_abi_version *my_vers,
			    struct _wmi_abi_version *opp_vers,
			    struct _wmi_abi_version *out_vers);

int
wmi_versions_are_compatible(struct _wmi_abi_version *vers1,
			    struct _wmi_abi_version *vers2);

#endif /*_WMI_TLV_HELPER_H_*/
