platform/broadcom/sonic-platform-modules-tencent/common/lib/plat_hal/fan.py (323 lines of code) (raw):

#!/usr/bin/env python3 ####################################################### # # fan.py # Python implementation of the Class fan # Original author: rd@ruijie.com.cn # ####################################################### from plat_hal.devicebase import devicebase from eepromutil.fru import ipmifru from plat_hal.rotor import rotor class fan(devicebase): __rotor_list = [] __pn = None __raweeprom = None __sn = None __hw_version = None __present = None __e2loc = None __rotors = None __AirFlow = None __SpeedMin = None __SpeedMax = None __productName = None __productSerialNumber = None __WatchdogStatus = None __led_attrs_config = None __led_config = None __WatchdogStatus_config = None __AirFlowconifg = None __EnableWatchdogConf = None __Rotor_config = None __fan_display_name = None # 'N/A' __fan_display_name_conifg = None def __init__(self, conf=None): if conf is not None: self.name = conf.get('name', None) self.sn = conf.get('sn', None) self.present = conf.get('present', None) self.e2loc = conf.get('e2loc', None) self.SpeedMin = conf.get('SpeedMin', None) self.SpeedMax = conf.get('SpeedMax', None) self.AirFlowconifg = conf.get("airflow", None) self.WatchdogStatus_config = conf.get('WatchdogStatus', None) self.EnableWatchdogConf = conf.get('EnableWatchdogConf', None) self.led_attrs_config = conf.get('led_attrs', None) self.led_config = conf.get('led', None) self.Rotor_config = conf.get('Rotor', None) self.fan_display_name_conifg = conf.get("fan_display_name", None) rotor_tmp = [] for key, value in (self.Rotor_config).items(): rotor_tmp.append(rotor(value)) rotor_tmp.sort(key=lambda x: x.name, reverse=False) self.rotor_list = rotor_tmp self.rotors = len(self.rotor_list) @property def EnableWatchdogConf(self): return self.__EnableWatchdogConf @EnableWatchdogConf.setter def EnableWatchdogConf(self, val): self.__EnableWatchdogConf = val @property def rotor_list(self): return self.__rotor_list @rotor_list.setter def rotor_list(self, val): self.__rotor_list = val @property def Rotor_config(self): return self.__Rotor_config @Rotor_config.setter def Rotor_config(self, val): self.__Rotor_config = val @property def productName(self): return self.__productName @productName.setter def productName(self, val): self.__productName = val @property def productSerialNumber(self): return self.__productSerialNumber @productSerialNumber.setter def productSerialNumber(self, val): self.__productSerialNumber = val @property def hw_version(self): return self.__hw_version @hw_version.setter def hw_version(self, val): self.__hw_version = val @property def sn(self): return self.__sn @sn.setter def sn(self, val): self.__sn = val @property def pn(self): return self.__pn @pn.setter def pn(self, val): self.__pn = val @property def raweeprom(self): return self.__raweeprom @raweeprom.setter def raweeprom(self, val): self.__raweeprom = val @property def SpeedMax(self): return self.__SpeedMax @SpeedMax.setter def SpeedMax(self, val): self.__SpeedMax = val @property def SpeedMin(self): return self.__SpeedMin @SpeedMin.setter def SpeedMin(self, val): self.__SpeedMin = val @property def rotors(self): return self.__rotors @property def AirFlow(self): return self.__AirFlow @AirFlow.setter def AirFlow(self, val): self.__AirFlow = val @rotors.setter def rotors(self, val): self.__rotors = val @property def fan_display_name_conifg(self): return self.__fan_display_name_conifg @fan_display_name_conifg.setter def fan_display_name_conifg(self, val): self.__fan_display_name_conifg = val @property def fan_display_name(self): return self.__fan_display_name @fan_display_name.setter def fan_display_name(self, val): self.__fan_display_name = val def getspeed(self, conf): tmp = None if conf is None: return -1 ret, val = self.get_value(conf) if ret == True: tmp = int(str(val), 10) else: val = None if val is not None: return int(15000000 / tmp) return -1 def get_speed(self, rotor_index): rotor = self.get_rotor_index(rotor_index) if rotor is None: return None speed = rotor.rotor_Speed.Value if speed is None: return None return int(speed) def set_led(self, color): status = self.led_attrs_config.get(color, None) if status is None: return False mask = self.led_attrs_config.get('mask', 0xff) ret, value = self.get_value(self.led_config) if ret is False or value is None: return False setval = (int(value) & ~mask) | (status) ret, val = self.set_value(self.led_config, setval) return ret def get_led(self): mask = self.led_attrs_config.get('mask', 0xff) ret, value = self.get_value(self.led_config) if ret is False or value is None: return False, 'N/A' ledval = (int(value) & mask) for key, val in self.led_attrs_config.items(): if (ledval == val) and (key != "mask"): return True, key return False, 'N/A' def set_speed(self, rotor_index, level): if level > 255 or level < 0: return False rotor = self.get_rotor_index(rotor_index) if rotor is None: return False ret, val = self.set_value(rotor.Speedconfig, int(level)) return ret def get_rotor_index(self, rotor_index): if rotor_index > len(self.rotor_list): return None rotor = self.rotor_list[rotor_index - 1] return rotor def get_rotor_byname(self, rotor_index): for rotor in self.rotor_list: if rotor.name == rotor_index: return rotor return None def get_presence(self): ret, val = self.get_value(self.present) if ret is False or val is None: return -1 if isinstance(val, str): value = int(val, 16) else: value = val mask = self.present.get("mask") flag = value & mask okval = self.present.get("okval", 0) if flag == okval: return True else: return False def get_speed_pwm(self, rotor_index): rotor = self.get_rotor_index(rotor_index) if rotor is None: return False if rotor.i2c_speed is None: return False val = round(rotor.i2c_speed * 100 / 255) return val def feed_watchdog(self, pwm): ret = False for rotor in self.rotor_list: ret, val = rotor.feed_watchdog() if ret is False: return ret return ret def get_fru_info(self): try: if self.get_presence() is False: raise Exception("%s: not present" % self.name) eeprom = self.get_eeprom_info(self.e2loc) if eeprom is None: raise Exception("%s: value is none" % self.name) fru = ipmifru() if isinstance(eeprom, bytes): eeprom = self.byteTostr(eeprom) fru.decodeBin(eeprom) self.productName = fru.productInfoArea.productName.strip() # PN self.productSerialNumber = fru.productInfoArea.productSerialNumber.strip() # SN self.hw_version = fru.productInfoArea.productVersion.strip() # HW except Exception as e: self.productName = None self.productSerialNumber = None self.hw_version = None return False return True def decode_eeprom_info(self): '''get fan name, hw version, sn''' return self.get_fru_info() def get_AirFlow(self): if self.productName is None: ret = self.decode_eeprom_info() if ret is False: self.AirFlow = None return False if self.AirFlowconifg is None: self.AirFlow = None return False else: for i in self.AirFlowconifg: if self.productName in self.AirFlowconifg[i]: self.AirFlow = i return True self.AirFlow = None return False def enable_watchdog(self, enable, timeout_sec): ret = False if enable == True: byte = self.EnableWatchdogConf.get("enable_byte", None) ret, val = self.set_value(self.EnableWatchdogConf, byte) elif enable == False: byte = self.EnableWatchdogConf.get("disable_byte", None) ret, val = self.set_value(self.EnableWatchdogConf, byte) return ret def get_watchdog_status(self): dic = {"support": None, "open": None, "work_full": None, "work_allow_set": None} if self.WatchdogStatus_config is None: return None ret, val = self.get_value(self.WatchdogStatus_config) if ret is False or val is None: return None support_watchdog_off = self.WatchdogStatus_config.get("support_watchdog_off", None) is_open_off = self.WatchdogStatus_config.get("is_open_off", None) full_running_off = self.WatchdogStatus_config.get("full_running_off", None) running_setting_off = self.WatchdogStatus_config.get("running_setting_off", None) if support_watchdog_off is not None: if support_watchdog_off & val == self.WatchdogStatus_config.get("support_watchdog_mask", None): dic["support"] = True else: dic["support"] = False return dic if is_open_off is not None: if is_open_off & val == self.WatchdogStatus_config.get("is_open_mask", None): dic["open"] = True else: dic["open"] = False if full_running_off is not None: if full_running_off & val == self.WatchdogStatus_config.get("full_running_mask", None): dic["work_full"] = True else: dic["work_full"] = False if running_setting_off is not None: if running_setting_off & val == self.WatchdogStatus_config.get("running_setting_mask", None): dic["work_allow_set"] = True else: dic["work_allow_set"] = False return dic def get_fan_display_name(self): if self.productName is None: ret = self.get_fru_info() if ret is False: self.fan_display_name = None return False if self.fan_display_name_conifg is None: self.fan_display_name = self.productName return False else: for i in self.fan_display_name_conifg: if self.productName in self.fan_display_name_conifg[i]: self.fan_display_name = i return True self.fan_display_name = self.productName return False