blob: 464d661075219d5088d04a2366c2a36aa99f42c5 [file] [log] [blame]
/*
<: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