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

   Copyright (c) 2014 Broadcom Corporation
   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.
:>
*/
#include "bcm_common_gpon.h"

static pon_mode_db db_gpon =
{
    .pon_mode = BCMOLT_PON_MODE_GPON,
    .api_type = BCMOLT_PON_API_TYPE_GPON,
    .num_of_onus = GPON_NUM_OF_ONUS,
    .num_of_alloc_ids = GPON_NUM_OF_ALLOC_IDS,
    .num_of_dynamic_alloc_indices = GPON_NUM_OF_DYNAMIC_ALLOC_INDICES,
    .num_of_gem_ports = GPON_NUM_OF_GEM_PORT_IDS_PER_PON,
    .num_of_alloc_ids_per_onu = GPON_NUM_OF_ALLOC_IDS_PER_ONU,
    .onu_id_broadcast = GPON_ONU_ID_BROADCAST,
    .onu_id_unassigned = GPON_ONU_ID_UNASSIGNED,
    .alloc_id_broadcast = GPON_ALLOC_ID_BROADCAST,
    .alloc_id_invalid = BCMOLT_GPON_ALLOC_ID_INVALID,
    .alloc_id_unassigned = GPON_ALLOC_ID_UNASSIGNED,
    .us_rate = BCMOLT_PON_US_RATE_1G,
};

static pon_mode_db db_xgpon =
{
    .pon_mode = BCMOLT_PON_MODE_XGPON,
    .api_type = BCMOLT_PON_API_TYPE_XGPON,
    .num_of_onus = XGPON_NUM_OF_ONUS,
    .num_of_alloc_ids = XGPON_NUM_OF_ALLOC_IDS,
    .num_of_dynamic_alloc_indices = XGPON_NUM_OF_DYNAMIC_ALLOC_INDICES,
    .num_of_gem_ports = XGPON_NUM_OF_GEM_PORT_IDS_PER_PON,
    .num_of_alloc_ids_per_onu = XGPON_NUM_OF_ALLOC_IDS_PER_ONU,
    .onu_id_broadcast = XGPON_ONU_ID_BROADCAST,
    .onu_id_unassigned = XGPON_ONU_ID_UNASSIGNED,
    .alloc_id_broadcast = XGPON_ALLOC_ID_BROADCAST,
    .alloc_id_invalid = BCMOLT_XGPON_ALLOC_ID_INVALID,
    .alloc_id_unassigned = XGPON_ALLOC_ID_UNASSIGNED,
    .us_rate = BCMOLT_PON_US_RATE_2P5G,
};

static pon_mode_db db_xgs =
{
    .pon_mode = BCMOLT_PON_MODE_XGS,
    .api_type = BCMOLT_PON_API_TYPE_XGPON,
    .num_of_onus = XGPON_NUM_OF_ONUS,
    .num_of_alloc_ids = XGPON_NUM_OF_ALLOC_IDS,
    .num_of_dynamic_alloc_indices = XGPON_NUM_OF_DYNAMIC_ALLOC_INDICES,
    .num_of_gem_ports = XGPON_NUM_OF_GEM_PORT_IDS_PER_PON,
    .num_of_alloc_ids_per_onu = XGPON_NUM_OF_ALLOC_IDS_PER_ONU,
    .onu_id_broadcast = XGPON_ONU_ID_BROADCAST,
    .onu_id_unassigned = XGPON_ONU_ID_UNASSIGNED,
    .alloc_id_broadcast = TEN_GIG_ALLOC_ID_BROADCAST,
    .alloc_id_invalid = BCMOLT_XGPON_ALLOC_ID_INVALID,
    .alloc_id_unassigned = XGPON_ALLOC_ID_UNASSIGNED,
    .us_rate = BCMOLT_PON_US_RATE_10G,
};

static pon_mode_db db_ngpon2 =
{
    .pon_mode = BCMOLT_PON_MODE_NGPON2,
    .api_type = BCMOLT_PON_API_TYPE_XGPON,
    .num_of_onus = XGPON_NUM_OF_ONUS,
    .num_of_alloc_ids = XGPON_NUM_OF_ALLOC_IDS,
    .num_of_dynamic_alloc_indices = XGPON_NUM_OF_DYNAMIC_ALLOC_INDICES,
    .num_of_gem_ports = XGPON_NUM_OF_GEM_PORT_IDS_PER_PON,
    .num_of_alloc_ids_per_onu = XGPON_NUM_OF_ALLOC_IDS_PER_ONU,
    .onu_id_broadcast = XGPON_ONU_ID_BROADCAST,
    .onu_id_unassigned = XGPON_ONU_ID_UNASSIGNED,
    .alloc_id_broadcast = TEN_GIG_ALLOC_ID_BROADCAST,
    .alloc_id_invalid = BCMOLT_XGPON_ALLOC_ID_INVALID,
    .alloc_id_unassigned = XGPON_ALLOC_ID_UNASSIGNED,
    .us_rate = BCMOLT_PON_US_RATE_10G,
};

