From dbc56276abd4033a65ef9ff9cc8de023108cf6e2 Mon Sep 17 00:00:00 2001 From: tianshangfei <31125751+tianshangfei@users.noreply.github.com> Date: Sat, 27 May 2023 05:58:07 +0800 Subject: [PATCH] S3IP sysfs specification and S3IP sysfs framework HLD (#1068) SONiC is designed to be portable to a variety of network devices. Many devices share the same ASIC platform and only differ in device-specific hardware components, such as PSUs, fan modules, and environment sensors. Currently, ODM vendor provides drivers to expose the device-specific hardware through sysfs, allowing SONiC to communicate with them, as described in the Porting Guide. However, many inefficient porting works are still required for SONiC developers due to different drivers from different devices. The S3IP sysfs specification defines a unified interface to access peripheral hardware on devices from different vendors, making it easier for SONiC to support different devices and platforms. Signed-off-by: tianshangfei --- doc/s3ip_sysfs/s3ip_sysfs_hld.md | 339 ++++++++++++++++++ doc/s3ip_sysfs/s3ip_sysfs_specification.md | 239 ++++++++++++ images/s3ip_sysfs/s3ip_sysfs_demo.png | Bin 0 -> 28225 bytes .../s3ip_sysfs_framework_scenario.svg | 4 + .../s3ip_sysfs/s3ip_sysfs_get_info_flow.svg | 4 + images/s3ip_sysfs/s3ip_sysfs_scenario.svg | 4 + images/s3ip_sysfs/s3ip_sysfs_setup_flow.svg | 4 + 7 files changed, 594 insertions(+) create mode 100644 doc/s3ip_sysfs/s3ip_sysfs_hld.md create mode 100644 doc/s3ip_sysfs/s3ip_sysfs_specification.md create mode 100644 images/s3ip_sysfs/s3ip_sysfs_demo.png create mode 100644 images/s3ip_sysfs/s3ip_sysfs_framework_scenario.svg create mode 100644 images/s3ip_sysfs/s3ip_sysfs_get_info_flow.svg create mode 100644 images/s3ip_sysfs/s3ip_sysfs_scenario.svg create mode 100644 images/s3ip_sysfs/s3ip_sysfs_setup_flow.svg diff --git a/doc/s3ip_sysfs/s3ip_sysfs_hld.md b/doc/s3ip_sysfs/s3ip_sysfs_hld.md new file mode 100644 index 0000000000..f1ed678659 --- /dev/null +++ b/doc/s3ip_sysfs/s3ip_sysfs_hld.md @@ -0,0 +1,339 @@ +# S3IP sysfs specification and S3IP sysfs framework HLD # + +## Table of Content + + * [Scope](#scope) + * [Definitions/Abbreviation](#definitionsabbreviation) + * [1. Overview](#1-overview) + * [2. S3IP sysfs specification](#2-s3ip-sysfs-specification) + * [2.1 S3IP sysfs specification scenario](#21-s3ip-sysfs-specification-scenario) + * [2.2 Design of the S3ip sysfs specification](#22-design-of-the-s3ip-sysfs-specification) + * [3. S3IP sysfs framework](#3-s3ip-sysfs-framework) + * [3.1 S3IP sysfs framework scenario](#31-s3ip-sysfs-framework-scenario) + * [3.2 S3IP sysfs framework design](#32-s3ip-sysfs-framework-design) + * [3.3 Porting guide](#33-porting-guide) + + +### Revision + | Rev | Date | Author | Change Description | + |:---:|:-----------:|:------------------:|-----------------------------------| + | 0.1 | 08/16/2022 | timstian | Initial version | + +### Scope +This document describes the SONiC sysfs specification and the design of the SONiC sysfs generation framework. + +### Definitions/Abbreviations +| Abbreviation | Description | +|--------------------------|---------------------------------------------------| +| S3IP | Simplified Switch System Integration Program | +| CPLD | Complex Programmable Logic Device | +| I2C | Inter-Integrated Circuit | +| SAI | Switch Abstraction Interface | +| ODM | Original Design Manufacturer + +### 1. Overview + +SONiC is designed to be portable to a variety of network devices. Many devices share the same ASIC platform and only differ in device-specific hardware components, such as PSUs, fan modules, and environment sensors. Currently, ODM vendor provides drivers to expose the device-specific hardware through sysfs, allowing SONiC to communicate with them, as described in the [Porting Guide](https://github.com/sonic-net/SONiC/wiki/Porting-Guide). However, many inefficient porting works are still required for SONiC developers due to different drivers from different devices. + +The S3IP sysfs specification defines a unified interface to access peripheral hardware on devices from different vendors, making it easier for SONiC to support different devices and platforms. + +**Requirements for S3IP sysfs:** +1. Should be able to work with the existing platform APIs +2. The hierarchy of sysfs path structure should be defined in a specification. +3. The sysfs path in the specification should be defined clearly, thus, platform API and test cases can be reused. +4. The sysfs directory structure can be generated automatically through the framework. +5. Support reuse of the old driver sysfs paths without redeveloping new drivers. + +**S3IP background Introduction** + +Simplified Switch System Integration Program, aka [S3IP](http://www.s3ip.org/), is the subproject of the Open Data Center Committee, aka [ODCC](http://www.opendatacenter.cn/introduction-en.html). S3IP is a joint initiative of six Internet companies in China, including Baidu, Alibaba, Tencent, Meituan, JD.com, and Kuaishou. Focusing on the network field, S3IP aims to solve the common problems in the integration process of the upper layer software and the lower layer equipment and establish a standardized ecology. The standardized design is more friendly to equipment manufacturers and enterprise users (such as the Internet), easier to integrate, more efficient to solve problems with the help of ecological forces, and faster to implement new technologies in the ecosystem. + +S3IP sysfs contains two sections: + +- sysfs specification: specifies the sysfs directory structure and file content +- sysfs framework: generate the sysfs directory structure that conforming to the specification. + +### 2. S3IP sysfs specification +#### 2.1 S3IP sysfs specification scenario + +Figure2-1 where S3IP sysfs is used. + +![scenario](/images/s3ip_sysfs/s3ip_sysfs_scenario.svg) + +The S3IP sysfs specification is represented as an organized sysfs directory structure on white-box devices. Device management software and debugging tools need to access hardware through this interface. + +Both vendors and users should comply with the S3IP sysfs specification. Device vendors focus on the specification implementation, while users verify the usability of the device against this specification. Vendors should provide software access to every sensor capable of being read. For any available sensor, vendors shall provide S3IP sysfs access. + +Figure2-2 S3IP sysfs diretory demo + +![demo](/images/s3ip_sysfs/s3ip_sysfs_demo.png) + +#### 2.2 Design of the S3ip sysfs specification +Design Principles + - Unified, well-specified behavior, consistent experience among all SONiC devices, regardless of underlying platform; + - Easy to understand, implement, test and debug + - The sysfs root directory must be "/sys_switch", and the directory and its subdirectories or files can be soft links. For example, it is legal to link a file from /sys to /sys_switch. + - The contents of files in sysfs should be generated dynamically, using the same mechanism as the file contents in the /sys path of the Linux system. + - Sysfs has no specific CPU architecture requirements. + - Each file in sysfs represents a hardware property, and the property unit should be omitted. + - When a switch contains multiple devices of the same type, sysfs must be uniquely identified by the natural numbers 1 to n. For example, /sys_switch/fan/fan1 represents information about fan number 1 + - This specification defines the path name, permissions, data type, and data unit for each hardware + - The sysfs path defined in this specification must exist, and the file content should be "NA" if no hardware is available. + +S3IP sysfs specification : [specification](/doc/s3ip_sysfs/s3ip_sysfs_specification.md) + +S3IP sysfs specification hierarchy overview +- sys_switch + - cpld + - number + - cpld1 + - alias + - type + - ... + - psu + - syseeprom + - sysled + - transceiver + - temp_sensor + - vol_sensor + - cur_sensor + - watchdog + - slot + - fpga + + +### 3. S3IP sysfs framework +#### 3.1 S3IP sysfs framework scenario +The goal of the S3IP sysfs framework is to make it easy for vendors to generate sysfs directory structures that conform to the S3IP sysfs specification. + +![framework_scenario](/images/s3ip_sysfs/s3ip_sysfs_framework_scenario.svg) + +S3IP sysfs framework contains two parts。 + - S3ip_sysfs_service: kernel module management, configuration file parsing and /sys_switch directory generation. + - S3ip_sysfs_framework: the framework kernel module. + +#### 3.2 S3IP sysfs framework design +Design Principles + - Keep kernel modules as simple as possible. + - Reuse sysfs paths of existing drivers as much as possible. + - Easy to implement and debug. + +The process for creating /sys_switch/ + +![setup_flow](/images/s3ip_sysfs/s3ip_sysfs_setup_flow.svg) + +Flow to get the fan speed + +![get_flow](/images/s3ip_sysfs/s3ip_sysfs_get_info_flow.svg) + + the code for submission: + - Two device platforms that conform to the S3IP sysfs specification will be submitted to the buildimage repository + - S3ip sysfs framework will be submitted to the sonic-platform-common repository + +##### 3.2.1 s3ip sysfs kernel module + +The specification is not only a guideline, but also contains requirements for implementation. The kernel module is designed to make it easy to meet those details. + +S3IP sysfs kernel module(aka s3ip_sysfs.ko) provided the following features: + +1. Register/unregister mechanisms to interact with the s3ip_sysfs.ko. + +2. Dynamically generate/destroy the corresponding directory when a driver that uses s3ip_sysfs.ko is installed/uninstalled. + +Sample code for the watchdog interactive interface, The s3ip_sysfs.ko implements this code + +``` +struct s3ip_sysfs_watchdog_drivers_s { + ssize_t (*get_watchdog_identify)(char *buf, size_t count); + ssize_t (*get_watchdog_state)(char *buf, size_t count); + ssize_t (*get_watchdog_timeleft)(char *buf, size_t count); + ssize_t (*get_watchdog_timeout)(char *buf, size_t count); + int (*set_watchdog_timeout)(int value); + ssize_t (*get_watchdog_enable_status)(char *buf, size_t count); + int (*set_watchdog_enable_status)(int value); +}; + +extern int s3ip_sysfs_watchdog_drivers_register(struct s3ip_sysfs_watchdog_drivers_s *drv); +extern void s3ip_sysfs_watchdog_drivers_unregister(void); + +``` + +Sample code exposes watchdog register to sysfs, This code should be implemented by the vendor + +``` +#define WDT_INFO(fmt, args...) LOG_INFO("watchdog: ", fmt, ##args) +... +/* + * demo_set_watchdog_enable_status - Used to set watchdog enable status, + * @value: enable status value, 0: disable, 1: enable + * + * This function returns 0 on success, + * otherwise it returns a negative value on failed. + */ +static int demo_set_watchdog_enable_status(int value) +{ + /* add vendor codes here */ + return -ENOSYS; +} + +static struct s3ip_sysfs_watchdog_drivers_s drivers = { + /* + * set ODM watchdog sensor drivers to /sys/s3ip/watchdog, + * if not support the function, set corresponding hook to NULL. + */ + .get_watchdog_identify = demo_get_watchdog_identify, + .get_watchdog_state = demo_get_watchdog_state, + .get_watchdog_timeleft = demo_get_watchdog_timeleft, + .get_watchdog_timeout = demo_get_watchdog_timeout, + .set_watchdog_timeout = demo_set_watchdog_timeout, + .get_watchdog_enable_status = demo_get_watchdog_enable_status, + .set_watchdog_enable_status = demo_set_watchdog_enable_status, +}; + +static int __init watchdog_dev_drv_init(void) +{ + int ret; + + WDT_INFO("watchdog_init...\n"); + + ret = s3ip_sysfs_watchdog_drivers_register(&drivers); + if (ret < 0) { + WDT_ERR("watchdog drivers register err, ret %d.\n", ret); + return ret; + } + WDT_INFO("watchdog create success.\n"); + return 0; +} + +static void __exit watchdog_dev_drv_exit(void) +{ + s3ip_sysfs_watchdog_drivers_unregister(); + WDT_INFO("watchdog_exit success.\n"); + return; +} + +module_init(watchdog_dev_drv_init); +module_exit(watchdog_dev_drv_exit); +``` + +##### 3.2.2 s3ip sysfs service +Workflow of the S3ip sysfs service +- Delete old data, such as the /sys_switch directory and subdirectories +- Install kernel modules, including s3ip_sysfs.ko and other driver kernel modules +- Parse the configuration file and create the /sys_switch directory + +The S3ip sysfs service (aka s3ip_sysfs.service) configuration file is designed to simplify the /sys_switch directory creation process. +The configuration file contains the following metadata: +- path: Indicates the specific path of /sys_switch +- type: Indicates the type of the path + - string: fixed string type + - path: real path type +- value: indicates the real path or fixed string + +Sample configuration file to make /sys_switch witch S3ip sysfs Service + +``` +{ + "s3ip_syfs_paths": [ + # The /sys_switch/fan/num path specify the number of fans on the platform. This configuration makes the path read-only and return "6" in string format. + { + "path": "/sys_switch/fan/num", + "type" : "string", + "value" : "6", + "description": "number of fan" + }, + # The /sys_switch/syseeprom path specify the syseeprom information. This configuration makes the path linked to /sys/class/i2c_adapter/i2c-block/hwmon/hwmon1/eeprom2/2-0048, so we can reuse old driver sysfs path + { + "path":"/sys_switch/syseeprom", + "Type":"path", + "Value":"/sys/class/i2c_adapter/i2c-block/hwmon/hwmon1/eeprom2/2-0048" + }, + # the /sys_switch/fan give you all fan infomations. This configuration makes the path linked to /sys/s3ip/fan, so we can use driver base on the s3ip sysfs kernel module framework + { + "path":"/sys_switch/fan ", + "Type":"path", + "value":"/sys/s3ip/fan" + } + ] +} +``` +#### 3.3 Porting guide +1. git clone sonic-buildimage to get the S3IP framework, the path framework is at sonic-buildimage/platform/s3ip-sysfs +2. Verify the availability of the S3IP framework on the host computer + - Generate a host package, run the following command + - sonic-buildimage/platform/s3ip-sysfs/build.sh + - Install the package, run the following command + - dpkg -i s3ip-sysfs_1.0.0_amd64.deb + - Check the /sys_switch directory, run the following command + - tree -psv /sys_switch/ +3. Porting S3IP sysfs framework to platform project + - Create the S3IP sysfs service configuration file. + - Modify sonic-buildimage/platform/s3ip-sysfs/scripts/s3ip_sysfs_conf.json to create a configuration file + - This file should be installed to /etc/s3ip/s3ip_sysfs_conf.json on the device + - Implement the platform hardware driver, and export parameters through s3ip_sysfs.ko + - s3ip_sysfs. ko is generated by compiling sonic-buildimage/platform/s3ip-sysfs/s3ip_sysfs_frame source code + - Install the s3ip-sysfs.service on the device + - Copy service file sonic-buildimage/platform/s3ip-sysfs/scripts/s3ip-sysfs.service to the project. + - The service file needs to be installed in /etc/systemd/system/s3ip-sysfs.service on the device. + - When the platform package is installed, the vendor should enable s3ip-sysfs.service and start this service automatically when the device reboot + - After the platform package is uninstalled, the vendor should disable the s3ip-sysfs.service and remove the service file +4. Self-test after integration + - Ensure that the /sys_switch directory conforms to the S3IP sysfs specification + - Hardware property information can be read and written normally + +### 4 Compare with [PDDF](https://github.com/sonic-net/SONiC/blob/master/doc/platform/brcm_pdk_pddf.md) + +The S3IP sysfs specification is intended to provide a more general set of hardware access interfaces. Using sysfs is definitely the best option, as it fits into the Linux design philosophy of everything being a file, and there are more tools and languages to deal with it. + +For traditional driver engineers, The S3IP SYSFS interface is very friendly and easy to debug, they only need to care about the content and format of the sysfs node. So the learning cost is zero and it's easy to understand and implement. + +For ODM vendors new to SONIC, opt for PDDF because you can do platform adaptation with a configuration file, which is cool and popular. + +S3IP SYSFS and PDDF both share similar goals of reducing vendor adaptation effort and increasing the reusability of device management software. + +However, there are many differences between the two frameworks, which are listed below. ODM vendors can choose the framework based on actual requirements. + +| Item | S3IP sysfs|PDDF| +|-|-|-| +|Requirements| The requirements are put forward from the user's perspective, and the sysfs node is summarized from the actual operation experience. The goal is to unify the interface for device management | The requirements are proposed from technical point of view aimed at platform driver and APIs development in SONiC. Only those SysFS which are required by SONiC platform APIs are exposed. +|Ecosystem | Devices compliant with S3IP SYSFS specification have been widely used in data centers.
The [S3IP](http://www.s3ip.org/) project involved both vendors and users[S3IP] (including Tencent, Alibaba, Baidu, Kuaishou, Meituan, Jingdong and more than a dozen ODM vendors). Vendors and users complete a closed-loop of requirements, standards and debugging tools that have the ability to iterate continuously. | PDDF is a new framework and it is developed in the SONiC context. Some ODM platforms are already using PDDF. PDDF is an underlying framework which ODMs can use for faster development but it does not exposes any fixed SysFS nodes to the user. +|Development Mode | Regular development model,
Programming is required to implement the requirements.
ODM venders need to provide professional driver support for customers,Customers validating device with sysfs| ODM vendors can use common PDDF kernel drivers and user space common platform APIs. Only some platform specific device data needs to be provided by the ODMs in the form of JSON files. Validation is via usual SONiC CLIs. +|Flexible | 1.Bus independent, The hardware support:
Fan
PSU
System EEPROM
Transceivers
CPLD
FPGA
System LED
Temperature sensors
Current sensors
Voltage sensors
Slot
Watchdog

2.Support scenarios with many customization requirements, such as FPGA-Polling, BMC management hardware and firmware upgrades

3.Normalized SYSFS is easy for hardware fault identification and prediction

4.Easy to debug for ODM users, and they need not care about the bus topology |PDDF can be used on the platforms which use I2C bus to communicate with the peripheral devices. Platforms which use BMC can also be brought up using PDDF. In future PDDF would be supported on platform using PCIE FPGA devices. +|code position | https://github.com/sonic-net/sonic-buildimage/tree/master/platform/s3ip-sysfs| https://github.com/sonic-net/sonic-buildimage/tree/master/platform/pddf + +PDDF is not incompatible with S3IP SYSFS, we will combine the two parts into two Phases: + +Phase 1: The S3IP SYSFS Framework is integrated into the SONiC community so that Chinese ODM vendors can more easily contribute their existing platforms to the community, and other vendors can also have the opportunity to adapt their platforms according to S3IP specifications and expand their business opportunities in China. This is good for SONiC community ecosystem; + +Phase 2: PDDF and the S3IP SYSFS Framework will be integrated and presented as a framework, which makes more sense. Consumers decide whether to comply with the S3IP SYSFS specification by customizing the options provided by the framework. + +### SAI API +N/A +### Configuration and management +N/A +#### Manifest (if the feature is an Application Extension) +Paste a preliminary manifest in a JSON format. +#### CLI/YANG model Enhancements +N/A +#### Config DB Enhancements +N/A +### Warmboot and Fastboot Design Impact +N/A +### Restrictions/Limitations + +### Testing Requirements/Design + +New test cases need to be added + +1. Verify that the read and write properties of the sysfs node are as expected + +2. Whether the value of the sysfs node is as expected + +#### Unit Test cases +N/A +#### System Test cases +N/A +### Open/Action items - if any +N/A + +NOTE: All the sections and sub-sections given above are mandatory in the design document. Users can add additional sections/sub-sections if required. \ No newline at end of file diff --git a/doc/s3ip_sysfs/s3ip_sysfs_specification.md b/doc/s3ip_sysfs/s3ip_sysfs_specification.md new file mode 100644 index 0000000000..a88ecb497c --- /dev/null +++ b/doc/s3ip_sysfs/s3ip_sysfs_specification.md @@ -0,0 +1,239 @@ +# S3IP sysfs specification # + +## Table of Content + * [1. LED enumeration value](#1-led-enumeration-value) + * [2. Temperature sensor sysfs](#2-temperature-sensor-sysfs) + * [3. Voltage sensor sysfs](#3-voltage-sensor-sysfs) + * [4. Current sensor sysfs ](#4-current-sensor-sysfs) + * [5. Syseeprom infomation sysfs ](#5-syseeprom-information-sysfs) + * [6. Fan information sysfs](#6-fan-information-sysfs) + * [7. PSU information sysfs](#7-psu-information-sysfs) + * [8. Transceiver information sysfs](#8-transceiver-information-sysfs) + * [9. System LED sysfs](#9-system-led-sysfs) + * [10. FPGA information sysfs](#10-fpga-information-sysfs) + * [11. CPLD information sysfs](#11-cpld-information-sysfs) + * [12. Watchdog information sysfs](#12-watchdog-information-sysfs) + * [13. Slot information sysfs](#13-slot-information-sysfs) + + +### 1. LED enumeration values +| Value | Description | +|--------|---------------------------------------------------| +| 0 | dark | +| 1 | green | +| 2 | yellow | +| 3 | red | +| 4 | blue | +| 5 | green light flashing | +| 6 | yellow light flashing | +| 7 | red light flashing | +| 8 | blue light flashing | + +### 2. Temperature sensor sysfs +The sysfs path of the temperature sensor information must be /sys_switch/temp_sensor/ + +*Table2-1 Temperature Sensor SYSFS property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +/sys_switch/temp_sensor/number| RO| int| Total number of temperature sensors +/sys_switch/temp_sensor/temp[n]/alias| RO| string| Identify temperature point location +/sys_switch/temp_sensor/temp[n]/type| RO| string| Temperature sensor model +/sys_switch/temp_sensor/temp[n]/max| R/W| int| Alarm threshold, unit: millidegree Celsius +/sys_switch/temp_sensor/temp[n]/min| R/W| int| Alarm recovery threshold, unit: millidegree Celsius +/sys_switch/temp_sensor/temp[n]/value| RO| int| Current temperature, unit: millidegree Celsius + +### 3. Voltage sensor sysfs +The sysfs path of the voltage sensor information must be /sys_switch/vol_sensor/ + +*Table3-1 Voltage Sensor SYSFS property * + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +/sys_switch/vol_sensor/number|RO|int| Total number of voltage sensors +/sys_switch/vol_sensor/vol[n]/alias|RO|string| Identifying the location of the voltage sensor +/sys_switch/vol_sensor/vol[n]/type|RO|string| Model of the voltage sensor +/sys_switch/vol_sensor/vol[n]/max|R/W|int| Alarm threshold, unit: mV +/sys_switch/vol_sensor/vol[n]/min|R/W|int| Alarm recovery threshold, unit: mV +/sys_switch/vol_sensor/vol[n]/range|RO|int| Voltage output error value, such as +-500mV +/sys_switch/vol_sensor/vol[n]/nominal_value|RO|int| Nominal value of supply voltage, unit: mV +/sys_switch/vol_sensor/vol[n]/value|RO|int| Voltage value, unit: mV + +### 4. Current sensor sysfs +The sysfs path of the current sensor information must be /sys_switch/curr_sensor/ + +*Table4-1 Current Sensor SYSFS property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +/sys_switch/curr_sensor/number|RO|int| Total number of current sensors +/sys_switch/curr_sensor/curr[n]/alias|RO|string| Identifying the location of the current sensor +/sys_switch/curr_sensor/curr[n]/type|RO|string| Current sensor model +/sys_switch/curr_sensor/curr[n]/max|R/W|int| Alarm threshold, unit: mA +/sys_switch/curr_sensor/curr[n]/min|R/W|int| Alarm recovery threshold, unit: mA +/sys_switch/curr_sensor/curr[n]/value|RO|int| Current value, unit: mA + +### 5. Syseeprom information sysfs +The sysfs path of the syseeprom information must be /sys_switch/syseeprom + +*Table5-1 Syseeprom info SYSFS property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +/sys_switch/syseeprom|RO|int|The file content conforms to the ONIE standard binary + +### 6. Fan information sysfs +The sysfs path of the fan information must be /sys_switch/fan/ + +*Table6-1 fan info sysfs property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/fan/number |RO| int| Total number of fans +|/sys_switch/fan/fan[n]/model_name |RO| string| Fan name +|/sys_switch/fan/fan[n]/serial_number |RO| string| Fan serial number +|/sys_switch/fan/fan[n]/part_number |RO| string| Fan Part Number +|/sys_switch/fan/fan[n]/hardware_version |RO| string| Fan hardware version number +|/sys_switch/fan/fan[n]/motor_number |RO| int| Number of fan motors +|/sys_switch/fan/fan[n]/direction |RO| enum| The duct types are defined as follows:
0: F2B, forward air duct
1: B2F, rear duct +|/sys_switch/fan/fan[n]/ratio |R/W| int| Motor speed percentage, value range 0-100 +|/sys_switch/fan/fan[n]/motor[n]/speed |RO| int| Speed value,unit: RPM +|/sys_switch/fan/fan[n]/motor[n]/speed_tolerance |RO| int| Fan Speed tolerance (error range) ,unit: RPM +|/sys_switch/fan/fan[n]/motor[n]/speed_target |RO| int| Motor standard speed value, unit: RPM +|/sys_switch/fan/fan[n]/motor[n]/speed_max |RO| int| Maximum motor speed,unit: RPM +|/sys_switch/fan/fan[n]/motor[n]/speed_min |RO| int| Minimum motor speed,unit: RPM +|/sys_switch/fan/fan[n]/status |RO| enum| Fan states are defined as follows:
0: not present
1: present and normal
2: present and abnormal +|/sys_switch/fan/fan[n]/led_status |R/W| enum| The fan status lights are defined as follows:
See the definition of enumeration value of LED status light for details + +### 7. PSU information sysfs +The sysfs path of the PSU(Power Supply Unit) information must be /sys_switch/psu/ + +*Table7-1 Power Information sysfs Property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/psu/number |RO| int| Total number of PSUs +|/sys_switch/psu/psu[n]/model_name |RO| string | PSU name +|/sys_switch/psu/psu[n]/hardware_version |RO| string | PSU hardware version number +|/sys_switch/psu/psu[n]/serial_number |RO| string | PSU serial number +|/sys_switch/psu/psu[n]/part_number |RO| string | PSU part number +|/sys_switch/psu/psu[n]/type|RO| enum | PSU Type:
0: DC
1: AC +|/sys_switch/psu/psu[n]/in_curr |RO| int | PSU input current, unit: mA +|/sys_switch/psu/psu[n]/in_vol |RO| int | PSU input voltage, unit: mV +|/sys_switch/psu/psu[n]/in_power |RO| int | PSU input power, compute it from in_curr * in_vol, unit: uW +|/sys_switch/psu/psu[n]/out_max_power |RO| int |The maximum output power of the PSU, unit: uW +|/sys_switch/psu/psu[n]/out_curr |RO| int | PSU output current, unit: mA +|/sys_switch/psu/psu[n]/out_vol |RO| int | PSU output voltage, unit: mV +|/sys_switch/psu/psu[n]/out_power |RO| int | PSU output power, compute it from out_curr * out_vol, unit: uW +|/sys_switch/psu/psu[n]/num_temp_sensors |RO| int | Number of temperature sensors +|/sys_switch/psu/psu[n]/temp[n] | R/W| | Refer to temperature sensor definition +|/sys_switch/psu/psu[n]/num_power_sensors |RO| int | Number of power sensors, TBD +|/sys_switch/psu/psu[n]/power_sensor[n] | R/W| | Refer to power sensor definition, TBD +|/sys_switch/psu/psu[n]/present|RO| enum | State:
0: not present
1: Incumbent +|/sys_switch/psu/psu[n]/out_status|RO| enum | Output status, via POWER_OK inside the power supply pin judgment
0: abnormal
1: normal +|/sys_switch/psu/psu[n]/in_status|RO| enum | Input status, judged by AC_OK pin inside the power supply broken
0: abnormal
1: normal +|/sys_switch/psu/psu[n]/fan_speed |RO| int | PSU fan speed, unit: RPM +|/sys_switch/psu/psu[n]/fan_ratio | R/W| Int| PSU fan speed duty cycle +|/sys_switch/psu/psu[n]/led_status|RO| enum | The PSU status lights are defined as follows:
See the definition of enumeration value of LED status light for details + +### 8. Transceiver information sysfs +The sysfs of the transceiver module information must be /sys_switch/transceiver/ + +*Table8-1 Transceiver module information sysfs Property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/transceiver/power_on |R/W| enum | The power state of all ports on the system:
0: power off
1: power on +|/sys_switch/transceiver/eth[n]/power_on |R/W| enum | The power state:
0: power off
1: power on +|/sys_switch/transceiver/eth[n]/tx_fault|RO| enum |module sending channel exception (including laser/TXCDR)
0: normal
1: abnormal.
This information is exported by eeprom (eg QSFP28 standard), the node may not support;Otherwise, the node must support (such as SFP28 standard) +|/sys_switch/transceiver/eth[n]/tx_disable|R/W| enum | Optical signal state
0: Turn on the optical signal
1: Turn off the optical signal.
This information is exported by eeprom (eg QSFP28 standard), the node may not support; Otherwise, the node must support (such as SFP28 standard) +|/sys_switch/transceiver/eth[n]/present|RO| enum | Present state
0: absent, not in place
1: present and normal +|/sys_switch/transceiver/eth[n]/rx_los|RO| enum | Rx loss state(no optical signal received)
0: normal
1: abnormal
This information is exported by eeprom (eg QSFP28 standard), the node may not support;Otherwise, the node must support (such as SFP28 standard) +|/sys_switch/transceiver/eth[n]/reset|R/W| enum | Reset pin
0: no reset
1: reset
This information supports exporting (such as QSFP28 standard), the node must support it; otherwise, the section point may not be supported (such as SFP28 standard) +|/sys_switch/transceiver/eth[n]/low_power_mode|RO| enum | Low power mode state
0: high power
1: low power mode
This information supports exporting (such as QSFP28 standard), the node must support it
otherwise, the section point may not be supported (such as SFP28 standard) +|/sys_switch/transceiver/eth[n]/interrupt|RO| enum | Module interrupt flag, indicating whether there is an interrupt
0: No interrupt occurred
1: Interrupt occurs
This information supports exporting (such as QSFP28 standard), the node must support it; otherwise, the section point may not be supported (such as SFP28 standard) +|/sys_switch/transceiver/eth[n]/eeprom |R/W| binary| eeprom compliant with optical module standards + +### 9. System LED sysfs +The sysfs path of the LED state must be /sys_switch/sysled/ + +*Table9-1 system LED SYSFS property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/sysled/sys_led_status|R/W|enum|System LED status, refer to LED enumeration value table for details +|/sys_switch/sysled/bmc_led_status|R/W|enum|BMC LED status, refer to LED enumeration value table for details +|/sys_switch/sysled/fan_led_status|R/W|enum|FAN LED status, refer to LED enumeration value table for details +|/sys_switch/sysled/psu_led_status|R/W|enum|PSU LED status, refer to LED enumeration value table for details +|/sys_switch/sysled/id_led_status|R/W|enum|Location LED status, refer to LED enumeration value table for details + +### 10. FPGA information sysfs +The sysfs path of the FPGA Information must be /sys_switch/fpga/ + +*Table10-1 FPGA Information sysfs Property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/fpga/number |RO |int| Total number of FPGAs +|/sys_switch/fpga/fpga[n]/alias |RO |string| FPGA alias, Identifying the location of the FPGA +|/sys_switch/fpga/fpga[n]/type |RO |string| FPGA model +|/sys_switch/fpga/fpga[n]/firmware_version |RO |string| FPGA firmware version number +|/sys_switch/fpga/fpga[n]/board_version |RO |string| FPGA hardware version number +|/sys_switch/fpga/fpga[n]/reg_test |R/W |int| Test register, test basic functions available + +### 11. CPLD information sysfs +The sysfs path of the CPLD information must be /sys_switch/cpld/ + +*Table11-1 CPLD information sysfs Property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/cpld/number |RO |int| Total number of CPLDs +|/sys_switch/cpld/cpld[n]/alias |RO |string| CPLD alias, Identifying the location of the CPLD +|/sys_switch/cpld/cpld[n]/type |RO |string| CPLD model +|/sys_switch/cpld/cpld[n]/firmware_version |RO |string| CPLD firmware version number +|/sys_switch/cpld/cpld[n]/board_version |RO |string|CPLD hardware version number +|/sys_switch/cpld/cpld[n]/reg_test |R/W |int|Test register, test basic function available + +### 12. Watchdog information sysfs +The sysfs path of the watchdog information must be /sys_switch/watchdog/ + +*Table12-1 watchdog information sysfs property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/watchdog/identify |RO| string| Watchdog identification, eg iTCO_wdt +|/sys_switch/watchdog/enable|R/W|enum| Watchdog Status:
0: inactive
1: active +|/sys_switch/watchdog/reset |WO| int | Feed watchdog +|/sys_switch/watchdog/timeleft |RO| int | Watchdog timeout remaining time, unit:seconds +|/sys_switch/watchdog/timeout|R/W| int | Watchdog timeout, unit: seconds + +### 13. Slot information sysfs + +the sysfs path of slot information must be /sys_switch/slot/ + +*Table13-1 Slot information sysfs property* + +|Sysfs path|Permissions|Data type|Description| +|-|-|-|-| +|/sys_switch/slot/number|RO| int | Total number of card slots +|/sys_switch/slot/slot[n]/model_name |RO| string| Slot name +|/sys_switch/slot/slot[n]/hardware_version |RO| string| Slot hardware version number +|/sys_switch/slot/slot[n]/serial_number |RO| string| Slot serial number +|/sys_switch/slot/slot[n]/part_number |RO| string| Slot part number +|/sys_switch/slot/slot[n]/status |RO| string| Slot status
0: ABSENT, not in place
1: OK, present and normal
2: NOT OK, in place and abnormal +|/sys_switch/slot/slot[n]/led_status |R/W| enum| Slot status light +|/sys_switch/slot/slot[n]/num_temp_sensors |RO| int| Number of temperature sensors on sub card +|/sys_switch/slot/slot[n]/temp_sensor[n] |R/W| | Refer to temperature sensor definition +|/sys_switch/slot/slot[n]/num_vol_sensors |RO| int| Number of sub card voltage sensors +|/sys_switch/slot/slot[n]/vol_sensor[n] |R/W| | Refer to voltage sensor definition +|/sys_switch/slot/slot[n]/num_curr_sensors |RO| int| Number of sub card current sensors +|/sys_switch/slot/slot[n]/curr_sensor[n] |R/W| | Refer to current sensor definition +|/sys_switch/slot/slot[n]/num_fpgas |RO| int| Number of sub card FPGAs +|/sys_switch/slot/slot[n]/fpga[n] |R/W|| Refer to FPGA Information Sysfs Definition +|/sys_switch/slot/slot[n]/num_cplds |RO| int| Number of sub card CPLDs +|/sys_switch/slot/slot[n]/cpld[n] |R/W| | Refer to CPLD information Sysfs definition + +### 14. Power sensor sysfs +The sysfs path of the power sensor information must be /sys_switch/power_sensor/ +Note: TBD. This section will be defined in the next stage. Most on-board DC-DC converters (also called PWM or pulse-width modulator chips) provide voltage, current and calculated power. They often provide power In and Power out, allowing easy measurement of efficiency. It is more reliable to read this directly rather than compute it from current * voltage, which might obtain readings at different times and result in invalid computation. It could also be more accurate because multiplying current * power in the controller results in compound loss of precision(rounded value * rounded value) diff --git a/images/s3ip_sysfs/s3ip_sysfs_demo.png b/images/s3ip_sysfs/s3ip_sysfs_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca51ce2c2384dffa875935ff12241341cf697e8 GIT binary patch literal 28225 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 VeDN~T4EW#?o!bVQW$O3B{tFDR=XwAD literal 0 HcmV?d00001 diff --git a/images/s3ip_sysfs/s3ip_sysfs_framework_scenario.svg b/images/s3ip_sysfs/s3ip_sysfs_framework_scenario.svg new file mode 100644 index 0000000000..71562fe8f2 --- /dev/null +++ b/images/s3ip_sysfs/s3ip_sysfs_framework_scenario.svg @@ -0,0 +1,4 @@ + + + +
S3IP framework
S3IP framework
Application
Application
debug tools
debug tools
device monitor
device monitor
pmon deamons
pmon deamons
show command
show command
User Space
User Space
Kernel Space
Kernel Space
Peripheral Hardware
Peripheral Hardware
s3ip_sysfs_frame
s3ip_sysfs_frame
open source
drivers
open source...
driver adaptation layer
driver adaptation layer
S3IP sysfs directory
/sys_switch
S3IP sysfs directory...
s3ip_sysfs_service
s3ip_sysfs_service
hardware
hardware
other customized drivers
other customized drivers
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/s3ip_sysfs/s3ip_sysfs_get_info_flow.svg b/images/s3ip_sysfs/s3ip_sysfs_get_info_flow.svg new file mode 100644 index 0000000000..c95e22cb95 --- /dev/null +++ b/images/s3ip_sysfs/s3ip_sysfs_get_info_flow.svg @@ -0,0 +1,4 @@ + + + +
application
application
get fan speed
get fan speed
s3ip_sysfs.ko
s3ip_sysfs.ko
fan.ko
fan.ko
read path
/sys_switch/fan/fan1/motor1/speed
read path...
return
return
call fan_speed_get()
call fan_speed_get()
return speed
return speed
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/s3ip_sysfs/s3ip_sysfs_scenario.svg b/images/s3ip_sysfs/s3ip_sysfs_scenario.svg new file mode 100644 index 0000000000..4dafc26399 --- /dev/null +++ b/images/s3ip_sysfs/s3ip_sysfs_scenario.svg @@ -0,0 +1,4 @@ + + + +
diag tools
diag tools
CLI/SNMP
CLI/SNMP
State DB
State DB
show platform
show platform
show watchdog
show watchdog
snmpd
snmpd
....
....
diag tools
diag tools
debug tools
debug tools
device monitor
device monitor
PMON container
PMON container
psud
psud
fand
fand
xcvrd
xcvrd
sensord
sensord
User Space
User Space
Kernel Space
Kernel Space
Peripheral Hardware
Peripheral Hardware
fans
fans
psus
psus
sensors
sensors
leds
leds
tranceivers
tranceivers
syseeprom
syseeprom
S3IP sysfs specification
S3IP sysfs specification
sysfs
sysfs
I2C drivers
I2C drivers
x drivers
x drivers
plugin/new platform API
plugin/new platform API
Text is not SVG - cannot display
\ No newline at end of file diff --git a/images/s3ip_sysfs/s3ip_sysfs_setup_flow.svg b/images/s3ip_sysfs/s3ip_sysfs_setup_flow.svg new file mode 100644 index 0000000000..bf69c6672d --- /dev/null +++ b/images/s3ip_sysfs/s3ip_sysfs_setup_flow.svg @@ -0,0 +1,4 @@ + + + +
s3ip_sysfs.ko
s3ip_sysfs.ko
create /sys/s3ip
directory
create /sys/s3ip...
create /sys/s3ip/fan1/*
create /sys/s3ip/fan1/*
fan.ko
fan.ko
s3ip_sysfs.service
s3ip_sysfs.servi...
service start
service start
insmod fan.ko
insmod fan.ko
parse configuration file and
create /sys_switch
parse configuration file and...
insmod s3ip_sysfs.ko
insmod s3ip_sys...
register callback function
register callba...
system setup
system setup
Text is not SVG - cannot display
\ No newline at end of file