/*
<:copyright-BRCM:2016:proprietary:standard

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

This program is the proprietary software of Broadcom Corporation and/or its
licensors, and may only be used, duplicated, modified or distributed pursuant
to the terms and conditions of a separate, written license agreement executed
between you and Broadcom (an "Authorized License").  Except as set forth in
an Authorized License, Broadcom grants no license (express or implied), right
to use, or waiver of any kind with respect to the Software, and Broadcom
expressly reserves all rights in and to the Software and all intellectual
property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.

Except as expressly set forth in the Authorized License,

1. This program, including its structure, sequence and organization,
    constitutes the valuable trade secrets of Broadcom, and you shall use
    all reasonable efforts to protect the confidentiality thereof, and to
    use this information only in connection with your use of Broadcom
    integrated circuit products.

2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
    AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
    WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
    RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND
    ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
    FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
    COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
    TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
    PERFORMANCE OF THE SOFTWARE.

3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
    ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
    INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
    WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
    IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
    OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
    SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
    SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
    LIMITED REMEDY.
:>
*/
#ifndef _BCM_COMMON_GPON_FAST_H_
#define _BCM_COMMON_GPON_FAST_H_

#ifndef SIMULATION_BUILD
#include <bcmtr_pcie_sw_queue.h>
#endif

#define BCM_COMMON_GPON_FAST_API_LIST_SIZE 1280
#define BCM_COMMON_GPON_FAST_API_ACCESS_LIST_SIZE 2048
#define URGENT_CHANNEL BCMTR_SWQ_FIRST_URGENT_CHANNEL

typedef enum
{
	BCM_COMMON_FAST_MSG_TYPE_GET_ALLOC_STATS,
	BCM_COMMON_FAST_MSG_TYPE_SET_ALLOCS,
	BCM_COMMON_FAST_MSG_TYPE_SET_BW_ALLOCS
} bcm_common_fast_msg_type;

typedef struct __PACKED_ATTR_START__
{
	uint16_t alloc_id;
	uint32_t allocated;
	uint32_t used;
	uint32_t status_report;
} __PACKED_ATTR_END__ bcm_common_fast_get_alloc_stats;

typedef struct __PACKED_ATTR_START__
{
	uint8_t pon_ni;
	uint32_t cycle_num;
	uint32_t available_bw;
	uint32_t num_of_allocs;
} __PACKED_ATTR_END__ bcm_common_fast_get_stats_ind_hdr;

typedef struct __PACKED_ATTR_START__
{
	bcm_common_fast_get_stats_ind_hdr hdr;
	bcm_common_fast_get_alloc_stats alloc_stats_list[BCM_COMMON_GPON_FAST_API_LIST_SIZE];
} __PACKED_ATTR_END__ bcm_common_fast_get_stats_ind;

typedef struct __PACKED_ATTR_START__
{
	uint16_t alloc_id;
	uint32_t allocation_blocks;
	/* uint8_t access_num;  - Will be added in the 2nd phase */
} __PACKED_ATTR_END__ bcm_common_fast_set_alloc;

typedef struct __PACKED_ATTR_START__
{
	uint32_t cycle_num;
	uint32_t num_of_allocs;
} __PACKED_ATTR_END__ bcm_common_fast_msg_hdr;

typedef struct __PACKED_ATTR_START__
{
	bcm_common_fast_msg_hdr hdr;
	bcm_common_fast_set_alloc set_alloc_list[BCM_COMMON_GPON_FAST_API_LIST_SIZE];
} __PACKED_ATTR_END__ bcm_common_fast_set_allocs_msg;

typedef struct __PACKED_ATTR_START__
{
	uint16_t alloc_id;
	uint16_t allocation_size;
	uint16_t start_time;
	uint8_t burst_profile;
    struct __PACKED_ATTR_START__
    {
		bcmos_bool ploam_flag			:1;
		bcmos_bool dbru_flag			:1;
		bcmos_bool end_of_frame			:1;
		bcmos_bool end_of_map			:1;
		bcmos_bool fwi					:1;
        uint8_t                      	:3;
    } __PACKED_ATTR_END__ alloc_flags;
} __PACKED_ATTR_END__ bcm_common_fast_set_access;

typedef struct __PACKED_ATTR_START__
{
	bcm_common_fast_msg_hdr hdr;
	bcm_common_fast_set_access set_access_list[BCM_COMMON_GPON_FAST_API_ACCESS_LIST_SIZE];
} __PACKED_ATTR_END__ bcm_common_fast_set_accesses_msg;

#endif