static pon_mode_db db_ngpon2_2_5_g =
{
    .pon_mode = BCMOLT_PON_MODE_NGPON2,
    .api_type = BCMOLT_PON_API_TYPE_XGPON,
    .num_of_onus = XGPON_NUM_OF_ONUS,
    .num_of_alloc_ids = XGPON_NUM_OF_ALLOC_IDS,
    .num_of_dynamic_alloc_indices = XGPON_NUM_OF_DYNAMIC_ALLOC_INDICES,
    .num_of_gem_ports = XGPON_NUM_OF_GEM_PORT_IDS_PER_PON,
    .num_of_alloc_ids_per_onu = XGPON_NUM_OF_ALLOC_IDS_PER_ONU,
    .onu_id_broadcast = XGPON_ONU_ID_BROADCAST,
    .onu_id_unassigned = XGPON_ONU_ID_UNASSIGNED,
    .alloc_id_broadcast = XGPON_ALLOC_ID_BROADCAST,
    .alloc_id_invalid = BCMOLT_XGPON_ALLOC_ID_INVALID,
    .alloc_id_unassigned = XGPON_ALLOC_ID_UNASSIGNED,
    .us_rate = BCMOLT_PON_US_RATE_2P5G,
};

static sys_mode_db db_sys = {};
sys_mode_db *smdbg = &db_sys;

void bcm_common_gpon_init(bcmolt_system_mode system_mode)
{
    uint8_t i;
    bcmolt_xgpon_num_of_onus xgpon_num_of_onus;
    /* need to check for XGPON XGS NGPON2 modes, the supported number of onus */
    bcmolt_xgpon_num_of_onus_get(0, &xgpon_num_of_onus);

    switch (system_mode)
    {
    case BCMOLT_SYSTEM_MODE_GPON__16_X:
        smdbg->num_of_pons = GPON_MAX_NUM_OF_PONS;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
            smdbg->pons[i] = db_gpon;
        }
        break;
    case BCMOLT_SYSTEM_MODE_GPON__8_X:
        smdbg->num_of_pons = GPON_MAX_NUM_OF_PONS / 2;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
            smdbg->pons[i] = db_gpon;
        }
        break;
    case BCMOLT_SYSTEM_MODE_GPON__4_X:
        smdbg->num_of_pons = GPON_MAX_NUM_OF_PONS / 4;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
            smdbg->pons[i] = db_gpon;
        }
        break;
    case BCMOLT_SYSTEM_MODE_XGPON_1__8_X:
        smdbg->num_of_pons = XGPON_MAX_NUM_OF_PONS;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
        	smdbg->pons[i] = db_xgpon;
        	if (xgpon_num_of_onus == BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS)
        	{
        		smdbg->pons[i].num_of_onus = XGPON_MAX_NUM_OF_ONUS;
        	}
        }
        break;
    case BCMOLT_SYSTEM_MODE_XGPON_1__4_X:
        smdbg->num_of_pons = XGPON_MAX_NUM_OF_PONS / 2;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
        	smdbg->pons[i] = db_xgpon;
        	if (xgpon_num_of_onus == BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS)
        	{
        		smdbg->pons[i].num_of_onus = XGPON_MAX_NUM_OF_ONUS;
        	}
        }
        break;
    case BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE:
        smdbg->num_of_pons = GPON_MAX_NUM_OF_PONS;
        /* Initialize first half chip as XGPON */
        for (i=0; i<XGPON_MAX_NUM_OF_PONS; i++)
        {
        	smdbg->pons[i] = db_xgpon;
        	if (xgpon_num_of_onus == BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS)
        	{
        		smdbg->pons[i].num_of_onus = XGPON_MAX_NUM_OF_ONUS;
        	}
        }
        /* Initialize second half chip as GPON */
        for (; i<smdbg->num_of_pons; i++)
        {
            smdbg->pons[i] = db_gpon;
        }
        break;
    case BCMOLT_SYSTEM_MODE_XGS__2_X_10_G:
        smdbg->num_of_pons = XGS_2X_NUM_OF_PONS;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
        	smdbg->pons[i] = db_xgs;
        	if (xgpon_num_of_onus == BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS)
        	{
        		smdbg->pons[i].num_of_onus = XGPON_MAX_NUM_OF_ONUS;
        	}
        }
        break;
    case BCMOLT_SYSTEM_MODE_NGPON2__2_X_10_G:
        smdbg->num_of_pons = NGPON2_2X_NUM_OF_PONS;
        for (i=0; i<smdbg->num_of_pons; i++)
        {
        	smdbg->pons[i] = db_ngpon2;
        	if (xgpon_num_of_onus == BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS)
        	{
        		smdbg->pons[i].num_of_onus = XGPON_MAX_NUM_OF_ONUS;
        	}
        }
        break;
    case BCMOLT_SYSTEM_MODE_NGPON2__8_X_2_P_5_G:
           smdbg->num_of_pons = NGPON2_8X_NUM_OF_PONS;
           for (i=0; i<smdbg->num_of_pons; i++)
           {
        	   smdbg->pons[i] = db_ngpon2_2_5_g;
        	   if (xgpon_num_of_onus == BCMOLT_XGPON_NUM_OF_ONUS_XGPON_SUPPORT_510_ONUS)
        	   {
        		   smdbg->pons[i].num_of_onus = XGPON_MAX_NUM_OF_ONUS;
        	   }
           }
           break;
    default:
        smdbg->num_of_pons = 0;
        break;
    }

}

bcmolt_system_mode bcm_common_gpon_get_system_mode(void)
{
    bcmolt_system_mode system_mode;

    /* ToDo: XXX: it requires work. JIRA SWMAPLE-3724 */
    bcmolt_system_mode_get(0, &system_mode);
    return system_mode;
}

bcmolt_pon_mode2str_t bcmolt_pon_mode2str[] =
{
    {BCMOLT_PON_MODE_GPON, "gpon"},
    {BCMOLT_PON_MODE_XGPON, "xgpon"},
    {BCMOLT_PON_MODE_XGS, "xgs"},
    {BCMOLT_PON_MODE_NGPON2, "ngpon2"},
    {-1}
};
