From 5576c11c1248a829f894fc38450edf234c15fd36 Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Thu, 15 Feb 2018 11:10:37 +0800 Subject: [PATCH] New model as7312 54x (#1339) * Update sonic-platform-modules-accton to lastest Signed-off-by: roylee123 * Install sonic-platform-common package in platform-monitor docker for ledd (#1330) * Install sonic-platform-common package in platform-monitor docker for ledd * Specify Python wheel dependencies in docker-platform-monitor.mk; Remove explicit specifications from Dockerfile.j2 * [7312_54x] Add plug-in files. Signed-off-by: roylee123 * [as7312-54x] Update i2c related drivers after tested on R0B model. Signed-off-by: roylee123 * Add as7312-54x driver package. Signed-off-by: roylee123 * [as7312-54x] Add index to port_config.ini for mmaping port with single lane. Validate sfputil.py and mark unsupported for lp mode. Signed-off-by: roylee123 * [as7312-54x] Change for R01 HW board. Signed-off-by: roylee123 * [as7312-54x] recovered for the lint corrected not suitable for python. Signed-off-by: roylee123 * Remove debug printing. Signed-off-by: roylee123 * [platform] as7312-32x, update for util.py recovered. Signed-off-by: roylee123 * [platform] Accton: merged the commit by Polly Hsu. Change platform modules to depend on 3.16.0-5-amdn64 kernel. Signed-off-by: roylee123 * [Device] As7312-54x, update for correct I2C addresses for sfp and psu. Signed-off-by: roy_lee * [Platform] as7312-54x, pushed submodule to new i2c drivers and script. Signed-off-by: roy_lee * resolved PR New model as7312 54x #1339 merge conflicts on sfputil.py. Signed-off-by: roy_lee --- .../Accton-AS7312-54X/port_config.ini | 110 +++++----- .../plugins/eeprom.py | 24 +++ .../plugins/psuutil.py | 61 ++++++ .../plugins/sfputil.py | 202 ++++++++++++++++++ platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-accton.mk | 5 + .../broadcom/sonic-platform-modules-accton | 2 +- 7 files changed, 349 insertions(+), 56 deletions(-) create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py diff --git a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini index 8eeb6a993cb5..2c4d0c023772 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini +++ b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini @@ -1,55 +1,55 @@ -# name lanes alias -Ethernet0 41 twentyfiveGigE1 -Ethernet1 42 twentyfiveGigE2 -Ethernet2 43 twentyfiveGigE3 -Ethernet3 44 twentyfiveGigE4 -Ethernet4 49 twentyfiveGigE5 -Ethernet5 50 twentyfiveGigE6 -Ethernet6 51 twentyfiveGigE7 -Ethernet7 52 twentyfiveGigE8 -Ethernet8 53 twentyfiveGigE9 -Ethernet9 54 twentyfiveGigE10 -Ethernet10 55 twentyfiveGigE11 -Ethernet11 56 twentyfiveGigE12 -Ethernet12 65 twentyfiveGigE13 -Ethernet13 66 twentyfiveGigE14 -Ethernet14 67 twentyfiveGigE15 -Ethernet15 68 twentyfiveGigE16 -Ethernet16 33 twentyfiveGigE17 -Ethernet17 34 twentyfiveGigE18 -Ethernet18 35 twentyfiveGigE19 -Ethernet19 36 twentyfiveGigE20 -Ethernet20 37 twentyfiveGigE21 -Ethernet21 38 twentyfiveGigE22 -Ethernet22 39 twentyfiveGigE23 -Ethernet23 40 twentyfiveGigE24 -Ethernet24 69 twentyfiveGigE25 -Ethernet25 70 twentyfiveGigE26 -Ethernet26 71 twentyfiveGigE27 -Ethernet27 72 twentyfiveGigE28 -Ethernet28 81 twentyfiveGigE29 -Ethernet29 82 twentyfiveGigE30 -Ethernet30 83 twentyfiveGigE31 -Ethernet31 84 twentyfiveGigE32 -Ethernet32 85 twentyfiveGigE33 -Ethernet33 86 twentyfiveGigE34 -Ethernet34 87 twentyfiveGigE35 -Ethernet35 88 twentyfiveGigE36 -Ethernet36 97 twentyfiveGigE37 -Ethernet37 98 twentyfiveGigE38 -Ethernet38 99 twentyfiveGigE39 -Ethernet39 100 twentyfiveGigE40 -Ethernet40 101 twentyfiveGigE41 -Ethernet41 102 twentyfiveGigE42 -Ethernet42 103 twentyfiveGigE43 -Ethernet43 104 twentyfiveGigE44 -Ethernet44 105 twentyfiveGigE45 -Ethernet45 106 twentyfiveGigE46 -Ethernet46 107 twentyfiveGigE47 -Ethernet47 108 twentyfiveGigE48 -Ethernet48 5,6,7,8 hundredGigE49 -Ethernet52 1,2,3,4 hundredGigE50 -Ethernet56 109,110,111,112 hundredGigE51 -Ethernet60 21,22,23,24 hundredGigE52 -Ethernet64 9,10,11,12 hundredGigE53 -Ethernet68 117,118,119,120 hundredGigE54 +# name lanes alias index +Ethernet0 41 twentyfiveGigE1 0 +Ethernet1 42 twentyfiveGigE2 1 +Ethernet2 43 twentyfiveGigE3 2 +Ethernet3 44 twentyfiveGigE4 3 +Ethernet4 49 twentyfiveGigE5 4 +Ethernet5 50 twentyfiveGigE6 5 +Ethernet6 51 twentyfiveGigE7 6 +Ethernet7 52 twentyfiveGigE8 7 +Ethernet8 53 twentyfiveGigE9 8 +Ethernet9 54 twentyfiveGigE10 9 +Ethernet10 55 twentyfiveGigE11 10 +Ethernet11 56 twentyfiveGigE12 11 +Ethernet12 65 twentyfiveGigE13 12 +Ethernet13 66 twentyfiveGigE14 13 +Ethernet14 67 twentyfiveGigE15 14 +Ethernet15 68 twentyfiveGigE16 15 +Ethernet16 33 twentyfiveGigE17 16 +Ethernet17 34 twentyfiveGigE18 17 +Ethernet18 35 twentyfiveGigE19 18 +Ethernet19 36 twentyfiveGigE20 19 +Ethernet20 37 twentyfiveGigE21 20 +Ethernet21 38 twentyfiveGigE22 21 +Ethernet22 39 twentyfiveGigE23 22 +Ethernet23 40 twentyfiveGigE24 23 +Ethernet24 69 twentyfiveGigE25 24 +Ethernet25 70 twentyfiveGigE26 25 +Ethernet26 71 twentyfiveGigE27 26 +Ethernet27 72 twentyfiveGigE28 27 +Ethernet28 81 twentyfiveGigE29 28 +Ethernet29 82 twentyfiveGigE30 29 +Ethernet30 83 twentyfiveGigE31 30 +Ethernet31 84 twentyfiveGigE32 31 +Ethernet32 85 twentyfiveGigE33 32 +Ethernet33 86 twentyfiveGigE34 33 +Ethernet34 87 twentyfiveGigE35 34 +Ethernet35 88 twentyfiveGigE36 35 +Ethernet36 97 twentyfiveGigE37 36 +Ethernet37 98 twentyfiveGigE38 37 +Ethernet38 99 twentyfiveGigE39 38 +Ethernet39 100 twentyfiveGigE40 39 +Ethernet40 101 twentyfiveGigE41 40 +Ethernet41 102 twentyfiveGigE42 41 +Ethernet42 103 twentyfiveGigE43 42 +Ethernet43 104 twentyfiveGigE44 43 +Ethernet44 105 twentyfiveGigE45 44 +Ethernet45 106 twentyfiveGigE46 45 +Ethernet46 107 twentyfiveGigE47 46 +Ethernet47 108 twentyfiveGigE48 47 +Ethernet48 5,6,7,8 hundredGigE49 48 +Ethernet52 1,2,3,4 hundredGigE50 52 +Ethernet56 109,110,111,112 hundredGigE51 56 +Ethernet60 21,22,23,24 hundredGigE52 60 +Ethernet64 9,10,11,12 hundredGigE53 64 +Ethernet68 117,118,119,120 hundredGigE54 68 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..7681caafeef4 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" + #Two i2c buses might get flipped order, check them both. + if not os.path.exists(self.eeprom_path): + self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py new file mode 100644 index 000000000000..d73e65bf7981 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +############################################################################# +# Accton +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 2: "11-0053", + 1: "10-0050", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..2cac13d46b6b --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -0,0 +1,202 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 71 + PORTS_IN_BLOCK = 72 + QSFP_PORT_START = 48 + QSFP_PORT_END = 72 + + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _cpld_mapping = { + 0: "4-0060", + 1: "5-0062", + 2: "6-0064", + } + _port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49, + 32: 50, + 33: 51, + 34: 52, + 35: 53, + 36: 54, + 37: 55, + 38: 56, + 39: 57, + 40: 58, + 41: 59, + 42: 60, + 43: 61, + 44: 62, + 45: 63, + 46: 64, + 47: 65, + 48: 66, #QSFP49 + 49: 66, + 50: 66, + 51: 66, + 52: 67, #QSFP50 + 53: 67, + 54: 67, + 55: 67, + 56: 68, #QSFP51 + 57: 68, + 58: 68, + 59: 68, + 60: 69, #QSFP52 + 61: 69, + 62: 69, + 63: 69, + 64: 70, #QSFP53 + 65: 70, + 66: 70, + 67: 70, + 68: 71, #QSFP54 + 69: 71, + 70: 71, + 71: 71, + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x]) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # For cage 0~23 and 48~51 are at cpld2, others are at cpld3. + # For port 48~51 are QSFP, here presumed they are all broken-out to 4 lanes. + cage_num = port_num + cpld_i = 1 + if (port_num > 23): + cpld_i = 2 + + if (port_num >= self.QSFP_PORT_START): + cpld_i = 1 + cage_num = (port_num - self.QSFP_PORT_START)/4 + cage_num = cage_num + self.QSFP_PORT_START + if (cage_num >= 52): + cpld_i = 2 + + cpld_ps = self._cpld_mapping[cpld_i] + path = "/sys/bus/i2c/devices/{0}/module_present_{1}" + port_ps = path.format(cpld_ps, cage_num+1) + + try: + val_file = open(port_ps) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + + path = "/sys/bus/i2c/devices/5-0062/module_reset_{0}" + port_ps = path.format(port_num+1) + try: + reg_file = open(port_ps, 'w') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = '1' + + reg_file.write(reg_value) + reg_file.close() + + return True diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 80c4c3a86827..0ab2581c28b7 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -16,6 +16,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(ACCTON_AS5712_54X_PLATFORM_MODULE) \ $(ACCTON_AS7816_64X_PLATFORM_MODULE) \ $(ACCTON_AS7716_32X_PLATFORM_MODULE) \ + $(ACCTON_AS7312_54X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk index 08820e9a270a..db207673b995 100755 --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -4,11 +4,13 @@ ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS7716_32X_PLATFORM_MODULE_VERSION = 1.1 +ACCTON_AS7312_54X_PLATFORM_MODULE_VERSION = 1.1 export ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION export ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION export ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION export ACCTON_AS7716_32X_PLATFORM_MODULE_VERSION +export ACCTON_AS7312_54X_PLATFORM_MODULE_VERSION ACCTON_AS7712_32X_PLATFORM_MODULE = sonic-platform-accton-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton @@ -28,3 +30,6 @@ ACCTON_AS7716_32X_PLATFORM_MODULE = sonic-platform-accton-as7716-32x_$(ACCTON_AS $(ACCTON_AS7716_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7716_32x-r0 $(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS7716_32X_PLATFORM_MODULE))) +ACCTON_AS7312_54X_PLATFORM_MODULE = sonic-platform-accton-as7312-54x_$(ACCTON_AS7312_54X_PLATFORM_MODULE_VERSION)_amd64.deb +$(ACCTON_AS7312_54X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7312_54x-r0 +$(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS7312_54X_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index bb561272116e..5c48c84b0f3f 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit bb561272116e1664d4e6f819e452ac3ec5154484 +Subproject commit 5c48c84b0f3f5ee8b44f02ff3e0c3d1ad2169066