/*
<: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_H_
#define _BCM_COMMON_GPON_H_

#include "bcm_dev_log.h"
#include "bcmcli.h"
#include "bcmolt_model_types.h"
#include "bcmolt_math.h"
#include "bcmolt_conv.h"
#include "bcm_common_gpon_constants.h"

typedef struct
{
    bcmolt_pon_mode pon_mode;
    bcmolt_pon_api_type api_type;
    uint16_t num_of_onus;
    uint16_t num_of_alloc_ids;
    uint16_t num_of_dynamic_alloc_indices;
    uint16_t num_of_gem_ports;
    uint16_t num_of_alloc_ids_per_onu;
    bcmolt_pon_onu_id onu_id_broadcast;
    bcmolt_pon_onu_id onu_id_unassigned;
    bcmolt_pon_alloc_id alloc_id_broadcast;
    bcmolt_pon_alloc_id alloc_id_invalid;
    bcmolt_pon_alloc_id alloc_id_unassigned;
    bcmolt_pon_us_rate us_rate;
} pon_mode_db;

typedef struct
{
    uint8_t num_of_pons;
    pon_mode_db pons[MAX_NUM_OF_PONS];
} sys_mode_db;

/* System mode database, initialized at system start.
 * Used for constants that change based on PON mode, chip type, etc. */
extern sys_mode_db *smdbg;

/* Get the PON mode database handle for a given PON index (shortcut for smdbg->pons[pon_id]). */
#define PMDB(pon_id) ((const pon_mode_db *)&smdbg->pons[pon_id])

/* Get the PON mode for a given PON index (shortcut for PMDB(pon_id)->pon_mode). */
#define PON_MODE(pon_id) (PMDB(pon_id)->pon_mode)
BCMOLT_TYPE2STR(bcmolt_pon_mode, extern)

/* Generic function that can be used to raise a software error for unsupported PON modes. */
static inline bcmos_errno error_pon_mode_not_supported(bcmolt_pon_ni pon_ni)
{
    bcmolt_pon_mode mode = PON_MODE(pon_ni);
    BCMOS_TRACE_ERR("PON mode not supported for PON NI-%d: %s (%u)\n", pon_ni, bcmolt_pon_mode2str_conv(mode), mode);
    return BCM_ERR_INTERNAL;
}

/* Get a module ID with a base module + instance (PON, cluster, etc.) offset in a type-safe way */
#define MODULE_INSTANCE(base_module_id, instance) (bcmos_module_id)((uint32_t)(base_module_id) + (uint32_t)(instance))

/* Same as MODULE_INSTANCE, but for events. */
#define EVENT_INSTANCE(base_event_id, instance) (bcmos_event_id)((uint32_t)(base_event_id) + (uint32_t)(instance))

#define FOR_EACH_ONU(pon_id, onu_id) \
    for (onu_id = (bcmolt_pon_onu_id)0; onu_id < (bcmolt_pon_onu_id)PMDB(pon_id)->num_of_onus; onu_id++)

#define FOR_EACH_ALLOC_INDEX(pon_id, alloc_index) \
    for (alloc_index = (bcmolt_pon_alloc_index)0; alloc_index < (bcmolt_pon_alloc_index)PMDB(pon_id)->num_of_alloc_ids; alloc_index++)

#define FOR_EACH_GEM_INDEX(pon_id, gem_port_index) \
    for (gem_port_index = 0; (bcmolt_pon_gem_port_index)gem_port_index < (bcmolt_pon_gem_port_index)PMDB(pon_id)->num_of_gem_ports; gem_port_index++)

#define ALLOC_INDEX_IS_VALID(pon_id, alloc_index) ((alloc_index) < (bcmolt_pon_alloc_index)PMDB(pon_id)->num_of_alloc_ids)
#define GEM_PORT_INDEX_IS_VALID(pon_id, gem_port_index) \
    ((gem_port_index) < (bcmolt_pon_gem_port_index)PMDB(pon_id)->num_of_gem_ports)

#define ALLOC_ID_LAST_DEFAULT(pon_id) ((bcmolt_pon_alloc_id)(PMDB(pon_id)->num_of_onus - 1))
#define ALLOC_ID_LAST_DATA(pon_id, first_data_alloc_id) \
    ((first_data_alloc_id) + (bcmolt_pon_alloc_id)(PMDB(pon_id)->num_of_alloc_ids - PMDB(pon_id)->num_of_onus - 1))
#define ALLOC_ID_IS_VALID_DATA(pon_id, alloc_id, first_data_alloc_id) ( \
    ((alloc_id) >= (first_data_alloc_id) && (alloc_id) <= ALLOC_ID_LAST_DATA(pon_id, first_data_alloc_id)))
#define ALLOC_ID_IS_VALID(pon_id, alloc_id, first_data_alloc_id) ( \
    ((alloc_id) <= ALLOC_ID_LAST_DEFAULT(pon_id)) || \
    ALLOC_ID_IS_VALID_DATA(pon_id, alloc_id, first_data_alloc_id))

#define GEM_PORT_ID_LAST_DEFAULT(pon_id) ((bcmolt_pon_gem_port_id)(PMDB(pon_id)->num_of_onus - 1))
#define GEM_PORT_ID_LAST_DATA(pon_id, first_data_port_id) \
    ((first_data_port_id) + (bcmolt_pon_gem_port_id)(PMDB(pon_id)->num_of_gem_ports - PMDB(pon_id)->num_of_onus - 1))
#define GEM_PORT_ID_IS_VALID_DATA(pon_id, gem_port_id, first_data_port_id) ( \
    ((gem_port_id) >= (first_data_port_id) && (gem_port_id) <= GEM_PORT_ID_LAST_DATA(pon_id, first_data_port_id)))
#define GEM_PORT_ID_IS_VALID(pon_id, gem_port_id, first_data_port_id) ( \
    ((gem_port_id) <= GEM_PORT_ID_LAST_DEFAULT(pon_id)) || \
    GEM_PORT_ID_IS_VALID_DATA(pon_id, gem_port_id, first_data_port_id))

#define PON_ID_IS_VALID(system_mode, pon_id) ( \
    ((uint8_t)pon_id < smdbg->num_of_pons) && \
    (system_mode != BCMOLT_SYSTEM_MODE_GPON_8_XGPON_4_X_COEXISTENCE || pon_id < XGPON_HALF_CHIP_MAX_NUM_OF_PONS || pon_id >= XGPON_MAX_NUM_OF_PONS))

void bcm_common_gpon_init(bcmolt_system_mode system_mode);
bcmolt_system_mode bcm_common_gpon_get_system_mode(void);

#endif

