DellEMC : Platform2.0 API Implementation [S6100, S6000, Z9100] (#3740)

This commit is contained in:
Arun Saravanan Balachandran 2019-12-04 00:06:41 +05:30 committed by Sujin Kang
parent 100d67941a
commit 343ad78931
14 changed files with 233 additions and 94 deletions

View File

@ -631,7 +631,7 @@ static ssize_t show_fan(struct device *dev,
ret = smf_read_reg16(data, PSU_2_FAN_SPEED); ret = smf_read_reg16(data, PSU_2_FAN_SPEED);
break; break;
case 12: case 12:
ret = ~smf_read_reg(data, FAN_TRAY_PRESENCE); ret = (~smf_read_reg(data, FAN_TRAY_PRESENCE) & 0xff);
export_hex = 1; export_hex = 1;
break; break;
@ -682,14 +682,26 @@ static ssize_t show_fan_alarm(struct device *dev,
struct smf_data *data = dev_get_drvdata(dev); struct smf_data *data = dev_get_drvdata(dev);
int ret, psu_fan_status=0; int ret, psu_fan_status=0;
if(index < 2) if (data->kind == z9100smf) {
psu_fan_status = smf_read_reg(data, FAN_STATUS_GROUP_B); if ((index % 2) == 0)
index = index / 2;
else
index = (index / 2) + 5;
}
if (data->kind == s6100smf)
index = index / 2;
if (index > 7) {
psu_fan_status = ~smf_read_reg(data, FAN_STATUS_GROUP_A);
index = index % 8;
} else
psu_fan_status = ~smf_read_reg(data, FAN_STATUS_GROUP_B);
if (psu_fan_status & (1 << (index))) if (psu_fan_status & (1 << (index)))
ret=0; ret=0;
else
if (ret < 0) ret=1;
return ret;
return sprintf(buf, "%d\n", ret); return sprintf(buf, "%d\n", ret);
} }
@ -726,12 +738,12 @@ static ssize_t show_psu_fan(struct device *dev,
if (index < FAN_601_FAULT){ if (index < FAN_601_FAULT){
fan_status = smf_read_reg(data, PSU_1_FAN_STATUS); fan_status = smf_read_reg(data, PSU_1_FAN_STATUS);
ret = fan_status & (1 << index); ret = (fan_status >> index) & 1;
} }
else{ else{
fan_status = smf_read_reg(data, PSU_2_FAN_STATUS); fan_status = smf_read_reg(data, PSU_2_FAN_STATUS);
ret = fan_status & (1 << (index - 3)); ret = (fan_status >> (index - 3)) & 1;
} }
if (ret < 0) if (ret < 0)
@ -1319,17 +1331,15 @@ static ssize_t show_current(struct device *dev,
else else
ret = smf_read_reg16(data, SWITCH_CURRENT_Z9100 + index * 2); ret = smf_read_reg16(data, SWITCH_CURRENT_Z9100 + index * 2);
else if (index < CURR602_INPUT) else if (index < CURR602_INPUT)
curr = smf_read_reg16(data, PSU_1_INPUT_CURRENT + (index % 4) * 2); ret = smf_read_reg16(data, PSU_1_INPUT_CURRENT + (index % 2) * 2);
else else
curr = smf_read_reg16(data, PSU_2_INPUT_CURRENT + (index % 4) * 2); ret = smf_read_reg16(data, PSU_2_INPUT_CURRENT + (index % 4) * 2);
if (ret < 0) if (ret < 0)
return ret; return ret;
/* TODO: docs say 10mA, value look like A? */ curr = ret*10;
if(index < 2)
curr = ret*1000;
return sprintf(buf, "%d\n", curr); return sprintf(buf, "%d\n", curr);
} }

View File

@ -65,7 +65,7 @@ class Chassis(ChassisBase):
# Get Transceiver status # Get Transceiver status
self.modprs_register = self._get_transceiver_status() self.modprs_register = self._get_transceiver_status()
self.sys_eeprom = Eeprom() self._eeprom = Eeprom()
for i in range(MAX_S6000_FAN): for i in range(MAX_S6000_FAN):
fan = Fan(i) fan = Fan(i)
self._fan_list.append(fan) self._fan_list.append(fan)
@ -105,7 +105,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: The name of the chassis string: The name of the chassis
""" """
return self.sys_eeprom.modelstr() return self._eeprom.modelstr()
def get_presence(self): def get_presence(self):
""" """
@ -121,7 +121,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: Model/part number of chassis string: Model/part number of chassis
""" """
return self.sys_eeprom.part_number_str() return self._eeprom.part_number_str()
def get_serial(self): def get_serial(self):
""" """
@ -129,7 +129,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: Serial number of chassis string: Serial number of chassis
""" """
return self.sys_eeprom.serial_str() return self._eeprom.serial_str()
def get_status(self): def get_status(self):
""" """
@ -148,7 +148,7 @@ class Chassis(ChassisBase):
A string containing the MAC address in the format A string containing the MAC address in the format
'XX:XX:XX:XX:XX:XX' 'XX:XX:XX:XX:XX:XX'
""" """
return self.sys_eeprom.base_mac_addr() return self._eeprom.base_mac_addr()
def get_serial_number(self): def get_serial_number(self):
""" """
@ -158,7 +158,7 @@ class Chassis(ChassisBase):
A string containing the hardware serial number for this A string containing the hardware serial number for this
chassis. chassis.
""" """
return self.sys_eeprom.serial_number_str() return self._eeprom.serial_number_str()
def get_system_eeprom_info(self): def get_system_eeprom_info(self):
""" """
@ -170,7 +170,7 @@ class Chassis(ChassisBase):
OCP ONIE TlvInfo EEPROM format and values are their OCP ONIE TlvInfo EEPROM format and values are their
corresponding values. corresponding values.
""" """
return self.sys_eeprom.system_eeprom_info() return self._eeprom.system_eeprom_info()
def get_reboot_cause(self): def get_reboot_cause(self):
""" """

View File

@ -28,14 +28,15 @@ except ImportError as e:
psu_eeprom_format = [ psu_eeprom_format = [
('PPID', 's', 20), ('DPN Rev', 's', 3), ('Service Tag', 's', 7), ('PPID', 's', 20), ('DPN Rev', 's', 3), ('Service Tag', 's', 7),
('Part Number', 's', 10), ('Part Num Revision', 's', 3), ('Part Number', 's', 10), ('Part Num Revision', 's', 3),
('Mfg Test', 's', 2), ('PSU Type', 's', 1), ('Fab Rev', 's', 2) ('Mfg Test', 's', 2), ('Redundant copy', 's', 83), ('PSU Type', 's', 1),
('Fab Rev', 's', 2)
] ]
# Fan eeprom fields in format required by EepromDecoder # Fan eeprom fields in format required by EepromDecoder
fan_eeprom_format = [ fan_eeprom_format = [
('PPID', 's', 20), ('DPN Rev', 's', 3), ('Service Tag', 's', 7), ('PPID', 's', 20), ('DPN Rev', 's', 3), ('Service Tag', 's', 7),
('Part Number', 's', 10), ('Part Num Revision', 's', 3), ('Part Number', 's', 10), ('Part Num Revision', 's', 3),
('Mfg Test', 's', 2), ('Redundant copy', 's', 82), ('Mfg Test', 's', 2), ('Redundant copy', 's', 83),
('Number of Fans', 's', 1), ('Fan Type', 's', 1), ('Number of Fans', 's', 1), ('Fan Type', 's', 1),
('Fab Rev', 's', 2) ('Fab Rev', 's', 2)
] ]
@ -168,11 +169,18 @@ class Eeprom(TlvInfoDecoder):
else: else:
self.part_number = 'NA' self.part_number = 'NA'
(valid, data) = self._get_eeprom_field("Fan Type") if self.is_psu_eeprom:
if valid: (valid, data) = self._get_eeprom_field("PSU Type")
self.fan_type = data if valid:
self.psu_type = data
else:
self.psu_type = 'NA'
else: else:
self.fan_type = 'NA' (valid, data) = self._get_eeprom_field("Fan Type")
if valid:
self.fan_type = data
else:
self.fan_type = 'NA'
def _get_eeprom_field(self, field_name): def _get_eeprom_field(self, field_name):
""" """
@ -204,7 +212,10 @@ class Eeprom(TlvInfoDecoder):
""" """
Returns the airflow fan type. Returns the airflow fan type.
""" """
return int(self.fan_type.encode('hex'), 16) if self.is_psu_eeprom:
return int(self.psu_type.encode('hex'), 16)
else:
return int(self.fan_type.encode('hex'), 16)
# System EEPROM specific methods # System EEPROM specific methods
def base_mac_addr(self): def base_mac_addr(self):

View File

@ -17,6 +17,7 @@ except ImportError as e:
raise ImportError(str(e) + "- required module not found") raise ImportError(str(e) + "- required module not found")
MAX_S6000_PSU_FAN_SPEED = 18000
MAX_S6000_FAN_SPEED = 19000 MAX_S6000_FAN_SPEED = 19000
@ -26,12 +27,12 @@ class Fan(FanBase):
CPLD_DIR = "/sys/devices/platform/dell-s6000-cpld.0/" CPLD_DIR = "/sys/devices/platform/dell-s6000-cpld.0/"
I2C_DIR = "/sys/class/i2c-adapter/" I2C_DIR = "/sys/class/i2c-adapter/"
def __init__(self, fan_index, psu_fan=False): def __init__(self, fan_index, psu_fan=False, dependency=None):
# Fan is 1-based in DellEMC platforms
self.index = fan_index + 1
self.is_psu_fan = psu_fan self.is_psu_fan = psu_fan
if not self.is_psu_fan: if not self.is_psu_fan:
# Fan is 1-based in DellEMC platforms
self.index = fan_index + 1
self.fan_presence_reg = "fan_prs" self.fan_presence_reg = "fan_prs"
self.fan_led_reg = "fan{}_led".format(fan_index) self.fan_led_reg = "fan{}_led".format(fan_index)
self.get_fan_speed_reg = self.I2C_DIR + "i2c-11/11-0029/" +\ self.get_fan_speed_reg = self.I2C_DIR + "i2c-11/11-0029/" +\
@ -42,8 +43,13 @@ class Fan(FanBase):
self.max_fan_speed = MAX_S6000_FAN_SPEED self.max_fan_speed = MAX_S6000_FAN_SPEED
self.supported_led_color = ['off', 'green', 'amber'] self.supported_led_color = ['off', 'green', 'amber']
else: else:
self.get_fan_speed_reg = self.I2C_DIR + "i2c-1/1-005{}/" +\ self.index = fan_index
"fan1_input".format(10 - self.index) self.dependency = dependency
self.get_fan_speed_reg = self.I2C_DIR +\
"i2c-1/1-005{}/fan1_target".format(10 - self.index)
self.set_fan_speed_reg = self.I2C_DIR +\
"i2c-1/1-005{}/fan1_target".format(10 - self.index)
self.max_fan_speed = MAX_S6000_PSU_FAN_SPEED
def _get_cpld_register(self, reg_name): def _get_cpld_register(self, reg_name):
# On successful read, returns the value read from given # On successful read, returns the value read from given
@ -136,6 +142,9 @@ class Fan(FanBase):
bool: True if Fan is present, False if not bool: True if Fan is present, False if not
""" """
status = False status = False
if self.is_psu_fan:
return self.dependency.get_presence()
fan_presence = self._get_cpld_register(self.fan_presence_reg) fan_presence = self._get_cpld_register(self.fan_presence_reg)
if (fan_presence != 'ERR'): if (fan_presence != 'ERR'):
fan_presence = int(fan_presence,16) & self.index fan_presence = int(fan_presence,16) & self.index
@ -151,7 +160,10 @@ class Fan(FanBase):
Returns: Returns:
string: Part number of Fan string: Part number of Fan
""" """
return self.eeprom.part_number_str() if not self.is_psu_fan:
return self.eeprom.part_number_str()
else:
return 'NA'
def get_serial(self): def get_serial(self):
""" """
@ -161,7 +173,10 @@ class Fan(FanBase):
string: Serial number of Fan string: Serial number of Fan
""" """
# Sample Serial number format "US-01234D-54321-25A-0123-A00" # Sample Serial number format "US-01234D-54321-25A-0123-A00"
return self.eeprom.serial_number_str() if not self.is_psu_fan:
return self.eeprom.serial_number_str()
else:
return 'NA'
def get_status(self): def get_status(self):
""" """
@ -186,8 +201,13 @@ class Fan(FanBase):
A string, either FAN_DIRECTION_INTAKE or A string, either FAN_DIRECTION_INTAKE or
FAN_DIRECTION_EXHAUST depending on fan direction FAN_DIRECTION_EXHAUST depending on fan direction
""" """
direction = {1: 'FAN_DIRECTION_INTAKE', 2: 'FAN_DIRECTION_EXHAUST'} if self.is_psu_fan:
fan_direction = self.eeprom.airflow_fan_type() direction = {1: 'FAN_DIRECTION_EXHAUST', 2: 'FAN_DIRECTION_INTAKE',
3: 'FAN_DIRECTION_EXHAUST', 4: 'FAN_DIRECTION_INTAKE'}
fan_direction = self.dependency.eeprom.airflow_fan_type()
else:
direction = {1: 'FAN_DIRECTION_EXHAUST', 2: 'FAN_DIRECTION_INTAKE'}
fan_direction = self.eeprom.airflow_fan_type()
return direction.get(fan_direction,'NA') return direction.get(fan_direction,'NA')
@ -248,7 +268,7 @@ class Fan(FanBase):
Returns: Returns:
bool: True if set success, False if fail. bool: True if set success, False if fail.
""" """
if color not in self.supported_led_color: if self.is_psu_fan or (color not in self.supported_led_color):
return False return False
if(color == self.STATUS_LED_COLOR_AMBER): if(color == self.STATUS_LED_COLOR_AMBER):
color = 'yellow' color = 'yellow'
@ -266,6 +286,10 @@ class Fan(FanBase):
Returns: Returns:
A string, one of the predefined STATUS_LED_COLOR_* strings. A string, one of the predefined STATUS_LED_COLOR_* strings.
""" """
if self.is_psu_fan:
# No LED available for PSU Fan
return None
fan_led = self._get_cpld_register(self.fan_led_reg) fan_led = self._get_cpld_register(self.fan_led_reg)
if (fan_led != 'ERR'): if (fan_led != 'ERR'):
if (fan_led == 'yellow'): if (fan_led == 'yellow'):

View File

@ -13,6 +13,7 @@ try:
import os import os
from sonic_platform_base.psu_base import PsuBase from sonic_platform_base.psu_base import PsuBase
from sonic_platform.eeprom import Eeprom from sonic_platform.eeprom import Eeprom
from sonic_platform.fan import Fan
except ImportError as e: except ImportError as e:
raise ImportError(str(e) + "- required module not found") raise ImportError(str(e) + "- required module not found")
@ -46,6 +47,8 @@ class Psu(PsuBase):
# make it unique per Psu object # make it unique per Psu object
self._fan_list = [] self._fan_list = []
self._fan_list.append(Fan(self.index, psu_fan=True, dependency=self))
def _get_cpld_register(self, reg_name): def _get_cpld_register(self, reg_name):
# On successful read, returns the value read from given # On successful read, returns the value read from given
# reg_name and on failure returns 'ERR' # reg_name and on failure returns 'ERR'

View File

@ -255,8 +255,8 @@ def print_psu(psu):
psu_fan_present = int(get_pmc_register('fan11_fault')) psu_fan_present = int(get_pmc_register('fan11_fault'))
input_voltage = float(get_pmc_register('in29_input')) / 1000 input_voltage = float(get_pmc_register('in29_input')) / 1000
output_voltage = float(get_pmc_register('in30_input')) / 1000 output_voltage = float(get_pmc_register('in30_input')) / 1000
input_current = float(get_pmc_register('curr601_input')) / 100 input_current = float(get_pmc_register('curr601_input')) / 1000
output_current = float(get_pmc_register('curr602_input')) / 100 output_current = float(get_pmc_register('curr602_input')) / 1000
input_power = float(get_pmc_register('power1_input')) / 1000000 input_power = float(get_pmc_register('power1_input')) / 1000000
output_power = float(get_pmc_register('power2_input')) / 1000000 output_power = float(get_pmc_register('power2_input')) / 1000000
if (input_power != 0): if (input_power != 0):
@ -268,8 +268,8 @@ def print_psu(psu):
psu_fan_present = int(get_pmc_register('fan12_fault')) psu_fan_present = int(get_pmc_register('fan12_fault'))
input_voltage = float(get_pmc_register('in31_input')) / 1000 input_voltage = float(get_pmc_register('in31_input')) / 1000
output_voltage = float(get_pmc_register('in32_input')) / 1000 output_voltage = float(get_pmc_register('in32_input')) / 1000
input_current = float(get_pmc_register('curr701_input')) / 100 input_current = float(get_pmc_register('curr701_input')) / 1000
output_current = float(get_pmc_register('curr702_input')) / 100 output_current = float(get_pmc_register('curr702_input')) / 1000
input_power = float(get_pmc_register('power3_input')) / 1000000 input_power = float(get_pmc_register('power3_input')) / 1000000
output_power = float(get_pmc_register('power4_input')) / 1000000 output_power = float(get_pmc_register('power4_input')) / 1000000
if (input_power != 0): if (input_power != 0):

View File

@ -54,6 +54,26 @@ sys_eeprom() {
esac esac
} }
#Attach/Detach eeprom on each IOM
switch_board_eeprom() {
case $1 in
"new_device")
for ((i=14;i<=17;i++));
do
i2c_config "echo 24c02 0x50 > /sys/bus/i2c/devices/i2c-$i/$1"
done
;;
"delete_device")
for ((i=14;i<=17;i++));
do
i2c_config "echo 0x50 > /sys/bus/i2c/devices/i2c-$i/$1"
done
;;
*) echo "s6100_platform: switch_board_eeprom : invalid command !"
;;
esac
}
#Attach/Detach CPLD devices to drivers for each IOM #Attach/Detach CPLD devices to drivers for each IOM
switch_board_cpld() { switch_board_cpld() {
case $1 in case $1 in
@ -245,7 +265,7 @@ install_python_api_package() {
remove_python_api_package() { remove_python_api_package() {
rv=$(pip show sonic-platform > /dev/null 2>/dev/null) rv=$(pip show sonic-platform > /dev/null 2>/dev/null)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
rv = $(pip uninstall -y sonic-platform > /dev/null 2>/dev/null) rv=$(pip uninstall -y sonic-platform > /dev/null 2>/dev/null)
fi fi
} }
@ -267,6 +287,7 @@ if [[ "$1" == "init" ]]; then
cpu_board_mux "new_device" cpu_board_mux "new_device"
switch_board_mux "new_device" switch_board_mux "new_device"
sys_eeprom "new_device" sys_eeprom "new_device"
switch_board_eeprom "new_device"
switch_board_cpld "new_device" switch_board_cpld "new_device"
switch_board_qsfp_mux "new_device" switch_board_qsfp_mux "new_device"
switch_board_sfp "new_device" switch_board_sfp "new_device"
@ -280,6 +301,7 @@ elif [[ "$1" == "deinit" ]]; then
xcvr_presence_interrupts "disable" xcvr_presence_interrupts "disable"
switch_board_sfp "delete_device" switch_board_sfp "delete_device"
switch_board_cpld "delete_device" switch_board_cpld "delete_device"
switch_board_eeprom "delete_device"
switch_board_mux "delete_device" switch_board_mux "delete_device"
sys_eeprom "delete_device" sys_eeprom "delete_device"
switch_board_qsfp "delete_device" switch_board_qsfp "delete_device"

View File

@ -54,10 +54,11 @@ class Chassis(ChassisBase):
ChassisBase.__init__(self) ChassisBase.__init__(self)
# Initialize EEPROM # Initialize EEPROM
self.sys_eeprom = Eeprom() self._eeprom = Eeprom()
for i in range(MAX_S6100_MODULE): for i in range(MAX_S6100_MODULE):
module = Module(i) module = Module(i)
self._module_list.append(module) self._module_list.append(module)
self._sfp_list.extend(module._sfp_list)
for i in range(MAX_S6100_FAN): for i in range(MAX_S6100_FAN):
fan = Fan(i) fan = Fan(i)
@ -107,7 +108,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: The name of the chassis string: The name of the chassis
""" """
return self.sys_eeprom.modelstr() return self._eeprom.modelstr()
def get_presence(self): def get_presence(self):
""" """
@ -123,7 +124,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: Model/part number of chassis string: Model/part number of chassis
""" """
return self.sys_eeprom.part_number_str() return self._eeprom.part_number_str()
def get_serial(self): def get_serial(self):
""" """
@ -131,7 +132,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: Serial number of chassis string: Serial number of chassis
""" """
return self.sys_eeprom.serial_str() return self._eeprom.serial_str()
def get_status(self): def get_status(self):
""" """
@ -150,7 +151,7 @@ class Chassis(ChassisBase):
A string containing the MAC address in the format A string containing the MAC address in the format
'XX:XX:XX:XX:XX:XX' 'XX:XX:XX:XX:XX:XX'
""" """
return self.sys_eeprom.base_mac_addr() return self._eeprom.base_mac_addr()
def get_serial_number(self): def get_serial_number(self):
""" """
@ -160,7 +161,7 @@ class Chassis(ChassisBase):
A string containing the hardware serial number for this A string containing the hardware serial number for this
chassis. chassis.
""" """
return self.sys_eeprom.serial_number_str() return self._eeprom.serial_number_str()
def get_system_eeprom_info(self): def get_system_eeprom_info(self):
""" """
@ -170,7 +171,7 @@ class Chassis(ChassisBase):
OCP ONIE TlvInfo EEPROM format and values are their corresponding OCP ONIE TlvInfo EEPROM format and values are their corresponding
values. values.
""" """
return self.sys_eeprom.system_eeprom_info() return self._eeprom.system_eeprom_info()
def get_reboot_cause(self): def get_reboot_cause(self):
""" """

View File

@ -18,15 +18,26 @@ except ImportError, e:
class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): class Eeprom(eeprom_tlvinfo.TlvInfoDecoder):
def __init__(self): def __init__(self, i2c_line=0, iom_eeprom=False):
self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" self.is_module = iom_eeprom
if self.is_module:
self.eeprom_path = ("/sys/class/i2c-adapter"
"/i2c-{0}/{0}-0050/eeprom").format(i2c_line)
else:
self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom"
super(Eeprom, self).__init__(self.eeprom_path, 0, '', True) super(Eeprom, self).__init__(self.eeprom_path, 0, '', True)
self.eeprom_tlv_dict = dict() self.eeprom_tlv_dict = dict()
try: try:
self.eeprom_data = self.read_eeprom() if self.is_module:
self.write_eeprom("\x00\x00")
self.eeprom_data = self.read_eeprom_bytes(256)
else:
self.eeprom_data = self.read_eeprom()
except: except:
self.eeprom_data = "N/A" self.eeprom_data = "N/A"
raise RuntimeError("Eeprom is not Programmed") if not self.is_module:
raise RuntimeError("Eeprom is not Programmed")
else: else:
eeprom = self.eeprom_data eeprom = self.eeprom_data
@ -76,8 +87,12 @@ class Eeprom(eeprom_tlvinfo.TlvInfoDecoder):
return ":".join([binascii.b2a_hex(T) for T in results[2]]) return ":".join([binascii.b2a_hex(T) for T in results[2]])
def modelstr(self): def modelstr(self):
(is_valid, results) = self.get_tlv_field( if self.is_module:
self.eeprom_data, self._TLV_CODE_PRODUCT_NAME) (is_valid, results) = self.get_tlv_field(
self.eeprom_data, self._TLV_CODE_PLATFORM_NAME)
else:
(is_valid, results) = self.get_tlv_field(
self.eeprom_data, self._TLV_CODE_PRODUCT_NAME)
if not is_valid: if not is_valid:
return "N/A" return "N/A"

View File

@ -33,6 +33,10 @@ class Fan(FanBase):
# from 1 # from 1
self.fantrayindex = fantray_index + 1 self.fantrayindex = fantray_index + 1
self.fanindex = fan_index + 1 self.fanindex = fan_index + 1
self.fan_presence_reg = "fan{}_fault".format(
2 * self.fantrayindex - 1)
self.fan_status_reg = "fan{}_alarm".format(
2 * self.fantrayindex - 1)
self.get_fan_speed_reg = "fan{}_input".format( self.get_fan_speed_reg = "fan{}_input".format(
2 * self.fantrayindex - 1) 2 * self.fantrayindex - 1)
self.get_fan_dir_reg = "fan{}_airflow".format( self.get_fan_dir_reg = "fan{}_airflow".format(
@ -43,7 +47,9 @@ class Fan(FanBase):
else: else:
# PSU Fan index starts from 11 # PSU Fan index starts from 11
self.fanindex = fan_index + 10 self.fanindex = fan_index + 10
self.fan_presence_reg = "fan{}_fault".format(self.fanindex)
self.get_fan_speed_reg = "fan{}_input".format(self.fanindex) self.get_fan_speed_reg = "fan{}_input".format(self.fanindex)
self.get_fan_dir_reg = "fan{}_airflow".format(self.fanindex)
self.max_fan_speed = MAX_S6100_PSU_FAN_SPEED self.max_fan_speed = MAX_S6100_PSU_FAN_SPEED
def _get_pmc_register(self, reg_name): def _get_pmc_register(self, reg_name):
@ -84,6 +90,9 @@ class Fan(FanBase):
""" """
# For Serial number "US-01234D-54321-25A-0123-A00", the part # For Serial number "US-01234D-54321-25A-0123-A00", the part
# number is "01234D" # number is "01234D"
if self.is_psu_fan:
return 'NA'
fan_serialno = self._get_pmc_register(self.fan_serialno_reg) fan_serialno = self._get_pmc_register(self.fan_serialno_reg)
if (fan_serialno != 'ERR') and self.get_presence(): if (fan_serialno != 'ERR') and self.get_presence():
if (len(fan_serialno.split('-')) > 1): if (len(fan_serialno.split('-')) > 1):
@ -102,6 +111,9 @@ class Fan(FanBase):
string: Serial number of FAN string: Serial number of FAN
""" """
# Sample Serial number format "US-01234D-54321-25A-0123-A00" # Sample Serial number format "US-01234D-54321-25A-0123-A00"
if self.is_psu_fan:
return 'NA'
fan_serialno = self._get_pmc_register(self.fan_serialno_reg) fan_serialno = self._get_pmc_register(self.fan_serialno_reg)
if (fan_serialno == 'ERR') or not self.get_presence(): if (fan_serialno == 'ERR') or not self.get_presence():
fan_serialno = 'NA' fan_serialno = 'NA'
@ -115,11 +127,11 @@ class Fan(FanBase):
bool: True if fan is present, False if not bool: True if fan is present, False if not
""" """
status = False status = False
fantray_presence = self._get_pmc_register(self.get_fan_speed_reg) fantray_presence = self._get_pmc_register(self.fan_presence_reg)
if (fantray_presence != 'ERR'): if (fantray_presence != 'ERR'):
fantray_presence = int(fantray_presence, 10) fantray_presence = int(fantray_presence, 10)
if (fantray_presence > 0): if (~fantray_presence & 0b1):
status = True status = True
return status return status
@ -130,11 +142,18 @@ class Fan(FanBase):
bool: True if FAN is operating properly, False if not bool: True if FAN is operating properly, False if not
""" """
status = False status = False
fantray_status = self._get_pmc_register(self.get_fan_speed_reg) if self.is_psu_fan:
if (fantray_status != 'ERR'): fantray_status = self._get_pmc_register(self.get_fan_speed_reg)
fantray_status = int(fantray_status, 10) if (fantray_status != 'ERR'):
if (fantray_status > 5000): fantray_status = int(fantray_status, 10)
status = True if (fantray_status > 5000):
status = True
else:
fantray_status = self._get_pmc_register(self.fan_status_reg)
if (fantray_status != 'ERR'):
fantray_status = int(fantray_status, 10)
if (~fantray_status & 0b1):
status = True
return status return status
@ -216,10 +235,17 @@ class Fan(FanBase):
Returns: Returns:
A string, one of the predefined STATUS_LED_COLOR_* strings. A string, one of the predefined STATUS_LED_COLOR_* strings.
""" """
if self.get_status(): if self.is_psu_fan:
return self.STATUS_LED_COLOR_GREEN # No LED available for PSU Fan
return None
else: else:
return self.STATUS_LED_COLOR_OFF if self.get_presence():
if self.get_status():
return self.STATUS_LED_COLOR_GREEN
else:
return self.STATUS_LED_COLOR_AMBER
else:
return self.STATUS_LED_COLOR_OFF
def get_target_speed(self): def get_target_speed(self):
""" """

View File

@ -14,6 +14,7 @@ try:
from sonic_platform_base.module_base import ModuleBase from sonic_platform_base.module_base import ModuleBase
from sonic_platform.sfp import Sfp from sonic_platform.sfp import Sfp
from sonic_platform.component import Component from sonic_platform.component import Component
from sonic_platform.eeprom import Eeprom
except ImportError as e: except ImportError as e:
raise ImportError(str(e) + "- required module not found") raise ImportError(str(e) + "- required module not found")
@ -55,7 +56,7 @@ class Module(ModuleBase):
self.port_start = (self.index - 1) * 16 self.port_start = (self.index - 1) * 16
self.port_end = (self.index * 16) - 1 self.port_end = (self.index * 16) - 1
self.port_i2c_line = self.IOM_I2C_MAPPING[self.index] self.port_i2c_line = self.IOM_I2C_MAPPING[self.index]
self.eeprom_tlv_dict = dict() self._eeprom = Eeprom(iom_eeprom=True, i2c_line=self.port_i2c_line)
self.iom_status_reg = "iom_status" self.iom_status_reg = "iom_status"
self.iom_presence_reg = "iom_presence" self.iom_presence_reg = "iom_presence"
@ -108,7 +109,7 @@ class Module(ModuleBase):
Returns: Returns:
string: The name of the device string: The name of the device
""" """
return "IOM{}: 16xQSFP+".format(self.index) return "IOM{}: {}".format(self.index, self._eeprom.modelstr())
def get_presence(self): def get_presence(self):
""" """
@ -133,7 +134,7 @@ class Module(ModuleBase):
Returns: Returns:
string: part number of module string: part number of module
""" """
return 'NA' return self._eeprom.part_number_str()
def get_serial(self): def get_serial(self):
""" """
@ -142,7 +143,7 @@ class Module(ModuleBase):
Returns: Returns:
string: Serial number of module string: Serial number of module
""" """
return 'NA' return self._eeprom.serial_str()
def get_status(self): def get_status(self):
""" """
@ -178,7 +179,7 @@ class Module(ModuleBase):
Returns: Returns:
A string containing the hardware serial number for this module. A string containing the hardware serial number for this module.
""" """
return 'NA' return self._eeprom.serial_number_str()
def get_system_eeprom_info(self): def get_system_eeprom_info(self):
""" """
@ -192,4 +193,4 @@ class Module(ModuleBase):
0x24:001c0f000fcd0a, 0x25:02/03/2018 16:22:00, 0x24:001c0f000fcd0a, 0x25:02/03/2018 16:22:00,
0x26:01, 0x27:REV01, 0x28:AG9064-C2358-16G} 0x26:01, 0x27:REV01, 0x28:AG9064-C2358-16G}
""" """
return self.eeprom_tlv_dict return self._eeprom.system_eeprom_info()

View File

@ -262,8 +262,8 @@ def print_psu(psu):
psu_fan_present = int(get_pmc_register('fan11_fault')) psu_fan_present = int(get_pmc_register('fan11_fault'))
input_voltage = float(get_pmc_register('in29_input')) / 1000 input_voltage = float(get_pmc_register('in29_input')) / 1000
output_voltage = float(get_pmc_register('in30_input')) / 1000 output_voltage = float(get_pmc_register('in30_input')) / 1000
input_current = float(get_pmc_register('curr601_input')) / 100 input_current = float(get_pmc_register('curr601_input')) / 1000
output_current = float(get_pmc_register('curr602_input')) /100 output_current = float(get_pmc_register('curr602_input')) / 1000
input_power = float(get_pmc_register('power1_input')) / 1000000 input_power = float(get_pmc_register('power1_input')) / 1000000
output_power = float(get_pmc_register('power2_input')) / 1000000 output_power = float(get_pmc_register('power2_input')) / 1000000
if (input_power != 0): if (input_power != 0):
@ -275,8 +275,8 @@ def print_psu(psu):
psu_fan_present = int(get_pmc_register('fan12_fault')) psu_fan_present = int(get_pmc_register('fan12_fault'))
input_voltage = float(get_pmc_register('in31_input')) / 1000 input_voltage = float(get_pmc_register('in31_input')) / 1000
output_voltage = float(get_pmc_register('in32_input')) / 1000 output_voltage = float(get_pmc_register('in32_input')) / 1000
input_current = float(get_pmc_register('curr701_input')) / 100 input_current = float(get_pmc_register('curr701_input')) / 1000
output_current = float(get_pmc_register('curr702_input')) / 100 output_current = float(get_pmc_register('curr702_input')) / 1000
input_power = float(get_pmc_register('power3_input')) / 1000000 input_power = float(get_pmc_register('power3_input')) / 1000000
output_power = float(get_pmc_register('power4_input')) / 1000000 output_power = float(get_pmc_register('power4_input')) / 1000000
if (input_power != 0): if (input_power != 0):

View File

@ -94,7 +94,7 @@ class Chassis(ChassisBase):
ChassisBase.__init__(self) ChassisBase.__init__(self)
# Initialize EEPROM # Initialize EEPROM
self.sys_eeprom = Eeprom() self._eeprom = Eeprom()
for i in range(MAX_Z9100_FANTRAY): for i in range(MAX_Z9100_FANTRAY):
for j in range(MAX_Z9100_FAN): for j in range(MAX_Z9100_FAN):
fan = Fan(i, j) fan = Fan(i, j)
@ -137,7 +137,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: The name of the chassis string: The name of the chassis
""" """
return self.sys_eeprom.modelstr() return self._eeprom.modelstr()
def get_presence(self): def get_presence(self):
""" """
@ -153,7 +153,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: Model/part number of chassis string: Model/part number of chassis
""" """
return self.sys_eeprom.part_number_str() return self._eeprom.part_number_str()
def get_serial(self): def get_serial(self):
""" """
@ -161,7 +161,7 @@ class Chassis(ChassisBase):
Returns: Returns:
string: Serial number of chassis string: Serial number of chassis
""" """
return self.sys_eeprom.serial_str() return self._eeprom.serial_str()
def get_status(self): def get_status(self):
""" """
@ -180,7 +180,7 @@ class Chassis(ChassisBase):
A string containing the MAC address in the format A string containing the MAC address in the format
'XX:XX:XX:XX:XX:XX' 'XX:XX:XX:XX:XX:XX'
""" """
return self.sys_eeprom.base_mac_addr() return self._eeprom.base_mac_addr()
def get_serial_number(self): def get_serial_number(self):
""" """
@ -189,7 +189,7 @@ class Chassis(ChassisBase):
Returns: Returns:
A string containing the hardware serial number for this chassis. A string containing the hardware serial number for this chassis.
""" """
return self.sys_eeprom.serial_number_str() return self._eeprom.serial_number_str()
def get_system_eeprom_info(self): def get_system_eeprom_info(self):
""" """
@ -200,7 +200,7 @@ class Chassis(ChassisBase):
OCP ONIE TlvInfo EEPROM format and values are their corresponding OCP ONIE TlvInfo EEPROM format and values are their corresponding
values. values.
""" """
return self.sys_eeprom.system_eeprom_info() return self._eeprom.system_eeprom_info()
def get_reboot_cause(self): def get_reboot_cause(self):
""" """

View File

@ -33,6 +33,10 @@ class Fan(FanBase):
# from 1 # from 1
self.fantrayindex = fantray_index + 1 self.fantrayindex = fantray_index + 1
self.fanindex = fan_index + 1 self.fanindex = fan_index + 1
self.fan_presence_reg = "fan{}_fault".format(
2 * (self.fantrayindex - 1) + (self.fanindex - 1) + 1 )
self.fan_status_reg = "fan{}_alarm".format(
2 * (self.fantrayindex - 1) + (self.fanindex - 1) + 1 )
self.get_fan_speed_reg = "fan{}_input".format( self.get_fan_speed_reg = "fan{}_input".format(
2 * (self.fantrayindex - 1) + (self.fanindex - 1) + 1 ) 2 * (self.fantrayindex - 1) + (self.fanindex - 1) + 1 )
self.get_fan_dir_reg = "fan{}_airflow".format( self.get_fan_dir_reg = "fan{}_airflow".format(
@ -43,7 +47,9 @@ class Fan(FanBase):
else: else:
# PSU Fan index starts from 11 # PSU Fan index starts from 11
self.fanindex = fan_index + 10 self.fanindex = fan_index + 10
self.fan_presence_reg = "fan{}_fault".format(self.fanindex)
self.get_fan_speed_reg = "fan{}_input".format(self.fanindex) self.get_fan_speed_reg = "fan{}_input".format(self.fanindex)
self.get_fan_dir_reg = "fan{}_airflow".format(self.fanindex)
self.max_fan_speed = MAX_Z9100_PSU_FAN_SPEED self.max_fan_speed = MAX_Z9100_PSU_FAN_SPEED
def _get_pmc_register(self, reg_name): def _get_pmc_register(self, reg_name):
@ -83,6 +89,9 @@ class Fan(FanBase):
""" """
# For Serial number "US-01234D-54321-25A-0123-A00", the part # For Serial number "US-01234D-54321-25A-0123-A00", the part
# number is "01234D" # number is "01234D"
if self.is_psu_fan:
return 'NA'
fan_serialno = self._get_pmc_register(self.fan_serialno_reg) fan_serialno = self._get_pmc_register(self.fan_serialno_reg)
if (fan_serialno != 'ERR') and self.get_presence(): if (fan_serialno != 'ERR') and self.get_presence():
if (len(fan_serialno.split('-')) > 1): if (len(fan_serialno.split('-')) > 1):
@ -101,6 +110,9 @@ class Fan(FanBase):
string: Serial number of FAN string: Serial number of FAN
""" """
# Sample Serial number format "US-01234D-54321-25A-0123-A00" # Sample Serial number format "US-01234D-54321-25A-0123-A00"
if self.is_psu_fan:
return 'NA'
fan_serialno = self._get_pmc_register(self.fan_serialno_reg) fan_serialno = self._get_pmc_register(self.fan_serialno_reg)
if (fan_serialno == 'ERR') or not self.get_presence(): if (fan_serialno == 'ERR') or not self.get_presence():
fan_serialno = 'NA' fan_serialno = 'NA'
@ -114,11 +126,11 @@ class Fan(FanBase):
bool: True if fan is present, False if not bool: True if fan is present, False if not
""" """
status = False status = False
fantray_presence = self._get_pmc_register(self.get_fan_speed_reg) fantray_presence = self._get_pmc_register(self.fan_presence_reg)
if (fantray_presence != 'ERR'): if (fantray_presence != 'ERR'):
fantray_presence = int(fantray_presence, 10) fantray_presence = int(fantray_presence, 10)
if (fantray_presence > 0): if (~fantray_presence & 0b1):
status = True status = True
return status return status
@ -129,11 +141,18 @@ class Fan(FanBase):
bool: True if FAN is operating properly, False if not bool: True if FAN is operating properly, False if not
""" """
status = False status = False
fantray_status = self._get_pmc_register(self.get_fan_speed_reg) if self.is_psu_fan:
if (fantray_status != 'ERR'): fantray_status = self._get_pmc_register(self.get_fan_speed_reg)
fantray_status = int(fantray_status, 10) if (fantray_status != 'ERR'):
if (fantray_status > 5000): fantray_status = int(fantray_status, 10)
status = True if (fantray_status > 5000):
status = True
else:
fantray_status = self._get_pmc_register(self.fan_status_reg)
if (fantray_status != 'ERR'):
fantray_status = int(fantray_status, 10)
if (~fantray_status & 0b1):
status = True
return status return status
@ -215,10 +234,17 @@ class Fan(FanBase):
Returns: Returns:
A string, one of the predefined STATUS_LED_COLOR_* strings. A string, one of the predefined STATUS_LED_COLOR_* strings.
""" """
if self.get_status(): if self.is_psu_fan:
return self.STATUS_LED_COLOR_GREEN # No LED available for PSU Fan
return None
else: else:
return self.STATUS_LED_COLOR_OFF if self.get_presence():
if self.get_status():
return self.STATUS_LED_COLOR_GREEN
else:
return self.STATUS_LED_COLOR_AMBER
else:
return self.STATUS_LED_COLOR_OFF
def get_target_speed(self): def get_target_speed(self):
""" """