Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sonic-sairedis: Add support to sonic-sairedis for gearbox phys #624

Merged
merged 4 commits into from
Jun 26, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/src/RedisChannel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ sai_status_t RedisChannel::wait(

swss::Selectable *sel;

int result = s.select(&sel, REDIS_ASIC_STATE_COMMAND_GETRESPONSE_TIMEOUT_MS);
int result = s.select(&sel, REDIS_ASIC_STATE_COMMAND_GETRESPONSE_TIMEOUT_MS * 10);
sydlogan marked this conversation as resolved.
Show resolved Hide resolved

if (result == swss::Select::OBJECT)
{
Expand Down
8 changes: 4 additions & 4 deletions lib/src/context_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
{
"guid" : 1,
"name" : "syncd1",
"dbAsic" : "ASIC_DB2",
"dbCounters" : "COUNTERS_DB2",
"dbFlex": "FLEX_COUNTER_DB2",
"dbState" : "STATE_DB2",
"dbAsic" : "GB_ASIC_DB",
"dbCounters" : "GB_COUNTERS_DB",
"dbFlex": "GB_FLEX_COUNTER_DB",
"dbState" : "STATE_DB",
"switches": [
{
"index" : 0,
Expand Down
24 changes: 24 additions & 0 deletions lib/src/sai_redis_switch.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
#include "sai_redis.h"

sai_status_t redis_switch_mdio_read(
_In_ sai_object_id_t switch_id,
_In_ uint32_t device_addr,
_In_ uint32_t start_reg_addr,
_In_ uint32_t number_of_registers,
_Out_ uint32_t *reg_val)
{
SWSS_LOG_ENTER();

return SAI_STATUS_NOT_IMPLEMENTED;
}

sai_status_t redis_switch_mdio_write(
_In_ sai_object_id_t switch_id,
_In_ uint32_t device_addr,
_In_ uint32_t start_reg_addr,
_In_ uint32_t number_of_registers,
_In_ const uint32_t *reg_val)
{
SWSS_LOG_ENTER();

return SAI_STATUS_NOT_IMPLEMENTED;
}

REDIS_GENERIC_QUAD(SWITCH,switch);
REDIS_GENERIC_STATS(SWITCH,switch);

Expand Down
30 changes: 28 additions & 2 deletions syncd/SaiSwitch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,19 @@ SaiSwitch::SaiSwitch(

helperInternalOids();

helperCheckLaneMap();
if (getSwitchType() == SAI_SWITCH_TYPE_NPU)
{
helperCheckLaneMap();
sydlogan marked this conversation as resolved.
Show resolved Hide resolved
}

helperLoadColdVids();

helperPopulateWarmBootVids();

saiGetMacAddress(m_default_mac_address);
if (getSwitchType() == SAI_SWITCH_TYPE_NPU)
{
saiGetMacAddress(m_default_mac_address);
}

if (warmBoot)
{
Expand Down Expand Up @@ -131,6 +137,26 @@ void SaiSwitch::getDefaultMacAddress(
memcpy(mac, m_default_mac_address, sizeof(sai_mac_t));
}

sai_switch_type_t SaiSwitch::getSwitchType() const
{
SWSS_LOG_ENTER();

sai_attribute_t attr;

attr.id = SAI_SWITCH_ATTR_TYPE;

sai_status_t status = m_vendorSai->get(SAI_OBJECT_TYPE_SWITCH, m_switch_rid, 1, &attr);

if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("failed to get switch type");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in case of failure we should throw here, or return explicitly default switch type

}

SWSS_LOG_ERROR("switch type: '%s'", (attr.value.s32 == SAI_SWITCH_TYPE_NPU ? "SAI_SWITCH_TYPE_NPU" : "SAI_SWITCH_TYPE_PHY"));

return (sai_switch_type_t) attr.value.s32;
}

#define MAX_HARDWARE_INFO_LENGTH 0x1000

std::string SaiSwitch::saiGetHardwareInfo() const
Expand Down
1 change: 1 addition & 0 deletions syncd/SaiSwitch.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ namespace syncd
sai_object_id_t getVid() const;
sai_object_id_t getRid() const;

sai_switch_type_t getSwitchType() const;
std::string getHardwareInfo() const;

std::unordered_map<sai_object_id_t, sai_object_id_t> getVidToRidMap() const;
Expand Down
89 changes: 89 additions & 0 deletions syncd/scripts/physyncd_init_common.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
sydlogan marked this conversation as resolved.
Show resolved Hide resolved

CMD_PHYSYNCD=/usr/bin/physyncd

# dsserve: domain socket server for stdio
CMD_DSSERVE=/usr/bin/dsserve
CMD_DSSERVE_ARGS="$CMD_PHYSYNCD --diag"

ENABLE_SAITHRIFT=0

PLATFORM_DIR=/usr/share/sonic/platform
HWSKU_DIR=/usr/share/sonic/hwsku

SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type)

if [ -x $CMD_DSSERVE ]; then
CMD=$CMD_DSSERVE
CMD_ARGS=$CMD_DSSERVE_ARGS
else
CMD=$CMD_PHYSYNCD
CMD_ARGS=
fi

# Use temporary view between init and apply
CMD_ARGS+=" -u"

BOOT_TYPE="$(cat /proc/cmdline | grep -o 'SONIC_BOOT_TYPE=\S*' | cut -d'=' -f2)"

case "$BOOT_TYPE" in
fast-reboot)
FAST_REBOOT='yes'
;;
fastfast)
if [ -e /var/warmboot/warm-starting ]; then
FASTFAST_REBOOT='yes'
fi
;;
*)
FAST_REBOOT='no'
FASTFAST_REBOOT='no'
;;
esac


function check_warm_boot()
{
# FIXME: if we want to continue start option approach, then we need to add
# code here to support redis database query.
# SYSTEM_WARM_START=`/usr/bin/redis-cli -n 6 hget "WARM_RESTART_ENABLE_TABLE|system" enable`
# SERVICE_WARM_START=`/usr/bin/redis-cli -n 6 hget "WARM_RESTART_ENABLE_TABLE|${SERVICE}" enable`
# SYSTEM_WARM_START could be empty, always make WARM_BOOT meaningful.
# if [[ x"$SYSTEM_WARM_START" == x"true" ]] || [[ x"$SERVICE_WARM_START" == x"true" ]]; then
# WARM_BOOT="true"
# else
WARM_BOOT="false"
# fi
}


function set_start_type()
{
if [ x"$WARM_BOOT" == x"true" ]; then
CMD_ARGS+=" -t warm"
elif [ $FAST_REBOOT == "yes" ]; then
CMD_ARGS+=" -t fast"
elif [ $FASTFAST_REBOOT == "yes" ]; then
CMD_ARGS+=" -t fastfast"
fi
}


config_syncd_bcm()
{
:;
}


config_physyncd()
{

set_start_type

if [ ${ENABLE_SAITHRIFT} == 1 ]; then
CMD_ARGS+=" -r -m $HWSKU_DIR/port_config.ini"
fi

[ -r $PLATFORM_DIR/physyncd.conf ] && . $PLATFORM_DIR/physyncd.conf
}

12 changes: 12 additions & 0 deletions syncd/scripts/physyncd_start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
#
# Script to start syncd using supervisord
#

# Source the file that holds common code for systemd and supervisord
. /usr/bin/physyncd_init_common.sh

config_physyncd

exec "/usr/bin/physyncd_startup.py"

48 changes: 48 additions & 0 deletions syncd/scripts/physyncd_startup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/usr/bin/python

'''
Copyright 2019 Broadcom. The term "Broadcom" refers to Broadcom Inc.
and/or its subsidiaries.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''
import os
import json
import subprocess


def physyncd_enable(gearbox_config):
i = 1
for phy in gearbox_config['phys']:
subprocess.Popen(["/bin/bash", "-c", "/bin/bash -c {}".format('"exec /usr/bin/syncd -p /etc/sai.d/pai.profile -x /usr/share/sonic/hwsku/context_config.json -g {}"'.format(i))], close_fds=True)
i += 1

def main():

# Only privileged users can execute this command
if os.geteuid() != 0:
sys.exit("Root privileges required for this operation")

""" Loads json file """
try:
with open('/usr/share/sonic/hwsku/gearbox_config.json') as file_object:
sydlogan marked this conversation as resolved.
Show resolved Hide resolved
gearbox_config=json.load(file_object)
except:
sys.exit("No external PHY / gearbox supported on this platform, existing physycd application")

physyncd_enable(gearbox_config)


if __name__== "__main__":
main()

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ if SAITHRIFT
vssyncd_LDADD += -lrpcserver -lthrift
endif

TESTS = aspellcheck.pl conflictnames.pl swsslogentercheck.sh brcm.pl mlnx.pl
TESTS = aspellcheck.pl conflictnames.pl swsslogentercheck.sh BCM56850.pl MLNX2700.pl
104 changes: 104 additions & 0 deletions vslib/inc/SwitchBCM81724.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*

Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or
its subsidiaries.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

*/

#pragma once

#include "SwitchStateBase.h"

namespace saivs
{
class SwitchBCM81724:
public SwitchStateBase
{
public:

SwitchBCM81724(
_In_ sai_object_id_t switch_id,
_In_ std::shared_ptr<RealObjectIdManager> manager,
_In_ std::shared_ptr<SwitchConfig> config);

SwitchBCM81724(
_In_ sai_object_id_t switch_id,
_In_ std::shared_ptr<RealObjectIdManager> manager,
_In_ std::shared_ptr<SwitchConfig> config,
_In_ std::shared_ptr<WarmBootState> warmBootState);

virtual ~SwitchBCM81724();

protected:

virtual sai_status_t create_port_dependencies(_In_ sai_object_id_t port_id) override;

virtual sai_status_t create_qos_queues_per_port(_In_ sai_object_id_t port_id) override;

virtual sai_status_t create_qos_queues() override;

virtual sai_status_t set_switch_mac_address() override;

virtual sai_status_t create_default_vlan() override;

virtual sai_status_t create_default_1q_bridge() override;

virtual sai_status_t create_default_virtual_router() override;

virtual sai_status_t create_default_stp_instance() override;

virtual sai_status_t create_default_trap_group() override;

virtual sai_status_t create_ingress_priority_groups_per_port(
_In_ sai_object_id_t port_id) override;

virtual sai_status_t create_ingress_priority_groups() override;

virtual sai_status_t create_vlan_members() override;

virtual sai_status_t create_bridge_ports() override;

virtual sai_status_t set_acl_entry_min_prio() override;

virtual sai_status_t set_acl_capabilities() override;

virtual sai_status_t set_maximum_number_of_childs_per_scheduler_group() override;

virtual sai_status_t set_number_of_ecmp_groups() override;

virtual sai_status_t create_cpu_port();

virtual sai_status_t create_ports();

protected : // refresh

virtual sai_status_t refresh_port_list(
_In_ const sai_attr_metadata_t *meta) override;

virtual sai_status_t refresh_bridge_port_list(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t bridge_id) override;

virtual sai_status_t refresh_vlan_member_list(
_In_ const sai_attr_metadata_t *meta,
_In_ sai_object_id_t vlan_id) override;

protected:

virtual sai_status_t refresh_read_only( _In_ const sai_attr_metadata_t *meta, _In_ sai_object_id_t object_id) override;
virtual sai_status_t set_switch_default_attributes();
virtual sai_status_t initialize_default_objects() override;
};
}
Loading