/*
<: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_CONSTANTS_H_
#define _BCM_COMMON_GPON_CONSTANTS_H_

#include "bcmolt_model_data.h"

/* maximum number of PONs for any supported PON mode */
#define MAX_NUM_OF_PONS 16

/** Generic "PON mode" used to simplify logic when specific "system mode" is too complex. */
typedef enum
{
    BCMOLT_PON_MODE_GPON,
    BCMOLT_PON_MODE_XGPON,
    BCMOLT_PON_MODE_XGS,
    BCMOLT_PON_MODE_NGPON2,
} bcmolt_pon_mode;

/** Object type used by the API layer for provisioning each PON mode. */
typedef enum
{
    BCMOLT_PON_API_TYPE_GPON,
    BCMOLT_PON_API_TYPE_XGPON,
} bcmolt_pon_api_type;

typedef enum
{
    BCMOLT_PON_US_RATE_1G,
    BCMOLT_PON_US_RATE_2P5G,
    BCMOLT_PON_US_RATE_10G,
} bcmolt_pon_us_rate;

/* Number of PON NIs per PON mode */
#define GPON_MAX_NUM_OF_PONS 16
#define XGPON_MAX_NUM_OF_PONS 8
#define XGPON_HALF_CHIP_MAX_NUM_OF_PONS 4
#define XGS_2X_NUM_OF_PONS 2
#define NGPON2_2X_NUM_OF_PONS 2
#define NGPON2_8X_NUM_OF_PONS 8

/* ONU's per PON */
#define GPON_NUM_OF_ONUS 128
#define XGPON_NUM_OF_ONUS 256
#define XGPON_MAX_NUM_OF_ONUS 510

/* Alloc ID's per PON */
#define GPON_NUM_OF_DYNAMIC_ALLOC_INDICES 640
#define GPON_NUM_OF_ALLOC_IDS 1024
#define XGPON_NUM_OF_DYNAMIC_ALLOC_INDICES 1280
#define XGPON_NUM_OF_ALLOC_IDS 2048

/* Alloc ID's per ONU */
#define GPON_NUM_OF_ALLOC_IDS_PER_ONU 32
#define XGPON_NUM_OF_ALLOC_IDS_PER_ONU 32
#define NUM_OF_ALLOC_IDS_PER_ONU (MAX(GPON_NUM_OF_ALLOC_IDS_PER_ONU, XGPON_NUM_OF_ALLOC_IDS_PER_ONU))

#define GPON_ONU_ID_BROADCAST ((bcmolt_pon_onu_id)0xFF)
#define XGPON_ONU_ID_BROADCAST ((bcmolt_pon_onu_id)0x3FF)
#define GPON_ONU_ID_UNASSIGNED GPON_ONU_ID_BROADCAST
#define XGPON_ONU_ID_UNASSIGNED XGPON_ONU_ID_BROADCAST
#define XGPON_DUMMY_ONU_ID ((bcmolt_pon_onu_id)511)

#define GPON_ALLOC_ID_BROADCAST ((bcmolt_pon_alloc_id)0xFE)
#define XGPON_ALLOC_ID_BROADCAST ((bcmolt_pon_alloc_id)0x3FF) /* Used for 2.5G upstream in XGPON/XGS/NGPON2 */
#define TEN_GIG_ALLOC_ID_BROADCAST ((bcmolt_pon_alloc_id)0x3FE) /* Used for 10G upstream in XGS/NGPON2 */
#define TEN_OR_2P5_GIG_ALLOC_ID_BROADCAST ((bcmolt_pon_alloc_id)0x3FD) /* Used for either 2.5G/10G upstream in XGS/NGPON2 */
#define GPON_ALLOC_ID_UNASSIGNED ((bcmolt_pon_alloc_id)0xFF)
#define XGPON_ALLOC_ID_UNASSIGNED ((bcmolt_pon_alloc_id)512) /* In XGPON we have up to 512 ONU's, and alloc ID is unused for sure. */
#define XGPON_DUMMY_ALLOC_ID ((bcmolt_pon_alloc_id)511)

/* GEM PORT ID's per PON */
#define GPON_NUM_OF_GEM_PORT_IDS_PER_PON 4096
#define XGPON_NUM_OF_GEM_PORT_IDS_PER_PON 8192
/* GEM PORT ID's per ONU */
#define MAX_NUM_OF_GEM_PORT_IDS_PER_ONU 256

/* OMCI/CPU packets */
#define OMCI_CRC_LEN 4

/* Packet sizes - all values in bytes resolution */
#define OMCI_MIN_PKT_SIZE_WITH_CRC 14
#define OMCI_MIN_PKT_SIZE_WO_CRC 10
#define OMCI_MAX_PKT_SIZE_WITH_CRC 1980
#define OMCI_MAX_PKT_SIZE_WO_CRC 1976
#define OMCI_BASELINE_PKT_SIZE_WO_CRC 44
#define OMCI_EXTENDED_PKT_SIZE_WO_CRC OMCI_MAX_PKT_SIZE_WO_CRC
#define CPU_MIN_PKT_SIZE_WITH_CRC 64
#define CPU_MIN_PKT_SIZE_WO_CRC 60
#define CPU_MAX_PKT_SIZE_WITH_CRC 2048
#define CPU_MAX_PKT_SIZE_WO_CRC 2044

#endif

