From abccdaeb6cff0ef583290d11405b64c27418bfd1 Mon Sep 17 00:00:00 2001 From: pettershao-ragilenetworks <81281940+pettershao-ragilenetworks@users.noreply.github.com> Date: Sat, 5 Aug 2023 03:01:49 +0800 Subject: [PATCH] [Ragile]Adapt kernel 5.10 for broadcom on RA-B6510-48V8C (#14809) * Adapt kernel 5.10 for broadcom on RA-B6510-48V4C Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * update Signed-off-by: pettershao-ragilenetworks * modify one-image.mk file Signed-off-by: pettershao-ragilenetworks * modify debian/rule.mk Signed-off-by: pettershao-ragilenetworks * Add platform.json file Signed-off-by: pettershao-ragilenetworks --------- Signed-off-by: pettershao-ragilenetworks --- .../RA-B6510-48V8C/port_config.ini | 114 +- ...d3-ra-b6510-48v8c-48x25G+8x100G.config.bcm | 820 ++- .../custom_led.bin | Bin 300 -> 236 bytes .../x86_64-ragile_ra-b6510-48v8c-r0/dev.xml | 509 +- .../dev_exhaust.xml | 419 ++ .../x86_64-ragile_ra-b6510-48v8c-r0/fru.py | 961 +++ .../latest_firmware/bios_upgrade_header.bin | Bin 0 -> 8388725 bytes .../cpu_cpld_upgrade_header.vme | Bin 0 -> 286723 bytes .../latest_firmware/fpga_upgrade_header.bin | Bin 0 -> 3180414 bytes .../other_cpld_upgrade_header.vme | Bin 0 -> 1105536 bytes .../monitor.py | 378 +- .../x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml | 21 +- .../pddf/pd-plugin.json | 67 - .../pddf/pddf-device.json | 6502 ----------------- .../platform.json | 402 + .../platform_components.json | 37 + .../plugins/eeprom.py | 25 - .../plugins/fanutil.py | 187 - .../plugins/ledutil.py | 59 - .../plugins/psuutil.py | 270 - .../plugins/sfputil.py | 391 +- .../plugins/ssd_util.py | 311 + .../plugins/sysstatutil.py | 82 - .../plugins/thermalutil.py | 75 - .../pmon_daemon_control.json | 6 +- .../sensors.conf | 21 - .../sonic_platform_config/chassis.json | 3 - .../sonic_platform_config/component.json | 60 - .../sonic_platform_config/fan.json | 152 - .../sonic_platform_config/psu.json | 134 - .../sonic_platform_config/thermal.json | 130 - ...t => system_health_monitoring_config.json} | 0 .../systest.py | 43 - platform/broadcom/one-image.mk | 3 - platform/broadcom/platform-modules-ragile.mk | 30 +- .../sonic-platform-modules-ragile/LICENSE | 1 - .../common/Makefile | 27 +- .../common/app/Makefile | 25 + .../common/app/dev_util/Makefile | 30 + .../common/app/dev_util/dfd_debug.c | 43 + .../common/app/dev_util/dfd_utest.c | 1802 +++++ .../common/app/dev_util/dfd_utest.h | 103 + .../common/app/firmware_upgrade/Makefile | 19 + .../common/app/firmware_upgrade/Rules.mk | 42 + .../firmware_upgrade/firmware_driver/Makefile | 19 + .../firmware_driver_cpld/Makefile | 23 + .../firmware_driver_cpld/firmware.c | 144 + .../firmware_driver_cpld/firmware_cpld.c | 384 + .../firmware_cpld_upgrade.c | 1879 +++++ .../firmware_driver_cpld/include/firmware.h | 82 + .../include/firmware_cpld.h | 64 + .../firmware_driver_cpld/include/jbi.h | 15 + .../firmware_driver_cpld/jbicomp.c | 438 ++ .../firmware_driver_cpld/jbicomp.h | 37 + .../firmware_driver_cpld/jbiexprt.h | 224 + .../firmware_driver_cpld/jbijtag.c | 1679 +++++ .../firmware_driver_cpld/jbijtag.h | 146 + .../firmware_driver_cpld/jbimain.c | 3362 +++++++++ .../firmware_driver_cpld/jbiport.h | 45 + .../firmware_driver_cpld/jbistub.c | 2518 +++++++ .../firmware_driver_cpld/jbistub.h | 95 + .../firmware_driver_ispvme/Makefile | 22 + .../firmware_cpld_ispvme.c | 450 ++ .../firmware_cpld_upgrade_ispvme.c | 691 ++ .../firmware_driver_ispvme/firmware_ispvme.c | 140 + .../include/firmware_cpld_ispvme.h | 70 + .../include/firmware_ispvme.h | 86 + .../firmware_driver_sysfs/Makefile | 22 + .../firmware_driver_sysfs/firmware.c | 143 + .../firmware_driver_sysfs/firmware_sysfs.c | 495 ++ .../firmware_sysfs_upgrade.c | 258 + .../include/firmware_sysfs.h | 88 + .../include/firmware_sysfs_upgrade.h | 72 + .../include/firmware_upgrade.h | 57 + .../firmware_upgrade/Makefile | 33 + .../firmware_upgrade/firmware_upgrade/crc32.c | 216 + .../firmware_upgrade/firmware_upgrade/debug.c | 60 + .../firmware_upgrade/firmware_app.c | 985 +++ .../fw_upg_gpio_vme/hardware.c | 263 + .../fw_upg_gpio_vme/ispvm_ui.c | 837 +++ .../fw_upg_gpio_vme/ivm_core.c | 3097 ++++++++ .../fw_upg_isc/firmware_upgrade_isc.c | 68 + .../fw_upg_mtd/firmware_upgrade_mtd.c | 446 ++ .../fw_upg_mtd/firmware_upgrade_mtd.h | 32 + .../firmware_upgrade/fw_upg_mtd/mtd-abi.h | 259 + .../fw_upg_sysfs/firmware_upgrade_sysfs.c | 285 + .../fw_upg_sysfs/firmware_upgrade_sysfs.h | 16 + .../fw_upg_sysfs/fw_upg_spi_logic_dev.c | 1181 +++ .../fw_upg_sysfs/fw_upg_spi_logic_dev.h | 90 + .../firmware_upgrade/include/debug.h | 34 + .../firmware_upgrade/include/firmware_app.h | 172 + .../firmware_upgrade/include/vmopcode.h | 192 + .../common/app/fw_upgrade/Makefile | 18 + .../common/app/fw_upgrade/Rules.mk | 42 + .../common/app/fw_upgrade/fw_upgrade/Makefile | 39 + .../app/fw_upgrade/fw_upgrade/fw_upgrade.c | 1632 +++++ .../fw_upgrade/fw_upgrade/fw_upgrade_debug.c | 51 + .../fw_upgrade/include/fw_upgrade.h | 230 + .../fw_upgrade/include/fw_upgrade_debug.h | 25 + .../common/depmod_conf/distsearch.conf | 4 - .../lib/{rgutil => algorithm}/__init__.py | 0 .../common/lib/algorithm/hysteresis.py | 169 + .../common/lib/algorithm/openloop.py | 104 + .../common/lib/algorithm/pid.py | 106 + .../common/lib/eepromutil/fantlv.py | 76 +- .../common/lib/eepromutil/fru.py | 121 +- .../common/lib/eepromutil/onietlv.py | 441 ++ .../common/lib/plat_hal/__init__.py | 0 .../common/lib/plat_hal/baseutil.py | 164 + .../common/lib/plat_hal/chassisbase.py | 318 + .../common/lib/plat_hal/component.py | 33 + .../common/lib/plat_hal/cpld.py | 66 + .../common/lib/plat_hal/cpu.py | 48 + .../common/lib/plat_hal/dcdc.py | 11 + .../common/lib/plat_hal/devicebase.py | 355 + .../common/lib/plat_hal/fan.py | 413 ++ .../common/lib/plat_hal/interface.py | 1324 ++++ .../common/lib/plat_hal/led.py | 52 + .../common/lib/plat_hal/onie_e2.py | 127 + .../common/lib/plat_hal/osutil.py | 440 ++ .../common/lib/plat_hal/psu.py | 607 ++ .../common/lib/plat_hal/rotor.py | 149 + .../common/lib/plat_hal/sensor.py | 219 + .../common/lib/plat_hal/temp.py | 139 + .../common/lib/rgutil/logutil.py | 67 - .../common/lib/wbutil/__init__.py | 0 .../common/lib/{rgutil => wbutil}/baseutil.py | 23 +- .../common/lib/{rgutil => wbutil}/smbus.py | 93 +- .../kernel_drivers_blacklist.conf | 5 + .../common/modules/Makefile | 70 +- .../common/modules/csu550.c | 252 - .../common/modules/dfd_tlveeprom.c | 516 ++ .../common/modules/dfd_tlveeprom.h | 121 + .../common/modules/fpga_i2c.h | 133 + .../common/modules/fpga_i2c_ocores.c | 911 --- .../common/modules/fpga_i2c_ocores.h | 13 - .../common/modules/fpga_pcie_i2c.c | 1144 --- .../common/modules/fpga_pcie_i2c.h | 107 - .../common/modules/fpga_reg_defs.h | 174 - .../common/modules/i2c-mux-pca954x.c | 1676 ----- .../common/modules/i2c-mux-pca9641.c | 653 -- .../common/modules/intel_spi/Makefile | 21 + .../modules/intel_spi/include/intel_spi.h | 23 + .../common/modules/intel_spi/intel_spi.c | 969 +++ .../modules/intel_spi/intel_spi_platform.c | 167 + .../common/modules/linux-5.10/Makefile | 34 + .../common/modules/linux-5.10/wb_at24.c | 861 +++ .../common/modules/linux-5.10/wb_csu550.c | 236 + .../modules/linux-5.10/wb_i2c_algo_bit.c | 725 ++ .../common/modules/linux-5.10/wb_i2c_gpio.c | 431 ++ .../modules/linux-5.10/wb_i2c_gpio_device.c | 110 + .../common/modules/linux-5.10/wb_i2c_i801.c | 2114 ++++++ .../modules/linux-5.10/wb_i2c_mux_pca954x.c | 1343 ++++ .../modules/linux-5.10/wb_i2c_mux_pca954x.h | 67 + .../modules/linux-5.10/wb_i2c_mux_pca9641.c | 1375 ++++ .../modules/linux-5.10/wb_i2c_mux_pca9641.h | 64 + .../common/modules/linux-5.10/wb_ina3221.c | 1031 +++ .../common/modules/linux-5.10/wb_isl68137.c | 572 ++ .../common/modules/linux-5.10/wb_lm75.c | 987 +++ .../common/modules/linux-5.10/wb_lm75.h | 40 + .../common/modules/linux-5.10/wb_pmbus.h | 535 ++ .../common/modules/linux-5.10/wb_pmbus_core.c | 2780 +++++++ .../common/modules/linux-5.10/wb_tmp401.c | 798 ++ .../common/modules/linux-5.10/wb_tps53622.c | 265 + .../common/modules/linux-5.10/wb_ucd9000.c | 675 ++ .../common/modules/lpc_cpld_i2c_ocores.c | 843 --- .../common/modules/lpc_cpld_i2c_ocores.h | 13 - .../common/modules/lpc_dbg.c | 534 -- .../common/modules/lpc_dbg.h | 39 - .../common/modules/plat_sysfs/Makefile | 20 + .../modules/plat_sysfs/dev_cfg/Makefile | 25 + .../modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c | 812 ++ .../plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c | 351 + .../plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c | 236 + .../plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c | 587 ++ .../plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c | 82 + .../plat_sysfs/dev_cfg/dfd_fan_driver.c | 170 + .../modules/plat_sysfs/dev_cfg/dfd_module.c | 95 + .../plat_sysfs/dev_cfg/dfd_psu_driver.c | 70 + .../plat_sysfs/dev_cfg/dfd_sensors_driver.c | 149 + .../plat_sysfs/dev_cfg/dfd_sff_driver.c | 56 + .../plat_sysfs/dev_cfg/dfd_slot_driver.c | 27 + .../plat_sysfs/dev_cfg/include/dfd_cfg.h | 97 + .../dev_cfg/include/dfd_cfg_adapter.h | 46 + .../plat_sysfs/dev_cfg/include/dfd_cfg_file.h | 37 + .../plat_sysfs/dev_cfg/include/dfd_cfg_info.h | 109 + .../dev_cfg/include/dfd_cfg_listnode.h | 30 + .../dev_cfg/include/dfd_fan_driver.h | 18 + .../plat_sysfs/dev_cfg/include/dfd_module.h | 96 + .../dev_cfg/include/dfd_psu_driver.h | 10 + .../dev_cfg/include/dfd_sensors_driver.h | 10 + .../dev_cfg/include/dfd_sff_driver.h | 8 + .../dev_cfg/include/dfd_slot_driver.h | 6 + .../modules/plat_sysfs/dev_sysfs/Makefile | 21 + .../dev_sysfs/include/plat_switch.h | 86 + .../dev_sysfs/include/sysfs_common.h | 90 + .../modules/plat_sysfs/dev_sysfs/plat_fan.c | 505 ++ .../modules/plat_sysfs/dev_sysfs/plat_psu.c | 430 ++ .../plat_sysfs/dev_sysfs/plat_sensor.c | 457 ++ .../modules/plat_sysfs/dev_sysfs/plat_sff.c | 291 + .../modules/plat_sysfs/dev_sysfs/plat_slot.c | 667 ++ .../plat_sysfs/dev_sysfs/plat_switch.c | 135 + .../common/modules/platform_common.h | 74 + .../common/modules/platform_common_module.c | 210 + .../common/modules/pmbus.h | 520 -- .../common/modules/ragile_common_module.c | 76 - .../common/modules/ragile_platform.c | 97 - .../common/modules/rg-gpio-xeon.c | 357 - .../common/modules/rg-i2c-algo-bit.c | 734 -- .../common/modules/rg-i2c-gpio.c | 431 -- .../common/modules/rg_fan.c | 266 - .../common/modules/rg_psu.c | 340 - .../common/modules/spi-bitbang-txrx.h | 107 + .../common/modules/wb_eeprom_93xx46.c | 558 ++ .../common/modules/wb_fpga_i2c_bus_drv.c | 1121 +++ .../common/modules/wb_fpga_pca954x_drv.c | 525 ++ .../common/modules/wb_fpga_pcie.c | 164 + .../common/modules/wb_gpio_d1500.c | 367 + .../common/modules/wb_gpio_device.c | 54 + .../common/modules/wb_i2c_dev.c | 774 ++ .../common/modules/wb_i2c_dev.h | 20 + .../common/modules/wb_i2c_ocores.c | 1143 +++ .../common/modules/wb_i2c_ocores.h | 28 + .../common/modules/wb_io_dev.c | 571 ++ .../common/modules/wb_io_dev.h | 21 + .../common/modules/wb_lpc_drv.c | 166 + .../common/modules/wb_lpc_drv.h | 18 + .../common/modules/wb_mac_bsc.c | 660 ++ .../common/modules/wb_optoe.c | 1192 +++ .../common/modules/wb_pcie_dev.c | 770 ++ .../common/modules/wb_pcie_dev.h | 26 + .../common/modules/wb_platform_i2c_dev.c | 749 ++ .../common/modules/wb_platform_i2c_dev.h | 19 + .../common/modules/wb_spi_93xx46.c | 111 + .../common/modules/wb_spi_dev.c | 583 ++ .../common/modules/wb_spi_dev.h | 16 + .../common/modules/wb_spi_gpio.c | 477 ++ .../common/modules/wb_spi_gpio_device.c | 153 + .../common/modules/wb_spi_nor_device.c | 87 + .../common/modules/wb_spi_ocores.c | 1025 +++ .../common/modules/wb_spi_ocores.h | 21 + .../common/modules/wb_uio_irq.c | 282 + .../common/modules/wb_wdt.c | 1038 +++ .../common/modules/wb_wdt.h | 46 + .../common/modules/wb_xdpe132g5c.c | 574 ++ .../common/script/auto_update.py | 196 + .../common/script/avscontrol.py | 234 +- .../common/script/dev_monitor.py | 303 + .../common/script/device_i2c.py | 327 - .../common/script/fancontrol.py | 994 --- .../common/script/generate_airflow.py | 236 + .../common/script/hal_fanctrl.py | 1135 +++ .../common/script/hal_ledctrl.py | 830 +++ .../common/script/hal_pltfm.py | 492 ++ .../common/script/intelligent_monitor.py | 144 + .../script/intelligent_monitor/monitor_fan.py | 284 + .../common/script/platform_common.py | 178 + .../common/script/platform_config.py | 184 + .../common/script/platform_driver.py | 258 + .../common/script/platform_e2.py | 434 ++ .../common/script/platform_intf.py | 367 + .../common/script/platform_ipmi.py | 92 + .../common/script/platform_manufacturer.py | 591 ++ .../common/script/platform_process.py | 396 + .../common/script/platform_sensors.py | 253 + .../common/script/platform_test.py | 142 + .../common/script/platform_util.py | 845 +++ .../common/script/pmon_syslog.py | 519 ++ .../common/script/ragilecommon.py | 1365 ---- .../common/script/ragileconfig.py | 225 - .../common/script/ragileutil.py | 2099 ------ .../common/script/reboot_cause.py | 183 + .../common/script/reboot_ctrl.py | 150 + .../common/script/sensors | 8 + .../common/script/sfp_highest_temperatue.py | 148 + .../common/script/slot_monitor.py | 242 + .../common/script/ssdmon | 82 + .../common/script/tty_console.py | 91 + .../common/script/upgrade.py | 991 +++ .../common/script/warm_upgrade.py | 514 ++ .../common/service/device_i2c.service | 15 - .../common/service/platform_driver.service | 15 + .../common/service/platform_process.service | 16 + .../common/sonic_platform/__init__.py | 2 + .../common/sonic_platform/chassis.py | 530 ++ .../common/sonic_platform/component.py | 226 + .../common/sonic_platform/dcdc.py | 85 + .../common/sonic_platform/eeprom.py | 92 + .../common/sonic_platform/fan.py | 308 + .../common/sonic_platform/fan_drawer.py | 167 + .../common/sonic_platform/pcie.py | 21 + .../sonic_platform/platform.py | 18 +- .../common/sonic_platform/psu.py | 359 + .../sonic_platform/sfp.py | 205 +- .../common/sonic_platform/thermal.py | 234 + .../common/sonic_platform/watchdog.py | 236 + .../debian/compat | 2 +- .../debian/control | 10 +- .../debian/copyright | 1 - ...form-modules-ragile-ra-b6510-48v8c.install | 2 +- ...orm-modules-ragile-ra-b6510-48v8c.postinst | 7 - .../debian/rule-ragile.mk | 8 - .../debian/rule.mk | 5 + .../debian/rules | 65 +- .../ra-b6510-48v8c/LICENSE | 15 - .../ra-b6510-48v8c/MAINTAINERS | 5 - .../ra-b6510-48v8c/Makefile | 18 +- .../ra-b6510-48v8c/README.md | 1 - .../x86_64_ragile_ra_b6510_48v8c_r0_config.py | 1528 ++-- ...64_ragile_ra_b6510_48v8c_r0_port_config.py | 7 + .../x86_64_ragile_ra_b6510_48v8c_r0_device.py | 1234 ++++ ...ragile_ra_b6510_48v8c_r0_exhaust_device.py | 1232 ++++ ...x86_64_ragile_ra_b6510_48v8c_r0_monitor.py | 206 + .../ra-b6510-48v8c/modules/driver/Makefile | 16 +- .../ra-b6510-48v8c/modules/driver/rg_cpld.c | 602 -- .../driver/wb_firmware_upgrade_device.c | 178 + .../modules/driver/wb_i2c_dev_device.c | 140 + .../driver/wb_i2c_mux_pca954x_device.c | 296 + .../modules/driver/wb_i2c_ocores_device.c | 423 ++ .../modules/driver/wb_io_dev_device.c | 103 + .../modules/driver/wb_lpc_drv_device.c | 130 + .../modules/driver/wb_pcie_dev_device.c | 93 + .../plat_sysfs_cfg/WB_PLAT_CPLD.cfg | 41 + .../plat_sysfs_cfg/WB_PLAT_FAN.cfg | 304 + .../plat_sysfs_cfg/WB_PLAT_PSU.cfg | 64 + .../plat_sysfs_cfg/WB_PLAT_SFF.cfg | 521 ++ .../plat_sysfs_cfg/cfg_file_name | 4 + .../scripts/pddf_post_driver_install.sh | 31 - .../ra-b6510-48v8c/setup.py | 18 +- .../ra-b6510-48v8c/sonic_pcie/__init__.py | 1 - .../ra-b6510-48v8c/sonic_pcie/pcie_common.py | 107 - .../ra-b6510-48v8c/sonic_platform/__init__.py | 4 - .../ra-b6510-48v8c/sonic_platform/chassis.py | 134 - .../ra-b6510-48v8c/sonic_platform/common.py | 44 - .../sonic_platform/component.py | 110 - .../ra-b6510-48v8c/sonic_platform/config.py | 558 -- .../ra-b6510-48v8c/sonic_platform/eeprom.py | 12 - .../ra-b6510-48v8c/sonic_platform/fan.py | 36 - .../sonic_platform/fan_drawer.py | 17 - .../ra-b6510-48v8c/sonic_platform/hwaccess.py | 47 - .../ra-b6510-48v8c/sonic_platform/logger.py | 19 - .../ra-b6510-48v8c/sonic_platform/pcie.py | 43 - .../ra-b6510-48v8c/sonic_platform/psu.py | 104 - .../ra-b6510-48v8c/sonic_platform/regutil.py | 245 - .../ra-b6510-48v8c/sonic_platform/rotor.py | 41 - .../sonic_platform/sfp_config.py | 23 - .../ra-b6510-48v8c/sonic_platform/thermal.py | 14 - .../ra-b6510-48v8c/sonic_platform/watchdog.py | 21 - .../systemd/pddf-platform-init.service | 1 - src/sonic-device-data/tests/permitted_list | 6 + 350 files changed, 90818 insertions(+), 25991 deletions(-) mode change 100755 => 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/cpu_cpld_upgrade_header.vme create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/fpga_upgrade_header.bin create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme mode change 100755 => 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/monitor.py delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json create mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py mode change 100755 => 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py create mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py delete mode 100755 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json rename device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/{pddf_support => system_health_monitoring_config.json} (100%) mode change 100644 => 100755 delete mode 100644 device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-ragile/LICENSE create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf rename platform/broadcom/sonic-platform-modules-ragile/common/lib/{rgutil => algorithm}/__init__.py (100%) mode change 100755 => 100644 create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py rename device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_env.conf => platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/__init__.py (100%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/__init__.py rename platform/broadcom/sonic-platform-modules-ragile/common/lib/{rgutil => wbutil}/baseutil.py (51%) rename platform/broadcom/sonic-platform-modules-ragile/common/lib/{rgutil => wbutil}/smbus.py (89%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/sensors create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py create mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py rename platform/broadcom/sonic-platform-modules-ragile/{ra-b6510-48v8c => common}/sonic_platform/platform.py (50%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py rename platform/broadcom/sonic-platform-modules-ragile/{ra-b6510-48v8c => common}/sonic_platform/sfp.py (74%) create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk create mode 100644 platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg create mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py delete mode 100755 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py delete mode 100644 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py delete mode 120000 platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini index 823f53160c..b71ad39648 100755 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/port_config.ini @@ -1,57 +1,57 @@ -# name lanes alias index speed admin_status -Ethernet1 1 twentyfiveGigE0/1 0 25000 up -Ethernet2 2 twentyfiveGigE0/2 1 25000 up -Ethernet3 3 twentyfiveGigE0/3 2 25000 up -Ethernet4 4 twentyfiveGigE0/4 3 25000 up -Ethernet5 5 twentyfiveGigE0/5 4 25000 up -Ethernet6 6 twentyfiveGigE0/6 5 25000 up -Ethernet7 7 twentyfiveGigE0/7 6 25000 up -Ethernet8 8 twentyfiveGigE0/8 7 25000 up -Ethernet9 13 twentyfiveGigE0/9 8 25000 up -Ethernet10 14 twentyfiveGigE0/10 9 25000 up -Ethernet11 15 twentyfiveGigE0/11 10 25000 up -Ethernet12 16 twentyfiveGigE0/12 11 25000 up -Ethernet13 21 twentyfiveGigE0/13 12 25000 up -Ethernet14 22 twentyfiveGigE0/14 13 25000 up -Ethernet15 23 twentyfiveGigE0/15 14 25000 up -Ethernet16 24 twentyfiveGigE0/16 15 25000 up -Ethernet17 29 twentyfiveGigE0/17 16 25000 up -Ethernet18 30 twentyfiveGigE0/18 17 25000 up -Ethernet19 31 twentyfiveGigE0/19 18 25000 up -Ethernet20 32 twentyfiveGigE0/20 19 25000 up -Ethernet21 33 twentyfiveGigE0/21 20 25000 up -Ethernet22 34 twentyfiveGigE0/22 21 25000 up -Ethernet23 35 twentyfiveGigE0/23 22 25000 up -Ethernet24 36 twentyfiveGigE0/24 23 25000 up -Ethernet25 41 twentyfiveGigE0/25 24 25000 up -Ethernet26 42 twentyfiveGigE0/26 25 25000 up -Ethernet27 43 twentyfiveGigE0/27 26 25000 up -Ethernet28 44 twentyfiveGigE0/28 27 25000 up -Ethernet29 49 twentyfiveGigE0/29 28 25000 up -Ethernet30 50 twentyfiveGigE0/30 29 25000 up -Ethernet31 51 twentyfiveGigE0/31 30 25000 up -Ethernet32 52 twentyfiveGigE0/32 31 25000 up -Ethernet33 57 twentyfiveGigE0/33 32 25000 up -Ethernet34 58 twentyfiveGigE0/34 33 25000 up -Ethernet35 59 twentyfiveGigE0/35 34 25000 up -Ethernet36 60 twentyfiveGigE0/36 35 25000 up -Ethernet37 61 twentyfiveGigE0/37 36 25000 up -Ethernet38 62 twentyfiveGigE0/38 37 25000 up -Ethernet39 63 twentyfiveGigE0/39 38 25000 up -Ethernet40 64 twentyfiveGigE0/40 39 25000 up -Ethernet41 65 twentyfiveGigE0/41 40 25000 up -Ethernet42 66 twentyfiveGigE0/42 41 25000 up -Ethernet43 67 twentyfiveGigE0/43 42 25000 up -Ethernet44 68 twentyfiveGigE0/44 43 25000 up -Ethernet45 69 twentyfiveGigE0/45 44 25000 up -Ethernet46 70 twentyfiveGigE0/46 45 25000 up -Ethernet47 71 twentyfiveGigE0/47 46 25000 up -Ethernet48 72 twentyfiveGigE0/48 47 25000 up -Ethernet49 85,86,87,88 hundredGigE0/1 48 100000 up -Ethernet50 77,78,79,80 hundredGigE0/2 49 100000 up -Ethernet51 97,98,99,100 hundredGigE0/3 50 100000 up -Ethernet52 93,94,95,96 hundredGigE0/4 51 100000 up -Ethernet53 113,114,115,116 hundredGigE0/5 52 100000 up -Ethernet54 105,106,107,108 hundredGigE0/6 53 100000 up -Ethernet55 121,122,123,124 hundredGigE0/7 54 100000 up -Ethernet56 125,126,127,128 hundredGigE0/8 55 100000 up +# name lanes alias index speed admin_status +Ethernet1 57 twentyfiveGigE0/1 1 25000 up +Ethernet2 58 twentyfiveGigE0/2 2 25000 up +Ethernet3 59 twentyfiveGigE0/3 3 25000 up +Ethernet4 60 twentyfiveGigE0/4 4 25000 up +Ethernet5 61 twentyfiveGigE0/5 5 25000 up +Ethernet6 62 twentyfiveGigE0/6 6 25000 up +Ethernet7 63 twentyfiveGigE0/7 7 25000 up +Ethernet8 64 twentyfiveGigE0/8 8 25000 up +Ethernet9 1 twentyfiveGigE0/9 9 25000 up +Ethernet10 2 twentyfiveGigE0/10 10 25000 up +Ethernet11 3 twentyfiveGigE0/11 11 25000 up +Ethernet12 4 twentyfiveGigE0/12 12 25000 up +Ethernet13 5 twentyfiveGigE0/13 13 25000 up +Ethernet14 6 twentyfiveGigE0/14 14 25000 up +Ethernet15 7 twentyfiveGigE0/15 15 25000 up +Ethernet16 8 twentyfiveGigE0/16 16 25000 up +Ethernet17 13 twentyfiveGigE0/17 17 25000 up +Ethernet18 14 twentyfiveGigE0/18 18 25000 up +Ethernet19 15 twentyfiveGigE0/19 19 25000 up +Ethernet20 16 twentyfiveGigE0/20 20 25000 up +Ethernet21 21 twentyfiveGigE0/21 21 25000 up +Ethernet22 22 twentyfiveGigE0/22 22 25000 up +Ethernet23 23 twentyfiveGigE0/23 23 25000 up +Ethernet24 24 twentyfiveGigE0/24 24 25000 up +Ethernet25 29 twentyfiveGigE0/25 25 25000 up +Ethernet26 30 twentyfiveGigE0/26 26 25000 up +Ethernet27 31 twentyfiveGigE0/27 27 25000 up +Ethernet28 32 twentyfiveGigE0/28 28 25000 up +Ethernet29 33 twentyfiveGigE0/29 29 25000 up +Ethernet30 34 twentyfiveGigE0/30 30 25000 up +Ethernet31 35 twentyfiveGigE0/31 31 25000 up +Ethernet32 36 twentyfiveGigE0/32 32 25000 up +Ethernet33 41 twentyfiveGigE0/33 33 25000 up +Ethernet34 42 twentyfiveGigE0/34 34 25000 up +Ethernet35 43 twentyfiveGigE0/35 35 25000 up +Ethernet36 44 twentyfiveGigE0/36 36 25000 up +Ethernet37 49 twentyfiveGigE0/37 37 25000 up +Ethernet38 50 twentyfiveGigE0/38 38 25000 up +Ethernet39 51 twentyfiveGigE0/39 39 25000 up +Ethernet40 52 twentyfiveGigE0/40 40 25000 up +Ethernet41 65 twentyfiveGigE0/41 41 25000 up +Ethernet42 66 twentyfiveGigE0/42 42 25000 up +Ethernet43 67 twentyfiveGigE0/43 43 25000 up +Ethernet44 68 twentyfiveGigE0/44 44 25000 up +Ethernet45 69 twentyfiveGigE0/45 45 25000 up +Ethernet46 70 twentyfiveGigE0/46 46 25000 up +Ethernet47 71 twentyfiveGigE0/47 47 25000 up +Ethernet48 72 twentyfiveGigE0/48 48 25000 up +Ethernet49 85,86,87,88 hundredGigE0/1 49 100000 up +Ethernet50 77,78,79,80 hundredGigE0/2 50 100000 up +Ethernet51 97,98,99,100 hundredGigE0/3 51 100000 up +Ethernet52 93,94,95,96 hundredGigE0/4 52 100000 up +Ethernet53 113,114,115,116 hundredGigE0/5 53 100000 up +Ethernet54 105,106,107,108 hundredGigE0/6 54 100000 up +Ethernet55 121,122,123,124 hundredGigE0/7 55 100000 up +Ethernet56 125,126,127,128 hundredGigE0/8 56 100000 up diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm index 27656bd3d4..e86eb1b9fa 100644 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/RA-B6510-48V8C/td3-ra-b6510-48v8c-48x25G+8x100G.config.bcm @@ -5,6 +5,8 @@ l3_alpm_enable=2 ipv6_lpm_128b_enable=0x1 l2xmsg_mode=0 l3_max_ecmp_mode=1 +svi_my_station_optimization=1 +sai_nbr_bcast_ifp_optimized=2 bcm_num_cos=8 bcm_stat_interval=2000000 cdma_timeout_usec=3000000 @@ -22,208 +24,58 @@ oversubscribe_mode=1 parity_enable=1 pbmp_gport_stack.0=0x0000000000000000000000000000000000000000000000000000000000000000 #pbmp_xport_xe.0=0x00000000000000000000000000000000888ffffffffffff9fffffffffffffffe -pbmp_xport_xe=0x488080808808087f9fe1e1e1fe1e1e1fe -phy_chain_rx_lane_map_physical{1.0}=0x1032 -phy_chain_tx_lane_map_physical{1.0}=0x0123 -phy_chain_rx_lane_map_physical{5.0}=0x1032 -phy_chain_tx_lane_map_physical{5.0}=0x0123 -phy_chain_rx_lane_map_physical{13.0}=0x1032 -phy_chain_tx_lane_map_physical{13.0}=0x0123 -phy_chain_rx_lane_map_physical{21.0}=0x1032 -phy_chain_tx_lane_map_physical{21.0}=0x0123 -phy_chain_rx_lane_map_physical{29.0}=0x1032 -phy_chain_tx_lane_map_physical{29.0}=0x0123 -phy_chain_rx_lane_map_physical{33.0}=0x1032 -phy_chain_tx_lane_map_physical{33.0}=0x0123 -phy_chain_rx_lane_map_physical{41.0}=0x1032 -phy_chain_tx_lane_map_physical{41.0}=0x0123 -phy_chain_rx_lane_map_physical{49.0}=0x1032 -phy_chain_tx_lane_map_physical{49.0}=0x0123 -phy_chain_rx_lane_map_physical{57.0}=0x1032 -phy_chain_tx_lane_map_physical{57.0}=0x0123 -phy_chain_rx_lane_map_physical{61.0}=0x1032 -phy_chain_tx_lane_map_physical{61.0}=0x0123 -phy_chain_rx_lane_map_physical{65.0}=0x2301 -phy_chain_tx_lane_map_physical{65.0}=0x3210 -phy_chain_rx_lane_map_physical{69.0}=0x2301 -phy_chain_tx_lane_map_physical{69.0}=0x3210 -phy_chain_rx_lane_map_physical{77.0}=0x1032 -phy_chain_tx_lane_map_physical{77.0}=0x3210 -phy_chain_rx_lane_map_physical{85.0}=0x1032 -phy_chain_tx_lane_map_physical{85.0}=0x3210 -phy_chain_rx_lane_map_physical{93.0}=0x1032 -phy_chain_tx_lane_map_physical{93.0}=0x3210 -phy_chain_rx_lane_map_physical{97.0}=0x1032 -phy_chain_tx_lane_map_physical{97.0}=0x3210 -phy_chain_rx_lane_map_physical{105.0}=0x1032 -phy_chain_tx_lane_map_physical{105.0}=0x3210 -phy_chain_rx_lane_map_physical{113.0}=0x1032 -phy_chain_tx_lane_map_physical{113.0}=0x3210 -phy_chain_rx_lane_map_physical{121.0}=0x2031 -phy_chain_tx_lane_map_physical{121.0}=0x3210 -phy_chain_rx_lane_map_physical{125.0}=0x1032 -phy_chain_tx_lane_map_physical{125.0}=0x1203 -phy_chain_tx_polarity_flip_physical{1.0}=0x1 -phy_chain_rx_polarity_flip_physical{1.0}=0x0 -phy_chain_tx_polarity_flip_physical{2.0}=0x0 -phy_chain_rx_polarity_flip_physical{2.0}=0x0 -phy_chain_tx_polarity_flip_physical{3.0}=0x1 -phy_chain_rx_polarity_flip_physical{3.0}=0x0 -phy_chain_tx_polarity_flip_physical{4.0}=0x0 -phy_chain_rx_polarity_flip_physical{4.0}=0x0 -phy_chain_tx_polarity_flip_physical{5.0}=0x1 -phy_chain_rx_polarity_flip_physical{5.0}=0x0 -phy_chain_tx_polarity_flip_physical{6.0}=0x0 -phy_chain_rx_polarity_flip_physical{6.0}=0x0 -phy_chain_tx_polarity_flip_physical{7.0}=0x1 -phy_chain_rx_polarity_flip_physical{7.0}=0x0 -phy_chain_tx_polarity_flip_physical{8.0}=0x0 -phy_chain_rx_polarity_flip_physical{8.0}=0x0 -phy_chain_tx_polarity_flip_physical{13.0}=0x0 -phy_chain_rx_polarity_flip_physical{13.0}=0x0 -phy_chain_tx_polarity_flip_physical{14.0}=0x0 -phy_chain_rx_polarity_flip_physical{14.0}=0x0 -phy_chain_tx_polarity_flip_physical{15.0}=0x0 -phy_chain_rx_polarity_flip_physical{15.0}=0x0 -phy_chain_tx_polarity_flip_physical{16.0}=0x0 -phy_chain_rx_polarity_flip_physical{16.0}=0x0 -phy_chain_tx_polarity_flip_physical{21.0}=0x1 -phy_chain_rx_polarity_flip_physical{21.0}=0x0 -phy_chain_tx_polarity_flip_physical{22.0}=0x0 -phy_chain_rx_polarity_flip_physical{22.0}=0x0 -phy_chain_tx_polarity_flip_physical{23.0}=0x1 -phy_chain_rx_polarity_flip_physical{23.0}=0x0 -phy_chain_tx_polarity_flip_physical{24.0}=0x0 -phy_chain_rx_polarity_flip_physical{24.0}=0x0 -phy_chain_tx_polarity_flip_physical{29.0}=0x0 -phy_chain_rx_polarity_flip_physical{29.0}=0x1 -phy_chain_tx_polarity_flip_physical{30.0}=0x0 -phy_chain_rx_polarity_flip_physical{30.0}=0x1 -phy_chain_tx_polarity_flip_physical{31.0}=0x0 -phy_chain_rx_polarity_flip_physical{31.0}=0x1 -phy_chain_tx_polarity_flip_physical{32.0}=0x0 -phy_chain_rx_polarity_flip_physical{32.0}=0x1 -phy_chain_tx_polarity_flip_physical{33.0}=0x0 -phy_chain_rx_polarity_flip_physical{33.0}=0x0 -phy_chain_tx_polarity_flip_physical{34.0}=0x0 -phy_chain_rx_polarity_flip_physical{34.0}=0x0 -phy_chain_tx_polarity_flip_physical{35.0}=0x0 -phy_chain_rx_polarity_flip_physical{35.0}=0x0 -phy_chain_tx_polarity_flip_physical{36.0}=0x0 -phy_chain_rx_polarity_flip_physical{36.0}=0x0 -phy_chain_tx_polarity_flip_physical{41.0}=0x0 -phy_chain_rx_polarity_flip_physical{41.0}=0x0 -phy_chain_tx_polarity_flip_physical{42.0}=0x0 -phy_chain_rx_polarity_flip_physical{42.0}=0x0 -phy_chain_tx_polarity_flip_physical{43.0}=0x0 -phy_chain_rx_polarity_flip_physical{43.0}=0x0 -phy_chain_tx_polarity_flip_physical{44.0}=0x0 -phy_chain_rx_polarity_flip_physical{44.0}=0x0 -phy_chain_tx_polarity_flip_physical{49.0}=0x0 -phy_chain_rx_polarity_flip_physical{49.0}=0x0 -phy_chain_tx_polarity_flip_physical{50.0}=0x0 -phy_chain_rx_polarity_flip_physical{50.0}=0x0 -phy_chain_tx_polarity_flip_physical{51.0}=0x0 -phy_chain_rx_polarity_flip_physical{51.0}=0x0 -phy_chain_tx_polarity_flip_physical{52.0}=0x0 -phy_chain_rx_polarity_flip_physical{52.0}=0x0 -phy_chain_tx_polarity_flip_physical{57.0}=0x0 -phy_chain_rx_polarity_flip_physical{57.0}=0x0 -phy_chain_tx_polarity_flip_physical{58.0}=0x0 -phy_chain_rx_polarity_flip_physical{58.0}=0x0 -phy_chain_tx_polarity_flip_physical{59.0}=0x0 -phy_chain_rx_polarity_flip_physical{59.0}=0x0 -phy_chain_tx_polarity_flip_physical{60.0}=0x0 -phy_chain_rx_polarity_flip_physical{60.0}=0x0 -phy_chain_tx_polarity_flip_physical{61.0}=0x0 -phy_chain_rx_polarity_flip_physical{61.0}=0x1 -phy_chain_tx_polarity_flip_physical{62.0}=0x0 -phy_chain_rx_polarity_flip_physical{62.0}=0x1 -phy_chain_tx_polarity_flip_physical{63.0}=0x0 -phy_chain_rx_polarity_flip_physical{63.0}=0x1 -phy_chain_tx_polarity_flip_physical{64.0}=0x0 -phy_chain_rx_polarity_flip_physical{64.0}=0x1 -phy_chain_tx_polarity_flip_physical{65.0}=0x0 -phy_chain_rx_polarity_flip_physical{65.0}=0x1 -phy_chain_tx_polarity_flip_physical{66.0}=0x0 -phy_chain_rx_polarity_flip_physical{66.0}=0x1 -phy_chain_tx_polarity_flip_physical{67.0}=0x0 -phy_chain_rx_polarity_flip_physical{67.0}=0x1 -phy_chain_tx_polarity_flip_physical{68.0}=0x0 -phy_chain_rx_polarity_flip_physical{68.0}=0x1 -phy_chain_tx_polarity_flip_physical{69.0}=0x0 -phy_chain_rx_polarity_flip_physical{69.0}=0x0 -phy_chain_tx_polarity_flip_physical{70.0}=0x0 -phy_chain_rx_polarity_flip_physical{70.0}=0x0 -phy_chain_tx_polarity_flip_physical{71.0}=0x0 -phy_chain_rx_polarity_flip_physical{71.0}=0x0 -phy_chain_tx_polarity_flip_physical{72.0}=0x0 -phy_chain_rx_polarity_flip_physical{72.0}=0x0 -phy_chain_tx_polarity_flip_physical{85.0}=0x1 -phy_chain_rx_polarity_flip_physical{85.0}=0x1 -phy_chain_tx_polarity_flip_physical{86.0}=0x0 -phy_chain_rx_polarity_flip_physical{86.0}=0x1 -phy_chain_tx_polarity_flip_physical{87.0}=0x1 -phy_chain_rx_polarity_flip_physical{87.0}=0x1 -phy_chain_tx_polarity_flip_physical{88.0}=0x0 -phy_chain_rx_polarity_flip_physical{88.0}=0x1 -phy_chain_tx_polarity_flip_physical{77.0}=0x1 -phy_chain_rx_polarity_flip_physical{77.0}=0x1 -phy_chain_tx_polarity_flip_physical{78.0}=0x1 -phy_chain_rx_polarity_flip_physical{78.0}=0x0 -phy_chain_tx_polarity_flip_physical{79.0}=0x1 -phy_chain_rx_polarity_flip_physical{79.0}=0x1 -phy_chain_tx_polarity_flip_physical{80.0}=0x1 -phy_chain_rx_polarity_flip_physical{80.0}=0x1 -phy_chain_tx_polarity_flip_physical{97.0}=0x1 -phy_chain_rx_polarity_flip_physical{97.0}=0x0 -phy_chain_tx_polarity_flip_physical{98.0}=0x0 -phy_chain_rx_polarity_flip_physical{98.0}=0x0 -phy_chain_tx_polarity_flip_physical{99.0}=0x1 -phy_chain_rx_polarity_flip_physical{99.0}=0x0 -phy_chain_tx_polarity_flip_physical{100.0}=0x0 -phy_chain_rx_polarity_flip_physical{100.0}=0x0 -phy_chain_tx_polarity_flip_physical{93.0}=0x1 -phy_chain_rx_polarity_flip_physical{93.0}=0x1 -phy_chain_tx_polarity_flip_physical{94.0}=0x1 -phy_chain_rx_polarity_flip_physical{94.0}=0x0 -phy_chain_tx_polarity_flip_physical{95.0}=0x1 -phy_chain_rx_polarity_flip_physical{95.0}=0x1 -phy_chain_tx_polarity_flip_physical{96.0}=0x1 -phy_chain_rx_polarity_flip_physical{96.0}=0x1 -phy_chain_tx_polarity_flip_physical{113.0}=0x1 -phy_chain_rx_polarity_flip_physical{113.0}=0x1 -phy_chain_tx_polarity_flip_physical{114.0}=0x0 -phy_chain_rx_polarity_flip_physical{114.0}=0x1 -phy_chain_tx_polarity_flip_physical{115.0}=0x1 -phy_chain_rx_polarity_flip_physical{115.0}=0x1 -phy_chain_tx_polarity_flip_physical{116.0}=0x0 -phy_chain_rx_polarity_flip_physical{116.0}=0x1 -phy_chain_tx_polarity_flip_physical{105.0}=0x1 -phy_chain_rx_polarity_flip_physical{105.0}=0x1 -phy_chain_tx_polarity_flip_physical{106.0}=0x1 -phy_chain_rx_polarity_flip_physical{106.0}=0x0 -phy_chain_tx_polarity_flip_physical{107.0}=0x1 -phy_chain_rx_polarity_flip_physical{107.0}=0x1 -phy_chain_tx_polarity_flip_physical{108.0}=0x1 -phy_chain_rx_polarity_flip_physical{108.0}=0x1 -phy_chain_tx_polarity_flip_physical{121.0}=0x1 -phy_chain_rx_polarity_flip_physical{121.0}=0x1 -phy_chain_tx_polarity_flip_physical{122.0}=0x0 -phy_chain_rx_polarity_flip_physical{122.0}=0x0 -phy_chain_tx_polarity_flip_physical{123.0}=0x1 -phy_chain_rx_polarity_flip_physical{123.0}=0x0 -phy_chain_tx_polarity_flip_physical{124.0}=0x0 -phy_chain_rx_polarity_flip_physical{124.0}=0x1 -phy_chain_tx_polarity_flip_physical{125.0}=0x0 -phy_chain_rx_polarity_flip_physical{125.0}=0x0 -phy_chain_tx_polarity_flip_physical{126.0}=0x1 -phy_chain_rx_polarity_flip_physical{126.0}=0x1 -phy_chain_tx_polarity_flip_physical{127.0}=0x0 -phy_chain_rx_polarity_flip_physical{127.0}=0x0 -phy_chain_tx_polarity_flip_physical{128.0}=0x0 -phy_chain_rx_polarity_flip_physical{128.0}=0x0 +pbmp_xport_xe=0xffffffffffffffffffffffffffffffffffffffffe port_flex_enable=1 +phy_chain_tx_lane_map_physical{57.0}=0x0123 +phy_chain_tx_lane_map_physical{61.0}=0x0123 +phy_chain_tx_lane_map_physical{1.0}=0x0123 +phy_chain_tx_lane_map_physical{5.0}=0x0123 +phy_chain_tx_lane_map_physical{13.0}=0x0123 +phy_chain_tx_lane_map_physical{21.0}=0x0123 +phy_chain_tx_lane_map_physical{29.0}=0x0123 +phy_chain_tx_lane_map_physical{33.0}=0x0123 +phy_chain_tx_lane_map_physical{41.0}=0x0123 +phy_chain_tx_lane_map_physical{49.0}=0x0123 +phy_chain_tx_lane_map_physical{65.0}=0x3210 +phy_chain_tx_lane_map_physical{69.0}=0x3210 +phy_chain_tx_lane_map_physical{85.0}=0x3210 +phy_chain_tx_lane_map_physical{77.0}=0x0213 +phy_chain_tx_lane_map_physical{97.0}=0x3210 +phy_chain_tx_lane_map_physical{93.0}=0x0213 +phy_chain_tx_lane_map_physical{113.0}=0x3210 +phy_chain_tx_lane_map_physical{105.0}=0x0213 +phy_chain_tx_lane_map_physical{121.0}=0x3120 +phy_chain_tx_lane_map_physical{125.0}=0x1203 + +phy_chain_rx_lane_map_physical{57.0}=0x1032 +phy_chain_rx_lane_map_physical{61.0}=0x1032 +phy_chain_rx_lane_map_physical{1.0}=0x1032 +phy_chain_rx_lane_map_physical{5.0}=0x1032 +phy_chain_rx_lane_map_physical{13.0}=0x1032 +phy_chain_rx_lane_map_physical{21.0}=0x1032 +phy_chain_rx_lane_map_physical{29.0}=0x1032 +phy_chain_rx_lane_map_physical{33.0}=0x1032 +phy_chain_rx_lane_map_physical{41.0}=0x1032 +phy_chain_rx_lane_map_physical{49.0}=0x1032 +phy_chain_rx_lane_map_physical{65.0}=0x2301 +phy_chain_rx_lane_map_physical{69.0}=0x2301 +phy_chain_rx_lane_map_physical{85.0}=0x1032 +phy_chain_rx_lane_map_physical{77.0}=0x1032 +phy_chain_rx_lane_map_physical{97.0}=0x1032 +phy_chain_rx_lane_map_physical{93.0}=0x1032 +phy_chain_rx_lane_map_physical{113.0}=0x1032 +phy_chain_rx_lane_map_physical{105.0}=0x1032 +phy_chain_rx_lane_map_physical{121.0}=0x2031 +phy_chain_rx_lane_map_physical{125.0}=0x1023 + +portmap_57=57:25 +portmap_58=58:25 +portmap_59=59:25 +portmap_60=60:25 +portmap_61=61:25 +portmap_62=62:25 +portmap_63=63:25 +portmap_64=64:25 portmap_1=1:25 portmap_2=2:25 portmap_3=3:25 @@ -256,14 +108,6 @@ portmap_49=49:25 portmap_50=50:25 portmap_51=51:25 portmap_52=52:25 -portmap_57=57:25 -portmap_58=58:25 -portmap_59=59:25 -portmap_60=60:25 -portmap_61=61:25 -portmap_62=62:25 -portmap_63=63:25 -portmap_64=64:25 portmap_67=65:25 portmap_68=66:25 portmap_69=67:25 @@ -272,55 +116,55 @@ portmap_71=69:25 portmap_72=70:25 portmap_73=71:25 portmap_74=72:25 -portmap_79=77:100 portmap_87=85:100 -portmap_95=93:100 +portmap_79=77:100 portmap_99=97:100 -portmap_107=105:100 +portmap_95=93:100 portmap_115=113:100 +portmap_107=105:100 portmap_123=121:100 portmap_127=125:100 -dport_map_port_1=1 -dport_map_port_2=2 -dport_map_port_3=3 -dport_map_port_4=4 -dport_map_port_5=5 -dport_map_port_6=6 -dport_map_port_7=7 -dport_map_port_8=8 -dport_map_port_13=9 -dport_map_port_14=10 -dport_map_port_15=11 -dport_map_port_16=12 -dport_map_port_21=13 -dport_map_port_22=14 -dport_map_port_23=15 -dport_map_port_24=16 -dport_map_port_29=17 -dport_map_port_30=18 -dport_map_port_31=19 -dport_map_port_32=20 -dport_map_port_33=21 -dport_map_port_34=22 -dport_map_port_35=23 -dport_map_port_36=24 -dport_map_port_41=25 -dport_map_port_42=26 -dport_map_port_43=27 -dport_map_port_44=28 -dport_map_port_49=29 -dport_map_port_50=30 -dport_map_port_51=31 -dport_map_port_52=32 -dport_map_port_57=33 -dport_map_port_58=34 -dport_map_port_59=35 -dport_map_port_60=36 -dport_map_port_61=37 -dport_map_port_62=38 -dport_map_port_63=39 -dport_map_port_64=40 +dport_map_port_57=1 +dport_map_port_58=2 +dport_map_port_59=3 +dport_map_port_60=4 +dport_map_port_61=5 +dport_map_port_62=6 +dport_map_port_63=7 +dport_map_port_64=8 +dport_map_port_1=9 +dport_map_port_2=10 +dport_map_port_3=11 +dport_map_port_4=12 +dport_map_port_5=13 +dport_map_port_6=14 +dport_map_port_7=15 +dport_map_port_8=16 +dport_map_port_13=17 +dport_map_port_14=18 +dport_map_port_15=19 +dport_map_port_16=20 +dport_map_port_21=21 +dport_map_port_22=22 +dport_map_port_23=23 +dport_map_port_24=24 +dport_map_port_29=25 +dport_map_port_30=26 +dport_map_port_31=27 +dport_map_port_32=28 +dport_map_port_33=29 +dport_map_port_34=30 +dport_map_port_35=31 +dport_map_port_36=32 +dport_map_port_41=33 +dport_map_port_42=34 +dport_map_port_43=35 +dport_map_port_44=36 +dport_map_port_49=37 +dport_map_port_50=38 +dport_map_port_51=39 +dport_map_port_52=40 dport_map_port_67=41 dport_map_port_68=42 dport_map_port_69=43 @@ -338,65 +182,421 @@ dport_map_port_107=54 dport_map_port_123=55 dport_map_port_127=56 -serdes_if_type_1=13 -serdes_if_type_2=13 -serdes_if_type_3=13 -serdes_if_type_4=13 -serdes_if_type_5=13 -serdes_if_type_6=13 -serdes_if_type_7=13 -serdes_if_type_8=13 -serdes_if_type_13=13 -serdes_if_type_14=13 -serdes_if_type_15=13 -serdes_if_type_16=13 -serdes_if_type_21=13 -serdes_if_type_22=13 -serdes_if_type_23=13 -serdes_if_type_24=13 -serdes_if_type_29=13 -serdes_if_type_30=13 -serdes_if_type_31=13 -serdes_if_type_32=13 -serdes_if_type_33=13 -serdes_if_type_34=13 -serdes_if_type_35=13 -serdes_if_type_36=13 -serdes_if_type_41=13 -serdes_if_type_42=13 -serdes_if_type_43=13 -serdes_if_type_44=13 -serdes_if_type_49=13 -serdes_if_type_50=13 -serdes_if_type_51=13 -serdes_if_type_52=13 -serdes_if_type_57=13 -serdes_if_type_58=13 -serdes_if_type_59=13 -serdes_if_type_60=13 -serdes_if_type_61=13 -serdes_if_type_62=13 -serdes_if_type_63=13 -serdes_if_type_64=13 -serdes_if_type_67=13 -serdes_if_type_68=13 -serdes_if_type_69=13 -serdes_if_type_70=13 -serdes_if_type_71=13 -serdes_if_type_72=13 -serdes_if_type_73=13 -serdes_if_type_74=13 -serdes_if_type_87=14 -serdes_if_type_79=14 -serdes_if_type_99=14 -serdes_if_type_95=14 -serdes_if_type_115=14 -serdes_if_type_107=14 -serdes_if_type_123=14 -serdes_if_type_127=14 +phy_chain_tx_polarity_flip_physical{57.0}=0x1 +phy_chain_tx_polarity_flip_physical{58.0}=0x0 +phy_chain_tx_polarity_flip_physical{59.0}=0x1 +phy_chain_tx_polarity_flip_physical{60.0}=0x0 +phy_chain_tx_polarity_flip_physical{61.0}=0x1 +phy_chain_tx_polarity_flip_physical{62.0}=0x0 +phy_chain_tx_polarity_flip_physical{63.0}=0x1 +phy_chain_tx_polarity_flip_physical{64.0}=0x0 +phy_chain_tx_polarity_flip_physical{1.0}=0x0 +phy_chain_tx_polarity_flip_physical{2.0}=0x0 +phy_chain_tx_polarity_flip_physical{3.0}=0x0 +phy_chain_tx_polarity_flip_physical{4.0}=0x0 +phy_chain_tx_polarity_flip_physical{5.0}=0x0 +phy_chain_tx_polarity_flip_physical{6.0}=0x0 +phy_chain_tx_polarity_flip_physical{7.0}=0x0 +phy_chain_tx_polarity_flip_physical{8.0}=0x0 +phy_chain_tx_polarity_flip_physical{13.0}=0x0 +phy_chain_tx_polarity_flip_physical{14.0}=0x0 +phy_chain_tx_polarity_flip_physical{15.0}=0x0 +phy_chain_tx_polarity_flip_physical{16.0}=0x0 +phy_chain_tx_polarity_flip_physical{21.0}=0x0 +phy_chain_tx_polarity_flip_physical{22.0}=0x0 +phy_chain_tx_polarity_flip_physical{23.0}=0x0 +phy_chain_tx_polarity_flip_physical{24.0}=0x0 +phy_chain_tx_polarity_flip_physical{29.0}=0x0 +phy_chain_tx_polarity_flip_physical{30.0}=0x0 +phy_chain_tx_polarity_flip_physical{31.0}=0x0 +phy_chain_tx_polarity_flip_physical{32.0}=0x0 +phy_chain_tx_polarity_flip_physical{33.0}=0x0 +phy_chain_tx_polarity_flip_physical{34.0}=0x0 +phy_chain_tx_polarity_flip_physical{35.0}=0x0 +phy_chain_tx_polarity_flip_physical{36.0}=0x0 +phy_chain_tx_polarity_flip_physical{41.0}=0x0 +phy_chain_tx_polarity_flip_physical{42.0}=0x0 +phy_chain_tx_polarity_flip_physical{43.0}=0x0 +phy_chain_tx_polarity_flip_physical{44.0}=0x0 +phy_chain_tx_polarity_flip_physical{49.0}=0x0 +phy_chain_tx_polarity_flip_physical{50.0}=0x0 +phy_chain_tx_polarity_flip_physical{51.0}=0x0 +phy_chain_tx_polarity_flip_physical{52.0}=0x0 +phy_chain_tx_polarity_flip_physical{65.0}=0x0 +phy_chain_tx_polarity_flip_physical{66.0}=0x0 +phy_chain_tx_polarity_flip_physical{67.0}=0x0 +phy_chain_tx_polarity_flip_physical{68.0}=0x0 +phy_chain_tx_polarity_flip_physical{69.0}=0x0 +phy_chain_tx_polarity_flip_physical{70.0}=0x0 +phy_chain_tx_polarity_flip_physical{71.0}=0x0 +phy_chain_tx_polarity_flip_physical{72.0}=0x0 +phy_chain_tx_polarity_flip_physical{85.0}=0x0 +phy_chain_tx_polarity_flip_physical{86.0}=0x0 +phy_chain_tx_polarity_flip_physical{87.0}=0x1 +phy_chain_tx_polarity_flip_physical{88.0}=0x0 +phy_chain_tx_polarity_flip_physical{77.0}=0x1 +phy_chain_tx_polarity_flip_physical{78.0}=0x0 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{80.0}=0x0 +phy_chain_tx_polarity_flip_physical{97.0}=0x0 +phy_chain_tx_polarity_flip_physical{98.0}=0x0 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x0 +phy_chain_tx_polarity_flip_physical{93.0}=0x0 +phy_chain_tx_polarity_flip_physical{94.0}=0x1 +phy_chain_tx_polarity_flip_physical{95.0}=0x1 +phy_chain_tx_polarity_flip_physical{96.0}=0x0 +phy_chain_tx_polarity_flip_physical{113.0}=0x0 +phy_chain_tx_polarity_flip_physical{114.0}=0x0 +phy_chain_tx_polarity_flip_physical{115.0}=0x1 +phy_chain_tx_polarity_flip_physical{116.0}=0x0 +phy_chain_tx_polarity_flip_physical{105.0}=0x0 +phy_chain_tx_polarity_flip_physical{106.0}=0x1 +phy_chain_tx_polarity_flip_physical{107.0}=0x1 +phy_chain_tx_polarity_flip_physical{108.0}=0x0 +phy_chain_tx_polarity_flip_physical{121.0}=0x1 +phy_chain_tx_polarity_flip_physical{122.0}=0x0 +phy_chain_tx_polarity_flip_physical{123.0}=0x1 +phy_chain_tx_polarity_flip_physical{124.0}=0x0 +phy_chain_tx_polarity_flip_physical{125.0}=0x1 +phy_chain_tx_polarity_flip_physical{126.0}=0x0 +phy_chain_tx_polarity_flip_physical{127.0}=0x1 +phy_chain_tx_polarity_flip_physical{128.0}=0x1 + +phy_chain_rx_polarity_flip_physical{57.0}=0x0 +phy_chain_rx_polarity_flip_physical{58.0}=0x0 +phy_chain_rx_polarity_flip_physical{59.0}=0x0 +phy_chain_rx_polarity_flip_physical{60.0}=0x0 +phy_chain_rx_polarity_flip_physical{61.0}=0x1 +phy_chain_rx_polarity_flip_physical{62.0}=0x1 +phy_chain_rx_polarity_flip_physical{63.0}=0x1 +phy_chain_rx_polarity_flip_physical{64.0}=0x1 +phy_chain_rx_polarity_flip_physical{1.0}=0x1 +phy_chain_rx_polarity_flip_physical{2.0}=0x1 +phy_chain_rx_polarity_flip_physical{3.0}=0x1 +phy_chain_rx_polarity_flip_physical{4.0}=0x1 +phy_chain_rx_polarity_flip_physical{5.0}=0x0 +phy_chain_rx_polarity_flip_physical{6.0}=0x0 +phy_chain_rx_polarity_flip_physical{7.0}=0x0 +phy_chain_rx_polarity_flip_physical{8.0}=0x0 +phy_chain_rx_polarity_flip_physical{13.0}=0x0 +phy_chain_rx_polarity_flip_physical{14.0}=0x0 +phy_chain_rx_polarity_flip_physical{15.0}=0x0 +phy_chain_rx_polarity_flip_physical{16.0}=0x0 +phy_chain_rx_polarity_flip_physical{21.0}=0x0 +phy_chain_rx_polarity_flip_physical{22.0}=0x0 +phy_chain_rx_polarity_flip_physical{23.0}=0x0 +phy_chain_rx_polarity_flip_physical{24.0}=0x0 +phy_chain_rx_polarity_flip_physical{29.0}=0x0 +phy_chain_rx_polarity_flip_physical{30.0}=0x1 +phy_chain_rx_polarity_flip_physical{31.0}=0x0 +phy_chain_rx_polarity_flip_physical{32.0}=0x0 +phy_chain_rx_polarity_flip_physical{33.0}=0x1 +phy_chain_rx_polarity_flip_physical{34.0}=0x1 +phy_chain_rx_polarity_flip_physical{35.0}=0x1 +phy_chain_rx_polarity_flip_physical{36.0}=0x1 +phy_chain_rx_polarity_flip_physical{41.0}=0x1 +phy_chain_rx_polarity_flip_physical{42.0}=0x1 +phy_chain_rx_polarity_flip_physical{43.0}=0x1 +phy_chain_rx_polarity_flip_physical{44.0}=0x1 +phy_chain_rx_polarity_flip_physical{49.0}=0x1 +phy_chain_rx_polarity_flip_physical{50.0}=0x1 +phy_chain_rx_polarity_flip_physical{51.0}=0x1 +phy_chain_rx_polarity_flip_physical{52.0}=0x1 +phy_chain_rx_polarity_flip_physical{65.0}=0x1 +phy_chain_rx_polarity_flip_physical{66.0}=0x1 +phy_chain_rx_polarity_flip_physical{67.0}=0x1 +phy_chain_rx_polarity_flip_physical{68.0}=0x1 +phy_chain_rx_polarity_flip_physical{69.0}=0x0 +phy_chain_rx_polarity_flip_physical{70.0}=0x0 +phy_chain_rx_polarity_flip_physical{71.0}=0x0 +phy_chain_rx_polarity_flip_physical{72.0}=0x0 +phy_chain_rx_polarity_flip_physical{85.0}=0x1 +phy_chain_rx_polarity_flip_physical{86.0}=0x1 +phy_chain_rx_polarity_flip_physical{87.0}=0x1 +phy_chain_rx_polarity_flip_physical{88.0}=0x1 +phy_chain_rx_polarity_flip_physical{77.0}=0x0 +phy_chain_rx_polarity_flip_physical{78.0}=0x0 +phy_chain_rx_polarity_flip_physical{79.0}=0x0 +phy_chain_rx_polarity_flip_physical{80.0}=0x0 +phy_chain_rx_polarity_flip_physical{97.0}=0x0 +phy_chain_rx_polarity_flip_physical{98.0}=0x0 +phy_chain_rx_polarity_flip_physical{99.0}=0x0 +phy_chain_rx_polarity_flip_physical{100.0}=0x0 +phy_chain_rx_polarity_flip_physical{93.0}=0x0 +phy_chain_rx_polarity_flip_physical{94.0}=0x0 +phy_chain_rx_polarity_flip_physical{95.0}=0x0 +phy_chain_rx_polarity_flip_physical{96.0}=0x0 +phy_chain_rx_polarity_flip_physical{113.0}=0x1 +phy_chain_rx_polarity_flip_physical{114.0}=0x1 +phy_chain_rx_polarity_flip_physical{115.0}=0x1 +phy_chain_rx_polarity_flip_physical{116.0}=0x1 +phy_chain_rx_polarity_flip_physical{105.0}=0x0 +phy_chain_rx_polarity_flip_physical{106.0}=0x0 +phy_chain_rx_polarity_flip_physical{107.0}=0x0 +phy_chain_rx_polarity_flip_physical{108.0}=0x0 +phy_chain_rx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x1 +phy_chain_rx_polarity_flip_physical{123.0}=0x0 +phy_chain_rx_polarity_flip_physical{124.0}=0x1 +phy_chain_rx_polarity_flip_physical{125.0}=0x1 +phy_chain_rx_polarity_flip_physical{126.0}=0x0 +phy_chain_rx_polarity_flip_physical{127.0}=0x0 +phy_chain_rx_polarity_flip_physical{128.0}=0x0 + +serdes_preemphasis_lane0_57=0x0f480d +serdes_preemphasis_lane1_57=0x0f480d +serdes_preemphasis_lane2_57=0x0f480d +serdes_preemphasis_lane3_57=0x0f480d +serdes_preemphasis_lane0_58=0x0f480d +serdes_preemphasis_lane1_58=0x0f480d +serdes_preemphasis_lane2_58=0x0f480d +serdes_preemphasis_lane3_58=0x0f480d +serdes_preemphasis_lane0_59=0x0f480d +serdes_preemphasis_lane1_59=0x0f480d +serdes_preemphasis_lane2_59=0x0f480d +serdes_preemphasis_lane3_59=0x0f480d +serdes_preemphasis_lane0_60=0x0f480d +serdes_preemphasis_lane1_60=0x0f480d +serdes_preemphasis_lane2_60=0x0f480d +serdes_preemphasis_lane3_60=0x0f480d +serdes_preemphasis_lane0_61=0x0f480d +serdes_preemphasis_lane1_61=0x0f480d +serdes_preemphasis_lane2_61=0x0f480d +serdes_preemphasis_lane3_61=0x0f480d +serdes_preemphasis_lane0_62=0x0f480d +serdes_preemphasis_lane1_62=0x0f480d +serdes_preemphasis_lane2_62=0x0f480d +serdes_preemphasis_lane3_62=0x0f480d +serdes_preemphasis_lane0_63=0x0f480d +serdes_preemphasis_lane1_63=0x0f480d +serdes_preemphasis_lane2_63=0x0f480d +serdes_preemphasis_lane3_63=0x0f480d +serdes_preemphasis_lane0_64=0x0f480d +serdes_preemphasis_lane1_64=0x0f480d +serdes_preemphasis_lane2_64=0x0f480d +serdes_preemphasis_lane3_64=0x0f480d +serdes_preemphasis_lane0_1=0x0f480d +serdes_preemphasis_lane1_1=0x0f480d +serdes_preemphasis_lane2_1=0x0f480d +serdes_preemphasis_lane3_1=0x0f480d +serdes_preemphasis_lane0_2=0x0d4b0c +serdes_preemphasis_lane1_2=0x0d4b0c +serdes_preemphasis_lane2_2=0x0d4b0c +serdes_preemphasis_lane3_2=0x0d4b0c +serdes_preemphasis_lane0_3=0x0f480d +serdes_preemphasis_lane1_3=0x0f480d +serdes_preemphasis_lane2_3=0x0f480d +serdes_preemphasis_lane3_3=0x0f480d +serdes_preemphasis_lane0_4=0x0d4b0c +serdes_preemphasis_lane1_4=0x0d4b0c +serdes_preemphasis_lane2_4=0x0d4b0c +serdes_preemphasis_lane3_4=0x0d4b0c +serdes_preemphasis_lane0_5=0x0f480d +serdes_preemphasis_lane1_5=0x0f480d +serdes_preemphasis_lane2_5=0x0f480d +serdes_preemphasis_lane3_5=0x0f480d +serdes_preemphasis_lane0_6=0x0d4b0c +serdes_preemphasis_lane1_6=0x0d4b0c +serdes_preemphasis_lane2_6=0x0d4b0c +serdes_preemphasis_lane3_6=0x0d4b0c +serdes_preemphasis_lane0_7=0x0f480d +serdes_preemphasis_lane1_7=0x0f480d +serdes_preemphasis_lane2_7=0x0f480d +serdes_preemphasis_lane3_7=0x0f480d +serdes_preemphasis_lane0_8=0x0d4b0c +serdes_preemphasis_lane1_8=0x0d4b0c +serdes_preemphasis_lane2_8=0x0d4b0c +serdes_preemphasis_lane3_8=0x0d4b0c +serdes_preemphasis_lane0_13=0x0f480d +serdes_preemphasis_lane1_13=0x0f480d +serdes_preemphasis_lane2_13=0x0f480d +serdes_preemphasis_lane3_13=0x0f480d +serdes_preemphasis_lane0_14=0x0d4b0c +serdes_preemphasis_lane1_14=0x0d4b0c +serdes_preemphasis_lane2_14=0x0d4b0c +serdes_preemphasis_lane3_14=0x0d4b0c +serdes_preemphasis_lane0_15=0x0f480d +serdes_preemphasis_lane1_15=0x0f480d +serdes_preemphasis_lane2_15=0x0f480d +serdes_preemphasis_lane3_15=0x0f480d +serdes_preemphasis_lane0_16=0x0d4b0c +serdes_preemphasis_lane1_16=0x0d4b0c +serdes_preemphasis_lane2_16=0x0d4b0c +serdes_preemphasis_lane3_16=0x0d4b0c +serdes_preemphasis_lane0_21=0x0d4b0c +serdes_preemphasis_lane1_21=0x0d4b0c +serdes_preemphasis_lane2_21=0x0d4b0c +serdes_preemphasis_lane3_21=0x0d4b0c +serdes_preemphasis_lane0_22=0x0d4b0c +serdes_preemphasis_lane1_22=0x0d4b0c +serdes_preemphasis_lane2_22=0x0d4b0c +serdes_preemphasis_lane3_22=0x0d4b0c +serdes_preemphasis_lane0_23=0x0d4b0c +serdes_preemphasis_lane1_23=0x0d4b0c +serdes_preemphasis_lane2_23=0x0d4b0c +serdes_preemphasis_lane3_23=0x0d4b0c +serdes_preemphasis_lane0_24=0x0d4b0c +serdes_preemphasis_lane1_24=0x0d4b0c +serdes_preemphasis_lane2_24=0x0d4b0c +serdes_preemphasis_lane3_24=0x0d4b0c +serdes_preemphasis_lane0_29=0x0d4b0c +serdes_preemphasis_lane1_29=0x0d4b0c +serdes_preemphasis_lane2_29=0x0d4b0c +serdes_preemphasis_lane3_29=0x0d4b0c +serdes_preemphasis_lane0_30=0x0d4b0c +serdes_preemphasis_lane1_30=0x0d4b0c +serdes_preemphasis_lane2_30=0x0d4b0c +serdes_preemphasis_lane3_30=0x0d4b0c +serdes_preemphasis_lane0_31=0x0d4b0c +serdes_preemphasis_lane1_31=0x0d4b0c +serdes_preemphasis_lane2_31=0x0d4b0c +serdes_preemphasis_lane3_31=0x0d4b0c +serdes_preemphasis_lane0_32=0x0d4b0c +serdes_preemphasis_lane1_32=0x0d4b0c +serdes_preemphasis_lane2_32=0x0d4b0c +serdes_preemphasis_lane3_32=0x0d4b0c +serdes_preemphasis_lane0_33=0x0d4b0c +serdes_preemphasis_lane1_33=0x0d4b0c +serdes_preemphasis_lane2_33=0x0d4b0c +serdes_preemphasis_lane3_33=0x0d4b0c +serdes_preemphasis_lane0_34=0x0d4b0c +serdes_preemphasis_lane1_34=0x0d4b0c +serdes_preemphasis_lane2_34=0x0d4b0c +serdes_preemphasis_lane3_34=0x0d4b0c +serdes_preemphasis_lane0_35=0x0d4b0c +serdes_preemphasis_lane1_35=0x0d4b0c +serdes_preemphasis_lane2_35=0x0d4b0c +serdes_preemphasis_lane3_35=0x0d4b0c +serdes_preemphasis_lane0_36=0x0d4b0c +serdes_preemphasis_lane1_36=0x0d4b0c +serdes_preemphasis_lane2_36=0x0d4b0c +serdes_preemphasis_lane3_36=0x0d4b0c +serdes_preemphasis_lane0_41=0x0d4b0c +serdes_preemphasis_lane1_41=0x0d4b0c +serdes_preemphasis_lane2_41=0x0d4b0c +serdes_preemphasis_lane3_41=0x0d4b0c +serdes_preemphasis_lane0_42=0x0d4b0c +serdes_preemphasis_lane1_42=0x0d4b0c +serdes_preemphasis_lane2_42=0x0d4b0c +serdes_preemphasis_lane3_42=0x0d4b0c +serdes_preemphasis_lane0_43=0x0d4b0c +serdes_preemphasis_lane1_43=0x0d4b0c +serdes_preemphasis_lane2_43=0x0d4b0c +serdes_preemphasis_lane3_43=0x0d4b0c +serdes_preemphasis_lane0_44=0x0d4b0c +serdes_preemphasis_lane1_44=0x0d4b0c +serdes_preemphasis_lane2_44=0x0d4b0c +serdes_preemphasis_lane3_44=0x0d4b0c +serdes_preemphasis_lane0_49=0x0f480d +serdes_preemphasis_lane1_49=0x0f480d +serdes_preemphasis_lane2_49=0x0f480d +serdes_preemphasis_lane3_49=0x0f480d +serdes_preemphasis_lane0_50=0x0d4b0c +serdes_preemphasis_lane1_50=0x0d4b0c +serdes_preemphasis_lane2_50=0x0d4b0c +serdes_preemphasis_lane3_50=0x0d4b0c +serdes_preemphasis_lane0_51=0x0f480d +serdes_preemphasis_lane1_51=0x0f480d +serdes_preemphasis_lane2_51=0x0f480d +serdes_preemphasis_lane3_51=0x0f480d +serdes_preemphasis_lane0_52=0x0d4b0c +serdes_preemphasis_lane1_52=0x0d4b0c +serdes_preemphasis_lane2_52=0x0d4b0c +serdes_preemphasis_lane3_52=0x0d4b0c +serdes_preemphasis_lane0_67=0x0d4b0c +serdes_preemphasis_lane1_67=0x0d4b0c +serdes_preemphasis_lane2_67=0x0d4b0c +serdes_preemphasis_lane3_67=0x0d4b0c +serdes_preemphasis_lane0_68=0x0d4b0c +serdes_preemphasis_lane1_68=0x0d4b0c +serdes_preemphasis_lane2_68=0x0d4b0c +serdes_preemphasis_lane3_68=0x0d4b0c +serdes_preemphasis_lane0_69=0x0d4b0c +serdes_preemphasis_lane1_69=0x0d4b0c +serdes_preemphasis_lane2_69=0x0d4b0c +serdes_preemphasis_lane3_69=0x0d4b0c +serdes_preemphasis_lane0_70=0x0d4b0c +serdes_preemphasis_lane1_70=0x0d4b0c +serdes_preemphasis_lane2_70=0x0d4b0c +serdes_preemphasis_lane3_70=0x0d4b0c +serdes_preemphasis_lane0_71=0x0d4b0c +serdes_preemphasis_lane1_71=0x0d4b0c +serdes_preemphasis_lane2_71=0x0d4b0c +serdes_preemphasis_lane3_71=0x0d4b0c +serdes_preemphasis_lane0_72=0x0d4b0c +serdes_preemphasis_lane1_72=0x0d4b0c +serdes_preemphasis_lane2_72=0x0d4b0c +serdes_preemphasis_lane3_72=0x0d4b0c +serdes_preemphasis_lane0_73=0x0d4b0c +serdes_preemphasis_lane1_73=0x0d4b0c +serdes_preemphasis_lane2_73=0x0d4b0c +serdes_preemphasis_lane3_73=0x0d4b0c +serdes_preemphasis_lane0_74=0x0d4b0c +serdes_preemphasis_lane1_74=0x0d4b0c +serdes_preemphasis_lane2_74=0x0d4b0c +serdes_preemphasis_lane3_74=0x0d4b0c +serdes_preemphasis_lane0_87=0x0d4b0c +serdes_preemphasis_lane1_87=0x0d4b0c +serdes_preemphasis_lane2_87=0x0d4b0c +serdes_preemphasis_lane3_87=0x0d4b0c +serdes_preemphasis_lane0_79=0x0d4b0c +serdes_preemphasis_lane1_79=0x0d4b0c +serdes_preemphasis_lane2_79=0x0d4b0c +serdes_preemphasis_lane3_79=0x0d4b0c +serdes_preemphasis_lane0_99=0x0d4b0c +serdes_preemphasis_lane1_99=0x0d4b0c +serdes_preemphasis_lane2_99=0x0d4b0c +serdes_preemphasis_lane3_99=0x0d4b0c +serdes_preemphasis_lane0_95=0x0d4b0c +serdes_preemphasis_lane1_95=0x0d4b0c +serdes_preemphasis_lane2_95=0x0d4b0c +serdes_preemphasis_lane3_95=0x0d4b0c +serdes_preemphasis_lane0_115=0x0d4b0c +serdes_preemphasis_lane1_115=0x0d4b0c +serdes_preemphasis_lane2_115=0x0d4b0c +serdes_preemphasis_lane3_115=0x0d4b0c +serdes_preemphasis_lane0_107=0x0d4b0c +serdes_preemphasis_lane1_107=0x0d4b0c +serdes_preemphasis_lane2_107=0x0d4b0c +serdes_preemphasis_lane3_107=0x0d4b0c +serdes_preemphasis_lane0_123=0x14460a +serdes_preemphasis_lane1_123=0x14460a +serdes_preemphasis_lane2_123=0x14460a +serdes_preemphasis_lane3_123=0x14460a +serdes_preemphasis_lane0_127=0x14460a +serdes_preemphasis_lane1_127=0x14460a +serdes_preemphasis_lane2_127=0x14460a +serdes_preemphasis_lane3_127=0x14460a + reglist_enable=1 -scache_filename=/tmp/scache +scache_filename=/var/warmboot/wbscache schan_intr_enable=0 -stable_size=0x5500000 +stable_size=0x55000000 +stable_location=3 +warmboot_knet_shutdown_mode=1 tdma_timeout_usec=3000000 + +#vxlan flex flow mode +flow_init_mode=1 + +riot_enable=1 +riot_overlay_l3_intf_mem_size=4096 +riot_overlay_l3_egress_mem_size=32768 +riot_overlay_ecmp_resilient_hash_size=16384 + +l3_ecmp_levels=2 + +use_all_splithorizon_groups=1 +sai_tunnel_support=1 + +#This property allows to enable L2 FDB entry to discard based on Source Mac +sai_fdb_entry_l2_discard_src_enable=1 + +#RDMA +sai_pfc_defaults_disable=1 +sai_optimized_mmu=1 + +#ACL wb count +ctr_evict_enable=0 diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/custom_led.bin b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/custom_led.bin index 1fe5585e07796a7e30facd1faf391c9969ab8b08..e02f94e7ed87ffe60524721f4aec68d661880e7c 100644 GIT binary patch delta 152 zcmV;J0B8TK0_*{Q@U>S)Mn=H23jiBR765QI03?7X10je;0wo7m zf?>j80Wkq$A2C5q?Rz^)mL`LwmgRlw!DNAr6j7FS903-q@5HW~GeK|TnlSUN) zY95tAsvQB6*+v?ORvxwh1!#6#g=nfqQbYkd5_q~p1u6v5LPjz|Cea5X4B$mZH9%@Y zYC)2+04)X3F+u~-O-2AM0MG#zlh diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml old mode 100755 new mode 100644 index f5e8715643..3bdd16e803 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev.xml @@ -7,116 +7,413 @@ --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml new file mode 100644 index 0000000000..c6c4852077 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/dev_exhaust.xml @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py new file mode 100644 index 0000000000..f95164e036 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/fru.py @@ -0,0 +1,961 @@ +#!/usr/bin/python3 +import collections +from datetime import datetime, timedelta +from bitarray import bitarray + + +__DEBUG__ = "N" + + +class FruException(Exception): + def __init__(self, message='fruerror', code=-100): + err = 'errcode: {0} message:{1}'.format(code, message) + Exception.__init__(self, err) + self.code = code + self.message = message + + +def e_print(err): + print("ERROR: " + err) + + +def d_print(debug_info): + if __DEBUG__ == "Y": + print(debug_info) + + +class FruUtil(): + @staticmethod + def decodeLength(value): + a = bitarray(8) + a.setall(True) + a[0:1] = 0 + a[1:2] = 0 + x = ord(a.tobytes()) + return x & ord(value) + + @staticmethod + def minToData(): + starttime = datetime(1996, 1, 1, 0, 0, 0) + endtime = datetime.now() + seconds = (endtime - starttime).total_seconds() + mins = seconds // 60 + m = int(round(mins)) + return m + + @staticmethod + def getTimeFormat(): + return datetime.now().strftime('%Y-%m-%d') + + @staticmethod + def getTypeLength(value): + if value is None or len(value) == 0: + return 0 + a = bitarray(8) + a.setall(False) + a[0:1] = 1 + a[1:2] = 1 + x = ord(a.tobytes()) + return x | len(value) + + @staticmethod + def checksum(b): + result = 0 + for item in b: + result += ord(item) + return (0x100 - (result & 0xff)) & 0xff + + +class BaseArea(object): + SUGGESTED_SIZE_COMMON_HEADER = 8 + SUGGESTED_SIZE_INTERNAL_USE_AREA = 72 + SUGGESTED_SIZE_CHASSIS_INFO_AREA = 32 + SUGGESTED_SIZE_BOARD_INFO_AREA = 80 + SUGGESTED_SIZE_PRODUCT_INFO_AREA = 80 + + INITVALUE = b'\x00' + resultvalue = INITVALUE * 256 + COMMON_HEAD_VERSION = b'\x01' + __childList = None + + def __init__(self, name="", size=0, offset=0): + self.__childList = [] + self._offset = offset + self.name = name + self._size = size + self._isPresent = False + self._data = b'\x00' * size + + @property + def childList(self): + return self.__childList + + @childList.setter + def childList(self, value): + self.__childList = value + + @property + def offset(self): + return self._offset + + @offset.setter + def offset(self, value): + self._offset = value + + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + self._size = value + + @property + def data(self): + return self._data + + @data.setter + def data(self, value): + self._data = value + + @property + def isPresent(self): + return self._isPresent + + @isPresent.setter + def isPresent(self, value): + self._isPresent = value + + +class InternalUseArea(BaseArea): + pass + + +class ChassisInfoArea(BaseArea): + pass + + +class BoardInfoArea(BaseArea): + _boardTime = None + _fields = None + _mfg_date = None + areaversion = None + _boardversion = None + _language = None + + def __str__(self): + formatstr = "version : %x\n" \ + "length : %d \n" \ + "language : %x \n" \ + "mfg_date : %s \n" \ + "boardManufacturer : %s \n" \ + "boardProductName : %s \n" \ + "boardSerialNumber : %s \n" \ + "boardPartNumber : %s \n" \ + "fruFileId : %s \n" + + tmpstr = formatstr % (ord(self.boardversion), self.size, + self.language, self.getMfgRealData(), + self.boardManufacturer, self.boardProductName, + self.boardSerialNumber, self.boardPartNumber, + self.fruFileId) + for i in range(1, 11): + valtmp = "boardextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + tmpstr += "boardextra%d : %s \n" % (i, valtmpval) + else: + break + + return tmpstr + + def todict(self): + dic = collections.OrderedDict() + dic["boardversion"] = ord(self.boardversion) + dic["boardlength"] = self.size + dic["boardlanguage"] = self.language + dic["boardmfg_date"] = self.getMfgRealData() + dic["boardManufacturer"] = self.boardManufacturer + dic["boardProductName"] = self.boardProductName + dic["boardSerialNumber"] = self.boardSerialNumber + dic["boardPartNumber"] = self.boardPartNumber + dic["boardfruFileId"] = self.fruFileId + for i in range(1, 11): + valtmp = "boardextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + dic[valtmp] = valtmpval + else: + break + return dic + + def decodedata(self): + index = 0 + self.areaversion = self.data[index] + index += 1 + d_print("decode length :%d class size:%d" % + ((ord(self.data[index]) * 8), self.size)) + index += 2 + + timetmp = self.data[index: index + 3] + self.mfg_date = ord(timetmp[0]) | ( + ord(timetmp[1]) << 8) | (ord(timetmp[2]) << 16) + d_print("decode getMfgRealData :%s" % self.getMfgRealData()) + index += 3 + + templen = FruUtil.decodeLength(self.data[index]) + self.boardManufacturer = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardManufacturer:%s" % self.boardManufacturer) + + templen = FruUtil.decodeLength(self.data[index]) + self.boardProductName = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardProductName:%s" % self.boardProductName) + + templen = FruUtil.decodeLength(self.data[index]) + self.boardSerialNumber = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardSerialNumber:%s" % self.boardSerialNumber) + + templen = FruUtil.decodeLength(self.data[index]) + self.boardPartNumber = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode boardPartNumber:%s" % self.boardPartNumber) + + templen = FruUtil.decodeLength(self.data[index]) + self.fruFileId = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode fruFileId:%s" % self.fruFileId) + + for i in range(1, 11): + valtmp = "boardextra%d" % i + if self.data[index] != chr(0xc1): + templen = FruUtil.decodeLength(self.data[index]) + tmpval = self.data[index + 1: index + templen + 1] + setattr(self, valtmp, tmpval) + index += templen + 1 + d_print("decode boardextra%d:%s" % (i, tmpval)) + else: + break + + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + + def recalcute(self): + d_print("boardInfoArea version:%x" % ord(self.boardversion)) + d_print("boardInfoArea length:%d" % self.size) + d_print("boardInfoArea language:%x" % self.language) + self.mfg_date = FruUtil.minToData() + d_print("boardInfoArea mfg_date:%x" % self.mfg_date) + + self.data = chr(ord(self.boardversion)) + \ + chr(self.size // 8) + chr(self.language) + + self.data += chr(self.mfg_date & 0xFF) + self.data += chr((self.mfg_date >> 8) & 0xFF) + self.data += chr((self.mfg_date >> 16) & 0xFF) + + d_print("boardInfoArea boardManufacturer:%s" % self.boardManufacturer) + typelength = FruUtil.getTypeLength(self.boardManufacturer) + self.data += chr(typelength) + self.data += self.boardManufacturer + + d_print("boardInfoArea boardProductName:%s" % self.boardProductName) + self.data += chr(FruUtil.getTypeLength(self.boardProductName)) + self.data += self.boardProductName + + d_print("boardInfoArea boardSerialNumber:%s" % self.boardSerialNumber) + self.data += chr(FruUtil.getTypeLength(self.boardSerialNumber)) + self.data += self.boardSerialNumber + + d_print("boardInfoArea boardPartNumber:%s" % self.boardPartNumber) + self.data += chr(FruUtil.getTypeLength(self.boardPartNumber)) + self.data += self.boardPartNumber + + d_print("boardInfoArea fruFileId:%s" % self.fruFileId) + self.data += chr(FruUtil.getTypeLength(self.fruFileId)) + self.data += self.fruFileId + + for i in range(1, 11): + valtmp = "boardextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + d_print("boardInfoArea boardextra%d:%s" % (i, valtmpval)) + self.data += chr(FruUtil.getTypeLength(valtmpval)) + if valtmpval is not None: + self.data += valtmpval + else: + break + + self.data += chr(0xc1) + + if len(self.data) > (self.size - 1): + incr = (len(self.data) - self.size) // 8 + 1 + self.size += incr * 8 + + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] + d_print("self data:%d" % len(self.data)) + d_print("self size:%d" % self.size) + d_print("adjust size:%d" % (self.size - len(self.data) - 1)) + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) + + # checksum + checksum = FruUtil.checksum(self.data) + d_print("board info checksum:%x" % checksum) + self.data += chr(checksum) + + def getMfgRealData(self): + starttime = datetime(1996, 1, 1, 0, 0, 0) + mactime = starttime + timedelta(minutes=self.mfg_date) + return mactime + + @property + def language(self): + self._language = 25 + return self._language + + @property + def mfg_date(self): + return self._mfg_date + + @mfg_date.setter + def mfg_date(self, val): + self._mfg_date = val + + @property + def boardversion(self): + self._boardversion = self.COMMON_HEAD_VERSION + return self._boardversion + + @property + def fruFileId(self): + return self._FRUFileID + + @fruFileId.setter + def fruFileId(self, val): + self._FRUFileID = val + + @property + def boardPartNumber(self): + return self._boardPartNumber + + @boardPartNumber.setter + def boardPartNumber(self, val): + self._boardPartNumber = val + + @property + def boardSerialNumber(self): + return self._boardSerialNumber + + @boardSerialNumber.setter + def boardSerialNumber(self, val): + self._boardSerialNumber = val + + @property + def boardProductName(self): + return self._boradProductName + + @boardProductName.setter + def boardProductName(self, val): + self._boradProductName = val + + @property + def boardManufacturer(self): + return self._boardManufacturer + + @boardManufacturer.setter + def boardManufacturer(self, val): + self._boardManufacturer = val + + @property + def boardTime(self): + return self._boardTime + + @boardTime.setter + def boardTime(self, val): + self._boardTime = val + + @property + def fields(self): + return self._fields + + @fields.setter + def fields(self, val): + self._fields = val + + +class ProductInfoArea(BaseArea): + _productManufacturer = None + _productAssetTag = None + _FRUFileID = None + _language = None + + def __str__(self): + formatstr = "version : %x\n" \ + "length : %d \n" \ + "language : %x \n" \ + "productManufacturer : %s \n" \ + "productName : %s \n" \ + "productPartModelName: %s \n" \ + "productVersion : %s \n" \ + "productSerialNumber : %s \n" \ + "productAssetTag : %s \n" \ + "fruFileId : %s \n" + + tmpstr = formatstr % (ord(self.areaversion), self.size, + self.language, self.productManufacturer, + self.productName, self.productPartModelName, + self.productVersion, self.productSerialNumber, + self.productAssetTag, self.fruFileId) + + for i in range(1, 11): + valtmp = "productextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + tmpstr += "productextra%d : %s \n" % (i, valtmpval) + else: + break + + return tmpstr + + def todict(self): + dic = collections.OrderedDict() + dic["productversion"] = ord(self.areaversion) + dic["productlength"] = self.size + dic["productlanguage"] = self.language + dic["productManufacturer"] = self.productManufacturer + dic["productName"] = self.productName + dic["productPartModelName"] = self.productPartModelName + dic["productVersion"] = int(self.productVersion, 16) + dic["productSerialNumber"] = self.productSerialNumber + dic["productAssetTag"] = self.productAssetTag + dic["productfruFileId"] = self.fruFileId + for i in range(1, 11): + valtmp = "productextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + dic[valtmp] = valtmpval + else: + break + return dic + + def decodedata(self): + index = 0 + self.areaversion = self.data[index] # 0 + index += 1 + d_print("decode length %d" % (ord(self.data[index]) * 8)) + d_print("class size %d" % self.size) + index += 2 + + templen = FruUtil.decodeLength(self.data[index]) + self.productManufacturer = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productManufacturer:%s" % self.productManufacturer) + + templen = FruUtil.decodeLength(self.data[index]) + self.productName = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productName:%s" % self.productName) + + templen = FruUtil.decodeLength(self.data[index]) + self.productPartModelName = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productPartModelName:%s" % self.productPartModelName) + + templen = FruUtil.decodeLength(self.data[index]) + self.productVersion = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productVersion:%s" % self.productVersion) + + templen = FruUtil.decodeLength(self.data[index]) + self.productSerialNumber = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productSerialNumber:%s" % self.productSerialNumber) + + templen = FruUtil.decodeLength(self.data[index]) + self.productAssetTag = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode productAssetTag:%s" % self.productAssetTag) + + templen = FruUtil.decodeLength(self.data[index]) + self.fruFileId = self.data[index + 1: index + templen + 1] + index += templen + 1 + d_print("decode fruFileId:%s" % self.fruFileId) + + for i in range(1, 11): + valtmp = "productextra%d" % i + if self.data[index] != chr(0xc1) and index < self.size - 1: + templen = FruUtil.decodeLength(self.data[index]) + if templen == 0: + break + tmpval = self.data[index + 1: index + templen + 1] + d_print("decode boardextra%d:%s" % (i, tmpval)) + setattr(self, valtmp, tmpval) + index += templen + 1 + else: + break + + @property + def productVersion(self): + return self._productVersion + + @productVersion.setter + def productVersion(self, name): + self._productVersion = name + + @property + def areaversion(self): + self._areaversion = self.COMMON_HEAD_VERSION + return self._areaversion + + @areaversion.setter + def areaversion(self, name): + self._areaversion = name + + @property + def language(self): + self._language = 25 + return self._language + + @property + def productManufacturer(self): + return self._productManufacturer + + @productManufacturer.setter + def productManufacturer(self, name): + self._productManufacturer = name + + @property + def productName(self): + return self._productName + + @productName.setter + def productName(self, name): + self._productName = name + + @property + def productPartModelName(self): + return self._productPartModelName + + @productPartModelName.setter + def productPartModelName(self, name): + self._productPartModelName = name + + @property + def productSerialNumber(self): + return self._productSerialNumber + + @productSerialNumber.setter + def productSerialNumber(self, name): + self._productSerialNumber = name + + @property + def productAssetTag(self): + return self._productAssetTag + + @productAssetTag.setter + def productAssetTag(self, name): + self._productAssetTag = name + + @property + def fruFileId(self): + return self._FRUFileID + + @fruFileId.setter + def fruFileId(self, name): + self._FRUFileID = name + + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + + def recalcute(self): + d_print("product version:%x" % ord(self.areaversion)) + d_print("product length:%d" % self.size) + d_print("product language:%x" % self.language) + self.data = chr(ord(self.areaversion)) + \ + chr(self.size // 8) + chr(self.language) + + typelength = FruUtil.getTypeLength(self.productManufacturer) + self.data += chr(typelength) + self.data += self.productManufacturer + + self.data += chr(FruUtil.getTypeLength(self.productName)) + self.data += self.productName + + self.data += chr(FruUtil.getTypeLength(self.productPartModelName)) + self.data += self.productPartModelName + + self.data += chr(FruUtil.getTypeLength(self.productVersion)) + self.data += self.productVersion + + self.data += chr(FruUtil.getTypeLength(self.productSerialNumber)) + self.data += self.productSerialNumber + + self.data += chr(FruUtil.getTypeLength(self.productAssetTag)) + if self.productAssetTag is not None: + self.data += self.productAssetTag + + self.data += chr(FruUtil.getTypeLength(self.fruFileId)) + self.data += self.fruFileId + + for i in range(1, 11): + valtmp = "productextra%d" % i + if hasattr(self, valtmp): + valtmpval = getattr(self, valtmp) + d_print("boardInfoArea productextra%d:%s" % (i, valtmpval)) + self.data += chr(FruUtil.getTypeLength(valtmpval)) + if valtmpval is not None: + self.data += valtmpval + else: + break + + self.data += chr(0xc1) + if len(self.data) > (self.size - 1): + incr = (len(self.data) - self.size) // 8 + 1 + self.size += incr * 8 + d_print("self.data:%d" % len(self.data)) + d_print("self.size:%d" % self.size) + + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) + checksum = FruUtil.checksum(self.data) + d_print("board info checksum:%x" % checksum) + self.data += chr(checksum) + + +class MultiRecordArea(BaseArea): + pass + + +class Field(object): + + def __init__(self, fieldType="ASCII", fieldData=""): + self.fieldData = fieldData + self.fieldType = fieldType + + @property + def fieldType(self): + return self.fieldType + + @property + def fieldData(self): + return self.fieldData + + +class ipmifru(BaseArea): + _BoardInfoArea = None + _ProductInfoArea = None + _InternalUseArea = None + _ChassisInfoArea = None + _multiRecordArea = None + _productinfoAreaOffset = BaseArea.INITVALUE + _boardInfoAreaOffset = BaseArea.INITVALUE + _internalUserAreaOffset = BaseArea.INITVALUE + _chassicInfoAreaOffset = BaseArea.INITVALUE + _multiRecordAreaOffset = BaseArea.INITVALUE + _bindata = None + _bodybin = None + _version = BaseArea.COMMON_HEAD_VERSION + _zeroCheckSum = None + _frusize = 256 + + def __str__(self): + tmpstr = "" + if self.boardInfoArea.isPresent: + tmpstr += "\nboardinfoarea: \n" + tmpstr += self.boardInfoArea.__str__() + if self.productInfoArea.isPresent: + tmpstr += "\nproductinfoarea: \n" + tmpstr += self.productInfoArea.__str__() + return tmpstr + + def decodeBin(self, eeprom): + commonHead = eeprom[0:8] + d_print("decode version %x" % ord(commonHead[0])) + if ord(self.COMMON_HEAD_VERSION) != ord(commonHead[0]): + raise FruException("HEAD VERSION error,not Fru format!", -10) + if FruUtil.checksum(commonHead[0:7]) != ord(commonHead[7]): + strtemp = "check header checksum error [cal:%02x data:%02x]" % ( + FruUtil.checksum(commonHead[0:7]), ord(commonHead[7])) + raise FruException(strtemp, -3) + if ord(commonHead[1]) != ord(self.INITVALUE): + d_print("Internal Use Area is present") + self.internalUseArea = InternalUseArea( + name="Internal Use Area", size=self.SUGGESTED_SIZE_INTERNAL_USE_AREA) + self.internalUseArea.isPresent = True + self.internalUserAreaOffset = ord(commonHead[1]) + self.internalUseArea.data = eeprom[self.internalUserAreaOffset * 8: ( + self.internalUserAreaOffset * 8 + self.internalUseArea.size)] + if ord(commonHead[2]) != ord(self.INITVALUE): + d_print("Chassis Info Area is present") + self.chassisInfoArea = ChassisInfoArea( + name="Chassis Info Area", size=self.SUGGESTED_SIZE_CHASSIS_INFO_AREA) + self.chassisInfoArea.isPresent = True + self.chassicInfoAreaOffset = ord(commonHead[2]) + self.chassisInfoArea.data = eeprom[self.chassicInfoAreaOffset * 8: ( + self.chassicInfoAreaOffset * 8 + self.chassisInfoArea.size)] + if ord(commonHead[3]) != ord(self.INITVALUE): + self.boardInfoArea = BoardInfoArea( + name="Board Info Area", size=self.SUGGESTED_SIZE_BOARD_INFO_AREA) + self.boardInfoArea.isPresent = True + self.boardInfoAreaOffset = ord(commonHead[3]) + self.boardInfoArea.size = ord( + eeprom[self.boardInfoAreaOffset * 8 + 1]) * 8 + d_print("Board Info Area is present size:%d" % + (self.boardInfoArea.size)) + self.boardInfoArea.data = eeprom[self.boardInfoAreaOffset * 8: ( + self.boardInfoAreaOffset * 8 + self.boardInfoArea.size)] + if FruUtil.checksum(self.boardInfoArea.data[:-1]) != ord(self.boardInfoArea.data[-1:]): + strtmp = "check boardInfoArea checksum error[cal:%02x data:%02x]" % \ + (FruUtil.checksum( + self.boardInfoArea.data[:-1]), ord(self.boardInfoArea.data[-1:])) + raise FruException(strtmp, -3) + self.boardInfoArea.decodedata() + if ord(commonHead[4]) != ord(self.INITVALUE): + d_print("Product Info Area is present") + self.productInfoArea = ProductInfoArea( + name="Product Info Area ", size=self.SUGGESTED_SIZE_PRODUCT_INFO_AREA) + self.productInfoArea.isPresent = True + self.productinfoAreaOffset = ord(commonHead[4]) + d_print("length offset value: %02x" % + ord(eeprom[self.productinfoAreaOffset * 8 + 1])) + self.productInfoArea.size = ord( + eeprom[self.productinfoAreaOffset * 8 + 1]) * 8 + d_print("Product Info Area is present size:%d" % + (self.productInfoArea.size)) + + self.productInfoArea.data = eeprom[self.productinfoAreaOffset * 8: ( + self.productinfoAreaOffset * 8 + self.productInfoArea.size)] + if FruUtil.checksum(self.productInfoArea.data[:-1]) != ord(self.productInfoArea.data[-1:]): + strtmp = "check productInfoArea checksum error [cal:%02x data:%02x]" % ( + FruUtil.checksum(self.productInfoArea.data[:-1]), ord(self.productInfoArea.data[-1:])) + raise FruException(strtmp, -3) + self.productInfoArea.decodedata() + if ord(commonHead[5]) != ord(self.INITVALUE): + self.multiRecordArea = MultiRecordArea( + name="MultiRecord record Area ") + d_print("MultiRecord record present") + self.multiRecordArea.isPresent = True + self.multiRecordAreaOffset = ord(commonHead[5]) + self.multiRecordArea.data = eeprom[self.multiRecordAreaOffset * 8: ( + self.multiRecordAreaOffset * 8 + self.multiRecordArea.size)] + + def initDefault(self): + self.version = self.COMMON_HEAD_VERSION + self.internalUserAreaOffset = self.INITVALUE + self.chassicInfoAreaOffset = self.INITVALUE + self.boardInfoAreaOffset = self.INITVALUE + self.productinfoAreaOffset = self.INITVALUE + self.multiRecordAreaOffset = self.INITVALUE + self.zeroCheckSum = self.INITVALUE + self.offset = self.SUGGESTED_SIZE_COMMON_HEADER + self.productInfoArea = None + self.internalUseArea = None + self.boardInfoArea = None + self.chassisInfoArea = None + self.multiRecordArea = None + # self.recalcute() + + @property + def version(self): + return self._version + + @version.setter + def version(self, name): + self._version = name + + @property + def internalUserAreaOffset(self): + return self._internalUserAreaOffset + + @internalUserAreaOffset.setter + def internalUserAreaOffset(self, obj): + self._internalUserAreaOffset = obj + + @property + def chassicInfoAreaOffset(self): + return self._chassicInfoAreaOffset + + @chassicInfoAreaOffset.setter + def chassicInfoAreaOffset(self, obj): + self._chassicInfoAreaOffset = obj + + @property + def productinfoAreaOffset(self): + return self._productinfoAreaOffset + + @productinfoAreaOffset.setter + def productinfoAreaOffset(self, obj): + self._productinfoAreaOffset = obj + + @property + def boardInfoAreaOffset(self): + return self._boardInfoAreaOffset + + @boardInfoAreaOffset.setter + def boardInfoAreaOffset(self, obj): + self._boardInfoAreaOffset = obj + + @property + def multiRecordAreaOffset(self): + return self._multiRecordAreaOffset + + @multiRecordAreaOffset.setter + def multiRecordAreaOffset(self, obj): + self._multiRecordAreaOffset = obj + + @property + def zeroCheckSum(self): + return self._zeroCheckSum + + @zeroCheckSum.setter + def zeroCheckSum(self, obj): + self._zeroCheckSum = obj + + @property + def productInfoArea(self): + return self._ProductInfoArea + + @productInfoArea.setter + def productInfoArea(self, obj): + self._ProductInfoArea = obj + + @property + def internalUseArea(self): + return self._InternalUseArea + + @internalUseArea.setter + def internalUseArea(self, obj): + self.internalUseArea = obj + + @property + def boardInfoArea(self): + return self._BoardInfoArea + + @boardInfoArea.setter + def boardInfoArea(self, obj): + self._BoardInfoArea = obj + + @property + def chassisInfoArea(self): + return self._ChassisInfoArea + + @chassisInfoArea.setter + def chassisInfoArea(self, obj): + self._ChassisInfoArea = obj + + @property + def multiRecordArea(self): + return self._multiRecordArea + + @multiRecordArea.setter + def multiRecordArea(self, obj): + self._multiRecordArea = obj + + @property + def bindata(self): + return self._bindata + + @bindata.setter + def bindata(self, obj): + self._bindata = obj + + @property + def bodybin(self): + return self._bodybin + + @bodybin.setter + def bodybin(self, obj): + self._bodybin = obj + + def recalcuteCommonHead(self): + self.bindata = "" + self.offset = self.SUGGESTED_SIZE_COMMON_HEADER + d_print("common Header %d" % self.offset) + d_print("fru eeprom size %d" % self._frusize) + if self.internalUseArea is not None and self.internalUseArea.isPresent: + self.internalUserAreaOffset = self.offset // 8 + self.offset += self.internalUseArea.size + d_print("internalUseArea is present offset:%d" % self.offset) + + if self.chassisInfoArea is not None and self.chassisInfoArea.isPresent: + self.chassicInfoAreaOffset = self.offset // 8 + self.offset += self.chassisInfoArea.size + d_print("chassisInfoArea is present offset:%d" % self.offset) + + if self.boardInfoArea is not None and self.boardInfoArea.isPresent: + self.boardInfoAreaOffset = self.offset // 8 + self.offset += self.boardInfoArea.size + d_print("boardInfoArea is present offset:%d" % self.offset) + d_print("boardInfoArea is present size:%d" % + self.boardInfoArea.size) + + if self.productInfoArea is not None and self.productInfoArea.isPresent: + self.productinfoAreaOffset = self.offset // 8 + self.offset += self.productInfoArea.size + d_print("productInfoArea is present offset:%d" % self.offset) + + if self.multiRecordArea is not None and self.multiRecordArea.isPresent: + self.multiRecordAreaOffset = self.offset // 8 + d_print("multiRecordArea is present offset:%d" % self.offset) + + if self.internalUserAreaOffset == self.INITVALUE: + self.internalUserAreaOffset = 0 + if self.productinfoAreaOffset == self.INITVALUE: + self.productinfoAreaOffset = 0 + if self.chassicInfoAreaOffset == self.INITVALUE: + self.chassicInfoAreaOffset = 0 + if self.boardInfoAreaOffset == self.INITVALUE: + self.boardInfoAreaOffset = 0 + if self.multiRecordAreaOffset == self.INITVALUE: + self.multiRecordAreaOffset = 0 + + self.zeroCheckSum = (0x100 - ord(self.version) - self.internalUserAreaOffset - self.chassicInfoAreaOffset - self.productinfoAreaOffset + - self.boardInfoAreaOffset - self.multiRecordAreaOffset) & 0xff + d_print("zerochecksum:%x" % self.zeroCheckSum) + self.data = "" + self.data += chr(self.version[0]) + chr(self.internalUserAreaOffset) + chr(self.chassicInfoAreaOffset) + chr( + self.boardInfoAreaOffset) + chr(self.productinfoAreaOffset) + chr(self.multiRecordAreaOffset) + chr(self.INITVALUE[0]) + chr(self.zeroCheckSum) + + self.bindata = self.data + self.bodybin + totallen = len(self.bindata) + d_print("totallen %d" % totallen) + if totallen < self._frusize: + self.bindata = self.bindata.ljust(self._frusize, chr(self.INITVALUE[0])) + else: + raise FruException('bin data more than %d' % self._frusize, -2) + + def recalcutebin(self): + self.bodybin = "" + if self.internalUseArea is not None and self.internalUseArea.isPresent: + d_print("internalUseArea present") + self.bodybin += self.internalUseArea.data + if self.chassisInfoArea is not None and self.chassisInfoArea.isPresent: + d_print("chassisInfoArea present") + self.bodybin += self.chassisInfoArea.data + if self.boardInfoArea is not None and self.boardInfoArea.isPresent: + d_print("boardInfoArea present") + self.boardInfoArea.recalcute() + self.bodybin += self.boardInfoArea.data + if self.productInfoArea is not None and self.productInfoArea.isPresent: + d_print("productInfoAreapresent") + self.productInfoArea.recalcute() + self.bodybin += self.productInfoArea.data + if self.multiRecordArea is not None and self.multiRecordArea.isPresent: + d_print("multiRecordArea present") + self.bodybin += self.productInfoArea.data + + def recalcute(self, fru_eeprom_size=256): + self._frusize = fru_eeprom_size + self.recalcutebin() + self.recalcuteCommonHead() + + def setValue(self, area, field, value): + tmp_area = getattr(self, area, None) + if tmp_area is not None: + tmp_area.fruSetValue(field, value) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin new file mode 100644 index 0000000000000000000000000000000000000000..08eba59b3a77d401ecbb2fcca0072552bb48e10f GIT binary patch literal 8388725 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 Dsl;?vv{TfI==a%0s_0UR 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

vPPy*G2t$~%gG@uj@M0!PA|-2k1UV6FE5?js&V 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

WaOu6i{!Xm1)aVc2BYyLgizhTKiezMiUXJV+ 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 z zl9D63f-@I_Cpsf?V~p!8@+fn%?zSF-mKW6ed*G~Uqrt)_?RnP-aR}9lDOix9Og_iraKwArloctQ(Hzmvi4X6Mg8%&>Oag^K4%$fHdNM$|$cctui_qJZgU(vD|VU>sQWiR$~hh(VMJZXudIfi5;Ng7aBfEI2NS;3%_ z{EP!T9a|AK1LKp~GuaQ>v-qo{j zbUbz0kv96Vo-8gnLoPiaDF=NYpwYp(UF%x18=*G~&ii?7va}*J<0JX5hvyX2`=^go zZK-xztZsNF_2bx8HfI0`aVV5*N_;5

QXUMlqVET@-ye4w=6*zbeaWi6L4rUUedoNxIMx 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%0DP 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

*-YcW0S(9W|Q(F43YFC*gq`Js`DU|#f^XK= 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%0D}X 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

R&lrM5 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 RvO|diQ94EEN)hK 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%0DS63^ewNQiOlAsfg5*SYX)L}E8DP;u_p#xJz zDJ~-={^tWWT=Lw1mQP^<@nnjb5vT3`c`Km;xbH@$xpHH5?$&LA9XUyov2AK-&t8@! z87mo;HKzlCjDSi{T3~Kci*)@HCf9OEPcxI26R3WodR4z89cm{-ClMJO#?UH>stZ%S z(%WIa%>0Y*TG8!5T2d;t&aWj%05C7V(9vXkwNS&YGX37UOKJCysD5h~8t@0GInzxf z)qK_r%oi>P`L=Cc5AI?N7^_t%y%xdsYg(Jn>P3r!4c$N ziP<^L7w{j%iWl0@Z^UxY7LObhXR@Cz#;V^XCk$Ip*Ky2u+c()9iYA3^MG=!v&O)(%L*!0t4?Unh1o;?1qRXZF?~P zyltk*wMABNdO=C>&9<;KpbUxrpOkqv4vCq^kBbEEF3>>S|HkD~ah(d{AqF+z+ zn~vdlaya2J5$Qta%U-^)?Q95Y)A^pmx#jBe?|~Zze=z&&O_&}{-O~%|Z^3xomu1E?A>t(V-9)nyTd zR6nV<35czlS)|lM5YAr0w{&QVm^ql8xuM)wt)E~ZymL06MDdFRmi0o7=Ei9d2Qr|z z^@)ua${c-nn@{YRHE(ElbMh>Lm^X6PTw59gzlIh}Z7{r1E1P^t*NtSXUtxpCLqdVd z1;#=rp=$ZMl8GaK2v$^26|T+_c_hGeqNZm8vkHzj3{2)E%f9#xTjAJ3JQt*Wac(9G zxj1Fuw=1?_z1i=rkH6da?XaK%Et5QgqgAC&)l@g`+Sh<(2G7$(6R@isr1^N@Me2F2 zE{Zud<{ww&LH$4|+P01IhPLUx#)y#rZjU2%(BiUZ>{oh~jaUjUE#=*U7jSo>0&C>H zTLk5_p6K@oJj_++_;4*Zh)aH`Kp#Pc81%lzO;k6siNA zyg8mXj{PC=Mos+qc(wY=n(g)8YHc=_=}6T~xc-2PQ4C(@eVa1X?;nBS2ZSAxrqY}W4+b#)uGUWgAR`~YL96&^{>jY2Fki1X zNGcPn|H_b2kpO9)A9JVL_@rEO&_E>OGqV&)G_(=)%QmhjXjWW8NVF|Dk>O^Zuygr2c=GJU` zs(NE^NO_heX&tj0(qep;v68UhS?oC^i$lG4=}-?U{FfE1=$r1~E7> z^3Y##n<7}TxGAYNV@PgZ!v?*5Y^EU?P_GdF#M2M5>0 z-m0)ca%jYmeDPjPtgO?w$6<>hY}-gq?~+y7w}xR*Nx|p$8EsD)<@~YXsXwZ(-N?we z^D*Zy>j>9_YGsvaS!SNrdK1q#u6*N_Hi4b;&zO3W_#pjUjtYvdTV#5&rK*Gl7!j6M z{>_GRugE&y*sQvQ!27rMLl2dkj1W%iH*;P_SL1!2?wX>C$m<3V2oRmpO_5_OYaoq7v_GI z0b=0Swl$0a+=_bCt}S8om_NAlEmc3Zo!60EqN{2i;a`%issJ`a zgvUGc+(j|UfuL-J5)K7*ZIU{s-F>E?+|!4o%u^C}s$b#hzK`2#^HcsxuCvDku2%qr z-fudj9t6&v7AI^O*d<=Fu|Vs}u;2R5x<)kFEqv*B`6I)a<>M`x7qE%1!QK2h@3UvD zpbsv*MVJbPLX2@-=NAC$HstKB;DruQFy4NkfWfcJo&?Kfe?3oMQZyu|0?Q*sg5CXt zysAAPevjy!Qc;zkfllyVSo)o%N)Be)>Ha-vPV&3m_u?5+J63;X(KUjg zC;;CePnAMT+dA)KmD}SxlvFAg?O4igK~0m-N+J~f=bE()`!QAT9W!7nj2LTEiYGzA zHq_GorvS5E3AdQ`$|F$b6Tq6!jS@v!&Tn6k2No9PVYwm9(tp?eSpKss&xY=?99!1= zjKxOXqw?Ow3i)H6-D&10XnY zfM|uWF06Oa>0VS`tFTx7EubfKsm!9|y_M%jHY3>Nv;kR+2&lE7860d5(dNyUC+aJT zpShY}t~jz`&27t@*}br+T zE3s?t{?ue|8Q_ZZt0+gsNcwmV(^wbUF{BukUg1Zc*`&vuDwNqmZ68AmFxrR{Zo~>NDyE3W9(z->>Q;

d!rYgT3;bn&e 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�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�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%0A` zpV`IBo6ZngZ@^mBe@5gHKG0MMpNfv5k28BeU^J{1TCb)uK0&C4O=R&C9bH%_nrJ21 zV^AN7I(b!k{EV&)YAH}4lUlZcg;R;B&-=D$5a7&I+dB^Xg)Xwgk5@SU0&X)!Fwcv4 zYq7uU-x!1HA&vDT>%8$N;1=ox?nxPZ-AEhy`U=piRNK})4xN=965iBME2ZMW zr7+zwF?lugY1yG(lW%>xa->yYeu|93CkC^vjGTwl!{FiuiW0U0HIL%4|zS{!QF&4AH<|j1l>;HrxHNOq*k|QC`lz zV4X<+D3Qq$(2 z|3=3T;b)igUI>wdii5N#D!u#|sQs3;>6k8WFy^hK7edP9m4o?Zeg=t5Q6|A!3JF|G zLfB1AwlbzoY`G9U-)!d**-V;^dROp43q@r^*J=W-wvU7uIX#MVYiHT-n0}&EkHF@f= zaq+KrJ=Q(4qJRsFM05mmoojngU5^}(7BQ4jUk`t)2S)2hwcP#n*rjR2a zxdGmmy7aXX6govcN`PLf_fUJv;{e=!cfD7uddCki7(~VS*JaLKGydh@_#ICA;7QL4 zGv&ADkq8dUGm`MpRrD8Gx?tx5le1RxQ8allQ$Hu!?q+9&l^W@FNWs+@0IM37V{ivO zsQY*sn{+#c^QVHC&E<{<28Hbm2lDF1D&YBY+rMmSaWHMRUi=A#VZK;$$^QM;mG)Te z8%smg4puf=@z;JslpQ)CC=;>m6iAVF$WuKv=$o2uD26W8y85f-Y&$HBt= zkyfHlFIgL<$5b(fUvB=0LVJh8M%{vMX|i7>(oWFn?sLcF!#Gg$v?21NJ$E=aav8BCjW>j)X;lAQ{f@>Oc`!%SZjFqN3VyJQRql*9?WG%o=y@TT7Nxz6 z=4)u47x35Ze^$jC&6ZP9Bi#R3wOwTto!G9`KMk87EvKhPSEMt9fUwEomPlG9!deP* zx()4{Ix5GBetEj`vyYI29usr?46aM43HE@=50I74HRamR=*BnmzM_G`=xc3`4ORG=8|QX{VFK zxKov3J{0X*ZLb;ZWWW|hMcZ^JR zz)e_O{CB*l`ttFWMf(jYzb1A+%BkdV5bGh%%twpo%t<14y*72xH-Nw-;F@HA?=;XO zfExk~op_Ka0%$)JvKjv*uFHV`T$a_81RFpt!ong#ZkvFL-E`=tu?8Qlb&qS7;}-X= zb&WR;J!aT!fNIo2))u%7m>u?PBAm#YxG&whvS^IE0OY7Tb*N~qzcX1?4cP8xjVqV# zu!Y9CN*?A-yuI@W)+%(^xdT-d)SP&Q3S3KrRx|!1TrKnKv+7fBh)w6hE2j6yoJA$a zxmFi9pwHI@Ca_td_K{Z?KK6zVGH-fI7baOXNTuPsHnK?JcH=OeKn1BUfK2nQ8di zkxac(6@k?(ajPpUT67!4pD&@MBa{<~1q%oB;LR3wzN^D3_6}A|u$1EO`UpPGDTyB3 z;=>yIj$Lw*S&*f}uhzt+naWah5ir7kG*GW%qeopjz;U7prLtLv9iK(-m_JKz2=e%> z;~#1l(S)kCriys>2$v4J9XvM_!WFFVYmb5LNC9GyD+dW$K)9>+PN{t}E)n#x0A(aN z<45xKG85!lT6ibJ@~t&5m;5eXgLpPlp=jJU`OXL)XVI;`MmgJ?^=jfFNQL=Ad&MtU zHMu3=QrXrqz^?=cgBm~-)3yhjE3h0|?yL&%4l~W_lop8;#BfeDF-b@8tme|(|J#F? zz+|Ynh}*|>9Ds=H0eeXGHJQmXrh?xM zqB~E@cR(a^1l9Nz&jH$pDr)DH-mcvI{((_KR)do^lR|j{VHYj z3Jh@5A`)MceV~CGoPQdK{zUWIeLn?6)q3w+Aezpj(}AE$b($_xm!aHDVATTaI+Q*$ zLVbnt1GeA`+*)sb;wm^?X_m!U>19U@Wr3!$pI*mqS-kG2a2`RS#B%2Z_DZ2C&bR+K ztl)H8P{2O3bT`x^5yRSVHf$DdZ2c;o^!fuj=w$fQaX11umA$Q|TVN_ac4O3;7{h`t zk7t=FeohWsTYc^L663*i$UCMzRE4TkD3V1gZIuVT&@=Cux(>*D-O^iuoFhZZQ)b)w z35l7%*O^(VAQ7;u5$*a5(Xgi}Ajk}zDdW8_3Pl~oE@|_leR&9|-mTHN5bB6JOrJzA zHLOkoYd*FD@%$3TuGObnR4R%C{aWORDzS{ohO->{8&@_pjUSN)AqjoR-&LGv;0Dpvc2&AMvD2!t2 zSUkd(!GZ2{@Z+wUHRs$brh;nvkzk%2<1uJ#ZJw;qqW`VPGNhGInK` zfxJL2KiSX)mnPcw`cUX@#h6!Sf8E0@E=yw06z1N(&yh(G#j8YKKfXe5W&$~0UUVdS zo?tS!7RSq7JM&J)sD21pgo%jX51^0N6@&nbtXr|D~=T>0=Q2AGeI zoq|=tT8^y_wYkbqo!9R`_)&3V6TT(M!9@AY+0cge(iu^W@&sj zmX<1_TU^gHXN(?QK=?`1WO-gvfOQvGH z)HLT#>g0;3)lCj~)VeLu&RW~-H`=x5YxHHo#ck8UG?n(UJ&b{Da zkriIEQ54UmI#Y&UreOC2JSH#3#<|MI5se|SkmRz>K+SLA*M3gdw;lf7%6K!Eyiuub zq8SQf%RhMz+Q;NUdj_ocI_iZ2SM&%dIil@+`W(gb^Hg7%CHIWiuEg#n%S(qZUm_99 z7ZiSLFHy}@jpiu4$?hdYGgaBOk{qiqW^&gWbAoS zMnEtke4M< zO6Es|)k7diD%~Y50rdwjuiHS;&gO^P|A`rojcc**MzAJ~^8pytXTD=W>;u2T58M#Sb~3VZ)WPnqz1;jAHb!OTJntuTKs<=q)l!&g0P zdlF?UOT0l0Sr8VKY|6|Op*}6KB39W8P>9u+qECxqoV^+yL=;LvRSnx+>!0#ihkiw4 z)wr&7AQ{Y2;;H!?L^=EC8CRcY_SvLnUzmb4BIuP&lKp72R>yZ|tEY->f8jb8V&a8@ zz*e0F6`Cz8f_)uM4!fK_uPX6j!Uv83uM9)5GazrUMVj4599=&b)x%8@mR%dDZ7~kFq?8o_9yR-&k$oBw}e}C zh=|ju4omNKv=7T>vKLH3>Jfb@2cNUUO38b7D-MP#D9pG?d1X`+^#nS{PQmpy=SM9n zlbOD(E1H=k;HwhZGGCq|z$k3FnQtlZc%h}~f4_5(%_dBix%knUiAx`&HGcS>4voLp zPGzYuk{<8rVV!?Z6DksKq-MEI!oZzN`_8!HDkw2Q%AflRA}$ z&&}B`w_yUzIL~HNhMM8mn7};;*MvDH{7by_+|o@lPO?TqWIIHCol_Fr<5;)Roi0XCe+vtD@6=wuH-ifzFpB| z;CH(Zxe5+V}*12EGd}*nQlx#|GDB ze|;mS9GaKGrY4z|yH;ru?;0Oqhgmu7%O~ANkOTF{C|vzeqq@>zRDslla8w9^haeY4 zp>w-~TmncKvlZH>)XknIA6UDiz?6o1|Ec(19+-4p4x@P_hI|>K#ok)q zpW+Cg`aceUhIU`gtl)OHFM68T<5yKz4`-2jXh^tWM57W0XOrZpE&ibI>0BKDWf-0A0v))V zwMHqe)BO92==Va@;4r{ZbCo7Hw0mCCqhgr*17Su)^g*kjCjErI=(uwZ1va?_$a^{ zTPKRHzr0$prko)FpDMqBFUQ=D>hK?6A@krwQR%VvO66m-ziLLxCT8Ro_3h6@WKoFG z2kH-d9YcpNE27#)B&L}TDV44kd)2+Vo?9a6VMY6?`RKW+U23I>Vstsx-J97L6`XZd zHkJqdLW(!_3mdsHl?w$rBwDjJm0v);(ulTg-=A$KJa1iKuaN9}(7%&rac<(3OaPn3 zNAxIc4H44qyqwpACZj3hRAU3~sMg-Q122l&^T`GqS*uY^VJD-$3$r%^2-{5>^@1crJN)E;o9|m zEgcZ*y$3}=uPb>jL*|qEbe?K|s1FIT0c~`61XD@dqvxFZ(F60o+P|yc{#qYF2FByG zCmZ0ZTzQ6(1Bn(**JilOo|@RfBs8|zfYHGRIV8FR zg@-WsImzGaLQG}dcE_K1T5tVES(BN|mUj!RvX&hD0@9(jHEUjfJwMV#9^t~CAgxHV ze5HYS;q6E_#l&3N1NzP-2x~+#WuZ-qk;5Z>@v(8AB#1BdFZ}FieP?GiV|K;DuDXXG zy-Fe~X9;$2|01`qD+AH1z^fa$4iZpUXtbi@1UPhNwEwVs z*fGe}s<+h4FdA7!)h0|f$wo%0@DR$MZPkieP<@gXBna6C(k!l=R z5(}Pif`uU3MflVZ_hv>q!P#xu1O6}Le)gZ~iyl$UKtc`R`31Pyz_Uw5j|+Cf0Ct^v z1h~3+agnc}fy->$sJ_vme0H}cUUt{(`50Z%oIGB#mWCCh?ny~4k#6+Zdy+!|3Y69z z$TjdGkd&Nk^`7^KP^N?Bdz1R*_YDvdTlm8YIOwqofB71PNm3fc%t~fMt9wS&roo}} z7CYlmvcKDCDugq@9Tfaq4I~kgzuNvAt=E3VO4dSI8)T_^HGIHJ|hL5KB2y#?#-qwXGpM@uYt{Dw(q8n zYP?qx#*$Vs7(Wf5Ev@eLb&VRC+$dz~@l-eQ*Am4{pUzz)&qFx0&6FS$8XN9b*lJZ* zFT^_35hk;E@_f6)XCp>C43*hup1m1R30#t^#DQm%-ZE?j_nM#yMv`o1&J*9tR=L_5 zdZ(~nP_LIp7Yq1A#(6_p#NorVUVp%k2?~}U1T|1FUKXX!p}x48k(KB^bf*HOZ+0s^TQ>b?c7t-K}ZVN=TVRH?uTA`!52lu+}<% zL(Z*A(_Onw74b}m3BIEAmr2-g?zN0g(z`(*(?`M@BmlMcy(WAOq&g^6`)ZH7@ksmt z{8Z?nxdP#lz&%e!$ zO5y^c_M|y9rxSv^74~TcxbMYsQVhbYjcOBBHdY;NKH9iYZwffPtLvF2%@(#_`O}xu zu^M!3{&uumn1x;W{E%wzZFW+m+T zGjK@S5F@Ul;A|i^uO;!%o5UQ2@=N%zTrQA=m=PXe=7$(xK5>D^#Qp{>xc|DA6=_XV z|8&+mX{u}X-5Mc1wC@E3fEC3B!eAnMoyQ$LftJ0fdV`WO_@}|kJay^42xp{9AHKGz zm4x)-H!zuJ7q4Ig-<}$Y&;f%Q$NA*0ijiA^#K>+w1hdREcJND8FaCBwLiD>03alSG z&|AqS3UTd{9VEjvv&;GbcSiV9XIKf^fC}u+4CAW{U#@JT*%BcPyW*iS-~PB3YT$Q&2%edYqei6IXLNOvL4 z50qt^|0Rzb*X;vc`-|D?Y0i|dY+p;#oA^c12#K6Q+$If0h(iQk@ftKKss=;<$GrKtCPqi0ie_u1iheSQmJYgIb;SM}Frq5t-3a)( zHd2pCBR}CgI*!>{D}~6KGXX0^F%|RJs$Q=Epfr6CK;^JA{+mztSPauZ+oHdo zzuuJcGJy7*FX>+@BC3QYvgeRBe^3^hj_289|*znS9}_a9{FQq-)s!DP*|BWC8hg3sZF*Ne*=96b8o&aN8iG^lMoRva;n!m zKB+Nhp?Axs3VLJOue%F%$j0hXXd&96|O!*{bF{F``yQ`%=|z^RYv3TbnA zK>cgll$er0OrcOw)Lb(vAo@BIPE^O610%8L04EO{rg zv!Zvou&GK&3@`)6%0bGPi<~mUP>Z5HY`s2zvB^l2vn#R>8uP!~)= z6v$L|QDPba*d~286GV%6p{|0Z6k@22AaGd9Hj=cFtb2M* z$wIQ|H(OwQ$Lh6OdilKM*YCYwxtXKZIDg4@BcvN#?ETELjn?-HvWe!3z~S%x zuF;FiQRX!_6u2C`FaEkL&qoG6E2o>|e&@}x-t_ibNaV!!+5Jk*&ITuL1@=u|G4h3YOcIR#ljUyN~s2X59} zQ9>I^^I7Xy>cVtMC<0BQ^NrJjT3ag!Sn7@yH1DTD))WcS3NHYM92=MgB{> z-Bl4b$M0qJL()EGTaN%}ayB)x_zX)-27?@Fl6zc(GEW-fknn3!hF_R6v~-PYilPct z?wosCFi>oP{&%rv7v~M^7IN<3Z;f)Bcy8Tpn`FlW<1$i`CyuVt zfM*8s(My9qV=?=AAvTe4rnmW=Nks{yM{ZJp!=Qu%BrAh2xA@e=H?cgH_M0vq3njQs zj<(`!dvFKt-j@+2uu zDkt)AuHP>MGOcZCdmb~cOh(8jB`L7MZOXsx^>R|t!KV-?2 zce)x=&x<(uI|l7^9p!Yf1Ppi4hpgM7`$Hb==DnPV4i6VkUm{be&T9`ku*MuNGeX5e z_m(f37OGaE?KJ2VbkZMx!|bjfB0YG4R{O1mH2S% z<)>TDXShV&&C|jNc@qit!f8%N=g;@q=VWX-q$9+^Cgz)gW?7Df!C6WKg`Bv5$UPqV z`Z|-S=GvQ@oN6?7e)S>7FGEkgDm?y0GK5G1Qf{h27!8QYbchzavxST9K zBOzCNHYV__o`_+D>95FpDBtn6O$ zuJbc$m;^mKeaHW`;wiJxiwGy~B{4|5CjD7LUL3rIJ93Ul!{?I`F>Dr%j9!j>;b|2^ zS^0b(ckq9`sY=;tnNL-Wg7lba$}Vy`GfcyP|Dl5^pic1-E(e?7GL(AdQ|}=KOUVf{!jK@y3nj6d4NDkfZj& z+p+m^K}dLQCBN(ME7D+E)e-4dM`i4yf-htB3&MNzgM)CUl*D|QZ&-2+#0-Cqd-oCr zo$6~LInDTa9E^;kc^cXCE6n|p=|x%s2QjY`B;+oTPX#<%m&jd~K65`!J=48kxn4#A zFb^8gMp~U%kAqTI#6@18fYBE1?-0`^;3X==$-J6=H@R&-1v@ams~r2<>nMyK0gNc- za*kpw|3oAjAYly{EI;nvkT>tOFokKejpJD0um*9CfdAKkstxT_l2Ok>S=CUyMPkoj zWsbMRecKguJ{)>2D-JjgD+7t(Q;t?x+pX7Qoy|v@g{_=%|BSLYrif%zHESlRiGQ%V zAJ(uI9WhWWr0ss$QVy?y`7*Wc*g1lJwG<18{w_|BPjB0fUdd*adtFp*2OL@Z6)$&& zHkKANJMug{) zWUk&Z zddQHg~E!H=fE z?l`Dws1E^&f$sWn$T?wPzQT69P~ue_s|EatPsRKTsHTGOlfTI{%Lcu{(iPZbF?fuBnY~w236YWv?I6sn9l4JwLw;VTY zdDXEb~_)9*t^*F+!Pe#JczEInss54_hZTiEAx}dKAlbwH-B3a+HrwnWsZNdaZ3xP9kFrXXN8R+ z!$P`mR1)m8<$Z+<)r7a1{~q<5OoD>C2<^7c`^6+xNf+?d1Fxfg1bew3nD?q$NwQt- zO)CGa&Odlib1IsH8E!U544_~mDjjw^@Z;%d=b;Z8S>Jd;8;MI!K5N93_EEOzt{CjZ z-+vi4g{#O@r5os>X>IC=;PKq~flY|5=Tl$Chs+b$nAQIh3`?=j&ro^S>gy8KR93De z0BPUvj+C>!4wg1r+pi3C$!zPT8#)!+Bg2dW?qhfw+-pAm+fO6pHOU3^kkVb6bAlZ% ze>HIym();&V94sdT*_WZk2d6bs)yCVT{F9IfPfV3Q=n{kl)YaG{LFt2T@5-2Ai{;}Sp8afY zO{AQL*gR~!U!!#K5)@Wv4d#H@3bQ4#GJT!3nexn-aRg66nBtcezUX!474>=blW<_C zvaFvyoyg5^S-(wL%X+qNTBSj~Aj1O;ZmqZ)#s1sYH3Vr=~GJm!C=KorGj#Q1`9Xz(nhZf&^e z4x6i`nhl#K*Nsz;%*fvb-A;vx7_!+8om&EKNW4#GIu5BZfnr(OVA7v*a>FPq6=C$G zgjc#%qL;Rp+_s5wZN!ov3}>>jwWDBi7AbRIrK>%_2rk4@X%TWF_Hs39TO#OE>zAnX z@IGjgtQ!kB0ez4~ja|v5lyiEntvg`pnu8|wNFk8Lbyt6v12d$)L9W&-b-Pg3{O9gu zl_&sqRjXcRPGi>0FesU>-2Vxc^=;zYSLkMyXIZOmT8@lNVuSRkV;X|kc8Es6hvNKT}Qt#cQ!Q=<~e~g2{~IT ztco^EWAi=D-jWzHzD{6F8WXU|U<-8%G(E=YUu5Lg$*@A9v>-kx6|3?{2BA@H_^+9>0P7T{=W!DI4 zP})1@=DcgH3_@6moa z;ufB?2dv8_CV;-jKU)ea-_>4swZGuYx&q&yYd}N%3Xu`&_&Z{(mcpw0m!rxJ1$W`= zT{wB9n45sgkP}N?6gzRVuh8B>GLtJrUJ9ln!P$BZ$J)ho81X$=7$S4U!mM)Q8R(Xy zSb_s7E)PnyA0r&EC z9t_#Da0hu)Pc~Lt?h-5fzpK2QM89P*lYk8MXLx)Mo&m<>ogFUfHI_Z@=`My+JDLx5 zG~VWm@hO5pvQbICNL`~(|KlkI>!iN&rP)>NwFAjVq7j(v@|f`1S(Ag0oAly9iw^U!C1CK{pBK{08|$41xx1bg!sH9*HoxAL+vEw($jZMZ?Bp zx~^{0=$uXLFB1E9@TfKT{H-A=b9n-!J(bLOx;1uwp0hDcv0;vyMi111cL8rtTn~M%V$dB``F1fZkNV( zkz6OJx>}{DU)xv42a<3_hDoX0X%s`}dQWc#xHaF01_6^C(I>JgIZF9knZMRG_mjkw z#4$U4tX(>`o{(YO8d*!hGW@|U{_3%_3i%GvUU|o6HSbByk_Ik(|H?7=KQCVE0W3XH z9E3waJC}Dr`S$@0;(W~;!&VCNe`=9t(09;1zRgK;2nVzP(oqqhf^M-~g!tk&^d6;<>7tPsF zfUpO#UH+C`nTAO3p3qQuxm0TEpf9sc4i+S{7P{$R0bUmH{ ze{hrX^79%?P}Qa_dG4tq+{34!Ge`%|o&fzRn@sn<@WniFklog)s^)(4*2el%Z|0gO zwsJ30l?W`Urq=DmcG%n;vNitf{{ULe$-S)o!^znG^GbNNJ8Yj=3uP+OO8!MfP}!m} z*(ZZSn!FrcUdSSbC3!uL@no-Ic6?mtQ3FE%Rz?N?8ogNp+3yNnGhHxNXKZcPf z_~erLG^vQl%$)X7N#A>~@b9%x_wiuWgABO!FdDDs?=ytY`B!X?vc&#nX_GVgp`W0p zW2a&m{|?O3%rRa~HwNc*OAqJ)uRWL~4mSL}S||;jM~3wit}RHlMDFa))6Nqq`xQX_ zseNZ)IhP($@meglj#JoTha7Jv#lEOb zpu48FmrqWNcGddsq>MmWN2ewKx0yaZF8fG49bdXC)cP}$8 zq9;{GR#Kv2wroA&u9+Q*0Ud{-O2!JIQuXLj5mWygM4_IjnP`?B3+hhx`C6$*b!da) zjkZ{6rmS0DQ~rc7bgmYeGGIKn17)Eu*=u$oeLx650&1l1Y=@q;Dc*FNZ6<`=L6S~3quIk%C-br#<*5<{ae%ruy^8TspR zjA8;J@`oWQKz(-VMw*~|`spMV-Z~~pTlY?G_z3Mrar~o1wP+3`@4Ar{C-{Q>r7f{l z@yaCoCU@AJMuPG6K))^i~+fQk1j2FwQ#K%wgSP*Wa0Lp}8S-sZ05eR@LeW>Jc z9bS)uR7JazBqstx37h=rONL;Ew{U*hnX(PP(YRkRllK*mnBuLc>aW29c}jI{VNXA) zb7Mj*m-MU_sBFCO?ozZrI?Dg?6~B6+|5{0EWS=K2{t@>gdho)ZVsDn3AZ?=rrkpXp z21?PP9Ei6a^IXA2 z4wrhA4ZN_atwL{)Js;al7uY6d_b5EAjolW89ZWDM{vO5$N3U|cMi+6-q!y(NU>E>S zrlH4M6u8PRAx*CedWx!}{10(C)Qawx`W$3h+8EOj0PxD9TrMj5ip=FFaMIb4ELzFJ zpKT!6ZEK>RxA@T2KgzcbHkH&cO{JC|X_lJ5BVG$5AZ4r}ta0yMJ~sS_G= z+ii8m#NR@#BNs|j^3jywaC=5!O}KIo-eyXhgDw22q;f1s0jJ)Lx{)MsIrnHdOa&!G zs4hN%@PcL7p3Zp82Mcoxt%A`B{!coQO>nJo3{S^wj96=3k2!s;4nXx|C6ZK$YGPli z>$2}tVglFbVSyt9D~s-F9~**Z>S7@LQXG;^XyUQ8w_EJ)=m=@%={GdL>-jLbp%WZn zJeV=qttlMbeg?y6stz8NSPJu>y5}x?rf*P`JkYAZnh}tO-kn^yTa0-b6eM#ULL^1t zL{szDc{96=2rVSs^j`AG`_(~iq+yvOaS0|`5)xpPmO9p_hb3ohUdj&=OeA<~j?5C` zKm8bPkHj%Z(3Hgk>2Ba|;WaF;PLMr()i>t{YDbZmL(>bNl0$Nb&I>omiT{)}E3 zyjz@Bd#!^@|}n4JrInP~-}>jszw2`2{ZRQUd~WKSa|-fF2Zf zl{=Y(6DJF_LOLx@Cva%+A+F+u5%Zwy9nin^(vX-+G3N?h!OH+J%{oSG9yGwM5nacg zV92;}wvi)N`PUIP?pO5wId<`F1O;9-VJvt-rzE3X1SkmdKmU!D$!qRSQTtFDINcIq zMj1k!^JQ&T}AKKZA;jwEv0Kg;i{Fa4*68@3dLSy6FAdkk_ARA$E& z?^E*ku+R~x(Gs7<#sFx35EG*2Yyu7kgu4?Es%*;egQOviL&97z4;KJNfP1v%RPoFC z$s?^==CFem#U2GJO5?mK8!Z%8aY~zR{ zI*<~UAfFxsJmN0*9N`mFW^@7v`HgZ{5_7-_@_QHaV$4R*n+Pu%6*j@>90)u~l{uiW z)V2gU!=BsuZxn{2?R+3{rs?KuaYJaDr{8k<&XX*^Ny>97#sG`cRb-N|bweUvbO3$v z#_0vY^?Rq^ik}HJVqhr~Yd~JIY<$Q0n_nhkx?VVmD!`F%h0d)wavBD0YR;q_qEP+!7vMJgzwHJ;*ZUShdU^nP({CLSJ#+@mq5MPf`g9aBs zoL7-z`#1j!-98ZJ*`xn(4?f0NFmkWdM8jG!OaA>XSL+NP%<*a{ zxvvfa;q8qxTu+*_YACjOD2%=eWIA*UUflR|bM-xwaQ=U)dd-1CglH$Zf| z8|tk%x#;9TCTleO3J=MI99R&_@Z5;u>EQRuFF2$ewU>VAbD|(`j@SEJIc$f2k5krQ zuW51PYO^l5LxPv>f5a^^(Mx+2eJ4%|koco;@Y(3Q3N>f94 z?WotcczV7FZjHAd-ISWA&>guHjwW^k78k@EJM;-)An|}|v4POo%^0kZ9kPZkeQs$0u zKhINR6QyA&-Am;c1&Q`w9F2Y|Z@WNsVao>}p~CH^x9U7Nb#BV>yKd!Iemf^G6E^6H zqwEqlH}U^ySEL>yx{v<#Z&h(tm@xx2)ZPD%+pn;Xm$&qC6_WWrR0em>)Xvn741 zf%|r{;pJ*Q;1v&d0XQ<6`K+TF=avQ;`Sf!5G}1(@daY&;rVSjEuVe6}QsJ{C-nwZC zAX{~5oztH1mU_HA9#@`krx$K^VKFniV9kB{=3@q*YjzS9-n)J=8m4pi9q?>5jGTV5 z=4Ysi&0^!(P##J++xCGFA6QIp-gpJA9)pKNEBhbZozs#iTC^q0wr$(CZQHhO+qP}n zcGWK1w%O-KbidvY=s#F5D`IM7e(h$6t~tHm$a@{I2QjE*Qmg<{ZBAm3rdp)U*<~5# zwKIXxYMQyR=|2Y(qcciFRSl?!w&*EGS*lPNP4x+UmRp^-stWF5$V}Jmv}Dp|(GX{2yTV2EGeqxXcN(vL(pDkUdd^#>pbo6-Dg^Tla^5{GLmxVWgbFzkV z6q$U0=?NCwmk|_;y18ef zI?Bo#ApU3BbNna`d(fT)KnZXRpj;|8NHC3 zr9%0ZkIR<)l{5EoVbFF_(tPKp*I*VdtJ8t;x-S+^$~Cy|=JC}ok`a#23wuIX*aUK& z7f4n(-Ojt16D1SfEcGQkFisnKAu#I@A5)g;gcgauu0kN|xb$&o@ji3@cg;kIPkr(p z=S>U9X~usF_#;Q>^r;xNgW@RoCUuBw98oc=XVC)GU8^Ka4W*aQLbv{>>Mts(PP7x7 zFv6X{zKQKm02Bov@-ZI0Y5G(v&>^P>#y(0Vg(6#@o?<{MRyY{iN@263_p-k?!4jz> zdSiGo6M9-rr3}Ph|4obJy`9yS!+7sK~~ngA@7b%2INvGnkrL)dOu z%k4dwa-fX0ox`<$AQ6fd0Two7pz<5t7f%k^5sa|}FGr?JV0!5T{^2s;uR?R2f3SH= zSJp<|s#1cmQ}z(9mu?DG)bg$-;ir~S$i~!zdvbizgRHpO5J$LJnKn# zmPqMs@+{AR5?NCvn{V`}le1Y~(SN%^Qq872!Xf@cW8%k>L1@4~r4ENK;V?({b5J@@ zKU;tN-j-HEax})uuIVV3n!nO%6&~zqmY}dr!iKO`I4}_SOATB1)BJhFF#xe?1={Ql z_?XOFxP+CRvk2_xLp6jhuUAcG!)2%|)O&ybtEt%&xN0Q0cug-#a#icv@{+*+?q)~G zD?+eys#bxy6PIa~N0|%=86rY}2DzDlT^ELSV6GKj!W?bDMUkNySzW-0b40%E5`bYv z)~LO779<31ED8Uz(oa)JEhpOccjd=tnOds5F-e>t|R2nLOs)n zWG|A*V}oL;?}p+eZfdQGFUD}*-5+PvURH4%bPqmikUUsDmmSZu?|jsB3nMzxG+!T{ z*aG>d-eBQcCt4sIWiIjrO#_=4UD0;^-b{n8xm2rs|C_Ho#Le$Hb#2VKzmm0J0TbVp znpuFMk2;%poc7O&vv4qfh!Ouct6+!&w89=PWT zh$ExiZPMf{sGN={dErutq~i071MJ$qDikLt)Yrold^VLhjWUg7iEU&oYp&F6rGt>b zMjvBjYq~cDOo^!vB|n1OYd7cy=~NVkc6(~$UFGl4Md(<`)JGBTjx(SIoI~}tqkD*w zC%%J%%!8K+N?*gT3aPlRBvkwoJ(C7UpnO@6LNH*5>rFtl{5HC=6ypchDlRa_EI!#A zo9|1#fmONTr;>eVtckbqI^n2~E{O-8nvIat)+oi-{xGe8v;TsaaR??~bAp(nOevN~ zOfEw?4;K!SxSxNh(qiZhWD@#?A|vg2iuSeniF#y_YEkrvEWYr{>TrM9$BcFgVD-`) zwMBDVfKvlP78U`@Rs=-t+HR$`MuHlE9&i4kkXU4spnvvy&GKL`N8)uL1`KXr#c}Mb zwYRkNw5bXxwG%rW7mGpk&60=L{Br^5U|a`I;bg6sM7UWhwg27mmBKh>BRKO!oNwl28EW!W4nuXyMIY*o7w|XGZ#yaEDj_=i6 zir?UCs5NE0L4J&nN>3wJ?5-aJAr~0kv+}aCW%6IkD}r=Y0t+}-cNEa~msLZK*C)4? zM?^ftLRgfV(TS{PSqF#l83ItCDciwss%< zS=o!}x~1^c!lVf-dFKf?G00a@!RK=Mm3!ji+ZKS?%8I>@o?%w7dl79g)zT{(yH=fa zS*GG0M9Og5V$s`>9$T-2#`ST9_dYb`0fp|`>>WWuszIt862+W6Lkt`BshRjBeXkl z8|BY6QMeBsAw}4tw%*xj3a(~+H|uAk_&F7kv{%Pb;OHUn#SKFe~%sL z4ANNks10l@a(#v()98al|A=2eI@Dpr#;}hZHK@UvkdXcoI6ch1y#pJwG9V}l)rroX(C>kYg{BCJudxIOPD2OobsbQyt7MiRM)uiVJ00~7uCbS zo)R8fODj@-vMhE)65uA|giAI}`iJ`R>2`0ICxE(H1_p>TKIKe;{|NSYY{W^~k>v=Q z3zeSKAf_(ydA)75X7M$)>4&JhI^395k)hIoY=Edo4psh>sdLDi0BRq$O$_xvMPBerYolMO!iy2z&1~VXrN( z=<@-V>>7~A;Qy&yVS>Qx5*}3liS2V@$)T=xp=#f4^1$79QVH)3N>+w{m2%0^WAiDG z@i{fvk)CWv37n#v4&|1)p73FIL-*|y8_eh5cj~cl522>;S0{Zr@T(2v_|w!FXt`hv zm(F5;h~R2AK~y5n*fNtTy*lK0eS_KU1(cTT*piihaPI?Aa@;dWSwD$^CIOcTSuLoi z430>gnq>}{fsZziQ*+2u{tG(h9}|M@EX^NC?n=OINDJmZKD(ch*S)`5jwirz#o1U@ zH&4KCY{p%t(+%-JMOh9?QR>mK?vJ>JX8G7*%ua-Xue?UOHP|}9xCaum6Z|253uQ$I zcb@Fo|IjcU?|%;6#~Q^>oqA<2VCRS?S~6qp0RvDi^=|RWnHm;*pQO1%tK`@U#sO7M zH$oHk&9c`*P>2-7kBf8mP;kd1%ay)uBN(3szE2C;l1WoMOJorTJigOU zGMC<<=kP`m8b(9w%0ws5t4US?z1`B1F8@BP(|lWjr|9z+RHq_@lHQS{`sOywW4r`b z+T$ZVxjh*6gUJvhDYvM28=hNRmo(NcLX-bkJVJ&oo6V%~#YJ@uG3T`@lH$aC`5Ouk;afAsIY$o$mIa&OmC56j-@TM_3(!uB=$RR8J;JDm zh=5J2ZCaQqgtN4UbIs4#L~zj3v`74z=TTu8O>*hQKA$+0newd=ixnBo;?3s85nQEL zUADSRNyRQXZ>hX;j>Q_0V?~XdenUGTIn%r`KWT$2Jzj})Qj3heg4EoiYL)QS(Q^eS z=!|KX8JXq-4$=~>gq4~3)DYr?VloQ(Cj8&i20kp+DvFsjDy}CUvrMDHoFA26zKH1R z7p4MG%n}ATKi0=1h>p2UC^x_(VHbBjZ@a;;RVSncSL3n4Oh*)gzj`$Z@qBPTdI6TQ z!q@iM;+fQz`XkF&IbtZ1y(xq(7{6|^TjHhRK~ZEN$NLvV=-34~u_cDF5l{l5)YKoY z-rMIBNKYV-ApKd#FGEvy4hy+1!9|`zVC0%WBy0V%SYiTtRVS+gS5| zL`x?KnDbFrnfC4AeWo&@OJf5Ic*Jl*2cU~#sn71}0^@lI1>jP><{BvXSE2Aydd zN-#fT zDqO(Ughkugs$*Pu`1;Ip>dm04&Cm(b(#3Yl_xgie z*g024?E?Opr@0q4eNJfv;tqbU!oOAxkv%p`V_ zvyQvI3g^wWi{!ZZFsw5xq);apX?v2290b|>z;aQqyEbpY0ZT2}0jeK57C@|K1=aFd z<6U-;eufAJofLcGcZ@vxdgZg*>dW^xeaQ3`d5iJ8JvA zNe0n4gNqTR$v8Kr6?#rF1Robfd$Kxm8=p^I3f6;w3~4(5ZK40#wqcUv%O+EFNjL*t zQIGV&euO5-`#h7SavQhvo~OA0_F|O5i{jtDB6w`A_h?<-X2LoPYJtqGHMExc^IIK! zJ$gexAKP*Wf9W6|@AXKMhuRntrP?+Hd+Wk<522PgfRykOJVlRYjiI1G6(SVi$;hoWoqj&14(_kL_LBBZ3G!ae@m7+H2oWi5Y| z4?FcvkYpGnZG(b8_*EcaI8<$bK|1(f4k-MOb{RwFN1Lk)?g;lpoqD^cLsFT~h1dSZ zSwlVBqBH2c=ca8S6K=nn1paV#B}G6X5-e2(?Y3*J!5jXhr9L(~otEQR(;vB!T~Ex) z{)pqil_HrIUn8{s_9&ruwvv zv}r;5u@DUqa6nVbTCjN4Ah!tZ794|8VCbXee%wgeN0i%AlKb9_>*Hb$U8tcv`u5^7U7}472zgao zT-SaW76(Ch-#UG*vArbuuxleS{Qz5O_1Ba_BFU~421h()NukzWVN(JSHkLM zwGF=r;XG)eH@rryc0$TYeZ#RDvm3&bc=St=b5VXGBAZMZj_TgmprSayU6Rfpy zvb|sMH}k~j0^+!#aT+^9yYVp(%5FSMagB@ESQHJTE8#ixYup1v5d$Y6bHfRyA1t08 zijXYbKjx<`@^nVG0>!yNVvII*h@6V%?4Ht+pJ_}yu&L2wJwI={||cO2MFy?V3{^c$lT8J>`e$NN7Yx)uw7d@n(*h`I_wyrJ0#E=wF92_6x*1g$ zlx)aj_jbi|L%!4EPgk}r%@IB=xAsf)rYL1ee&Fqt0!0A9;Mq=~*RDQ=WIn-%uo;`? zfE1?N?SVmnMKSL-)~;I#1Oqn-@F&}*)ckW_Q+-lSO6UwtHMW)?VfaojJ*i~aek_%d z$Nkm`*mo<^9RQ=W8KdS;qxx3?Ac{P1g%!U{bqYAwLQA z`8vb}w%0m^#r@;iN?o{C>3!b38)k<~gJW00E|!Bxu}#QLnQY%x19PaTv<{VFYGox9 zBcEHJ3uq!%xlzz_Rr0?fI>ll5O1OaHt5Ss8?ikE0&EE0h)I&id48@<@g?x#J9%}_B zh`u3t_q)`n_O@h9 zNQ;sj5=5d&nBDz}X!NObHK`lFOVrKR?`hk=W?;%f&3(X3ug8`7-TEgC#=J+(L^XEO zhmaYeUS+5s78msG9@n*C&=&E8OY~(mBX`o3<#=qH!7?{(OPM&{nEpC42XJ%A;OSGDk#8GtMq zx`Dm|9g0-5QZqb4CmE%zJ6D=XkeGch`@;B0y5l|}w4?>`h_F*qJo30v4_UZ%$UY&% zzGPkO;$+El(+V-l$o)sknleiOfFs9enKA@_mJH2rEQ=@n2LZtK!FEOhZB7%J0?)k8m08yd0!LQ%(1 zNP_Y|QUljb+FjVdyTxsZ-4fAiee|DN86pBBxGEQ&faEu$`E$_7=+q;@$zsYj6N6<3 zj>bL2JTVHlkC~Pk$qU~lqaPAcPqE4CO@WHqaf+8$!b$b_Rq%KNRf7!BU&u#%vJS@* zK$?;>(YwDjEo>Ceci7{0r|^?aVD>8@NKn%NTH1_?7~!{RU2}tS<`0>E9g6XyeE_6r z7TjzmS>cCCQvbQfLB0}~-+)~o*N+J0=gcQ{(ibc3d8`|L$D61Shf3<^O~=7Y2~KU@ zZMnZv7rcTJ7RZYR$c2;{|A=k^HzWn?&cO~6UInEys?FJci~3Lm zJ4dLsf`_X?6&>zp6#r&nwcX5oVCnvOb2Ukqef!!vZa_|Oym`MSz97D+4={6jtAbAF z_b)qY8_5ttI^dEgP8lR(PUD%48bYLtu|%=(A_W+=hs({sCB1UWq3jgT32$e`UPO3i zdWg3p={j^4ez6%*vC>WJ#Ka=n-$N@zX=GuOuy~+lg9AUP?;WPEQV{8nd8zzC;OC;a zfbs17oDu3nvCS{Y5*-C_AYs%gP-^grx1N-f%>WepGdyF%$G6Z|U)YjMIrbQ25Y0A! z_HN#s53%%Iqg<&HD21~ z_?G*MtuA>e6ToW0jZ*c;Q6NB1mR%FF=wMv;~ty*a1GZ@S&9;hP&Bxj-kNM(b&G~l zL65$i#g16XdLzhy+Pf!d*3CJ>!R?@ctsDo46=qH6c*M^rERa5=92XMh|UO9LuwiT-?{Q9A*?7D_d(+JUvaZg>a#+fVYFk&6ls^j z92)JIV78Fq=g02};Xm9-MP;fqi`m)U5&d5ZUx7m8`R!!}a{$+x$Jg-wDQc!m1W=ZL z_ss1D(mT(+Ov=ArA9Y;v#VwE7aY$y+1|!8qnB$Amh_d*>yv5Tk$&Dw-)N6P)(2|?C zCF^z2UygJm43Gq{z^XwQ=!%cBo|df!-olEL<+iWC=`-%hHeN9JA`adN0A;&ajoVV zC`Ub==$4^J3CG-aL=d(fHnKvgNB4M$5N!9qUpH&K1O(Z1P$ah-!V?0*KOlF!Zhr7> z@$Oc-OuHpE`j_YnfB#JA=|G8Idn?_7G$cme-i=i4VJdtXzYY|*^6vMcFw6#A-4{1T z9H=u|iC)}9@#j4iQjrPVfLRlhGc+%LzslY~8C{mAYz=<9e(ha<30$+OeL0mEv3=qK zHb=@MvvJYg8;DaN8IH=qPLz{74%^R?)*d%(COka8Ca#c?K-Fj?ox8G+({ok>pfANd zJ-3kr#mB0i$J!-OiHL^S$;KhyF$0t4m`7JSiPP(e@S;51)~;=jZvoHs7$rh#!Vb3B;I0LR~8 zTgIO=DUSx#YjR3+OZ1qgdHM5hC6qf}r&4bLGr&61SVs2lGmlX#C?f8Vw$>NI$$H!& z_pINo;(~r~wyOJB78X_z&oCa1)?W)*119*V#ir;Ov=%S&6)pbOET{0Fy6yUs{qfI^ zs%@46CF_uAW=g_!Ha}l-1GJa@ zskecfwP5x2M%M)})b1yk6hj`U*V$42l$0Um^O^ngb;|*{+MOw_8HedpLatcM5kTvJ z;R58iseX2JhO5?)rBf5*LQecVZQRR(*4H66(G$<7i<`dbse>qm2z0C+9hC`nbUud9 zL+3A=WgMQM+cPpLAF=3A4z)pZ3`WuUDQYZow|EHPJlJkB^XcNXggux)gC1#;wIcAg zy~~?<=nS(wgPC+35jRezai~4STt$~!$_;uff%h~}q((+UmJ7`)1;z1%{&S3qj^YzA z=9#gHsFyvqveb_a#LS}!U!x{A{#FN((5gyUXt%nZei8nT351Wb0J@r>&PJhT`U?73 zL48;8J>zaB748yF1ZP$rjZk7R!-Tk{Mw6UbB=HiU{amSdnz9qs(a&{;TTR3zD*}mp zs6#IjO6ChI;P#PWyt&Lp>I?$Jm|9^^{@#~H1Yt$}8A{)&Oy$$NqOsiAxjtxmBGhUG zG4XH@{;nv}C_QQUuQ+@OoJ-ASWJx@i8)78W$CqB6#euhcNBs!}4*V8=;c!E*BQ3UL zeu9p);JJnQVUj=?trucZ%HFF?ufOH1f&R(w+Df#!PwnMx?;A*LsVLLTUtRLAdvy;V zT%UE`nMn%a?3=E8jZ%n3tvrBHQ5Ntd0&c?onhpUxVe-#S_J0wL@T5@u8$aN>Z$^WO zJ07O{A0NB*-L-y+zJq9>G0YoP4#+6Te|6X=#sA+t9WaXjrFJY+{J*uM5DL$KJRRmr zAVNlVSmC0@ge)0wTS_tdjBqs_GozaQJ{=$nF5xBBN_DV-Fq$PA_a#Ck2LBP8Za%arr z9}gIY)K-V$`d``De}W7AqVeqeZJPOSPD((1Zi@lcZEpIJY)6`M2iGG+gPBHK6@;7S z&b@$rcq4iE!7xLS#;Vu>Savhh4v9^#Ddn*Q^gI+#D1C4VQhz0xAP%OB`QafG;d1_K zin)B^ETjuW@krxT`?)ztsV0M|j90n+@jrHDQu!Dl3PO~?pQ{kJWeCIkzJp-QY+DMfW%mv9+etd~Yz zto`qDp*kT54zAJ@^V(~7UJ^^!*=&ogsps0G2lrA|+ZIPQz+PG%09|D9 z$F+g}=ev+Bhrcj;&v0{rH&%UP%{|uvu8_$;UUVlMn4)rA z+x|5aUvs+k33#FBuQ_)?MVH&d!{dl^b1SCXtyf)WoSf}O1V(9vC`fEH`D#}kQxf<@ zlQUI-1Z3+3spS4?4T8lMz=e~JzzN6E6ejBfiu9P#Hgl1-*8}9?)*@Zx&x(W z+CxT&WdxIUy2qUaVEZ-rPI{N7+=Rt{_0!yQ7X3WCv-Yg3Q0thy)%K5_Q$|?%oK}HD zUUd(`;-giE`=HnifIeBq2E22h7lhMnt)+9N7gzD%GBGSb4GSoIf(cT>L z0WST0w70;U9O5mAWlPv zu&aS@uE6!5uH5fe@BC<|bY4Kle{I@FZLU7dIB*|pNc(=`%E(z%WGIeR+`Wh=P$^RI zrGCzX`du5hpUEEWnkIu0)zB7F9{AGx!|aY-xPnp}zN5@t9M@WsCRl`D zBCCmF%XiC-ZS0{{=HG{zBS6~E{2`rr2Y)oK*09ExIW>vGoYP=?UTxO2+Y`jnroNb@ z5mZgGENqsb8)Y+DSn*H_pR6$P>5=@Zl1%v5oLhinK5}FWQgV_<`MU*Rcfa)o7jfOU zySwGtbf0v8^7B6;({`foX#xj=dN-ZET8&qYuhF)d-+6e82p&g#b}gfyEMkS)VoPMp zwnh@8Ui1RStMIMC{Eo!9-2P>R*63Zt#H*IpnCfuu^xDpd*MyRkthd7iObD?Z{Ef&D0gy34A0@BX2CE+FqSs#MZjF z{(NW|pcr}wi9bI@wT~Xx7d)#5QF*LBEQL>YT6&vgQ5ew-2KYL?1ej3Qw2?(1pjou1 zg+}UjVb}HmcT7ihui*Z>x1#06Zd=6I9RU2h3pBH`vpux-Hs7ioaB#>p#w8*oHAX~z zMRDH+WIT}G7dKq6x8gptK;7a|8xlW zXNf)t)X64t2IbAu^7G1yE7s5RC4IxabNMO=<^`-hh$OCW<7RqK4r^UIZBo9BGElwP zxN!fwn(}0BK9Y{gTeQI=IF_RJ(ePZ{FRLnn-;eS{&Tj%Ivubs6#6hj zQST-bq*mC{;L2fQ~EF5!dXpDYc2l8;$w20wpX|^O5A-QXo1(gpc-{mWiA7 zdSVE@wGJ@bwT8_9Oe>03xgFA6x|V%T3t7jdaOK$%19PX{u!VONCUFP@t7R)X1uaLkz*1c#=jG)++a#EDlm)wpa_13>C9gLV->X(8;LWHn$shiSHDB&BX z?ah>A05w1=?YrQ1>=loEQ?_^T(RRdLJEAgVjVUJL8%lVEtCUG6i}(9VAcdxY{()sN zGtG0+T;KhLVz)sEydGI-?j!sCrd@>i3QU^jVb4T@)22$%V>!{2Q>`eF>&W!D`Yh@} zs7QoPVWM~=uw#`fHOM80PaXp>@o(1E7$6At$#yugin4ZE!O}CN4+$gDERSW_R1gEZ z9NvmYSP?XDeM}N>hjp8mx99$jxxLG)Qh)vP3m1qx`Gg}wn^+8VOa7NulLK+|@;6zu z=tQTYLnf{7GhdPgNufEu5IoUW_9b_H!$1PbmnVp=EeUaTKu*H$rjQo)UsGV~{EFbh zY)OEs-pm?!vDB71)K(9SKYjjX6=cgQ+5b|}eUjV$Ax(G~Fz%`2?{en{GRw19{mk!K z($?1YF?q02+uV-fdP|s|8x{NCC|ZP0{HD;tVZdR+iqE;-+Y{3N$Gt2?D0o95mQbS& zugu>8Bc)dv?HBN?0O=oAeUH|HwHu~cUkzO5>H=x|eA#vUCy=dTB%VoX$HUw>N(s?X zUi*Ba)^V!!oc|=seheDy3gI#Z$$=An(uRLu-AoReP=nwJe|LH)`XK2~QpPGXJweF9>Y{$U)316>{J>!q#e+~C`UlaF; z5!;`n@aMsLLjuAqB8#}ouF~tjD(OD8`%oCOYA9m744v+cnVZlJRdRO@QPz`DG>BOv z5N*o-fImQViv=sRAWm8RuVAmyyr`Ci8|Qj(k_W{fkW8Tf!ovT&SMmRvVV;9`kJ9?) z%p4`*JXRXT$fIcR0);~z88C45#(!ca^PFz(agSxV1e__41DXM}<1kS8u$thvhdcvY z3)_JF93!EViKV<;C!n*nQZY!j8#0;>1P%EVBDz{TUYVNorVXFl5qyr)7sneKmVjix z_yb%)i;C4}35;b?HNCjknGm4d@}S{#S3eV!`pv~5Q@sC86E0T>wGoSrM1zbSrph+> zH?5xCLQ>jNv@j0ECQP(JMgSHegElJzi@?>YpPIIf-fVS?$7UD9pd_4z3-SlvkgFM_ z*kYwRO?IMI9~Asf{%Z;cmI?#T^@dD?CgDW|r~%xCuR>A(H{a zc;wsk1n~pJxpOb}$NBVQpk5W&GDjgNExEpwacaQS^!*usPn(STy^)Kht35mC2Q1Q< z8!(OVDHG9;a{E^tU~H1`rS0wh1p+Y~=RHy$H9}`ylX8wta=+HYpSuX%!L(F0j|(!p zR%?XO^R;18AWFI**Gx=_i{bYv*p;4(2(K>XEM^dAKr&THWdGYDRK_qWl&+QoXogRT zZ@;Qt@mHAtc`Ro6MxY7aC(&P7810sTW&x~zm+CWJB-667@=OH&XCGf;Ct=wkgz!RH zZCp5xS=Cc|yJU%W{YRVXG<^W-J>%g7`QJhc7uO>j(y?)S(^~$P;rJMo8#WmMnITz_ z^nCdrC`&^o3?&NRY)1(v^5GecYDluLM^&*M>%KN8Q`j9-bYzv8v*qeffOxErgNHAg zw9$P10O`#?$7q&MvT3;W7F%Bet*^J6)=|V)HmWnD!J5*CkPlOy+E>sIVHh5HdY9`$ zPV1Fe0wx$1%;;&_Y8*>nzV8{-E_4+ZKx`LN++m~(V9<0KEZLpn1G4lVAn-zV=Ybf; zk$Ot}h;kEk!zOlWtVPLL{LPR}Tx_DF@}&o3%XvL^yn_sO3>dno7au(>EhffT=w=g9 zgc1gZm`Fb%mMP?UUt|^6bm}q6c$}~bCVEj;txoU z@&)T2+`URPJlSP&(oiKbcLab3)e%j*Vly;yh;v2z>z>!F+_5{`L<+j z7=Ntb#A9Hjh)qqKYxtSB#?Y#Dl8gh#-sL2iy+=tGLX%`Rf@AU!+`<7+0)?}ee{U;a z(54E;Pl+G2;eMg(r?f#v(o|6%IWE8Mms1z-l|?CPP*gHTZ9Ttcr_BZiWFF%BzM^Dh z=bvq}e$tSS6w-Ry|zQSk+Z$pqsH>P)!s~=`i6x;{>can~OQ7tGl>FNYU3~OkAVd%Deua z!0t)ij#63kG54)bmhLQR2I>ls4=>K!FoU<%UMm_c6DVk%Y!rB~bHX|QVozi((%*1_ zgF@2Y&C+PhW-%hJ_;f^A*dM*ZYx1}lo!7M)SHWcvDRmBa=LT~1{-tdw=xj{PNbWl~ zYX;bZs|J(ITqwL9fIr3+$F@`ZLXoqE^cTVt6r5QUCw{-&3h!s=rFLq9Vo;E*msa&y zeTi-El2ES(-6J!Y^Yh!ZI^B|$>&+Rh3PL~zP!g4(OgcQOs5OsfOO}&DugB4^w1iRd zd5eddsfL~L1L}IT4Tq0Yh6r?Mt8!tQloO5apjx}CzGdR&BbIzHMYqj2X?6c6_AYi3 zrwh9mrid6`Afo8U7~4KFSrddQeKb}NOMY@d5n2*`zEF|T_EflrgX3~uy5#vdNy<+L zO$K~(xj=wVF!$t|(0>P$*+N;-exWrWMcucrUP`h&9)H^c@~Qv#Ppn?~Oc4q{BYVE_ zzk3O^2*Fh226ftITEK`nvd;-I>^-aKZxuNNZlCFMQ_6p3u4=&K?dWp8cs>7^}D<@>zdNW6_FEU#JMco*sYg`Ofmq!sAW*DUVMu0ixrCRkh*GN)Qau`Y8?V{5=qs+8Vq-mbCT zxTy^N>*a>preN@sAvb)H)=NUo^63z42NcLRecn?jR(bow^yl8iARO zWiSk65q;X2&65P&hPC28UdJ~QWQkDV;bu(1wj29)3_(D>^YWm{JJl~jCls0QeA=<3 z_@6K9gT|>~bl^Coqz;@wxW6v&p3=jbWa%g>v`)zNWFR?rqSR?HPd%E2dq+jqkf`M} zSH-LvGr7;RAc_Xy1c{XpN0i5-U>MOIIWM}X9ct`4=_hW4}YkkUyWQgA%X z5;}$dK>=9_;`M72O&T5b98>#y<`AGm%g~BI6^+{B^`AX7!`D#lgK|_1ct?PnKH#zG zygu;oHpFb{kd}e@#ZfX8&0u=5-Q(C?-3Ca&ya$kF2O|fqIxJbMaiW^iC96C5$Ksue zOH~7SWAP1RmmFA!eAv|F$FKQ<j2 z_g>}=9`ymDa$aJ3>`ZZVK7pgq=_vQkw2sP-A1tBer zp?*2bHPxqD6>k6sG}6*&Oh0L#Z0onZM3E&a?*n9bTPDaxw4Z+714uXDPle_YPoex- zH}jI&!CJ8tsGyEUnv?KGY4hXrtL|f1F;h$@8$l z91=LfZ+)G(5#SU{@+81>B%s7yz@+L*7!;BV&IDGcH2B|>_V2s$mnx5XTnh5iasOik zNRaRj0%Gi2tXtoEoBP*{&EiQpojlQLGK+(hHWg3VU$%bN}I#787X#r=yo=Z9|u0Go6n%Rhi0qhUd|ysUW^ z|9mMwQcutC!b$CE`=hws*_V8zjcA`_D4+uj6XBrE!q{(O!B5@EFJy}12;1V(e3Jw- z8UoTXijA_~cG)i92rmEw{BZF+*%Gx^tL{%tHrVbA+k*FT#T^P+Z|OmqG@kouxtd{p zp&e?RmeYonSN(%k{X=zX=DGf%0~})(M|Mi>R|%*s=|Ji1-hbOGQy!l+;Ts+Ki4!h2 zHm?4I;Nb}evy_3CuR$r**fAtw*z(R0)C|7Qo|-J57ye0M($j08j+v2pjr&?xn6_4V z-tOwXpco-xK^EWSWhmO51L`MXw|$?LPdaWANAe;JA*G=@fYC-E+i<8Za#(tU4#TPQqre9 z(`~Vb=JT|rluNV3M`muJ*jy;<`Iq`uArot}*tU&>*l5l22p(IZFkGE%)O1{O4Gqlz zvg#_R{W90|9zau6J{l6yEwR5Mx=H~smQkk22_`X`H!vWUHe~6?@z=hfy>p$C*TPIW3nJchc0hsrNnXx1oHmw~p*hL%Wdy{TV1%!ap8rgeZ0gbZf!WvTH zG#7EWthx>2`~FIkW8?BQoW6kvOWGAISC%w-N_yv7kpA?SVD~5bl?ZiF!O3Ov_%B@McZ^4c7I`>vYf59(cAqH4RUp^nE(?`_Z{&w)aFO zLa1<5_+1>+f4r~l|$WTZ`W6!^6ECUfj?OEhVun(#LqO3Q_X9Km4=#N+=!hB(j z5Np*&w4n^5kU*v|L!iGR1%?tiGTIl)m6C|9rZ}#J%d9_A371Xs8{2m6VZW9SwCf*1 z%n^p=g#naGP>)yG=*+g+@kMEr&SOEbW5*_~01|Ylhk}G5;8T!?J-OQaar?{~Vd>HR z!G=usN{=62Xc9Nl3{l!PJmWe(cIIHeYc<2#v!$1S$lrBB%>c^qxEQ_LILjxY?un1% z2klzrNk?!(pz9y~bsw|(ra(p(v{kfulDo&l^&W9)81sDMvkg)8IUM(pV4Hm;rpe^- z>}&7;4fbHR|9x_#c(^M})zLjW{VhN}(|af91KZsIN2<1vqC2@hXyjH5)8phxY|A4I z!*2PlCkJN@dXmm%kjnFSEo#lqQ#<`J?lZD|e=o-!KrU~DD7vsAel$mkWx0$KF>XeR zD$^D>a3#vME~f>Q;~P)U*Eoq`4z*72_xwAulRhns8@VL4tVWY?3&6ji^xq<0te;Qs zN)h}KRRW|t?p39cB>gBa;zv{0mbZ(uoQRRWQ#2>tTaCg-xK^yNCg5zZ1lYu<%#C~q}!4%b{jG;49s)J*@G_m1{ zxf!Bj1ZGXfY_Yk;!xfSuIvzES34GCchWQlR$f|BPtU01^z-dF+a_qIX?dS(K=TTZroQP}HGQF{{c4wK@p`REk9hBidz9JA{ zQ?YcCp7D@{uoI6J{(egO)10Bm3~SFA&^^hegaAc`hG$2;d z9)!Nl_k?HxAkfglbarD%ulq4Ye8CCesCwzB{#F)F6as-Q%sy)}><1|zh-W{Kt)mOY zX;8UarmDe8a(n1H?0AvMF86GA8cxTCuq6N0_y`w#hvy+yX%s`m5FY1o;gpftGqnLQ zKGlE&TA*Nd*?O`xV;VN&URrw-jZZPBHU!f;L9$%C?d3V~6}18LOwbb24htr$uG`>} z;;=40^~Ma05k;&tO$VG_p4LTFu0&ee%In+K=fSflebA(A^{O-X|90GgrekoAHs&_5 zLk^W3BdNO!B=o=evm4$uYbDDz>+eaxGE3yrjWc!2uQohrET@iciOMEF;NzpH{Ur?^ ze_hfHY>vVQTFUhVrW5K|ui9l~__eor5UPrm{b>#9#yZUbP7%93qs5sWaG! z*wP2}aTh$b9url?C(gbLSh#Y|1Ac;1_5B#!DEBltK2GX3`tH_b7aLF+q{^CPmQp zR%bOfaR-F|N14Ro>PJNR!7u64Y7}K(PnEUjsn9f3OpwE(q(QWe6OWu%D40f+ZJ#Dt z^ifTgeLJDquvUbPPP?F*z%r~yjmP;y4Mdg}fBY~df@&#m^LQ{<896RBm~Nze*)-9# z1>q7oM3hxC1m#F*{8?jOj5v!<*~^ZqnG{v1e83-n5KsRr#oDgv4)#!p5fudX4Pln+ z#MYhCM0t`OJ!L-rE8oE1#1(@WRcEFt?gSpm@8=V(o#T!I4TGZSIx2#wwSLMvz}0)h z9q<%l?{d0gy{5gi@|S|O!h%9k;F0{Vyxs;>r>>)OBTvS*Xi-nHOq>_6DRA~b2?H24 zex9z!FWKfjYgQe0|F1Dy6faF7cy%|he$1^d zx}7rH+Gp$Hi{NM-cvY~?1sxZNAJuPs16jl|VV7Lh1tq>RVju8Ox-O8#fn&+}-p1EK2Wzb-f4?{(hTL&zRX zk>&|>Ut`1sqljg#7XN;iuv376%;)L1Xeh|!aURz!?!U`Ld+eihwL47q`t)$jX4kp@ z15-e(za-JcqlBTba&+mhT<`8axK*aK#i6umv}5|m(H7cLn?tiCp^1Fgy}bFy`*BOU zkb!YBxx2poJrCR|xr#R3NH;x+irBs?snU|rIYA)@8biP`(!naV^$vN&pEELrDw#Po@!lzrLgjr5PwNS=g0rcd$A?Q`-@Ukf z6KiI2Oxq9(6&#(6m4&rAiafMoRF%_kj+qALudtg}J&~Spp>Tp!ybQ;ReHk-MGESxw zG4|9TG2o7Cdy-)(e^LgJtSLm_F+q)*TW|+)-9lJ_THi&7^}E9nKNf6-e%1yYLczmWzhQ=vk&|Wt`?*P$^lg$~y=BEwimU2P% zjkoBZ$Vu!Z{lSvMbhovPrU~{uy_nzt?V%ef``c1d8k<~OBqr8hHUANPJgiTC`;Uo6 z;6xDJ7^iUIVn+xm(vr1x=?Exgvy%uB4r*|$8FE^2U(cL z#MlzhQkSR33t)InZ9ZY|81zw?VD#V9c-c#L(dH->L=<2$pzN40#YjPYf-LR|N#hRY zjokY8-;?xJe}P&(A5Us_kt13|<^FxdA4j?>?I!%+paqsQU4y8=rsmu|Q*rpdvW`MF z6ItV$!T;w&dCcQAY2)XALmWA-pafH6K`(Sp#*sy}F-ab9gvj0yU;*;hgZKNJQV2jh zRneyYE4WS4>v2qNB_6aAUYYvLuk?pjJ72O(f@E-shFJ*8cw?{#(2u=vLW7r+c4F4$ zm~_K)!j_4oVCZv&I|80B&<^Pdb?D6t%Y>ET@P!Zvo3WEZVFH93CPuEkz>i&GmBTau zLs`}1Wu>OcXmft$`EDayDJkeBJ%Xp0N30Z}8aA0PgSj+WwMLF9MN^>m?EN{$2QD&#m z`S6_UR-sR%KU%+-b>kmM09f0pi1pe?W7C!p4CMhJqcmdrKy2~>StIoPjNQLSE>QWGy zH{3<#?F+(T-0=}3&6MaC zm_9;X0nNQ(VtmQ;`&t`)@rE;Q3t7hZF}brpNMzRP;qF`o=KkaHxKVUkLy<#g~N9b9N%6^MHTlW zXYPdN^bC{_mPw>_Ny{1+#VhrNK4C*%Y? zLyfYJP7L=FKuyLk1dQtpc?YyLp7B=F62}E6qEU@}RH>_0F18(~QG`oig-m}=-!v21 zb*uG=XGDU)bnzL1XDudDj*&_A1cbXESw>(3e=xG23=qm~qYPJkkq*j0=gWN)Y(4Ug zO@C+2ie9ic#qwATMDrwYN`%4DNoA=cZ|ddiYlr&YJ0UTY*w8VPx=!OSe?k4(Fp>Qj z#0qv`lpk;dhG;Au`m;o?M*4oN;>wU009DRXx2m+c3FD_Db718UtEBom#y?|wfVfwB z2sH-RGCCJk#eQz}0&m@r^NnJL5gL}YHU=#MUCArKjVnZgUJ-K6M5eQH`6$}zt+9+K z;+V9v%~05$qXvD<^tf*$Mj8>oifhsIGESZSf=qGT!zr*;LYpn|kzuCsye2Q8?!k9{ zvJC_{HoGC;dw2J*o}JN0HJQI>>lQHU)`+?cTkRE3AdUs|5`Qlg_4NQ2Ja-^!NNlJak}N!F7wx|igy9TxKhX*r}&p^#8_gs z$Qc%#fKBpG(NLGc`sM>Yy~v)To1HD&T*Hn4h~C`2{B?Jwl<+}myDz%D6y1D8O<7XN zf#$zrp9`tw;U`eeSZcCc{=4Dvdbm;I3_M}F7;gWl+@Wb6h1Z9vchpuH+=<|?W9eX@yb6V$#^;tAOem~B@YyAb}4!h|5iQ?MWLCE)E! zQX-$Ztc8uo_7l+~%m{yhe^^>j0q%fY^uyle^Z{Y6t<80R|=k000000043cJRtgZBZtUf_MJNx&eql` zS-W3Z4??G9QndT_>Z28g6k$2o8K&j8%^BWm{L6d)-!f~F0hH(-@ZLjV za$JUrnCo0Y>6|D`I115=4N1BONjLl=GbT2|v%wJUmnN6~-Yezn!0^@0ZGMT=wtTtBPzzs2A`~+QCd(AWIp%XExsaV)voW z3+2J$)4D~IXh7eGwWESj?Q`HNi<0Ei`fCR^Mt8G{yfC;DaM2WEc+WNV^@q1RK?0O? z@~Qt{zb=%X=8o=!!!`teV4IO&uP(nlVBh>dN+s(#ShgDKhn#_Nkv?uWLbF7p!61=3 ziAK+Vf_hspxq))#{9$SYiY&YuM!2*h|aE(@%UH`XO%)~d~OVzuz zyYY01ih^5xw6d@f{ZW}QnocBVah|W#lPxg;XJ6a^+B7`S!>aZt6y~CIwnu;V`@?+u zjC0)xg^dTH#Z>X+4RgaN9~;gbp2dyDge!@1Drjbgb>sRTSvf;jAf}AsD-BL|5B*jq z=?(1)=@h<`1w}or2Y-I1)!p*8J+?$LmXrZnMxU$Bh|(Tz_Rs<#QbL4CW-Dp=aAMCgh#raTJ1wbxEiv z+WCgvn%_LgwjyU7Vx?xDq_<=Dxc9&c!D>%urBZGKX~|8K>4^YQnFofx!c@Po_GTti z2&|j-A#wA5n|tP;-(s;7ADJVq7;xNqqGH+ca9T!I-gpYojAz7HzpHy{HRo6ul(Dq#l$p(Qw{f91-PNELIxGY>)a%A1A zAsd=HBf6@%f%2rjtB$R73U1Uz-Kbg-XcTpaE6axCMs{IL>aOL(@CjP*;5hit)SPU& zSzL+T1@KSTP7Iraa1>rdIPKvqT(?Mqfj;sSnuh(?9!&-wnLP52K-4LYkz{Po9yT^! zheC}|3eM4SvEm|x0_vY_ghg!hv@3vGb=jzzT-syzKrEJ~Vm%R3|G3AFmiK~ThfH$FmdAnjU%hxY{DVglJ4Lrq9PUp7d}hQLY=r?_1v=GB2wGk zexSOAzzxGqA9YvBxbqG(oSa)~#ftSAFC#{hx>vD~Ta&6C$a3g1Yz;_aaEL4su0GN? zW%Vh$mv9y#E5QdW>mVs(1}(yBa*DlxPblJfbR<0{dGAsFFc~cDL<((?i+kqVv={a4rndbZNYtsE9doE!LZ_!J;HG(k{fB>tL#y zG*+v$Mz;N;s{*MRs!LFN>0U9#fPM~N_z3!NLfTl`4VyO{Mrp}c64IXbUMm)Fy*f}? z{CdZ(?yM7tBv4gHk(ComH}LglPa=|q;D`)%3sdmh_}w-j>mqsxo#v43EPlnWAxE>Z zXkm;UGT#MV(6yA2yJ`~+-My*1Z>Ganz{UuVqkykYDh}VczA(ohYtIB1NH%YekD{&d zvk3;ogLbP>n!Glp(U7+%DnIu>VY90@|NpHD(ur$d<00l{;lp>VvMUz>v4}@iJ0-hu zu5{T;Z%gnHwq4(pg?6rSHEE$AZr4$lsK@E#iA7Oe>TLt(&evi078aesN~wJ@MhygG zi~_;+Cdbao4qqoogbBtk^gxF4%(d*nrDq=)VPV_-hW0G}>rTN-V(#+@gih$>Rj)p5 zv%EyQc~3e?j0tj zdSG{vYQ%Vv#-9+pXSqNPyS%Cl4g~UKYEa>s;pJo{KJuQ@G|JnL&IbYKtBskPo-+Oj zY`coN8Fcv&45Nb|5>4JXL=*U&ECDI`5@@_;9n^MW`X=UVF8djg z8~I5HvCilp{@I~|4#rLAF^2-<8416z&$25J_b!dW{!8E zM5#rN_Ea=elYfp15*a7B*|w95PeaKkUS68R{I1XGqHGKcBs~gsTFMj%kvcSkstTEd zv#40M7!>%fPgj`rblt5V4}C%dz2sV`b`w&`^XTe%){{c1V=9y7x`z5*dp4~;HCyBGyCo{BKELcr-s^k>y6^Gxv8ydb zi|7jSsqgD(@|*tVd=$`D2*jLPF*Tnw=N`lNlMJcY06)3$nV%jysFIZCMuEykReMRH ze-lB!quQ80;hfN$eP2sd-33s<2cF+G*n1S$-?&Z_ClLGUT_FVrK$6LRX>D>OXld-hcN8xB1v!*8z<$#L@x z??<2@RLu;EZfW;kB9o?r#eJU#KpaHaj@v6v)bY`mqLzKOJ^C0*vr*zsjB!v+^jj#F zD3}66+Q(>Cacs0voE=|RiH?pJXJdysBE+;_3OiFbFT;-T52B>?8g#cmNig_IG`Vg9 z#TAJMl6fl;iKufPkwR3p7I+{c!A!A0K&Uk#DeYYlW11g}{|0z7n+9ziJVPM~ntJ<3 zp{=8Pl;b{%G?z_Xboks~Efj@(LrAk+gW3KNAS0v24A%z1zU18Eg zLCg^qaAgl5&mI`QKzxgP((FRs_R%Gr_v8K-%HwW^icgt{r^)18M5)HzIu1BU@j=|j z#4KR&)?)Zzij5GnarNsm5?74CX?mGlKiYI{H3En{3H;JsbZFkyl6KOb;w%;78wK!9 zY#Cw8mZ)#OM%Ms`!oh|xoHT!`jE4q8asb5EI(;4sU8H{ar8W9U%W=WE0kS%*Q|))Q z_%P?rvi-U&7f2NK$1QU&+j#wlAACcWTbqIn0-%Il|?5M z4wmT1-VNhQ);*r?`fwyB?d+02g`uIlIX;sIUlvYz7Af?H=<8w*Okl|P_cP>BiBTIR zaKm=}D|j{Ei_U`FPI)HJlsaN;KA=0w8$Cy6_99ZDTmiZGH8pEk{oVF%D z$sy3CLBje*;Z<@}g@W+bbu#!I`-hHBy0s{fpw{fl#BY^E!sH7mXlDdx*@eORW?jz5 zQ+0@y3iuUmT0hvoCiFU%k#wG;L}lqS!E`2Bqn%8*4_SvFuO)PU2w?<|U%Hp6vkmjr zDevrB1R1lx0{=NQDCi^|$Xjj@X&Ljbd1E`zg(w`luRqJ!2INU2)o#ZJe^(u%T=fWh zFstO-v~C*vr7UEK4PDxe&DxB~=feE2$8F~@M2ue(Ves1$*PjPsKik;qmzz177ewM( zPyy?=*}izcYX6H5C|7}n(OQPa$T8ex!@1Y7Rc{y37jx@sMXgj{)iy2(XR4~{ZN;og z`1MaeDm-ew)EdFu{i@6?JyaXs>XucK_LZ!BLz2U`Bwo@>(qIWrI1Ke)u%xZ?GGl=} z1hSkzJnm5W;P=Dqdr2KJ%C#Nnba{4U(?`L7r=p4%Xv7_{mJG_e5LyHKa@BfQ#+6#N zN?x0buk!8wm0&IJDLsfnl(c6barLcC5b( zUwR4YEXIP1b$uT`r7Bn*ogG_X1tI*Vm;1YPJ4O7m32_FSv3Vr5LwWKhAHKCZ$pj+Z z3}nW0e2HoTi4#SfqDXjuRnpdraCCdr;?6tU>1KB-JkcUmR#EmA;i2*{qb+OXC0~cq zu37$r`1*i7+4PQ<_fs89Ay&&a2+7ZF(3p?%5v z0Oprk2t4ai^l-uR)2?;Q_|-TfZ&}aHc!MpxNGR*vglr#L1R&LFla|2bL50~|Pz1RDLYDJ{XiyBO2>R`!VNO(=6GxQx2)Ueuy^(NjkL$Y5 z5)iMD+_z1j)JZL9KLHuY{s~s7+u5MSwt7GSRD0w!;~YkWBDgA5*oZ zIGo-Z%cu1EMsF?MAV_8$pJsG>uaEffQQrL_wqB!!_ResGWb}jn9muca7L2wN#{b{W zV`OYn+OO?P9WPj0QOKa}HS|%6QjTou@bORKL2eS0;eecIlMvo=*}Sks80X3@GU*S9pz@j5C!>G}NfQpre-oO2)un(6y1!+YtU- zmfrTWGIUeusRCK1e~_Ns5Xe`!B~B##*q0B7Gtq`&UB17S=#CUXd(m;veMH>^AlP)a z5cj-~v{jb}JPjJr@Bi;$E-QHGL+S`TJu}b45gX0$IR+vswGiMDfb*}dZ<0UI23BnU z9v@m<9Y8X0q~M$LYlGwL>^76reHnt;MI+B`<6J%*+ty@N?)}dcIn{)Ztt>@ zksp*Azu1Sy?EZV_*tJ*@!XFPHK zXB9E$ql*f$4jx^Hn&KIti4Ro-0!`d%+(7hTIeeQTz(=9CjYZl0@MLEJU=jl_9YzT~ zQe#MnR_S2NcNr6yvt&KQ~LJQwNC zWQ&=_!e0^RZ8|LrXwQWd=u$)9a9mLl(Nc1JTuFXhq-@3qy!V_e=5_?)>74RL2djvUbPJ+fAY_ zsv7NG0~o!Sm}pgrH5Xb#xGD2FH4IMn9Ey`Iq4IQkfP)CtP*<>3yTN1AF=AV5mAYn} z6|U4vGqSYKzN?;7?h!^@+Qa3w@0XJJb<5B-(&DBNT=+Hjlrzla)V_%78#P$m9?NA+ z&L%klgJ`A#R%qRH@nZ)j?Y&ZfozSNRIz`{^_)xm9H7COa z#o;~M_-9ekGu+Cr0h-NGHZNM^bW}h3I(NbdcWLsO^6I3A2g?Ug`j@7m^9SRypUzOB z>;A)uB0i1u7`XWiBdPESdl!8WQmXj-LY%WJd##(7?8k}3q%=ep7J}B>IH&>Im;&D8aJuO4|=V7j$csC#X~)!Oq++k;7}fP6X96t8yDi5ncCCBZw|- zaIm3hnNU`mTN5`&qn4rTK0%;b*H?qqTB_F0qR(S$q`9$3pNljUzB}|l%X!M><|EPU zAy1In$`+W6G5pKM-o)-KeKIOFQy9bl%v1H7{R$+n*u+EJiwU}dPGV%%SC^5DHpvYAp_|^Okxu1J zOy3MPzRI8*8S|~ys;uD)8TMj@a)$ORNLO7X2kR(2DDYaF6P7=Wg7rd{A7dI$g%g)2 z0#e26T7ty;W)6i)rcsPL2vZe@qPL}^>W$`28gCz@v5Z?T0CRrwnf{)2-gXe9vzusB zno{2S8k`^S8YgMKEc0LUJ9Cn14Gi9N&|oXCeNL;X6%&+M(?PyU(HZpkcT_qi^9D6Y zRw^@7=+z*gKH2DUYvYEZWHJqVg0G6zehey8gCxrVSy2oQin~*;!Z~0D^{_(}@%WCe zZI_9s8$lW#DtmKn?{lFrP5vq1?-k!d+96_i8I8YB?X zDDQm$Qy3ZoBjlVdsP(}TKO%#rPhJI~utk|h+-^Jgz&uYz64JXg1N8B~f1z7qR%k}F zCP1t3T3UKbwWuFB47t3+!#F#=p$1OZRvr>b8?iD%2DmfqjNIcV=5K7!Eem_Vu@?zc zWQs%&#e}co0;q5&jiyYd zc5bSdj`WCy5gB9`?JwI~5=(k5MGkgxv_rB>^pmxf5dUQvJ?y!)PH;w}A`yU39U@wb z8nYSrM`;q1pIK?z@BW3@{l;q9YK`zCa!H4-D>9t!D&Kc#+WJYnY#L6lAcL%u4Ns}?eZ6O03z@l zhd4CU%uXI)vr+If(%0l1(`Lq)7iQ{%gm--1qCn^TA5XxZ$8h*H_~vZD6LisXu~mgx3aygsOy3-bQrk;-(E+{ zsR}r`1I6lBgWba*|6bWY3TwP{zr~r`AV-C1v?wA7EPkX{l{q7zv*(Tp6#F4U);$RC zpD}m6uK9T^`N(3L=8tuM0xYE&Fm3T7lzp2i#Cm1|EJ0#g@1w&bQQUL$RbAFAaEq~8 z8A)8>iN#68?Qx)%U}F1S#vX3ApvIkp!VsiiFHSlrIEJrP%zK+4x;w!M#M}f+>T*A9 zucX-S5k=SY*k=oZyi|Q?;qGUie_694OCyip76<)OGGp1U`Qj(iA0d{rf#(=Sy&5id z78|4;Y>p<${;~Dt-%f5Yt&|WO0xxt#FZNO}7ZIFosDeY+(A-WhKb46)%P7SI}nXp+<@S3Cb zn*)0YC%$gjZdGM+W7p+Sc-uC)BQu>(Zs=bs^epKaHaWR)RJ?KN8t6XH1v~Lg=hAHF zSu0vOj}cY^LCy-7x4R`2-8?sA7VGgKp-8djFEOvj{1Kgp&`daw4cS|Cg957C+ABzf z*B}pCw5G`+coU2gO2a;J(5s^D2XX&=cBM!`9_PyH&$P3H*!CLe3cYN$n7ENJEBnKAm+YCSYPdq9 zO1Y#qEqL4}Cz>J1P$7F<3A)M}7&_W}J+hVh^)I!*MdJS{5);#hUN7i96-wc<#rvk9 zLs#2%NbPtBViG?W)W^qMIpW5X4TVcs4HxAmv&&Vly78H#864vM>#)qAP%Qe-{q+Law$Vx2wKhB_UmD{v23$P zL1qA>|2{71zmqZCa_<_$hXvxi*DzT&jL&ZjS7!bJt_Y8f(OwZu#mB6Uv>;PNf8PH$4OqK;wmh#7OHTs=>scrK8(omTfB?XwgX-XcCLBuf zax*{k2WHNM69UPY31?%|Q%OF1lL5S~=ZI}_E!h+xW-xeaJ%?1XRHWRU&rzrhp3!lv z8E@x;>t}H;BI&T`HO-7M4&SROztl8GrPi?PZy@SWJaH@$*PJe=3-W>-;itmjMqW(@ z#4mw&yglsDxTs-X877GInA5mGq)xeEnMG36jVhDr#Q_=1Te8J-t%1@@Ih9jNM{0RJ(AR7&{%_bvRRnOeIj?|jk;acn(7fa83ui8#B=N7AZG2l zdt09q_L?vj+bgS$780yacj*b|@9GoekNdcQBdV+@ZncQJq0?2bo7siz4&S_Dn(bCK z@BCt!AcNS{7A$%Q-h%?2OJI-j<4ob14Rf?olYc(F2R19X=38abNQg?e?yeY`&ZF!9 zizMY2fIU|%hc+5hS-yzJ7OXcQmo*OxlnZti}9rBQ(@k9P@f5nBa4o?^7mz3wi-pjT{35D zkS8C54CVV=HlW8n@5LY9p+&-h0iI*TmeK%d_=Z23K@BGa_E`=}`^aA2a9AXOyhXNw z5X-soC4cf(>-cWh_TCoDE0KNs8nK*F%s=QlJ{CCqpeDh6LFl-DZ?$vKFR zl4>f?jq^rMn^(c*cf$T(=yQ79{zSGN3EE3cJ4`QxD;bqgGv%@OI1jNqDn;#)xNG}B zkJ0^Ms4AUNQw-Y?u79PwVauiUX%<`Fmb9!+0$E(?yDn`rA!g%F7V>)RKGt>?X`jN* zRV|=DQ9|6v2`#e=u-#&<*3W^U*FhTa8#f>Psc3&&6B~yplL>9Ib5`E)p zR%>s_u{6Tn3%BNSrXd`TQV34az-}E@Mnwg$Dx5d{c?%4$DVg-dFin1PbMyaoF+ zi;|mPa1X}0xl-SDVeV4Fb>z2~$ zv>8x^tMog`J>{f=RfjYdfn&!Y@_d@H{dwl(!$yB~P@-?CImn(<9$%FojTpnWEPMm6 zFEzL?A-XpF8(nkM4@xZh)%aq-c>?V#KL}9E#t5M&q+B>qkT0WN!99XCCG$z z5250NV3tXLNfF4!LXKFzj-cqDpWPfB%Oj4kBLR~&EPuevFR~wU#mHw-c~K2}U?-vB zjio$wqz#1&b#_|wN6ZXm08xI*1WxTCC>F^5q7JioT7Zo`^i)8b)Jz%u@Z2>^GmurV z$((79^bx9!VJKsW?Cd#0fhv8X1YY%u^uPVgZw>`qkMyJRWB#wR#fj|O%X2Dg>504b z*p;hSnSx)|$(!f$Nq`E@5a4uKY zn|*GJq76NH^4*_Dg_gk;{C$W(vcQq8#5u_xJ+q~Hm8@XH=H-9gb*KS)zD6q^t>{SH z?5zaq7gaa+g}nXBTV?t+?>C&USi~UBymDps+fNNP>mk^T{`vA%VQ@dqgs)#TGkFND zDGnCg>?7hzfsp0XP4c%lzN3Xm>TA$^$5L7Y2zUZa(mK=RMgLST>ILeokl6$!kE@%{ zgyBgwbWjdu{f^9JhC%xB?5E3>FZ@hXCmBFbge5`N+1pd)+iek*>-;W@Q>r`DAJ&4O zdnOe1JgRx2@w|}e?s-rUd129k6*c7h0E3Xe3p3S@OTjaEu^Oe`%(tPyrp{&6UuyYX z4XfCBRiL;%uqmT3RT3RpZgMk>c1DjF#pYuvNk-if6oZ66nrl?b-&@C&+TbD(4tawx6ujHB2`qcR9o$wDuM-|xBlPLetK+kY`ygh9VR7!8{O?B

H5~?ICIp^`G#ttH7p2P`tm(XK!EK&7s6NX05^22%PCJJeH^zO z1jEa9xG^k~r-#^Fd6``$B-3B}F4(;5ehR9^l#;VnZYEXf=jQM+S-BXT=QD!CvYxl^ zs^|SA*RW`FvfSXyl($u{?$Q3v71cD?M>L24X(C~OE&2DRal?;6@u*b4eeeF!tt0TZ z0IOlxFRgd|($ZuYFI~1lXi(l?r_QLrsEU zTA0gt*>Y||6OD6Cfu~$D&)Ggs?LQN_%CZ8BU5F>>wZ@%1W)RILAC*}wrAHW5F@IGi zfqgk;)&)1z1;<8IS10uBymXIN+x8O58xmH7ejCaWnBnYd(mQ8u2OoERj%g|8A;G#M zjP3HRWL3Svp9c4V2*B<34`yJIBBp}bh+k1zQz zT}lSAYtm_*@mf8h^rN?g7@2UY40zx>$}P0pHmpA^?P`AUTv0*A=w~oZKGK2UZFV^i zQ&Aj=iQ$v598qZwfae#HsoQ|m8@s2wR4~mzc360PeFs`4U_^_^uP;zDk#AA;u`#of z=-mpmV8#*C6ZQN$EKhZI4sau##7&2_^pHk}vOq;I{an@Mb;8hihSfB$h$S!xW?~ z*je?w6YkPD)g%QmQpNUBBb#s@akViIH|A(-hl=?zrIxNp)k58D8rwxc|HT>FosS34 z5dTN?;4v|l-LqdFV?IXCy4mp{F56sfvlm(bOa1eRPI!K^Q51rQJ9eTtU|pIj>a!z1 zoM3mKAe6yEDjJ*+iaXR(3v0>k7bB^@6$KTpXQ%coF^gI=1}EdN24M$__V1`*x|R#A zV9p>LdfHUg@LbPG3Cw$%YBWsU!peuqSc3#BG>Ih?kTMv@N|VxuXVzu$SI`dSP-;V6 z+(=oVSu7zxcPsb$gcUjZ-c@^Xx|=tfX+B^JC6U%ZH6I9N(j*+K`^wpfG#7zr=N6c8 z(SnM)mYL&Nu&#!7hw6M1Mc7B6t38(#6uuGYaW)t{#e6kuH<@0`&Djg8c7C?&`**uT z^(%nM@h#jvxrht1pD+SrWGUT3-t+b)Hw}_**|!c9>TT4VSE2I&>I0Mo-VDe4Sa71o zxXinbKiyr8o)2;uWg9Z!m#EwK(6Y(3Ln;4RgOUF|Stk5kksArzfB9JlxPhVlM;2AC zM5CSs1*-kHCM&BS7NW83bgBJN-01sSed>=hcbpikgd)#Up;$A6D{eJsWWmxF-24gc z-wRHq-hn4qw1%%0(=!X=s2=b$?wGAAGGtci+$SH#cAPzyu52I-^$WIM41Sl9u$w^p z3du+s&2clLim!6P=#{TwJsy%#ULB5y ztb#QBzsy#|Huc81eBbaha;ot20PzXgw+N-c(M>aUgTrCIrqXAQr{mfok+Q8YKa3hh zFOu1@>J7QoC62k80E#KT$*?BI=X#By)aKCvr={W(J(N@9Wb^Q){I#~a)yZSC+)7sF z-|n28&+S@<@*Pw|zk`aesUwPCZmK9NR(*D~+m-}Mhyon}&Ld~-e9Z`mc7CRc^vJ0D zt9??QH{WB%@_2WfM(-7P)5PIH0OdEpInF@Wf3>S17Fc+*x5#axL#2X}OKb4Nu)GimG|xz z-lF-%T7xYFcYj%uDBRJfLs_{icW?5c5o3i>m+jk#KRnm3-w3s(eGML;w$?6SJn)4y zp{E-viTbj%nZ>$eTR)OWqHF>%mIGbnjJaEb*Y#?(;V!UtHy6)bfQA`sdh7ZG82cUk zK;!9LG9NlM-nWfW=8I=j18hxqjG)jmkf91Tv4EH{|Jg+n09#i1Z)&C-XXyQNQ(rxK zebJ+tmd0^EO%U@IF@RYT#c>I@B2j9Fy<-*B6^!ciRm$kimJY$uT9i=gEai7=l=0SU zLog7Zv&#U2DtTKQ)90pY|0?NZGYvbPK(I$YoX3Cj{Jo;_rdox!JrVw@j~p#eNhl&E zJYPBz+=jIdU80l!e;uA?FE(qn6KKgUZMQ0)Sx!)Zu{M>SbP{fizWT)bRNFb;KRF;% zE(CK@EQ7_|x(6>U>CxCPgCkGi%uXkPv?=no#5V|zGXD@am1ZX>>bgOyrJ-eE5G&`V z2~Qb5w;u{;*Oif|z~*uC%)8N8pYf@r2XcI|DDqEN zZ-R#4M8sQ78^yHQ z$eCMFf8<-#X^e}O)YhNZqd4AR+} z``)^d?r+^}MR^n-SQum!38xM;!>mctb0^c)tL7Oc=bzpq^u}VW)SxKztozFhXj~Br z%rwZLwER;oHqz7e``nDbz}Kn`@!+v1?oqBVth?;k<9VQCYRhM;-X9@pCpBIOW5Sv* zfY8#sh(48{E&sx!`n%MBh=6a!P^bsso-C+Z`O&SNV6rsdfcci+0$`0x~WI~4;1AiaLbLXeg_z%tql~a4=vcKKP>eICy z69o&Tu2PqPimK;E*<)_t)c}} zMo-xecZ0fiN|iJuBRO?*W<{(ufpF`u37@Nb%og1Q?ya4fsf22XNyqj>Evn22t85_A zpbb79M=qBVyD|Cnqh5Y4HI65#VjO_Hq_KeA2R_!vj~RC_R6UScK|M6!5e9v;pgZKa zUdAFT^(-(T#3Hjw%)`ay3ni~2fQIuWiSa1*bO_{-Zz7r>nT7p`Y!Jpl;a(pNJS?OR z*hl15tGF+;pllObKAqiW%N^nu5Q^mIo(7)kW;Xsy0oE-PEHW083seF6A@zJgIK~^j zaJ92@Z;@MG*yWx@`M4}pKR3d}Pe}xwCpINcHsBHM^40XOkG9q-+jOCwnsRM+-6Js( zFpFreY?q~dC-X@=BsL<{u6OPgTIhz~fEl&qs2e&~%0XVy?^k1hWj*xsV;BG)r;fwN z&ak+3TW4?5AzPC=uxHW5G=5TbH2JV}B?%`os zmm{c%a36ROo|0b;EYTu48_`^hU{K7@w(&M;&Vp(i`7@Nupxa~(Id+S%4;Q!enhTSu z_Hi+2FI58;fz1j6hrO@j!@m)fabwrt)avQr6y-Q*2>bm<`qIi@oct4fh0|$4TeFzT zgZvyTOXKe@-`oU$l$F-OyNcLhbbG58dmr;W-0r(a6!n}Ik;tIQHcWg`igJWt`i%b& zev1tj;fT^y*^Y99v3WMf;0vG?=Cdn1tukS`@#{Naw&qoDq=0N)niD-@(V* zy-aiV{_hT=<)XY@&Q7!s6_dRVqujNt&$>^R>3wul+3cFP=>e8HpeK%D5hlB2;Zu`^ z%J9W2lT{U(=6Hu^RKL2bm0Ddt@bx;B%))d;Wr$Kf<@?Y@R5TfrL=lXeSQ*oomi8xT zG|TQatC^>To(?|&U{NNTKU?=-Xs$7I?c>W1GJw@YJ^-eS!?{No5pTm+TPRTF-oDdF zv0NR6Fbm#36duNXrTUGGdd;ViZb$XOKGD|!@Bnf4e})!!Ai1$ ziE@PgQO=*+gg1i>{J{{`f(vRfG3yNXJbiK~WteD|tg*H+3u|5j&2%66nyK{}m2NRj|W&93uv(y5aa zqt8n+ZYQ)11j2RSB|fI$cUMvMhG4WYQY$)i*!LBxVZLAX$*!JW2opn5i?zD(aVg2+ zJupA<*_me2)oCO3@WK%Yjf)%O2>gC}>G|stD%1W^ibmSIhdGEevqXd@}zTZ@r^Samr+FFMqQ$wX^^-ZJz0xQa{6O-&m=myy@ig3l(4Ka z4mGauvkEv>zcYKe3$ZKo>XC+M_b8@J0XzQHxjPA10_y3j|=LZ%`&Ii2IW81 z(DqnL87BE zu!b0Uk>(@FNR=mB9kykL4r$MK2p!mHlx4w7qI3;2r!Ku&FLIJXde*1mA6??vNloH- zuZnQ#unbyogQqdcBA%C=PQA{)bdXM@WJFCSX6ts_%Z_5&eQ9c;E{_r5gVoFwQmLr@ zl?0OCl@mV;!^lZ&{Z+>>nV!@R(gnJ+3FywPTWf*=VqpU#C(vJT?;xeWk#K_HDXu94 zv;*-%Twetz^`L5PpMk2$U}HnU#qju-4q7_Fu|_h9eOp4?XHREAKOuvC&tq&*_DH`R z6yep9ZfNO?Pha{Ei(M-)Ht$H2QO4bK4xV107kHbTJGm(ZJT-ew2xpOw5SX_`R;O(8 zWIakRx$@CO1UnRolUJc(f1>W2a5*z(3=8F%3q=`7-}n4+?61ScZ;_j~<83i&bPGuj zLIKtFAPcZg#sQ!1a8as!6dy%Qk|&v?!T-bTm=pu~+ zQ0A18B+A7I^M}v~&+E2b9I*o~7!}Vpz=JdjNq@X+lmgzpnP@HE{xJgg*7zBFKcb`Y zA)^Js=6m_E1VuqJ+4fs)=$h~xuFzA2kt%@tXxtcDX5J%>uh$#dTBhzC|0Qt}oaSL} z$Z-taC9;r)m%3x)&j&klNZ|oLe5`MqmjlQ^4kk?>vDM24DFA)EvvN~OMnp0~Zx4c! zSjONM)UYVy6cG%3;UR$y)|5e8@FW)0j}ejbvv zqL^<@z}U@Pk&g#&_~AOFoGi>zur;5Q z+G%PBvpa57hpPqsS#Ie8OpZGN_0HgST}E)i6{vAB3NV%}`kE+1Kc9T}7#UdoM8>hS zpMUXDbddbe(ptLU!qA4Wrtz!x7Z%&;^B33PYXh9yDpeg~={!C3eI|051rzS~2=dMQ z#Lk$mr&c3WIk@3|tsy({3j&M04fr$k>sByY2?Vwi#*2B!nM|E{4zPMDIXGUSBdLQD zvZW=FhtJEitne^rYHIwmb}%dILRKHIIhBiwk`kg&{(dJ`wv{lt*&#t~9=nuJG;P&-OZQ%FdadPAtOTr$qk80jJyQ$UhcQ_|qk@a`A+Ymv*@_ARYE`Xj~52+^*;2?=pn~ z;F+4`O*FFb(~c7hBioGb)b%(vEc(I(0y9^Widiqo9*EK-l{xB_MQsFZTot!+J6f#B z&~=%>Vue~InckG+LiJX7PO)xEF<-iwHxF&QS< zOsBw2t85=LIaEq)(}VQoNp@n29Lexc0vEO*Ldw&-y(bY4$TuG}NgjOeg>}@{Zlu}C zp|2Pdk?M@}bNw$HASAHlHg>lQg-2td?_TsNp%#8+{H&(P@mc0fmu6h(W^5to5b>3y zs*b=SEDcs-Sox;3F3xG;NNK*m0MSk&O^0UdvfC>#z6|+OOW2*cYD|gGcIt3uRu5q2 zyneGc|C}@8am1zm*v#gfdrc<3YAa%r~?@$ay2-UrF0GeI09d8g|_I(6Yg6B zeylr}LqT03$z%dQTx-yc0p6ACG<(+B8RxBitAn8K;>>8Bn$u20>YN#s|5u4-T|KFztKSB zIbN_Rn}Ov=mM}h0cJN6-^B5Y0;1f{I4VsW_ zzovS*NHnafXqao@3rsbLTK=Sr*77D|Exq*mnxubsC z(?&R8*pQ|&SkHGUvG(pvB(?Uj{i!A?=-J$HqSJC* zkJqV4OII56nYZlAfi?3l>G}wLG~{(jvUji$4e}=9IK(gjKSuc;#lz99ihN!baaqyo z5=?xC2I)}^u;=eLI!Z7Xxpl7b5?j=T5l+u1a$ZbiDJ|kZwz;E_;qzk|(R1zy-M1ai zJOCZwV3R=tO`w+J-u1H0O=m}cfz^EI3BO3Yr}r+2i8{umn&NsZ2v34M|*;+I6ptuz_5g6OoMx!!>e&QK)@+3mF20J zXX3*Ly%`|-PU{3SHn5K-P3=mL4X1i244ew%n4y^ZyH@^%WVc?=T!Q6tLN4MBc*u8=%GU<+Z8RgF zA|pOxd2uH+%6^2GeOv9F)d+hu(SAO8$%~J6JY}@>Y3GSu$Da)$vhU-Sq_I$Ub9H#( z;nBXLa34>p0CeGjmLenI{J$I^p}aBc(VA}Xwx21K;UiP{-#^XJzJBD8HT5Si;zqav z+&xplVXeYBZJTpWk9Cp;05ZF@q`ql%820@%`v}m?+M+#g2UvaBtid^&l04#H@*k zHhA~(LO3<_)oz_wY()M^!SBO=0B667BWypsWAf;#=(O0OF6ICh`zh97r+AoSwuOGu zn@6V{WUc&|3gUAW0KkwJxw~sFkU;(`#RBSspL{$J3eTF=;Qo_?sv$+#(9|dTx-|O|f>YaaRmEN4$kc<6s(GJ1ABKl4S4|OjGE=G2#Ls29!DvDxGG(RGMzCR>+Mr z$E7Zsvr}l<5kEv|4OvHJGVJG*psj1FUp%-FgG^G3P%))axMK;26rxb6DbwP+Jz66Z@=eA~jBu}i7> z_mXurJ}Ba0#3FLSX5*K&0JxYW>bmTwn0e=aE^I;ZE@8HfaC%JJ$Mn!wUkYEPF%GrJ8O)&#y{ky^F4eG0aVMH zo9yP|0Jo_`1m9Oz-sR2k^4F`_Yz$%}BdcWvn~=SOH4QPllwBl#9{hi2s~+ubtkP8X zbn&lUq~n!{3Cu*?hc-{5m}adaFSKZD1EnBuR6qz`fRtjCszveQST9?F=!meB zh3-nkBJuR3#x=x`Hv6-vpN#ktz(!i0kK=&=>)L*(N*O??vipnGcOadX(!khkQWyHC z)2IoY(*#U4FI^d5=v@ylL~K@S++2dwo;9(R5+*o@eT=)5`3Q0flHH-6FAR$pf4ef# zxr!b{b?VNh#IdwUweYj8I?f9&#%Ymy6TThs$|&B7h|yqplpqy_nlFs2&mH~+U%F-8 z6<4U^#ZD{ZPL@)~s=k;+*9Js?W~&8I^}h;Ov~N@4T5vUo6+~4>co<_gw2x8*82V9-QK>hzRrDvi&qFX zRK-tT__||Lu_!I`F*nX5%!WP-#j#xVuiTLicJK^-h7NVMR9*tuh%cQeI>_P!zb-f{=1Gl z63Xb^T=4BP5yGQR0B1wj|9Rzb~eeP+3G6w0tf-xqdvXa@|5wCNp>q~v2w>VB(WTewMbl0DXJ)m zjiDH2pMe(MR14Nf$q@>nUBnaeiH-y9#RnbRdH9EjZe81_y{>w|b(k&xQFu0d#4gmD z!Meb;U4cFD@s9k5qR1AuARbvX7AK*BItjk^FvhYByU&@185ChWR>fM zh8WZ5j_S!8y=HdD98FST(q_@6-YQuG( zRu%bHEh8n{_0{bhmi)x*+u(q(qvy)O!z72>x)pnFIb?{dSU4}i)sxiPgm41Y19l%ITrqX}!p^W1FaGZ>n#S@i z%K<;LC1WQ!zG+P8StauSId_*amOM=epaYD?*8B$k8!5~DW}9Gn>;myr`I>0<=UOBJ zF)S>ic5|ZPBuUtpFb$H>fmza#WNGc8(Q~Fqg7b$`q3A1RESfdQpeH*x|Ev}oa}E^n zrmx2XFWNP2evrt1e<{I*W^i+BOL_4eDiR0=n^@a z81+k<)S%JhZMP=3TFa&z$9y!7%B^b$-rPI98lrOTjA9*3H~&F*4mI&P zyS&$kQ#5A&oJg9y6K&&TN_Kcgy0mH@m2<4n=8AUz3AyjXMmuo@&nqfln_N?Mtt~=C zC#@-%Xv+G{z_oc#(u-Yc_UAj7t7J3Sg_Ag#!_qErm({y2%Kj$aQpi2posm#cS=9fL z2pof4>Kh!$8@6egStK$2V0ZC2^P3xz{CuP06Z1LNJYOm1T{%4}`heN47%o8<+)PV% zBWhg;Q)ilidI+=IEt#ms-%79jM$X4gF$js8^~=B=cEERRJ9uNtJz>a8z!$h(%Doah zQpXdZNh7`%#8K}!)a0s%2)VKKzSd0)t(f}Qa(I8Gzgm5#M(J#q$OQDc4J_Fjas%ehIJcTx{$vj9hkLPJw1;QZ!UnJ=|p{}QjO6(4a898v$M#Rh`dl)3Pe=%o6C9EZH$k33n|O=8^liJu?-Z}?7!!S6Jn z!S8i$7;!UjC2L4F9gE^#j*`%gKYb}&cUeUeDst6;Y@AWqdv2%EOa2?2o1U}zeSyHG<5S#C*)BkV6Ts;yP%g% zeEp8cQyUM;2#N8T;Cel`RCM39?G*3t8eqP!dyEoD+I08d&jT*>3s_tZ+g5 z3m&TwUy3j{C<8Tp9;dCTgt?e*rs(k8XybgySlaQ~bGq ziH3J)dQQ5latW<&CKVEyX+?_g$*e8GAvUWb*%Big=PXK{#`j745@Ty**~FNRU&e#n zSII>o6dB|?a03v@u^%~V7z7=BeFGp+_CPqEh$!I8YFMA?-yRkUy0O>2`=XZh^#q>b z1H;97GwiBZ5VS6BKW9pmE2cfMW6={|DD7lD3d`h%QrSWVlF}PHcLKvqJ2ibAJ8Rm+ zhhG48te@L6zZdk(Z#=4?a!kyQh9=fxlLBSp4I+Y4`f$vW>n%r=q!GtE?H7B*Kynun z{nK)W?SaJ1utQ5My^=hu3wW@(R2Uy8v;@+5NN;=Us3e?q4X;^wDq>>KQM~s=U<_g> z@Z8H2yG`nExj8eRpfYZJBpMs-wjl63IBdZIT8v`hy*pd^zI7q^Zj`LWO;HxdwNN<^ zZk!GAFuR{b^DP`4aS(v(V zl$t>XE7S3eIia5*-A_haP*l4Ks+fAG+?u)EiQ$EGvH7hf33kCvJ~SpAGAN_i;(p#r zO}4s~HnG4?6B^;1rIFCgcM!H3%ufyhJ#M-0BMj2Pa<5inEEbx}(BOm4U89maqkc|F z>C1sV0kikz*YyaU&44LqUzlFq2D>vOgYw>ET^a5DrhV*uaQc!k!D;y`46fAM^mr%6 z;A;01^7g)N0@-fU;Y@l9KO!7lWigo)(f15j{m8n+u~@9jo7It-DE2oW9_(-USIbS; z&X~4ruL*`eAKOa~q6^wrPGbFidCzUq+)iuKL?K0z<>lt zKurzJyB zP!vUEoZ3B`De2qzjS@z#shBhlCr3Rkno6e>Gi)ZXLOY>d(Iu1&{UC$?J}!QBp5f9O zSF{#=X=itj=%$ZXVdwreLI+uV{@QztX&XvWM84m7d&s0QzS8 znN~RxDqNrXtJ+P2dKw=vbZkAs|&l*INYWFyDyZF1ktH9Xw zHt{R;|11~psWG+nO1wwMW^+qhOjfRo^I&~HoNyyQjE`cM4n-|>^1s0|xxU$o1f1O> z35Z;XZAd&3(<5Kp=j+Y4u{SP(&s|0yn@=x?9`&Y#cF0!=UX-@OM6P6#ntFdtZx+!} zHicnY!ymJsXx!d4z7_SDv?W}ga&A>xPvd=iG;`evvuWt8un4zNNiH)|>e9D5upQtKQ3Mbo|Vp=vG7|SQd9;pg{?__SN`0=YEo4yY>2 zB-h+)e5A9lqgw3sU95nJse5$Gk>u5~SYOek-Dvq!D0P0hpXrh!vD~1>4Q2pJTI#Gu z{~KBX`Ip~ECE;nqW{+ev;*dpO=sNf;;Ho16w~vl>h@Y}MK`NvQXP zd$>~Fq3TJF<}V*Wq#1cy1p+SODF4>6x1K1q1232>g_SQR!rV$f-P(Re1>*@ zxGS%riS^hehzz`AhT=ndepKzwrMWW9Ir-RX^fDp#xjx~Lc`10r=azTd7F!HOXd@nz zJkME{g)p`g_FrMVVbb;Nv74vjVzjHzFhW%L+97q$lOPP}_BCchXi?tUeugcqsKEAf z0fdD%ViY!q=3>s0i&8#Cy#^dH8oY24mRYR|2tp4sgUo*cQLk}0R8m@-ZkLP0m-GAa z`paa)tk27Hb|~u5CaaB;d*RE`Zc4>*fQkMO5!;)FFe<9duEe$89+sGRX^9ikrz#FS z(dv>5qD7uWPki(yaRvqLxt-wF&R`?}iLG+vk6};JX52o1^pyCeegajuaAfWeVMMyVo|9ml0AthlK0Hz0>q>EO#sZ#BXO)T!i}V7)f#6Rd zkxO__LFGD;o@3C7g)5YT`B{)%{xC|bX0eF4&Y2gP8r(^($xNUBUX=QgB&ovjWa@AK zIPf+=$b$`qJD<&}%$EBIA~88Pde;E8XW~}Ko`%T{z0eH`C|= zlq8j*a4qG6paDYPrKQF0ls;Wg5(Cz@I?-;dVy|wSdffLD7&ldSxz4j%n%KYVB+f-! z>YC|JPL`ON(GV`;v3QJ}zr*KT^0u=Bck@6-Uyetn*=GA15B2XsX9@kdYT=$D8WF7Y zYyIJJH_>SE;jM-=v!^R0VK%s20#=uf=qyPwZ3LmRs0xIg$JUywg&)>3rhRv#`b^ z)WyDcvU@V>i%_!+g(KQ~=3wULJ6M9x?iREG+p=jc8DyvOU@4H)TAs}(7F=f$Tr2NO z)$G|L*Z(^gF9rr{J3j7s01DB$N2>P3njqET^-0ffKfP^}EX17un*Nf-mX*D?Jed)@ zR?AfHf$4`EPH?=YIwUymN=iiuUn_Y+&qK!Z(%HK8THqJjNa2xRv8w+Uf81ok-uQ7Z z5DD6X-T7>2ryMzP#VQ#`+HBL!Z<0lF<+YIO`EAjIKroy97QLFr1O}=p1mn6TOxe#U zF~YEtHJf>u%Vr6bs9k;yt;`!Y`>x`=b1&vpH36JlXr2YgddPyO@DQ}|j4sv~RjqX7 zmr$eAc~@5X=ckDIbK`|EycA@x8&DGBgxBi*YqXk2Up*Js!;uuPz!&s`#a5i8I2vb5 z%i%?ORj9tO#7eaLWwmwY{AI~gum-`A6z2jBK+q@yyqlAXUsqD>c~2ku zO{OBnVPIjQhf1cx8FmYPvKq~NFqlQLsAN(L!A|X5mALoAeN-xtAIjk>fi!j-e^0|z z-(5Y^-Ym#0NFh+c2K?voBO^((Cer`tqV?)AoABaL$&19NLOZwQ)eY5Dc$EKO-`s5z z>zMU(lN?{Us~pj!n%rw=b@ftpM`WP?SV22{^W{pu zbZ@WJz4vc_hIh8WI11{d0Y`B0YZEfHti5XN?z}MV+2F}bqrO)~EA}a><5qzT;2I6g zahA*N-@0}jt%r;ZlFU94=MhGBP8t~kEsbqGdf@>vlUeMZD}#`aUNjdgV5F0tdYe)9 z5fZ3VTQa+w{T2Cf2CJuJq$`|cAO^0W2Sr>&PQ1ggEJw|I z3}E_zJ<$T_euQ44Mb@xu^IWBhz~E=NTChW7(QC?Ng36GbXg-tK2`OidH)*{{LAUax z`uh!dHq#0Q9pC?9X#d`I*S}GOi8juX8=-#(2^&9%N3TYBL7@VFqxb4Dlew*R_B=V= z6zgyWSpo8Icu{Ez_RE`crHVf2F3TEMT!#;?-@A5!PVcM1FfqOxfM5tWz)A{S_RuU1 z`jQ-+_Xy_f}`7|R}H z5Tg6pgFTRumHVK!L!Y(K@7G54Z_gVSi?f#o1@rR!-8a7uP1z&)TQj&>cPrNP@$ysR zYa;eldhR`}~jk#<1G(PTR0mX6q&7j)DdQIbOS%b5aTS~GeFIx zPv=s^H+3#~tUX_StLlM8YH>W;=Ha{h8|nTqlVfGEfx>D{IZ0cXbV)Bjc6qQ-4=TmJ za-!eQ!UUjxWOQ#oyk=^@j|CY#WQ&zT`WeS=&wQt_HSvnCdOqoY(SE!;i)Gt|P2&iy z{$k)-%G+7}_izW7S!F!QMO7Wy#aOCq1X7mO^!0RLhS8abHtr9pl1h?ry3G6`+jzwA zJ1$tBUo#72{>HwXwX~!ZiUQ|pbSsS-mv%3aBoXflO*0`qwCzkWAm!?E{V@o1vJcKn z5J8xpn;?eE_iJ7*sb340`JeSB7d-5kz!T`2GewE5szhSEb70>>Emah~t`e?*Jsu~y z{PVo;l*BRNr+>7CU%I<^Kgzevt4x~IaJbH-zQXo0l*z%dhAlT`O$iDx==%Yb7v~R# zZ^hI&H;-Kqo!A!B2CALZRgq5ah?n8o;BKo!2?Vy&QPC(oc;BMz(GaF_aaaP^z zW2~QRvw2>CF9^D{>inQO>&JX_D_zauEZY7_T4o7KP|crZGUssW100IFhDAQ3U%d+AnT8sBA5)rXtnJB}_JMnKqw^(2NLp2T1nKeAtoO@`VA$pBYZEv zdi-ck@b9aOTf_(iq8tzN{8|wQk%u|rgV16wfK=nQ1SDHmPA5yCwL8`j6t)?$|4(AC z&H7a|eUqCd;T6+`-O`f3+wbJNdZ@4(AfYpMVQL$ZNW!`r4dJLMz9D;+Y%=s$p3Iea zyy7bK+}crse}Yoq&)L_GR4zqL+OdS27K5q~h4*F@n91ZfT#=D1_dVnq8`4n}8bo#~KdsPZ5E3E$ZAnwk0J@ z3{o4ULrYe;BdPPe9j$x!Y|S2$DA3&RG!4gPNYPL&`h>z98(nj=V>;2`z01xtTSp%< z5h)oVeB1!xe+8VgvkgjvrKI<0aP0YbY9tkmGj1_jaGod*15Iin`yLkbX%@opFQVor z?VuO>lI1^{N>cO~!zk;4-z`f+O7c)>lwV+-2%%t~3};!didTlXWR1=&V~F}F)5?SY z9UnyBpR#g#)zu1=KO*t5^t&--A*C2>QMZZo1lF>E7w4+XN~ps{a*z~vDzJm&)j?re zx=+J{#XLm0(AT?0_j_(XmGnQ|`$qB47#b4>PT@tm-_<3p-{0EIgg@34Tlmy|RCZ-_ zI4zBql0P7Rvu{P=op5bu71R=2n9x;>+6g-p;Sj)Hid4r7d6sr_k|Ib_?>8cxi z0*`L4)x#=1TK7B0GWT*y%=OBRnnj8#cz+&aFS&e=L!Z&5c!6n?lenT`Rv+pxR+Qx| zqeKx*6c#yA6+|J#V?yru16NuihzG;-%48CPjKG%6w~hv2jtVb7CtoJ$-8SA zX(g9fPOlk&it(RKrKV#fH2q{;XnMMQK z;*7E$qCWfVyV7DvWoH=hF}f}J0&?nXwNPGBAuS;@$POeqw8kpJ)t%=6_vITwRK*C- zI+smVYMVHlr&{DeUaXR|mvc;83Z|+}$%QX=78xI6#3cx;fpL#VO`O?hGQYKhIdwWD z4wUtOX5~wHJdo<*1wnYax_E;S!>AnVDE2+o3F?6vR5OuEXVJxYYE-wd@O+!`{+ugF<+;-5lmmw^ddm%$MiD zmFeulH?CSWfx;qZ%qqh%#kYxJl|LB>BPaYn(GPe^?MUR>2g~xPH_I?~w8-0%iOfdK z3?;o3rS(S}tY%)H2X3@epUJZ-jz|plO0@e=q{eJ*!~6OA{}leM6b;K}gWRdnqH^H= z-E6+JqcreV5v(;0n85$d@3HAoLYLf|>e!z=M+x|lP+t(|1b5qK(dWn=dz2rt9G;@x z@`*V>W?(+wbYQp?f@sbh(20xznht$#ib!Z#)n0@kU#-)J-3uGg?93E|aDEJ50c;$5 zPd|DQLFSD5J5*=rh#G@3Z7Y-Sw0##iv5^j^_f$$a%wTxv?en>h>U;I4yM89fJ*mr<_%U1?Da){ zV&o!Ft0x6c1FEOpupyDPMWpGg%Bq?i7LT`nx-MF*uy^jvs+RJ!6 zj{76!=AJB0e$o=F>P$3hyh`#Gw^z}8Vk0O?YeEdT7r{~3Hss_jR#0vTqKdrfT8H0N zV}TF$S}q=Hk5yT+aZxt_iYNlI1sv6^545=COyQ7RN7@PzA^LFqd|?JYgXEwI;E%#i zV-xM3db=6qg*9Oaqlt_gqGgwk67O^@ew;G^?i0Ll`0Ur72ZqjN1{cb6DjV$H(t z|He}q$Mr8oqe46iR!8+V?D}(OSn0aUU_!xrVvhYFlE7)!YH8&9 zjRmnf?H$CjjpXkbD8`R%V_V0pB*%#m0EU`NJB*MgJRp)6nO{mE&s!MhBTsc~QNF5~CGsN&i6XD`;wuyF z7#mw;a%!t{OA&co6K2DXR^j-ba23531#xyVxg*!3QL^B#s+4EEnrBQvs@abQ^VWhG z??f8a@QfBQ5go$L_WJ@#U(8hdStg(Y{9>%V( zh8TC}_#jOoW9jnudJFJq zsp3p~4cw=qu&ii~u^%%o5LJS%&e-TCoU682{3q{O#HRX}CfE}B*M^v=0~iRuWE z<^Xp&nqre}Y48(W%_AD+mxezOM$H}|`5FlaB8(P+IP=YM z7Qqc=A!gf#+^hcOYQ_6P5>8XiFzH!9olVur=M%`i~e2!YB@OUNSM- zia8IYY7P(<#vC*V;~*@b8~OcP(!B3Q9j!Bj>|6r*-=e5MI+ zUy(6dmXBOjr^q{YM_tU#C9l7uR}H%|+awM-{*pr^ZG{L~NiCN^dhW4+?lk#hO?3@6 z!9qwpm27_Gd$&j|K<|X&K zut~T@~e@WAAvIs%0|>mv(2q_+#st*fF}|-+u0Zr#~JX zK6hqvaOU9tqh&1E{itq(UAUFh6XW_8y-pRX8kEMDkMPUUib&y&()5$L8EDxvNDuA0 z!&PY#7d+;bYir6$b=lPt!G-tiM5$DX-`t#iC{-8}CI0p71-?n(%(L6Cj#!mfafp$@ zgfjk*!5{4T?{+EztLOt4Wxk_|?9^JoH*TuH9i~1k<^t(EhJ2*$uN+~G$Z&dLrNE>X zIaVGNe5!hMp2^2oVYRkO1af`vRuIr>m?M9#(Q4mTh>U&IVUKgaw9!xIQM_hG$G-V_ z6n#FmaQRZ{O&mwc-UAXh1-A--QN{JyezV5AZhgjDmwzR$*yyee;O}yu`h<};M5pa# zIc7i^gGFgYWO%+3DQeKjuQ7w_xQ&6cgTWAuz;V7fw0XLH6Gn}1aWmqcNt3_Pu1||~ z`{4jh6Z@qVl%;M2GW1fp-69cofUk?F#Avw<4xw05U+x9E)jR*g0=bxCNGeO>cALnK zz?`PRAsIm6-$0Ag!qwvBD;%wiCr#ay-siQyMBS3vrzRJ;?IK?&HpBwyVfHNHTS7ua z37qOF#cXbQ9ciz;GJ4$LmC-+j&sx_JY9ww%Ke<2ZbCv8i*18E>nZ^Zm>f{WLG0B2K zH`O+D$#uckt`~_MF-wkeo%RI)2a{2K@V|(*$|So&gr*ihdFlfx3m2dOp4r0?HwZgi zm$BO^8PPgr6TC@y+~Ey}2qzA@bxd5QU8gLl{T`au)NM zF%#S}=JA}k>9g8+#ViS7zJH)6B~Ucd;B>;2bCFpW>vT|2baVWpau^|{7P0mnGVLwu zXuAAW`sQIs)4S5jpsnheh9q92C9fPh;?vh`UlNgze%eBjQiQX; z+okGUcz`H**fl=~sButhOh24T00t@%oR0Z^u0w_I>u0K45AB9{_{rx(qK~a@FzuIx zjsis+!+w^F&pNB*S@ecOO!C}wPYhw*YRYm$X8TYkdtG{F4@C%~y3>uTM8tK(sn9FI zfY7~NMrQ$#AP_o@iF>J>9FHMSl7T;OSgY>(L{wa1Kj;6$g@2py>ESWitaZimkRS@u&q+jkQmYz#B9e%OjZ`-8-e^cU#u) z=y1Emr$wm^8)9?B;LfHRcrBU^&QThRnO83y_02uJyPqo^&Dp$yT`_1GF-`fY=!l?| zWqL``TT=T14CPa4$60E^)~~I5hPb|^u?Ltr;h_c-%!ua#QmYC;oH+9!GnRndd9B)W zty`*2hQf7A6qnGKcMWkZIW85*o&do_eD}9j-fib1aXeJbdC*}{IGakp91e*Hx=k#I zG0$i=gvmSv;2;eLrLyEVGQy9ojWV_>?-O$sVOP#=(qWdNdUPY;Z5RpZaUy6fz_j&` z%7Wz^>E#(#QRcM02AjQvwWmH8zrEQ<(sm9#=sMt_FkF-BQcbd=qpAkSz9U3k+u*gJ z@?+%{iZ=p@@;2EZ1X->%+eFh+|ChNP+>sB*mHJqc2g{nz8%ZkFb)CZejtP0=yaOc9 z5{ky|gopqCM0nWXTA)x@8LwlUF;q}^%bLVQie&-vk#7@4gJ!@2dv^k*3K|B^oTlV3 z!i6hf?po41-!{H2rTQZEp<~!K33}^Kn*`8m5kpG3IA2U0FK; z5m~B2nVK>T4XO48I#!fwjuv5itph2%})x2=lIY&td_p1I${1F%XClvW2r z0>VIond9q%LDGs1!RiYvXsOza4NVi+0Wx3D`fL%W%WQDWoJeKH;vw0lb{)hi){U9)qWV;8kgnf;4Z0SL?6z zIM2|IzqJX$b8%jcah83ZrU`{dJ(0)KC8Hdi8=P?=BI{I%wiVRKQ{<$i6$fU_)*BZ= zthhsbTUwar#}K^?2Df@tAnK0qw-2A2Rih?cA5hBQGbclH)FCm?ayGu0f?d5FS1*?H5pQhSrp>d^pQOTvDKtb35s2%@tO z*?0Ndu^=VqlFHS#bmQm0<=N2_%0lKdlWgRI_xeRd;IPI0pFKg-<8CK00Ob!DE zeAm~H9t%1J@fxnd_8qres#c)ecg}fF8Fl>xNn---XUD0i)q07FloHXXYS*&k^)L@n zvu*qrwo75t*%;A5f%Dhwne9oOLhr_40{S;5-e#3&Loz(-4*F%DM)Lq|47A8=TZ{1$ zz?_DFnh9mzEc08kNO0noS~WD}4S5K;J?)O0ug3d>oJe}%1D8j*XSUhqRyW1aTWv(g zV=_QWpuGS@K)b&fw-PGN-5phLs!ujR)xj#&;BRo9K3n*lqJJkFGxf0jA@q8T6Nr7MQ^`j0!z|UVV#>820z*HKrkbzU;mS^yWWg!f6 zR1WnRZ0j0K>A;}Z!JWyv#Z68rZSh8FJP94gNbW`X{w_m0a?1}DgCnN-Y+$DE&eDZ- z^!!va)&^d7Z#U{U**q0vzbbChZbBaepQ%hepN4nV#C=AcNDhzE6-kBhJw%XPvc)Ob zo4a5zY(RYxSBw=qhY8vU1rERTE)56X2!+jYIv?js)=Dt&qq}pODRm^kBM6%=Q!yS_0Fk{)}ic%(y zPDo;2GJL$$iA7WfVqU`b4#y$7e0`v7^@S!?dagVp?jlqicB*n}yX`8CD0>1PWLw?~ zRjKo6vZa_6O%4txo6+Y2r6+SxFKFnsD~uAk6#M;I{&Oo|ijhr+{Yh+U8W6aA!%L}k4qpH|7qwbBL`uOCmzh#Ux&Q#u=lOg7nDBu7JcTnA_+mADd-~> z9(NPu*_$jwfDP~$k&M*vNwl{LPAv@c*9LA{)oRNrG&dzI*3eC?h20@sY0M9IggBkj{Kc5dC=5h7v2XETKq zfQy1X{7_cJuVL!TzXV0Wt><;0@%&WdSUXyrAn;sg={WA)!xD>Vz!YG^$b);*4x>Tp zrYMx;ALYS$AaoXPZ#XC~dH<_g7{})pz6JY%vb|YTCcOWFh_9U0UTf)rl?J#kgPBDH z6S0_i>Dw+6V_Xf;ewFXEek3{$4rdA{e`{u`!MhZ>K|m>*?N_7DBs`(WG&45v07QO6h?-*=-8PH zA$w+yk%9p5oG-m^EdLq_6uPo~@7B|{p!e|6zljTE@qInMD543*cwo~p+?i-DHO2?vwqWHlx%^M^v53^RVte9!5 z*j}YAJ5`sQa^IzA_si{k?M%v>;c%&SB)mik#5I{$uOW%yLfj^RwKq`Gx7W88Cujvt zLn|gzT-ZZ*Z+ISA8AmJn{0<6VLa&bNiy05kTrG5KxppAJfkiJWRM(6e6-&2Midl5? zhN_r>L#M36eu!UE|CKc6e9pj@+;S>qND3j!f(u+B>WiL*=*0c@1V#3FZ5G-@*fmAZ zQc}$a1>ol3?8F^9MIH2zmD7|~&}6;nxp>|Q7N=lg^Bh)dHtp%lBA82!c)}niAQ>(g zCZq$(z%$WMGvqy{Ug)}TzF3x8Z!l{JM^Hlf8vneqa>XHx6T(&$!EdP}!AKK+*V~j8 zIDiuwEKSnbSGE$tDH461g!Jh;xj(Elb|by`)iS9yC3}jVrAqGk{CUSMIRG^ZQ)z#Z zoK3u3licg)y2d^hP;rj!gyC!aE9~nS1joj6R)qV%`(Ztm2JJ~$VXd7rTP%-Q{FiaI z(pvL4d!kYKAo4NCxeJOm6ClDirguV<;AeifH1A83#CZ1*w)oma`KZ2o2XH-Ll_YD5 zzzSd%&hA@DYLeo`aAJumu{{AHN`?w5gIMhX0!+a|*l6FXm>O;%<`GGGZIu)wzGd){ zw+SFK5d$O~nf2yOmOBi+HO?N-Ct-`D-|eBR`=!OMwCMLs zgq%)5w0$HxG(j_Qs2fn`v%AyGaRu8c^0eCyFz{Ka@{=te#=)f@od<<1rKxUIa1j1dsGctfp-*%K}U;3TR&mb71aHk=(X zLZV>|HF8Rw#e7L`U+zTN0m}mcN4~?59~cqz8bmCb82cr{N~p>xd05W79M~YS+cBWsjib=CCld{53W3$l0aBk(g2W4 zT4lK({6UwcT#0oaD42kr^J2o56c2)c%CO0;qUV3?-CCl(k~*}prg>61E%g!xz;S9z z;%+Uw6s8eU@{(8U&NTMdvTS_lqiX4pAa&A#=8<<`rK%9vn}(#lRKWC7Sge$7KIoi= zK>N!eWGK$fErHUHG<=?V{d{i`^C#`m##W_Hy%mlgw;ZuI6;!?z!zZ8Iz1ux zfN^{tNYNnqQx4qwsdWuQfQ*7uy-)G;8?l}`8qObGsN-}*bHq)77fpt)8|GCDw1|t3 zy3a*I2VCRe*m4y8D^%=2@%o#inJPT2dw%SW({YNawJ@VML3W^+;Q!d@* zN$V{b=1Od?iW2&Jb=s2v$SKJEvQGXKZ1I0bo%-;tBo2Y+r!pUOXq$5AWZ8gy;%0Ob z%wX24r}Tae)y#8kvklCqfYhQV_OU3!rT{y=-meDuqrn@zg(VNM>J?FOdzgmy&>~6d;)J2k*+R#M8oJ)_QB3f zijrx4!%Bhkh+*NXyS65;w_5O$EA5p-00p#cs;6Gi{_zw_6Mxk_VgHu07w5wyUa^3H zp^8WEZe*Z`Gxhq}?X7dU^yX@JojS#;pnq8zBusx4uA6u!VQ@sV%oDsJO%&us>^?RwnwEA5`z6u50@M@s>6;U?V5%cer2TMdq7s@Td zW=kCV9P6tV*1Z;gon3EY)_Sjsu6TOvCMIOXnyp+BM-)fAf2)x-KcW`aXeB(z9*=-2 zXblAw@k_8r;$er6lW1bt))7ElKLgv5SqDAWjk8cHMJC8s2pMR}&T^5qkjP@p`DA~z zsTTn~+%1Nqu>BN&)|*0JqAJ5$=ojJy>Bz^ImK;UgvCdYobkVS8Lk&dAEsa+FP7Z|J zX9^9CTCDTSAzmm*XuNRS#>%nrkWt2*j*pG6$d3PTfRJ^4q+mFb&NkYzei!xglO5c* z>n5m#nI=8;Vw_XZvRYB#e9&C8Xyl8luQ1Xjj~t@TS!Y=3v0L!mg6r^!A3{~H*nByW?`7!K7;khHh^eL~#5r@a9B zr0Z^V^u>;|J0t$0^|3pNuw*Akkyyv80J!NatbIAd;xFf~oK{o9rt|^ot!X15foU|t zOr}4nYVXQ}TYih(v%krKJ`J`}amW_qCEGmRVg84XmR^E2`R)Sjjz=4VUK2l683*hd zK9yb+xr~)rV8rpPPe5j_uJwT-oCLP~)S_YR-kaljeh4U0yeahvaJCKn6gwA0&bT_! zk&r_&mDPnsgi5v3cZ}0CSN*r{6i9m+m5O`K+q2V3fg7s&gX!>4F0@_H410*MeK#oM z^T_*^;UM<7&8<;J2uJg>sanvl!ZAB#f~J){M{Suy^>o@+8|mETr*k<-;jF^0TI1ZJ zesNbfRAYR(Ibb<59WqAgB0Da;xtuq?cK73^tPyxn#$WqWpoL_+*3b1Hd8&NZxS1bV z)PWZUjL#THI15{znkViPet+%%Nf8PF+@@Zd&cZ5&b&;I7r?ZSeGtejBLw*wf+v-}d zr?W<`^EM=FW!4fEYAk!utx|ngDpi?JVSFm{34v)iD` z>4b2ry{ly!w=n*FK$c%h!y<}V4Q6I9uIOpM*iBp&E#B34JlQ@9XTC7(p)J6x&RogJ zeVmhLq=DeRmds{3Q62{1)>ehH2$SGR(0l_nhFV>e4{QbFEJY3EL4?2EfKHk2B$kW^ z09lRQ_OD5sYXitY=pQ%TTz**ew0-QBCq?pbZIACK#*2O_N~I>uWT$}-aB<+d6mwL# zYO2b^M4m~)Dygs#d6mH;I@6b1Qxp7JWsh(JR7Ym?`cud&73)U+;Be0~BHe%T%E`24 zB`-RCn`<#8fK5ZCX<+e4!~Vx^E?H}^mE|RbD_o>MGMe}b1_kjtHFHYaJ)=D()C^U( zLH~@++_362euJIS* zV2(P5yhA=8B@nu=#Rk^pPwW6!q-R$og;!}UaX|0ua^j~}M0d$5e?UNlasiu9+&7CZ zMc?G@uSRg~tY`=`x8H%BebiYFKEM$zW6$>Ri3Y9dKQb$Wt{ZGwIeTY%Hn?y8;w#lf z6Zi`g;TVD^fkY2;4(=##|3j%xG)!4%Hc^}N={-MIAAM4hY zGvGGCMHe*y;xs)~U93|t!k~(VUHeoK5pUFOvXwlSlLJd5n<>`pXEGoyXUAJ&)Xz1Z z-Jm7+N^Hp}mhFflMIO-p5vj~vDww_%!cnvL(s4>k*B%9~>#hEBoX$jg|6>z=CACcH zx04jKL4vs1lFPg_v4%s^2rubzQ$X1oZfg?P zFGtSvNC|p>&xM69o9$QOZBv|1AwG1aFRy*Nzbz^Zd74|N#TTvCMXF3*%=XrP)-=A7 zM`;LWroNK}I2HQy;+0sqMAaN(CQ!E(aTaGW)H!aKWYu=M{C-PXcrZOz@r7!D;=U?w z;r44SuR4*-(pWiC%IZLA0(<_IA+$r!12N|HaWXi>E0ZwxMn>A9-elaQwTGFrJjz3rt>?rRl-u4cWivc|vaQ zc0Dx)06R0bD0!0$f^E~r`N`>olb3-UC1UN!s&pA*<_Sq zkiNwgI}C~|Sz7pIYUQAHVB$1idMfKWVorzDl^QuKJsdWu$@|7*UjKL@6a`M7>3Q<9KqSEC>ZUg z2Jx>)=&`f<;(sTo{)?Kv+`oh-v^sz_agcdQu)U0_aWf;N;NVj)&< zQ#DjhRA0?Sc%L6HQy2udUfdW4909N z7ze=X&hQ21_3jV=qxF*|xrW0&n%uXZwNh}!RD-7$tJ{b6D>RS;%*M4Bm~(4iwfk%^ zqdVb4P!`sBjLVHhd*MP%H;Uq zegpw5CNkT8>{j*P51|KAJJR<~753Xb)-)T*FHCy`c!Gy&Fc)sx;-T2PpQ_jUzu#)6 z0#^#cE6=^}VGEHd>}hT!NY)NH1xxt0FzwEr(%T7WR&8K5V{}yksC~ z@0oNmo==2jtkg=D8=P9Vfo{^=L|uCE81YQk!V zrx8kK43uIxQ2A%qld)1xk1O(<;hXLK;7s9A!1h&u8`9EE8GK%)$bOpqLnEeede z!kj`0d@)*oF9dYa8Ott4=LK??!8+vfh&fWVmq$(XlbzSZY2uE>aGie~%Sd;>_FOIX z!`=#q=gW?@PP0W!^msQ}Yl6M&WhF}~%<>tB+vZwLQU;@LMfJMgWWlH(UI{| zD?11Kiy=EO0S9o&ye08OOt}+w4uWu#ju>*UW6Bjyh}Kcn|Ml4UL6wvW(0ATwY`yez z^zh)VIG{N^0_y7oJ#)~H%SOo*7Cb@o4#5S)RUMSkPqP^^{ZG&?&cvL>4-s9miyYe(BHvk@ z<_os?gRbUiZYj5pao~@A(~yhJFsH*kCSiJSnNIRaik+9_ZfbXuD9fBE#B5|FRFx^o z6D`&=l z9m1j3c{bDuUL8CvAw#m^u(mOK^H0LQti|15#;E=XJ!qf<83PP73Yl|xhSp=q8eMYe+bVHzME5@@; zVV!;#M~a~IfYL0Wsvr()~LC=zZPD~clR4BbHB@&nV@iSwAnLrfuaIZj=iHGNZ@bO)z|AhnJ9^*q^yO}^> z8RuVi!V2{L&O)5=s%|Sedi0nyZStKjY^x{F2n^`=dUeB~aqWJR{iTQmmsh;rXxohY z0=1}P>ZpdaGLsM|xN#rx15jCGesarpWoOT`U=w*VP}T+hb>gMDGTovEo3$-SA6fw! zm6bX-=?)yRmhQZuV@LVV!t4s%WS?2wYaK60JsVZ`gn2NRIRL3!4tC*%hh_dtZ1Mwp z769q(9xI31eXMQJ#2za_Z+ls}sz!Mr_W2vt5kO%gQvBpe&sH}fdL7c|muX_m#@Tl1 z0BKaIgD1IRQ&myQ%~vU?q+*h*NP$fbvyX!5LFVA|!C!L1d$2EZD#Zv-jCs;RlT#oi zSlETa5VXy9a5WJd9vCa-z0+E;vHDY?Wp_?-76czA9v-%3q+l$cOrHU1sL7QHklVMx z{{S?Galo_*>&&9~-Pl^)^gME%8^FYxEfTw>z1}aZz$ow2%=2U<51+Iqi*@DEO#a30 z-I(G)iCT$oSXIb>OSf!ddMdbV#~}()hccc-@0>?m5~couYc(*bj{B-HZ~9x~Mh~=6 zln3vj(aD5-Z6uT+SC^H)m7`5o?4tH|EsQiUvN6^tUf=m%? z#KAv<|w|1iFVw8SIK{F_@mzG!s1(=8dJRo-OEmk zN_u-Q#2?{Jj16$K` z13Ec75Wxm)sZkQjML+|mdY)Uolyz<>gzx8!rue)3mElyEf_b77SZa8yvb6;qMJ7-S-$Ls z0de20_EOx`1uZssOOEU+SJ*|O6>EQ%8tjXb|G>uRoKwqS?h!EIuhGsaR>QyQcNb3T zrJDs@$pu$6mIca7d|nd!i9Gq}MSEAdH5!{my5%C}TaAPJ23}lo`%J2J^EnXx+SAr! z*R}i~4_XQmKu)eJZ)u~kledu~IBzvs>2H^yDM+YSkz&nBS4-|qIv+1vNRrTgyq>G> zsQ}5(>b0Jp1e>;gt^KjiA&*ArO~)En%x4^`x7TCJ0V>k4sg#A#G~RJReW(sRO4|?* zW8MwPRjE-l2#EI*x3s_m_9qGvW=JeYVwI&OI|(+0dNxS)o7-`K>GA0m7_O;tcf<16 z-xS`?N+X@~P>Q1eR$jn)L42}0GrOg9;+(ur6EID_@}Rp%Fx5q~7}?-Vvm{GohZ7yU zcam95)6RbijU5H}7~J?We@4)6GY)-ifU|6HFGys+1`uho(M4RHfUlWJ?E+d9H8K6w zyU1F4Q^)`qyQK2{<;_$e3HEY?0t`9ERnNCh7_GAL;G;9=e;gI&AAq8;l$k-7 z5$9^s_H9Er=U#f%B4kkl*@{7kmxwJ{f49;AjUg{cTmOfP^BB(60u;iZn#E5|g7iVw z1ux;kE+AL3pr#{QWvR#9?$(<98%j)PUHmaM7bGJ zM;yne#pW8?bSVX2beug;SHbzp?t2q8h7s>v(!3lCJf2&Z@AIC6_rQz_u7RNnPsJJ9 z@Sgy}5BM3VbhrzO)54<^Z(C;R;14NS01SjewglD$@?{Z3(TGHX$2{jfYQ{u*1a}1Y z_%)y$4Sl&)bCYD|EdLt>sq8n0Aw0qiiC#TPibkv^+{x)B)V3^3pWEA5UY<^i24G&rjSTePTz0AEqg$^GoQE4z)Ny z`lM;8Ct!P!&n1$Z{#y`^DzCXQ42Vux-rxq$c5>9i)=xF zx?$uf;71ZPio3P)6Ts|3Brs-n3n-E(d+<&|s{8QbLf2`N4k~z5fi4Hx=U-Kffx0Mt zZRtss>|t7^Fl+Tv%}3`WgvAfVK{qrvsOmn@W5nP=bIT%vA+Qeg`6Xnb+=|QHpF``- zTIE;rppE)M9Gs2eTT^i%#t~6+T(cZ3Zv3HDdbL`Jtnx`|I1Bmd@>P;A zWa1@n-^Howu)%qPg%8HII_KQ|8Gd*x6Ea}obc_k1Mds(IB<4U*ViR(1BV(aTD zl;DcR__NUUOhnod7Rxt#(%vYBg+BXv<9xDrkzZpQEx7V-)k$cG%(>sa^8XhkmfV5cL!$E%&r7+^b`yQ5*h zh)~^!G*gdTe*)>sm-}mxonmx|_;cEWd7k5beSxwL=iZg~b8(w|!N#?muZmXgv-~_5 z#?l((&=p}d?#IgAO#R)ndPj(q#U;Svs9VteAxoGpR$rOsfIe9g5y$hQbdTh{bF<+Fl7HsGkl<=T~)G7?t8Weza-75;n_OSRfn$ zL9DloOQhp&E(+9#Z{s%VV6A2;;2v?0rsKTkLW&oG&lx5`=8Yzr8TTxK^SM_;EHhxH z{X%T^ao5HW#Jk>eUR1`?D9vXF?Emc1nY)bu*#vUqrta5Bylj=mVWr-n&qh*^u5I2E zC^Ar{_r?0zL9AgbO0-Wn2#8xc%N7!s;e#8pf_)tTURY^KakF`^WV(9PGPi(K#e_(} zP!4nwsQcH;%da_97#P-*f;GAoXx>9w`h5JrMmD7U1nCWUPrG~!W1Rk}( zZ5B@$0H%29CstM==tS%BUzoHxuKc#9Q>T3Xpcuf&OQAl8#g4G~Q*!8l`SxvOj# zjDsqwHt5j%@b{-_3w>P8Yts+_`yC?ZSMWBs)x1H^X1X@g_ZUoQm5<1?c?4-h9}$~ z$jLBP#q?b)QT!T-e9kqr4kNrmNucG)us+7nAT?C_S1!6unr;tnE{)gvUz(-tmsv{^ zNR0@71|@zht9IT*-jAZFDLU#`nyb+GiZc&V?`?Q|_2cDhOJ3}hwH*?~avZJ; z*|fbj zvNZ|`Kc#i%ivo3%iSx!ng)~%483f->$Bh?l#B&R|wK*Dp-N7kTUR=-O4^=Zu;^>KK zeeX?>!L91=K;mhh0z7_4xk91JH!|zk0}gb5;LXI)Kl##8`L1TXzbi>v)O*a6E#3b_ zKZq)-$;F6C&_r76Sslsn4+~Yi&oa;5LxziVv)4>$acgeWxiVR2i1>AX7NV_11;*HU zHcQhkZu3~*&#UNpH{UYk=x(4oDfhZ#^-X&eoz{#6Whh=%!;%2-F+t}hh*V5?zW{iP76x@ zZ9q(}+ky*a-4XdpXZNp$kk5U%TqYOt)9 z@u~1}^EpfbE)B?S5Xoa^5{)5%K|$l=Sp$r&@m!H`CqzA>TiS<1QX%n|VqNehjE=yo z`vQHo%=QG=aB<}k#SZZFZ|V2onLErxxf2BLAm%T zy5tRz*eL=wFE3*Mrf#jpa0$n$i=%`^&PfL~F6FYXA5h=VGz;)0HS8uM?<3ozeLOmS zX$iRHZ6urKN}2M5`X?}3jC0r7r4bo@csZ(`3K_onl65LP1ABt?4Q%;aG^zIal`A%( zajpqIbr|Q}`GIo_TYEf3fv!jglGb`lIYx~vd^$Qqe7~Q^(zxjlS!yQTOPLfGk@+9W zYeYRpgNd9pHVJ$q_fb&Q8mT+YS0@oXgT#WWw+LK+gUGfHO(w4YQ4gxK^fLdIeXg0G zp630MmbQMYL|*M4(k@~-v$ZJ}f#!!fmMIEfx4^A~p|7(NP< z8GbRl0MX(H4a%CLwWWoD)&V79 zh-3fbYS~>jClT}PA>_tyolylChm_G1%rk!=YTBP2%f-3_J%jisFK_pe0`+Eul~PEF z#xafN^$!QFF>IhlTb>Fe_F6Q>VY%|7Ky={&a3an6x1I&05pzS_<)Yq8Zr#fVJb1Rl zm^O;UtxaiE^>e>^KQn}_j|@MNN>4$>vbM+1DA9G5oIG>EV1k0U*(e7?^UU?Zb(`?rBsXfb&C7GvY_4%B?Cj+Wxf<2l}!r8*;Fzc`2I5P6e~Fs=cjn zz=KGd@GkzE2je33aUJ37KTQzdX5Fb-7gH!4=9G(1plBEeQppWy=BUwjZ@jo-AmtkW z>tV~ECbS5Ka%UByE>kDE4UA2a)^azM#|y+mPZ}q2*so>zYk56qE1?Npc;}zhZM)dd z;v@L_>Z2x8FaD>jiwKpic(|dTXL1z8l>A^HB?aZl0rN6e<>L(cJU1i7a5`e#EI0z^ zy(#*!ZjkixE6sMqv_m9KXakS2ig~aU8097f>cVPCWl1_&h7I4OX^n7}!jVq;y%G(T z3AhMr2fv@$y%=rdm6&?ub=Y^~l)PSU4+q5dmr&@1ak;SJ!?_*vlev+@>8{9JI|Q)G zoFDz^vAHE>v9x^gNucTHofA|WM?{-=TNM+jwd;*pdW^U?XSXb~HjDSesLGSGiy zzm5kbPvM(Mw1b z^}L7RT#|WM>~I!j)_E{lqgf1^eTcofc2*E9IPZxpLNvc;FMdw(8?#H6*fHAx7VcYh zo%WZc!+guV9+uX^NI}$$f+mQ9!3aBj z{rcVKjIfjgT}3oRMO#xhTFq<4v)BYvhzP*y_(6Kizv?q#j!fWK4=SHA@%8h}QiEHR zFjSAT1A7XQ-QI(FEq^Q0oB<>-+1JH+=Pw4u;jsbeJ}Ad;<{d(U)`_c@)jukRPMJrD zJCjG99Y85Z7&`04;Rx%*%4JD@tG!Nc>Q$h+rXk_OmmLSLtIJUix0*2{?SFg%y#C^0 zRYgL55mpcO`geS@!6jZi{Rd<~PaY0wE)aQi1_(g#S+y_oF_aH`#HnCGdi=HFHyG8` z2vUi5_@qa*k>-C0V*~eKn-N5f!UHyh#XR%xFxX6bLj)EXNr|X;Y8ubpxI+=upu7jlIp`BVysY)Ii(_&7k%2Mo|R55eIz z)7_oe>b8IvaH?%7pG&SeD5PhiL1nXW^Me0-ZoJx6Q7M}qr}LOa%YiIDPT60eIIY3I z!`k*G%EBbT;e$nMw~MtHT5N?@&{h`;4FcSfx=;fAq8*tdFEVI|obH_pu50>66g5_9 z6EH&I=G&={1`Lz(W}Na-q07&e9nZo~_G&20o44w?@nDyg{J^ih^8hZ^9r77Q)@aaO1tLe~D4VDpveAvjSAvn=>`OBjX8pVzzwuE`>)`h1BxB5*u|RV6R4-{5mNyb|CczwPs2q?0|1i`Kq~HB zOje<}kioc7KL@T8`gm&hJpKegAkB>oIuEGi48UwNov_T5l!iuovnBIte(aKe6{E5w zh~weGPr3bclHC~U{f+;L>Q}`?|Gv)rIk6h5ifTL}r-=^t+%Nc(CSAL@w+{ul>v4VV56CqQK zb{%vvlt;EQZO271DPB$5P7;yORPP@OsP4Xiw$=d(7~J8T5E5av4s@@0$dJ$hlG#hs zXA4w0?8L`Z%}zIMhdd%l8Q=f627Fwqw3?s$Ix7FMm7W>kn?u|(?90qg`;8m-MEmri znNg`b;?e4Mn%7vaI!1&Y+{3k31YK-rzIQ7Pmi`SzkF^c>|KnyC=Wj?s)B?AfX++{z&#=@ z@4Z8u|0*$(Zp$mF+cqT!(qdGdAv?F;QW8nuzA=hRITIe*U)7Y7%qT~=u_-PWyYQoR z#y6=9$mE2p*$YjmSDCS&*`XNpnhj!0kNH`)4?47gp1 zu*V7NaJ3l(cd>buM^ib=64lRz=m&?alOO|=&n$Kn`<=_E(Z~AQg~j-*u_-Bg{2K6s z{AhrFPM^?(Vt)^mnkRW4iD4@l>PF{uy4WsROwQ}7!fB%XUfA*CUbt&J|L?=#g>xdr zUj{EFpMK%||JoOmz23)jt!YM@vE8i{e=r%;kzuWd?px-1 z#~~m1gll()zjn^_UJtvULZ{R)T2Op`CF<2+CoxRW+gL4`a(-o6fNF=4bEy? zU>|L>ncYtH6og@}#?+#(C*Dhsp5(3#P7N!0%a;d=S361GU;Z`~&%QAIsSFf{$;k`i zn(N%F9EApEw~SD>iC=09*{qJ7oiqED+MWnWv)fA?AliF65eFyuj{ZC#Ge4;9lS#}@ z5x0XnXM!`x2v*ZP6Pd^xHWlwr@C6mt!Q<`ym^e(82XxF0IT5O~YY0QfuGMG*i^!2=;D1zoQFMl%xg z0#_5B0cSluowb2qAk}G;DgBm3z>J#oVDMvtS0vw5)vz@{$~Z83JOVXVcq1}@%D>jL z=t5UEylO@Si9U3G3Rt%BN;qF!59c6akeBGDVLrYJ6L*DVk*HPIpwm}zo=Gf+*^~iE z^m!Ag4il630|Xw&7oE_i#vsg;PP?`;q>x1+jGdoh_M}RH=46%ja&^GZF=U20#$3Lx z0$yQ@#RTyPMa$O=`~!IJCc$*any=q_N~p(g2m#TU@IT{*yd;B+-d$QA)@vKFYmY&V z3XtY#uJR7gtvzet)hkrQ=wFsDvMjl|K4^e%(p_MfwR4uR??4?RWe9c*@OZ?yLGjWF zzo->Uj4$Bn&7tUwWA40S6+4tpW!%rY$ij$=l*Klm= zwpjF^m{(&-axlx5;D49CGK&6{y92=B)-Nf(4{h`E)z_)*eZc&Vqhk>a)-(p}X=FhS ztfQ4g6{g&Z2)BsZMlhh0uuJpJcJy0m;?2DDSEL(iGaKk<&_Ckn4eneEQYj6?9 z%5~N(Uy>wx3J8S>mTd}0{&?4g9DUU-6$;UfWtNM=cQf_MDMrVC=bQ(%}U8J1263{7s8rO{v3wZ9oq z5Z|gbeiZ)%#V^rtW~a%tms@&LMn34%G04sQWBmu`ain*&2Y|Z88UG8F6|7u67hm(j z9xzM_+$C&eAZ{b#7~eA8`~COLGw!S6h9Hj-g}l*~5d(J6>RDCh)x@Ii=dR`weuaPN@rSe^j z;Okm*xa%1`@=5HqX`IDM2BuBo3(#wrU?u?3IGH)O?Uv%hP7$CS2}cjXrE_#(HU#9v z+K)cM2UAa{zpHS0a3-e}lFJ>d>eVr1>E%6_yvBofsZJ~lWpx2S=9vpYWD{EoV;32x z7dDXyzKX^0Dn!v7ic_^U0s8C5>IipWsf2Y_5D+NqXDKFAymCRkx^FntTl3g6U}vU9 zxZZ zY50c*@wb1x|HTGmQ=4ioY4k^F{2Wbo=4vSDK8*$q;B^;&LXUlQ zyU@ys)dt316%J__qy!&p@;L`+oY_6zSa_adRv=MU?M418n4`Hy6zde;3&s}DadIQI zQ4+Twp!D0CLYC9%3LS`9BY#%-mbea<3@$FLXN*(8y6%n0c#Z>b#dv+OITOYkJl2_N zoN40WT1%G!2l5V8Sxjw5;V61#yW;6MXbs z(qcG%fExkCGsC~kf9|)x09mOYyKd?~oy)R__I3R<5Xt66_tBFyj$@WomXu%et9^(F z^~P028THLHnpLz091OD?3WQS@^U*qRF5JDZnUsCu3hp03;l@-Rm*qb^7$oc7c3B#~ z+}imDTr+rQU-mv99>0WtY-+U0fMoY;72d6iV2SLMx+}LlIg_AVYQLm3N%kERS7JG> zR$Bg}Krt-qiI+eSMMM6-zYy)JY+o_7m=HJjk~2uG!|mPA%(<3N2b4X0g0L~@pu|1T+iyAw|* zE|hcr2~=KbCMA<6P%_vX`opJ+S`*q{xyzfzls;#s7gJn8fUS0B-1?VhNz6nuh($LHGIeU!NSH*hJPpf!`AqchV;*PFeVT2pN2bUMo!{kh0-Z3#F#r z(zZ7?8cvL!TGUHhWP>G*H8*iD%zbOzToid@UG4q;5(o(`a!B3z-3v_W> z)g4)%sCmr$gntk0{T8q!7>)@!%FEpO(k)aB5y5UtezsJx$n?JxRW+)ck`bpTN$tN%Y zJxt>Fa~dEXlBr@+9BFdL$jB9O21yJ@v#EUi`RK~E0|#NH%Hg-uAwTm@!-tbAW4V0);Ok~dA))@!>Uy8=eu(Pp^> ztP=NTt7|~BwP6x-^^z%2G1}1eCii)X2CaIWXks8CYDB>{{~2TubL>YxpuEr zM6J~FLakE3kWx{$qliIgW$rrq7=4Ktqnx2VT1QX%mTeBfh7({=7_+x$0cXjz&LoK7 z9UORId3=TvQJaJPt;D)l3G@+_PY1N=r@{<2FqwiO6O-Gc7^MAKRviBM!t;=I&nYL< zfg~8+CtI=cq})8!B|rR7@~mh*`5y){@8D$Ru+(Z)OI8Z&bvE_K*KpK<;+2)gxQ;QD z0Z)+&OV(-Po_z37%Vx54#>v((JeJ25IaptX6w5rb zcJ_ZSTf|IgYOAC*!PtGbX}Qdc56*=Bw+g^@2M4z;2;2J&yT>c|R3LR1*cl`IF;^p= zeb01n7f=EdgBp#8Phjf|A<^eQ5;3gkEDk^n-g#NkY|ixhwx*Cfl!)W1Sr}}7oO(2p?4=b{Al38wdu7>= z8Ja6gsq=7N(xaejUurpp_7=|omQR#jHDrzG10e*j2h(1|IFiMfR>&`|N@56NJO8$9 zzY|-@7U68uYGz7TxUO4s1e^F6G8wxJ211HDQW(D#n8|?8;(Pj$F?4r6SM5R+Vybi? z)yrDdo06J`gG1L1juoYe7Qesd%2;(>IWDcowVB$o8~%PTi8S2vaFYvzf}wN9w{=bug);|>=_=N zb__+Iu~GmCse;cP`D59@BS`qRC#f9k9p1F7b2beq#403&>rm&(7A|x&%FT>X9$dr} z(0PrkN%MWMh!b#N&i071=ZQ@;PtOSnU>>Hq3iPDHH~ldy;6hxm@&-_`XIXy+Jc z@$6;Un~859ZOL%Vi>zNa{W!l3GaT(#eI|0J8yC}4r4ac@BMUz>g5w*cLM;Y0|HebW z_@gAZl1IC7_D6CHWy~0gUgshaJl-jQG%GRwy(n?cecB>}XR2%ymm1N!C$5B9QHVky zjzlPalQ##mI2;pPAn9iJ(m3`CClQDKP)!Wu@RWWU9Gb}=giuRD=6Ds8-}~L@F}(1U zCHWLNf?n&;5AQ=oN#x%KsT|Lor(T1B4QySEVr{4?@!rqofL=@~gIuK~lb{Z|H~1~5 zaCaW7$m+_uL$&d&S$GW%iIfyu@4%OVR7uK)X0sL~W%K$9Bf3nAtMZ7#v5N zBA5F20TYGyz?5DSz#c@+1Hlq8Y;)Z$0F6)p2~o1$MK?Te=qtRCK3JN2^a6b)id35E zxKnC`b;a`JyG=rb!hCBctS&vKbLIsk?|x{vE5wMe#Y}T9M@=E~8-p>RW4ZR|3Nd?x z(#AF}nx`OsYkX+IY$eU#)_jrSS{RcLuBYP{JkrW9$IXHRzcK~S(eDO6di{%6v z5YMOcE=LO2iNAVe{F;IWN^+Q?3auwof_CId24)UD2<*C7k2STHue$8 z@(Sw1nOX6;q001)3>wPh@6xluBXTn`{p zmflogveD*6CE@hgix)Yu-|fql35n&N%1GxhM|RL+7{WL`v)61FoWiX=seoiB5P`{j zpnH5u6B|2!+qj$Nvow1?Gg{OBgUkFYNO2hWqjLF;r=TIUJ{>9m$auY17I?s~3D9OI zU+(+82Dbl+nr@EtE#K*{9tq1}!L75YzNM2*k^+Y@aQ_(A@1Da(gyTCtkaB8~|XI zN>>3EJKWjViY+#@E+2(aD){}@%!$?$BF_$bSrYzPq0%cppPM<+l$r_U@>z8v@TuoS zsnXs{{-dX8pO~)6j8|6$USgN${Q@bkiDH7dH|gXb`EstFj=2^CvwL^CA_Jr+iY_(K z+NMcz@tn8ty^0ud5qoJV4WiEY0_)yoI|c`&;gJX z$t(KRjuqKQ_Cqt{U*BG#Fa&R;)2NCk-EwO0BBk#Z-1>Tn82zQ6xZR-DfZzs>%aRu- z2!nht@rwM@e$+c)Ro?TMhJ&S#aE`n?eG!AJaO=owIAvLS2038Ih!If}BcJ#8o`T)4 zeM?op%Klj6?VTB)3caM&ZfKt4k)WSt8Mlu%@O-H5v)`O4UU9-l9(WEnLS?{q4B^md zF9G!`r&tHTztY#h0_XokfH2eg@If?_gO?Kw5w3PeZ5R;i+erF=e4?$eX=YnI=%5-g zSD`__1kdHSJH2MhzLHJAK^4qp0|uca1Q|@|UaWWUc2Jwoshh;oHahE-^{*bhCZjA` zSPLnkPHadi$anuP^&CMIp79*;c`mWbriDETI4)RWQ}#ydcSWWJM^!f)<}gtUgT~9v zHG?RH1%Z!drV{hs$}@~vsC2g-UhG!Vel$>ldly1-<#>j-O?$bsu%#HRG=9uB{F&wX z38@CoM-1Q$IsUaJviqfCchwiyyZ(!7dj{E(@HX=NX+L;M%2fS++nG#Mwwmeyzt)Un zyBp&qA#x>E1MTOY?*%Wj-C=026u(9VOyMuJ&LFR8qWXSwCtp_gAg23U@+3N{C)76vAuB|jN zY4qxcWl|#8GTt(#nMhqDeqtaMebr7nNhk9FEA|{&HL;F^`(`eoVmJRzZ3TVHJ8*p> z??HF^bF~cH?T;|lls1oJ|Ey{RqXLI>oOKTs+*z?eJ^;YXT&h?76OYPwB0_bb$vN6M z$JhH#MCa$$X9)X8NF&S*P47{f%v+zzcb*UQ(Q()tNSh{%;v3&jPAjRN_Aj(^IN9>T z=h7BMsu7v2^v?WFeUjDY@{GUHWZHa4Ev4Q)cK_rh8{l@0hRus>8_7PKeVybw$=M4G zJj^ifsAgy4DKuDVLx~^yzfMX!hbX(CPTZCEwA>p)4y{4H7PJ?FeOr)P>gu4|{i^Vv zrl?A}-}i+kpINtHE;Qx`kQLD-_ZW;5R8#KgYSO01kT?Zmjt6C$8ZUM^H%%iV)yG-4 zU4_R>|JOjez1jo9WX(34`i&c)tx0%{PggoeQVOHrnDgvph>xvBd3z^0M$H}rwjpFm zg2DWXqe$P<9gT@hB{6kXLZgU$F$A?TZHPAO>>_^Ga#R$BT?;zy=+! z#=g)Tx-B`skFdVp=p(a(4;C)thB}i)t8WreuNl=$!)oT3Js@M(qiw^4UDF)9cm7Ev zFg2hYQ8sQT8ER@Yjd(W2KL2)Z15z+pSdKL3-n7^{WY&53)>d1SB5L%bTqq9waTr^( zfEC4!?inW9C?@Bhe?X-j>ZWia=Gv0|y1iB*nw~lE*)$-4cmc^xJhhJ}j9noGaEj_Q79@+>$YEk7(P`Mf=7=}?& zR8A0TnH>_)(s`08ve2u%fVNel;#%>P;hCH8Cq+8wB*EH1k?pz5 z)&$spZ*TT@^Oj)WT-aHl*nhoIp7$XZ(MpSpFsBxoC`p?uRdFhT4i${%jOdR?GD%*fbv&tN*&RKH054L2I5c_H&`X%eN#+-aLSS|tOdsVP?`jiIk? z1#)Yfyy;lItJ0o#F47abwQ0}#rOuN)4UK3H=yfxLz?)(}x3t{<&Y75%6e?Dzbk(KE zhh#O{(Onr*>L7%f^_mH1Eg*c5LyWy1y=|)A1{Wf^hK`ExkHubiEv*4CUsrFr`yWbo zTbABlFq_IWU6+d5>jLFc~*URydI=nH{$SDswRXm}Vv3i0RodK!c)maxigd}oC)xN(ibH($Owic@^!{e~04b6~eb*5>qeXnk)mLrQb5^}@c zHJ*ufq}Pwx-lF)&c4Pf47v|2^sXC;72+FJS5U3ms=dpTC=Jv0)odOjPK@hMMVT+zYH0 zbyyFK*iEm)L?^mH98LWDd&0V0+Cl{PK{MTV`HOj~f9{jwgX?Y8atwncIONNiSP)WT z?Y2Ar;Q7whD+9aJUH+Vn{hDU3S^zn87cZ*ek;wF$oDjhiRT%c@u%l?*+OhMtN>DW( zeBZag;E-lTqf{jC&5r=5p9(F;*vbiH?DRf`npe1hWPVJ0(4j zFkxzCU2bN%d_M1N>PalC6}z2xqyn6qAr%+cBkvxGI!~IzYHC_gVBI^l$VMy8Hb) z66ph6@+k0Yz!sMm?)0^6f_`#}wnNr;=|+(nlTFcIQ~}EQj!rzWT70jR;3J;4?CWE>9_djk^ARv-+>ZG&GQC& zrKYv&qVEf?YZHRY(%l-p&NFe(!0&4CSrR=!&JQ^b@&|2jk~93BFuolZuD%68e9~f4 z2<^uG?KSt&Bfn#Q)dc?)DIpDNP)O#{y5#UuspTma=PHU@3+x}+YM72ha3s#RqW6Bc z;WR2Q(M}huOIRkp`|0>Ni>%x;mJvMxT_S$MkG>kN12B0+!%}H2P~%4qNG-QbCgtc| z-KF!$gknXk*MM-Lw)&xzjE^*;wq3N1!~0d)D@0EQ*&{ zbTPgDI2RCi6|lR_8XP^y0_`aqC3~x~uQ&c}yOiu4cwI($y1scT7cpxD?csfX6b!rr zkh6L;?-b~+g4vdG!jY!=7b&*{%`EoEab(K9$)m&hQH4kuF*+;L%JhW8f zme3n#WF{e%4CNalYh+U2FPZzA4zrq+sY^&$tNVqlN2-ab*_5ytS+Zf&kZ{vs+Zvdp z(P?xgny{w2_rH){x(GT(NC7(=rIzqG?i|5ohLgdafkX=YokyRJ@dg0lO-$>ZEgKnZ zFCKG|vG5leJemVa)4%4c77ZS_0@{p6wmlI97%wYbMAIQohGWu(>>sN$&he!Y@u9ZN zrcFj~y=$eYWZU`55dVoVb!5_-rED8b=_SwC-cy+D5;tM7kg$)2rbwnlv1 zAR#NLi@HjVh(q!%TY6tEDo95ifT8y#mZ23PM`1_vOkj&JbM)6V4#h%q)-^hSj6EVU zEg|g5j)u^C4Z>sQ+2!S1Mvmugw&3~iXQIg1H zqZ1zRUGo@A6oKKFk&lc{caxN=D%`sz!+1Ng;?*6>ILSWYT5=y8p#u7v0mb+dAoDWk zeWUmM8~(9Q_^bTGo=C?R8l0e(5|H1*^-p?76Xuvm6Zzuo)Q!KcgG4+3S`RY%5b(9* zC+Gv@KQgSyDN&};1{ud(!#IYHtTG!L%a+tNGwsqX=ujkvYPDX0=zy8mOl4}GP*BU_ zHNS0S)vAXc`tSx5bvCQ}6tL8z&Xc6vfSH(fa>e*tlz87o(Zq%|8dq*K(LKH*^&!)1 zgr~5w2MZr54RV037NPCSy?cNV7^$}pVQHHr39D!f;L&Aa-b$?daq8vdT>~oR#&60l zGn~av`_>e@_2i{?W4{e^36j4o79a(sN8uaraZ(2aarmycMePHr;p@&;GW{%AWU2vq z9qJRvvSxgH)EpQ6YuP{}NFxAENBYrJbh9wpssajc#@R*dhzH~MrP-)Lr;9E=vryob z(98f5+P&%$Jf(sA7iPnOQzCb(U9!#t)|iNgo}_qL{3cBO!E2fJhgPk^tRs*L&OEto z8Yr~Y6>DR9nQd56sKy6hX^OB>hKR18SuY31mr?l^G*d6QiAcH{#7fs-82qewe!^{cy&iUC!D!V%p-NKFoIa0{e`dOdx z2#pFHeerK;Qg<~{jCq5rWi(>dQ2{u6%BLcIQd~T{m-2{Ry!7DDs<5*ksA7;u3UlZox#4f*^5NEi?<9I%Ub#w88m zqj}(ky7f_HomAB`j~QvRu~q!Htg-&v4OYDXP6yzD{GGk49G7eKklKvPa9SwTCQ2`{NYew(nmiuyPAN_yJ!-k(<^_-?!WEGPSO0w{$W-`Pup~fn&y#W1 zm`rf*jjn^GNzL*CX^T_=I!O&H>ahTZ>fRnS7h1AREn=-c_Nct&1${Owkf~>8nGTtbRe~#?QvFFr7Ni?L^d{ zt6{c#$@(unvue(6yCH|YnPF^$t{c06D=RJ4|Gu~_GhF;yM&S7*@D4wVAhR&ipk_01 zeXP&c^EkeLaCya}nR{N`(|g@G4%#`5T8F zQhG0g`1y?AgU_!f_9%oQF8nuTd1=}vV#~4Q6Q@27iJ=}3u6{bO%dk<)NpV-LhwG7g zLx4^vyo^7N6dnu;cz5yb!yx)9k)N6h&3RJJc|RuqGq7tBND&+cbzRi?&z{#^?0On% zh-ntr$P|%a$Fwx2&2P>J!1jSgY|@0_tZikw_lwZJ6=& z97h=Kj?8<6@h8$xM6Qu`+e`Ocv@rgOih(xB%w?qQoNOB#8iRNyHd0td?Av$}DLix@ z6#d-?nl9yv+~ke%C8<478SNaqfHMpum08Z@l5tN2yT)AiO;a7;Oa~g0E{d)~V~t9! zAd>Zp?KB9usOI#!)-hKC}8|k3SQrL(chG3jh2tQsosyv@q%eG4v2uw|Q;ysT( zT)>BSf6wNj3GcLtajCfG2?B;R^j8_r;pmvKI6+Yf8`hY-IiqX6Y3_Pxob7Hn2*N15 zuQ+xe-qf0z?+yvcCAm=uv4C;PlwNNlHG#iGC;7=-fS==UT8?!53%Y~1iNEzL_pK*J zB8|y55<&lfUr#Ouo7@w;onrX#Z8X19^ZFgdv zizQJBgFxQ->UO0foPtXx`bjsyvt@z8bTpyuSq2R4`y%K}cJ|({q&7ZDe^J_`GM7NR z9e6YEKMi&MPFkhhl5NK0z`wBYL`Zfb?rx2?;2o?}ZVaf+@tRY*>vjZ_va_hiw7V14 zf!`Al(>~OC;A(;na$ZsxoacG%wE>2UHg?mK)1V?pK&-ShgngI$?CLJ2##oQ`MU$_C zCU7cW3&Fy=l93?EP%L?6wF#lK>8}eo8}Aq}lUr0uqSS|iRm+cgykk%H51QQVgFu7;BB|ku zmv6ZA)Py_vT$V^42aAB9`8Uax$A4R8zZhK*bDthDXkIY{7i4584pnWL4s9wFczeC< zhT0m8%*9bQWgTDWG)TyK-(4suIJ-eyO+_$tY1Y58Pl`8LPOD6WPqIoj0#aP7=%gal znhNA(G=ro3G@nf!V$ghb=ta&<2}hu?@wu+-QYncxM%PovpS<3~8+Mc3U!J>c5hf>D zhqH_R_i6GOqmHaZdXyCU)+C2Xdd>fBi;W_BtYi!0=5`j1sNNtQc4aB)yUKQ&uT<94 zTLh-q9UF=9SF@VUG=t^Wp(KYBj=Y?;^iM8PNF`DnL;=lUzMA>t;qeX@zt0tiXjYL%+YjeWzX%piBG#23eJ^G-B6?@6oewS6L$ zEldAsU3N~b|Ge!<6!v*<82%>4Af%=Rc98&-W|=s-21~WNFr^vzQ=&cbPKH;);EwV& ztTDB)lT$DEjHQo*14Y8`oIEjDp+TiIcAT|SqE`HG@Rs2Rcd2)p9^Ht~t@&KQD@j|~ zWvYEA$H_ab`O8Pv+*3?mm^4yr)}W3cwS_v;RvtCM6)@X!>%%vo+Z{W6)MXHxA!Z4! z-&&i0(X7kQw8(ov-idBaOPJqkoZAc(XdX64dVST?mEXPcV$;qKX~Qc4#@*t;mDLEn z??U@a^cW*|{drtjIW>*P~5ZFK&Tv7y4oGA>~cidnR!mD}zU?mmu@0y0g3 zjgdZFc8$R#QR(i7A9WRz6Z|7vvtyamZ@I278VClNr0bE17T?=1Ab8Bki)RB&bMGyW zgpd6bKzi2B>+!14*_uMQD(?(Y`nW-f7;eEbF^b#OA`+`lNrz>~BgJ#b*;_|%?d*ad z9Sy6?6l?nyK*-I0R}0y5fVa7T4W zo)L##E%kf2IemSSKe{`L-c0&O=O}-)^TkEhb-6;+Xu=w7my8$&7gk5t#9dGfKmTN< zqpps9hBx2gaRZ6`g;Srbvs(cE%=&d_1FYG`w{uv`uMi4Bref3PH_kvnutxkI-k;z|ymR!e z7*?kMw}$_rJm5-Av~C1PQt|*l^&Oz*& zM)#U5-Q^H<)4b%qa>-6XZOjVTLvIpJ$qtYFLdRv5BF2Yuyy5y1HF0s-3q0AERd2^z z@{Kx{IaZ;_kbDEZeBa~>q5{X)P3#UaAV>bOV>pyG0_-|0WT@3ZGSu@In>@zS&m(6P z{LOpzL*O@-oXEImLnK!-j(s0v%v|t0#`e_9sl_x${*eWI^{cNj=C1P)RA>v5aij;r zC(OJq`9#IGdeoNw45jRhbIoR5%DXb;s1}!o=45cg|3TN}w+Vm!U&%>mJhF-n%ceLbh48WkR`1N7H?|3eE3& z9gkLenMKc*Q0()=+}%=7hwhd+zVz=#y*p_6o6n{VVoP=e3aasKZVfho z^6{6yv^LK|pUdr`MYY!|b4R`JCeSvu&ypUc^*Jb&w7Q37Dcc0vlY%eOtLdBi0SB=_ z3fJ4CO?4nc$)ch4u0r>MsT0J8GN)$@IL1%aDG+WuX+F|7HQ2doF{-hu5XzIH+tWE} z%18@#7^am9ge_#SZbRUAAOFuML4~BiB84`}XY`rX0aur3scRXn_A#>9)awaNnWxDT zm$|qQ8uVOt`)D4d~A=bOJmfWc<2)R;y*ZQK!#UvXV?D#v~7 zf>Le1oA7FAp9uhPh_6MOBVRiLk6DJo|Hp&=U9mkEkr%$prTPR&7}&o$4E~o}^HBi2 zlTrL1`E;22|K`(7s6Bu{1|-1V7o)pyhu+k6ZIElYW@vjh^S)qO+27hQ#)z$lwI&3f z`ba}bc2PR-%Y~4DY*OE6dDE!say%5g{P}_)<9ap09#Hvz)+k|TQydFmV1t5sy%pd{ z_-@VIW-$oRXO^|0-b0^v_wEtk?%Asahh3{3aD;)rTb5*biaFa*pddC+a}Hj<)5dmx zK2nFkHyW3SOgw%}J`G4y2wfrf<|JBn~PLgl&dM(MIqC1yzPlbl2pl4UE z|D-&mI=q4B9$@VKMopo_JyG3kwD1Cr;Vj|nA|6(*WiRz0L{m+r!65%V5(TeL7~~W7 z!uoo5Fo}j~?tA0W!f@OS0(xuktp&1%QIROLu{v3`YsZx!R@2F!X!TJ>7gcZP3EiV0 zZ2V;5qmjj?3+G%_%ru3(nyU+MxX|tf8f8EHE{Yr-gROUo)w0kRv-VxfH7=9m4)J9w zK-0GnRYe~GyNqbFpJoP%*{0y}ak#+aay-dnEdxCtyI92A+eyz`fYF}0b<4QWt`4QvX^^$i(#G3)M9DcP^sdWXs&!E)jh#b`GM zR)rxKw8=6v&5tH1?k{ay1z6ndY9T-jqpLR)9?H0J+Nuhd!Lr&>iDPSUs31cRR0$;} zXsa?%nfetV0i;d$wqqVn-*?)yzdQ?G!sGS@ptWlOD4YTVF2fYM0v)W($Pi~b3`E~$ zO?vQ`WaXlrG=Tsg#?nuBWc6pXKrdjsV-1?U6c)9|=1iqB?%ap0RF$QqRjCLnRYYB4 zYj^FrFI`_sjW@jd9|1PCN|T(AFB9R*4i#MGJ+5=~KO<)jj&UU3kKx1a)(8(5aJLe=~CrEFuJ2%`FuGrd+o@j71yn*S&-c{4qaN-EDiP*{tN zI(?&N)6%VV&JmlMmBGgRXIv#UWsG3z;n1d2rZV;vO`i&8>dJb<$qBh6gmu;v`k{>= z5}+P?%v&j>jWDmDu%(LVfXlv3Bbt~L)_nVsO-qVT)JaFH5O2^Kj~wKSma4RY&`|gb zGMA8kzDqSSqXGrra;kkNXPIwa_?zMeuq%@2)AYs)@~@)`Th5^aca78bMK2@=Q+d%9 zb?^qNo6r_POrEl_L5K{PgZr1gOJCz(C?F>t>Ekc;k6wZltyiUVQs->{93^1UM*ecsJB&|Taa>H@jMh}^^b()=Ld$U}rUFKNe+iBi!O345 zHl>71iEh)8HY3Ap{(BLTVFjUY-b4z=-R&JCS(zHmx<1cIY7i53y;Z1H;c8`w#IR6A zF$xz)&qqO6_*8ky+UK;y`Z^st*aBB+f+{?=k`-$cWBO7GASGWdvtFFHz$Q67tYZ&Q zzQ0Ltam*t7fG2otPo8@)vh*7SO(cnMM)IPnEp_J@LxV+cV- zYzr+7lvgTIoGDQi(c7dlwxP{C;oJuuL=LZ z3{vD4j1@S}JtRPA9;Bp|qWMinCCjSGgA*KgK$xohdQbUxJsNo<{dMVssOQ01OZ^7!XCX|pfrfwooC~MI(FhrM@hrgqvcdJ{Kw4-V}gBR zuN}}8P}%_swlxecSpHb?+fiJpTLKc^@T+?g@*$yGcJ*?l0AXO=&R8tA8lJTtU>Nh^ zO2@*Lh896LZRf^uDpsF7P9YAX-z9s$hGV7i@OWj-dw}mkm=Wm>SD0$mP?Z0o7KQ{k zK8_241?GX#4P9)K3E*yI(;LfO(aFpKuc{F)5T(T-(T&3sr zSM#Ngfx?Cr7xGtnGLf)bm6v8D7m0C>LO!PyHBkYw8hOp}{{`!Z~8yQ$yrO?Uh z(I2PxWDep6pGWwFYG2a38RV5;6?C0H_!e4>C*k4wRNo+cW21y4CpYf|Q9QnPRVYvw zl-ZH%J74QlCW|Oc19SUAkEzz*DP);EdI7#nL%_5^;NLfe@!4&7^zi7RiNMeHBl6#W5=77Zs`^YQWylSQnK9GOLg4%#AR z`H?BUB%iL04JMzyelRqc(yBFV%vG4?f7O`_-r|*b1%2hOz&Go)tRZp{%f?U=jrFlQ zSu)xfmwNy7^P9zjJnXFh3ekZQ{{jUihpxY8%Qqn`b55rExOvYxieyVY!)({A!hsq- zva`KVhSwW+c+!Gyf47vnJQQ#*4vH&PA@-G8R=(@$J7m+94~jNc@P1YvwX>ir@3_j& z>$?>wDs+ZRo#MM-)*F>3??b-_E&=@&`1vX$9cY-R6pUr8DTh4?_$JE?q>#o6VkX7L z&u`*Apu1JsEm5&_*=I!i2$D6Asc%K+KEM4Ka7TZ2y&_|tPOS;pH{^@B@x_#~|DWvk zlKgL_meKB>F^o*uo5%BAQwsqa zU7ER?0`N1;n}7FGXxKqLFq6L4foCT&X9Yg6(_r2CKeI#)EY}(Ee;1#SF#1e+JZ4qz zH@)=!Z7evXxuXzra55|j6n28EV*k*8;++`&oHS=!*^;s~j}4fwi*Eb{&n`M2z4b3Fp9FAn z#tn@!gpC!ij9_Oz8^aQ~aX2TAYMh#zi_JSf_RAb5Tm`s}(o}3VVJ4V`s*LOyf&&%a zynd7>0>xpiltXJp@qHgxt+rl%v0+W$pqZ?Y8?3m^<_EJ8gNV8DJnFn8V3<+M;m_4t zQzA2O9nYCUJ?qZcvWO5sO9+_Mn({$`oGyncYL2+6Y*|>$(6J|J#gs@{fr=knF~00> z0X#7UVC1o!5p54@WTB?^ahrsyud@Y8^q*Urs-9JHCg?tt0`tjO@~l7q9oe zc6uGj6|dUu18A_RO(wU(pP(9gYXf61(C(!6sACtJ(cX?&%OBVqZ8u)VT|F#dWl?UD z7;GVadAC)cJ>O#_sg~=8S9mT#bf9(H?N7l`NzW8fA_+OyLxC2cp%62z(Lv>|LPczi zi0MA>a@(2f3s90Rkfu-ktGeXr#u8;9S$>Q21sKSZEwi?)Y%1v^b)l@(1&|>ky2J#5&#GDZ^0)tY8R(qXDS4aamz4 zHK<3H2;3Ux+1ZKMe>hfKpW)`|z6(|2#lzTVeeA7-KU-UV^NZ)T(OiR!fDi%}O_O42poWFgWK=-6_eao$6f z)&Vyk3*B!`;^n^lK{k>jKCBBnR{H4J)+o5fi9SGGVX|hgHXeu~10t5B&6ma~_L2kC zBU{deVwSAfi{-41*rv`HOz^cLN)ol(1!rC{ui(i#i*BL_1PV_t(qg}jK?ns5oE{26 za2*-hjVY(=ry883=yZ0pn#x@bbKkngZE8rC~^0FstL&yHImrr5*U#Pnz4k`sY;4AduIFQ&R&nSNj*kMN|~_ z%{aoBZed`gHZlEiqg1OT1w_$zn^Ls-z6q^q|B{Tp!3nFw56{cE*f`FCYptBus^D%j zV-ntKij&sirwRpl^~f({3tz_HePO=Nr%Zwi;TFO;8gzpy7il1UqODQ@LLE3?(pL$D z1R5e~YmoWBGwQ~#u!L{sgIjAc!^SFHR@iJ?UV!4r#QN(_On(~H!4vCLPL^u7W+9p(HSmfOCB0ta-3YTBI! z%%5fX`g6dS5k#WCb&i=MZB{ftoD}~ASjR(kW@AQs=^^>fQW4z|#oRL3_s)?*U7R)T zL0`zd2o_{gO%<-TwCjJLJ$%w67nc~p;c+UWj!Y37Mo2l0b!`hO? zF%0v3ST}9Wy799E4L&K9b!+P&N*Hl(F0uHuD6`zjV~f+a8@i@q0bc$j;cWShPWH&> z7%^hrzt046Z1&Ya{_)2H7-S@jCo6C5b35~v@`S=TiRwH!L5uA@A&Nd-ZZ7d#8wS32 z!KVovEYdH+^{Ojxxg&5Ij!sE zivw<~ofk4kcVGXvz>UKtjCE)^P$2I_{ZYu+0yECt@?j*NX-)mkmrd+(cZ9W)BHzt( zf*2;Ma@nWpfgu zTWewC(yDB_rE+>ad|!JZn<>A|DI3gjZ%g(P_L`OmH2HTCXdAw917In<&eMl)Hu7u* z8qG?~SI_Y)BvMU0%LL7%5dFKdSDxH*kuumF0doGpC5+U$&g|mE4H!1@8wIE2mVzTu zIsSJfL+LRLLCs}5eqD6pWs9B~G%g}%o@3rXR|osl-Eqdy#UGS>c+3L%YHs-5p_dzhxA|T+<<-JiUzQV?h z|25XS%Ub$pDF3n?$UV*UZxM)Lic4ju`>IA$^)vRk98DZSIE;oY%(AR;a2qNduLQjN zRu0?=_-54?JZzZ21iTam!X5LscB1G*R?vu!q$sL#ak8&qLn$!$P;w5kzI=)AKV9OB z;RKg@m=<%W5sa+Y(WpUlzPTTV_YGX3ZT_4pf9CL9NZ(OTif?KT+)k+O%9mY`cW6nT z1r1&647$mH~ zKJbRz3`MY95p18VzJrt(iuA+!@4mz(fRe30z(-F@6-f;Mz60&TAfLSvTa|7uY2hh8 zbj0oWwkc*sh@hBUxIi(uOf3C^P&p_U-Hs(XMfY^Wr*!HzE)oLNTo>}uAet+1`}e9a6+@CB`goCiSm&bpx2&*==#B$b z5;>aW%4G9DPS@`IH4`+AuA=0Z{+0uRNzo&e-apc*HkGUr{IObg=L*0|N5bTZjY1W5 zI=>wf@ioN3;3-=5l9!mLj3~R$Znz^Gy>etGnHnA)XSZvRmbAhs4sDSre#}eSrotl5 zzOK7)iwy92+Weh-ru|65Vi}W6xiA!+0>pmtx^Y1nl%L?Q4!U=T<5?}9RjoeeoNgyW z8Xa{Fu&9C`97=$)$Zf+gI%`o;Qebs02EuCBKJ|0H9<4ki3~gv#2bqkSewW$F(ye?c z)ru#o8ZwOhA+wse?yBH9UeSp5={}e4D#9*{20_4^Z!I7E_?Ku8R6R$Fz9_I;^UKi)YOGL}N z4!A0}#I^#BklIonZz#oI{~rL0Ky<%e+T2#{Ji7B;B=qa@W3IDOqB)=9C8`}H9V>Kw z&!96^Y_y&|+Jg_Pl-!!?93kcYKiG>`(9QNd6cZ>BYz%RbUgxqgr-YgC;WP1ke#RNu z1T2z?MIO}Z5}F&>!g1Fx*QB&*%( z2{Utyv!jFG4CRW6g@aAOf3v!RfdVQOqkTI=wsf6QBKhOcY}Pamx?qx!xK12|Gn$xc z{(m_$8C1hPlVKAI0iqetZO(v0MYRoR90Rtf6^=;6b?>W}R}Oy~3!K>{~;9Q#srHZ9Ql zl!>X^3W@zFk>BI(eX4vfQ&2ZipSch6008L3PeJdY`dwFe72Q<@*BSlu?u3zyeKY zhc_ctYw>3SI}3_-AEFDW6~`-^kPsZND?VLkWHF^Qnl74SF};8qq`l%+jIzs#75?@? zp13;DInezD30B)_CRuf=vBBLzd#1S+Q2`Eag|f>45ZL>!WpPip;m2 zP0&a834dcqD7GuFj65S46IQ?OTZD5c?Qvz#L475=&q@Py2lMC)=`f^6j8Y7-%+|0* zBgZC)=W~%|cwM7!swi@$JVHXy7rSG1RTR8)zSX6|g(mpZR-1tdH$FO84Y7;C z*HS18#RE&2^2LCMWXK{<{l*DN%EQ7g6B=S!C#qK+%um}h!LFFUd-}vtJRWmaE7BL_ zRm{`YvmMZr57}Yz_JvTo25?lR^>9WDST{Uf6z}^64>b8`e*zfK!KZY^Y=JjKj*DB_ z?6{6y+-+ZzKqdTz9Q+C}M~}P+pRsB=xwBAAIuL(uCBE?I`Ne7Ej=#NIU^|b_jFNM& zFKDfu!BgNi_)=3~n6iI{%KpQ|)49`Ae(w$JXE}5%dZJjoH@f1lP}*_I-!nfdF;H>> zw@FJXUz#i>pLtRGEzMhipaAErI66@=;S!HxO3gN4eIV_1^cx29QRXgLVq!G_Ix~mZ zj{g0Gv$p@gdA;1_3a@o zoE&z`+(kocyYpcBU~NO)pJ|oFVn+T3g#iE{#NyaoofvL(vra>qChH}1;308-f z|I^wffwrvf{rmxVExn%_He_X048E<$2A!8g`?r#D+#4RhX$>>taWIQ;hxgG|q!j+q zYD3gsu>^t+)us}}Nb7OGDHHSt6GVDzk2*63lUjdb>L9qNQyUj7o~L*P6vx5$MgXYg z?1cx6l}&g36G3CZXn-xnU4rt;Ma6MnDFaku8~Tn5uaqDb7chSedhdniqgdA2wC`e-vIlw#&uf$RxH{cNtn$#U30)0D752QF~w`Yb~uP@%~kkd{;60L5WILN z4=};_v;iT_+sDu*!a<~(@33N-JmuM=u?2#vlbTJw>ptweR{+e;VBl?hRxqe7R z+T7Om4uv3HznlgrBmq53*aYqHrTS`W3sua>D34J_kp-5=!?V;`HWCGYt0sB6LSX4G zt7!gIrS)^|Dz~~Z)7H&3Ax4!fIjOZ&&ceYfzOvDx zk5=45ciX9Tz-=q}d_A}x^39(pT_P5Pncrys*z)F7#>P_?x{By=bzaq0_&h9b!LR%*^>`ZwVoZpnS5vT?Yr0}g#{lA3>QoC1I76{{0DBz);)v7F zDaw2Ed1h9F0d6rzaB3cO7ogE@c(DS(ik;ap-b$2u5|j_Tj06nNerf4Cm|pKK{dbJj z=S3Xk#(ozi0sIwN9l7KXELuP}*u%JuwVdLiVP(%h9vy%l61;(uVC+5^nLhlp&w09j z3lR*ETM5r~6J-8O^t%dLk?jrfH%1G-UFk!R)xD_lNkYdO4yQ}Jf{uM9@J@f28T6xa z=7Gw4S!+48SahAgARo{nTOSvNbc)MBqtmO33&y&*$XIDIGAuNtahbl zLS0xPHq_i`X8?{|#_P6Gx@44{{~J6%PO&uBJ||@R81#lKavvdLH}gf@>0Kf);c?(; zSURBo!aM!f7zpL>`;2={GsH`tggD&z_N+M~vIVt3Cb8a}C~!O4R$Zy1{q}?A95>>w zU@*t$Z8w%GH;vb*kKjd~3~hx?%bSYiPIuSgC9%7hJlgU$?Jg&c$N@rzB0jMS*UHLw zJRqB6i3(QKF1O!xc};Eujd{OwNcO1M24*vgmVsq|>I-tqU zZT`tb;TPYwn*!5BeHnwj7M>%jP1Y6rZ7PP0(Xo&#QD}rP$CqRM=Iwhpy~mvFhA(I@ z2oBa%UDTQdn0EcA+G=|v_lK1bu*f{V@2xofRJ*C?^=|jA#sa0}?EUD3*76AKpN4`(5oKluE#{TXZZU7x=BX9Y>_Y-Z# zQGlgnyX`8)v_~6w;cK{EkgLy}R=4uMOQG0sK-x~2j*IYhOGV89oCghpHx+FOWL+3} z^g%i*_ONP56?}nzt0r^&x0BHSfLf~*dn%QVswXT{UY?*EduPXzY{cb0p&LGTN1s;Qshk2d78e%cCoMsfMivH_U@Dr`lQZKKKoT-hlO9OMV`>T9+On1@xk7W zC?_dOCw}=$XHXI%Ta#uE$@suJZlCrML6ua0VIl-0@hGGzM*>h1mJ&j6dmF7ULSF-r z4PivN6K)zhDs-?#YnE#W(@#+4?$<`3qW7PDq_@__=T5U3J!~)Bv+@^5>#1GdTO1H+ z+?b3?hmH56FQ2$wPw*fsFnRl5*{^XNFy$UE{q3lPK>Y|8? zC}KbpGH9Ln4#a180sSB;-hmS1`i_RDVRhMznZSSpHLN9QsDNZds{YgpLs8lZNA23S zSXX9lxtO_t`@JsJ@0W5%n!r3Y8mzN}PD}t}0B@?IZ@>Ej^xYD|)NUx?+8+aeQpAB3 z(cO8=pmIssQiJ6y$unGj0i8NJv!YNL{wys5vQ!SKLkiNr2?dRPWq7*&NhHjdskiYZ z=p-<}xOeP}c{+1bK&hnaDoGzS7eQ@M>7+kZSVS&b60*Wh~GMYd;I^p3Txq(k@%e z(}x~ad%tU^SYOp7?9^3LA{d5{owQmngb1kNNh+Z`{yCF4>@)seyjEs~4_14mXg{~g zZcFzA<8QB-O$4{yA*mlvJFHWQwSoZ8ya~MFUO(Q?B%nWK`j?v?Fl=WJ=p`NW4IA>< zEB~x!Q|WYpj~-hR_OvzIya876KQ(Lwg)~6m9wDcnc_{{arE70{8lUS58d&w9-!NJ% z$vNrlju5Kk<_;kn0`dxtSt%2_EgSo2K9QEea8g4UyEl*~Jw0y?uVZWW6o7y<_NFKM zXOg`Cvv2RErWj>hVHh3qQLe*raj574_09d4cuD0l(>Rd;aDPvnSV+>{>Wg`7-L@A; zXmP;$YhXsZAqrp|xOAgOsT`*oljYitMn=|n$F#9FavGEu-HL0ra2j)N<$D|Eka=5% z?egg>vs}a?*k|9qiUj{!8ASyHdQ5Jh0oH(5G2zPbMmGZ^60Tf08JPIu>7hM)J|fls z4|d;lDZU(Pc{Mc>e@<@q*Ajl^%XC+*yJvWKmJ45P$t!NdYuCGeDss{khHURjxHUI*cSWfN~ zIaxxTZrpp$CeSoDrufr6)AaKJi$5 zOU^qoc4I>1aiL2dqQwQw9df*@(v*3KaD5b+twOr=I5Iol&;W1NH>|qWE3TThWm11G z^!%3a-2ps02al1n_?SSlo(X?_Y+ z^Cff!?;>S7u;1k?x+w@R$Dtd@&Uuj8qn&a4GJQFFn!;)rwZPv3N)T>y3A3R&HasS< zu06%I(S94e`_Pe#z1M+U#0+jOz7Yu+$>pyX+vZh7ccYmV`E?D@M+Y4XUUl#%3c=I_oT=>GP?tE|D)n|L zYze)vDZvjz8q=tO?fW<1`~DyBBhNlBNHCBzxY=}AKc(IF%4%=r7+HL7DBlNIp!D^OA9})o5~+!P!uKsk4L}h%CLEXw+|kUw%>W}M zEUz*6xNdlEicv&RyNRdIPt9rTN>>v9mk|SgK$WKbfCGWWW*WTi{z5n1pjT;(7tKJB z_$Af2gIYP*d}~m(kB&5q&Cp6nxR+?(+`|C^<24X6{wQsLof6DzUB)UlYcZC3wn$Lo zqWL5bwAv|m*R9xCV3zsvXzz3jUi&Iuz}#BrWHK^~vG_1yLrRguDKzhQlT?_n2U&)% zrQaLd`7Mu|HC;tZRwwVV9x|s&VvL!ED(`8PxL-Ogd6^L~C==C-V*zYQeM}ta9{6Zn zc7cuYrSzh@OfNN=mkjkQkANLO8gYtg>5i$t^K}9LS1jka1f^`WB&WB<-=Nb$e^%+O z3a}1wuA3xxlKC!7(Gs}hl<^Z@QnKG2$6{S{zz?w-ykE`PHnze60isi=CI{x~lcf;@ zgM}`J^LElla5T1HAFH4jCqhn~kqbPFr6r$^hre3+BRt{s2WO<+p^X%W!{{HM_%w!7 zX-ANO_M)AU>vqlp!n)dQmx(jg#Y}gz`reJq&bVKA-ioJwtx9vh^j(vG#W9tmCLT+vivR?k|x{jYUIKPc-{kaet|^=(MJI^*DUCOn;_B z;6e#fY9uzQxan23E`~RZjFl~Fx0>*}$+j}A!qzEC8PPssGNyW1#ea|=E=f#iDE?O( zaKw4kGWCC=*vtF(VbH=w>Y&4y}iN zF?f0DT7flWSf6}{b7vRUYS_3OsZmX@a`voI3cqlNm0K?o`=}ED;PbXj~S=dh)SQK=~)1H{Xx&?U;MnZygM)2o7fm|g51AfTc zJI;QfO0!+c1C^mP!r4^XP_B~idOI0=C2)BK4hf@8V2UHrT0maw)8O5#lB^6_-PGxu zM~g)XPi9J)96T$^9HN}9->*tcTTMdd( z>;?L~4Mij|J-x_#Yak9|1hObgp5Igf(GvmTD-f;=Gen)p1hGRorGHVkvJ_T&^%F-$ z&9wRVrE;@oqg~@7M@>%YYSoz@3|?Z%0pacpP1Gf(lI>-KqveleBgb2 z{8R!&UHPscfZ*5?`24l|TE3N>OT`vhKN0DO;%}hodDr<_20aCSbj}#ElhqQlN046h zBR7PpoZ98Evk$g0ja|=ITR85@Y&r~6iaDJ7VcSSzy?VgoGwVFZ15bpGEs;1l3f4|& zKfGXs=ph3AlXYb9^8;i2@w_^ywJw_?2a1#?JV<5bpZUOF)uGt_P3cSxx_w?zVeKykFa?Bt}XFNKZKfxv^E7tTRBQp&M*pZ%&XOw z^NZ2e!C@z8W`)wgfdG$ltrs8Rl6Nmx?8$E4Mib{~E>AM|1XW)z-TnM7i>2wll-ED1gjt|%Is~{b+6jp~ z=(u%aUrVSnb1ABO$Ic?^*7dNf2v|gu#L$siyR6Kt;w`P;I96V$_n&%TnKBv$a_LSj z4cY^N9A549-)L9gN0nzbXwRZd72o^?R7Di7;>ZR zSOH(^c{7nMOfzwtQQ3b_f+$_f%3lQ=tN~nY76xeVfEa}nUUgr}aJA>ZYTEvS%@ z02C3Y?Y8SZL1l%$(rVJ@+J~RQ1qE(mUm=f%2NX!DwSHV{G%ul%!+|vLK7H6p^dDvZ zt1$itE+O-6*%xx~a(j}DiX~=35#v*K{2H4b0VHJP2)GvH_B_)@n+wB|lAT-*&2`cG zUWyvquoVqAe^5lEQ?X>d#bP*6uBh~Fm}o7M;j%rbXl^E-uq}H}9*M(~^`boEk_J=y z<-7lP6{A`&@tU7eL?C)=koBP`A9qvj(EN*Dm(lGG;gKYBM<_ z6JHhe=0~C~$LFxzU(8{z+jWH4h|+)vcv`ok?_c(&=D_fd0ENc9zpI!oX8^_pe?foP z>g)LCOQaBJI7W~LHvVQACsQHdYrGxHu#me|&EicNIbI^(=rz3-tUfwG7~FgMfCM`z zChrHso8@EP@asGw8Ky7Gp1b$bGET##X^faL>TvfbY)o1iS;*S&vzB%Vrz{8(rM;* zSL@Wr2jBJQqOi!|{gejdStWYiT=YxQ3YgVYPv)@XaYSUVc`ty6BjEgmeDnu*uotnN z?VmUkWWIVaa1d=MNPDxm3kPMhxv(VW7lpVzrw>nA@grCLN$=w-oPQv{myC6rOGA2W zx;gRYb@6#D?Ks+k?0(TSS}d_tdAe5Kn}D(j@5@W2_Se-XBY@Z2F_Cgk=K6oPH@)%K zT!4kMYz@1{^ZqFZoJaRM;E0W`Kk2ci!9vQOSL7!>m}hrAYpzyCK-TyBM?QrU&6Q;t z?rTWU_e$YEe;21N>122mqr%x4-S=Y_{T$omRJk~W_@T74i`e-v$SzIKC{*U-@=`PcMRaro zXqU+%h}0;AcN9PZ039=++obad3u!;Q8)`B(hj@GbefP>A)*00)gnji|g5~Hf(iWQ_ zBj!ACH>zoR=OCFO&Ds6vKA=TzVKD6^=YyAd8-Qt=+KB(*uGY+H*8=&1?q1Ke(mBbo zC~a^J04GQ95efntK6P?$id*O7i{oeYGLUqz7W7|M3DCaMIgXc0R+MMI#<&>Yb+Lq- zO0V`U#(8eTF`VAu@>=O+&j)WBfBL4TajMQRNcBRKmqM{b)5F^eu0pS}IGqooP7-l) zLrVs%M5H#)O=9u*a+Uq;rcU}^jgA>+Of&z}FG7o~!kxo3tJ^)A8z@ZsGI?|;?o zL5NN6N&t{PPk~+6(GQ79`ea@mX6Hc}D|M!MK{JIMhX&!ny|znWJo%XLkHA$=;u-TKuTLn*<$y#_{}!|35YZrQ64~0{a1^nLJ5iSk>S9M2nF% zckuJwAH#0furc#!r|_&aywAPNz%Q%>QwQe!$`cGY%?-HYN>_aRkobkv3w@-mv0=8c zxS%k}HD@qK#4M0up@&VXMr!Hc>By@`fxSs!!$dN(BZ%o{p$yQ!7q>)=RPP>N{q3*?*@m07$+rYx;wz6hcUDzd8&nk?yPULniEaMsxWj=K{D| zFvy{RH3s#6UPUi_4Q{3w>||m?SlNTVWPH+!L}zhS3^C%cfOx>jp<$YD?guWGkXPPv zm6v}vq?K+}T_6P1B?_$nHF2G^MJ%qY1oX#3w8l8a|Ey<(dr4&e@BYlf??8@4;cDd) z8Dl*g*6|N?BJ>TL(ox3j&4e)w=G;Vb6Ol3H?=|9_nqfZpuqvt+Xt|)V;>dz&=eY>0Je9L6_$(U-+EXg(`X7_nfZ(MpKFs>>RxJ0e%>#|4=JcOpCiSvZ56o zyRDSc&te=0O-x`lwwnt{)j1L-_ytiC>n2HD)jcXQUpu}#L?0(mZNTx=s~;zTmTd-j zD`D}c=g*+p&sR^G%?)B%Se-K!jbL1(bWm7SWmPOL8{!x#ga^u=T>UYAQdF!$ewjJw zjPzLX1i_-0aqsuv9EY9KO_`ACj-FJdu%>00sLxv2ObX#w!ixGgLu+eD_-g| z+|Nn$xC2Nl0J)BM&q92$84%cPoFH1FZftoRtwuCt zpSBHl)B7O|bV#V&7r$WKQ19+3V8Hki3$gxu?c%fjt8}T<^LEz$)YiCC{vrkdi{l6j zdf7~k7n$6&gnsQ6c=1ysMvyX`hjAnu3$B`k#PbkSHxC26 z&2m7wp)ym0w>IVaT>c30W9?zKa`=R9&TJLlowlPQzZEEb$qKJanFElb=9D>JK-U9Y z`es$GM8=ZvDI*`XT1QLA-x-X)UO53k+7-mu%KK<2OuJFSuMzzR8=_&eDX~)IWJOT17p#7wz8ndPd4RVqM0t5^fG*rHDQob)`+fBxd~;# zh5$_@&oX1@CkzbDROM1s zt1=UHG0TwZLq|bS3^fj0lShp8-02IS97Ulo_>4PUs+pBuU{i#U1xPoM!6v4H@eaA0 zz)OHx*jcQw|wo?jH zB^CWJvL7Dmfp5+Ua1#N)x?z-bHpx&BdQ?uh{FWac&h&5i3cLPRG+O)BO`!4D4lsB( zFWQ;~p=(`+Cx~SNDSV~>vGc0@wPjmwkY5ehMVXbcbf&02pt~3)O}C1%C^*3rs*tw5 z?wK2^^P#F>*BBn6BS<-)98(*;^^cLrA~#(F7kbM)7?TO%<^;#edN!vXjHR>+@C0-B zO5D66qLMM4d+(bmjlqg#*p(gkv%71P8AR{25X2fk)y?CBlUWpONCs6n!O&Yk4L`QeRsjAwxzQypkMoQNW2VBg0T-l5!}-9$5r#ZW3#!GLwUg*R z=lG_OhQ6Z#BbS@XPJ$D-h zTF5z%kam-n2AyK%L4tbaEt6Z&Hrw#dx@~R+=7i{y=q;L~>YUKQ<=>SoymB>Xx|!Jx z$(IV%Ws*>r{UDLJ4<-lK^#g?1Uu__En9D<;zA@4$ua%xh1`7*%8x>zKQb6z+ni|;3 z&A~)BAN*9900^8B zyew5pC|_%(3hVZP?7>+2C>)ee)OPr+X)Y1Zco?`>Hs&gEWSfIF=G!3feyuE%U#!4| zA09jRwm&7t`^n@{g2f@O2q?@Veu(d%(@v%Tbv~6)Gp^=V@8sG&LeLhb zkK>B9U3Gx75Gytn@W#|?N8dLBimzFp>xO*xhr_)`Q5SqZpiS^6G)9gk2r6BhC>ZLh zpTFk}?Y_@3rQ+AX>*|K$Ng&3Al}ulLFI6MAPew#R)*H*9_ZTLxF%gBKGttn$ye7IW zy)5ur+*$Cv zF&+a4B4ddY+u&x;EtGq0Ux&@GgZT1wA-b98-47kvdBl?Zi?Gd1-W#;Wt^M%6B0Rg& z@i<6;d>3fab1Z%a&5cgUAeWwbSe4V*ujwDaav)+dV;WO!?Gw)j1ir{;@Zb-VNfoWz zG`ME$=ifFK#LP?W*sBeSnj<6Q-teL!%x9hU!CPAg3KOHOIxOsk+|oT})}k1f)0>fg z>}obQ-_N!~(sF_PbN=?+d@LZ}2sQJE|Fu(s=LN7j3)`@B&AVIsX^bH7Q${c5|z9Y|T@5qPy`B@Bh!HtJ8cr7HI>`xUn zDQfPfDTIC_dviP-&$zh+7pbrJ{s<%{`5h(r-0EJoC}vbLq{j)N4f{M54 zPUYIRgrHnR03M8e0ZqxLeNWc*rYZu`u}Us46y4)i9HM}5N^VQTceIPf!@Y|i zjO4r;4N^J@i_k6VSY1EoTGDx}Onpz}?Y$9k5GH4}ma8tLi+EoEzm4HbpO2;ieCIrX zN2XEVh8~S>O05E%atV$|SLOSyjM!UQP7CP)rYS`fR#S6v+$iM3e!&j{3KV&vPIP${ zz3_Vn->ZQzP(481htRg}pErn&l0bnXRa$ASxfEyuiEs7NVnDJL91IHBkucl5KcUyK zhNQ(L@7(UVFL7bK-(#2}Mt~UKqOc**;xV61+=Pp4MH~0zDv3^*F}|&nU3q5sGzIR8 zkWylL>jzJAI%?|N(mnV8iyq!GV$&8z0wU#z_@j9hA-D$mx;)4oXF@%!N5UYR_GXhu zs)G;a!Mbj)cr{lXT4wc+-bsdgN=7)PHAQUz`oYNOZay$4O%1LG=ZRa%F?8maU-tE8 z!yM0p?uU%Wi>VTaa|796_Je6|%{s;SAbI|(haO(NAz05`#~iiC72={@DB_(2%gF{I z>4f?J{!NU)L-nk~=B^GrLE1|?%<{yt@|ma6y{Kh9I#_8NTwf;&g(JhWt9?OSRB~N! zEwm#phWBwECW?3LnYZIc;Qde6JA#@m`GSeQw2YbzkzcuG*bh;D0WP^UY2(zZzY}HS z8FE+OOfkZG2~1VQ!dUi1nNR!JsU}ppF_n*Ywzp2+qe2IGB_m39d%e5cr z^7$sy_H#pUoJmXpF*W^{4ki?@C%|42`{{ua?uR$9D^ALqFipUis`Sy*u~{?SHDUV#N0uH_D{Wr;lyiBYr0XuSiR^KB-_N?LDpgrjfUuoY^t^ z2R2=Ab03_vq4*XUnF0wVUw*07r!#A}GKBepCKm}3__PGycS-AKmp|K*940d1_$H0MkiPjppB5UkAM7f$4zVQ<$ z=YGU}3c_=0xPb3=G^QxCuqK0n3fR491!V(c9^4k|T`$BbaO)`Gb+{!&uc>FO7Z%`h zWr1{CJuY_gIrkNlS#VSVM`Mi;+K>v-(OXPk95!G~yUYqfA9Je?cD5Z=H%v>EW0)Db@_m*K4t#dQcS(EJd1Z! z{i(ZySocQ|mN+&}t|=BMcceu3n;xWLE9%GoMRwFH-?Tss%{$3SQ?GX~KwOFyzHWD0 z>!f)=Xqc0jio$ZwP&y$GUtlryMz22Qy5O2kB?-_&n*6jzMgp}$G=kJ)R#kyd{{=l< zn(0%U#CiCb^opnFIPQ%v>_aRM?=i~0K%n_k(oKE&04tFJiblxV`rsEU0Y9dHK28*`vTa^jNkk7Fj3oLUXSVo>6D*CH3VyHQR z9EiAv6_xmEq_+-9PiIuIlH>GgaAPcpTi3Cji3n0EI*cbtEZ!V!%h7t!_Dgv4XLjF1EtI8thh<)=4%Ow}04KbK=Ksn>*>u92ocNl}#bb8`#G0e^5yGK_pQ(x<_ z@_XZhM(`q9Nt{WyE({uq$ii3{N=Kg51S=TzSJAd^GBjbh#i%8{zL9EEXiX>F!W4`d z+HPB_w5VpqcpvH8Sk$T8*fhg4?iUE{!h93WER2?B>=fM{&o*N;*iby><0>Ae1k}yG z*s(Bf+lP^PXp3eN`~Y_4`a(*S-H|Zg@Tgo?i?99C%<5{P_d%XI{<0--o|I(XWR~Uq zQOV|mi=iy8#A?nkzM*is;TG>=O~Zg4wGLda)lCM9sTXsfM$v|ulzX0k&K)PiYz`6k|6z>V)xO643wR%8R&hb8$_yT{ADXu{yZ8+S z9^IZz4E&ZF>}qvL&>D40(1!X!(p8(9dZU3*wo7e4u!6PnyAO-RA@_GHXPnPR#i3;Z zV)AB0iM1uVdJ*`Hl33^pUFn7}2t#6i6A&K)j`SML94RquW^Fd6wXDt%kiKtk+}=bv z?HoavpIzz~XSWYI%y5I#4pE{uitbZG#I?t|y72VB?3kO71$Vw#=W&SO>dT(#4=Y>L z*p1ecomJ<~VCFvt=Edi7AZ%8F0&q}nlYZ{!*vzgpQd#c7FpTfvOi(~#{G0%m-%B#L ziCLfbx|sCK^XRsj`RcLdPcI>>Xa2+KLoXHGT60B#1=#A}M(BhJ$*v=0&nBTbbJAQb zBmG7zqx2yPfbR85(YE+|a?8OR)RsK(krhLMP=ikK_aVjc&~MhNS*o^~aXM4o&>7WW zY{#QLXp8KvHfSrP1*Ce^ zBRap3rvfB6_8f#HJ@r@?dLd3%&6K0yS`7Y9B?CWZ)WGfX21iU3ljTn!{zSjlC@YP` zqn7enZ_Fb;ZdIQoi^V?_#V$Col6Y_8WicW(5JY4$;0}=i2h5fvzX@`{w6g<>u4;2o zEC#kC!$8LjAiY%Q+l{`sbIaCx)m|s%LI5!-73&<77yD)Aju61?(7z0h_h+fxr6E2)hC6<%9 zU=SlFavy`Y)`~MvSK+@)ZQEt^ses^>l^%AXw{V_+5eD{lF^{KFQ7vt%9d;9=<7E1e za*m2Vs&}_NQ)$MnGIu}Sq6An2vgQtbb=&i@TJ8!SKpO`XKCc;{(bCra8fM`l_c*+yd%skl?o1x{A?wmb8xME>C=#8 z3M{dvPi-+$yO26vhFI2BvzSa~XNv_-Rj*=?LH(IvZ+{Ok)~DG;HWYPae{rFwr2tX( z$X{;l;|TgP?Kqe#j=cHbaT697+ERtk4~%iL>O4Qj#E@Q~z}X-ui_ae-S{1_8e}pf4 zQ{Q_>f`ajythN_;VUUBMP#P!YDoBt{@3bJ%Zl{en?41Iv#!Q^sc2q2dY6GiBmuYSh z{pDQNkd?Ev*N$|M7H- zZTvh1dGfhKbv||T6VM&>wnro^? zvj;wUCtx4nIT`2J8((Wu;Rwrk;ovg7u<0_?CnlJPp%M})a{;<_DmlhYCv=gad0{e^ zKQex*cUMq8w=%|nL(OxU zzqh`;3Tu2=mZi;gUci^-s9m)l_l12S#X&XN)k4dBR~wt=T;!>p$n$#SJvTX@BC;3_ z1mulnh(&r|=O)z38~xM)gqj4VVy*SU?T|~wIhKlY)0GF3Htc;NO;~B5vVvQF8O(c+ z>vUvF#+kbMGslYxKluf`WE!Q?{#9y>(34p@(CkR)>yVo|*YnvS)sHCa%v34@O; z;55LRCW^4p$utRt1F#?<7nriC*f^*gR_+ShUsOM_mpi;9pX>s&UEkj`&I$wT^|>j? z@L8qM;k0ml?KHLb<-2@EiL*RTJ{1zh9HS%lpNKiLz*$U0Fo`W~PDCW3_xHI*;{|KJa;BA?Z2?unI_lp>(bvUiR)F+VOSm!s9yNyid58$*Z& z`dz%A^VwhElB_OU13g$)5@?)$Bv8ZGxxEYQl|z3>`fDRaE_KBfqCu)!?w zeJ)9ha`S8J$Oi^pKDo|;`eudVn%^4E2lZU^A}=(&0}}B34?%=>amll36_|)}Je9b# ziiQ@pi7GksTdIoo!gUAR%}ix!B>!BV#YFx+LFxf&%P@+;qjHs=W-H>M*o;#g(NTK4 zmB0(4iRa+569ifBS;NEbUD&SZ-(1f|&kCQ`5U zlx1cg`NF!7J@oNwM%XM$*ME!`v)D+$P5rso^9Tn!UMu*-bOIzJzIH}#SUj26x4Emx z5DeR}ozS9BuD@ydGxcb&r#$obsOP!@h?}b1U)tZ3S*2+XEyj4!exbGZ z&>_0|Iqhli6*&#cmW=E~I+@{ejqX( zNOw8r}?;Z!&6x%j1E*Q)XiQb*?Fd2usoc z>^S^X&4J}yeIVC`W`mioIs8NYrZ*j@wsmepzN; zB7`n=1-7iD=8e3v;ebN>G0NAI)3|S|&6q!nkQPjT-om1#+{0-E zE1~|`;EB#z@)8{_+*19l0bFwQjlCGkQ3kgn-9N+0uwgJ-%FV6`eAdU&UTP?aPGuEm zPq(J4V|`F!e0|{IRm%T8P^mPnPXLx%!}z1t z^L8(d*}!M&fk)tM_Warh4tm|7A`$J#;x3)=ZC8#BLt*@DI5H`B=Pxvo-d-PXhm^Z{ z=Y>REFef?;=45Wpl!tcFsJIt9(XlUP{G2-%{Jb`N9$1pAdbeX5=-u?Y*2!;?pu+ll zNqgk?sJzlp8hPon@hwAHCCY8{5x(u4P+B}3=FmXgjzYZyV{voi8qj-t3I#OfTd0M` z$La@Eg{q{2FoMQ1BnSwyDV2G3OBlkeEC-Wli z+BNSi)`cUb@d!#QT!vpc4KK8E%N<9_ge&ep%IuQTfiC)dNnV4Cn6hTx)lEcq*A+&r zYD@qjVR!Cr3V=l0*@YNL?nsC%7;g!<&CJZUf@;tpjLEfA+wcW@mV!VZO>0`2Q#@Ur zg67z-X#G_1%D1TXCI{m~&N8W}hv4iEJiJHH{p2~Wh!mk7MgsZ|a#o8vav#G274pas zJV8XDUv%y${ut_y$$QhPh$W8}cE%2EJdr<-u4@Xikfhsq(Q|$rZ?Jhs ztVcJ!z9M%mHiKvV&U&F*S7b-@T+tdD$qg%D=|9@j6)IEz`-2iwV@!6vt{zwqzm9uA zI9EE=w1daWPa2o@y z4$0=5+g+KYEeYYalv;Z+*P`YdUSCaMwWz-oo3}Ke4N@+!q$wp7yFEG&k1#eLn6Y}PK0TXMs@`NbZY^8E57K88JHK6ADuRWK&g#4Bf z*H1xtJ8?PTWd2pW#%aW;S20SzbU68X|T88TDwztV(i?`yYEiA zG%E2P%6#-yEiQbW)0Qa8vP9dqZQEXL+qP}nwr$(CZQHipcR!rx`wcZlRaQpCj5)Yg zeW)}qbP(SYYyLp!)bee=M)V07md)IH9%7up{Ep9v_8xNROz1z3rYXtre1amJB@Tvb z>9+l#UHAVOr*T3})k+I=OYtIY(bj0=TD9m#zY9(DU3ZFsH-YU4m=lRhWZI^2s4@EF^L4GR*qY6;In8-t5RM1Q! zdtA?`DJoc3D&{73+^sr6loXjJp1{-5N68kHaExTa+WT}**qu|S9-)0290-g2-{Nge zW1;Sx8a%gV-k3uXCGXT~2r*;o1_Z-1HM2IUL#lyb>_F?0z*Q;v2J0frF1vlGnmEo2&$;&2VS4WC=lO;X$oRVl^2jvF zTrr0~b(;WwW#0A1q`>kIDusu-po?X*_K>ZH)swl_?!ZjNv&}hRls<=uX+2)^gKw@a!-(eD^QW1T>`lfgT?=V3 zl{yq&O5Cnd_Ib!qcv?kX(Ebt)P#qA4-8IeG(mHwc%sQcF5@o0SJ7lhI_e;8_3MOyb zOA?e)KgFF{Dr!lJFJyFwHZC}@f*=)}c5f-2+E`F?24HW?XZo{!W>1COOCt-RvV{Ri z1_9%b;VGUMwA#3QxE_x{iR&fP@3%3*>~n8xtq4ISX@uO zn+dz`BKbRxa(c-92{puoZZZ^_qkz=22JcnKM4iuFN){3A{A6J8<+&NQ*A-}P%9NO0 zSatnZtTwRgwa^4?sSYm-!c!j|VPr6Uy$gws+_P1IUApX&u=+IrORdwhE@L;OAuaZ@ zd|*nu;Kyz5DnUaxGcp*dn#%RW*`41&NR%`nvDcEKbNN?bhLiDi>$c!THrnl5Ulw%FH|MCEOY#%>!RLy5XT%{ULk zF+s|t+nRv==xe+Oo5ng)?^Tg94tI)!>&Pd;U$4EEO6t3DP#$xF>4CtxCLm-NY@M`v z6GH(7pKPUWk+atD-d+$FUE&_Vd_ctYx+FH~GnZY)%9sF%g>&%_Ry>^;^AkQ74snKh zXk*1$fbQES2Q>7&N5j?Cg&$WXyG0S^rm^N*c-bR_Bw8u zj)GzC=Ka5(%7ZlI|2H_1zrtsuUGS#idv-Os(fOsFctMk zBg#vH|F&L3{PImN({Kar9i(Q+JobYx9m~%Z5s&<`6WYH-UUTAH5e{m9dr+$L`F62u ziH0WX{4}_3fKMq%%HO-AKKrhe;RUUsUmz)JVC^%Nu19e?N?iN!bfk?#;vuRrdy<$A zL&prS4NV;emL23k2ZRWQhExCA^f2~tvLVorU2nRAcCN9AYqjn$j%FhFYJ!YKD3T}{ z4J?>5=6!*FR(SDtH1iT@h7GgO=JBoY*Fjk$?;)kei26E+Ld1EOCC0m2rzm?$(woI1 zVO4@F#*f_T<{SH?i{%o}yWHx4=$#ilNekV(kK22<0u_?o@>}+l);%yZUV74`#OEFZ z#mRT!LX++*3fT2z@lz-|!=hC!=?$_ylkQSWgo=_lth-&NA--DHfj%npLcc|?Q~v&v z_;M64&Yff%4ticIRsfN8|I4$fVFA4JVf{aOHZr#V<=KGXtV>u;$%l4?v#Kl1+fWth z5pe)icw<${i~Ve^@MiFu-OJfjlR$nGnE@9Jb0}$|J4_4w4qo5c`!9aN(nvHNy08pDzc*E%5j{k&DpyFSs)4>4jX0n?0p6d9=2s3Y+Tt`??PV|1#-2o8rtouxlZ;`D{(3i{6v`j zo5ByB_iW`QY>mDZP1r;zv^!NApj_Dl6`h+%rg)5ATl!8!CK+)-&*M^g(=aD0p$n|3 zgrJ2Nf@*^)pAduOB*=Z$3AYC!xmLY5+KEMI@MIV@^+j+Eq%O=P78(i6>D$bM)7MU= zYVMbwPshzaX}?1Z|05RHA$F5bg#&wGiB3@*Bs(hOrmm$k-r*~@Q`Bn#V*(L$!<{N) zu$7Hi*SXyJGI5zOWRP(o!V0JZ^qZxdcr$_XlsN&2ma#>TKx&9wnz-QJ)B$_j(wiq! zO{<%i@ovEIZ=2QDo56VFZ)=k-e8R%Y+z1VmPC`Z4jq$cEuotbq4Vp!uo{{>}>KT>^ z6=Y?Ot;=hkQS$nZ?)4~ry5gqmZ79X9kRz158=hQ#Z)QC}zG&G-BQ0%{(1c&&&LSK) zg$DGWamt%d)i#0iZTdy}zA;1s_Qb@JwV$|^!`EhaXwPNM4q8@E|L6F%VDL2`)zlTVST4=n>MMv&6ZHZGoM-j7 zNgnC_&%10QBYmsO7#Hg_ToD6jNo76ml{bbr3zx!~S(14(M!6^UGiic3WAg-hhZOeD zn`VFft8}}U_vtJMA1b-D38eG^~15=eOzzhc> zI)>HLir0jvrn4G>SeCF2xI=GA?;ediISgDmxihkNrP9+8eesNs%M$uS9$j~B?<;Eh zJik0&)A=?CR_G^~Py5Rx0R^RIUL3$$HCYQ15;BZy(XP``a@;=*Jwle*#?L2ruXsL3 zGfDgh=ts%aOQeHxvDNiYro7r?aO8$-CfZaMsgMQGSdKHgW})01+vw{DaXV9I0?fo= z{SSfQeR?XepY^;r5J1cvfQ0p%E(bz#CnhNu91(Lxj1rj$$;X8{N#Y8YT~bKTilwaoIZRxlfF`~wFKQ57dXP#UanhLQ zbJi2g{1Y*&q#>a*8583+t)F1X7i@U-pi@yk0RIh)n^MBuN2naU@gt)sD@!-+Vc^(G zY^}d0-QKlAJvtr}${6{O@mWs(>D16{WZogSHMUS>TpCVXPhyZ7ZzfPRAlO&HnU_0# zWI>mXD9vn=0%E=7cWeXd25$mU4onaMJ;>wy8Bo~y2s7aGF;^iK+Oa~cgO)Pg7|Fcr zhWx39wR-yvvs-nwH7cfDVj8sNt|>r^q%NRc+Vi)th-u?}bx^04a*MFs?$yL_pf9yyY7$<1tdbQ*$86eOetUzI4 zYJYka%#wK#NlB!kj=(Wiq}>R>ty*A>^YXXGw;>m&{A<)rNtf*}D!y=-@N!Dl(Hl`` z=ciErG}I9Q=^tXyc_~-Xrv{drr<@LV-gb8SFczp`P4y(`4!xvk<9GdM2H9$k#*i&> z__m2+N`H zA;@3UBFc>`5fLw03TYGKS;6-7UdHllY`_%+I?eA_U*thTZ|c+esvIiz-9&&@@Nsh5 z0Q7l`MdaM53-PtF9031wi1KAIPudi`qD%fF;npS?@2Cr@YCfZ;%R+ZvgS3o&Xd~3F zyN?eLCD&>r!IfyQ`#a(>7um^oOlL-myQFK_;q+iTXDM|zvM5}<-Nswn?WPyC!#RFm zNtOKVr55ikXD(FTLF(+rJ=36xl+%d ztGi+T9}7lrahSU|SDXPRX=+ENtb`-ts)hF67r!b;1KLmZlX(@vU%22|q7roe884kp zRYFC^!`oC(dQ~Kf+Ar8>9}+XG!{TNYYHP-fL*&7$sLuq)J(KJLV=|*%V6~?)@3LGM zM`^*tXl@S)m`R7~WH&?@hO4&w$K6^1=vFAHo&0a=P#x4^+p^$vfq|bZZQ5szY>JN) z?=Az08-h$!Wa03c{KvMGfAqqheE44Q3~Ar5Pxb=CG0(K6(}B^+$ZUmgRfLo5Vp*fd zdknnrLxqMSzv24azo}IE?(&}~H=wUpEE~P0IZ676<^W~bYzVS{r(x4i{47I-?$0)_ z%SM0fmN;;@Nq>Rx?Dm_N(RxMwAO5j8bBA2w5AX5QM?w%Y|IxwS)b;tHJ=ULxfptuO z#TTD?5rOP5mcIfGz;i9rTgiunKD3POv&NMhghmfMSeqgQ(ya&_vp+biy7NKCHC3G? zCq)St#5Ov>$l5gzoL_KAR0ZK0vRa4vF3SK@?!y~$tiIjKYeQahre=tOm1wUSMc0s{ zvw8X`Evz2D3JYJhzUuCd^WIwZSpiESeW|`8nFhuS`|S zW3qJrB#7*tK*eP>@NjL5a2u;@n$O%XFe9*6Bvg0Lgo&k&|eekY)4*oDiBK{uAN2S@l0hK(|vLBYKkqPk}1Vok=|zAu$U6c zc*>EzDN$UNIW*mbgPvFN=r<7X{AboiiYWCDEy(1@h^TolS?R52>#L0)nwS==EL>EF zo||1H{#j9Epv!bie2w}?f4*72dceIcHfF@Qz2Y@anLpC}M0R-w7lBD*vTiq6&8V60 zT;@KTxRPUtS@MsVQxfYkM|nPP^>E7L3*=#updG;L>5&?II6AqHkMY?!r}nD$Z`Ep} zL8Dl^`QL;-Q`QK+X)Skf*^W}P≪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ØxISLL%C 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%0DqVGcaN;F_Eyy$ME|t`93_|YUIw~9 z3Jp;c=^BwACwz)f00#1sPJBly9*IQZvLshPbXZ3d*s3cwbxo_=TzazsBJ5NrNDC6w zZ08uIEh<%bM(vmV-FUY?xAgA=HGF~oAmu@lMa59NNpo{5ZYWMvhFt%M*8j3Nasb8U z5+|^1O6di0H0V9RDInvMBDb$6nbGOt2$M;D|H=1(WFNj!E4xQInbf`8LkUg+2~%p z?`ce>3!qZqA+WsODfiMHalQ?~{*JBwL1Q-}G*yOY8#>1?M^wyEjF!d0!N*I*^eozj z%$a{jRlFm=0oIK=kcWj5Md=Gh;V?U$cWO@t+0LaADJOWYUTT-aU zX=Z={f!8V%40>%dw-uu7jr71LV-TnWT7m;_m^4oXly#HFx&G6WePmw!;3e_lHJK8Z ziweI3a9rdj4T)18ah191u2lp(f^D-Ae*6+C#1s6*#-ZUr9f7VOIk6i|-R}FYRYF?t z@jDe~ruU1V_wAWo82oDH1U6a(1g0k$Rif)D$C07j(%~Hk1O-1E~R>87J=u z;7a9q-!U)?r=X|++Z=e2fcmOpwsE=RH*(d02DTZIqxds=XUuP=< zpn!z1M#~g`y($d;w=Zv@a8Nm&i)%uxW;njuve_<`AJ@Qg#~4g(#`x7x1inLA>2t)e2R(+z7wo-Lh>QJGYKOEoosTJuRiKX>o#{yt z$aMD!1uUw>l}_oEU6xSwg44g<%%PAKKIS?`Ucw-qf?Wie#P8M}lSV@!L x3(I8 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

~2@nuGZl9j6`}*ExHHlss{(E<&Il;S$(>uLR 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�|^UMWWcXSRn<$X!~GG0 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

?a|TT&L8a7*VDzCCuJ*hG8AXk;g($XHF44$0 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

JvHIY<#1UX1JtP?ZLrCk42 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

EoV#+NJp=W~ zBzkr`(!HZYfchwt&o>P`;I%p^7~uzUzBm|RK}Lny;252GEo=shUbsywpsYM|z>2tn zEc9{IOv?JwF)M$L@Wt)Vik`(H9c6$+5~b2W#FIQixUzuRXr&l;blAF4M>o z^YE1QmZSOmN92sTK9-;#LI}j4EMwT5i$t!8TaG>GB}yKP3fb~OWU(=7U2bSIW$~2$ z_I{ne)BU(=Ptu@f)>=Fc?z+k79J@7_RWgcsx-b znQZo8`&KabVu&M1gNr7U6aD5hwrw3$2luQT{%FrqvN(sEkyPw-S|JHENSiKl zitEvuoSi&#vDA?_!;%;vvw2dVPjkt8r+o6Tg`#o$K`)7yFYxVsFzmAmQsKxT zW9qA6t1W}d`I*VXy!D087@eN{|I*Zv$vCDr)_7qkV-s03Skg&`33xcp=&)k>D~;?% zHjzyML=@PT!yveon@eOdpbC|M=`QwA%t>^yC?x_Q^jg-aU8U-=F_kcT5-f-iPk!_J zeG#7510%$B=jm4@u`DpLpU$hdPA(fkGh~jbG#^#Af2xNAA&DDbzZcbbAECV(p_{ zHvby#g0X?w5FCkzAul+f|$T`b}>pL+t zª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�pSj`)t>a4xq$) z6Gge&0=+-4cU|pARgy4?NknbM!ylFdY%|6?VD&22fkSYDMZM!e$2U^SfOFm}n-%Y- zR>Y3~bK|l~kaaHuKu^;Chs3<`zKt_uFTA2nO;ID@e7w@cDguAOb=d&GBsbinF;A{^H$@y}GAV5n z2wQvEZ|CY3FF0ozl>i`%6%!!|J}1GBv0m8{fl2eGvh6yg!^KOegt_v z!fBb8tvOzPD!z2yAT}L1lZgvmCylj$@!A#@3zkq)#8jb+6&bhNEp<~|mM=WPU|Uf$ zp8X&C;AziE*&cFM|IHi!I~lDGukFoTN|y5+qyqsm&b+0e zyfwNQ8KXEPet_^+Gc`ckpQ15N=Tm5F@>_+@m;4?nL3Q2>E?ta9gHnq(OeG#jyHD!N zSn;T4&OmlMnb=Crp&%KyyUlnoT$L4XkWYfMkbgU{{U`w-T$k5tt2h;%<)(ezB|h+1 zY#&?nNGIE{)9|0^lvCG7`(xI8lX(G!7CS`A=&!-Zk%6dn#3lF-B881qu*+jWBH?-* zKG^zoZ69LAtdnaQ5tMoMn_A&YCy~K`Z`TsB-sVcaTp2iB5U?-n<BIr}_}$79 z>6MpwWVV>%>7i8RESr7uiIg!P5!9G=6DI_lt17q@2hKgHcNwW5)`(QS(Fpe+0u1Fb z3ol$aI7Y%C#1le3LX$eHrsbbN7m+Rpp%^!;e8J8$VD1mP@Wm#Fs6fyo0HVg@B8LY(J`T{N6XtZ4cjcn%G;8^^GQy3 zVYop7N^sA+ZCNWRQLE=G>q6v*AmRfI7Y+x9+UoNqfH4FH%`J@P2lyNP-_|bdyPoZ9 z6H<4@_e?|0I)85U&xQ%>M;L>xOJu79a0*Vt36ZE81`Gto>-KM00ud&0f9XVpOZ{bHpV=XVmlpi7s*&X#RdM`Q*z``@n&%m=y@O!|0g&icFZaqZ?KZ#?xZ!2Vs0L(w&BG~h3ogm@ds%2N$BWqWRo7O8l{8+jhb*M$o*w*Q?jdMqVBr<0_T|NJ=yioD1+t0PT62?D z4SKl(_zE9{_B5J+6sp4FjT-6lN7x5b5$)v+@Um`}`Qhq3zNZZXH7&Uw#tS*fIhzQr zUUM@$`!v2R-AS4eG&U8~IaYQ3Ds#*W-e}9KXONR(0p)+iDcm~8467w3M2nt0Op5F- zUVm-GDfZTMDCdXDkYWwONkg>v4nhIIPNU(fH-ON-USDbi3GVDS8KxIl{QNt-Ezn2n zGvM_ir1j5~`_3NFyDq5Nl!Ks*x}mO%BvbVK5-nO29&C$8%x4EQ zy!4sRWG6v;F-Iw+m?9oCpu#tNyRDSp$#f?H$fL&k)+q-*k}SPfN@Kk4j5X~dJCzVS zd@X8bnb8P;0DRlWDgz_;AJnK0zLMyavt|X#7ftk3MhkU^-213$^Nd2?*yT0Y>zM`- zuD{DypBv22CJA2>v~yV>MrJ^)iuo!V#uEX6OJyD1MBKoPHn;0Rt+o0K2agXL4g%+j zc=NbYxEa}GD~uAu>y?@kMH@I(K$U=>J$DxySMdRX8E|3K#U{0OlJIlA|qet0Y(3>+Wqp<65Z!eM-Aa)vI&uvQPUm#w5yXTsb;tC zT+=u;vv9uN z*M_1;phaz}yPOB5Bo}f5ZDs%w9tMr>V`jq)ro!<5<(1EJk*8dJM&Q$!+1F)b4Y2DT z=wReMvW0&S-j$_h(Nc(;N7%3;;?N@dFeP2`E%d9=f%3TjP|j)V1ZVRjvew}9c8At3 zupW-cJOIG%t$O2WurKHzRJpk$rf^P6!qVx(6;Y;BBax-FK{5|2)vF^`Ok;VN3Orr* zqMErF%(sL_XJ)FjHevKMWJLigN!WHNoR*DoHDq;U4p@5nUnYon=Zf~il$W=PJZ7%F z?<}wzz6C_S^#?Binubqbcd1*;|HR50kgiaDf2t>gv5X7!C3kMy+jttmjELBHXr~+4 zkA2`Y z9Ouh3xV@bFg<7dyL=Xn>LRhPOZWzOomx1`mBqhYb=!?s3^TPYgReF)-!~Xa=Bzjo9 zVnVhCqD54S68(396`RpCp(B!h&Bg>MD#(Q~`lYc`)M8Y^$A;SWrYep-CEjWI2?brK zgG=ZR)ScXtWI_d!AhTP>!iPh0KKReISrBf6AJ6tD9+7+n4mBRn(L!TYl94Kv5RH6V zD>G6?KhpKpOd2lK3(h4ZVKYTB2>?n%tAn>P8MsF%^^AuG};agZ%9}~7~!tbkeH^d$HvH`zEFPk3LM%to$k~z0bB!<|8 zo1%~xnk_KXQ@k52Wd5=T3Egtqsyx*5ZF5*iNSZ<2^tpC!ZNb=bozRo6!6Yjp`}Lxr0Euq{D<@+tJ-W8hGErfPN{tC<=!FHa$YDwGja zRx1QcXuaTrLA)&X>2mz2ooh9yCO?fSraG9us%5iwr<$nGdHU zIfM4^Q?KPHU0f-6$hf>3ztUCWhT65m_k+Xvygg%1`#TQIywgcdj)W2{cMAk5_zeT4 z*Jc*#0v|-ChvyI~@LcD<73(Ok$0vSE3Eq)KRmYc;?vky@4!c9tr@VnlQ2@h>U7pP- z?zZk$&kD=~B_7e^xvRJH!SK-IjGDp91c;;gSRY9*SL)IW&9B5UxScyv=%@*q&|$rG z@h~C&eY#_s9AgRF#Q#h#Od$U6>y(Fr8f6MobiZ`gFq*B4<`n}31W@HKYQudL8lG8| z)(|1r@SF|DIiQT+^6&9n!}<3|h?L-qF>NK~(=2c!hp0-bydURkM49qGkmPRarR%yK zJt>S%NqU_^xYdzzKNgm$%RV_TTJ5N5zgqkqI{NynkERFON)s>zdlz90g*Sn^=!Mt^ zP^+WVBW)4^0Ygtl5FI5N2D=SKj$cC&_oOjY3JXF;meo*E^veuY)dX4(_Hnh26`qfz zmlQ~-XkzY}=M(uPV3H_k`6U7p0`64VXZEypkWV)sRb=QrDER!Qu#PGgu3h0No3LLU z&6NT7K5x|qh!NZrUL4fdtg$;)V9Tg(;bq*nKz;PqsESAb#N@+nv+LiMWk^L0dFX*e z#LgSnPStuetZx$!L7sJ?>Q)77bf9lXHKSWz0`@;<3e`Mt4KW}s|MVvV9-l%Z)X@kS$DNwmiICT>!Rkbm25zB3QgD+67m&TKR z;Xv%N#k$4rIl0B1&<7Yr;q&}qt?&&cw-Gv`WUv5>JXiDf#WD?dpYrX5a$w==7wkhF3 z4H|bDh$a=Ujn)agdy3}RX}+w>q~b)jQ32NVn~oTT(bLX8Q2|TPt_)k}o}cH11lGFN zu8bph=o*y)V0h6aWtT#R!V09fh~dAYk+Aa>)m%?ANM6L6t70ElFa%Qqj45PZAd&8q z1DK3Rlk{}*ZrsQQktCvwrEUoeVK7JVxaRjEfGC99`BwEw#@b}w0J?`7h+iu+RKu*ElNys4OV3LSRvJx>u7V%Puaum-5)+=1=fBLlYuZHQlY5)By(9U;Bh&8V*-Fd4JB7=5o&Wi(DaP%7g>MciTx}zt z(L)9zh4SWo19rH8LRaM!R*&9OTs7ruty;N(2l>|DFfiN%r$Eq1>x=DEF^oZN%UwSc z2rG=Iaj3*Q09bTg6}|>7G(RX~^?L&+_9y}yzQXM|VwsoSz5OW7uj@W6A>OCcn+_AvQV7fA2$6tERZBtYn8R5W3srvn z?6i`*ela2JwQjL#&HQMot+s`dM}9#t(hc6_zfLWp`vA25WNFtbVjY{h ztIa(F(?#w>SqB^^m&=K|OqIRR(63_<2v-rZ*j zC}9c-Th+$;DdN#yaG2suL;bCwkcd%dq@kv!z+n92_+US|?=`oO;_d2cwu{`zaIujT zZRT>iFgEGrZD;{YdRt^(nVwvxRBDss7-tm<`acl+w$`f_P8u(fR*l0?H@_z9oFf{k z4RpIUri%ev9lY`4EIH>WD1d*9Ijh`CFJVqZYX(k^KKK+67yk~w0&-CXm*#f}kuc); ziYBZva*+LMig&0-#r@;c70Ijb@)bz_2c z)PddQ(+rX*#><;yO6rx3Vlv3-*~tw4{|8smT4F^O)U9(${&eH-f^>M%g!}>;iDlRU z5SCLEN0J}+SerBlY43^<(c68ufE9q~7lnfm0vCHzHLt|}TUattS3ux}`52|VsR-H& zP$vg0N1T3Y;DPj=WYbBYH<0$S`9lvm3T$^9=j{l?F6nm=)VWtpjtI9o_5EXC2oi*z zrm9k{wzQl@)8vpW!m&V=PHKix)|1_7?L)o$|A zyN_XbnXjDH&f<_;#3_RAidA_dJ%)CUCn>%I1qnjn%P}6&=~AMZtc<#6;bg~4YaO7> zo`?*fbAZZ<7;sJ!5E!a6xpfT4X&kjkTL#FLTys*Un>ZtZdfp3!7<-(_ySUpsk0h)y z)kWawhJrbwQuqV3JlO8BWju!S$do!jUfl3v=6jf^HA910+$p8FWLy!pizh7nB5+4* zm2FR9$^UOL4`=vIgXYN4%SybN&FbJKWWB}qjS9KmL^o*M0CpJ&tsgRCtvO-TTg560 z(OjsAJjL)C{3ibwf0`$LC*Q|Z`C1-XKM!Ye=D*#+nyzAie(0I9B+SpviHF!NcOArj zm_BNZkLoK?+5!{`_$#)KaZR0>FqYxRff{nn1u@yI-4{i`NQC}4-U!|atG72IGvZ2V z4YxF9)|hXIeNMC$`jnGn@4$&P)fj|cwdd_MLPr`Jd%YaRW_k^qG?2KjbT8*Orr=A; zJa^Pyjp9=6F%D`g@$ru}oFN-1j_+#yzw-@=ic7ajS?lzU!mJMCIIDq!7E}BY2vEG) z3W^i8|0nt1X<%SH`nF-2&}Q;`Ek_MeO)btmp#4oh^udOLAN1k#HOwrZBYe5>;1GcK z)6Tkfko)V zPNQ@?IO|?c9Yb~BVh~6Ei%f8yjO)DJ8^#OAb?%%)Z*s~yQk13pZpZ%saK_`qg!RoX zkh!K8X+J0338EvE*`hav26)V?DOveH!CVpCrICJPpszC3kQu;%jX4Qju6EZE{d@De z2Jao9;7omhKrmh}@Vo|rP7FZ7=RQC1e@9d!U0ChrjB`W&EN|AsX9wkSUI0$t_fCna zDh4Gs5|bJxw4z(#8biiMeQ+(%ib=2C!neUn#<)Q#E%@4QYXd z85pKFU8I#-adEQ(3&cq=8mO2l7+e?Z<&{=&#yj7htNp zb9{aFxczr*?wiNh*ktL(dkNYj)~umS4^5j47GvE&3RQ|3H~%}(SSwja6K*ta>!#*r z|CTX^mNnsdAG!g9ce=@I8jBCYTb<~+eL9XD_i4KzIrJe4G2x$FMswz~LAp!6rNPtA zpvQy!%Ngl$f!cN_=9Qju65dMt5ciYeeP$9WW{9xuctXx`_JZ?uIKr?v-mpE667HZE$aBOz~2_Co&Q-^>S3a2qDc=j-8w6!jjd)S2Wj zd_TUAh26wI|F{`aBm8=5CquBrPDwEb>m4LqLfH1`dDC4SjN|HKB`6!g8;ho35eckgN$@aF@SN`iT7x|)}kRy z3fl1gMsS_k5y#Rk4%{4Z+8`GupnMy$7|N8tA7wG_#A&$*Rs-~-__L@-r46*PzaaPE z*f}fw_dE-Y=tDw%z_?N(0>iRc-aM>FQ%`$AFln-KTgtD&As#9|55USy^##@QH8k$d zpuSOHeX%xLU|~cyewl=BxFw@wZl4)vjdT@?y`AwpY_Cz;-Ei|~Y(i6%qNv?H41L+7 zZb!BujYgo*kn-`_O6025-D%yP$1B3VhL**H2P#uc=QWJi=_XPtK&*nGC$3)(&2WU= zzwVRA&ZS9Y?ro!9xQO+xFoYZS6*b2s?N~_eU3KM(szUWH-=pKxG0%)0!jn+R$Sj_5 zC&)Zi4u9obaSq9i?ukCZ)X8X*eu{+QyThYF%F0P&*Mo&jTmL+U*WMJa6Tok?P%IB1 zzacjlids0dq+DI=aj-5C?xLJoK)yf4623 zc+u!pR|82str7a(VGDC4e{xkKzdX*cnLe^(9E2AtghfU*$@p{A0xL2 zJo&9b>iI*q7Rl2sul+_2gBOFs0zINu@kQ|VVA}Dn=PAR-T0Pf{BO(5R>^j%Mc3=qjUw$N%viJL1<*odc9^1B7!PR^ zSE;xo7p@6(pSZEW$@io~_TvNZUU^&});(`eoc=${qO|ygD(+YG5;&xbpK9KhP)F@RO#!CTdb@UF$wef58^rbJ7$NiJvBm>DrF{{OvSXoRBFvbn-9P7Zbe#m!G6$ z8+`y#2YSm?Zg9wc($*Gk>ygfO@|5W$~=No!YkkK#~87Ss~4-k zXnquYJ=D-2w7>Hj8vf)P1(RW}8M2Dxe#5~oRtJns8TF8|wUhigb4-!lLV~LDN16tx zbtR;3n(Jq^j6JTm!f!w>$>NwxRzv2EC;bGbJVzT2Cwki7QQ6ZWxJf(|3c;tb;R&u^ z)2Zyf71DC@7b&zghR=Im&hfQ&xfYt)G_WX$Mg!d8ysnLzc+Jqsb$J81#)F4$kP=>x z2PP-zge+7y^wX(ZGDgdY+nH|(m+2t}c7Xj?!Y4h&HY zq*2;k?Ecm}@Ka+EReeGadl3zO-Qe+hW9+@WV7F{bi=yk)0M^`c0uYj#Vd@gZNI%e7 z2_ZJvA4CWU8aRen+wWv~qDXXc2Kb#1N9jZv*ND?ByWP|dK9cdDf+m6@_d*b$4JaYa zc_X2O^T5bWHpPts#g?t_?=&t+x$xI;@CuRz!}z{(sh3l*-H6DEM@!W%3yEax+I1i? zOif-ax$9xENv^sxBOxdJ7nrP@xi6BpO)y5~(%WR2f3klKL#^f!S|!-?tkNS#_Nlb( zVq-I{;0nA_zV3Su9PON7sbwcGHSrBGkyYGUOKjZYh5v)_3T!t(UFDTwWANhB>Xr5t zm$#4EyN5_3eckj=A}j|Uy3HZglbW6_WR~a`(`EoWzBWZAMnaY7?zU`hZT#%Zb!S}P zK!XyIcSZFV+z!ZvvdJ!RFuU@zReSb4?=>D6{f;@$AecfJ`G0>xenYBH&p6Qh0$2wa zG#}BPO8o9d-B7xQeU1w;4@7pWO5JQxwW%>$wj}%iG49w#;=JZ;_lLpOXBCB%i1<$V zN%yF{=5}?Wie+loOR>NRw=p<8LHed77sJNHOpu9`{AafQMDJ&$>ceV#}z!ftZ+jTB?@sMAN8U z1OynAqk`-R`?L-B^9?QR(v7%oZbKw*NwWY)jEZ5pT+H?N2nE9NT&#DC;Ydr)6aMQ_ zM^>s4f#H9gaG}NchZrWM#l2s)=1!v9{F+<7rtepZHkTtTlet}i+^BqgSoc{dc#itj*R6OZG$)RdOi>2YFhDvUvG(Y z$!d}E7Q8?^NgA$q51W34XcCN8J*CkQefeM_NuKr`XIIS=P){!1$hqzQ+LNjh$m?6xVty#EBHZkQM5s#JngW}HuK zMtXo0kS_=@cvmljVTYOil3nZ+I}rUF(H6hi?70BU`w4Rbvp0*Ek9l1Y6i;B6a`TI2 z!g-oUM-RwJ>TzM2Q=p^NTW1%`r0!@ zQ-1uz0JV&Iz}%CZ1YA%6k{?XrIxF(L$y_>4mFYI#2qUnjX7J?9GfZ{tQ!Vfyjq9Sl z3$^NVg1a@xrPr*OCv7)~Hu(Y#I5jN#V@9B^I{J}Y5IxU|T%YUC&;hc@PB zE--h?NbGP-t8hp!byVF@e;;Ac=^(I;pg*@WehZ-$Y&VydSPwf`DO-1Sed)a&Fa`U< zWR^KusDbP%eqbXTZ(=Nr0lYHpr3+g~z7LV$dDtCs9;2a>0A&}srz9!1C)CZF$HN@k zcM;f98>G#;3M^j0n7w(d(kJEvFH-!tnEXY4xWL1)0Z?eOUGj_$<&1g*FjQ#SaXq1I zy96Tj!xyz@#3U~JUJ6v4AqCz37AGc*gG9j*U7xTL}J&gszs5&7cmHTY%t|eeOEN7&ZfJq1Luaym*tY3ecdO8as z5W3t|S993fvDKeS-R3Ciy)jU<;FDieH{v&Vh^_T)1@HppW7DGIMReI##N(rRjZ;C! zk-Q~{MxQrkrWT9%9axblww4J*1XGj6M?rlxm}THNRfLac&rL!$Go2WUSh^f?&j*Tc zlJ(0;MR1eYj^IwI4pqxGk?D1nn46ODWcSysd@|i!5$}AMPrQfxuFr$&K?R^_=s<)s z+R=urVE+yjkb+h%qv#?D1pDxMo<$RfnLNtFAKz{zs>wh+_1yG3s`@eZVScs)=8ALvKf=`*6@}R$}jCH zf5A_11Ww$f;=i2&3}D<7na4KARMT)xaL-D!zyvSYHu0}3$B#>_Pj;{_s|hY!H%iM0 zU0-?!THv>5^wiVLN9ZZ2N3D$~%~gEDl^&AXy;X<>zy>WsYidznQgVwA7{mnlb*sas zNX@gptjP#@g$07|SO9$PEh?61*vl_FIp()MgSp{`IWwmtUg&Upp*#-?Ns07k&x&Xk zM9m5xr1z>4GlcDf+8JR@glcvY7E!zQ3m4!3IA{}vwph<;(vzFS$@2KGn&{0bb&XL= zRsdooEeKXcPco9xFNqWSaywe-O zsk5Q%M1cU>98kih^jF@G-u_Fn89!;9kr$HC-1I0y!7I7C#@_^`YwI_CK3~}w@}OiX zTKEb|1Z7ET_!PGb*7Mxy`OgF`{vzXD_*5Frv6h~|+p;wDqrwb@9tuE|v(0|rpHL>g zNMY_p^lDS9z3Kit-nmJX&dcGV?NhmAJR+P>n>T>&d^z!s+pL8^!w6v$4n2KJVh?R* z!es#LEdYgBu*#D~1cPRXa{!Glk?GKccW|P-`6;zay9}Sda7c{%rtU~~st9=^cPdY&G{)BcNafBfT zNn@t)emFx)7HI@kncnf+j^NovX57|=*fIjx!iXZh8nZ)p@T5;(Q_-K^Ae30hZ)@O= zPL)}6WJgcaEsUo|=jLI2en_#Dkh>TA%AUpNH;zZ)@cKk ztxjDvo0_0KeCM^1QDM9WzSK@#ok6Lyh+HzWu(^EDyIV^FZ#(f6Q%aX}$8r9SpjJqM zj(VXJs8qb+B>2oJH`7)l!M4EQSisQ8J5`;1^}$=%O3EF}JslC#1ARl5JQw_=nP~HK zfLbtR|Np&^>%LafB3E30Re9PXWm>F( zXO^?m1i=?2!S-w9rQ+;NTIaj{HqM>kf+E;)kl@sA1BpLE!2shHv3jCbVLAb&*Be0Kn`f${FQVaB-ErzvT!+& z2|g`L)T>}DX)lsF^y13Vz;^OOS87gmXuroCNeOmvWO}Yj7}P^}V`1nY8GO2s<>(t! zoKx}e1gOqdEBR8Q5hW@EXI<$HAUr?zgD?Fun&}E+mS2BKg0xh^FX6Nfiu>1@d*t7T z&Wl6M=Wn?rg&yiy=s~Al+}wOz)}%D%A!hdNaY^B!vm8wK)#~E(Hs#CY$K62^`MPe` zsYl~)h_zV0F&Gyc2S2r1zL$yxJwD8yLG_r_3<@WQHB2s}Yy!mn&WquDgUy8cBpMnz zI%&Oqd3dQ25iJ@nSskg9VSm^SxzV6gy&W9l><6GKvkxd~>Mf}bDlLuX$qe**lXSOj>AqYY%~eEL}Sl0iF`*swHPXvtOYKv@J&8P@M)e1A0EMJU5C-EsN z`{Tz-`h(qSI+^Yf&WCji=Bj`@@2q}KkG6Azwk&aML9k7I{_R_T-6_9Y-OkmjyoeHC zWO*y8wM{m}1q}9lS1!b&lmsta_hP(8DA5@ZIU@I!t!y4yiB^mq{p80jFoZZ_`F!t0 z%jhqpYu^ep4|0gJ-U{`5QXs;@F(8(~=c{xD0yb5a7imO$Xy!@MM8B1^?8Z_JT}3E@ zg*nx{eYy#Rg*t+~Z-`u<#H5UNJWfQn)Bgp^Yos`Vu*HilSavF=d1)UQH~PeWqQ4xO|Kk(~%8LUntq!npDh-6o)2*}$uuvtx zf)r|v?SB8}pqGBzH5=IV`f*r4H$mQtFG8-k%UV6m0uwDC$?ae`h3Eny+4BP_^>4EP zS+P@njTGz;x)K2L6XUuC)LFS3;rd_6rNu62mtS+>$Hx2J-%=)oXlr6;if(oz`Fb|< zzl7ic?C?7QnRuYdgll+y7)Ws^yH&A_;CD?H2fHljw;Tzp32uR5Qtbrb(f)Ey_JLe< zwCL6tHJZ7rH5#lUO(?8aqn%d&!{cSjCX2y9jYpS9Xlp{qSso8w6ACvCu;IMGT252g z^9tn1#TIu?LV^^DRd+WB*i+fe#w(W0VtjD4HiJ(4D@9AZp+{O@0Ral7U&O!JhyQkX zpJWW>G$F!)(kEQdc8m}b_+7z_@vO{UXqULLT2wajm097M@Ka_D(R|AkA>@oJ;!xfK zypTNGih?q7gTuqK6!6(7&At2&tjx*7OP1UL_q?UFVkVkFcUuFsTAWNRuk zU8J{^Fc#>(%N?*Z6SW2KQm!OLA~6X@-7<#M;VqjU{~vfAw$$74o@3SV;cGK7XsmCi zwi;un+A0#zkA0<<2AMA(g~=%d_i{p&PwMQo&YAJ%O+#pVn;v9EqD#!2k#jnALSPDabR zg^nV+0~x9?ol4Bp_PO#1xlcj3w$AbDxhad-amBZ*Ch(R8cyQkp8cCe~;|I*bVbi{tc7+z$%m=jgVF7A128Gv+I>XJAkAUqn$9AjMhN)eT_lUZ<-@-% zjH@>P+3rIjHgi9i$9|*#nl(qU)#$M;JW`Z}PbBf~2WuZiilX|?mrU5gA1?J9e7CWA z2?s3s$gUG#rc)@83FxEZ_5;&*;u9UQ40W6PU$3VoPxG8uBv$NJl%BmW^xK}MY zv3(FIu;Ulf8n)q;7O=r~eMqL<&=!LI!>k&_ZLAvdF)SNbS#}hj>4?Hic?y(uJ1z$x zl7jlnBE8&(9VUaYf_c_6aJ;09l%d@VZ(#T?gP@Kh?KpkI-DqDVoZuW^PDwT}e#m3y zDm)Z-0Y$ayBrTBqT`-H;+fEqx$%;VT^`T6Yk(N=*oH-F~b0WfzFXkrjxpSi?R9l;# zQZ0E&iKc}I8}i-?2Ys(%UOm+pSB1lIqtR=gUG9mJ$+H3zq9B_nugXQE|2lIL zC2xdoyv+X^*f9`hyz!C_k2>qwn=V%pz9gIy)Qv2EQiTI$;D#>}#|RJ-TYvz*UTlO} zU&AzfjAVxvlONs-iw7%{oF2PQg$MxjJ${f{^b;9cfQf4xGFYAnRB~TnF-sStTEiVf ze}#+lVHda*G4I6aIwOth?@TV4r$txlGbiRV+0BA5WbwdEa9+E0_v6qy}w z!0b8idCG}w3B`B;4MYCc2Jj1r^ASczk`dx6B;=5+Q3@%N8YkO&u$7RlDnz(VB1Jj{ zMQTwAxro{ciWe^c(@SBvqAKUK17Lz-XH30k^BvFcCIQe*15PHag0cp=wfr?RtE@>O zxjrrZc0NDeqO}v7W;|#sD>KMc-}(-Pg`fe5@yNT4UuU&dQfHgxRnx^pGt4&-fF#)o zuJ!R8*VA$ae5v5+wh|ds#vO(WZT$3kpcYkE*oNPr`V^)wbZ17>oX9OiFH#7#N>&(3 z3R7V3sZ9`Ue+z4|+WM7wF$ayeNf!trCVzI>K#uAHu~xOGj-xsArB3#mBWujOT2vA7 z2`z&HLSH4$t8&kQx536*p*^@*Od21#{&e-;&EE5qH8}QpMg64HDl!PRuu`obK3phy17~LUB4|K zCnMAIBrv3`CZgay z8pfNa6^Xm!r`Cw<(539CSR2#4^9`av;@eS&UlUZjB}W;)BKCwV1k-u4Whr|R(c*x3 zE}sW%p`csfo&Ls}*+Xt4uREMR>GQy5-;4vkE7~K?#EZ0r{XtlDCo7v*ZwEo{Bn$Th z2_+Ct$8srhEyj*au;LyAO^4S3BR^g3&QQN+ziA17Zd5!kYE%k*J+4M4OL3d&cYrGx~neC8CtR3ofb;I6kl!f%EvGPIU&f z_muzJA~-jwf!*PBn-1k?@JkODg4m0MNifQGp9{gFumowDX}+q_xK`pj~&rc|)W z05)k|I*_O6?Cnd&6)6(8IsGk&$3n-KTdN*Lg#NbuN<543(6oT^g-RBH!ngTS=CC%n z-b;oQ0!HLDB@@eW@^ys{WkynH@Vvve=E+i8p>eNE)(pKFe(*SCy4a|XHhL_;nO6io z?is1okEk=9dIOXomwLN7szOVJ3dwIeutWs3Z+!H!zAN99(s zE5O9DYl3pHL8lv1{^&%YzZ^wKS3)jWdgEP_?OHuRe|aK-G(zb`GNk)+{}!{PkfPks zJMLq>(9J@Tm&$`bQC&7@IvyPtYp33ni@Ra5bp6}#h@r6cpow~^z6=3p#*N(5D>?VH z&3PK<#4fjBl$7BT(e_5N6T;#b$G!53)zoa0;a$2y`3+=|C`b3E;(F3W(HC(kVGD}R zkDyjcJg6vWgHA+{XowX}aoknOQBiiYfDmdjGV8G~y#TT!YOrV{>){ zi~p5fRQW~jn~JBYBFZ}j(e~pAYl*c#(Dp^`rAS~{<1DlPM`A+q?g>X2>}po+Naj1f z-5y2jsJ~Cz!yLH7QDS``p~gfWDWfA4oPdbqZ$jb~F}-HFNGJ1)VX22dy_%*3A2~+8 ziEbDXf1}=0%7Z3wCbvNsVY~BA5|W+P=GjSX2`kCjHg${<{SY9TvVVQ{{(Qsgr=A@1bXY$Sn*Fy-RyGN^2Eu;)2X#At?G9SpxF&Bln&@#IHW|6? zbgK0g`U~TCXHX~_s6PU~m;JtP>6NEK7iWJ6Zu^0bC5nCKOAO6oE4i{IC#)OQh^p-= za$*N<2gbW6*zh}>ATn3R!A_ci!v($n2D$re6EsK9%mm3w|z~hKK$-Xd` z!Bh{(y@O6$+sN5JS-UF~NRU+#C#0$^7=3LB{}yObKgzE$b-C%8m@GxQ;k_Nlf1qev zr|P3LdT6+f)R4OSbSeZhuJ@Yb4?h7KnB|Ilg+4L_fEPxtD3v{AMfs9jGv$Zp5V(SF{(JNq*( zR1kTfL?;N{iiWfxzX16I*&0N1E^Iw^c$JT|s4`yFlrVG!_dtcXP^yiZ5P1RN+|5B; zUK6$Xzk!sT^R$x=2;b9-s{&rlMTul$N^=F|;NbpK~wXRZC%#?3V%LX05(ApTTpvS{Y4 zEI%T;bP@naYeS?5ezQ+!rWz_Z;cLvC__KqC7}Brmkhk-XX#j0pRZwe2rSB)nv@^@cvXf=*g5y?)VE0oH)?qHWXEnb%Ws=rc;q~6 z0{bS&$}uDrQkr*ssdf5!z{uh`%gdO(1IZ;24BL?{L|n~qdQUl5t=28IX)j^qB9_G} zW5v60)#si$1qxP{&D^-4O~BoK{b!c;jU6Bdvomt|-2}2*^)Nl6gK5V&y1GAF8T+g` zUGC7xb4zjZw32u&PJ74vv|`~b9@4rJ9ExJq@0F=}W&5iy*pBP^BW3Of#Q`im

x9ZUU~fK5W@K`jF?70sUQ)sdq#CcM1g!7NrQqbIps# zBJyyf?#S@J?;rRct;=}lr0Kbnsz3W;?3`1ug*n(~-5t`!?bJktL!f693rtZGvewcg zgLloAUsnw(0PH3P!P3leH1)1p{(=u6=P;Rv?We_8lANU~;LY~uZ~BEI8@&UZ#ITbn zuPyf8(4XI&9R8$WW>67X>adus*lZ;yrl>pFFny7cLH8gSo&B(q`wRjr!Z~z7Ibif~ zC^_CGasO>>5FXa?NIxG%MQ1lS%;~swC`q z8D?Ydgsni?s4eY~1{1i&hC!t18gL{z6R#e?sq1@H9{qOHb?J~vlA+e2pj9TXVL**{FQsyDk&Zu?HPr)edmlD%L zXyTeW*#9_RET?1Es~mNN9p=n`y@Qrp<53SrgE8J`M9p<4YS>rVpEyigCC>br!+RX1 zv{Zl7EBIUUeZ%LJ)wV7*?vd*>#J;oQ0&r{aEhBW8vBt{+hHN^+SUZ05E@_whv$Czi^bASMG<^Uv&}dydPbwI36rE@4m`}SLfK^i+d@@%FC@kvZFV$2e`qex5 zC~x1Th~vbB3%iJ7`8kCPgZ@11o3LkNx?6X!jh|{w%B-m?!A7uIT92r@(gP}ZA*mO8xutfJCm#!2y6?X-P z%BGuf$GA+d?RIt3eOk_0fxD?vRqS_f2A+Vtm=0+=!2*94n@ zP%OJ`)7@L}yTzK@Fou4Wu^Fa1o)-AoHAg~948@zyMoK}tcVhAMvm;CHEdGLeY&Vih zm68s4+02@~#3(3Rb7e$2H)g7knd(f1h>wK%Lk3j)_pI#@=2^-#{R7u3HhY6;O;357 z;C)7Oz~AG*!j@Fz570GYb_>aL6KLp|Wb6==jhQ~jlBsCpI_i{no|)EfL*7IyZz)OM zdF4L3Vv*S5W44{kGEV9Yh#D_q0KM8Y9H=n_1%o(>y2^ixDP?TG*MEvD@QXIuQ!i%= zL6EeIh5Swh`|Fj?>W~0<0u2xou7XQZ*z5#-wsByY*ss%Si8xG5F>}RcF^)lYN%!*_ zp$d~+Q$1)=($3YfK3$D9eZX0D66>T7wR7w295CPNuP;Appn2g0B8UKOb@r{Ty!~)P zq$V~ACyxPcd4N1D{?YjCv8d%Z?$)4$MEa}6vzOx-7x6a87k}pf9>>vx(9qUs&WVq7 z3diBb6t~(@VuJQMHfk!O(RBov88ejLMr`d+t7(4hAN>zyCCQpSH;0~;4k@0)(H=t? zWsZ1vsyn!C{hki53~xEt^<(!m)ohW(npjNPG=n8BVsE?EYe^AF*l0}~E!Wp1i2Gz> zq?Zw^az!}stScl5SeA=HamqSu{UD%Ybvu~YnDM~ z&DetOLk{hRVU#-`Ws1AZ?RoF?PfGk<-L;G`E-Z`Athb~8!Ybj>MHV4NV4fDt^4pNd zQ^r}&o?!P{)EDYjYxXIs2m|4$XuwF|%S8_#_;sJ|tB06KBIpyr+6p2#{4MeRM*G-lS7x}rp@ zf}Mh(;{uOM4ABnU@kBSNZ5#*_6?>w+L)aP?hWnu3WZ13hG6lA=82dA?i8H)=@PpnR zm|gi9$1FwKkrI0NMKw?%;Y@a1U0%+*l+2mv5@y94j$U$NFVD>LMa}ky7Dsa|<+S*K zj(7l}z_uGB8WY0TB?eF%D*ACF8Tk+-Ks>beJ9eocAc*p6xk_ivVR?Z}m@w_%sXV@C z7C%iAD<*>mG6B8Gb$!IvyB_?rb<>6OQ(K(AjZ){+;ML_~>LucgT#fys6#%P6^woibz zW|7$+NWG*YX+mPGntzxsdS_3fNn%Jfnza$J8&cRRM^pGjk~5~>&^_*r?zte9zE9w3 z>16;Pkoplg+>hHpwbX^US^U*6I%OBz9i8w>$RF!|eHK4MCrX;FJHHwmtVe;IPznB+ zB>H7H{z{vH-0GtZn`}yFM1tGtT*jCFB~8u`HmvTnlMZa=p)k+fkaMTfTCD3cjjn&H@}RrFphb zXoNVi>s1bXsYa^OR-@EH)xf);?s%E94;PVGrcD|^Fk3*`|% zrtD66uY#?eR2g^whK!`vID3j`DI#6tr;bIi=%IUbY%A{G2;~VvQe*Gmyd1AER~J$} zt9)po6P&oZohE}ur#C~xrCyS;Ms#+QeZVF?-uaDLmzl^?$XeCJ#?&c|w6!!B{&Z?V zym}k5Xy#!L{?A``6Sw0XZe}{|UZJ@a!c3qZ*4EdblyQ`Fm-W){-R);6Yx0w|&~^$@ z9EhkeR~Fp|O)t_Nx;$Pp5*^U=4F^Ze+Axk8Bi-W28kJVP92}STyEW;i}`nn6_^P7$mbsyf4G4=+0*Dc*Rdf`n5!3%gv6DOn^0>PD{T=!9#m z)cvA0FHGQn25gONV%@mZPTtH^t@WGTyT3s94Y+Y4?LoV%PyY6)hBt?h z(RYS}Jso5|ZBP8+L!s3Ocg-kdBQ`6AP%)y=eOz=CYZzo?JdUo=L}ZOUkEF=cD9BVc zp@p*jWkhsL8iD#}+SR)0nt0#3PZ8ytp)c$nX4V(?q48{a2ZS*J%5kH~+c;8+P6I@9 za3d7Dyl+Cq>CC`&U_|`hjZycO3tB_(9ZyH~5t~yp&5IX!6Tq%o`vA)z4NCr+ZDE5V zL>9YKWj0>|XuhY6F(NrWXGA&ss)3Ebe~Xke(>Rw$TS5P^JG$Nmax&7+2Slyno_?-6 zbiPr7Be@_B7sbZlevd%SBTQPn3GY!SaV%LFglN4C5z9xB`Y2NY9l;(9H;5sNiiruMAJlzf00>IObwchHc+&gEdT+oz3Wq9~6uX zh)1d!qv~pPMwomd5J^(UKCwd41uA~Dz`KMbICc+Qn%!zp!!u|bHVb*8E`BNQ65`r4 z0K=-k4Wq;vH<6Y}<@DZ}|VWE#vE!71Z#7Lq3ig@I7t3eZ{6#xW8$B^hcrKWm;j9d0c?Z z8hLMW0YOr=cs4+2p z4%Wc$ti0oamR{rq4=-}31-G7&MyCz5pOhI^&`h&V&|`Hq2#^(kc5%f_iSs-!nxR_G z^M<;u_9afnDbULLG*6xa@$28h`kGqCPxC;J+m`mfTnGG*mDk{<5L+XZee|#Q)bjbgUhbx0C9-R(e{8UMV?buW$il_1Fg9Dx%e3#YPEnHu?i`Z>nU} z4}75M^{&yV117X_poO{r>sYqO)?U>gOTT(d!qAEOAZRzu2^dmt2yg3L(HgixB0ryX z6T-l=4WRNSI}%Z7GYjnKCDoPP%pHK9rgy~lOD0Ykjb zWw0d2R}47sK(A_;Lvggoar&B*4>OKkO%6fRkEJsB%Z=IeDFl0-tJ(1b7*&op)XMEa zY2Ik=T%i&_?%Y3@E!`SGPd@X1Tsl6vC2$PwC4{x8*W3dR$9jOcCx#aWc*q2G7Ad^8 zmqep}fMs=hHq$bwjeiA8C~OqsI3kX>`$XqSuo`;V@LOv^@6!qKXtzsS{K)R=z{x^U zszQplKc%#!oK+8Xy>0GMjYj9_7EWVwi}-FTkt4O*>6g>iZ?oF2PBT_tgOz^L>RtcI z{YiN9#!cbXWEMo06QF%FK^jj*+-*FLn>4cd|4%EXGc!4DPX?Z=6x;@ou}wKTwotZ) z_#(5pvxm-g6%NOVy%!=SXh4N9^4I=fJOR%QjcKPZOM7CcGW}W`eMX|A{*hFi<^cRa zLfC;_xs+wf;h7FB1naP$SL-dK12$g11HucYwX0MMahT)q#|l(3ciAQ}WbY<-3+dd| zIz-22!rb-5^HdU`!S7Q9I#)SrLnCYn@=$qPJw=^OihgWH7Apj>-OT<%2z}KRTQyM) zxKH5A)&{1l|H)-z#>E@WD_H>q3H#(<|D^aq0jPl!GplO~dUR1mg>}C~Pe@XpF4}+t zemQX=tMjd+!UIaZ`)H#XFpyVytSVG2hWiq)vGMqdm^wUJ`m&l#n*gP0V^9yO+wK$R z-dAC?2UTQLMp5eIWUPJ}#sS20oDJCSg99_;75Up--Uia^f?Ii{Ct@s>i?0zK#iWa@ z(T6vya9t?wa}X<^Q$=lGEf5)+%kHw=kKKD>h@~+CV~or!k6c&U8uD*_jss+6pp0)1 z8ypgsodM)quM)ZZDY#kz$^LmIUA-GL^S9^YS%7l8R>8gaXg zNU~&ls?_NZsr{IOyR9gUOh+J}pc)HVoMD{`Mp25s2emDXqvDb%s+fhP=4g|WU7UdG za0>pRz>F%}un)iPQ0-bwdvL!*KI#-&Ov1tkoE1p_hhA`^|D;a$rOcaJ-k;S}snQzP zSPNqKL?dY&?wS3oG2}`&7xG$>Ctcmr{k2hSnnBelGfT(~G{ExcsX# zL$iwQD*#j5?vh;eOb*yk9O6_}(uFw{Fm1Jn6@v-M&@|0*>6%kQZIgOmJ3wxVX3$uC zmw@XGO#+C_($X34WBSxTuG!nE*%hLcB%i2S#Ub57PDKMxRaH671`$cRl$d$c+r13y zcw1$K+S)glJ8!f%EJ(q>^IE6NprtC%`**qE=rsismxH9vdL*Wkv{&{k@BU9lcT)*>v*Tl;CZUImNKCZ zOv2HHDA9!%AYf_4y5|c2mwDFm{fD1}hNerE-Z3zT8~s79JBMU{ERHD&wdsC6z7@5M z9p6qC<}e1AYpnWqMBlh9R(I!+^&eJcjhK4v>?rA|Vt1RPi4(DDz_@q-mQu@Rk>(tj z!JK@^nnO0DZJP2}s-RSzL#CWAiCx%-$L}yKht~W||99}|DY@yMZ>A%J9DqttloQca zvFVD#u@m6`o%QkP4ZYfo!-VW0lg~9~%R>cKCM%TjuTx2w-g)(<}kqzZxc zRZOQ?FcVjtZ37}}fMF%tgUNMaqaY`3?Q~hv*xK6I&};oTaQeEBLM=!`lIrY?xEdob z?prYv7)k)AW2sBCH2W6Vq!_Pkc1NY{@yd9;(pT1r%{`rF^i;4cZGQsBxR-mcUlHC`QULp`pt871iY`0+FJeL&s~6#Nke8bp^)yq`LsT288`zq3(t z36AR1xG_J%_3<p1A7laioTrZCqt$oX?yt5==B9H3Yvd1% zte(hj(BE)oSQLP~BsaevC;{*$Yp{oZqX{1uKmtF=&-hT#x7@@S83)kvRO^hTGG!2? zVLf~#-Y~@n3pcb6@` zJu{eDX^@PNjij49eE2;~u%0I4du-|NfcX>5?>4vCtIOj`xlJKd{Uallw=Rx7a#!wY zy1(Q|^903!U=P=n(_skA7g;MLh{Gfrh?yhyEXDJ(ejBH2KT>qlzs=}!%2iR|=L-3e zckL?UMG-YWBSa7>Uo|clcK_Cy=t-;|6e(9RNL~6j`(Aa%zbA^FpYtu(EW zR^1IfiyYK6ZeJJe4GGgVE;wMLDqAzP;iv8>&Xodv<(A($c8h>hJ=R!G77FHJ0euD{ zbuTV^3~gQ~MG*2D%drpY`|T9O8?~H(sVgOf@`zXALf`H>~7dM07%gFK$OeN>!P@BCcxi(kl`NgR zn>lZu2e1KXDId8cP3!nK4x}CN7+4F*Gpu;`C#~-nTo)%`8|j>8ObIVi;(+XmepI*7 z&k*wJcqWu4M2Dm#ZXf{~@&Edn{WAdwpwvypx+9p}5aG&@tMZaJ;$ z%`{k3m@U~&j~9)P{+jI~PnRq^Zg16$ryj9h8$(aJE)m6u#V%WomNB_(PRZ2^9m*^u z3xXeFy8=$#|XlS#}-Q_k`-hrE_+)@U-3#{Sd6Af_zyp7xJjg>0tsD=cU#{VpOC;CK_9ObQx z|206%8Emw+EtcaJ^-O=$ zw%`;RxG@B*c#&?7C|}Md)2a>SQ4ez7YU*P`LTA!b$>nT0T`eN_f+E(lA`vKClAr`{ z5S#@4C}7$@0Il67JBDA~aQ!3zS@3-IFqizKW-Zp2ba}NsygK|S&#Pr&8?}ASYZrgI z26PuBd-xxufse12F^040FF3V+SbMSZPqt0R=ZQUj%Q+fg<-@bs0l5bOt}rXOXA|uv z+|KIxQ&(8gIczfsh8=!R0&hvezi4V&cr8}&c}M8l8pTod*|U!%RKX4@bMi&XyvR;X zHW#1U4R0!__UHG22_M+NnC*XOmKllr5e)uH$aUVkhL7MgTP+d_mS$=hy#=X7?Ty{j zmM~AIDf(2f4Js9N@|(K!=ZYOQJT)Vo8CMS$VQO?ubTV50iD1YO%kL{w*pLr?f3b+5 zJ+mWf)^^29sezNaT)E`n>(fuVd!rIr-7R`dg$g|L#iw{Wx1g^hB-vPs>g;+vS}1vn zcg(g5rym1avIu#<%XK?#+t(%U(?lt{NDH6OP_7N;fs{%cC&Bjddwqp^kHr}c+upr+ zGK%E6l4{0x)AFR1VUd3159{$9$|)7O#xMy~|3@X=&C#`a+1nVTJw-o*Z4-aZ^agp~jBLRW zGx8>_Q85{Vw{aWv82lSAGP+YQvtAEZ_0pY2h>CtAu|9VWas4cpb8F>95WWWuPp3UG9V}iU~Yu$3R^g_2VKB$0$@?eo4JIq;y zh+Z7?E4SuorUZC$$P1<=R%A$(ChEp5_X9p<`HNsG(a68`k%->rlL|6a1)wFIxV}UU zcUbZyDnqiNrdK4WYZa>BafgvayEv`;u(@%-vV!f~Siv7^kuE+dnRZ(eYN z1Z4=yw~Fh@GV}6>15+3=5fahVKiuWya;iXjf7j+$7l}jFT*k6N4xz_#usywFivq?R zG-)*6p*S?>?^^@gwrL@tJd_t~lB*V=QXe(}^4Q`Nd&DfT=V8l8H&3=G^#>w7*;dh> z)6=}|RMfuLqLeO+o6#BzM=P_jA0ART$mGdGv0R#t09`o4>d(j3Rr{0>(I>4p%%Y!P z-_2q9v)(g0qDik6pG@ip0nSiO#m$-TV%r2~Xt4cVP$6l@;d;r!giA`r8!AGS|9s=M zqs*Fxvw5437)rgpg zmmj}Qv&{kEln~H5-<7^sJXvHIm>K>cQHx_WZ_7-e@QA?*8d&|04es7_DC8>qr1z0OMvp}bI)xO1hr(BOhO>khvC2bS*JJJihoXps>%A5|Z>i%cJf3LZ8%zP!( z#pHuK214lV*$=F>bf}I5xQF2F5j80s;@9NK)WVE2sto~9CeU7~K-l2)5!wI1jRYcd zh>DqNm74EHCr3%OY?NKgC6x z6w^Rea=ckIOOQE;75#rd*h}mdfKLyTvIrth41Pg~Q_e!96v@@^#Ev%EmAo5z8QiG? zRVgYaYS6{K+L6X&AkC&r4)p(~-M=pS_DcXP0NWgB)j}xm!C+ZWvU>?U;c#{iHd2;k z*go;zbWSW^Wo#&>mIs^8!66+#eJ$iq8Bna$pX+d$4q;;r*iKvm!gPJN;$oo#aj1QumfjQl@8_~DDh&*48NuEp(Jgf%ztQp zI~EP8CW<=}%WfT5XSKc}$1*Y8takGAc$gu9T!U4P9xvq z5v$wSWW(e2MGBrGWC8848-#lnz3jS$p?9GQ)l7N!hUlWpQy+YIva~p;ry4YXJUx8@ zU~wt2ILd3(<$%LPK2bI|_-*^O%@rG1xjp*RYTd@U!&ce}c5Z~gNLqJgiz?cO?Jxcu z@d{2dEafRqw#>bGwl8ZD0`6$f(R2s0p_UJfD2zxkHzo1G zRHKn;&&{u_su) zl1eC*-`e}v+IKw2(;vT!cvyy{^~lEvtgrS$Yj%Ach12xP3}j8Q&;jL(U0>&(#S7!% zcUE5NFP|)wXr^o$U>o3)HJ1s2plANhl8j=%IA6oTd0veEEGQ@-Ni+SDJvABkc9qvf z{$V!DqH|eQAbs~+<&D|`^vTn92^j>f*E1#74k^(nWiI2TEwZ99Q;RWF*jd?G=F%S{ zqimfn3Rk|02W6$rQ^~EFig7i?Uwb}aeeV;T2I>iX{L=yUKfQ9(9#pnZ?D3P zjwz*KZc^8AEo}YN+(q$#_qAtY-)7v4P;8PB*Vh)lda;;q8C?;*Blx76Tug}FJSs)ltt`HO#ozBbSyss?15kg=+v zc{06#??vxO5whT(edVnCTwbDxkzgtF^5>QPJ!7K|cpn}(@IC2ZT4~EA|Ffl_9(Tn( z1Ii2XJfn7yOhvvsdBhvHTsV!XuPFM>w$|6YQ!_F8;(;Mo6qjJyg4gvI7>C@k$2gWR2th6S&2-K)8!O93&q zYWgD&>wvjXz6u<*$WF=VToDKQ4Zaawk+tqW&23-jS#IoI;#H5{kEO)gh&mWW6w1T{ z2WxA!i*a_mW8(lnws<7_moyEQDN6SxC;>lfPL=}V7YPcwMr)QDGS(_>&x_>?4~TH4 z*tt~3#9@1gB+%!c3tp~mK8BN95viAY$&K+>BDH9wqOIp) z9ueMcCU7{gukFtT9a+7?=g?WwTr zr0ZYy_GeZY2%s}gg!r4tAX2ZG)&YI0j>~a!UsfxjGT3)M{gFx9q%;F)5q$ZyTNAPpvMmLX<1XGD_C+2v5eqL$&vhdj=5_>|O1rdU;(-*}`U zw+~wT#+bXUoC*glZ!X2c31+j=a3<$P|Cq|P2oTG$g5S3#;+ujY{gBll;I1HPi1o@@ zrCI{jFIjS)Y`cM2FVqMi>8@F$(T13Ezu?M)7J7|}MH%b1M2Bn>KAGv&p%nD4k~&B9 zv{%LdT@8R?hLF%~q{_usyVFO{INnA=F<~O(pR{OZbzPBUR{6!T+1Zo>p06UkjBdn% zqTF%8LiDzqmQW(%Vz1Lt_i%)_61ZwWf~%x}0}#biTqOy0b#6@Ozr&JlymW+hr+~g7 z%;3h&-%Y{Zn0UuR>(S;F7Jz=81)k0rsYeV#i4rGFwu#lI99fXdYJMqjQ{4l zwX-j=VN5hN#;2ROCeZ-i<#Gwka8khmexwf=+&eA=|Cau7ZW#|FDg#M7thZqnq_<@x zahdg@e7k`RaG@MP>& zoR$Z)GoZ&fQaWkWywe$mN04!?iubDfd)V6ng4F7^9)LeaFkMHAY?FvjL6Q;}+z|$Cfis6c zy-SO(L}2j*LDOwe%f|ZA6uz8yYYNSW)lo4vAmxHmZDblP)Itb|o^%$*&#!IC4Coiz zGi^jm9J2g3vT0H=Ly1&(iKXose;s!H$CMb9HN5wZ7J0*y>z5g(DDF*_FYU>!1^0f( zaXSwus56bQ1R&ckJ?gliF28?#7j7$!|C<8hu6ky!vfu{fvn9X_;lL$pXUQ5T>0Dyt z1VB_s6gE}WE=%ZimYZW(XABkSEP{aTmNhMUI;fz`1SmR&neR)HuMeHJbETHuR7f#q zq3TG0e&yQu%-OG{g!=1DW_vnaf$(C57At?esvRnFOfxxJ?;)iGRm8J}hM=Esph$ti zIxM>o$x;fi@UnD*ZJYCwJ0i*-oVUoSX1tFIiZowa1^VhQ+OL6agHM`uh zw%>>-0Hiq$Z|2?0mTl0J&uY~t7}0y1>Qz%Jq0uKwRw<`u7$HYX;^{DwA#O)uW`qG~ z>GS4$us^F7v{A_gTPznb(f~@x&oxv3?UV< zw^j0Y`(29ja4h%VB5q+^?DC%lu0Qazq|F z<&ZjXF(P&7sE&;ecEj_xCu!mINYjhp_GS#Ya^>&8u99;w4weZ~xOX7KyBcgLq(6qWqafQ)`5kC@CyXd1n4ja37X& znmP_ikU4`k?vl70wFUe~Nz)p(oyDajaYz$yMPtBFFF1;(jJLydQ7PX0KMS-oao44G z{J9GW7|_}IZ6|k5aL=Jrl6)lzXH{zKsT|A(V17lg*bqlm34FP|7nCxjr&=J?)MklEPj@@GzTt&KOPsd zB|>>9@VuMM>#JAQAGdkx2N}Bl7NBIm9oK~Z6Hfv4AHzc~@s8Z{@!t4!0ZxL1c07M( zas*}NE_xB`?-k0zLy0VgK88#~Nt7>HkiZ!|+98a=mMm-x|1~U?341}zW!px=8VpZ4*08yDY&g@A>FeQntwoH#A zGPoMEkZk~mG+(cVMv#yDsa*jUp!rmG-F5l*8VZ$PybH-?XQe@8CC|OABZr;wkS11B>&M4A^|=3`1f|ekRa8B!=^Cfq9yhvSqgwziB})Hs z5u89H{wR6{QpJazwo&vB+QHFQg6Tg=Q2Ls3=*--XpuTF#fUU){1#&ogXE!Si&tCj1 z&IF~0)y)NwrAKcKm0-$26X|ovHLk!R{YH3ARVVZaJ;Z=LzW@Z(M1ec5sGryir+;wL zp4_Ri&;zT^{aTQt8=x4%r@9`6N2WAJsC8@6C+P^D7a}po`xdkAh>up+z6|KH9w{Ky zRIpNN3{lcNkR*9R4jo?trKCB7f5bwSE6i9aKP)hXSSv5EF|+9iU9qx?opsXPQ>|dI z#LB2fwc9Lx*J(`;AVr!^2M!-IMw3Pev7yf^qCmuY5|bSOP;$yd{>;*!OWWV1&2Rj1 zN9W9-eH8BtKtcf&4 zc(wf#KEc>)B!ijn4@hUa zw0fOFp`^335j6dF`Xy*$*4zI0!*=oXFMAxSM{_@uEw1b9{bS3KK1ov}hn z&za-Mu!(hep0lRR&pvl09jQL^RM1=}Ju&N-;Myr{v`FbUz?~>bBPVVzk@wZn2%iH1 z>4qr(KW_;N+pH~BtB5ChY{l+CX#D3>F}k*Iw%5X`8FQ5nJ2{!hCfxTHIsj18YsVV| zD)6ffGC?et@z%!$ux$nX(&d@a@9RlCqH%z?ZTrP-h+`#sm3E={66%oy<9|yZAK_7n z-lj`j)kjvER_lVpN)Y?rJ&H{0(AWlsP_yZuuoJ5owE6NU2_m3^lf{Q$tgOKh1fS1S zHc>(@+*hf=ho9D%sNKJm8L=q7HO8h5XmGu^0_f8>XsJORJO)$K2?opJok&*Kk*Zc=61=$?i+}%o z{mvc$a}iWxqn(H*?v6;{s~}ds+WS4saFRoD*tZ|`vG@%-Gabfk%iEQ7szHA3G|W{U zlAIH{pn-Fvr2Zm)Q%jOMJFd=o#q`C!3eVR~m029{v_co~?S)bz)}%?zlY3*o94(l5 z`&Wnt_ua+rlmQgEG#yQLsea8I3L)Y+HT6m1f5O^BcO4ZyhLO&Z zMLwknja+$Y^*oC_jpwPGY8eYg>;3SIbs^U>BQA4n(!vYybi^clF5p4yLkdj#wo*xS z>K;|_<#u!f(#yAoIVd+mzGraDXUlE>=KP#HJZi2-dEI(eOoh5}6(@u!Bnh}t<$>qR zAS~r5sSK&7PZzf(gJ%5~?p>SiEG-HdT$4V6=|jLxp>Qrm5hQqL$P*5NW>b=uA*KK2 zSFhFQKVfOoOi6mcIou!KEeYR#IqovTaaIr#!Q5`t8c{&`OX%$ zHtuqnacLow)C#64>qot4z2wYK{fpe2+VNp6>|F1{|5B+RM&fXP+>ko_-k}>1QB!&LOgu6({pSay#7jFu-TG_PAjt#~wr@3&42L zQKF`I`Bl;E>B>HpG*8L+fQiv+v&#*?#B>Bu9jw2=UieqR zfxBOeg|(xGwa~fJE%LT>N?2nS@t|cE?1cj-<>7KiVz$peVH?!dEomp0(h0Hm9i6(m zVt-Y{R%Erlsbi=BXfA?143(Da(@gu|AEWLWU;&J#M9I-w_*Z3V4+H{HMUBiV*Vo5xxCAgN4P~Rsp3|xc`c%&QiZ_IC&R1o~{@b9FyykK(jRtDN?9uQeFljrztCR-!tZ-6oQS+G`w_hFCOB~vyg}ko@GX@ zH;F?u@Yq#vxg%FuA=rOyb&kA;>s@ZuY+F#zt@>b>1;f50U?CPJW*e-7-@aNqlRq!=f4YUf zN<`U2YRJvRGPg3vw{?i}n8EHsL|#Ss2xt5j>mPE>ma66_{;o;m|W};YW)WepgH+Vyc-76uu=Ct$3yZnk8Kw9F*FvPkznOKR2M9u z6dJ~?ea4AOX4D%?U$~S@%@0Td}r;u==3V^ zS5??sK_w4X0{);ZgyL3$?>UV)@S53=E-L{9kL*QaVazSFu+TsGT4-!wZRUJ#04|?Q zzB;47vVr=j$>N2DpesqIDR(ZsgxUal ze8QsE?asGVjx$f}hBjjt>TST|-dT?AbrFz!(MWC{%&5#!SAK>Jku(9qbCe!uUZ#1l zHBs|IA?2a+RUZEQe06o-)YG!44`o+o1#-{0Sb1qz^Ey+3Kav#;A!>%ds%v#(nRqPX zR)DT_Y7RDQg+!o$Vo(P!teFTdtr}kcq_{$fsM7KAWvDLJWVEXGVv;C|mgkb|PMF{c zr1SqewDT%God;%;{UU92STKGAJP!33d_aOMKEe>M4VF7E9ZyI0Y%{_|?5W11(2?RS zrm2!rAJ+L7Q7Yt^5nT6nImK#(P-v zKf`_FGSj;$sZq$c6$hPhxSSAYm`t^u<*H3E>ve5Q`$!d_d$OLisn zT<#?;!!e$z;)^x3%Kd!aczYRubpJCMOGfELP;arU%m{dKXC@(B%YD=(>-X-4zE8PU z;WvzxI-2xcR2aKpg8x?}I#=&l_FqHh@fY4ulg%0!uunNdrD!j~Yu|x)#^>=vf#x95 z9xB6d7WGeI!n?UDVbD?Wp?6}SbpNgoiU>M63IUqT*thNG8NWd3rgy!KK*^6Sr3on~ zg8~b|Um>6jo1hfnmR2;Sgyz6qlL%mgOPOaMlIXhWejDC`j81T}nOTYV^rUE&D{m{k zyjsI2`)8w_#-S8yTAV`2+Rrqo=$C;IJVLjo-1!f?tBHKrY5~eMRJZ=u7cR?U8Z<~G zef%3`g$vHUv&3mN+tNds*BMvpBf>e4pdpI}5yI*Ft5qc&s~89=m}5--%x}I%QKdYI#P?(npa0 zL&EKK{?CA@pvbn1lM%zVo?)#8$E3rA1?|m&m;iwRldf$JNVyycRo&uuPXbk%^0|EB z$8r5se1<}{SWM0tPKI*;k9>)3*N7-=SyZs_c`%@iFNvFuY((Z|?;8@Qmo3Q_N|M>i zfDCf!P^HeM+PO+MQ(AD&gV%}TBl`x(DseMJ4CXtt&+LQksDr&BAfy+C>QjG^##)T$ z$!@qDujwL=I?VE^BQ>tQdP6h%4tx6AiVF$EKMI4sfTKT4PP9*bUI)n{7#zkl5cB84SC?G-_4DdAgGhy_8}rIi7~#cMw`Cc`+Z)ttBt z8h+$(=3S{xI=yD}A;BU~ashrUNxa|hXYD#r2LG#1Y}v)?@!TW6p^%?519DMR@f}RT!ALq3EKdlk02RD?`G?P%je`vj9Jm=lQIAGc9UYUK5X%+&adRim zI@_W@J$gqFhkCEX-ds~+MCgf+ql+OZ6XIu1gJ|_m%dJv8rQy#$KxP94zTIM^k4?pS zvmRRKq0Q>LmnxmTGo!bi-f`#MWiPBi5orwXlh&SGjho5)xUICTMjqSgwSh}2&;lCl3dy%@vC;mC zW@HP*AFmLWp7Rc2MZHNka^X|-aZJLm&r0`$3^A>|lr}=-4gh2ogg=MpZ8qKf9Rr1^ zs7GAkBC00%yc@=zc))}{bZX71UJDeoCj{ncD&rbWqj|ihi5HjLF^M2P-P@Ou?+fEb z@qLBDX8?nKBa=m>G;AVZz$2s-C?ll3wHJ{nuLXWJ;V+qV=k0Tem}_@FO5WN+DM>+~ z@8-Pj2_O9Muj)qCD(#gQ7Q-xZBau{R6-91~D3$ZtZinmuOHZ7|y#e6g)$PhbL}BdT ztyTP6D7h=Lh!OjCDfTT4nXj{X5KoD7#xVBj7#gidpw=u_sm;3}sLMOYUx5uy0bElo z?9yE-*KB=C(%gCYAd|+yodU}mFG)C^L6E7BXS{GpPN`}(X}h1d?u|&qTNKT&fZ*54 zxYzCqM-Ai0tyqdz(sd$=@)KU~bNlcz3^~R{wvit8@QXkh@i(5lMv5~#BtXsPo7m1VvfTiIX2ltvXoC! zIt(=VuRjVsq)YjWb)JTD%2O3q@^435e4|k(jAKYk(s&47QzfBWQ^?Q|$})t4m#hwg zHp^hk%Z1wR;>^ZvIsQ5>pc++U&A<$z+|5EE2rQH`dy-z)$po@TdZ@la3|UgJI>keS zXVZUaA5${h8o@}IGiM9eMfKF?D|x*+wU!Tv5M0j4Y1UiAfH>xmhw-EznUBJ9LIu>i za#$AV0xA=Q@qIG@PlQ!r2MQj*8zDfcNHoEAm1>$k@s;B2GjxLAZb8HWt|&E~0GNTd z(dit1Cwu8r>==3Qk63l7o6|4B#(n5tL9U{R7BdenKQTX`z;lExe6U%9H;=L#((UG& zlZ7iCJ|uSJTx4g@L@%M)2aQ7I=2!{w+-~Wai_1vSA8Mw12jow??b%hL>n^PaMqaUp zp{PeKd4awXM9f_6hK8ep~9@u@k z*MtzR7HWwPq?}l1bsBcH9EGEUR>{WdazH4`H6!<4s<$Xcb3~n5uI^TIcr-XW+bgJM zShNs2F|q0W+m*9b^WIrNiUmVGXj6cW)%nJ0-U=NpE4?f-_FL5{_sL)P6duaR8v~Lb zy`^SL#BsEjbcxj>@>aJ`G!9uRytj3eL}8tqYi^4AX*y9K#K`+lX&XQ*#W>Yx$X^OD z9rA@kkncf`F@vF*nHoH9bdE~f{zb{>$4$B`bOso>mX+a%z%mqNAuseiwi!;EQRK?n_ACerh zy_v7O78UH3(e~Njv%zob{U2u z8`;5DS?*r1FG+EUK6r^%0g@F zm znEXU;9xJ2`-F^>HiNG8pE|0?$qL{V5HgB~OWoGJ=YXIx~5c8$g1%n6op;O--)$nL6 z-`^RU_o|IAiM)`Oh37ckLes$cXh=Ku&dzJrw!2R5|K_d-ft6cLwh5? zk+xuTfe&;&E>NY+PJAYjZzLU%g-tV~SA$gO2)FzsP?PMDc6 zGBvo+E1B~3Kz0@jqd@MIWFxM|$XqlKs1okfAzkJn&RWz|pWqCNuB@>fACYO<oZ)u&W2u<%k`h9F@1AR~xJE9Ij}>ld)fAeP^}4mE^4D@b8s&>=!IzW1T4+uAxN zbS5`SY-yPLYC)N!A4ZJHOPY$57Z21gy;%4P@OmLB&*$d$AFP{<2q@Xh2;F`y2T?UU z5*I0ik%9f7SmK%P@}oxY2u41%Cwat_^bn(kIuact!aTJEVUnlFgdfQV=&x1%JgN5P zxY^U$0R$VbPgW40nsVG8<>CMrf#c`Z{*UUYP2TSJFLQO&A^gEDD9Vt4$dAMX?zmPo>)fg8ZpAMlpWTL9{}=fno^`-!|Uh zg%u0LO3)>dWe+~kp4M|;x^mP%Tk_4sSSLIo&)F|eB#$eDoVkLj(?*>KRZ0fg6%$cu zUU)LG=FFIsW#?rYpk&`!-X(?W{NG|}#HOIuOG%M0mww;SI~x*yl`N-Fb~57v3OJj} z33bp3s(`y}v{Sd@A+i?Hk7M5K#B-60M;r0`P`oS*kIjwzH3_DYsGm{MFylA|F03QR zIV)BKlvL|w2ZS-SPy-2?00LcOF!<59C=s$zpqGR|sdnb~PrOMy35|mZf@iHE@m`Z_Pd>jD1F))iU^CCF zTXZ~>a%q-84ErNbflNLUt%D&s^M&V=QEWJpD+%r4k8HybzbeUq#W4;%FKGr?sVC z{8ar8$xhY*l(HoSrrWagE1WiT75OjtM^~nQ`QigcX$!M90(-mm<0l;Sv25Iiw{ot8X$E?Zxk+>N@g+#vjtpw;IABVZv^T5suIoMzCL{o;d?~({>G*k=;#heU{Y;S;rW{Sxja1(Cid- zOSC&p2bOoSQxEk!&+lnbCg4=!H}?&Er^&lw6GX_@^%uQ zp-2oId3hcXlO(#|Y+uNBPkNQe;LR)Rg)yMav%{%x1LgUvT2zs>`nQL>{ z!@mhOp(G(-CR4dxI8W~H+OWVf*PuRr#^a2X)~w=-BY!jw;NhlfZm@_S_;JB0u!Ok1 z!Fj31DE{rtW`AC3${Y|^25}(}x!gmHhxXadebd&bAZcv}_dlToSmJ;O^zrG+=20)Y zAB9SRB~QK7*TUfuO^PTLs=cMJ7#74QR_g2Y zQE|fda|hc6G)(`;Ha)A%hQR5AQ+@{?34I-%G5@2RD$2j{_%`iR;LO-KXAP^!qk6G8 zF^>Y%74RCw5qxyXOt%3S!RZS6699bzEXu#1@RES1v9~@ z-C?3yt4MiR^Q8+9eGsxv0QG~MtcDI(bwCE)3#6GZp(|$9f;TQ2e{SyyVXiQ{e}!}1 zT~3gq=8E!GE?W@-4MoAqlH=5nu2A623OTj4d@^_)MYIJ2g~JEVBs%rVPMu zEUU2wd6(4Zj=*i5H;G$fC7mLO29sbqZWfCINgy@pk!+7$fnOXyvV7PZUK zy2JY)7u@FvqBpEpSV$~8gtzgYSPbWrAx?O52I2mL;za7xzQP!{&tc=b@eJTy)B%0E zgiu0mL3$GTnD0SGgo95L_ZM5gwS2z}M14|v$Z~|#7O&((36b*{jsZAOMZo-*Ek8;wM?KB=MTZvwn0f75y#p4d`7=Ifv=Bt=v5kLes9^ z&N;*q%*%ReVkd@3Hv~rk8ls9YJmcTRj_7}oiEPFnSIimbx$qQ9xSmqpb`pW_ukQzY zJxqUrHAp(?47$*%evOAKukqDcC!|o^ec-M=4WhZ<`B)jnBGMwsXv5So%3$A89wj*g zqEg6z0;hYgKVPa+k=}5)un`y@&N$eA-`Wx!6jZbR5Q#L2UHpwMfKWA*ub_*-+VZPAiru8zrV$cHT-3MBJxkEN2j5^&ssA4$YhK5X%2J|rK~8V#`_L%%-N zE~%6hT$n_zhYc?m)l0cl*}07oq@X`I)w8n`EM)8A;VhM!8RioldQ4FEyE4trkna;Z zPpsBl@HF=Kq7b|T{7Sgm8#sQ-O!!#A_VqYjqGMf?P3-PF)~f%>Zyfnh)2Wrpd)800 z9#I?=gnW%H1ROzGh;jRL=wB=+y%qb#T%WKF16N!_Aur&4II8*8aRq5JjhUwyy-9iIk&)t&wsl zDlo;0u&0=ee=)!9t95fEtd8PZ7tQEOx2jA$&5yg-z98&*4$ZzAQI^E{R^+OH%C|qI z)>U;K0EG$p#o&vdiG_kiCrKg>|4xHcM*ii05Mi`3izl7ShWbE1DkM`%DO~-O`l`Seu@jf ztv8cdntg-!!O91a$mKNs9*m^XI&b57G`N6jn243W1hk;{!;DAJn9jjtxajv^caHUa zlS1-&y%(S{yDRSAz%{u>A^I_?DHAS4as2I@;Qtuz?9siJ`D=Bu8nkfiuF9aifFLz? z>{*VK9S3+fx3qj%%(;}qZqMt^WCc3H+Q#jYH{@(lnHN;0bBkEcme<|Nj4roI(Ri&J z$B!Wf-!AuA;Efq;XSQd3X%Ukm&$jLdlp+>~EANBI4B{Y_fua%W=3t*yu*_tVQVwlS zR{$UZS;l;$png4V+<9=ykOjk`f2*v|6FUIr>{pMtuo?Ya&wA1*vIZW8HAaujGwK#uWkmA-+2uvy=Z39Lv6GFV1&sE*lxzaqESxAm{JghZ_AzTit7?Qxba+Wr%Du> zcF=8>!UGZ!oE4$#*yJMt)^?&V8E^|{!bNo>hlX~u{_gf@=!eET>lJMa;7yJtjut=kHx=kZc~$YRo;Da8`*cTrZFxO!U#_*3r= zo+oKHIA{lAmk|KL8*+LHzl^tvMk&f1w`bh7F?X^e>g#gdpbznddxXl6UEI4DIfzQh z=;bk)J&O-E^|GU!lN202GC|^{$yxMSJNRnzY<8WxiJ*%n1_&QmbQNt>gq5vfj-soM z9i99TJ*bH0_iS4@p53SWgINB}a3c>E|A|ml*F}96rByp*x=aawOU zIMzj_6!=mc8R(Fa(yt9|29I(ye8&RxK15G7SE{v$`W$6x%n0%MonWox-fp_UfYXjH zeXe+#%K&yB8(}v-yGZ~Vh(S?rhds&jFFNa356>;;|m&er&)m=b4zk!Y0z4W^50fAsyvi*AqkdClXm-0?l_y4^Qn-$ zxpVNi^XkTb*LlF(a3thP;=@}ziw;@^0Ag_b)eQ}Qkfwb+&lA~hYAIV6P>57VV0-EE z5RVdEG{|LlD%{lsBPXkKjnrq<3ItXlXaSf`f!Bu$wr4GkqD2zqYgKt$ob_OxIpK>5 zA8yxic5%aw&H z=*r@K(LA87$^~Snw?tp?STF&h2*{e~UXW~bU@u+;Vd!kIASl++S?LrcHeo?T zi+q(Lu**~9glDl7WRpf9On(B5LaZ?)l}U|727o+<;XMs$>v4Ap$Kh%PVl$waRFA{j ze_pVKy$HBIETAs>J{Mv4%TaCR_evVn;CH+YO&FPw_;ZfIzEG)O;5w=tO>?YMOv7pY z;E3YYNJe= zv6_VJDnjtng*74cX_n6DR<#Y_XRtdQa)TL~PQibrN-@5!+>y?#LMcp4+2Nvf zxul`E*@D&aPCI)VJv%fkX%`~hj|Ixf)I)z>klB4=U6z^E-)@T!$a6gMU~bX+!}U52 zYYF7w@^c$ro=2tA+)Hn1*~%|8qmO4(q-qsu1jy--0Y)JxTcYZs8Get)h>4dWI@I~Hv^ z$wjIjm^EOOp^6LnLC=aWZkRql6vL=P6eB~!?Kk0~U%#!Z^yj@nDX#6d|9G5ERXf|* zV#UPB`=(MP+ff^TLBKr`vYHMlf$sq^7#?B8+$oGQHf=8uc{OuWVj<})Os)0L2W~vCUn^rX{qIi}5e@bEKVAn7S`eGhScUvIk<(*Q42?5_u;@ZQ)71U0_N$O- z@4yG7cVvKDQR%6h4%8?_;ergE%|i33w8WH@o2}VHbE;yk)hPia%&^z@jl0~Q@5hZ^ zhH6e%y59Wxd=XDe?9wp4q>+W+vOu9qU2>v3VliU}!}j0ZqN=zz9Py z!)Raue~c~6y{TIQ+njy@auC2^GwAca*F3-XJ!LENEgT+_sr?>H;=hF1q94QOmW%MN zoXf1)pP@(t1jXzOltlOTfzL3^vds+l%jzZ=574z!Qwifr(OUloN{_zxS`S0YE6}Yo zV8ElIC}}5i?H8d8?2ad9I>Fb^=9b>D=45Fpu=% zmD9YI$Ga|bwHu)0W_gnb*xWZq2E(3Q*5ssh%`fCAugF$oCo5Q;8N3YU@r($lwyMP421);L z=yzHh(Jr+l=XT_jV+>5lb-S4+_DXJ)A@f?AC`u@$glE-4?kUK~F~qq_hQ@7~<;f8T z#O_KS&Y;`ai3?y(HRwp;^D%tkaNoqmM^N9qSV;?1BWh=J8*}Q4$ta9%CU*wRt&dz; zNeYmt7OGZp3A|4BtD8x};>-Sr;dTl1G=r$gmj_TuxgitGD+nO;{fukwyAnV}OkcLT zd9#OYDaK;R8OxRSgE9W2GG)CFzW8t+i>$C$SaDrEs@H^O=M3I<@!O??pn1^!nE-+g%JCw8ww-n&^M^!jK!&v1Uz_5HaMByj&l_vYYq7~=Xw2di zHM(H!q>jw8D#xVr1ww=U@05P-|1t$Yw0Zz6_5zMAh5lzB|6iM)_(FaSq6?8IF0Z8` zI{oWVm&k2FUp!F!Fz5k%S>Je=s;zDvkiPCLdG(%SvI=2%GF86=7nwZ$f=?3PMVV9X z46=y%XzJu!3Ma?H#E0bcy1)~Z{zC+`+1*zE)Lx9g{lOM1s>FGNMQKbXB7M7j{#N~6 zs=_=U#yuMZpraueHPe%WK_?CcsNZGO3qCo8V#oiCJ(5E2SYR3hKoXju6H0xI=O)y}KFPZ!5{$4mDJ9zq5I+ZZlffZIEq<<2AX_j8;3uVNv@_EOO;MpTSyPLSdI z7l}1riu#*tzh5|!;#2R$Ah3VSFU5ixm3psRaWu8Ol!awbc{i1+rCDv_v~P9_2HFkWh_p(+wI~hKXNp-JwY%Ha1Tl@ZuFe zBmt;FjHw!P%PIMX1;2hwi$6(dk;&=jVa;X%;}skMrrO8=U_hZt9bx3Zi7@}eb8unX z5>x9*9+FiH)C$^Dst9kFI=XQ3aL zZvMa%#zNjPqMuWwA>ep-cl0xm5>9M`l^D&_D>pX&k#>yH0?TKtPKV!cy(|364n{Q% z!)p$A%w$ojY$p!jaKnXHk?=?Yx?Q0_-P}KpLi}gf6zxheeP8|a#xD^C+LbFi^l@UG zUYChe>~*+RiITSQh28lBY~Zrb6qV{la|ZO{#~;RQi8S}IHY8zBeeY7t@?-9R1@+Y> z!qF>1swTQHA@&f?h-O{AV~g>SvCHDe_%cXoExG$V*+7AS;-uBo9C=-nj*qKWUdM1T3Ot?Eu5yC9_B%8t@}?h0;*}mP_0x5@0GE+rF_UTB&&aPvjyk}AvKLwQDrak z2wJ4XV~YZmXW+g++ylb+)aur7i%GLK!^6ij>wBU1ShHuH-GcpV*@nOW-BMuuO^1Xp zDawo&Oih!h%eq>*NxFP+VXprfyB8{lnP=<647k(%Zg9RPgaxiQAE zO)B2YhHF&<74Vn(6e93}wv_M@7EIl0VB8k0%+9tl27TDVN>ZrC8r!|qTcrW38sR(S za42RN{|ldm)2|)(De)oQg|W4z9vwzJ5LMJllr zTUdkDWeNB8GoC58VM*x+7Iyc z0_gJ74MeX%#P;~Q>u@KdANCQ{K=kif?S1Fnycryju!=?4CPv72@5PZ?)XooK2Buaw z`BjO_043qqfwNI$&pg8T{1B@k{WhUKRQi+zT8Ge%xR)HaMNln94;)d;1D;NQkj)GN zmY?}M9#ZA5$tGE5+!TccU6FC5`kY6L4RJ8?B2&HL#`}uY)lQNH{UjI;&Q+YYOXQ@W zko5k%l6%p@O@}mWXqDp@wj-Ea*`fHjqTA<(k^&sV^a4k}o6uXM)8;NGSVS#oKa<4P zg6W(q&3}6IP?lov%yzOBOCrc_fy2i0sTQwe#xdJnwy#{;2?zZvVUnQD4c~fDi++K^%Y|f|VvZTG|f_Gz_)L-BP($ z-kiCW&y2K|_Cyfx_|4!vdSi~r?FKc4Fo0XyTuqbD{JN;vEwdA;`<-zpQ1JG3Uf@(8ozJzF7yb)`%v3EM7;lZBB|rs0&wRW3I$9&Bv}BC< zMAg^W-Z9FneU3~of)(tb0lfLU;Rtf?xAJO}$0Z&+22d~20r$wZ9It;@{ny~!%mQ=k zzry8HJQq!GC$d?iB~96dr}8F}sm%8BhXCPxV=9@6fLtU&Y0zRz0^eWN>-$P;QANZ| z-mm5c6yUK8Oro+DC^pJv2*BEN!IvB=yQ2^$%#M$SoW`xOs9* zVzJ~2FZa_LP49Aj6Z-qCaT#gCvxfy-ck zNmmS+(yEjmHnP%}-b!m~Z7AT%QH- zY0H=2$Qiza0@ZSwm6gql3in8eB1;I#+3+NV+9$1Z{Nx>{Ag>T7ibp9+HzQTWVfLKZ z&ZB1eP!*DOff1}%7o>f@MH9(Wi0?m&NGu#KooK?MEX?+oj_V?q1V8cTcHG&1NiWRq z7&1cMTT!!{J+`qT0fELj;mo9S>h5^Z5D-QJm}?m?2wg*YllZzpZp>+(cBjI7C)yuQ zFo@%6(bbR+xG%fN!OZqx3t;Y-Bs%L6nOp98A*&^XzT($R4T7(?8ju0jFQS+nJF_lq zH^}v^aDWs+5=f-cNZcUEW3Y|8d}>0ixeDMv1#1q-IyQgFa)fdEI0k_7-t4P$aQVjI z?{_871_vTYSQG+LGILdj=dG_%k?wYl$6H@)Mj(_FcoChZtsesa$4Ma@vC&t@{6JE} zW#UL68OQ#J5z4wET(O;G%KM=F-_{TCTUhjRd{@9vqd+g3ZX`t{4dyI8be>br)dK4o z?S0b=DxglnDaHtHi!li&xZz3knP{(H%ZpLzyiF*_V7>6XvS?M zsMFT6vxigWAN4J7*lN;Q`jZmV&qQfq7Y_k-w;w{c|qz%tlX>`X1{i`S6X&w3eGAWju)$w zDuB;#8+;@LOcmq91P+CO#V(^C;zsPfKneiUiZ|i&aP-XB=<5h4FNeM=&Q$cf8`EIq= z7jc3n`he9UB5<#!+u@__zSL6_ZdYh<71g!j&92*ZdfQp`p58-2(K?j?8oL7?N{4AR z*e<<+ri*YPKIhK$ibnsmuJx);xej0MlvE8yK59r_-Ti(KOVoEH>W^NLEIyJ73cowV zV^Je!7j`p@p__+{s!>#y@nvKal5>jCo1}K_#HP28ZGO_K2ORoE317yPpVLX9iPq?X z1jo$N%4W_|)=R5Ey(J%D&5gB`9%R9K{jrj45jL%263ye^vZ`=?V~lb7QIM*!e^|1q zTdf+FRA_Q@dK1q4N>KEjd(_#QRUadRi|{vy;;+cggNa#B8TwR2Y?2q&2+m21aW5&bTmzkO&Jy$gsUaV>&#AAJRCxC!1`l_Aq4$&c;+kgf5fVf-{3)3{G{O1+!Li*poouC>&|xKY~dE#<>G!~$HfvJ`6$ z9--?TPvtQIwH<#BN71?pJq`2Wet9bPpU!_rRyAy2T49Yw)Ve4`+`GB7fQQJy{q#M3 zKpva1O#$k-bVW{EoE%QY97P4LY#dyL+@mb>5+cY^=E>n*8H+vUyQzw?_gs|9doA2T z_D5=z0TC){+Q87F1IPI{nF4-U$z-|yaf!uedt=H&+__IkM9Q5w+7fgs7J?9TF<~?$ zMA|kwIAKc^RX)qgjQhV{T|fVOZgC1qeifi2Ms^)|-x*Rog@%w|+w8_9kYnodcWi4WG%Hh1=1bb(N=Y6Jrtg90yUJj!Vo`|Z}oZvoylFR^xi~@$Ev$S ztEOyYOpdsj4=KmvVj~y@rOH4y%kOqsA+BPZAnEB8RK!m=L^rLO8Xj;lOP$R1U}&JC zy2KH_mP=cy+AHg`|HxD%ei;!(2$`pc=eLhElHTTyz%rfPpsP-ux((|sL#&P4ULyF6 zFN;GG&}rXabJ)yV%qY>oh@>jmdLt}*tN4RF!iL8n-Z+0cAOkAt<`t2nc-J=3;u(vG=Uvc}nu^2` zK_Wpm0`vV`a}uTg7}X$u3nybj4ZCf%=%d{L)O54_P0B6aU+cN`=x)$2q;u@+B^;bv zkK>B8z=4k3xL|mV0_N~EOYnBw5#2{u2O0`#@w=$Hv`w}F8^?ZBkE^1M`SDv1bHRNR zSsQ$G#}4=rV|oTQoK+;x-;J_x)A^Pi6fKDZh&RWp$;&b>XxQCs{gO?Z=sq9H<{G9@ zB%J*E^Wp-N^B+KQ6ty=EHDI>8PqGZ1yf+$J=>xIC5hvLSp5SD4*eRDuG67LV%-~`^ zOgbC1eO1;^CW#GAmu;b$^X{#{cUl{P44lh$6h|%syw+ol!bW}*UY-pWc&eV=Xrqe# zHlxhSWh5s@IO4ccIEc2`-&l5OXifMEy9m6o)UV>}_BQQr>oGKwbt+J6VK?-ey{&|g zDjok18|u;DZ~Lb7q6?|Ls+n_qH`W;@5W%DlMaG=$YQx+vhrD3q>a8S-@+KYtW3HJd zf9C4bEL>HJvZl=D69-#PyfukfD9kshMe$+K<(2MUye2!1DTLwGpB9+ZURbNKFPN%G z@263o4hu3CwVGVi&h_VDiPrvW%C6#yb5WPCr|mi#t&3ZMYspn>Kcb0AKixZ}wXe08 zhAE)xbCjk(s3e!CJJi=({BYUo!G*M*gevbzrg#cLl?JA2G+Qwxc)J4%%LGGyt?fqYhtEyE z-gcCpC^ODuRY}f=)LFeTlF&Auv(SX<%n(Wf_J|8P(^wPW#=N2I3SLUi9OLrpFr-=# z#CAa@ZCF7!ecigaUEJ}4Qw{>dm-oRs=68l83e_iETxJQ@M9C0w0xAxlm4m)4Yz=q8 z79@pQvp{FNcTV5HX;Y)u8!U3b7FusWoA&5i3*TYnR{AnhYUP$gDIA9q(&IQwjkw1( zBwf5Mhs1K4JOp$ zRd2O#&b{0G>9!brCL0$z4QT*?7@aE*JiCa^G?p@{G2|(UN?Bxm&xFDv0@^fDM1w!f zy%HmL@)zZG_!}NpT}@Np-c_*Wvnug+gz~m)vMw-lzg?s^XLrg`b{FGnT`;}W9?)v9 z?Go1v{P1OCNb4FWMw;N)K6D_U{#9^>gcV4Xa`Uel%zV$g$Wy?KU1m z6PM*cDyj;FbR8)l_|Qj2hDsbLx2k}o^s8kRS_ZT-c5v9J6=2UOeshGhmF1GyU+{=D z1+)YjHf8)r*6b=?ft!GqI#|p!Vf+)Jx;=+12IK}@vc#(z( zs}h8cPMYI;m@ZHeP|*h5l8v9(w7(m_XY7p<7i0U#OClpq|6;bh10x`iM#nMxwO;}M5a?H1&#g6y<&LC!+tN9D4 z+9E#|VR#|>4=Ek;l8pcOLb~)nDWbSgB!?&aV(`{zBjF}DJ|#dChuk6tkoMZm77L>r zFuWrH-A$2{r`FdZ5b1x2&1vBee}_93GL}#fJ5v#`Jfu-t$Uu_G@^Wd7|~>7&hNqnK7;H8d=pP zDClrHtYJ=d--2)5C(zh*Yz$?03t8f$m9pndU8{?XNR%=5zj$K-AFW~YCY-POWy1*2ruEuTw~rzfhDGbTefc zB#}%ZIpWqLG+LJ&a)0hSZttV_~?#o$K?;9LZcwGqF)ue z$u0f!)_SuRDWhcw0eb_Nr}8UQW%Df_AYS{h67-w-qC40K{*wwncbLi4qn|QDYL6jp z)z#ygYBj@F%5Y@0p(Ampec{g;NrJypNLh+w&s*Zu-W|Y;emg6fI?wG+YnyBg0G1eN z@kz`)dT;Wm+mqQBJgS5bJ@*u$t(c+~6a9x0!LF?+ADoRm^6_Fmw>osQAEN>VC0Rv?iwgV}p_wol zujDhftjz;gIh`GkH=&a*dUmo>EUP}#5QKy@`tpR0Lev}|4AA6=Iith~N;*}=^XgYR zecuqRcn$t95))93w`EOj1P8P?x2c6^@8x>!N_*&~zA37MmuzP^KS{>5PfS)ehFGiq zIVJgKQ2XLJJar~Bb&8R~n2XRgvonFrz_g8D^sBNcua_ehoLv*qq?VtOk&s&C5-28> zbf?a!wvInEI7N2W0HMYA!25nI`^DmOe8EP^L zvam}RZ*@%RqT^cA8Y|f#B?smUDRG}M4*&V6wnSLaazYkUn+ou4Ik-Hcm|TC1HpZgA zJQhvNdE38(uu%FuKqzDPx3ku&<5}P9`R?igbSJ&)!`BIB!_7Hh#_9)Qcg7A0ZG-=f zSLf?5F0XgiQOb(BNs;gLP%d()0L`9}0j*#29_av8%SLT*Ln>DoOqcw`-f>*Da;Ase zjpF2#IClIIqj0 zQ={Zy6RM3;KdAWJ-GIcdEQ?=+64FQROz;x%DozRp8uqk81?C33#Z@(v#HLo0s)hy* zky+M--dK!_E>bNE2wIDbR(AG7uJf-Je4PQJHV5zSu^7i?>BfQF%&A%!`?_b|7ITTN z7&{SARu=%@p=%df$Uy6Eb|PFD*)sDk2D{I&FZb+MxtT42EmVpt7J!eIRRE>jy3BR0 z>C|aeT`X)p2e5pVZz^Vc+QbiHPmMuv3TE{zp?qdFx?vko*&g76K8ssSVS{I$W)rJf z7MBD<#9w>D?*y4=hfKhxj2f93{B#=6HWi0a7J@IOG77FaKyC zPuPh%HrAzI)0+;`YM(;v1iz7Srmb9Zv(dwA^oM*u#A7F#IVMGYe{t@ly3l8QU65&| zOUp-IO#YmJ0{|?IK~40NUQr617L^bX7^A@ovW*KuaoZYs58+$pro-rWoeQuVOwL;4 zK7<_i^xGZUdXqYS8YuFC+!>?a(m)CUk{ylj0y5IP#wWyA8k|zm(B@LLpL) z+AH7p&CiPRH!!!*R*PBF)Q-j3JtwKC{ee^;zBh_{Ea~LatN+j%NqQQg0qf;lGR(#J z*g{a;z=+XjOUl!W^j-v}DHBzmt#}5x{<%df5;uOFtW2BojFG&eMRj0(?-j<;0@B%Y$Ghv)?sehz5Qb;$_D9Zu3l=T6mKS+LUY# ztW6UF0+yGlC>TzXh}=ELEgZN&XalIG1tS8tk0GTzPonNAorY5y0>LitKPFs>Sb|7w ztYO7nvMLviIIOiz&LAw=%4r;bYW81>Kfj~v188WuT}f|WR*%npJ)mW%3l8ko$9Uon z!)isAvWhI0mA`#4QYx#7uBAR#Dpx&N6U8z_4*ojGfFV7mJy*aJP=@?wZCDGJbPc|+ zfI5LRvro%7m0F{PrmDgPBDl!=)91)Cl1iR2tS;cIX~uhN0E2>q^o^+iqp=$@t)NjN z{fpV-lk96GHdlz&o~v_ZEZOd_+)n7{RTvXw=EVQ@Sq^{&&Bx8M(of3L(+K?>;~D^$ zOp3v^K5w(vZZjipDDAS2r-WTD#xSXnW(GAE}GrbPt4SLO^+MfhQd zKz=01p>(L<*T~Fp#@-kGin!myZDth<-s)M5=pH=@RVr(gpZ@d!CM_&_x8| z>C6&Wl5h)`j#{9KQgWMKK*FHcfWI6v@WM(^qIlhaECq>}&+cr$#puHdU{sdk3k0-pte&M`rTqvbQj+ z?dayvc)rreB~`K2MasN^Sb*~HtYVnfdKb)an(slD3S@T0w-sV7 zS!)LCUfT;oGykF!hC{8RA{AA5hpV7&_0LxaqAM&_nc*Q2GasA1jxBsCtt{q^`0EEd z^=#Q6`>%8L))&*b%2W~-7KBgXdf3nY2Ml~MwwT@7ZM7_NK z1$J`B#9{G2e|pYX5sPZ_3Z941b?s&%r%8QjG$FS0i8%fAgqez>4wx1Q#jsSAO+5Rt zKS+_T;m!$D=mSC@Xj9+^Nl#mG@jC&)3$@WGzz{YIIzIlrGePpxD7AvGy7m^^OL1$6 z1?>Nvq-AdDFJwVm!+np9oIm{}5!`ocqHAbtn%UgBO>iu-*XHX;SFu4lda*-y1t@Tk z167>sb9F(}D=G-m^n}ss?j?fk8CKg2U1j*JpdZ$6*L0e$nd&Wa8$Sz7w%`UH!JsDu z8;}-Ron2Y?sKh!|CHk`eB)Ie!m`x(#P>xO#e&e81jqzx@(Z6NFby#xpWw6og=m0!G z!@nV>gQl>R%gRaKI8}s&snP0tBnvO&lz|$D9ZiX~P-Aq@$oGHOG1B>bt;mBF->ap1 zXdA)3ZF5xsnR%clWXk3?{ESRU5CxzopFGmn2tfNa>+(SAttv1Mzo1uIjn0@tNRTYJD9^X zb1uu(c+exVb_1ZD8-mkK{p?`?B?W!A5|`VF7+gg`Ae<wPQN#bCdIx06&)ce8X>t*tRcIi1kUh%T&P6)r=Qc0L+Rc_{H`v5{ zyWM@o1rk7SQAjbM4tC-oEPK2SU2qQl298=hQ%I@2DT3g1y4alf?tt$t^66wWL~wIe zD|&wf>Oxrkkd^n20t+5Ao8MX5f%-5-baUjma-2`;q`6VWx}}1e!g<_&+8L~XaF~zV zPd_Sl!I-PRg#$4p*&S)pH*=7J_Dbb@WhzR!BPu-Bvp9sUk8y8Cetiho_UwxaTVdix|^Q z%rz%BVmmHBoV+f2LBE?QA3TuY`Y66Gv&I?xc$1%mxe+wZNf>8%Z9jGI?Cx$k| z^%70TuNPU5Ey2CQ`74LvPF8(j`MvvYXH^iBr_P!e3C@Qf9)sg}v2bndTqkuD;g*{r zzsPrdI!}{c=Hp~e^2&IMC!3jBjNed}senj4J2Yx)bF0^=gcLKI_=W^N#z&OaK4x@X7*`DCW-MoJHE0d}Z zX8?s5z6)F337X4;KM|S(SJ0Od#4A{(~kINfFK`-PQc2w`tnz zR5T&fn6Rvu2jXt^7Jh%-12+?^;mAE0v{l5JYI15Pi1>w;?^b|PAZK;`LNvxfzcw6jB8oB=n_(n$ zQ&zvldAeo3KSCx>J+@NkdnRUPG{x%ElG{sk`13^|UxmJv`X-W-lu|%mog-#Kz1x@VIZV}b93<;T;0NR8*AN#9tUL^_QGm-3 zAV_y;L4j8E-_L2YojgTN`l)v^J&>-=1HE_~(n#;@A^x~+D#+a!&r(KJRs97C>ua#mm|$k) zq6>L@nWXZA`t${Qb-<|}nmeR}dv@46MR5b~X~|n$R^YrseD>G5jH-6Dhw=XS|ykG9)2J1KnQoTk6y{xPsA}&i8C;;m%~K;}5Hz zQmkmBkk4o2VIK`6;JZxqWiPp7CW0N#2i|^Ffg2LPG+D3X18N-dtUy75#>pubs#Rj? zz1umNllQxR&h(-A^C4X_I*n|-`bqfkg}92P-GhT9HVGAfM**0d<`)P$I(e9F(W!`# ztt7$d)cjc%D-iQ~Jpm)=~riuUXL&fHzOvNMnxk%#4^W<6} z(@3(w-}#HoMVXZWLjfHnd19YA!b{)s_Zik^-8ND5v{dEqtA$G}gJIF~APi45JE#g5 z#%0_S$Y00(OlN#3Fx@i9bbJU$V<^D=-Z|jG9{?KYj&^Is^28l04ln}a{5xnwGD@uE zyE61o$rjAvp-DkuZhzkZadr`X&ahQ_(0pM*OaG(6J;eT?T&__LV~k*=^!uoWK-SO~ z_}uj5v0`xTNSI`8%2LQegvfhq6@Tk9Kgk!01zgH}C!J|%$l~9}X(`7%a05SI!2mMy zx)n^W`Wd%5Z^8wcAN_dZZ(I28)&VhJOf@~(KNORIS1lbzVIFbZRizb@A=@(de46U9 zo2Q}^tqF3i`zUTFyW1DT$QZYzm?m=XHpn9zCsZ&Nc#mbKL9)1M6g)e(?{a>G&tfKv ztV<>(hJNI)Jc<;939Ki4GQDlSW#pxrOv1Ci`Bix3Q+^fkBtrM?eF{CerUyCbeuZsw zjJUbi@kMmQfqfIb_Sl)f3axDOHXlCbpwqWzSrdzQ>GOI`P19uHN}5Bc&JhEb)c$eE zw?v_capfB z>-VtI@Tqs##UoqBx0tKW7#vf%5ev7}Qw=*GJ}RTVegj`-P1|42>}>)OmE4tBa-o+C z0I<9=71%x=DOmsuv)mcW{+ZT~{k$LWrD0d4`%}w_!g&mDm3wX_(QD0Uqi{PZHdkdO zV6U^N@MT#Y3{h6?^oIZi8~h+}nr6K(ZmPubUC6^_ORM_spxdGOG!QWe#8Q4;k{>ti z-}6>+!opTaB)K4FJ>Z_;aEff(_KKWi-f_(3Jl1J4qPq4QI{CX=0|rWFH6HTljJa_; zj_SvF{dsD;duy1))Eed_XNG8j30JyqM-t;_$6tQQlp9wDrv6waQhi#;K<#u zBLn}4zWc}J>zS@7MH!eOmwJy%&jOFlCs+IydabGrXy4ypvxW(5CdBzjjGy%;2F3|= zB7)5dzN5A>bzGUTu=cRQJ(aLX?QLavt@P;uG#hN^{D;DAr6p<+nD{+pnFLHF#`r2w z&uyX@epYEYfi%HC9Dp*MS5}6rSZ@LaA;r3U4c3n+4S$T<`hn&8XQrh_d|sltrfsZ| z-u2|TQHpmvdfY!K;yte6%B2?WF`m5A2{}83-X0Vw3n_? zpE;LyIYj+6oJ-`S)-1^chlicjQD~t`o5h>!` z)VTBX#y6b>WZWJQ=c+)ac)6g3DW|5B`h3y>5qUqk(VNSv8mLN`E*&(-8IKW5F$%;P zz|3v~0lK{Mxno{cI9_aw^FIVTx!mD9c~qpwix8KDwt7%80p4O=a^=5i&}K=s&GGt& zfMk5?b4#cl)!-Q~AFwZVZdKM}F-sgRctG;^+t5sD{H%o&@~3ficfVTGxjj@;}->at?S9zF3V-gsj1YkmbZq&?apX)FO z&6jHXw&qfK+kdJ_rHqcTPKy7=4d0)Znwx9~&NzD(NXGOx#Nfv2U%xb51MTYaS|H;; z%skj1@Ga42K`uLZ5!$2b6=0fzmE^6e;4+)ic+w=Wt`EJtvtJ`WvGW}V+{t{r7ePoc zYL9J5-*eJV{YGcts73GrBt;mb)_vQ}69^l=1V{JFmN~!GOwoZ@f=ZN2RhWo{l}mUp zP^4?B)Faa$J#{+V<7RFUprsdMirA{~hp77?ndw5PYGaSibZk8=7SSIk5cgO9cj=1) zOt>P*YAnWLJ>=(uWL}12!Wu{sB3THa!v-H8ZOSk&$}GWGudL+zK50(D`$**Cxo4R&(TC^FTb3Kw+ZSyo<<2qzwUm_7WHM#2SF zG5ZqZT7|=`6tuq~a4zPqF#sbJ50*<^nx(xN4P#ZYDU|Xe%MS<*^d9Y3hwLph@K_Md zVnS^W^4rnn7MlK+330%U+5qE7WJQ2MSk<`}Q*+8RIz(Gu^pPfzd5xKhl7;JIniskk zrW7TOm~t6|220+t=4R^!Oj(iX2r{emsmjnfeoAZFh_ZU6fwLjL?d(27%e|WfhuLd* z24?`2Fe1m69Hvpg3vlDjZ`plCd`hR>^x3&x9AXTFVCIX&A!&ud2_4M%e86CidgerQ+72DJAQsZavaupe*mxZa4BuoNfQgV6A81Q$GZsB9m_p*?{LWa}y3w_w~{ z)Xk<498Vk+LnS&YZl)x}lr#SUU)n+JMXddT`CphXe6i*`z;p(+<6vU6WsMA?P1CmW zSs?4ZK5-43q)Mp;x51kjwPUQ3w8ZN;YU^}DydDwgE%sh+@Et%~1$FKZBN7|dmRIBS zfv-rxv>LIh};UELksCc^bW1fD#tlw`f$)VXZ&Kt&;wI?17v_=-;v2% z*%AY$1JgO{77che0C#ROFiCpG&o?RfZX5KEjT?|5R)c(b&^<|TUkwf38k>1aL{^Q3)Wg=d(}HC}PJv$^{#YX&?P+d4~Lz`_(xZJBzFNbVmJlXF5+a| zV%BVMTrR1X;Mr3=T2kEt#&t*SPmx?1zK6n!5b}Uk>rP3Jb}6J~x0?1Iz#RraUW6Ok zShhr5Ow(`OxqzAXIRuq%%d2e>eJ*W}TxmKza;=Y0fl4KRFXT_ZmR-MV_1mfQ-3`hq zEjcz}i1B(|A{1b2FPr{a@}rjptO6XcoJSmYKM`p$46!T3ufr<74<3>azHn?hKsjDb zdx!EwWZl!qqaxJxNrx?h4T=*y?tf<19;T^4v-QeCW8M!Yvcr#6NVQ(Kv6TQ%qM()3 z!FDMON47L6jDZ&rMJv77Lg>k4S(fqdXLN2P8C9{Gun+kKrT$GaxrS8hIiwhyy(Je? zesqWO7p?l}jsph6j~Fq1ubggtB>{+^vZ$|VSl&W68DP7%Icb*Cn?-vtX;Xa0HY7|B zTAiihPMA70ikZh~(fKai9S+2D)Eex0Y}yOuR6k!_XdHq8G=2Eh>DZ<2%`-adB}@l4 zWUn%>1Q0Fa_Ezp0e!g-3$-SjVJVU-nJ`|A}Ccio>!0hYRj|ujytLZQRkC?l?>{@iI z^a!oo59A~4ntNEM4Y%us7u1^E--aLI0?tH8=U7irAW%_?34v{wxj1R#YXTl)9x*l# zocQ=Qy*)6vsVM!%CXNr_xh$?-8YF~kG{|rm50B4ngq*^?o@xsl(zg+2#`)8CVPtpJ z0Fdb9r@z%ZQpzj|rFEz>AC!0K<0Ysxg}q!!hFvQ$is&J=@s>eo9|GBJ)hA1MwB&ek z`aYmwH4Vdf{1$^Y=A}1*H0$SsYn}`?n%L{lp+{@0=N_}m=H=sucyqp|Yn=$}ZETM~ zaR~^0O)@rx_tEI7xy^xOMiqVko~Q1jdwg^hwhRMa#9tCHuNSDLOTe|$mWL)eezJDfeUkN1Vo73dTi~7oWff{dRXS?2lV_eDlFtMjtFzX<1wm9gona4a~&DBCT_8Y=8fptgwZeFG4X+Y7BLo5N58%1yD zxWW-+Ty?m%wo(={+II*U_saB#8G`UGz+{QWEN_bN5I^S$XNGJrd|44l7}9%W_$YZU zU=7=0*-k+yg*3!t>JV$jli&~_h%nPQ&Nwg;u|Y6h$~8O}^@wFx3+3{Xy~u@odGe$G zO~{$D)eF!v=-SDIW!X);wYM}bN*{Sbo#9UrFJevBVsir!ZuV>WNt{!XawY+O0@^6# z28@mq2{vbvdjh*q4mWQYX4k8V=nb^R0hI+U53g5?#RVXb{s6)pM%JpX2?ojoJK-~U z`kY?P2QKhGs%tSRX_Bj9N0Au(m%w(7BOlfaS13m9%b78zcgbeOi-@@}VQ5grtb1?t zO-kte2EJ8UjHeSU`8Jr4B0y=Dq}VT_pL}6l4{xFHnWlcC2lgv`FF&HO>%@~v6)Pe1 zJ1}L+=F`ACj{Etq4J|xN*xJYLEqWE8hPnDVRhpzwXnFd(Yz#PmQ`9r+My(4$5qzbXGC9$} z-SX#14zzx1sQ*&(YiR^{X1>WndP56eZQu;H^&FYO5#0ToZJ2vt2<_RvyQ8!0QMS_c zbPZZvuL)h9SVx4E7<^eV2bxcml7`LsMYr0rj_Q||i+;p!h5x(Cz^OQOLYvQ*A1I92 zWV(zwhYQ2S8Umd$SwqGwCo{F*kvK)oGK0LMAl$+1<1Aa8R1;m$BVG#I1md`)!*!a` z+yBLly!1hY-A+FLjlq}pR$#dGo^p}F|i`&RxSrpV+ z?I$H;h7uz(1pqZ5RTN-|Sr(hfi1Myp5S%Q`F=u)4ib&=bTX_q-%tv7sHskN91Qv>@ zsn?&b#Jv1yvVe-tzKP99I|$U{=sZh#o-sUK>r1 zFw&6Ka(3?U1;A&3)nB5xy2*V}tO^504VxRmf2guVwh?qPNF+7eN!WE%?UIWyR4#KO zZ6?^qJv(uHyHne|N-2uwVunhf=A~zBaG~sP0_q#C3+4)pm_SGC7D61rKo*70XUYI$ z<)`~(P80G*9%7~0?Z3DAH(Q}`t9#xo79S$H1>H>LC#X=a!a#g-7I)O1@V1#Li-TtR zkYti026_bmY1p&op;w-)oZgB|)xQBl|GghU7hP%PvhSody)P7zf>7!Jg(rr)|630{ zSCIt(jZ&D73*V?N_Q%cS+P&VCF)V0uX&<8TA)pOn8rx|>VU(VtK8xMM*J(w~e{|v3 z4(s@{X0jb}s@@)($73SQThg6kmj>@Uo3YG7!404Pcg;VS@q1=P;9KM2X5v^2I0bhK zkN*J&(V7$ng z1Ew#S#v@NF`?y650DfvQCWDvXyh9W~Fj&2#ga=_Udb&yXUuANdxnS#W<3|o$$uNl& zL(n5+o9`m|2g)K(ils@vz8;yfH;p@F0tOw0ToBQ_=vs(my`*umTM-tx#!x3@ajo() zj84TuU}aqi3GE(vnWP{k$VL@QoY2#JI%u{}{O{D02QbvUF`VYMsL$e2?61hkt57lo z#3n#fS)5j3@B(IVnELNmix-qAZ3Hd3ma1SEAb?&_fgB;bw3dMT?&23<@`efZoSdrP z95m{9mmrn6AzvNpUu{~aP$q5Z63ZQzXG4m8+*QjFviQG*d`2ytt%wW3JVlHT<_8oJ zH>%$u7$BNS{CpaxQ(dnPO0fF>RXPV!!a!$Hm>93z7r41Oow>KSQSx}m@Hdc#r+khrN7 z&MFm<;-!~hFmmfv*oB~j<#7U#DcaqAER*?)UW7B>)dcXWP);^epj}NFlH)%R_89d+^L$4Nhdi1MonJCXc5aH2Md^v|` ztL*6wLiP;V49p!k%bPC*_^hW;1OWgMXw%iV14m5J$C(`Zz5Ms~O8?L@?i3a^Xc_uB zrm6zbTi>1pSDPYk66OQpA$&(n8v5OjEI!0j>#I!48He+7%2>rH8gM zm^gL=$!Qb9XyTiO;tfH_VLhN(_2NFn80vY3NmkyNIX{06UTDWG*p&*_phGy zT&7c>&wP0#1X5*cHh7tO2P|C_Y46Q^hj3V2P^Q>}Ulzk(-?5QjCUn#5HIJbRTWJ5N ze|nkcq&6i8Dt*S7GkWhmN}Zv06v%E!F3COeo z387N|4t{4&eyhDHwi->}(!ahqU5&IERmykmqYxq5XKCxc}r^)tvNA zqktewr$)}4b&1dLb4=jeamY{OpH#yjy;}~;I$t`-{yf)CHWbqHkqt*) z+s}-Vt(@}sI0i3ykD!N`*Z6Kt2HICKwzQ8CxBXmZZ5!C$CCIz+60@Gr4J{>VPDFs9*M$;FzPGHG;{B&;zNisU=LHIpuTv>;&xH{{?1+KvPHTj7iFVx3) zA)}PzYykkztBGU^XWQK6+W*CU#}m$DTU2LEqD#q_XW`a}J3{Bb%q%T`GGm3J28yd* zUa$+xTqPm;&A(JAkljnU;hufL=}8z0Mx9}=ZteZ^*3FKn3|{S;@A)ZL@|P0`(IqM5 zxtx&B5u%g`-)q(7FT&O0BE^rEy;TFH_?oZa6FKg9ymsH&)wNzu3lp9aAZe9=FF(-x zzje2a{#yY&CaQ6cW;Tj4YM3vJYS38~tp0?TP{dL2sc&;gM@L#B_<)C)K ze(+-C@x$gyS^*?^cK2#4&Xaok(Js0ddHygFz0Ucmc>X5O9haT}C2tM&*|jE1kL@?BT*E)M&*<&1pO4M-)$r{taWwE; zQ}OR{P;#jPdJ`jOnYfi={)96qTz1&fQ0S(CLFR*)XB^B~oox@9E7(1Jyfx6m18$Hd z3Z`z69$dKfF_XJqv521$_OO>acl%dD!_<5g)UVUiU4Z|2L|SC53KZ`=n-bKhk+1Z( z_z&6YvT+HqaNG>&&%)@PaH7X#*?I^qW%sFr%nY{xtGxd z#^}=a3+Qs$T5{XBNMk3>KECaQ^j@rAXRYf0!?H*eWr!1xOInBn)gxK$o`Y}ie8Y2J zA||z`P2DkS_j>Srqdc5r?GBX%DT%0QsFV$8J?J+$hu2BJhCn@lBr_B30)xgy3D^3w z%2*ovy^u%IBn`e%inO}!TLm^iQvZHJ;6q<*oKSV{xk>5o=SqrJ3<@?3!XfDrbsWWYF}uyi#30M|G$2(m7Vo6A-eLUjPHVix|GDS&KUsKy#i@Ibb6zxruW9dB(*P}Z$2@OM>&PWp}Ouu*h4OQ&h ztU4vo4OCN=IT5Mk0FRkulsDk0EwwoXT1g}Hq(QFvef@W%c86kg%SfVedms~SRN~Grqh)A+9mGcFqLkG)MkfH3LdLoi|c@RwVxn2 zBs=qn*>{?HKPcexPD++1Vk98<4W<(NiuP+jjE9&fLQByl18*xT#!qLCALws$J>0*) zBjo$pE%mp-7+>QWE^qNX8XU^{BCk8eGbqx|qw>ZiI06@wJr;6S+<;?IU&LG9rI!Vp zlnxOtYB#dC1o9rIFcr5GnUo$VWm(lC;X}S?!o4v1$O_Jh0RQ0^Ov6*IQvs2XYT~7Eo>G^5*E}N6) zmTJEJh8AF=8n-wNM)k8w`&%3p50+5Luk?)yxdR2Tqs&~Ldi08ta%C#AcebC77x%Ln#;YeI$t&) zp}71ak|V{(EwsJ!rP&EOFyrHbO2hWzC=%eI&lFIJFRVH`YVk|=QurT)+99B?h~l|s zwD0)a2$7!;kS&&(d4Ji)T<)Rds0-J?tr8oJV0&3hZa|w+4Uc$RuJ)rpU&DGXZ%isl zI!g7tQ1KMW|Ln5=dgr`-x54c7tU^j+n@xJ5*h{DLx5suwS(t2$`~AdCpchgP1uHt= z!qu<;dj&?j8ij>*f$vZQjQooerAq@Y>eI-QpdD?Ujo* zzakY*?H}zGo&x&{J-tKw<*Q_Km1r{s92ca%WI*^BiZPOKnow?_eJv-ogM3U9-zW z1J%udTq*qA=`Is~Q}vFxnS%g@atOJNJW5g@$-819|B=ZEBe3jR^`C!l)6S|p)o4*b znJSyxG356~GcA%17K2doz@C^m-;)q4<&PTOW6V?%bB+Gq~2A)S{;f5sK8(IRC_%E^R+v)&4A>4ea|0kfMlq!G5JT78Mc z@OX|sH`{n%%|31{=W!EEwR~4}y!|@GYZ4+!nq$0$gDLT!!kAqk8~B}ogbnX2f;!79 zr7fH*fwUT*oxctwSsg-1yOXLEjOZBE)YFY^x#d~*69is3jJ|k`$~#yOaQgQa=^j{a z{XPE0N005Sx-hZa6#=f}L`amr$*9#89Cn!^A*O6D811U*S5SyUSlXF0)R7y-cD&o& z_&$>oAoHz}HAE-k`kP3`g*)u7k`prPhaBmzG-xbcT{#>yK@uRgWRo%f>1a@K5T-$J z+cIsUjh1yQT5~ECl7Lzbef63-(~r9uS0%2Av1Fua-!;zJz3jLaRozr&yZgUDM)n4d zjO$#i=0{%n3NNW!N02J)joPwJQ})v>kw#qlPAymhIjzAQ=}N*jOst=OtT3j){M1iP zxFuM}IB7%Y7m9FaVR%c%*!2zDmRT%bj`pjMAE`{yA(Fa#SqVa&Y`=&+HvtuYm}k6$$c2gsrbIQ<`)0?8fPt_6dhM=f@qP+@AGHH(Rs?J z_j=u0uk~D*x-JR+HeWDke3XhjYo@P&Aa*R*6Af8`N&AO@Uw(>=Ng0Yw_EV8)?rFHl}%ddk>fU*ze?lM06TZ#IY4zzMS*lOeEYLSMN z(L{1Eh|RP2gB0~l8C4r*c>AeWhfrIVg)Eq~P#md<`;~BA9do)NfB=$)lUvj^j42~@ zzD_ZW10ErQHriP>f&xZE5db-Zrq%S*Fd)*eT8tlOdPEJaqxTz48lSDD*`g;%@$G+f zl0ehLRUL`f*-dSiTlN{Sk$EgSCxq%PW9^7_w{BcE0#psf46SZ zr2k4GOZgV~FT9uuC;#UQU)6~0ED+nph-@4~y%(s$>gn#(1Se@qf3_h=9r z1Q^@&`s#o8Oq|cP%g=a0CM`ed^^R!zBAE?GSG!ufu(L9;xHDHr+Rl>hM{JwR!JZ~qu7C>b6r}y{IUHhBNFB@WpB~DqXF$8`F!n}OIWLd z06NDeU#1-jU(s$9d0t~bkN8)kpvV${-GUbcHhTseuZ%EyBRa9DCcjYSq-ks(eL*}y z++}C9wHy5_6T0mV07)5Fr=(DD;#6})onfl@4!zKU>W!KTDBXAk$ACxV7j_UZK1R4~<;TNUcfnfI=I@k=Xj))jHK2@ma% z`F7C=u=w8tcPJdaSwKOLyldRRfDl81?rZf-_;4rFW|_k|8+bZr4~b;v#b9d}u2yBj zK)rDHK52VJN6Vh9+YcU*IU^PrB7?0+M(b7MYM(Jgu-hmX{Q+lqxJ1zX2DtMox(J7X z4F$dQK30EFoJP8I&gNg-X*){HVj{5h6oztM=%y&2ROdT~!R$|VOhwd2njdmu5ZiR| zl2iQnS>7W|zqg&m1$!KrlspimQd0-ON{-H7P8s1>PHZQbxP66ncb`R!o$rFeB*EKb ziKrHxBv#W{-c=EoNiUKN(=8=#1K-{jaHt(P^`kg{0iM3Fa6))DS%tkj`FkYD9HouD z8YfL{@1_}L?a=2KeaUDt`Nu*W3c|&BihkRqe;CQtyr1=Y*GsI&o55PyJj~>oGCVc?1Y}kvJ*|pd`BJ`jd>Q6IOlWx`eH$U-_<=!Q8w8YqH&_{00{%xh>|_tEb~oib@T%6=f8wFuM{ULxSA*u|k}JM(Kn5Rt7d zE?+Lnlp$pSnW*}0Jl_|f*}06VI`;A6Bx_%d%S35{c=f?FH(r#7N>gG7(ByVprH}Kz z;JuGtF9!>c2U>txsGIH0ITWkg-0+?zp{6rgwGWok$*Z9({pLm4hBirWXOvwF-Vkv3 z=KWWTn5qYxFnvcQNl0hg3YC+kgop(&-;}q`6?(2FB4X>6Nn7IG>!zMb6y>B=`*l}e z{Wzx^yIk%{6yS0jly9P6o)^`)Jl4BiLbQnbE>)s>K%&i3 z{4jd*U}E{PSbSuWXe#9cRafx4RDJ~cq6Eus@3Y!}hUlm3myoby$lC?HKfn0Zn(|L% zh%HirtO@bXu?sm~*WG*uoHdFxi^AHs*dWu8;@+ISk?N3yim1|dW>a~|$!3*_o^xFj zdhyol&?>vrSF0eIcA_;;eFQ;2xflZsAnhUFxf;BhCwsSp=>gU6E-v+N-r)EDO;Z>q z&_K}s#F$MA-vdAYP$KsesR{R<0jF1wYVt?vA{r$A>m55Ge^{)q&AE10MNF}xqsPzJ zmtlkq^*AT*kUiJAEzAc>k{EgFRM_jSeA7X5xB2LJKrs-OQwoJDB$dE4HY4sNL25Vp z?F9O9IF}7IO3}vRBR=RQ;8kmpYnMasbBh|BaZ&M5SLAILl^+PvE;NN-E^95oK4FMLx2 z#5R|#Xn{4)4m5S0kul7N)s790ZJeneLp-Iiv{|(7n6lB3{V7gH*{Rgt6zpVrS%Eqx ze(^LYx%xBVkJ?HBTi-9qzdlkQz`J6a6v&fZ_l$26FQe^;X@)SmITkT&W?nCo?n@4l{r-6hMz@cOA+NbS>WY zYHY`;zhGyG8b7eI!wrp|s9HNifAAcH5ZWYeuhhy(D7{>QeP?YPS)X9oRmt3_L zqnl4y=qSHWO!%%_`n)<-`4ulIlF3as{BTLgo?eGx-+Z?LqVy)>S$hLhldb2nqaQ?Q z+AB#>YZDrmL(S}5-bLVVZqe~HKO)dPIJO5jJoTeEa$b9}H%Mp%+21!;L5j?L{uqy- zPrTb@V!`6YKxIN3HS3$=Ro3*T?c?BpUb94xuknThV$;1Riy7S@MTNa)BxypIVI2Zd z=UqZOdLNp05Or#9ejAw2NOq5^L^Pt9%2ffqaL?scO8jJppU9@9PD_0-ktZx67{GD_ zvR(GTkBoDvQyCXP+yh13I5Q}TKo_PVNw&T+ zV}dbRRQU9`am89H=6pMKybxP55nB^CD=UN7TT>A`c#E*8&EmZcEEjr92$e@6^@M7PR|-W-7`nm&TPrah&v-M@D2kO z(ihbvgx=7fR8yUiEr8)Qto1UgxNu{PIcIwC#0?1!)b>4pr8m?>C@)%8i=PY0F)?p3 zm7-wM-ibf%Ay)@vLW+A&2tarLGZk<#QCKy|{E&>efUK7YXVJ6Nady_4He{+;4G#m# z*(_rQjAK`F9eCejE;=pteK`?`t+v?jp~k-iSo;wiL@2Pt3iF@6(Zru$RUUX=^>&BaZ*%3HHfu z*E(oETrCvzB7~Xj!>flJ{sXMxIQJ3DO~?QyL@?-bUGN?7aU-W|s`oiUj!zaH=xB~Y>Yj1O4yst9uY9QIl1ADx9T$1+~^esmxE00zN6SOp75P2}*!_M>7_>dM2?r(Z z9|mCn(aY+@vF41SQ{9)5ib#7x&NN(&@2|xY>r48mNGbi4@5%7kocL60LJ4KW64$N! z9yWPFA>#1yKUNw%?N+_`v-bq%E4wm(rR&oF{61fnSz&%)vZ)+Q!D z-(d1`IFM)mo)j0_y>#n-1+xzmO)%HU%%~CACKRToup8ShHZMGVs{bbyk_g>WY^67z z7vEuINA;b$vNlde;F~eWB`)=}&0B{2#*#MDyd@2P$9D$xo#5sQ&gf)y;*g3%3;HHy zgNw7C2o?MeHKZ5%zZ{(F^i2PjPdq*3ci;@~_1S;ztTs)0m^>K1dgpku^RYBAlxWi4 z!uB>|25#3+XD0-@fnKAPJ_KS0Orf|Hl9%S{Ck6t@d37Lc>)_mIXyDfrSP5Bu7UhdE zgwKZLH&Ng8f`w=4U?~zFjaN5&UXePQ+TozluKHc!!b=Boigql3;>Yvg8wge2{Dy~) zHVA=5>Pp!?RAGv!b9Ji!lknp(v&nd1{y$vaRFRBfR06AsSRIEEhtx;7c3-=AR>Tzr zK99T>@#tlJ+uUr9^7id5zya)WEH_9fI}TDx`2urFK=ELmixb&JtHn-j+k!&wR6=up z&zYO*-#lQBDm#7%1(=axI9ow%X)5R2!)Mh!MDxKH%DG;sQ%Am_^0?J}8*HF% z*+K&|ucB{L$}w&e_wY=+pu}D2oaQP6ubaQ_=0gG6C6bk<<$2CoAJR8$_!Lok-ek3@ zl(7Vp@>a|iF*L=;-n&6vVebMb!OfZ&FZG^)X1DR{dF<7O{_-I2VT?Os4Tw+(BA!6T z9&dd$v9PLwA$!O@rdW-K|C&nqODQ1l|6yV+k1%wXD?OVQhG?LTJZHrK_Vu)xUveJZo=0Wg$OR9hx1gd2`f4HD7M|daO_fkxD{ZiJMgofmL;S`KVSsXQiMpg#Rcf-ooZx zNsWmd0BHczxg!L=-^i+4Z1)f^h2e*U6e<9M6=v6Yx@&}(uW20um-w-iv-P4?qww0f#sY2#vz%;$5 zud9m}lmxm59>J#2@^r9t{9@q+b}Up*xss*SEkvww1PWDg7_5_}>}p4172GdU?wfpO z)*TsPa?B6H8Ive;9xcJa{Ft*@kCvqWURCBFV=maDY}K8S&~aN0gA1eeC}vMu zsPka`Ko1qAc_&a*3iZK5_8o%a5~z6xS8nps8OWtJ0edP_!` zF8KEm>nL=9$&7VzC8O>%z(n=o{UD|*MO*g(%?(qtYj93)LSPh#F^#!p&9_?Pi!SP} z<~7?h3D&6l--^T07^65_yky`sH1!vj>l+<9`p_iSMIg9hEW8G5pb_!34Ly-CTz5wK)|D!0@7`NlP0=7dx40_WRE>1$p}(kIivstn;w4#4f)8!8ky5Qc+U+K3N2;Z0l-8 zRF)cQrjZ#M#5xQNZ0|*qWbXYU%N5R*htn2ww2KV_4TKM>x(!71R(J_{GV%dB^AN9* z?zy9a-B9Yh&{Y7pc=DQeGr%)`VYI@inIrr>vd759Nlma#h|ALQPcizLZ6epdR?j?H z(r%ztx6u3BRVx;SE_=9-mAb+B?dU90;5+Rnj+aK#B^p|QPh-SJ2VfdGDXAsTX*(r!8nG0co-h|7lti#Uz}96F!@Ee=7PCO(5UBSyo+tFZ-bX(I0XV4yYmsC$ zI9W_Oc9yyQZKL-M4D>aaCqKdTP&I!|#j%*vBYOR1hQ~Gangk^6cgVbgQYx;g9VR z1O4<6_+|Q*$~|y~o^6i;L(33%2UU-b0e=Paq06fm9c@jTrfw=Hotgiat;dH?Ro)C* zgMo||&-9L=J;Di5FPV8*@fBNr7$S&yAM753*a)*kIINbRAam$FP<~om(&3WW-eFubAs;nbjhw`*K?-pS)?@h zw8HRI4Z!RsxWYFlzPd9r7`nM_c#xj}@?!RYFSBx)nT_yhzSurAsM`S=2k}XlP`rr8 z`|z`SeqvU|D#Ee-eSVRkalifiw{pz`Bq;g`$$<8Y$dMt0E>08QZ zjVzJa5P?xZ8-|Q>_|i0pQ7jm&Y0G`><^@HYF4NS5T%R$m2!BCeyQn|3h)-oKq1YkI zcKN?tGAffEoArf!*xp$n-H<5llT=$a+`BvpM3H@c=~(G-TZyzyL6^5)0aFrK)B!jV z3}IM(Ec3INPlN1v`V1OE4cx)6(QAi7Gm*G481;w3_4$Br`f8n>YQ&;HTNKp=dkeDJ z{B7XAOZIIA-_LbS1tTNoMK*%*ZlLjSMX<&rCjGBwINbaNXg*Vsq>@DBK(CO6*LwmJ z>e^v=wvfp@BC-go0>uDQK&`)AR%s%#SLf$+i^-7m?PQ>NMl-sILg%%K2BygiRX@Oa ze3}K{83U}wzrvM>+wf|vA3uxHtM%}m%xaGcLlP(K{VrjX@3UNkQ7oksMiQ(OPsj2- zVa5rItIJbJGkib8eudW*yl&cX}O100Wi0H%;ceUKQ>PvC)^%N2zYhJmJvc$v-Nb=a~QBq-) zc=d2ZgZd7fBb2?6tsv)zd>Ck%Pa8P1k39b zUxq{E{6U0(65QjawS^8L6xx@d8a%Eh+xJ0RgtVxU?0G}%tZQoI$-`dwHtEgJukhi_ z_eYO2VLLcl2T$L7l6H!$a-Xgv`&6~4v)dc*i09HuWY;IqIz~z6v{-^J2->B?0`MtV z>{3eyO~?CLjot6tK1sJVaYQT32~cfElL(G`*$Qt)$LyQ(Uu?qdffDA9)R$5w&hVXQ zq#eV27`&?;idVeh*L9%HY2E*gek&L>qT{802GcE1kX|T+jOo{&o4lm2KX33l%Hv!8 zGyh6?T4(|ybpf@u`uG|qQkkRCh&9wmP$1<`8~ZPvuEfP!GkcvrCDzg&#(J|MHDy27 zE}?b$lEH&WgB`Zp(kVECLHm3Jo}vbzJ_R$cFM9hR-+@(P7jSa(M?(b0QVR?MhFwK? zi)N&TfV5`J@WniVCIMZaz`o2IwlG5-34C_FXoS!WTi`90GK|im$zUZ}Tuh5t08zgT zCZ5@wrw>OwD9jGLQ=yhcOx^Nl|96EMTyjBn4(@RtO5<}@MdK=f`WDNx)6T z+nEn_$~f5HajNR{(;g9Uf9j?)XYH+$=?+DCHQDo`YRUwDa40*VGb#ol5-hQq`i;{U zO}pTSYgmc5*2+)Ace{-<^usDam}^2;$*{@V8M()wwq1$h7<~JkTCJA%KR|3O^n5I! zD5jSt)M6L6Pr$Fq09Lu3o3S?I8DahWrC-B4Yk3+WSMxbr@}B$Cp&q7Qdf|M>ue6LT z5sQ&o(7FQqN{wVXTbw6pMIuGzr+Aw^Qg?ZZe#!{0+anOkyCamP)IpD*A$}@wg3g;E zAb+v%2W0;lk>9Fzjv<2Su63Y+DP271NQrj+%m16~mlYHArPcJqWaT3|{5{<4wSe~< zkRjOo6M3zEv#CH2S+rx;Ncsb81wf(loM+}oeT%@jALz>uRK`Ou_g>&?vplg#1kJHe z|0esR+|(zyun@!zf#&=!Of%Ro_od0YSk*{l=vDq>nxPMbT=LNtqIi*uIp{v+vnvmc zK;PF;wLUE|W$c*8x#3Y=`dm5%ZaH*f*{V?uB^#HG(pl@d^ZaYraz3@BQe4*{|N5tm z@##&~jZ7_N#DSXcEqo@jlW-l$ndU~A7bH}E$1@yeJ=ykph{g9{gB*d$s0UoIp$5#$ z4Wvs>N6w=3ATVu!1y)t--!a}oJH9; z5Qy~sOrMzZtK2cqcw_v4Xzqf()G#*+bV74`P`Crq=_(Ec;h|3^t5mruOIHCC(dp?( z3Qk_^_!bp?%3z#h>p#EZraMgI^=Fe#D#(CkM|OS!Rh-a_KjkxJNE5XlV^lXcqG74M zW@!J7uNj7<4B9QY2m;L415su|hK?{`@fjS%E9i<&>g9f)d5^r#zUgn*h}972kZlNW z?>Hdv0FYDX->^?OTWQqfcgs!^r(fMwle_!2a@Wmq!s!{S_}yU=sobidG3+3ANfDRJRZ5VgL#!?!Jn zcqD&3c%u*YN9G;>NS?0KU}t#{H&hmdUzttBUwXUr&3FxdN8}r$i3!5FEO<<-|s2N%A_@>5<}i*0`Z=FO4D@37^< zm6Ge25XIPd8$tHNVXqDwGnxUV=RO>&L5{K-%Di1cqcb*_JOsvtV!@X;?!&XSfKzuy zx02i6Do@TOGhP;mD0CNv3eUggBOAf>V)qrQTBn<*c5k4EQ*4-Ax5u0F?%=-qjMx@S z^_NYK)Q#OD{*M7*7&`&dJZ-n4ZndUyU?P~_kNPM_Bhr|-@;>Ej*lnq4Ty|ulPKLDO z8|YC_z{>vWUt|i^g?-MVUeIQKq~~$+Ihpzs#({7prJ4~Us@-PnZ$K8isb>gERvoMr z#Y1G2w?@6ELjyOdlZ-wQxBjfUSH_anp;*iRrJ3PPPCNKX7k_fXEjb{|4KNpBj8uIr zny!b`KZCOu{oiPxVnezV93*o#+2?CDX~uRqLINIf`TE8a@sAeDFeR7Wf8~s5THQcL zF^qpFVyEW;2a3`0dr<*&>UL_w1LcnO5l+j~nPOiiFu5j4R@*L(mE-QX`NShj$F}?! z#@9_@#l@uRWp1fRhM(3!tj8r`Nf@c)^+|%2C1#@<9Y*sH-hZ=siTH>U?BG|GPvSBFsQ;9*xo(tm*PBieX>~&p_J=TzhxhEa%`K{(=n0BE z8$D@F6(NO|d~PZxH`*(utlN17L2RZS&zipPhImp!7u;05NO{}7M0gMIFOt9f?xw{= zAh040B!FjQMx$CxQ%i&PA}a6D{etiadXS9Q=q*dDAa(`_LHk_#<^O4QNKQx#lZD@p z(0i-4!yeGR#ZWf4>5f0V?%MJFFYmmS!dKST@tmjb1LdZuecfD(b>>e5p#~h zY`6px1fG^zOV+Q_>aA2`E5|elgzZ-_owbK|A5 z`3~E9d6gT?ZSmbWBZTRkb=6_TGoNO=$TJqrvgHg4at+&|?n?VN6d_r6lcVhxFIa{ zffX0j#JsSnO~g{SLa_-&(JXBQPShb5M<<^1pqF0IYKgG}bd~(qaDf``GkwkRzd5>R zPX_|+Q&?rdp->;OxcH4Xx#Qmv|BR5N`#FlL>5D_kcqur>HAJOLwmCk)K|57j$RFL! zE%p$aCx<6DQ#^cT=Q`mN35mXP>sGg^_b956+}2m26jU?$(~=|hqm7jd$Jx3}QbJHw zA;F#$bN8Gm#BrXy;t3a~-2+E$&49(bI!|cA!#;pC_^pb9 z6gR_f_rD~JWN!6XlqsP*fs)*zzQP$*kJ&0WV33I`><{v+6)}|OQb1ENtw(CKz751% zC7|^ia`DNuTOu;+I(;gH+nM&vMyN<E085~evJj!fIq)ML^6AvptXYCL7O^{1^P7FR)FK89$YUC8! zEV|oEQji3i@fKcRjuFLmy#sG&Q~={;D!Dq-U2ICGW%)6C$P=ICh~DN8?4UE72H_Pi z7@6jeq)M2#EQv>2rTup`gW%ughz=W}o3zK!ppWM*jW#E3AuCCQqMvPT=Bsg1X#!Mv zrox5L6Oi!Bupp=bRH5kWb21NAA&my;^>-W!>23kf%5ppuD&P^T{R;UDimiB|*k znKAa={3PB;;?E;qNMVv0>H402zX<$&xJNlRY#{lS`!}=$@%W(LQu*)*OvvJIboxk^ zZHR78PKF!d9IkRdcVc zi$N#29l;qSZXL^2)p?hY7nR4n4gc)rQZGEsUiTpjMn*rAdru~YLU|QXQ=y?+5_l** z^&BmtJO3p2)B9=|7S{JBDUkvziW*K!*OkD#d<;sD>uUg?!@8>+1Q#-grAx=zL~JodwTh=4S3JzgF5oVi99vTz@j%EAJ9wX)4#m+wtTV!fYjOe>C`r zKDBbk$U+>OL7kmW))f9HpAEq#JZhTm+hJLDBZn0NS`lV|nhI{cW7Fcdt}{z3PyPSd z?Fn0etP1dGtRRQc$rFKO4^3DUgmiBX?u>9q?{w@6c&=LEA71mkq=j_LN~8SL1Y9nz z@c$?j22~3iG3(MaPs2afn<$@RW=fYQ&J?z#_#8aj@a~JuWj-QwlA_rIDDofeLemi{ ztBo<9N@BI-)&PSzR*|Zk(T47bAsPgRncx>HBF`}M4~!IRI6X%ZB%Zr&VjFTYL@epCP91<^Z6N*b}q=VD2p+BXT}dSNYzZPpBv)W^qK))#37qGPnG`7M;< zWFTwh=3aSdQ7b8*e4Ww3fm!}RxzNsfCcC{6`LBQ@-VXk6)-xL%LXW5S#F55Iw%N>J zh#OKjx)|(7d5}~Ybc=CIb&r_^bz%E`ACLtbRV8riakQ;9?eEW_&5Ze$m!WZo; zLG?|m*T9i%$@Gi z1a)n-FqGrUe(-OXg|JW z20HW$v)}!vkSQamfA;z{upqLJu{ACh)YfXbcIYH(KS(?DO}ho}In48Vo0z4!>BGz+ zykV{E(aV+fCx^Sv6}rjlRe=Siu02po{(qNJyhX;SDT>iU0nK^BMoBDk(c7THbFf87 zN6854gpq8dOecEOnKVU9pTAos9qGdlj;^T-ypNI!h&Z8-Q?`#OEQ5Erc?ZvK{kj63 z9IobuwKAfV&cw*X>(C|;XXFRpk>aUT>kjA%@j1~61@H?~Rn|3WuwWzeVL8Fk8}S9- z1&PtxF6i4>yV5}R7bi{B;P!?o`ykI={EJ<#or&0+v8cj|vD8mZ>i{lO)@(`pcu~b% zK~V_TMw`21Dhe1jGRSbiU3D1n&`sjLqWrQr9=FF>P(7`nHNmY~}qw6Zv6u8NP7-J*Dm7e53F zGk|h|YZpK6|IyQKtepCO4-njq%UY()GMa*IzDW|vS%Ml4USUfk2;K;f*6{= zvZo(tHD%v5_I}-vl(}|(q^I$)W!YM~gB$-NHMYC4{LJE4!e1iV(Ln_#z)!A?cgN3{ zpqxLsi$rGG0gIS0hGOB9W>&22Dss9%KOxagr4dlY0&uopnt@q?BsCRJgD^ZD zTY^}=KVCYTN!2G_sqoR7pB^Y$ z@czP{l!>$heH#jC1l@q~I$8MDzz;hKs$($U3X<2HfC2tPMBng0_|@iOzR{I&{U+IInJ3Ry>m3_UBjU^U@Ig-ES9CBz{rXI*tk+5~)NAhJMI;FDTScXE$l zG6mAk43}#dvCP>=OaZDsf*JVsWNwu26qC;*bn`L8F7KY8^eN3QTP9 zy2__XSQzU{vZc~lWC(5e(4+Jtej}2TCN0FCS)J-6C@`{BYaH!W(7Z@9)VdqXv}W7B$92wW27c79hojaZ+9ll zI^ol&0dV3dj+8%4DC|Y9yPV4_5BqSH&9_~mAp^Xf$q&- zS;ReXKir@GZ*X!%IabGES8PtApas;;e3fY@D8>H+@lmgU2T$3P(q_o{O_m=9r$xa!i;!7}MO?M2Heth&DLtg;JtT8m>}mT+hLj)M znWnglhfZ$5DWX17dAxR?0LS(IUxO6&UUrJ=y9;^cF<_S`T{Hn$w1xSk;gFr3rCwtV z2XwFP9@fO#F|Yc=K#b|CVm5*rzCrR_LFn@MwM@X`YxbMn7}?(t8e9LlTotv^ zr$PsvWRSvYoPbOcyHak&WWTW>?R~{m@~hbkX3wzCkiYP8hp_hcX9u#=h7&UbdJZPb z7X6)LxR7F!VDrizVgKuZgJ9!{v?Jpde*n|aDnOK4r zt2CU&xdd;6jrnKe)Nz@6+r%a_Y_+7|(b9im0VaSAI>TMytI&l?i~3(GbQ?6x5AG1Z zrcmUyrC}43WbZFRfcq)wON~>3*zZ3}P!t>;$bm;>8msTDb80=6+~Kn=klNBo3jb_> znK3qP3hIx5F+#heK~7y=^d7K)0&!}nTfsYo5QDHoP{8(~OQR-ZH(Zb3Ffrw&_hjcK z)|!TQ4RWP9NTP)P}?x$uXp^ z=JBwA6s&a1K&9KHr)-C?T}$R(;mpM|qj5$bI=^8uh35-5)T?3eM}4j?XO)#L_>TEJ z&JeOBG;EZIR=`a@$+Z2zG@6N|`MPHuMRj`ww)Nz`y~k2ux~@k0k>CRQh{bIhRBs$NkRuu3F!sP_hI zpS01Qc0~ho>AU9JbJg*8NHcsLky(yW#%0_XCb$VZ@Ai`4X)xZRfZTEZm5eEunO{Mo zM6YW8Y}trr$+?BsxCs%*s8t6O*26|scF;rS8_*b1y@miveG(rnIkz}KtCz&^xCK)l zxWe2Be8IvE9=fkGTKf!k2avhrLe*^xpbk?eI|;LQTE_ zsVnsIoPpH6swI)mC5g2 z#-XovYmCo&?v1$}!g;AhNgQt_($2CIlK55uv)7Pb!NXORD@v4Pq3 ze$0{&!m+?{Vq(52cz(qMXqd2dZue%;le)Ve=vWpes#5SdxstzmJj5< zu&yN)z+LUrb3d?0EC!-uozs_^HYWsd-Yk&2s6Q6oCYctH)O6W=`%p%!Mjtt!0<;Pq zuFrALxPXuW?{aVLY!4aT$9P~Cn>oOS=%@Ab1G}NBo5@oM-mO?q--I{r=Qb?d15>Sw zcy8J#vqFMiZZ2WKi1XGyi`ju0u0n77(kR0}0o=PO z{&oP!W9QeVOBz}0m&l~h19+<7`q`J zbU)-d2Ky&1U}Wk|D4jCOG&=Aai2xj8pqaVHhx5CmR#sB??Lp!^=eGLHN95`rrdh6i z#~iXsH}fAVi9%f26+1@%%rk8}9v-&cFXkZGlT@p$QB3QbC#c2waO^v0HNq|#5NWxP;2eyYAi?dKZrjYDSyrS(>>w%EvYWe->Nxa z14PNPX=_x;9-$y5tMGT^6a{U*!?IrMOscQ%TYz(U+uiV@?qeIXp-|YFt>T$)43fN) zM6WS0O*&N<3mSMsG6x$E$imU^9x5Z$bQ^gVo$)h|))JPVlZ2EMEJV(ViDgP0%)V>G zCo4Id>`v3LQ%CdB@~)x6k&yCSgP1XB`1~6zLQ~(YI+o|;^fkwMc$!DURg!JhF~Ofv zMh}yT3($9F7>k&{xz7RiR;7Is@^rhX{b;jA)8h!9^qHEli#T`{mI5AJ%X-+0!NX-x zr>T3XGip08x>_D@)5iFyvkkZrVeOu@Zrj&J@*Sa} zw7B{koGZyN;79M{8{AYQ@P6St&P^A@8w%A{m!?#$YLoB`$}TQx0x(|3G+xf<`9pd= z=wdS+JO^Ei2M(`nY*^?o{l&_wO~e;^gNow&xCor58{l79`B&r#Hs3NtMs9!nmaqwa z)HVv|O^L==B42cDIS5)o2A(E2w!B9TUGsyyWYj(ST#76}iJf5o=}5lj9@nLe2Q8}N z>;JfF4HEvaTYAEUr7 zP5Mk&^+I5d0=|(P)>E`966b4w`9Pp;4i1g3p2kPWnsf~qE9tyoi7!MrNV*75=@8a7 zn39{QOqMB|Og9uH-|}Fme`4cj_XvTzY05^QJ@fw-r_{X58RJ~67qSUVQG57P4ldyf z>Z%`79Xcl`R1{*pC62Gtr_0^Jn++Zi^)btWrYbOoXH75z4W1!pk#uA-kddIe82A@Z zYC>{pVP<%Q^y`j`Yy!*`1$uoBT}GTUsFSC0Ci%L6NRDI(&tewB$uAtp)vc5#+Almb zqJ&;uBs>%$rrVLQcVJYnmswz6ZI(CnL{IB?x0;Puo9p=SNd@F3I=MvTgdx1c8bVV) z6Zc=4Z2qL9X7a)$|2?l_tlb7S?00M+rsrWmf*}b2EmCr!>eZ}e;+-JKhBwv}7C;2K zxShZG0FVWf3stR<{kuR+Idj>*X@}4mG3;eQejr zRf}hgx}G<{Ay~I(sf{s#ysd2$p^B2^m1TCS(MDIz%yYW9w5u$MW{U!27CFH#IKVH) zieLF8L)Tr6xPiqL#ALCe`vrO?Tb918s!CsXbzZqfQ31EzaO;f99T(rK?-rTny((6@cO;LY1S_CHO)S7blbT+YY?A-Fv}GVTkm}p#v0Y;DK#!1g#9Q+4wvWcff}!4 zgG29eViieuoW70P5Qjp5?zy%R6E99Nhq8f%6k8jwnZ@~asT=U^91_s0aWj(eOt*U> zE9ASr7W2~MW=%|qB?9-6UCnjAc2Pl&xz{`3kr$sJy!|0Nf};*(RQ}qW-v7FdV6lqh zV!8Q1aUN@|nXyW9E8@qIbm=r)q#vZc`mJF|?6vobmpRJ<0^|Y0p~CmSRp?FfWvKYG z-ZdZkMlaVo_Q8}gtTpElqmp+H#Y8^Fo$q9I zSkgbSj)Xz)bLoJ-N>My(_bFy7v;!tZJpW3tk(n)3JWQwvww%Vq#aiLJkyPr z#f@D-u797Cak@w=tZr+Z>*KJMjO6G93&?$Iet17%`evtAT@Da=L=x$!|5D=bi4HVB znI+=a@#sp%sO>GuAA-7bSlllMZy9w-oloBXU4oWdL3WiFVVvs0supSzoS<)V^xVLKLG@gD_McDUp=^)rmqBwP zbGTAQQd88@1ns^ueVmnyzQF;t#1p;p!tkx3c-p2Gz-kuuUrOgS-#4$fXg3ZF{WQtL z-$xjPL(?f@JG=u6AuAM>Ky#UKP8T$&ELx8q?A{IbMH3@G9~mcs54r z_Tc*cNfTLi6FfT*%NSGk4=@iYlEz?*`D5Xbk4b-~M0kPLx@cc5MFau@vUD&tI3YMT-9_)VZN(3=3~e(C{9cVGWcLVuIT zRI0(Ce!4_){JPVIbWaZytLVZx`DQ%V6`@PaExre;meQw(*HcPx6^s?!xc%!|q-iOc zX>suz7>CuUPJ-=LCX%R;M|7nE6NtnFu43giE_gziY<8THTdTc7Kyn2<4sRJtEF+wY z+7vx*qNL8H90aQ7bRXN;qZ*hXvfOZR5A3px$i8)qaBaZD%dGo0Y=vD5Np zJ(+1U5Y2gxEpTWZgqaXnnZkzN_mBL)KBriA#z1YFr@qB^E$@7s3k@Ed17E!(N*OH% zOJue&K1qR+b|#H(!^|Rcn{!5z5153VK32WaF4p}mcH}9@+42&e>x$+h;exTBbzecM z@hRoa&+LD9RtCfMCsu(t?V;ksl28P!*0#=%kkm7XKsdd+$q5mK*qBc;X?UqE`d2!_ z^4Bu|J7Aaw@5k4Ekcjz_om zJ&Z=oz6b(pONc1$j|X`2>X1YlB&QT@>w5@93vonOuonCq%W6uC*9d=#62;4mr>pNY zdn1VEN5DJt$*CLpO{)tGj)eC814Y$t=oB{@lO%{oGO>bDvbZag1d7mfw1--i7QZyT zo;nr#&D3~qjAwL0sh`%OJiwqn#3s6%XSd?Zv)uwGX5bd5h`i0WJj&(@s5Ebp5_0#l?1m*DNq+EWNF_CAG^WSju z)nxmDi23l#Y^zYlV)Rt~Rhyrzi-ZF1mVH^l1ij2XRZhkjdPk0TX{9E4g=B~_8TO4x0MCIK$0$l&Y}PVo?$ti(!mQx904MutQ^{D4>yx(Cz4Nw1?BxTzUgvBY|L*jYnmm%MoN&~- z?UU|C{`oGd7xQc2+|qem*bBxPD9 z1@Nc~g6{*WQ?-^Cx|WiEJMe>wv1-&%o6wI4Pi3Pg_r8rQSjP4<%WRy7e_*yCTMm*l zW+g4Zcl37nW+WpyMNs)+9DYG|M?&5Q? zk*m%V9DpAnCz_SBlItQh1NTd1nA!xoZirw@6z!Pqzz)&kOuQ%%w*DNYM`SG)Gvw8s zhO8!?jTSY^-EP@Wty(^^2EUDJqx&|8WnfSn5}P#6>?N3u9cY` zf`#$BcWGTs08=x@t_t{nkqUNSe_-#uH zJgUq7i-zvkiz5^S)PquNLYVL&h=yr}JWonKy1su`1zCh)QB3s9r=J={Z;2IGUbwC1 zb7}5+KDb=%-p05ENNUiaN;@xr5c15Sq33)26t+^AFB7Ktja#mH8mkc9=<6=R#p-st z`>kRiL;2=X5(JnM*|(<0>(hE1ojFImx!twyFvcsQ)fbrR!aiVqWQ4lUg{ z0_5E@TLq%mcp~DGJv4WX2hZ@Hdvd^N4{X?;lLhf2Sd0LGy)fn86;UuPzv`ir+x*UM zr*#xEq59DHWyv;LJx?7|B$uR)RF#QD(&Pe2X3=|Kmw*m?s2h8UYX8MBL1(*w=y%-i z-v6M{G(mQnSI3DBJzg}X@iBxPcd~!NMsZUFz&8seWD-MkYK3xr!HC z?s*(Js)qj8K#AsWw=#|Vf|rZ6`8dug;2&{2X@`A zUiSf!N*8iev`1+m_WEw^$xdTV$W;_Atn5@(5@el?D1jP8p*eHp(Q*5m@b?wb4-yGke!5b#-u(>Y*L z%N_`-9emHpLRW1BS(qFDMr}YsbiL-3av82(&KnZM&QhxR$l$er*`r2MM99A9g301= z<{DjxzdD(1G4p5xlI$KDQktzGeXVSz5Bx?tuxE{LMx7|F^s*iDi1D4Q|VWmbri&3 zhX@BJs+%9ZoqR$~GfZ=OdBNqAJzSu0(W%9=J_6YxlxG<}eTF59I6t%-9n? zsL(`;JwC(=w{W0%)V>8u>ZT1X&2xpBfI#rv+rl^%UO)39=_UDw(Bn~L@RP;K)eYr3 zxz!+_b3rG&@hI4u`pWOOB6uKHS3kg7(0iigd3L@$hs&~t`1o>*p?3g|+Bi-M0=e9!&0vRM{Z~9vX2yU`UM6Kp`c0vWy zSui+W+QGCox_z6R8{SG_5!afrD$%wD4MCba=aN=HVyd{xTT%?+uYI`ZhzUw|g0lc0Ye`i*4!&wPm0}i0RHku$nqt%p+Ns*_x=kQ{ z;J%}DA<9Yx-a0z))ag*Xq>md77%Rb|frR_PXLap0(1M@(-zCaYmE*#4 zy=l_Pz_Y%UVh+6zmYK^wkwt6Q>$3=@(kliolT{L=)vi9Evx_GzRp_WiVrXxlI0FHV zUUD?>FPP1({|9n-Cr@4st;0f z7s_w@0kz$QjSShZ7Nl&$Eoa~5h{z8w0sn?@&kQcmqSUq4HGQm1R`xuI)pe`EzVpnA zF6lojWY@yw8`0)UBdE5q?WoQjb(03usj|N@a z!0d@hj*mrj!XDSqv_o12`v^u!LZzJA;}d>w^HKm9X2FYeGy<|`ft1@f7YxpB*G=r! zMrcKe@2zc7q=MgnU?aIR82@Mq>(=7AUFqXm222_Xx~56t&yD%*xH}7tJ^RIZ;tNLDwt{W5~hE0Pt*5?duX4JX%qpP zuGkstXx$%c9HJqo_hXia%w|8SckBNPt2{K$Yl!LyO6V6*`+kiv&cep6w;<>MkyloV zfr!o>Sw^y)NhDTCF+`A91!lv)bBI&jWx2dpOK4!Pbt`Ql!3y?(qo*sOE~Dd{0teg@KIqUq=iiwZiT?EKK%UL2q^-eCsBo zpzoWLDD>lZz$2GjmbSZQce|&;l4A4nG7=mu9Pgpjp7Cm(BfXF5Qpo8=rBG5oaa)+a z+@@rB0eHt5jw440d1*s?In-kE4qn(3#O5BV28cFJAHf^DS2kw0x#Cxqf4y z<#l>?M6p4JruOX89Ewhs|Fq_GV`x&%qSg@S!b+WurWDwYDb_#Kf%P2(Mw zeTKHnroILO6?RSc*US>iJZ-Fu%NO22+lo7bnUXTD%(5W0Gg^<6371_Fz}*mT;Is*( z^2RHP;&J%yXTG6gL@s<`U$c(Aeb2z^7BX5x@j!fT&~a0Se0gvt1qe;Smyb%*!5Pbm zG?n1;A0k-3JuCpQlG+uDC>_W8Qs)=#jg^;jTEwZB%s~>~61;<6DP+ug-bqGUk5%+E zRs4x&ygnBX3Pj@vJ3$AstO%hD>WGJ-jQb{VvH48WR*nVc4Ls{uJI-t95g-$jS6-z? z(Kh>1p~_2h3_o7q&eI6}YiV&x#|i>LRQV2p3a?qJ>pU5j-jojGd@2*`^?`OYSG;FsK@vY)!hrS`TAcunl!>BnVE-2q4@r~M-ql{v>CQOa3vTC)MJcA6c|f5av?=? zCL2A_%`DJ7%C(&y<1sC}Z#kFp>Hxe)L#_8`jJi;H1wJe~lw)I^=Kml$yPBHj^54>5 zY)Ag2WMu^Kv)5`?qjGRjAJ;M5o^FQAVHa^ysA7Nm*SGs~yg1Psj?w6Mjd-0&{gkSm z06-4m9@;(4z6!cFVTz0w6U$x4^(=2%MA*4gAy(OhQKTsA2c|YTg71jR6}wlU(M&0_ z>K(}q8(igLyEx7_l+~K-_y^FyolLm+lua-Bzh!;2E=${`Pk%Uy07boU_(V##9NRxg z<-F?(WI`1P-B-sl zq`YQNe$lF17q#U7|Ns95n1N%vXYWR;jTI!JngQehssaFv3IONZkDT{_Z1IF+fGM-ib7n= z=UT=h`bDlB-^=N?fpf5)zAhMM4RmYpldczw%goE&bRL^I3e{gPI$`-qFLFH0@=mAO z(=GNU(z1!r?IdW`{}^HN&-G6~l&r{cxoHV%7Q*b0uWwgX-l3^+QZgdmLb^Q=Cl(6$ z%ax6U{AI0+xR{V#kpZ4TOQi`7_75(_4a(#h2VL&vU>!&1zOIwJ8-j9fzq#J14Br_w ze{Xe7gBn@87-_zY{mZd#yE3xQdMkC^!5X5K}Q2#Nk*Hq?Kc*`ElKY^vxEcR_r+;S#85zvAD4JW|fHL}#3 zQCTpr3wK}|-pEy0z;miZ2>elu>F3oL;NJI-$=2awI}HE3 zQ?yzGt8p?|LYtC91}%&ri~8KQFm>qOuqqs8hU05T9);l)LWCk^N&v-c!=$;Cypqo; z0$%uHC@l^xPSHO7;a--W4fKjKr*XPFP>C0irj z5rZs_AE}$Kq!PqX&yj+~{M_fgq&1YYLw*5%{SD*|wMQY$rhWlY<(xru$4Lq=Cnl7S z39Xszj4z4MwH=W=DN)3+2JGOUsm3)>SqYsgEs{ij(g%NHcYiO!j_dHyFS&IB%m5Om zuMcWl(j@s@eGYp?8_*xF4QLT)UMI$+N0{gl76R43*eLKgvL7Tn#%2#9QndkG?z{t+ zPdG!n{ClP_3RN@;*OjWo;z;d9l@SumyeUF5HBj4>9_)%+1A4WI&*wQ1f30-3gYrw> zg^mUIJFW$uw{*3)=28Lx1D(T`K_26j&&}e~HZytrEoLJ9K#fR&#XU_C{dT`JMQI4T zWT{DZPEI?prkxY`44=vnY$9*f?FR(iQfX%pY5!m>j_ ziu$2sBc_oPX>Eqv$^*NBOrua87+4F7$nCf$u5z_m7B32mh5Op-c(0>A~jTl!WGTIL9m=UF;cqY2Qfn_1||c zT2x0XNJuIn5xw2(oqR3`Bpe{tnPppqAC1wV+U9Qb8kf74oHB#fx`mILRDc&bTUeD{ zk!NIkMm#Lw50+Qvh7CkbAYHwQg?rfO%pF!ct9Ckxm8Y7 zie8fBov{V7ydNGt%H{5Ka;3RZbzc6qjIb~rVAfp%=V8@tvI&@~yA}QShMG=Tx)Y&4 z%Y1!PbSTjhWo+BF?cCV5ZQHhO+s;jLW81cEo0B*5=J)kSuhsq2)m>G6YVE4CH|64K zk1*S?`xh{nGwU1&fHe)y=iJaW2MKddf|(x;9E-iS41GN(VlJke6USo8D~PqJadj6d z&MPo^+kiMxLhfT9p30)!V@X4&EBZt5edhX2B%Hk0pY$Qr-1Y%(qSaGr0OzEOiZh<( zB{#;Yt!^1Hp?F{q&qCOXrfQ1DqbfVY7<0-v@Ny%eH0rfA=J!c98PUyKTPY^ZBI1E& z&xuLsl{PAKSxj|=!{8_%RRgvUd$Bk=G;$~7HllC+%hK(N4kTK6cNm|PjEYM!k(=eVcnfM2Pi$c;NI|}e} zHJl%d41!~Pzs>;@!{v8G33;Ihjq1=H0x9;PlU-k&UCu`rwn|$6$dGPYG_FigJVlqFDU7izioYI}wW#Ongj>U9X_dpPJb z$HyF`3jXQBa-Mm7z?X*rrSU$Pqh?;2o)a5Mjz42Ks$f8y-6O^rnske*C1BY|-d3V) z^lp*%gI`ZqAMIMhMVz)hrWHEZH$qUxbf&D3^$&f6xBB^PMek>>g?xWvWd=Db8_<^RB+B;BVNeTM zAw;@rx7VNa5273TpRYa?_9=2ghy%Whpv>*y8)Ehc$co;zwojP}5{ zC`XIefdd;>Krj__vk$wmfNYSCF6bDMxZ{v$m>C4L@=N)6HfY(DLsXQX?k<4NQj_FspF+9BT4 zuouKE5&oqiK(9Ip*?85wpHv8!O3@n+BP6i|rU|ecbyLF{1nZ_8R#$5FXdAYQCyPiB zA?W1oreLH&Td@jxKoDD&{WS^l<&ySW@BTTzXT-csPQ8bXv;LBlC02d0o)!I4}$_iL3;pgUvUl*wo zKw|VsYWAhr5+?@?PsvMK$hJ*mD&7i=(a0Gc-LC)1{y`%^-An%!h{GvQrVo z@gkufN|xLV%qawYq%{y{yL-16ll%gz&LMmT()1xe@#+7D1A|q@fkz~z99EX@TN2)l zTV8&V2UYd&TqvadlMx2O$hxjwUEo=b7YTm`Rm7u}`U)bnkF-E7e*TMg6Yu3%Atf^0 zWojw=93v|eJ-Q;zQXf)dGt?`+=%U%xXD0B%vXLD|Ub9)z%vZp)W)36*pOnfIWL(2E z@5L*?7mk}2D+&>fq#o5iwDznXaDB!`lYC%V(74*k$})ju7rL`Q#RVdZJ1{>r=<$F9 ztP!>e0X2A|{bTODPv2YmvV+fIxw1bLI}I$@E?}nUl$MA30`_LqeSdKnQ>o4IhT6I= zM4w?<&K~4KvZ&vhXg5S+GW80xt|LF^JsE1*`qO&gX4WC%MXV0#@0JvKeW52-Iw$9V zc}mSxL0y`8SFCL=_Cvgz#M^-ox6MrLA9TZlghqlvgYa4D&|qV+n2A@SVnB(A%J+6L zs>Njdwf%Z@_KbD5^sF zY-3v+&_|60{I0l?sr>v;bNK7Py_FzvZkXteV(Ww=tu>KQP$hY=Ric*B3Z3UYQHw|`f82h+h@MP+8rJ9QV8M2e3v6`0Vs8(ppgNZo3Os_J}tGC{98mT5_rX@3+ zG_Gc1d9f3oOyk-@VBlZf@&=PlgSWV=@2g-o0;9$9Qf@%}u?i=sG~R{6+&P6oX(moh zKudtf!TPq~(PX>^Z*pKXGXMDr{T}-uL?{g-Z<1w{iR|iYHo)w^eyIlocufcUAAV7U z{;yvsfjR-(OR-KBke;N#S%S6|iTQ6$6qfNm!{AtLrczT1OwC8eW}aZvJ)QNv7VEn+ zGjNEC9{(YNpmXI_j@`qYT|HY$t4a70I7i+^A%OB$ zA9?a1)&@IqmC@;>+pGHaJiU?Lq0ucl1^=}&r!b#YgDQe$RsWieiIr2-F25_0&*~@K z?2{B9C0@14(CIFTppN*1nZsB2XAzrJV15TnRazkYxC&5dn!#5w9^75-pAf2$zBD>L zWuy$=68MN8$r>a3ceflEoO{nO1@@Qx85v-Ey@#D;ph#(b0C+7lhA|p!L>@!oZI&A+MB< znlVol`Cd()pQMd&GH9IGcej=)+e&a3ywH7NtK(mE%)&Iz;?EIuE1-4j&AUmcGSEK4 z0uiu8WI$&$YfR1aOiw=%Bp(SR_Oi_7d_@zem|n7_{n&f4Kr3xZEPOp>M1>DjTWJm_ z(H3jG$fgmPv-$+=_gXvv(NkrDcZl}-cWhkhO6z$^?V5={BD1TXhTQPz>nt1Y!L$mu z#)2Zi<_9(;lzZ0ZL0i59+gD221J(bWf#Sj3UV*TLgw1{CxSzp6B;DBkq+mMM$;#(w znuzIICuY8)oL343svI)^#Xf`p>;}{bf@%T|9x}{&-|6zT^LP;kth+C}P_3A_Xfb`x zRVpI0u7G=jy1?=(^>T>Kt|36oX{7TTb;lmD@LZ4L-8F}K&f34zo-V0_X-XPb;{hf& zyGu(z4qio%kG+iaX88E+_J(Xv>o$u^}o|6Fc_m;+}shHI6G z?6*-WF#As<_jgM}tw!fgtzO@+a?9rCE)<1Q?(@IWu-4kYeh^5vH(U|)?Fxpmk^MCi z-H`=X{p&e6p}|sN)Hq19>EALb}PuKCL&IxQ=6P z$>&CSCaf)p6LoLz#@vnS1_Y*`pFdLBve+=S2v0VZu1;9kiS~Y15~zw0J3{8`PFot$ zz8~0?R@+@QLh7y7lg3k};V#wrQ}67k&inPvz;=*F94Kcy@S~u`6Y!7I5^c?f4%|(R zX(GC*?xl7l%xRbOuK|ifQe#gHp8~U7*KOV-uS((N}o^s=u?Q#8(iI}nTi!C z9ah}?8mX-+Zk8Dj1(gcDLlfGwBZ40Xc=Wn&Ccp--{D#Rcl|VVWlA#tRACm<{npYV#7_t zH&>Yzw)~cy$nId#lV-Q%cq3nJz$iBsli?%^ZaKH%A8#*AiFRZyd0bInEPn)`kMcCe z6{#(Vui?E><$LvDhYEFoKpMdP^Ax0|$u~U=`ZJanvu?T@YeUQsRs}Ktfy3yL;dGL_ zcaGe3Oy|R{-|g(;yY^7a4oi?2CH!N8H6?f78~VrSKu?ES2HCR{oF`+h6Qay~MGW>B z%x8HS?O`YAuE{-BL$b{PJ_5^RMnB)LF)s*7GCpXX$kTVjqmd7@5`R{+!3NoXW)KmO z!xwTCNv$CpP!7@!!i_u5E6?loPfSoY*O^|~S(?|HEO=>U)tO2;(hePSb~NW$kH@{> zAelaUxDfS5p*qFHU6fNHp9+nNx?OItx=LC=01*tAl!Ayj{6nVs7kWj`#-}C4e2c*i z!G3&rZJg?gbYF5Ptr*`<2%m2NnDw#OK8XZ|ZAj<))xSWz4+pHN7!EF|VeBF(59U*W zKux7rn%;Zmx8L=O9SPtSAL)OrSGBbNU9Z%jc>p8c+yI!u?t{O`I2}bh2WEoRW0)Xf zEmAs9PDFg&Wb>KgWb%FHrqBN7J8I~?j$GN4Yyx|5drbqcM$-7xivj% zQ;z`%DaH`12a^+8lItdzxezTg(`^ny78C>do``U#lpDoT&LCA322&!AdZwAD(0+~j zncW>D1|S*?;(G`H7(pGS!aebRyu9A3YDhPrJoV4bMjBPR&SS%Sq~tREP6oY5lB0r& z(_(Wg!s}(qo*jlES!e6nU!lkJiNSNjcs-EB;O}%V~&$dx8-t=xyZ&Il*ZrikAixSv1lnNzdO=}lqR#GQ_^JrJ~7R+0e zJb0V7*Y=1A74!GSH)7d}HMHi;>wk&icY{0pyTCLc8XgF4^hT%e z$PSrqX&qMZW;9=o-nAO&S%qTWG3#=fz(Px$Qlq5ia6NTKGq$xfB$^`t?LVefn$Sht zQeL$wRp;KXWpHnM`=d@!mfAg|y)t`4J?|KqVIUjB; zr~<83%`5v#NcQ!_VB9ZI=2q=*?wX!cGrYbuvP$;zbi!iOyf)(RF9%|nWCzZlui z{zYA!x@9kSw!Wa#%fiUh^d~F4u zD3@~lohvCf8uCH?ST)7S4EB4AQ~9(Vy6;4wSf>QK!EW(6;6x9S6py)tT}zPj#Rf6$ z=HrDQatlNycn$ZOPZX(@Kuu_~tgS!NzFWUC1ACGmi`CiLY?cjFftf9jlAHlvmLWNA zGpo8-i33MG@cxk&5A5-6P`3B4I9+*P^26dc{S;f>uzkS-RH0jlTMXV&01aM%?~}ji znTxH3cOVP+qilz9B&_g5a{5=Ui+CtvkZi41Xm331bG0j!!EUpdxt0~gaBDjL5o78C z!$!MKu~}l=zU!u~P#lp|Vcj6Q)f$e@+%`X*IXi@mtboMk-;{_&l(pqIFKJ@MG$0!1 zwBAF{x#v_0>;h63$8hwutq6Z-N>iRrqM||+2{rjsS%a|b3ymBoSh5l;l8Zg3HJ?J+ zkrq@|%00^FSW_&e23|68>hlPG$iKyY+$;t<|F-Rjr2s)4s=mYkLuP0-vEuh(4^6D3 zwSetZ9X9dSy{%1J$1=<2^QoP9FAJ}ykJ}6Ljf6a)sMgTj1?T+}8G~6Bby4ZGC=Eg} zr7j`U(dzJ8;eIaOsVTlRuYu_z z#C6M>Ht91YRtzyDv-IMlS!e>=`|s^xnvs%H#>vqpA4(jtctTQ6H4i#rMjx#G7cOJx zG|o0nVjkp^z8W}$54RzF@@T63$LEl8xEr*Hy;3>VVXqA)SgLf^*|&ff)jx{K#tDtR z)DU;5wC00(*A%;zvQ$vqnLAS(1NyK^G28a0Lu-W_)vLuz+b1~Ht?67S2yM2a1iqJU$UIyksCHts}4 z8EiT){U#Qs5>lM0EWeyJ)JnM8px7Ob+V0utlkx-bcOP~r1Nlh8XsKPH6C6F+`v?yKU%!hC@5%zd{I{wAEhCKeEU@K7165E25Fvz4rO)9 z&JFQKHKM{T$4g+Ei*wZ&jS$sMPTbo)fy@CjDB{zLp@+nj>JuZiIR~_h_IGlqNyO1r zB8p*x3kEXUy&WlKSLwTdIP>Ao$q3_ubZ-ZC76FfjA+=ERPdW;$g3$3ZU^&3dvHwQX zOn%;h?q(U+e2P{O4&DQx^BMy<|CkUVyz?C+xf;9eWkyf7aj%T=voT5hQ>}f~GaZmq zw59nei$t;>XBrPG|7{%aXYx`RJ}Khex}L9W&-?pUy+Jp&s)=jA7AH0Fo$0^<$jR(S zt1Bf-Sb@-&dispz4{|Jxi?0*{r$*Ye0~~62q_2DU;8ns{dP5&jM}GbPdp3FDQl;x@hpt*AS>pTEBZ|8pGio4c0g zQ$h^N!t9rM2ET8(obz0?ur?P|q?6NNsba)nw-?gG5B8TE{;9oaVs+ad+q$|P%{vb<;-fWI6YO1{ zYP`G)8=%rc7^SmZlN-H)#YDgosL{D)vw#F@_@LFFy&dDw5638EE(sdQN8f#XI^NM} z*x!WG#L}G{9?A5C!?x9(Qs8ujq7Qdt97Pa)1&3_9=n|4J*(Zs)e0?NdKnpJ#3TK>Z z>jvplm9VWicfi6d5K5|B#?AAg!VSG*bX;h}%UOJAD~r}^kV^;)>p=3NKgE&l)qhQT zfQ*|1BOT;8n@Rc5(N8$zuf|n(Nv|}R!G}w|u4VQ;O%d-oOUDb_BMs~1yA&MSYyK@b zJDxT&1@8=%i{&+5C|`pi?5RpY8ir*^!V(THL=0^*r*$$XN(eGfb3t3%R#<|l-H*so zts|{O@EW=ig|plfX!XNHhst%qVJg!m`xr?RvseH$mMhAOh{rI z^7c46RPQ&#s9YRxF?|U)D8mcMvEE1D%(WmII&uR{7UZx1DUH$9CkU91!vIed)KAtV1%=Ey<`riI93n5a` zM=4_hGoJ?>{adXcfK~TcFZ&SLb?MT2#Vp_dK%5s><*kUhBY7vXvA~rIY=hJr0(tjs zDHb3)Iw-niWwaT;IEks=zv)yG?*DwIqu4}VXhw|_qQX^L{NYr@t=A(0Yx3rf>VZq0 z$#F&u?794)D=(8pamaX`}owTK} z^{W{n?c(I8rucgNp^)G)iE`lV+=-=~dXA#s{o|W&3n^~mI?PfidpE*~V7>(mN^Fic zabaj5QbJ}zD#>eAPV$4ZR&Dl+Q9cZqPy${!rs5>$J^PN&B)Q%l*rh@-c&2XS#ffMO z2I!|PNuXM_mjlsy?hNSP7-Dv~?YbdqCFo83Cf?4mIcwN#^A zb2g)J{rTi`P40OYe$)>5yRRj~;y}4_ajas>KiW`K?L&{mcG6Dqd4uY}uWU?*FG7dR zd4k6uAb~r(SVK1`NJMCa@_6uMaE3aN0Ve?y4?eaD_*RIyzDb6hm2K)TR2!^@9}_W7 z%!85}l*k$}!LLaGeKQFk4?IPO=7a});0h))UG`SI_w`u2@&{7%@VjmKpLn$hu9(|phkc2e;ISbE!o;1k{ z`+PH69nf6nWxnV7s?&oA6d9Xw9Ks1h_u9in#=8QddFRQHth)dTX^}UTtbZo9tDA zQrAoCqnuDKbp{0(lO17gz6w8;CngAfRV}=ma4yzwmDDP%83wg$^y*oJ4L?S`*%+%e z6?;Z_5AIwkVuzp1Dq{zG4_~NntgmQy$F5Rn2{Q_SdG*HJQIX zCJJQZsFxJ)kK-1IGlV_1aQc|JzgM?`@BEQ3SNC7-Fpa}svQPfm&jb3Y_(wLhkhDc7 z?Di>-41*OiFva5z76ap z7%&=-EK-TcI(R{T>nToP#(N~DJJue%V+tQt#i^kj<+qQ#U2$3HMH$VKDx&qq!c7Qu zk|RRpC6pV$Vvb6lZY8o@?pAcd=h^&9ip?J%4X|*CNr~c-cTFfeS^&% ze2(jSYJ=lE`jnX4bZRbFqE|vHP(tJnJ8ZtNbv`gzt2V z|1@yQrJLmVkv^8{=YFiUgmZ>SSDfJ&^7%H;!}H#jg4>;Ha}wa4&F@0)g13z~%!!K@ zqKgYaE_`zdQ$ki93~9C)`Lii7suqs4J}l`g_e(kUJ0#tY9&{c94>lN?q!p{r!QJr2 z3F8(;GqvvYxL|}=n@Y32gOpxW!RjgiBu{-f`s^e<6=+bAwFmH*TH+)-0~{ikqbFT1 z$|TSmD8))sS&3=2JL~966hQgqUDf@jaS`yZ7RHa(;3Gc4ftYapzmfjStg7e$N5o+N z(Fth$5RBtgSW`|idjH}f0KWPp$#r8HMYSSSk#fY#A5IT#s86wfDE+i^5oB9x@Mf|M zL|fD{tP$rp0?i}ez+QE>yprkRx+Syi#Y}*)F>6`q0seeY}C}}{8=+l;umxq{__^WMrekVj4 z;z|C?30dkOmVg|3w=BTMoLg-Bx-|r-iYjZ)O)MsO6yx~OnezuwqYsVV=|D{EjJYk= zHtetKPX!mEkH6utc>DCuiD_&QIMFX|R1FO9nhg9ua3e&p|Kdgv0ZGs0SP}ZrL-)%k ziH!F8?(Rl5WW<2*p~)8iDz!yMHF<>rcaWk?#+tZ-h2s(-7q97fdrgvDdEdi^pE*iX z$`jyK=6V-q9FMH>@0Lfa5bi?Vc2CZ0&dW+2FNPC*ZcE2sL5(5s9WAMQ^%1!;DYgTc z>ifdrKlCFnM}>FUUP45=$}!jvVo|oeVbbcWB6!QMe7Z#G!l899S2XT^F?}+~yyG}Y zZm&XY+37EuU~3g8$&iROKT(ElOqr~W_(5+aL6-oRE&Tcr^t~`HYcAin&`tqxJwPAffp6!Bo1r~2)4(Dy+@k2wJ>=6c+J@Zr! z%wywaEHASj41C@#8JupReY3{(Xlf$C76G(%%^s)%QUEdy(n?8LlNA90d%e%4#4=v0 z_HW)nR#qQJne4mWn6NVjuw9v#CMd0bMj4tIK^_?V6sOU)YM*fkHK4)|nJL4Qm9|}w z$^pZfd#9=)RPGdF!edl5VwKhd+kfNEsowLjCoD<~du@Tw6c5!@^|uzJ%vzBlXX%D} zw#qr%ztVwU)ITWx)6wcjT(FBsRvLyQqTc%JBR;V zn*Op9u~m*>)he)d)6Gn?I|S@FY9}DMF{(8K;)wvz$6LA-2yt9XxY(UHZz#JR(b}X3 zGP<}$Zp#|loq(P2EwtY;MtUKTDlUJOxzZ_&2$^im1#~vDu1y)vN2EXWe0hCpha>Jb zP3c~_qoiVcraz_E)3gk3HMJlKCXkl!%go;K8ODk#J8l!*8+&?Ss!{iIN=yVv=BBTa znt@lYc#c~3?(S$8GPLM!4I@7z111Y1YH^{+`YU@@g{PAi8T@!JMP6c+a85?$@o>c* zEh?A-Hk7_crC7}4j?;qaS_>k#5rPta%uf0w@Qv-opJXFmU?TLRYvqg&f@e52`Pc*a zN3i>RD?Cuv>b)4pD3c2+Z-Sj;xh!s{DfiE8puhvcrFs7%TA~!u)7}ck94vtZD^pHG z91q3l8Qp zj{D8m004kj3xNNTuOk0VR{$b^8YWe+de@#g-)Fz7&l8C>#VD+-T;LE*aH#%L$zHZnn@!I2b9Jn4zrFuw$|2w4dYlkX8W{CiEvv78{jq8gU z2fF949qqq%6aoNXxBzw2sT;pZCR{B%UNrzzk|>GElKi%;RZSe7EbMFvNZsj38JPZa zVsWP<5VEuPaI`QpcP5|^q9pjwJput66Gsap16u+a6Eg#6M-y9PCmI3?TO&FG06_^k zB?4gsXA>?021a^D7J4QICME(#1}+A6E+!U&-$!r}FbfJO3NkQp{{OcokrtC90R;TL zR0kpe{?AwZ`SE0RG+F_>5o*@PG=A8!K&z?*2N=Qxc;x~BKnB`3SH%kmUPSD?1MnZ= z2@e3mcoi@@%$pL?=n-)MRQ|-~7L>GX0P#a3LNmW(g|gyRlX;gCn5U7jW}vQ zI8!1_^^3vb&wKC09zk&|NJDyMy6x?BLW|5F*5;Bu)Y zQjA;0JB}@L$yjx)Qlzk(R!2@cqTZ$g&yBu*6CC11~Zl4zwXx}*?WC@pqJ z%d9zO9zt9E1&Q?Yb;H}qTj+^6r^thqGz*+b7s0Sofijc`b=@Lentn9@br9a)pQT}! z5T^HXF@jFK+6=WXL>+x}42Iv}!JJ7-`!k2a2^8rT*)sP|3l2=n_(yXHMXPOm)=6+4f+i zmtJ~Eb5Q@-In(!8+hHo@Rz9*E*B+)W5g@}Pg>&VrVr5zWDX2~WGNCP__9op9-~ZmK zhu9+AUIZjiQ~_Mz!STYE)X3WC8?npf1|CFfw|g~EJ|}%jj!l4H>KdG|6Hw5?R^{)3@h#+tBs@nwg!dXY_%lwrn3M<{BhVLWKvRF(i@~uD7dr>N~ z<~91*y0GHNl8Y6tXQZ-F1_7|&Q5c*_S;53+MGL>r?kNFYctGh;$*nmvhAVtos$#Q``Qv? zBJZku8}q}Sv74bcWoR`^IZQN-9G4vIv5J-X!Xybkj480lPEtOjE*#XWZv6o&?zGhA zu;Rj*5WtV7aqpw&4Q2UT^Vn=Fq^M}>$GhZIdLjIN{F0ZpiPv|dUY3AaW9xPvAP8I2 z?l&`ng~5wlHTXJCz{(A`m!C$57wK1gBOU&ELB~q@>fh3fN*-zQr&vo%l4Cb%vkG~c zZWq56_iA@Lp4;>Q{K#KXiDh&&7(pTQ(mraycuIVPyMI1Ko4N$&9Op9fnIO(o?ad|3P9`sqyHIM{s`PP+n5&s0 z7v(1FD$h^ca9u$tBU3j>oiC7eM?%1*n7`|G*-f1uEa?KmG6%-or~9sA1hu|qEQsZ; z_YElGKIAbICgFe>gEE|S5{?JZqQ4E;(YcmpKKr^N-3TTrp@b{e#NpI%+@QN&){+#5 z7Y!MkEu|6I3z!%SOHL`HrB(g!+-=$CCxN8fY{0+b6o5@}YD zgo=w8y;q^Ly0IM>bhL*d<6=lSIdiW_%@>O-Opz)j5CdhngA3d$#E_FQF9YDAQBpb4 z{HXgy_fTK43$_Y+M&lbGL>#dz4$-Mtipsh%{{;#6r3m8{Ee#q-DPNyYxaP$)-$xU*c!PJ3HK5nng+BHpn$3Dg|)!a`*;AQ=YYeE7)DeODAr4@X89 z*EOZ_f41b(j2&<08GG7{Cz>B{Q8&!W_plQ-z{4n%*6kr62sc*#91vjJc;q>`P1oGd zRuwRlj~BU$;uqh{2%OdhIM%(TqB?!{I&^ESsa71oIs>Tj*u`25WmL9N_UOL8g{=uH zL!WoY{SxImd%>0p6-=4xL;>ulIUQjp(GW_pLX zzr&0E#EmO*7DndFBwEWn=+1B%J^9r{>Ux4sNj)c$tGfQkoQZ!c9wOMP76yCEEb*Le z9!q@UW%7%F&tRmty#BWf`>pVXVHe;S@sf^$uc+smG3!2nx52tPQ1;7E_~0lu_ctqM z7ghKLP-$1IG1HeQ+di<={gYtcZfcYF!TTz@G4IB1RQw^k``Y_8&s=40`Wx6Ndk*c$ znXY{*DrCjCyVjoOtyUo(7j`KIVE8@-(tP<~YUobCaP?2m6H7E|6l~LoHT?8KVC2%6 z#!}f-@C^LH!*K-OKe3p8{AFeY2Q9-QWezMxcd)o&RA3ne(N;!b>m=iMzIA1iK`e#u zHiyeG%z+{m8qqa;)e2zb)+r=00mbzxmd_2U`%T?XcX-}NNvzI{*aIdm^CUi*5h4oe zUdH8K3%Yhe;Ya}OLx*2oC0-#}v%K+$p>C3a7Or;X_={8!JpDF0H!o~4j#OY^0R-$( zh@WDI$p&gu0i9?EoP77Kc0fVJt8~J8Q61jO?U$j>3r#(rzcJdQ2lIZJuFR&C{93?S z?4$=}x0Dx`UZ=sImAoQ`cq{F{?cI;yq&Br|lAkdtp$10^{d;E- z~vAjYH^-ApmR|NG4$IbUO<$O4p+K_s;T6^$St3i6p#lwCdQq7K5_8hvjRXw zt=Wlj-+916fU$bc6=eRYPe3~L@gVp=E%a&lW$IMZ)8hw!pc;!iv<#u8Eoo!buQY!i z?z34zdBlH@il5C?#+Ss!M2MAyUR~eih@Tk=Fc&TAV0dixTS(2j3nw&)T3OXGob$+j zp3)eAFM&CVcMO!X!McvalN}wW+w2Y&_%i7yn{=frcABmUKSBLKmsB~)K;)ptO0Y;C zMOLaec5<_{=4oj@JiD^kHkHW{vVN*adz;Ik5X`JrYrX_;wc{;3K-C4?{b99aMFIFn zA}IB)=22D*4N0}Ke5rC!&R4E<)b$w5A9ZmBOFk)Eh1Y%dt_VNw%)04&5Mv&v^tY^w1* zng`l)?a+%cqX&8L8`8_LujTzYe{k0mc;f$v3eZOh3#6L1kW~^C@x|n(4A7hMnzk{N zlUNr=6+xd$iA!y*92U-X0_1>oNMPcznt z=<##i87N&_@tvZP{-Ks3WL=WTAc0ZgqIdH{%&~|K^2#>yTZS&Zau2B_AlM8i4i|)69+tPkqd@4%Bs+aTFS6|y zs#Xn))N#Ih5_?9&EaVKGyH=~UpL3o{`|H1Z0+VVdv^96sB=z^+MR_5}!J@0D4CI?* zGjM3*-*$?0@L?;E9u5H|A5)Tr`!5Gc)5^@kV{D0Kzt4j@(BveX89I5p^1nEsvV&MM z8Q*Id89V%~r7g|aRGlM%{q}#d4_v~53n4?*qR=v+G(s;#^w;V~XDr1j;(AZC^Xzgn z-=ar3u%4Of?z+U)I`KL}d%X>cKeUled>9Jw@F2=-fLb0rNHo|xzw&L4w}%-Taip>4 zQ#Dz%wXuTQC{V%}I$MMUv?oohB`Kf0Jw{RS~QG_-Y()D339+M4u)} z4R9~R%3lqP#jaA|q~0{tux<^-nGdyv+1w_+=_{%DGP1d|)vc2kW9iaTs`#QYV#%VF zAV2yKd#ra>;7W`TbH57)ArkX*w_Qu4HExQ3X~qI`e7hVp+A*#8Im>xfu8HZXPMc{$ zWY-y{^HUrdfCp4xPxSSKo$@n;Xl(a>T5Tp!L*viK)t|%2>II-01eC8&VS9$r9NHJ} zZO#`m%~AwIP+Kg=l$nYoOrXJK3MoTX*`}K;dXs_-A;BB8FAJXjY*LY!^*hT$zl_-d zjtX6h?%!B-u_he%)E0Xl#{q}$n;)<{3D;G=4+?}~6N5k9qo#Io3`&61M*-U&fTwoc zeZB)A6B>B0MFfgT>m3zAJzv$ilhckLMmfD3Jg#>%WY_ox;P%ku#g(=MQPGwANV?DA zojfJ)unZ`pQ7~(quix#!co%(T5+N~f3V-7g)59q-2n~HF4AU2yDBo>P*=8W%|*XnN`x$_`BdyGlFblGhdiu(FbIMMp z5#1WiBOY%cbj}+6_aL*IkuK@*0NWBM41MS}o5h%sz^9`&q`T(b;`lVB%Ao7O7tY+( zCLvLokf@>CUQ3V9#ws~;Q;U^g>laZE8KY}sSMn53O@3pj=TXwW!f&3}_b6_8Jxf#{ z!hn%8-W7*K`;Epm-A{!=-}*x|^e=fEiY5laeEk#;I`J6h4*lJ&qgl(!_y}PdJw+Q+ z&&Lw;yQ{(Ohq##Ful%WFX}S5Y9LlUF((_l|#b|q)mhzVGF3{h^WRg3Cc*^7;^E8A{5C>tvo5QGJ@Au)BeU zhFS)Div47la>5$Ee|+xj;@wt!XM1?qdnZh=$?xUXs-?g4U@8!{HT$Ea<2dssTK22X zw_pdkTrejmU^0BD0E?ti?|^(pQj*F74FN@&u03NLy&K+_D`d&y!`XD?+R%=?#evfY zIEE0@UBNQ&)SX)+b|kYlTWuX5AYM^%LT2C5wVnR`_~LMfbRN?Z)}b(FbzWZL$d#K^}{`P55(zWBN z?8C$V6eX%HhM)*|F903szb#Y%`I4*Yw@4fUW>Ue1v=u>L=!>h&t8^sGiUCAmtq9VG zPj1TF^{eIJ)U0MXQNP;%ci5KFhA;k2-dBWr*a0cc3-T6(Pv6dU7@I_0plx9!U{GaR zSoDi8fKbY7R2u`HQ)n=$(@HAp&{oZ0=kkvdcbi@7sS1Z_vCxNH2o~ zY?R)_RMW6_2xB`fupnZ7xN`FOjb5OEw0Bq*0}** z-UGe(gd$=ysT3eI7v*Cfkd50t0bM{X#>92<$vI~($tpT#izEM}F0~+e^VNYjN((UX z9Ixm|4{$1-)o=aw{U=IZgNHW8C-R-wmtTS7P~Vp0_X8)J&gk=qOJ^Ha!JLM-Q z)0G|m-B6q&{-fiWmi1`=J2Okv%~>HV+CQ>Qmpa*G+H+sa8Af9upv%)fJxS)N3e)dO z4tlk6ILKXX0q9y6jEH}ucGEfC;HHGFsOywKZS^klM(B=whv9wCGQMJ$5|=BUc+n$& zX7QWzRelGv*MYbkD6)CGTP%!qJaX-dr)8n=YW{A7mZfWLmmF=Jra-F+z1we)MUK+V zLJg0_@f`_C4YcXc4Ahb$A20XoS|5)xLEe{bguu#}PVCO-zPg~L=@Y4FZ~yqPrU$jI z$}+B_nMuIfCsV&Z*P*8m(qS6m{d?hqdj^!}=BV<~sN2>>WKFb%c(DZ1plwhFp4Vzf zR+ZYEgcw+c4+s?JcU>V&*BI(k?xhk&CSz1tb<8GRr4^%pEE~c~Zc|e9r)`U1VurNv zRf(I>7OcHOlk2(TjQCTFi4_!{<=R4v+H?gJ8Bd^z%C-mB9LYT5^&Sz(|bs&i%( z-j8h8aLbSOvWWFDO;x%RU1ycf){=J?roMz@!R2xP0~)+T<7)ht2qInE)5bx+kW9SFz;`;mu8M%p*q3InTtz*-fj`1noPBeo;>i;i6_p^zEr{ zo%Jx**5;yE568^>#|7h>L2+8!Csq|pW}~rn0WrZ%n?3XeLu9Yf>}Bqr%a|NJCYH&N$*v_~11bl4XV)Au z3XvfBJ@f(w!T-jt&4?JdT99LuGH;3CCq7SWKhJ(|1B5yl`1VHXE8@CvP*~kX&XEiI zz=Sv2%^Q1QBdY8WYi76{3KEnKUvAk0+C<@MY7w9&rMw+s_o*LGh>{m0Vz>2;nKv0jIHb>-? z*9p8V4#lE{x<^808@#)MxunZzzSkd4G7sC_w}j=(59!S?3CSFKm=$98%MiZ3mDxEl z)KqYfgv8XGO+jsYu=^;G*Xg^z7TSjkz0=e;)GQLit77C^^9gH;!Sw&I_a@L#{qg_* zEM$ybh!*?UB8(*}S;n4WGGhsalF%lkLJL~ZW@$kwinK{eT9mSe6cvS(Qd*Ttp@iT2 zj_LEc?#FcR@9X@}`Tl>W=JdYz`M&pc?_;ieU-Nq3`!x2JsBPyF8AO6G} zf1M}z?9Cm;4_1Yz$;nMi$ltQv`T)hBFB?3^30dQQPO|QW?at@wPd|GF$-M#3aqg2i z&vE>Pr`fM@R&I1%EU=QxTy zQFx`VGP}M`-8EwoS;&Up!&&`OoKM#VEtUd*p%k8~aqwgJDeJh#Sr->~f1K~4%t}tE z=l7cM$#0L-KKXgk2PdBpa^S16o-(D>|JLB*>Fc@&3$){g+CM7Sna)bM_kea)m-1NW zp6`Jg!jY&U$=u5IEt{;*WWR|z;%Z}5q5l5R+Ev3n4mKM3R`g-#cPnRU+86V~SHkMADbU-($w8G*(sqjr&JFE!_4&jf zvF(0*j#}X~^+4g2so*c&_4+-llThrP6?CPcsM|n4eDcb>TC){zzl$icej0UUrsPZ0 zLY;Gh_4VbZT}1i*kLMVE@f%l9f4aw(K_RTSHC<96WIXv<+m*?hQZg(F?c~orJv&PT zOBSWB-q+7}K{B#wngaf-y|CGnZy@7!7n*cssUJU+Vn5^lMD@c@jOG+t3bkCx$ZlF| zxk;^oY!q5ICGKlYMm*krr*HcFYp<@SlrmQQiZfB1{cZpBLm@?*l=3s}Q*5L1m+oJF zH>x)IG&B3aR=W!6vXt8{%W>)p4v2lKcf5LKTi1=#23{{+_7qJg=8+~0%{Du|YS-=s zbFUaJEZw;K{jIGwkFNZ@dtG)LvpVicr|B%(w}=$I4`%OcHy4X7D5I9@Z{qh|7bJPG zwQa?X=A%Y385Q|gC`NKs=hVo7le}}HD`MWR_ekhi(5!a8)JN5n?rbY<>?5+yqbg?l zlmns?!A^@WUY%Zfvx};IYTZn#yUCspok?*|H6EKBH&-HCpO7yOyC=_&r-#e#lT>S& zCfwhftNuP*qw4bR0J;8znbt>Sv^MO1+iiI=dh4DOj}J!d<`3p;f8`)t>td{{zv5wg zt$$(pBj@*gORtAe4t_T)H8U}epgL0}7o3yt+>|9bZ{7QiKAY+WQVmvomz5#nO-_*y zckx7)@g`o~dhjG~k0*|F=8eg|%{vu$E~+jwP;uRIiF#J}YWwid{9Q)4Jd+52Tb}v- z2Dvx2u2el57&v%%g8JSj{_~BWnr>~2&p#{~v-)9V$K+G^i^fWY7y4&EC}#|03J&s3 z$f>;>pLbhwyV!EN*^8!`9>+|`Gk2evML0S^T&?)f6}it%CWFl;qEZ9Z7q`eolB!>+ z4ciekE^aCQT$k|lb<4_`Pd_{_@Za1&J#(*OT-TAW<&!kmn`|{U%{gFb*776hxbSUi z-xtpx1}D;V?%PW6<%PChxLH15@;-gvg)9fXu4|RUo71vl6hzC^3IZOAY-FbV_P&}Yw@nr3=!#`OwK0AFCbRH}cI&C6+dHBie#`VtC&hCMm zBTQeWE(np*KN?s0a}!U3j&_MyliRu-HV@(hzNLPAAW#(}u{G79@0oQZc~GyQQ{ZBn zes@6Z#JNSq-gSHEZz(p%_q0!mJ!a@t?^n9IK2kavhdZ)j@9k#=tvlufW-lo?{+&l7 zk9lTbz*9^%&QxW6poNx)-Hm~erS$y?1@*%TgJv(APKw-QeVEasbMMMikA=a$;a7-q z4{}mp8C}dGJGEAu^ndk}Zr*Di<5@Z}if{G7eLT7R#wx1VDRXuWj!legm2hT5BFkLq>zf`hI z-gQaA)k!MJZM*_6)=1Q>tSet((cmo6Su|_cW7|5CCcowbv3WxI4aao#k8Dv0fhK%{XKH>+^=WyB58?d}K$KfAmA0EN0V%^dq$fn@jJ`x)86KzW!!-303(t z|32#QEs0GksWYNusGIW#oljT!4L$ssmZvgQux3&cEgJu#Pj%pC&dL5GwIYUcg97EJ zZghP~wyB;ZaWL5Eiw~*(#FZgF>615BR!K|d3~PIbK6^6vxV86Fn)`}^iVK!EJc}ot zcU1`$oq2>X>D|60T)|88JFNk$&Uf$|e<_#He;JdXx+_%gVxA%^cu%du585<2UL}40 z(r+5Now8x#&K0U}UxnS;aPUXd6h=z_gX+akPZCQjlpH_U{@iioVVnM>Z&#Z1f8D)w zpy9oN=iRjAN!9XFt8Y9%%GCZPsnciaRPl?iNHccP4C(e;ddd2eH$PQitz zM8t~QI((dCJvYN&ckYu__$ci>w??!5JMOvYUCD7Jm*v|SDeNgZG$TwcU4G-NI@Z~4 zo*I&f#MX=^iy)b2(LG|B^>cJmrtic%J?!~RW=Ps>8muIrpcpO+3tzZ&^`wL>&7x&&ZN?TY&s7DR7wV?4<5aC9FYej;*5|GQ|%5YJsB zKYfQEFZx@(yLu=5xLP({>kiQ;mT~;%N8R_NrH(&!EX~h-SCXp)Ure@Gsou0B{hizF zy_?V4)_8fwcTcWR{wZwyyuezbd*5=yVPd+m$=T#VdrR}kM3tKCPic#@N77I zoOM^Wll6IJ18^oc*M8&qjJEn#FU!@* zIiGt%dpjQ~IPP%09Mvc(bh1ssJ?NtE`uCf%Qr1eA{r1-^c`umZ8Me{9IJ;9u$G3*B z2GligKwYB-`BVN=*ZjwhLdyM94fFbU4YL^3FygOQFW-M&$Uf$H;O$fDB4&nGn`X{# zxkBSVJ)AIUI;B3-Xi3(ppv?Co7lg9a)%d5;AM~ovaoX<@ajtTuTXbAjK(mgFm6=v| zv-g>)F?ur}P}L8Kc0b`y)~!a+t}u%tea_d z=VqV$3XhOeOOo7w)K4y+YWbF4nzPY-bC?;=snzo%C-#?$TvmvQnB3=WOVdu;Ta_F2 z@w$|kOwy0M<5~X2gF3E;kvqSu3)7#~b=EK6D_<63^`Ypt->vdxI(!u|iggYvS2a|; zNMqU`){MHDC}rG0dADQ_U&ZDjKXPw6y|~TuiD~Wbw?4~sMYnIvjY@rfw%T=3*Y3*X zm&|tI;!q8>snpO}g{~RC-pP)Gd(76%tt`o}>)5Zbv4Lm(wfn_|lZJkt`z}~%_0q8Z z(ru$(211Eq^4(Weh1Bg`=+oMj)%yMJJp7c{^B(^;`6}P@(qpNb{%V%|azE1!bQ*Lt zhxdfFIL@AZcV@X5`N5804gIU0RT7P%Chx^nL=1`Bwm-6(m+|<)4S(vc-1up7Vt#jp zedgELCJB1$Q{?m;rKHWAk6xZceQkK3)VpGVi!1H4+N}CdKliV^T3)bYkE!|O?S8G- zs{|_M&LSyYwaI@OdrbNK-QBub^+qi}7iz>ErX1JAmWbL$_GKBw|n3BQX}KRfGs+mx>qZ~T_kpMCQ( zYd35;J?ne#_Z!B9Rf+3M-gw8N=^vJ_hae+^>iUU3Mw)YKK7IXw3uy0v$-Qv+e z(F^c9Ds+UpE|oqX~uGik$$mWdaRzbrC7)2b3? zHhG^8k5<6kZ=pYr4@GWS>hbQ=Q=#~D<#!r1(NZnjj5$Vc@yc`VuYc)qeA0$Ad(VLn zLvh!B66~kuil131Cd5!b6Fe(r@1x3v-2#Vpd#QY^kMG#Mv7V@7v1`gr9qnz$op*Ry zl~T3I%0hfbk<1qFX9fhZjz0U;j_-W2CGjin+zWaac4tn#ERSQ@bK!z}nnNw;p>LTd4DL(wn8#Vy)>o!#QqcI?uxz z=d+#&Mw!ZaN{brJo3vOlQUCCzA!QG5{t}U8YpVj4&HM^u1bYMA`|f<2RZ{+as^?Og z+|@*}qbYe&ic+?YRTjD}HETH-I ztgz#WIp$9+so&1n&pCSpCuy=}zP;e2rah#Iy;`E?&X0R-7S9^+YFgfp!x!k=7Wy}w zHOjx{cEKxP(|cRh+@iY&BR6N(+deJAhZyeX&w0~zwpoQx*i?nzFm!?mR#2*U6{R9(PUu z+C;rM%lL=px0Ajw1scEIzi?t(>YSw7gUG(*5vkeOuAg z-YQ%2=4Wa9d#;q$2gV0~7dohJoD05}J4|%?6#-vOA@h<~53fF1#U2G}PZE@tSzonSP!le0*jVHft61wO>iIEVRm-^}E z64iuVabG-_o{a{76|Cvu`l_ZW9a1`JYYX*zcXxi~bL+0=_dVRZeD{g&x2I?&nsO7U zUFR&kc4Q8}^K8-i?7x{Abya+0LiN7Wb)T1-`BvVVGUxamofDb^4janc2KTOgVN$KE zdvmgHg6!hA6AS#-ywJ-T+?UmNPDA1>@#g7=b8m*te=qQKI^SuM%B~alp0>X0HC}T$ z-ahk$Gwr~ItD6rHl+zqm+AyT1+fwo9A&-x2m>iL?CTLA#vZ9pwl0~%V>vKG& zh*8ClJMFFx-gw;c^F&_BN$rW}3y$2^TM2Bi^3Bz{M=!5Cz~3rr5mRD#yId?Lz@Soa z@EK3hvxi=++ZVMvrHuNbR#&ZS`{=i?;73Pw-InX7AuCByR@#cD2m782EXp~*u6Xd^ z?WVmANf$Q-MWsE_h$M^H;8t|3(>s*YoaVKthSVL~b#xsG=Ob6o%P)V~zhjBgqCnAr zs+gT0j?+w|B&)8T^CzgA^%axs&mQsZ=o}J%-5lN=mtfzQ)#CCXs!2p%`^CMt;?{o?%MxdwBC=bjgCv(ym)egh+$tmd(1?Tnh&dZK=Cu!V|mqdcN~v z9i^&uyw>^xv!i&FHy^0H9y}{=?E?>!xmW4uAIVBo8E&exC%C@Vvo%n-+_)};mq)Ha zJ4$YFQIXl%2hOhF>es#9QOR>SzP@Wu=e1vJ9CdqFcRy-$C3+>@-Y{do`IUA{jSMko zre{WX-?x|*#b4WXE9__2J=0m#6FaA&JWF7${KP#M)~>uj-<+ejHqKFIYxJju@fPKR6A`@nj?iXc+qOvlc*7Kfw-e2_Ul{aS_U7Rm&QL`v_I~} zB%cjyRJ_jdY+I#Rd~KT0VWr{OQs>SaqZn!nsoozm>_aaYpyAF2!DihlY}O8YVYc`&(L>0I!e z-k?H}K}qTOqeo2E)V~;%Eu5LW`^FCk>)7{4yJuY9nIL#0YeAR8uBwPHCIO;r4DH$$ z?w7Z|c0TR*tKbe&-6XV#_Q z+!1*@K1M?9te<{JnN@l3SAMt9;P`hl3#p55$QS4{ej0xEjEUGA7a#RBQ2x4YMN9F= zJykcVe5j5F_Q!5lI`5m^;#F2;?Z0<*uvSv*0Ofg|O^x_Ut&CAbN!&5@4M6N z(Ss`*A6BN!DU`69!1`fxwcELKc&hBjpe1W|`1_qpD&p^LYkFi!n{~loC-$e-o+UQb zLFOj{?_Ct=eOvN5Y}&FU`=vZz+qdcYvr0d;HqLuda#{aWW31!Sz3u+#f}a|Hk82am zXHs|B;A}1(4d0`A=eEjqFs?l+f$Nuo#{Ecl&@)e?WmJ5|#;dB>T29rrU_X-Bm$ zWrL|y!z)Ae1vkH6Ikem$Y;MxZul)z+R?HTo2}B2H=1Hu+tSNTqT8P`^+L)(DCoi}) z)phFy`oQcVlP{0;SQbZTTYcN6x5O)m7r%tL{FGaS(}4EPj*!^cN`J|-2FefT=Zl{I zx~TLaZ&SX1Z_>OHfwm zZ&y#KkL%6c^DRGUm3-8SD#x#vl7zpm!&!cGb{E1cJ-?7{%IjA;q4p=gLG(aQ)zj5t z<$7(G=jKUt=Sn_$(lYm>#OBMM!`JwItsNp92UiqYy|w-Dig`@`T8-QCuidK8cailT zzLotFv}eENhDU-Gb2N=<$G<%kD(TdoaG&w|ruEi9@lB<#Cf*s0`%c|Ilvbt@sZNc* zPMhCn$GbdS&9$@a-1Eh6cr5PyD(eop^=wwnVwSt<$?y3dtc6?V$t<29&&t8~_DT?Q z1o*xX9gN?XKMlLNdfL9w;+Lt8Q&5tq;@K5bRYC){Ihtvqs7$bWFVgO#&eK4oa=OvjH3UXfQE@>qXV;;YdVWH2dL*+g-Km3!UYAlc4-7Y_E z@pBi=)^78MruD+-C9iz1IVEEleov}6xjdpwODOLap>pRoy1DN>BTcApanFMPzLNh&G@(Rau$eql@2XvX?0if%9Sul^zSV^8(OO_gqZb5&1Q z3)H=ejo?W+yR2xBaP@FlOk_-6*6HekcYz1bJ-Rg{vE=*|KIt>1+Sj&KF01AX-r~FQ zEKg%miO{y}aN<;DF4LrmJ{C{feIBacd_*{0mSbVjz*q_Uv@;HJ8>XD5YqGt%z1 z&ef{5r{(ZyE{*8qRX%*(+4sB3-2D0Gi`qnpu(trQ#eY(P>%fm0OOdT*>sJYj+L__ev=@qeBF+~i|%EU17xVNq`uV*YR z>zJ|Wj?E#P?S|BlZ++*k9H{6a>DgL#*80e<&OW&PQ=(Ypu2T-Ldex4uUBu`${q^J& z$wuJQoM*+`GP*8rbm)@2)}eYSMoIcL!J|V&p0#TSu5IUQT7ihEwNhS)h^!r7Zs(Ke zR=!DYpI#FV+iveExmc6vMy#5bUUtFtJ&&-i`d|R>DT@jlKmO}7>2K!X#JAjw3zYkO zf9YJ>2APdRy-}{Gd!-61&3+AJpO4B>vP~zRBdG>`HMPvx87|x%%`~0RJ*zD#x-rdv z@3wUgGWRA6&gVOSgMMMHN`Jn1nXj$jwvegByAQ57<;?Exx_q~3!}S634Ek4!%1NJD z#g$HVjCS|*blnF!o2_#CZ}oOMRp#qE7gQzsx;f^nxRmakV!VIBm&>kh6ndizT{5Zc zV9!NhWzKmZtV2jSZAe_8c!=g`Xgg_-3%TH2q`s6A&AIobt)Tp}A(fo;1?4G{8_#M* zMihy=l4jdh-Pe#kvD57*wWLhF;A&1r&uJ40-QyQ;JajFupe@>QA!FAqqpjX`UJM!A zgV77b?s(RE?#`Jl7Bh+2uKkmD{)S~&Bff17P@g^EyQtHsNj9lv_=_TW!^(tH75f9; z=%p4X6mD=Viu=%-tJ*I()kjLt;q5^E>$*kHvu7snX%^pfcV3^L#2I~;gf@$Y2N#m3 z=1E^yottds+{FqIOOYNj{^8qo#H!EX@a0O$2?uC{QmJJxSD(raYKuN8XL`NMM2ew% zvf#n7j6IVh?9zQjzu(jkNo+8Y8ou_@t2l1&jyLuTXirL9Tl+s=Jw`}NmGN8jQ(FGx zo$2r1t@w6K;mr~In*%RYLXVs$lnYGtVmWkwSvC#C2f{;cbw_f0OZEumk*;Py(*v!5q@3ZI-2o)uNr z^5JHInNi3=H~Gwo6m{kK5mPex!(KMTsoI&|U(xDUwes!-T5|Q;TW3B5Mp~|9TzsBA z+!`RcKKJC>pmP0%^9cK#Tilq^#%e-U1xJ%r+GTIHs>SH-|Fw15)_`C|IsJ3m(Z7P; zO4KYa`8=?$BJ*g5(o=uKfY5xGSpzGk#D7^;eto)<#_avGuJvr%y1W0z`Xx8=+_yej zwmQwNR*ky%(E4XZP0Jho!scqIeUFk^SFE%DeL)FXxxPxmp7kT5Vfq}i__j5-cHV58 zt=^B@e)ZX$w%Qb*)$|`9H8q74SnoAf`47%%@DEt={GeQZ55>Kx>|sTx$#Cg`WlKzs zd7Zs8xT5Uf?A52QiKtjI`VQ=IeLTdYwM{SPsL015;@cY$R_{wvSA4UJFKg?WqP#}A zM$%M8B=6jG{ioLp-#qlaCak3|aij14u1nee@BDXliX2vtzBEugy!Ca@wfzNZdkep` zK6`Myxfs_dHP5kBVsmcZ_EMGAsU|Z9Ob?v+;c+!&|D(qHU0;Nn*2OoM(Dw*7WVF%ycNGfbkgRY@}z!xwExV5Y5_a# z^-KjXH<=pNv<#0s;b}`h&k+sO)~w9xIWm7!SGvlfLdRJFwhVmcg)2#>d`m z66xEeyL~7<@S3?@`G>S4{p3NH@s`J@F2xL5 znO=Q#=RMuDN%^GVd0str=SQ7WWGhoIZprhI>3lpTTy?vL^Kf_Qr_8bj34-K8(!6wSvgDN9LlK08y{hfrbzj_Z%yh=v<=^fqI3&7N<~~dQSa^NYH=p|R zjrG>{hZnE-_|cSjWKqwWwl;ZQN6%rI~5!iHXe*J=`c?hPUYN3ldoI z*>}C_+f|o8i^g=Oo~zh+efIPqo$^|f&hH0t2@|G$32>6IlN1HkVoGzl?>Xmv=~m%t zi%!>s*dFI$HB6i6&Rbg{VP6$Dv+Rsy#AS^O-9gvCP}je3YHqSO$~oL}EB2mKbVAzN z#fC~#8h(;Ai_#Vwso(MIx}Yi2y)tjhY?(9XJ-@ixD+`1?9NM%jH(Jd)!yr^Sqv;{* zLgD448G;=xOLN+DqngMnr&WUo21<9dq)2D&U)3UV1shSl3`z+8_f5mZ)mN~iCJrAmLIQh*|zW5n}cQM9XE3}3#w&W zZM(T7Hd81e`%bAYndk4|E*v? zzH4pzv}|dz^@QCnnW87^-VJVf-tA6p&oaAw`ALpv>xS1?C~G{G1Dtvd%HxpZc1=ePE$&}sK&^B0 zo-L3bnkFFqbdBWPAyX?=6#vZU$)U`{r1yqTJ}BBKSS4OA!Nh|PbePp zb=;a@@JTu9-igasw||hdS)8(6cE+i=Z%adtPw@^h`%T1ExBFZ4@=d2~W=y3uI_u4gj8Z%hkg~R`Z+ntoZ1vHCFOqM}4wL4rI;pcfz9F|g zbY1%P7>O+EPZ1B|%L@gM2yO4^$uGSO)Fal}U0kF5qhvP!#rM10dd13LhfSI@ZHL11 zl}*>RHtVOnF5Vl)du)H`nUdXs%bGXql$3tX6pVg7`|2zk1*7cfhlGjBFTd1F9QbK& zZ=gAJuOij9g}z$%+&mwneS4EqFSQglh)D8G9(w%#&!m9f*?za4-0l16 zvE2G5k25ibC&LF895y(rpRPII^s<<3-sZr_Pkpy4G`+qCXFuMf$*6xAv}?zgj+a+d zZSN7KtB)TI70X>2&!`BQ*S2qe@S()np3|?)t_ggU_c6pXOhPtxNJOOK@sUoY&3u_L ztf_fQRJFmROOO1z%)fSb>?W-sEIiPD>q+f}>uWA$%*U0dB#CY-aXE$;JiH@oEA!ZN zi}vSIQ&W59EjeB5WTBoX^v1R@L++-O+s+}|_%hkkQ#$UHC@=WHZ}&u0@<)52A+P_g zsQLUuo|^Z?v#ETnQt_CXyLQ$^SL;A>Lc zXEkamz3gh8>8P{)Y7Wt)v5S%;?Nx*4dn{U%oEcZ7dv_Y0KV`{k`i!vjLu$HOkJr1O zUlTR00hhWY{O#;F!Xc`T77d%Tn)p~wM>8VRTN*di?h4&qEfDLoVZ)bKb538w-8Ft2 znJ99MzierEY@O-Z8Lw`|2se8VUmHH7)_lR(EwIdSy#|T!=~2aLNk5g)E`ITyIvsX) zW`qFm)2A2DdZ5$DXyD&#ph(EHvto7p1$vbO!I;AX$xf|0yCK75JO8F+ODsOvYGRd=Tm+8GZboat@2~#fcQQqW- zyM$h9@9+q6`?TD?6yD5W3Ae^EZIG1_NPaxMQ`6gA4*us1sT^2>!& z?KVaY3%wmWep{xNrkY_Yb#hj*)E)^*cXK-jyGtGW!{S=M-%u8+e$c(q>Yiwj_uMY) zIc-A{nrnTJDG29YdMPwmdLdPJPlpZ5!fSR|mVH@nS>Ik(hl#J9!cJ*HHKC?ua+W`f zcvGg#c;o+N_*!JZ)(OYAdql*_W=avSb@?q@_Qro3V|kyxZJ$>x@AL!ypH&O}w{2SM zf^V9&BV6b4hKdVuo-1die@K~?7Pb8FRF#!aq)oP0CT#MuxpltalH}R9x`{2rF-hyJ zzQ^yVdU#b)m;X#amb&%U1if{O3e$6Hs->kNk>`DKF!OE zAMjLW`5r1aCE$NLK5Gi#PrdyEZ#nb$fiSzl2;Ij5YS-K!=6=#D-G$Fl@-+T=pT5L? z#`jRCZ*R;_+sxeCP1@XcDXOyZP^0?g0;9+N=e>3tIJ-O$*W`^h@ciqL|(IsM61Qz!x+1NBJ zy5M7@Yjk8|O|jI%-dS>Y-0bZ0bVz=s=ET99-kKKYO*ZDZtZmt>lKJ9!`N@2K-fqPU zQj&7sU$XpVRbI~vziz4<{eygJ=1k3m>Ahhq+Uz?w60X(Ute-w~WdFU~DKFd;H`OXO ztd?AHeP89(y&I;e)fdfw^fT+_gXA+8gpxatc?!;E1!skteu)k@1b_8nsi@;QYi8(S ztHI_KnTyU8wcpe}lva89=xvGSQ&IItI;R#$S@--*b+l~L?>$++H&N%X|Ix;xqi#w4 zj@^RB1#NxN(IKrlH?*ebD%m{fHq%vp=Aymj_CdwNnGQeo+Sk)wKD<$%&KIr?ZWv5f zxHGBNq1{x?9^f*iu?h!JQ! zY?pu6gdZdDl}&$-5;y{X&ybO`;_ub*_v-k41pc>W23r7T4$I`fIe$;#%jC28es}+! z{yhSJkHFs}@b?J(JpzA^!2j|iun&wI=}a0c5pe!#><5i2IRnyv-Vq)cc>eou{Jmi8 zEW@DDSgXLskxWpH^m{xysx+B9nnaBw!AKf^Ve}$g4?;uIiy!Qh&SJUq|979rF)$A2 zK=^$u@Hlz=@A)w{`=2fXPU1hu@&Dz%zsKj_Q(&y0^WSp`x+8+^n)rJz{XLidJp$Oz zo3YNXzvt4wM{=y=^EWSHKfnH-OMgC>fyuE$FZ?9bVp^j2yKth4hZdt&=v@fC2cZ)YIvJtCP!;x1lyCs1Al_7jPDkj&2z>;hGZFe2LT4lN z34}h0(5DglEJB|ft%XlVT@=Ur??NyqiW~jFLlg(@9KimG z;sjs{S|2=Jhy4@9iNF-J9DG{A{)yry!W6Vz5}_v{vs7rG-CIQ;%yMi?GSn%Leml238CjBG!vm+ z5ZVo)7a+7JLN7#UZ-n+m=p_if6rqGt z+h+=Hptuw8pkw(lyo@E&lC|s@9!D@ScQ9wpGdGu~%iGE0aQyOoc=q!>esOt{l_P5& zIfrEB4ko8bc22q$0yr`>bs&p^3DrVC6q3{tsb?V|4@tcdsc#{m14;c6X<#8>21x@* zG8wu~WJjQ^m}DHuj$y$fzarULxLA`rNfs$F?WY13@cj(84o55I(uT}%%0GgU}DFbX9ZTF zTUgNqhKIpA4vvE0kU$$|+L14iXwY_jNuV_c3QR1>7fDXmOcvRI#Bv4`0*OVVTZ2uo z=+?R;6Y9uB51OzT)?hDyoyAs`3~0ijTL?m5ssqi@{+XkL9XAe2UAA?~B^+8w+ zI|uS-k~!Uyy%`33hoI9HY|Yiu9NI6KPzCx4&=lIStDQ5u*Up(rCPE78bg{F9I>Cer zpuhy`WIEF<1aY_S4?%Md0yr}g(}n3q20Nu&m*V7Tu;UU>DESLf~UNGgX59AhJ5NF{)mM1Z788omrhLr^qI>1{<3_BW~jFXV_ z1~d3f{(xZeX<*bg$|41m&q6c70ni#GC#I|Ou!OCe6VuuOmnoE-!tTh1+Dws@k&XP0 zAQRc$_EMhWUfxbjJD<$S&_u{BaFyTcb)oW99UWa zy3~Sc33?~6dndAcZ5diF?x2qkwx(0?(p9c>Cg^1YXUhI()_ez7;|5TZZ%7u9=Kw~(p9Sh*RGVe@(T64;TG{)u!5T(x#R=pQ*1Wd7+#{w)8E82$77Hv;i9WuI~qPCU>S37Mq*I|6nD zX5&J31d#DQB#^3f#0c!EE|>-fKpnw>pw&G#*(cm5Q!+UvHV*3a!Lg^hKDcaLHb_d& zZVYiA0uCoZ0~e078zDF#4(cQ0aKRgxOkHm>9_O>s2h38v$pp@1MEm@+hCs|e^V!f&Np9xzI5cW5 z3^xWoQ!+LV>Vs&=xRF_~WdQ)m?#AOhw^&+P=-|m)$av3a0ros}@sim6x_ELTnK06? zO91`GAg{9D6PSSa1CkFDycax}fcF8Cu@jR8Wnq>RI|Yj1NX|}lC|x`sCb`;}Lz&cx zX$z9AC|wc!3Whhyo#qH7L?`9~CP*dLByUS5U6AC>^47&ctqv~JVM0oP*hI2uzQJ67 z(YkE&xc98!d|v1M$7sCx;Itqdv{t5m3N#_(j!g%Bfl!}rrX17&vvl1bI!u&j4Y8bm+`i9w8LfENqdSzX}~8_{y*7ZhA!v2 z1nFi0Gm}d$0$B$vitP z5tKzh{uyHtJBxta0~R4uD!6b#@92~YF4}+A{P*$$`5N?UC+~-*WT8w-%E-@skv0+f zB^-BKnw>k-%7F|hw%R!v>8ynoXOV-U)geu?bz?vu^5EBT*b}A$U0j?*#*KcFSX}xo zEbMdyt?k?$NMKGEnxjK=RA|l-n$v^koWPt5dp!m;$6jwfG{;`g8Jc6S#{^e~g$?_P z0au17d!7vm8eMSNnA7M?JUIlqY(&}fc8-?rB=B2L=3t=>gT}%OSb!7JGg^o(aCjz| z;-N)$u6O}WUMNtUEo>M%c6gkSvpLfaEN6g&frCJGz-PK=w4EB%foC|Fv*f`CxegvQ zx==%f8a=4d$K#03R!kkJO0mMzm{yK>njX{`Ld{Ij(A}KCCZGk-C4#qgGk3txV>mPM zbf{rL3#@HeOpx4Z?s%{%cLI%J%OKg=Ik6jC5{==)0x8gfE)Q5OY zoAEGo*)5gb>On2t%7QKm8k#80nogHzF_|9nbR7#OSfa~rsq9vd-RiSj19of3ZfCMv z9cM>qeRfM_w|eYWpWPa;TSIm`6KX;AqazO*aNW}Fs8FLP&jcqQ)PO!3)JFq-baP8f zGaj0Yi;fuyw7Tq;%5L@8tvUOa_T=r2~RM3xeoYy6kyf_B@q6Pi4>R zvFG*J^ZM+0efGQod)|OOZ^)iEWY5oJ&(CDfGZ~_mw$7Gjg61ryvzef?Ez{gg5K3O) zC_94#?#8sEkwC)~1&swXX9+ddpkXmdZnjqDB!)HJ9IS0kXM$NfCsCTC1(W1%OSdF3 zEnIb>h6);{9@OZQ%xxJ~B$|VhCAb8w90}$$a7KXhK$n;4M!Tj+{nf)HJ(p+b!T z6Ks-6cY`JjD-g!s0klL9od0wSXigvWa&}+{WLINq&!Ev5B8TXII0}aMp|7Zfxpzi-i6M?q;t@#o0K#z(CdQ?2nqvD|i4&Oh} zqvC-c6%X{Ncrbb$6%X{Nc%Vnc13fBU5D^dbsCb}9#REMmUI-Bn^r(2CN5um@Dqa{7 z5A>*bphv|6Jt|%V5fAjJc%Vnc13fBU6cG>fsCb}9#REMmUJMZr^r(2CN5um@Dqb8B z5A>*bphv|6Jt}@8A|B{b@j#D?2YOVz1R@^jQSm^JiU)dByc8lH=uz=NkBSF+RQx1F zJkX=!fgTkP^r(1gL_E-=;(;C&5A>*b8ALqLqvC-c6%X{N_^F6^phv|6Jt`jPQSs9d z@j#D?2YOUI(4*pI5%EBeiU)dBJkX=!)C@6t~7bgx%pFnZqpyUY@Ck{%TKyl*094rpZ!{UH~#Q_D2 zgAyiqarOtLOQ1OWgOVjsoc%$m5-868phO8?oH!^=0>z1gk|a=^I4DH|#fgIwBzSS+ zp!5h7Ck{%EKyl)r)Cd$O4oZyR#fgK`B2b(-C@BKPiGxxiP@Fg@A%Yht4oZhWapIt4 z2oxs{N`*ji;-EwbUYs~64Fbi9gOVUnoH!^20>z1g5+HbS;-K^g6ekW!en4^JpwtHx zCk{${;Khl9(jHKpI4J1>#fgJb9#EV(DB*z@Ck{$?Kyl)rWCs){4oY=EapIsv2VR^w zD9r)IiGz|HP@Fg@#R0{MgAyEgapIu#1{5a_N^U@L;-J(96ekW!Y~aO-gVGvMoH!_{ z0mX@fQW{X4I4Gfk7bgx%XFze{pkxLVCk{$wKyl)rLP@Fg@X#vHFgHjeyoH!_9ffpwZ zN>@N};-F*&6ekW!RX}m#phN{;oH!^=0mX@fk`z#!I4DH{HBmy@1(b%Mdd2xiKm)V@ z|44r_-anI+;!nn9lW|!**<=yVn0fLpjx;@zx2>I}pm_th)9elIDwBsL1iURQ9C6vu zpqJzg-KhunW322gg}gu&IfF@?r-zdef@)7(HnbZM$8=$UyG$e+%NdO0CCsG39TOT) z!g4Z>X6dF2raWLu1yd53>IFjrihySHpqNbCi6i%UJn2vL`sAjX9dHXXzh&~+KT|OY z8iXXLM6&k)PBW=U_D*D>)>Bd7EpbFoV{gV$U`r&}rY^YahRZY;7+HkJE#lm2uyEEj z2X~+tFl{kfQxVIl$mKM|`j(@$9wJ^35wC}c*JHmB7b@4)SC$g`Esw z;TR`_&ghc?hd3FWpnKo{S05A8M?NJ^iSLi%omA+MzmXB7taN5g_V0ua-AiVGZ3YG{ z&oY<%`>FE(@u!L|>bWCfNwNcvn)rjsq0mRub}wz>@B3F)wlwg32GIkay<@)11-6?x zEh!~{Oa%XVVE4e-PZYq?Z1D+DX@nEq`GW-QRdmlC5>&x>OUQ$-=Q780uZ$$bSadr} z!ny!5!6(Eg&^OzcWX@pG#PrBII6Q&K!#jbG#7`Cw6cQGZS5Q<^rl_c@scTHv)S97< z{A)WBwmd8b*cK?od@=<9DJ~egSw1q44~FiUkIWN-pp6lD!2mbyIf59$0Qc?}`$YOc&m>7HKL1pacnN!c2k^Lo0FICyO^iq; z?Sf{=IMxD&)yOQ~!NJOLWR?Kks2-Umg4HY&*z59GJDA%5Oeh3A{DM~Jz(ebRXL->3 z3J3&;j*J^wbr{-CFnJhSo+S|sO?-lVMmq7(D%sG6B`hY|fLr~9OnVY|tLy`FY*ONW zAF^L^3h37%<3gbKzzJvJ-!%15YBr!KXkEAjm|p6(4R?;Q2V%5_B7wy}>}x zB6se@!`U7Y)Ao2#w&xkMRfPa5{E=)gWKLt)>FDU_gZdwg41~Y~A7~klp5U(p@WBh zP|&!BeK=&GA5wL4%E*>rKPGVMu{Q=CHE2dcg=OpL!VUtLl?C1Rn22wPPbBym;(Q`N z>zln1kl;LH%>`)SsRRW|SQFSEWWV3qOwL<_-j^1%4oldL)iQFmC#@xAK-L>&R{4PjcjdV zrXc5Ws2~`JL4z>?2@!9)ISZHV0InryH4d^a1+sYk85z`Ee?$hyVjRfeX95iv(UI{S zWGV&tAyAOPnBkAez$!5gWRUf-Arm;rdK7SpqacGZ?;nwYrDGh(VAPHcnaDxbr|_U6 z>!Tn8>&ZBfd9Wh$aF7isyr{?qD9F6yLgvMa%*#PGq)b3XHbg<5FfQZ?Sdk}ikY`f( zP?2Y%AoGn2nGY*69|zfpLPAA0LO}+9dT|`*GO&|iyZlHTWMc|HDzY&OGXJ=c`LQDN zbCAs`;KK_g$(f@dgAdbj9Az?AWHJZYf+B#5Y=MF-FfL>PtjGc!WEutX$Nu>Pn}&ic zI4)#CtjK~KWJ`(=DzYUCve3AYg|H$EagePj!l=krD9FO&LKen~EX+Z+rih>-TcaS0 zj0;%=E3(K4vaSvV`Vxgdp3Ayu^|I)=kVUZ~i*k^4DPpL|X!Ww#xRAxLB8zd5sT6Tk zWVCu&d|b%lSdqm!$a<8CsK{vb^2Bi=PsEBmk%O#Hkw8U8tCuClg)D&;S%QOXK!JWo z{m+*lTD>eeE@Vlp$dVjnLy8nCGFrVXH7;Z+tjJOv2V=TV?~zcARAMl?^F0QGFrVXGcIHqtjIDPWOEAil|O$*Myr=6 zj|+J+R^-VXWD5%PEfs%8Myr>nj0<@RR^%xhWEutfBBehgqt(k($Avrrxa@kfM(U`1BoAX6!dsK{vbvf{Xq6|o{K za**{XN~p+a^|I2qkd?3^D{+wZDaxqGX!Wx4xR8~xA}e!{4Jgp_oj)cyDq6iv85c6R z!-nlPB87u&NKrvWMyr=q#)Yhc6h|ii}n-tBwm<6)UnT2ib@MeI3o8PYkqr zS#4a%YFLrgILO8nbyQ@udRcv3$m&>;)j7!K6b)2lw0c=%T*w+&ku^BT7L@6z$Y}NQ z^l>3i$BI0igG{4nq9UW!%bMdt*2Ide$w9WHXrUsb)yrDrLe|2Hti?gLqRc==Myr=+ zj0<@NR^%BRWNV5xDl%HVtUWGdZLG-Jo-y0lE|U?1>2E8>XqO524uBEg2-0Pui-UeM zcf@6a|DU-`AY;7Gu~9A)U~~A#4D=tDi7L!x0vu9fxJ-ai2yQb0rVXwiH@aMHCipCL zn+YD>W&+*{wx0x8apdID0X7p<++|*-TK8#~cR0kh$7S zFd<{Knc&GVn+YoNn8N@VGFO`kCS;5@6Fm5?gprH^Y$mA4V-5pg$XsnEn2<5rOz>ow z%>)&B%wYfwnXAnN6Ea4d37!nInV=$%IShaybG4aZLdIw_!INP&6IA3ehXF8Tt~L`) z$QW%Vcrwgpf{HxmFaU(+DtGZW3-vz$uOG0>SeAr6HLe$Z6h+D!0dn9T$g8LeLCYBRxvjL~L-C&O$esK{vbGFO`kCS;5@ z6FeDaGeJd0tCzXjOfVs1w3*<^Fq;V~GFrXN)n++|*-TK8(duQcHWN(9 z7;PqaGR$Uzii}n-bG4aZLdIw_!INP&6I5ihdYP-u1QRkwn+cu_vzeeGqt(k?Z6=tI zG1^S(+DtGZ zW3-vz$uOG0>SeAr6HLe$Z690tIUx!O!HA!D?e z5Xdl_2`ciK!vGjESDOhYWQ;Zw0^DYTiah2p0EW!fW`YSBqs@c>x0#?Kk2ws0A#=5v zU_!=dGah+Dr&=n+Ym1TD{EGW`YSBqs@c>x0#?Kqt(k?Z6=tIG1^QB zaGMD#GFrXN)nh+Dr&=n+Ym1 zTD{EGW`YSBqs@c>x0#?Kqt(k?Z6=tIG1^QBaGMD#GFrXN)n)xNMw(+DtGZ zW3-tN;5HLfWVCvjtIY%xGDe#T0d6xvMMkTax!O!HA!D?e5a2cwRAjVznXAnN6Ea4d z2?1_1K}ANZm$}+ZFd<{KnGoPM6I5ihdYP-u1QRkwn+XAKGeJd0tCzXjOfVs1w3!g# zHWO52w0fDV%>)xNMwh+DwRWn+YoNn8N@VGFO`kCS;5@6YwVi|NS--ROB&-0Wf5)HWN(9 z7;Pp*xXlC=dCXw|44JFV1QRkwn+XwaGeJcja~J?a=4vy+gpAQ)&B%wYfwnXAnN6Ea4d2@!5HK}8;O z7yv`&YBRxvjL~L7gxgHekjJ)}z>vAxOfVs1w3!g$HWO52w0fDV%>)xNMw(+DtGZW3-tN;WiUgWVCvjtIY%xGDe#T5pFX)xNMw(+DtGZW3-tN;WiUgWVCvjtIY%x zGDe#T5pFXFFJ8TM@^sK{vbGFO`kCS;5@ z6C&JZf{Kh*FLSk-U_!=dGaJ5X!SBzn+Yalj5ZS@+-8D`j8-pmwV7Z-#%MDk!fhs~$Y}L4SDOhYWQ;ZwBHU(z zii}n-bG4aZLdIw_A;N7YsK{vbGFO`kCS;5@6C&JZf{Kh*FLSk-U_!=dGa`z)K)eMHKv5C#=>NUhO`7ahzfb+X z-xvI^mD!m$Z)V;(J3DVP`@651{97ddo3EM3;Wd+LXMx$kuv;Jkzer8|wBRi^zac=e^wX=RD# z;xez#M1q}b*A{q3ds$Vm_3ElHWu&giVKcEz1DgVIdre+?S%KH02u$%W_p`*}HtXT4 zfU6;xpHNqkn$D_KmtT8w_0;Y5doSv7Eajz#N`sd8aLmXtk*+5 zK@Qlv>U+=zs^1zL8?ogATCK)3nAC*a;IB8c!F(l0!Sv0k%AO;Bvfkhy`s}WLRgPeK z9XG6>u>Jtcpp1hBJSl1t?Ar_}0k$2A^7kn^{Vyp}H(cJ&ZE@;QVilE>rsJtF$ z0o6dVJKwFd==tv_u|!!`WVNTZW;JJin%|<{IwP-P^L>++RKHtpGBGkuB2^LSKx0uB zxlAT`V6uM&RX~w$rJt3dXyA&9$b@SgT(bfecag5h3;M@e$e1yc37MQ=T3saz=D|S0 zLIr(01;ODrG64u)RFXG=8j8F=uR42Onb%yVbbGv})I>JE>$&zB^GG}v;h!1d77D*A z1h)Xl8bYvzGC84)J(O`M-FE%Jv>}SLWJOYABTMq~b4@JaOAM6E;gSqWmT*Z9C9q|s z3ELYKX-Qmrcn?X<=i&7pHkHrAdoyerpNAJx*mN9s(BB+)&|e(a{5Qun|HW}F(c?Br z7UkR|S(GzKme&Ew88m`&wnUE`k}b+PBwLhodW4+SC}(T*xJ@JBxJ@JBxJ|mpae+b{ z*BU);Xe=BzG!~8<(mU!m6>L(cOUv!tB`rmvYHaKTucz_d({iey4D})NqV*cW@&?AW zZ^Pl+KrFPrg8;v+pxlnbw}162lXNP{-Wb>d@zD>p&T_X zl%vLla%fyiw@lC;%2Dm19MvAmQSIe|_E3&$59O%#P>yP^5VVJKRC_2#wTCj_UTH!D zv3KYKcFr3JwINzU^JpreaX=}J!$i}7QaV>c!+<{xS3q14Fdku z;SySNDpx{dXsSa~h^mX|6U_kXLSBHaG9qTbHW9O5D3ADUxN%VV@Ygn6!g1P%OE^x4 za0%OWTuwCD93ETDKN~mP`>l7|w zyPn|^wri@xc0FO%F&Ls}9aDHl3mFLKI3e@kN@3%`_EC40wh?k|A0gKce4fe&$2I=V zagBd*+|0i@Zf5kj+6aETMey4_g5MsO zWPy8fx2~J6fJJbz!{T&9f3OCw&u$gW*Kn96uJ?>Tc50t}bJ1+mj$ub82C!2c5i>>{ zGuYuKlf!MRt*fGhz%1FSiqg^%(|U$0bfBoIwQif+#X;JIAvO;OX&HuCyc{G2Apw+# zKj>7}`B@S)E8&R(7{teqpe=#JW60(G%pSd|!0T|+oH>*;gkgpzm?d0m4dsksJYyKo z7{)VFJXnj{-CjpfU0YYlETBZ7RQ17DwRItBa9}lp14ul=8>ZB^;NYkdeZ!P!m6g== zFo9}A_CdfZEFN!aD%)adB7Aw4?D&lkHJL|BYK%^2ft$A(Y8=UESZ{GozeV9W3T_&{sCg-mxs1$W$c9S)7HPGQ`fDQ=L;WN`NyecvvUoM|jLVr{cC*PiCRU`wGD)`IBq#BbQn2=;hvN5T~WCtds1;Q|?#$*R3B!wt}9&;+ZFsyN< z+B^j=vK(d1mU>*yd@k$vxJ<=dw!)KV%U_8t*m$$YW)C1USPUR*6v7g03Ht!p3NO$C zF8=lTNo)OV@_awblm`|s!$##~Y%r+`0A&7HRx!3}EGr)yv@5WEaLCx1iK8< zF=;^Il++A#IovRz!E~o$NE|##!?s4UPS+P^y^?CI3n{+^7C`w4UY|>sz%_)=8H*e0 zxrX}4hOoPmodON@32J9*X+NBQ>D24ZbLvygEPL0$!FuC>!C8Yc2N|;L6Q<9poIXLD z502tAX)P0G&aRwTIbpmOu(h5E<>TjRT{C7^Oqe-#M)}O~+KDq}YMuE$Tb|b9F>9Ot zn=o7GpItd)y4Eyxs@8)Tv!L%;6K2kxFut#G zaHf8cZs34H#wLJ|4&$J7HY; zoLLjJvnwj0g3>mA#)Mhg=`&_)XUz$~h_kV6Kdsg|efET@TA(dN1P)SCQxI3=a`K;u zj@sc!b``te+}_YG$I#MO&pv#|^Z8F)S=aHNi~8(v6~it^mm-&|SiXEROL7YHEkSi1 zUQ{risR0r_-og^g+{G@unU&Nm%V6@{7GCj$bON10*&NbY1{UNbyN5l`21+mJPt?U; zmzgQ4$yZoirtq971EO$F9K>eXVcv)T)OKbOSwx83&Rj>XgZa$PTu-j2}|O`Ux`K1*3>icR9X%V1mDnE(k8MrLPbli7q(bRi7Rv^toOIrJpces1gzY+E~{ zC0fFCv@<~xq}Tn5{R&2gExPBp3&R7b6kHoMn`~#kA>R;&=|Z%K*4O9qgwbG6k+MbU z$R^n^zMXLsH`2k-8NZ9yog3Z_RPyM_ENf@VNjdb2UFN9a_UjAr#>h*m9d4h6s1)BH z_zkxvHCU8G;+2s&xY!tyq0w;riApTPmQ}q1)TIOw>-hT)NO}KnL_vTG1na|KbtKpj z25Te1#xPhH0&BA4kyTjx_{wx-y-UFaZbgy^mV?Q4c!8)eQc&MNRA#WOukREp%dl*y zPYIRfST=5;tx9U_EsA{}Q%DXf8Mk~=b0Qw0Vt0e-#F03r8mE-C2+g|>|3(4|E>B1!m@&iM;y3`-GL3~TEVhnHl3Ui5h@x z`36v1U(h~iRd7Q9xdcTE{7g=|3gv+c;7U*jV&_ZGL7j}2=)l;f-kuT6;<~|xs2tkx z8?MAR3_uAK7a{<$>hm?hpx6YY*-(#(j2;1I4)RWJjP`tbq> zyQD~HptK^NuK-)+DljuN)HwOiH{PI$_rMKDUQ%Pe+3PIeZjKm$;b###36`a1u?BE% z`rp5Mokui|wsa*F%u}ph>vii3lD?6z!7KaC3YfpjSef1J)Nxq_Wc4d4Gy$@C0mQ@V zP(}|XgcU)v0?0ITtysHT&v&4LEZ;$j-JPcoAQo1KG8B@BRkRBO-$k0;ZQ#4mK$h>K zHQ*Vbr2)DyU>7ulT^O(n1MR}dchT1FHu7Dxhb-SkC%`j810!@{#4czCyD(xGM%qOt z-$fU@JCpCC8)W$|dIDZ1G{}T5GO-Jq!7ehfi%i-@7T?81c6S!vMIXrWUGxXMENGAg zU1VVwG=p7aVHa6=3n^1tEhb-DpO&x%C}$f5e{p=7yC$(JESE5@LZ6Okdf4)F>`X~l zEH$PCZ27)iXTG(#DN~VW%`elmv=!&rNx)XjRhRTce2uCQf_+Q_SX&%}u}COT>)@i1 zP{OX15IZzM95F8$OITpYAna6094fCRN3Vp$fQb>4OiZ#c8K5L;ORgnHNir-RgB409 zcrJxjt(^rXhZ2%JNE`-8@(fCn9S>_c)089pAG6<8wN==Hzo(GaxybKjlK{S?l zD?~jR6fV|O1dwz;3NeVA0gbR`!G|G#Fl}uGt6tzN@cQQYD+peLaeiFZbPl$~s$fdh zJeJ{VU}2g}mpe4kXPVs$Vb$7!k+jFlZ{ zwdDI`VSa)gRIbY*sp;@V8P{i1Qld?gcLw9 z;=smK4VxMouqz=MVNQ&c6CaLfWRqZUFPBY*!F|}b5eLtteH(G`Oxm}R4xXtogI{~R zO;YD2iejKb#SH#~$$(}I0al692&&N)K%aO)QPNutW`dfV)^O^A5G{dwElRgOHKaml zQjQQ*5l$?6%?K7qFf>DgAw+@!NH8D?G{ci%08$+W7F^SaczFiQ;6K2l86M9lB$c}> zqMDi`)g~g<79!QaNz2#_shJ^CGl7ImB!Oml5;BD(_(Ib1HAjL^M1n6wf)T>!Rxc=Q zMFnrc6}FV5xsZQkdC9A!M7R>28O$scXyi6b&FQi0I%SBwd2+Q$M;eaRBd{v>z6JBG*G5kii67OfM zjDI$5xcu^dxD>-%0QB9m%%y#vWpt$OI^75bVt4@J12wMQ1OKP1R{rvvJ>IjLHGpT6W$97?^USa z8JE7Z!?B|XzZZgtuyo^IEy1-VkH~O{2~mjfSjT-`DFRW(Atpy5x=hZz@G~#pqntx* z5sBEz={C5zeKbNkg04UuMWn$FDVqcbdDOVR_nP27O?TR4bf?B?wZU^{HoTs{XoMOI z#GT{QF>WX9)wtc5STV_gmzn?ui5n9uCLW&-or zWo7h@Eln^59(EXLkusZAOeKVCOLO$4Dvi#YlV^urTH;?&>Gv;~2fYxyPG;et7r0Jg z;fxx%PG#W~6+b)~J6d>wO1aW)F3d?)vT^j0WhItiePQvHaaqRcb@N$Sj>+repmLmh zxU2#?@deXvqMTJwP8+b3U^=XJzJZ5QL!m@QfyK zjPiVf5rp^zZHM>-3kmTF*$|)5N3(q9s*$>@f)+J!q(J(xQLq;>mI5?qQ<||)sKQZ@ zILc-`c3GdR;&3&9s}YWKZR$stUMqu%Mq4s?B zmbhR$D%hcb1-p1*vShS6ldl~EwNy8JW7MawzEw~|+oI;EQgD64$s3-JN4Y&tE1f1_ zPW6HN;RT*hxsskM!9_EoRhixAf^Z4iAiOk3ZBURb=S&jxspGQ9B%f6RRL?DS0T^f9OxUMXV?`1I{=Q68{`DX z3l3TUxHg=LNC4*zG>`z!I%p*Ugrn&M5DD!kfaIYChkDaPZ?ML7!9VED9v9Ia-&h}N ztPeHTgGYrdj~`PX8dG1NE~W!^gE(fuRB;M}|0x%!2gv&ZC>%5}$Y2!9tP7wt;2+KS z&=vzI6m&tlzQw9=uP|5fy;5#ai;=zRL%r%lz0wT!3M_HG>O;N4lMqL$jLIGCFa%KY z0DVb~m34t&`FTN;lL)?_LzJ*jK_dz@z8pNwUsfU*Gzg00vS=Js4?2V`z=T?^F4&<8 z*+PFtJ`oMI0g+xz>n}p_Q)p0ATSqI%Y0Wo?mi&RpDQ}0A7VG)ffMBGeMLvDVsjy%O7u*FAHBe}(ftkYjd-L&sebUA?ATIoH zjfV?7R5eW6xXcSp+PEadbs#SDaFvG=<|plls!;2HHEF}kDlQ!^^r~=q2V>xB5M=#V zCT%0G1#!K|^(Di;IK9#vKr@pzu6DtI4Y+PyqC2Ln{i+zRgeF0i3_l^u=>H8d9j2s5v}jh&YF%0fq(-&EZi5 zg=brE{NJ6!(cb86i$)llZ4H?5p=pL@+wdH22>1F&b2wUFsMqiuZVdG*p2J~_C}Ivr zvkU>~9FF$+-<`wp_aw1Dhl7LuhvsnC_qI`9FZVdDAgK_xl^&2X?moQ739 zeQ=W=r=`bfT%<^k)7-Oo)KW}(oR%J^rN?P_`2B-DP<$Ga9;a~=StC78|LdL5sHa!y zak^Mw>PO6f5L@T2Y~Xv+{3i%Y#GTfb!ME~i_&21pcft__kjGyal%&J)FMtA6 zuogDKZOYHPp$U>b%IP)3Sugw;aPAMPwGgoyuoW*I?x!7`7~v>c_~n7-0+x=6Vg8PE zY!T8Kkp{K{2kpX%0IWR1b{q+u?Fg+VF=RCLCj3c8NTbbZIoR$dPAv>~0m}(nKnNe~ zCJf`O!U+ec{H|3j`dfUrM847CsIi2p;%z3A*7BAl4@5$FOEROZGC5f_{jw=V^FNc7 z=?`ROlF9y#jl@MtgM_5fEfN}*5rsy2TNWpyxCnc?fW2*J&EJw_7RoGAIs-WA#Q!s- zW0K4Nj-7Rnkd9Lg{xy)3PSXzpQ{d;Qe{>%+C4{D=^*Qm)-N)e06P~B)&5F=1>#yJ5 zR1qC=lU9M^4<@a}e?~yOp-@o_;zXg0Fq8{h6efk@PuNPNCt43;Uf;7)lB%ukQTpxM>oOIb-({`8u`3h zz$)#&g4{?@5rAMzM)U~VwYf)F*r34nc!4&-i~s1+1%6}B;mRp4-(PrzQhpj2v)QSi2{4sbs`NWl5^h>_RACsoo~D zyBN;9bz3dm#S0gP^df4A9YMBWDCy*OS-gyx2VZyisQ_C9(=Q#R>vt;SW5(*RdM#6I&%U$yS|_ z6B2xAixx9EiO`}e8MqBg=)&c85OO<+V~<;8Q1X!d0qRrSX0R&Z!r`u@#(9m^h2Q?c;3C|QTozv*QNf2%e0X|$ zIu_xGc8A>!x1t0*HC~fUR|0VRKp-6K=cW;BB^<-Yz*`pZeH#m#t@OIBUbwhCd2rsL z(qbuav1$Zb;NwC7w6F>&JXbE;9xhN~;9|}LOep2R z7m3_h2j5!6It5&y4&&2Mr&7Xq21cecEY)SIgq&E017xd5E6?85(gZ11qbu_ z^5DFFFMQ1szN56k}lmC{0+Wkn*4oUUBimYkdG%-*I&*Et7BG&0XZp9AI2}3(KN+BhBSGoM zC`@ro0M2Y~2oN#zaQ06(5NJ>MHCI&;02$A&! zXK*lZ{1kd7s*?m$(Y#qgQwCJDw}EZcSmC=Lh?rQ5?gx+n`x~#q@t|z3b&FrWU=PrxX-Nz{+Xk`tFe|P!dql*dDfi zLRd|-Hk5;y>RlXP{BTXgB8lsB6e5C+lwPhEP9h<4*}Xg={GgmD8+d+zM9?5$cLI^2Ohoih6GWM4T6psd zUCIE?{9sNcH5m>ae&deb8R275-a`279inhG{K|$A*YK+XnYf1EqLhnk_`NuVxF-Cf zhKPdjOA4ZzaDYClX2fdz1YPKvmXYrE(%nAt_AA}(rMrC|w^Rw;$(zs|e&=ovcVt*AGq_%^D5*iL=I;Drtmak$Vyxy?1Y)e_RtI9N=2i+~tmak? zVyxy?5K&kc=FYXj0J}E^18jS&fVB|!dOm#bQ(6m2J0H@{hqUt{?R-c(A9RC&G;P&L zJ0BPP&c_A1Rx#pQ#mI#TxtHr{m=KpPhVV9yOxnhgwsE9w94Tlc1#P6D4UMcxOP7C8 z(B=YNx@6+gC6imaa2rl^>0-GamM-C47isAt?Yc<2F4C@xwCf`6x=6b&|G4)}E{vs1 zNzI7muqc7AW8+Uf;A70veu}i8BJHP0`zg|XinO01?Wg?HUV^4fGKTK(j`n(a+5TT2n*(J`gsHf*1r{sk>pfB{dz~ z&@-IZ58s9{?N_OkWrc9m_XEl@ug}E7apPWH8J-_bzdH{{_Lq4xX*r&QKsk$+6S%Tw zK$+VIhr;)-aKg2Mr@-fSmHD`GT!^_mw?*f5yPRe?p1nfTv#iLJ%arzSuDZwxbrlVe zxYhRbCZ4c|k{VkY_QKKMBatvjxF@wGo8}~L;v!B`MskUTc;Tae9Bc3zlGE+=F-{A7 zm!2tEltfFwtyigOi(JDQ^HA^ym34l$v4Q_oj?!uIc(GeMem)TX3ti_CO`ft0DoJp- z)9Q1tKtxvNbX(0_RsmVZN(xPYY+eAdusW1+z>%3)0qub#t`X~WTln@W$nxz|APemQ z3#&sJuDvC%0mpzZYB_U!q=BX9PkTne$<&@vqtvdr{tBVwK@J6G1H*3Nq=0#^%V|-< zSALxNP7*Lf2>}{4>WGlv_LYSe}K7F{I;$s#~{4y1?x890zK0%WY@`m_l8^jdO-eF8|> zCxC=~0toty2QpnUO&7R0Wx;r$mJoVjxQmRt!1oWVEV!b91pC$jgF04@4I!teIVa={ zG-u&*aLhQO)n5u|aPGdt%@W8JhI3A*vw(xSTsE@>59KGAfeYfm1rgxlwYvexz{MNv zyt>M5F}dOGIjx}!Qy%PBSK4G0cmgM~BHj@w;vIov-VM#_ zokATfBhtIUM0sZ-^ez|h4k%*1Q=pJ{3Ka5AfkNIXP{=z43VEkMA@3B}4DZeA-N5Nx zCgz>fyDWltg^+g?ve4!Y2o&*-KoRc<6!DHg5$^~T@s2UrMxR5 zc#jwIZiRtFydzM=I|4<#BT&RU0!6$dP{ca|MZ6?@A%>=v+d* z8xbht9f2a=5h&svfg;`!DB>M~BHj_$4DZeQyOHzv1TpWNzb8cSo+#uUolC?!0!6$d zP{ca|MZ6OuE$7FUssN+NO-D>T9d&X2Oj`x2I{6QWTHCs4si?WNwkGr z*n+MdL@l^=25q4bwPdLQPfg0GN9Q%vtu;xVX=(=p;jEl}Iy7Su9miv(c{Iwy)+ zaPuc^p%k@fmJd3=aC{_+S|G*ZF`D>*wR$w?)M~{oC?A09wqbV!dbKHCHkS=Pdk3Fx zg0HPdt^IpdVO@k}xEyYs*XPm^?!n9s4}L6sDKFR@q8{TK!Pz_%y`TPFaaTPIB$4*)Snj}DMb z5hP0l86biT6hQ{T!*h+}68d#_KIE0hhneFJKyCGVlC;fbo^W zA{hWlCqm-3PZ%ZaGWb$Eux*zn(v1*8)P!*PBfnvO9(>r*STvi{;EXN^Oh0B*?=CaB>$Ob?hW`qUcLyZXF>eK+Ta9IsNEr@187>{OY zz~1T|Y%r@1c3$}It+aa^wzIO>y)6Jw(T9J7hPFUbHHBb9YkgiEH1zr0IUHS1+R%y( zowT7f+|UXmx}hs8Hgwi^4R+?*5e^yo$wBH|n4vh}sB}R11R0D=L9mPBa+wJw2D&R* z)EUdEM4M;v`rrf5?JXYLNG;^OTB7w@TvlyKwZ&t$66~0Dlq_mXOGN8{4FJSH6G2nL&~U>SM6B_Wudz=3e10~-YU@Y-MBd37E3 z!>mPc5|P0tCTSTaGG-3K8c4k%*r9Gg6|x22tK_b*1;XOJ2pO(Vfeg|Fonu?zV*~Dq z6~tLQqjTt26m?{MuHttI><`;Ilwt;jG%77g#xiN~kg!_h1vf`YLz)6UZQ6kK8z^7! z{ZL)laY0friQ<+TOiZxNh$R{PD^r(Ln|%4Bh}-RS!N0tcMZIa+GZGZ+vE=)-KzD&Q zC(mTp!Va88Tj2KPYrP(?TdNt-yUgl!!6t3fS0IDA?dvL1(^>Vs=ieXJZouRD4c%@~ zEAMROU2kp&>`mrA4w({`e;g}oWa@2gf}MB*8foU>^)A1c4$ca6>@?0|hx=pU;(}4}md{Ov1LK*Ii$b7VN=wAy>i}dXymSBnPmg zWe9++zy`e5+tk5i4pY(KLw~iV1YP_GE#t7QAx$ag_LxIMv2kGvaKr$L4m&kKrvVfp zSCG*W4D}W^n8b|`4<8V$w-QGUx$eF{Jt#`oJJ~?&jId{^B-H9I* z#2Gbc;=eU07y`AQ4Xtk6cVcJv{HM|id>bdp_QG^DI;V2-lu-SqsoSTF^J(l)z5b1M zsJ!BE15OK2&zZg^9(VW|b%Bx#SHNCpNsU=qX!5`ZkGSAM9PUX&bb&NLVt}1$+-%1g zCcX?lzz7?vadaPDX)ess;cddsoRgiCDV1H7Bm-_L0M-k@>UkvCvCdnNXM?3mi`q3_ zAM9Yt8nA=~(_>OXV#dURiB(CoaIs-N z2NOFc4yC%li96~@mMJxnjqggTfyxzFgpF2@3E1yzapys_2)S>e+D|x+l`s#{fI(^t zHtG6!634(j6KL*StS z5|bvC3UL94g{h_;6(`p&#Xk==^N=hQi%HYI3>=hM0ekTPE33i8Ki41dV?&;jrl1f{ zi7bK=^Y2n(j-UjvphI&6C1&kDvswfD(HICH6ld*sy?*%Ex+TX>{4}_TS*92g zWl2xOYQVf^xTh$hT~&qZx5mcC3SoO(J7Ienwoym7w??=BrMdR-xq8}Oj_tLP?FSVB z-7=2u#uVYW7#eP(J5Y(uxz-w!q6jGGTb_{rdz1@%0NNva_%~>e>cOe-6j|N!kko;O zf1`&gWMXppg7QdihI(ML0K&WM5`Vx0RQbzcp;WE{S<>ithhWC)avEWT@ofGoE{_pr zxOJ2JPLVcVuhn{{P!?W8u&FgFvXGJC9fJNhkFeD&&iPT*^6LL=wbJ5jh75iTyfi}w zqXc+0R{qDTm9TrKPwR?1N=?GxMhFeVuuRekxn>|>mf=pW$zscgN8B!}EndhlLCtDc zQGvG#@1?LoMjBAQ4ai*s_O0}Jy{5D@CM_k79Zzql{M&i}hg)q*im(F9mxmBLu>{M- zp>jvA>iv(tPPc0 za^*ImvW6?Chsx<(IXP5LgVirE4!64hKN*Kx&HtZ_!&LwOALE+r1h>^v#w@R3mGG=* zf-CXZMtR|?@H)rX0@qde1GD|Cl9ZRESFqVvmP6KObGenUm##}qU==tA&B6jg#};@k zWw^WC>fS4}RlT>_?|T02K=BoWz1S!AH&$a!MI6QQDXanq3}Av2695Qy!&m5#5~tIO zR|Q=4a8<(909O@UjY`-R)HOHMa;#v94cpSJ0x23=XJWy}AyEL3GUM z5t)Jvh>IX2Vg}gwWk?=8#57C^rq|Y0Vziu%fVHlo^$e*3mUKytNqA|P5?MlKb;vB8 zibI8lDeCMt{qRLpi(98tLIx&p+^n-&7*tLLykZM7Q#7F9Dqss0R)khdS_+e{D|ITGF!;@gko9cXcgCuosdTGEL zAtt&Ah3F-PpfSddLJX2ZVoM=LNg=VNkW5J-v89kKNg=VNkO7iHVoMz|Wh+c|^z>zUA zwEeD^;vq4n5GfuKV+xVtAu*;9DIOAI3X$R=F{ThH9ui{;k>VjSrVuF}5@QOH;vq4n z5GfuKV+xVtAu*;9DIOAI3X$R=F{ThH9ui{;k>Vk-r4WM@4~a2_Nb!&uQ-~A~i7|yp z@sJo&h`#AJhIqc(KjSxs`U~(khI;-thNuw!9wI5^fBB=&NQLnC5J@4iq7eQbA}J(R z6vD^UC56O_Lim`vq>xxq2p?0I6cQ^6;bZEOLSjWBd`w+ZNUSJ?kEu%vi4}$LF?C5H zv7!(@rYF1~#6$E_JS4^xBE>^uOd(P{B*qjX#Y19DAyPaf#uOsOLt;!JQamKa6e7h#VoV`Y zJS4^xBE>^uOd(P{B*qjX#Y19DAyPaf#uOsOLt;xIq2Cxv@sJpahZv-INQ`-i6c33p zg-G#`7*dF#={JV5f6Q+T4Hw{V3=RBm3{fHcJw#H-|MI3DsSy4iA}J(R6vE#_B!$F^ zLim`vq>xxq2p?0I6cQ^6;bZEOLSjWBd`w+ZNUSJ?kEu%vi4}$LF?C5Hv7!(@rY#_B=j3YNg=VK5GfuK z0};cBcu43shLVTGiib$?kQnn2DIOAI3X$R=F{ThH9ui{;k>VjSrVuF}5@QOH;vq4n z5GfuKV+xVtAu*;9DIOAI3X$R=F{ThH9ui{;k>Vk-rI65X45i)P7}@O&{l-vINUSJC z`h7@@O<7VrB!(1XZ2FC%{2%ihL*oVb8$%=i8$(nGA5)hU^1r-?L@I>8he!&E6@~Ek z5J@4iq7Xi&E-55d6vD^UC56O_Lim`vq>xxq2p?0I6cQ^6;bZEOLSjWBd`w+ZNUSJ? zkEu%vi4}$LF?C5Hv7!(@rY)cu0&XM2d&Rm_np@NQ@~&iigCQLZo;|Y$+u48$)TgH%4}QL%%VU z6cQ^6k$xW%V^fwC4~YeZG~$2BOKx^Nn{%=09`@dgwm(+UzuN;cGO7zXw@*vjc)eEN zt6D;2#m;=6EsuBuv+}2DwOSb=1R#0oiD_E3Q&rkuUgkBIxh+ne!)9@oRJ(G#dKsI| zDoPf$#k|~Qvv?JrQC7XG!0obP&Y;q?F7x_KB$!l(wQO7in^do8U=vHK9eRtGw16?H z@gJ)$S!9bxnA~D6D$+Wfwlc=y^kQO%#AC$-ibU@4xXYA|B23KIGNr}rDbl(S-G%5b zM0X*&i$ixIx(m@=h^}7oGZW2X0_z!BnCV1J*ZNNq8eoxsGup=%i=c}us5qRn8dT+z%~X`(WY@o zn!;f9*T2dHuYHvod@!Sy4gy1QNTC6POI~Jb>(B+z7Xs)oc6iMD`=_FT@eqkHEhWM`S+&|3Vy*{RsREaiZ;qeos7V#-<;%7D1xz2XUh1gOF(Z zK}fWG5E5-a2#J;tLZa;lA<^c6iMDh{%7vhNIBk(W85y?m3Ux*`;kHEhGN8n!wiS{pqh~y*i zFT@eaN8n$GBa)B6zYs?xAAx@%jz~TN|3Vy*d<6c5I3oE7{EMEY6Xi|xFc%RdT0V#q z?OzCqmJdRr{R<({@$w%N{h$E7Zz`p=T;9m$4 z$w%N{h$FHefqx;6$bJO=g*YPn5%?G4i0nt;Ux*{JAAx@%j>vul{)ISTKSA43{#h(r z{47=@cplNSLWn^GF^V9WB1o19GC%|wD1r=Zls|aEfL2`r;@HK%n zz}JKjk$k|{gg7GkfUgO0MDhV&6XJ;E1HLB25y=O9O^73s5BQo8M_^~Vh$FHefqx;6$bJO=g*YPn5%?G4i0nt;Ux*{JAAx@%PPF~N zdQ#wD2#J;tLZa;lA<^_^~Vh$FHefqx;6$bJO=g*YPn5%?G4i0nt;Ux*{JAAx@%j>vul z{)ITv_5-U&fqx++T0RJgwjYE<%LgIR_JfdU`5+|Peh?BZAB05P4??2lgOF(ZK}fWG z5E5-a2#J;tLZa;lAtLz*{0ndd{)G^cd<6c5I3oE7{0nhJ@)7tK;)vuU@Gry>$w%N{ zh$E7Zz`qbjBp-o)0gk}G5F)Z4fqx;6$bJO=g*YPn5%?G4i0nt;Ux*{JAAx@%j>vul z{)IRq`w{pT;(+}G7KdVP5VqBYN(_OLK2(Cx8WauTq8y9HpiL2us9_Zs#)G&q?FCEF z3xx4Pb=V8U?!rar1;TZq&>-JcBZ&wR_73)}o50G0ZD}ku;Kz$;X=y(it%a~ETU{TI z!B2m~1PEtpbPlftBDGyH&X1u;NQr;FrV1jS5c*^rYwP^1lFaloG*D?PQ)^4h>~5Q; zO+Zs0?SeFO}LUvk@=DuD~&5F z%OI4UY_hnWI-Sl!G>J6E-N2@3tZ`*P4+&7TAzIt?*%M|~PM@Tu&=S4UY0WE3Q^0st z3#e2fDw@>Th*@*hd=8>U$TCD^NCRFl7GB`>C5bx)C@Ikghu47?p$E2+u#0DxBB!@b zCVo1Cd7htD6Iv~hG-{B-8ykN(Gt#zXch7>l8GAO5C@uT;wFeSNWd=FdijZ{K*>CPi zAJOBROV50G?4`8K{+UWb24@i2y5js(n!%&ZcTPWAb!3fvUj|{wWgv29iw;u!&z$rN zIX}1Sb$iRZ&l}!q|EB|bkKX>n(;t4@|MXXrK3@23V|mXXTU!;a&#%4Go&Ip|M^>g4 zj_j{^Z^x(0e%bwax>eDtUF+>PJzN@JT~K}5@m(*O-+t#U^)K^&dA@CntG3U&;?ja2 z2TpKZw&_f5_W`@NwoI#hV|v_cA5J@caErZv`TajF8uEzuwIMftSCiCn=;HI5oB?T{ z%|E{9Dff=6uCMO6?d{T&4_Imq&uyK4_ookB?ObYD_iE|E9}nv1G#;9~V_i*h@bk?d z?tiZL7j4dGm!5mBqQ^7UwGVu@C3k;ydZzq?sT&)X9UYqR!^y)>O>D8{mnFG-Up}#> zrq$8Y-A;RSGwyHo9NXAu__*s3;g{OkMlzt^j!Nid*EXGqy9(}23Q-jx zJNJ)ib>;aM)wkqtUNkbnRO+gml309n>E#9Uw|`OO9eU09L9;(QlT*8=?@X*q@-FL;OKALdfb??nMHLN$;sk-alA>OoKo_ppB-~5549~HDo zzD}O}-6dxxebjT=Rph6BwY^$R9kOnp?&*7;7|?&$kp;&V&l&yJyUr7r?cR0qG{t_? z5@$}&8`^w(|DZ!j+kQORI%AFex;bB6(Xppvv+IpXZ@qu`yX=={O_?v7WGtvS-Q%`R zJ=S!q{i>UG(=Dqq=UltH-%vI_{<@iU*DW62_p-Zh$!E_@+;n==)CUWfD7)OSVnnBT z>pwqpQMu#$lv8DXb?M-fpB{hdT-o(U0~-yyzx(>-cQ=ju=>3s1&P_km_}R3&v)OIi zPA*>!QotJ;; zzO(O-9&&vj!?#;}3)Up}(|uOf>&e<22VSA$?eB}yKmGJ z_Zwy{_#sO%=OJz1R?l8B{Lb-Td>#MF@bzC6^!@m`nX1tv5-RR~M!jnAMD;!1zP;Ys zaBkV07g8P^xM=(NXOr8X8KF0H`@Czv8q<_vNAI>)-ZbNeC)<1x|M&~%uDsef?uj#X zpTE5G)O#P;Cak#fW5w~>QQh*gPK@s}u6*5ugb^#h95ZY3kLA8MPWG677PUEcV*B{f^9O(O_1h14s}{Yg+;c*BLb0~fyc_!H-rzcg&;fZTU$&$irp z(~GY!d8+K$_3tGqdKd5cao!UNH=ovhJGaLg*O*{)ce*A+qYY1?YzJL zy)Vuja)`-%=sW9M9{t($pAL^+rgVRkGnKS``{DzZcA)j zcH@WU83hB|-FkeMwNsDm78AF={K)s(*S@~u>bAb8{U7hTJZsRT5uI;Z{K%oa-rp>? zzw^LZ_r&-XKPLq{z5ZpD^@;tLeRiPg$(g2&TaGU<&W|q`ebt!wg=3d)H5SfKIrGb1 zH(XPpEqT`ahU)t|#i={Sk+wgW{2vbKH~QX^X^s1K)jqhCxo2|Am&sGNj-FGMzjOKB ziH9z$Ih1$%=&sv6@87ZV)dRhmsdwI3^u(>_@@h5>{i@H^v-b4)YRQac=Q{7pm{9y) z(J#)+w>`4rRQ79^Dy}=3n|t8h-rdZXuljB3jc*03pVf~1iD}5({l<`|-deY3%aGjz zzul3bf5CpP-EEzIoOcr5Seu^eJGu7MeFtyaa;)(!?^`p^k1g1qux#5fm2DB@`}K`; z8;|U5soD8V-I6C14^~{{z5MKwu4A*lpWN+Q`Q67Jf9vP@y6aynee$9mWBq5?yn@~@ zJpIel-A1&%YiH#Zx9;?2HMH;d*juKuoSxY8Tlv)xNUb#dD8cHgI^yZyqy$_584z zci*>sVdW*?q@?$9j+}d@^Vqbnraz-xes=bRqtB#fpTDN>kW1e9^nLgIuhw3B!?=>{ z!P8qCllPG2!&;18@cOb}PIP?gxk(8}-raT2xSi`u%GRCS-%#;Rm&3|;wmObH+C%a7 zoi|$EGVba!{=Uca=at@j?Edb>*RN~)VpZ2QWBSfG`RTpp&!)~jxaWm_o$nrB(&vGT z+WqkUx!cxiZ{0id%*G*E3de}tE?cWJFTHZ_4c=ZxqaR}vcoU9`zStW8Nd4D!yWIqYH`fL90hU+5jkDX6< z-MDhjGgrx+XNP?8_T&w%?s>Il>EoRaCRHqa>xUx?D^N_=QrMv za@WC6)@^-iX0ZNn@zM=thux=5zRM=A-1X{!9scJJZgVu;bE^1}J8H&XcBJy*2m2Q` z)ZG87YeD|KFAgcWqsXD_e&E};4^FH+_FHyxoAcV6znSnwT*7EW)hl;DKPBbeS04Ge z^N4Fl{CuEZn|RF=Pr%(umhf9j+B++jz2Wzq{Bia9+uxa-JlIGEK2UV@$EDMTx{vv~ ze17oI(YwDn?zGPNbn+^)|H<(Q(|5S{-`;K7+RWM4-e$aY%Zrb_I7#=>*h$`<&$jD1 z_r(Plj~V+}k3FwA5}sOdqh`ePWqs{w>z{4x-0~A;m!BUkv+a&o-8muiq8AoqTzu~) z=eXyGXt#{$@zBVsUk7Bq-QGC9y>G&E{%dp(t$XV7rT0%-Yu!I;-+NcQ_@+ZP;MTDl zW))xKyYz<2xMRTyfo@9OwkNur`?7mhjq%&p{3Q?NC){w%^j%%sy~W0d)E&mJF5llT z?TuU3{L=5CBjy1W7wtXNX8NY>1;G)AHmTF!?6OSW`O&W9&UT)^|Ni{@nX5Ohz31$b z1B2UqzU2x2dXx z;-xpgn)qB?Znv|&H1Y4$EO^GAwtvN!`+q&Mw&goIMdL>0?im9zPj+EC-PF?Yllm6d z#>;XmSF=A2_+Ya6ov&AYLRse>JOe-`o}p zAHJH)KPh=q_T2;T*0_%z zy1H%LV1MGiPX^90?bcVVk8lWs`)`I*jNKD;IO%Fb8aIJx4Moa@hA@!5Xm z(~i#L2QNRgWx#XC6MHNkKCJdJMVrN~Zu_(#v8wT|57y4;_fYAkV(aIDRqHx-eZXR= zpR#86;HSU6@}8&W{d#x975#nhPTzd8&#pCwyjhzcCZ&OzpH6)E!XxVa%hcPiyyX1m zhu^#Sz}ZEGV}kAH*yauSb^pkUm7k^FZdUAcy`1uL-#4_`3%{SDxvK3`BNMJ&d~2V} zrVZ@(%#C+G`k?cj@+0FGeE(C@hNr%4AnEg#r?oyl)>PZ>>(dW?_qy!O7ME*Ir9Sb* zOL?b`et22HJm-glJ8asMmy{o^c;efsoi-JJJN&o6liPkeAY0nz4WIpP>$c9%AGqcC z{SUmfyQJOZgj3(lC>{3eub2N+`{VLU$9CSn?C8&z-2eHSMbDPp@~V9Js?kQr%NLFL zwnyKOww*L=uxzn?HhO#2Fyq}nJ3VJ-rycEh%bA{Ov#x2Gab&mihr0O{uV2z_%G`@C z?QIC${aO4Id$y=nKi+law)UD!dt0m54=q{#{9O-z|LLx+!#dA-ApVlub?09Sd@%45 zR(>t$E9+IJ$~G_A$P1z+@Bb;&Nf;;kMpUYdJSm-5PGn4t zwJy85zyCUCyYI@FQ_n8zap}|DpTFp_cfMS8+YslzLv50JKD+1HN9t-hbHJ^&ZQkZ)9k`2P2V>sx%}l#C$D|= zDkkyOyOj2l%egyLlX}_{F1>5Q%7Ya{FZw(?<*GUTH-CKm z*Ywhdt{+?Ly{wa_N3T~G&6~PSslMssr|+!U-gEKs?Nir3zW;DT^}fSn-}q$h3!nd3 zv#0&aC8u6Jan0Pv?s%uqmF<4i-&bAs>#whzYMD7|@63CynfcPfWsa_^PfS*p9bWw1 zruM1x>RLSSxZ+&rZ)df=PcC~tVeznSE$&SG{?w`}^Bq--H{6=E@6~N7h9@5$l5imH z$)a0t-7~W5(~X_GAHTK>bNy|-zU*+Xz4IkcPhPwDnlZPyul-`z!Flm%%+_toU;g;r z_1Oo1IO@8j`0j~cKjrJ4)#sCOpWJtOPV)X)m8&MJ%}1}ksygl|{l{N4T)L@$n-1qo z_l|YHe9_TwMxCnvVvc-=Z^}_R{hJ9qW8OQx}b zCT`|IMK2hoRuNY}gLrsu99LY)^28n_0^GG0Y|S(dG^)2AamvzZ#AMzxprqWDqouPe zYeDLM6K4keE={b(&YtFa$bizHE_LHyr*(zi4Q!Y|{j^R6nWZnn`zxSgnAquK_an2As=sz!e=i*i_4=>LjdgM>udQca?K{W)N$E6 z`5asexW0SNwQ*YMxArh8)OPWZJe@XE;gurorsan5XKEAKW^dUdAeVN4o^P+H7QplK zbu|Bs>%F5t(`ct#8CUofO0#=~dk>l%lAOupL5Q&M$Y9el8nly!I9j(jSJ-K67Z;Kt z3a|a6Z-?jwkQ(~eIh;tCO97VQJs8z#c*RwaRy z#8ZVjF8kptGOu-w%T(2>=(l^@SQLod42)v+kMT$6m+RGKyZarq;5(kVaYA&+Y5gjn=kGT%sss&supVtt1K3Vmm`U(HX5yI7^L#k zGztl*T3hasz6r!cuak%gU3&$>QCty#@unt53t+wv{w6QuZKK8Q-^!Qj?)j|-Q$hmT zEKAW&w7WJYNe8Jf6{3cUPNZXNFXaL@rseqpHwd8h41os=b94c04E3EQFj2zh#~%}m z5BY8qzw0dhx?7y}Wc z#sg^|2YJJ}VeSk??4pP;CiKAG*X@$cn1JrFugXDv0WrH;3V7sFG;^OTCoNWZ5XCc% z8t7t`p4`g#ToN$0;FwR!3#n&SPo?AS;~>WLzw@Qhl*E&`#XLR+$3JZP6D4IbW4YMR zn;__}of-)ti;^*y%zM2!>ijL!ErFhB^4jW<*S8xXo(pENR3u#CttV3Y6B1eX zcOZW`K?P4Fw5PmrQNI&>9<%mHfRo!rdNH**C}v#JeoonmY2=a#JK8Fx>B-_u=_j1$ zcEtL(Z8LS@ii)U~yFl`{s6e%W7lx`z*ooXpd~j}a4{H~PGb>QfE;0Rx&4_Y96mlS0 zv=rhyE@fuA$#}=M2KvP!tme}f+xC<(fC@GjEjb!g(8gpAJTOi0jolk?6QTQip*xY3 z(!t2Y1;Qa6PF&iLqq-eR*Rn(9xC#IHfw!a^g>9=*rf40p(J-nmHvN6`?)$?>YgI|j zu<;f}=wt>V#hhw@0bf0x*k9Pc^K;WdBbsz?k)M)N6uT0oqgJxPF{BrZatijfBxn*iR=VKGhIM(R7Ng5#RQQ-AMb{r;{_ zk`;_jUl8w|mJ1^i+-BOT00N*v0C+_~0KmXD4%2M!ERphmk&HM5AHg#@=m)M=n3wE`3LsDT19Z>j=h=miPo|=qDs9WoII;d#{(uz+Jo`C z^?w$>XXQhu4zM6TB;glkF0yBs}B$kq$;CgTW1)O){9qtOr(#;ccFgFD*X(m~O&@Wz@EZ->&K=0CTGf z|Ae8A?a0N}!)F(|BQ>0S>MnxGXk1=sj$nr)Cshz|T6l zW)M0BFGBu3zyk~G*)vDxU9K1*-(D&h=(cwT@NMeMmC^+pADPjn4%Y#4;dy!*Q|BHK zX_?{1!W1PNtU z^|NcG99{mHLZ;581+rsYRXi^j#9cYt{{`+nReHklGPmL$u<&#(%wtR8 z?Ess{8Tfrd_~;2&Yt>p|Zgyzzs!?g)aQEG;z}1a5qGPVzbu2qQKH0o-OuzY6?Uf&VJ-|KAFz{M`BeD?62+dH_{E1b-(A zWeNa5{4Xc|!x{gk002;b83zG2|JDNlX#ddw|8G42!1}*j^A7|1Yb6N)VEETz^> z=l@^szdz$|zVt6w{R4pi(f@V&_SZlBR^`t+^pEfDFa4hpSJe17k1JvZu$LzMn?e1F z6IWFKFaImcf8s;w|M_N;O~v2b--Zgn8{ywP|LAwE|KYpVQ~-H@NBMJIfAjdWe5H#2?=AzxW?L07Aq+c_KgoKxh;Eede!x0092w08syT{(tlEfAj#5e>8yq z`?>%C!v5ud41oU!5Bisb{NW(~=>Lx6|1bZ8|M0)Z9}W^#{Wk}Rq6LV;_=o?K&p(p? z=kc#s2I0Mr>kc#MlFdY8*-XEObC3SKFGvCgc=ZPUAAE={82^US0{s9?)JNIIUo_W+ znPjjnn?hW^fpN-|7jnCNMfTFYY|6_E?P0Lrz>Gd({ZT~N1V{!zMM%00o70vVYTik>O)?sj-`u<7XRf+u zMM#F{A_x4Mi0av^9)X?35eL72oOvF9v2ZrNk}yfL)(M}ax*=+I>Hf4GZQG8yRgq2mDqek>YD&(JLEwtK_iTjo~;mvW$s41;luX>HmL4=rnBjfF{ zJ?W8hald!uVy=j>@Co%9Wx6LKGeXrP&TCXbZ$Cq}6l_$E>?M0zimY!?-P?HlmT0b#2rw~P=lWff2}dYB#lXNqakc_{Kc z?cYd`y~q|GKI@ud?>{SViO(&rvfcYunX)5Wr^5CnJ!X;?gvp|&iB*hQ*zP!w)EV;0 z(nwu5KM2P76~Ou2gGD6-N$#C~t1WA((zA@8P4r(B(a7AAC~CX;lxMaDSo=}8x3;ge z%koSERkjP}HUa!KFAFQPbnEXuC9A7Qo?OnR&!GSKhNI{JUMc?a4S)AocRKDa2$WoO zv}$dKp8UUz#J~_TbpONr9nt=G{wksU7u7cokfb8AxVQ>uhyKPL#lm#4snuSZTN|8RkTI>TjK6Ut}>7fpb0 zucvo00dvt-n0LC{|Jmnu9)p9CqMY5Y7n-6{`T{({pB~Ca9La*K5xY8Xo7QK*p;>Zn zgyAnT(H32Nxvq`A-WUFZsaZ2*kQ)&Jbc6!wAzPu?YQV+T-YfQ`$jc)0j54<&wJ>yW z(h~#9U(lTigCbye9(_l>k941GgGJTZea3+x%hFBQe3Nz5tKz7(H^iI?!JaGzGkay~;(_2a1R`M;b*q=X zR#i0n_=Nev*O^H*17*xRisJc9lOP1q$57(Ujs0qBm8oSSq8G5g{$?aMkt#5l>YexT zOS_`bkhkVm2qoTIFl6U=*CbiagdQB0qglT!lsIDPX9W}Uu%n=h5!fT701v3$p52eR zvPL=XRTi-1OjqAdWvZojmo&Mbk*>|6wsf0&-j%Y{3er7dGWw3lEXQafj=pqeT zrnN%s>}kgtk{#5bo-c3};(OoR_|m|6iN|Z=*?HVXco)3sWFxz%9?5i-9dI1`?bM_c zU~|-?OI9K-LMX@qu4d<1CSluRPm0#e>6^hUWY$ktC)ur*#l~FxP2+|+9KV=&b=T6G zNAwsoy_rzCfArsqKK*F~WL#xijaCa}i1_brw%f%+^P@V;BRr2T2=uHD==1D8q1z8a zzbBGj+xTZbid!?9l(S{$FjII}LFb~{nVzrSB`W>YH!UYy%_<^7OIfDNda#(|pN89W zZ-C+zP&N>JC7LwBP5eL~39ia*4os_6ypjw&q2mgu9Psiz{P?js)=6mfOnb0@^Ooel zbD3F+L&5d@93bxvY@cZ@5+{!OrIu({q%KL98$2Kd7=rDEO&sa-gwt z!CSQDz};T+OQRA(;yOWnpTj?CVkS{vX^nfhm@@gbup)A=qgc(iN`_}x~Wkvf} zR5i|ubKR)&XQ6cZ1s|&}N+J-i?uwd9qb`E6SWp*5c~A-Pw6ab)@{^?z}-?Y0SRSO}-m!9YMsqy%RBw zcw}`BMN!_b)gz}s7N{a=<=(!mjX6|#zY1{OZnVY}xN{z6vu-~SGo4ez`8>xjQxgR; z=}`g%Cd9F}k|{Vv<+$`MWb*HnXPDbg8Z*}W2T{)wUJz*-_jS(LF%O9BZ(k3%p4~&G z0}i%VEdxLDKXjK@Ps|;oH_5iiPmL)7CliPEj_u$L5iPenRB48G;Pt;4r)Z)jA?VghMs1W}o~ zk8yJsQciSBBm%$X!1IXj&~`min6NB^gKc+ymTNW(dw9~RPv3|OY!>T55m&g9ZBNj~ zz0~j0{)$H8;_WX}@&Zc284*gD%IF4?uhCAk&lj~l-!p=|z`CGnDP4G|Y$!x|(NZO> z+NP}^Ep&q+BV`waN81EF5R`;!2)C)_Z*un`(QghksP#5=w$OHdG8T=N8E`yAYpg1n zo?JbnyIaTca89{Gzwir@+Tfls2KX}ja*v0|8i0bzKT=8&6-dqm5i-B_T+1JDNRnTr ze8}O+-_2#{G7rObS&0UAwdJ_QBaP{Naplp^{(fdxxyMNpu8hdPC$xiIm}9vmnAhhFaJRY6jk7FtuPoN<&e7bRd;9oY8H5NvFSIFp|9i3b$jY$rw9V14tlK%!FFaKYM)d zC4b<7D~rOZgV)+L{ots#7z5R*W9On>uIIoO%5013QMVEY^{&DIosa;_*lkC*A)iiJ zr;+qgvIrJcXaz-3@fHcMO^IjTMvzg6N%pM0<9Ut%(0+Yq6DK;U6Jk!y-zma>vb?hPhS*X<$1fzC;%F9u0|4WKE}O>@D7Z<}KZ;L_Vu<~miky9@$J z@>6y$^PP;&Y|Xxk#PG2 z-3anJut3e%EZuK$W9+rE=r@6-HFWUqOe}z{zL0{Mu^g{W&+6fv@`-MRTL=p? zO8E(^>~#eUj_wns?t8u4Ue03!|9Gl9x?<+;1a+vf+So$%<4cA!zh%HrEk6_SA#@NJ z$WVCU&W?QL^lfjQJ^YcFUSm%dJ`XjoCPu5Jh@>#F6;^5b=oSj;BW8{0?hV`4EwaL}IQ(k=53);v$L{7JO7pI?!5{gPn^a`^4V2Ix5 z%WSOKaCq^)Qr657BG~CkTJq0#c@y^?Sv(b8o_XB;eH94CYndovj&T8TMb@rKBpZAW1< zqY!-(RVput>XhDK+$f5!r#z=ep-6=VquIkI2q|{+a^0926f=7+OX-dFEp|2W6QW{u zXVcs{Is@3*a@Xn#kc2QPJWz*G%zb(4JcRjObsl|uPChG`7;B)&5S4@i-vH}d}N0s4Q9*o5W*>OUEo0- zk3bK#@{j`b+fw=6&N@&Z{g;4iUcS1gFHgMAPIp-#HK!4CT9s4*1pufjN0wMiqwKp*!)qc`8ub zS}n^YaK-u_$O&&xIMfG%ItFbKh5|aaA2fg90vutRLk`VC3<7R?&Y%|%(*!@h7EWt+ zz_vSnxfn0qnFwGa98kzsq97gaZf4Q?5&Raw=q*HQMQP}v=sEZ6*B3weR|=Xyza?jj zZdT`Rzu5XxJ|u-4E;Ips$y0;}6QprFzF=Zd{sY_U`X|EA9M-dFc|O}nd72^w=Gn)7 z1)nL}_%|!o^6hx{h6GKKBypMq|6Fl9A4IRH4&Ak3kUTy6^wXZ?55rz06#pR25RCE4 zttmvxeo&^bGjecg&1Zqz$_0RP+B9rF+D**g=x3|!+I&z!=yeDJ-h~H2RI$3;Gc>r!G*8MD~~E3r@XX)TaStQq@ z6?{mmxniBd9R(B?!?eAjhkT-_qhRRYtxu2011|^`(vYk4i*`0vE?J;7hcA z3dFLozu!?!F+@8Rtgly#n8@Ad#8bWEqCyR>KmCyWtaVh(+bFlyGI4@>XEIo++SSAh zu94MPFy*^VaR_VYG=_q3w|>!T-^6#94i-p`*de`6-9~CBRCfMYteM9B-C0r^q?&-P z4qL}O-yM6gJp9`{BGcT8VtSsyE)z{t?K+3~nNi`ktQ$dham8O@iF5NlPdB~?N8cBl z?ej=yRp)o~jB|XW`c7qG5U+a9^S+1F?!)Z)OIoEDNcv9-9iNu3t74_I<>a??eKIbV z5)Q>i?9!If4GsCV8sAmni< zXc$0{E?Jkg4JfHk%NK?wF4VrOsP8TbtNn)R*}4Yp>JNMcdy=A+r8oLgR0CEVGqn+1 z-!2}`w`!P>6eY22eL&1xS~YoO`UR^fi!-}dC}=Bsj06+9NpW&i39g9g5+d?8#jVOX zXC5&dKw|4uBtikAdAJ*WwO(T{m zrop8F0%<&H+53iFagWIpe!yCVJq>tfuv!d1kAGV-OXELDFwhqgSXEK|F>DeJ=EVfy z4U`u8J;TAU549}QA}_Yob*u#J=Yrs!YWN|8bXZ9sJseooQ!ta zS`C5~D#NAPv#sLgfKW#`u;vpFG^u-+H;@%s5+xQB$!HrEk-u+qMM!P_9%xeXHwHo6LVbomM#xf#*5>hJ z0rZoX3?{$|I{sz=J9~1%uB?F+YtbtX6l$p`SN@f4kR%x0(h&Ie1}bZA65G!t;f5M_ zSUbQ1IbXhyp!m|VaK(0L<&Ek9yDn+JMdrw#;p7wg z3SXdQ-GCIH4NAj>@78mlYKi3Rez-hH1S*7b0)F|_=u*bjFZ+wxRGOLrY$uC;coxT8cz&-XYGWi~$!HyO8UVz6GlH(qp7w6ghkfyf zDzns)vRyBUw^H%(+G%4n{)LU!heE!2UTkts2eOtf=0SdZ%wNk-3GYSjp364Au#qE= zBn=SH(O$zjTu+D#8|wUSf%a$&Qbx@;{Oq5JHe4P4js)&pd86I%3nO7nYrkdEHnhs* z$oC$h?Z-ipRl`pKORTVYT?+L!Rx`p|omj1}QuZBvM^8luHBrB&RE;H+uCWSF_xxIB zh-7J8td28yrLe_FK*Q}z7!|Th&ybL5nz%<-ckg!eU9!qrIEKAxkNF}!^%kys1VZw3 z_4~CbBe52QL{h0drxO*T&e#D%8(N^KWko&DY{@d$hdAairz#kfhlOrWUQl$~UL7)&#^$^*t5J`c4;D!!o5|q314n|ImDucI5kL9)SFaffaFoW-2 zjMAQanig`E(sz5TV@9Dl&WmuqL;kAj0EPcaguQI8nbH1uIRSG7#tHByOqg}$274yJ zqaWq1Kl!zShP6Z#ZCo-TojS)NWl-GWOm`c&xYRQgh(rv&`i1cBM|(Nw$oCjUL^_Mt zk&}_ogNY@aVfm2TNCl;1pl#`T*)Re81X5#KNlVU7fFi410@&Q1gs@C++x$~P#Jwy@ zV%uAbpt2{GeNmpF)BsJxM*=!(M52oNd2Mrj%$yh066gY?0m(S~4yznCVKJ5-I>oQ5 zo`Utk2^uN*gyeQWfHgjFP0hxPr88!rS#A5%5g{)O_2au-`Abw zYQlylrxC(NVP~3!A#HG!Z%zOuQ9YxT#XLyTX=)tVnk(9ghynyyU~ob=n8afVpPfyS zfPRj_1d%TsqLS_P+%mW>W0VE_0BZvzWWl8@XCF39*U}6AZK$5g>LgCm3%Axy%%)02 z2zQ5EV=rB+nMi|wPj@-vrqV`Ln=E&`8b}_@iBedCmSv9NnGBaks&r_iGuas}eF9Yj zZuDc#9Q7L*c7gzjsH55yogev7Kwbz6+j0V9>s}9CJkPY3qML^FSS+08Bqx0x^luB|waZEOCJ$!|xRD4p@}#dd^aJd6X#z@em$Ao6 zH*^PmooIWsbpqXWevWta{Xjf?r^Bqlxr#F4sV4hTUGlN*HzdJNIVB5PML}>5hdH-p zbmzRT8LOqe=eo8}qF8*c0gWftKTj#S)`+1YoK;m`y8u$W<0P+xSS5ITA;N|wa7kSP z*c^Zg(N_F9f?RdeI>#*pdDs9S)B|VdzwjOvxw=IcKrj>ujwUgWh3W$51?CSF8#$@) z6=w9x$NlIfjkF) zWy&84Yfio1T-bk*Q?)5SuxdB7x=E5CkG}dqq}vO0fjcm3!pNMLbTN8w5(C^alUpu| z%F;THsdy*9;ma_~O~m&erZ-+i$|wAJl1h|er)BQDiIqK*0&952l$wkg*$tT95K#p0 zf9|+q3nM>vU-!XKz5xzgZJL%7$1A??Yj34RZ6qx>X6$&mvi2!^~>o_hgN zcKkP2#%~naK5sM8rR0^SU3si_=Wks!AAHnD3GhlvC?bDo4+YT=Wn~rNd?vRwNk6f| zFJ|fc{jso3XI}$*wLFG+g(&B&G~O0-%!dQP5z?F*-YM5?>|NXv$L5RB&=2Ga zg!BYkkK|qoQ7O!dNkBqxsL_WKJ>>wzY36$t7`{`)&+ouPe`3zLgekYk|y|2XPrI>)xLn;ZafYD;=@J$PjJR3mm<_$!^ zOVOldLJ9L~AN#k_*dsr4MU07MXbB#< zVu|>G)I`t$(@}MkYAK-?Uc4Om`DF~5-15FtEtOQpA!fW>js$b&q+JoqE1m7kYovn? ztzkIql}Tk$^c_~2@zl8vr%OdhZ=Fa}=ZU-%crrq}i6ti?$yg&feux`u>SbGR(;=TItNCpeH5p>4xkgjHg^k`~=z_iDQmDQbe#I!`B``x0 zz3m~WB;3u*?>Xd}10yE#p2GpXPQr<(n0QN`tn3jOcAo@ttyp++^!AN&IenpBT4bBe z(un0>6LqQQ$b7DMS&yUxwb%0y!s~FuorS-w3j*iJFHwBds0E^BM`?kwm>mrMtmsWV za*t+DVgh>PaT}r8KMbcsu9}jjFXJ9$AHz2*P+Q$*JpdY@ZxcvB* zxRy7wreC*^waj^)+MNHhSt`_lI5gd9BV+9J`l0mOW0AHa^_MTk*shM18086c%}6v= zl4t{zDbU(@3?c(HWRp{h zva1hz0lSW%O-46TZQ7Q-xLXAEVL9R|RXUHQX#|%|iAYO&m);eW(^l`@M{SiXMIJB> zw|W$5hBARAlT%pBM~e{Hm=L#nqXj%U1qCi|A^Lb6n=aw-bFvtreKH+){VCL$B|V^s zH#Q3!597k<`cSrTxB8TwSrrZ8jF8Y-b=-?Au4tofnGC-{;tp^iG8uKu~d>mM*!wtR9%|V54iJS?h*d!n|3aw z6jw}px0fBvbJ*59{w~OQ+`DdJH* zyM2jtRWeRuBt-oC4*!SggN!8i4 zKYZ=@GF2o~7MUOU@|I$kov`?G?Ate{Wl^@mx5OCG5%)DdZ8qs6+A0A866+HkV)ItttuZB32Z>rAb^V?mASyI%Ew@iz_01 zU==cT=(f5)VpT+kVVg`S->C^!8+L@i=+}*Y_{dj}#(%^RUq)kH)@p&x2*+KE&}_;^ zoW(50{4i&TyMuK@Cv301yz=^kQRUfpA zPw1fE)9SM2t7_wg?dY=#@ELq)bw*D=t+ZxGDm2FxU{>B}s=g|~8Yp>oCT&2rOn~zz zj$9FNk(OU|AWZ=Z>Cn-3q)%_6k$T(xR(NF9JWlBlolP$Xa;=T#4R10Mm;r%4k7hW3 z&Si8-S&@wNXZq0I`Ft|ZvYz)r*aZ=Kj6*EO@Th4f=BEDRA~H)8E}Jdb(3>!iV7U8= z$>e9c6rr#Ls%!u2e3G@(xdQx}qSQy^s=z{z6pQ(` zjU?q;z4Q_5U^M@gvXt4USz(+XnrR&E;s^^wEJy$C;L1M85J=Ji+L`vi=9iabO4{b7 zq2JRv6)>ao%cky{9vZJYTb$a5F=xdx_dfY$i0T$**r>=`yr-gL)6uYgkbjBhi5dVe zLqMi3V;r!I1cn-ph?;Hc=>68u9X#68$EHNsZN?*3Qw?sY?a7J1Bue{^@zdRX$H*!F z-ZF|KNs~>A{*w}^&O6evQ-tvrcw4SMTZ5hgc-tpiDOoNGnHF*~V__P&XKsk?+7gE( zd$=%o1qgLD_JDmSAM!KZt>tPZE~Hif$*EQtmN*^Z)ngj(_l(EuwK`*r~?Uwim9Cr z?fhdnc%QSbqz#E*i|`>e%BhPewqx+8aHRUQhal@4gQVYurfN7Rg{Jq zoDghOuW$b!$>5q(zICTk`Fcu2Mpb&wc5wLQa6Ev zJ9Fc}b#umFU;a@Z;u;rK~?n!QN|UmwMr^P@?pSCuADP)Werj04 z$qc173joHn*mVVkiASows{o`jYK41jm}Sq-@eU!Nt}Yke#835axk;004Zy>|_{Z1G;YqbaSX(uJHWFuIjGj5|kLHYHCq4F(r$H|Kl$IPLs_9!`ikT>FF= zM(Q=b1%VyN80R}NJ5$*~YVpKnR=0rDK|Km=zC2t2-89rd)jX`-?Z$^JLdvd(TCym+ zRc{CNY-MgerfT9Vdv7T ziC2SpBKLvs5d`=%cAryQjmI{AYbx=lXeZGYNF}ZmB^Qn}O^_afRqE^L_g!2LL)^Y~ z>8~!1;YmKd7m~Jf#$UCLHnmV+wzm{Hwf0z(@yVc4N8Gg~>@!>~N{`~l-VKZOhI!(4 zb=X`RG+n^melOd-+_~Dtr>3tV2ekf{x!AlIkQf>Sy=@1ud^+XmH1%iD05*DW_VjR)2jB5l2nG@R6BU-M>N7BoMB^IL3KI;;gpsJHHB zo#+e{txet?oD#{K&lDWnDniq78d36;?8y29bGGYFoQ!rcr%R>mfFoi|lyOS?D@d1+ zt4CMjs4&%qR9E?^2)LGQsKVAfVj{<3+7M#8Bph|+RFrQ3AozUS;qUIUTU`!0DEDcE z3ZBHc1ARL5`wBe`dK`iB z>g=x^yFM4$ZJcT2Zac&Ly-EA*9A%2^6U?r7{7VZW@Idc4KJru=1yNKQlwLqGwC0Q$ z8a?@*6!_Fd0_I%_Ha$h|-Ki5DdyhHn}Oa9yO32q`^rAPfygF6xqe-9U4u z?&X-;Ud|x6i`9AlBiy}fL9!7khE|nezlHWULEc`+c`lc$g)z=RQilAc7i(lHbCIr> zDc1Zf!D#Lc$j?o?7W zEsa~6iUu~iD^R&Fq4T*tnGpqS_WFP^UX>I&BVhtx-)3KQ@Xk~yp9c8=F*4_6N^OR- zq??8wG@o;>7*v=xdODyKc)#6?4x9|`+ed`Urs4v1a24GK$n;dB+K9HSdAq!Hm#1@F z2}bsSviaz4YFgt4uVs&V*c%Bclo$}{;+=*I-D90q9YEU7g*i9}W(1<6HQR)vrU(gp zB5I4J5Ap#WpI1y?tJ?t60H8|KN#GNF$}2-!Se@1@5yZAP+mMhDSB?;zHV*hBy|W4! z9B{@CMVzP^MP+w%WPa{4-7c9i*NA}w(}Ge}Sa*w}W5dZMqZd*xSv|XYT&Hzkdb1x+ zVQC!2$xEZFM-)KrYO&Q!XK%28|AuGEI|gcxUu?0zsa~n`T(BjbEA%yN2>t%ey07d! zbbabp91&eyAsEqj5T$;3nHHNlN%zCP;GiZW!DC1uqThQyV)n#1aMK{9?i(}VL0>L+-Jga<6fWw%QS#- z7y3jf#|%zz(g<7Jp-o+YyY(i-(tJk^!S=6*rRv2j5|S@3PzylwhFH-GQOhR=VG+^r zp9r((!Q`gv$4FL4VhgG|9IKUSh*`c5o_80^1qAvM&5+{GA#l|cQ#(D1Ofi{{j8_a4 z`9b)THE2qA60sfN?c6W<0p$}t`am&bkYM{J^jWWSGIGvBrVI;2bVl)Pz>;(-Orj=e zJW^=^+z19*{ONGSzXCL}BdIfWvuho?yk)^rp`BG#iD;MAS&dzQYkD!4`-fQVjbqT? z@x%dv5*Nx^G|cOy57#cRg%I*(7%e=N$`a)hptEM@QhNKvEIfr#h7p~`Jxk+CmtKjT znh1eF^jhTgV1uhepA95#mMdALaW_M?PI0bNaC-GdQnI>!SsG!ADVz8`A|T)!LXdxe z%^8e`GvZvTY5Z0W@60J0nJ4zgs+{jBsNMDSB;VD4fH|1zf;{fSN>Jq1V{Bm-A5-zV zgaf!ii-MPJG?=aNla%YNdw8uq ztsar|^1A%S!YulM<6!CmuNEj^KVZle@Dc*HYzX(GY_g-VMK{=yJ}s($wg(hO?`{pw z5nhkb&&Kg)bB3vF(@+DSBgkk=LP$RyeWJ|x1qQDU8^T}#ShE3v-tw{p8-}y$LNi#P zI(5rd9CQ`3W?=>+$RiQvmk~E_bue(Ylh17<&7*i=Lvjhgtk+j)Mh1| zLGB=0{}7KIbnrCww;9d-Ew8t^Dls>Enu5LT;FF(4P zItXXsN4I2j&1lCdN5;3=A3r*a=Kps;`s0uP!H+KX_OBluiH`>mDlSRgv2a3j5ae8v zyUt|`o`YaUMRftcb<}b2*NkGR9D%%7#Vi*!#75K6rP=(!MVLgzK_WBEnElLESzz0x zgJJWp(kx0M7GM$ZdP9&6wK$yBB0%XVOO`B``$nHRdwi#dx7W71orko$4Q- zMA4hJ_yGGTc8~r|f%c+n%+N^M@m6sya-C#WgLkhX^+wGQV72F|6KyE_8V}?*&ZBwX z0FxO)i{CUq;hJVY7+FUNk4XYKMfErI+XcWaJ3*q@lO0)UxIi5HD1EH05CTizaGX9F zB1_Y$Bs?u0Pap_ zq<6r7=7>pa?b^T)Ron3!Wb%pw4X;8e1Ul`1Du437_({za+aF@%fw;|nHs6gFT`KkD z-zz|YG@ISEwd%qpwGJ!+3k9AW9TZ1fskHsl5p6cP1MWB6(62%K$dTBE??er_2VgPA46er| zpg}U9dLbi1tE)67W|Je^Q7WT5B$jjc&8(@VVuUr%9-xZh91KJpmF>uUV-PeNKsnfa zrOOJ|w7MD)kl5*&0&U54h&qD?67Oib@uKyJF#!)^5kuzKgbRHVe55o{?t>&X$a==+2=*MS|T5S16}qtE*4 zm!IDX`C#ifQ6#aV04Rcp4gs*rHuy~yF#@{TJx$0qhU*%nUYHGQ2$ z-oz(8Pw$`!5C|$2^?{wus%W7pFAdsrnGfd&_2MCD!T;;J)X%IplqnXO0LrBAO6`(eQ*oCB+175}P^|D=z}9Nwy+>)gi}wctX_FZ= zqu>ucMsN}Do=}|hB)z88?q?NY2gp@t@R8h+aM9trf=I|41@5dBd*$Ns>N&bMO>U`ARB1Q z9Qw5?h(z*r-P9S>H6Nc74;$l|Qa7(KGW!n4oMH+gH?;7EI0V;`@JWl(F#+z(?utO# za3-EFe;5QIH}~1m@p;HI73UPn^F&lqSO*YPlvRe$na#q!)8y|Yj-VQul!aD~>kYVJ zJ^j9Tdd820o$tqz1T?Jw0%u2q+bL}#|1+A;y_Mz5m3G{;S^`j9>$$zxLK?j(jl5m4 zTdT%b4~%7|e{jaI@&Y|8-5Ty{g|mKdk!qXA-b~7b?J{ln;G)8s!U`z==e{U*tkf^prp6Sc$EwrnAwRlL)1s!H4pHU^(HJd?1J^Abcc|Q zqpnlQ**%J3iSXfDmu*+~Kf-prlGsRn=Qh)YqD?I@nMcFd?ZPIv1}4_w7$aYX_X~td zc&nkfXd1L~-SMGVNk#x%U@vBCmK2M@be%3J7k9me3fGJQysLd9%#GCi{_cdJ+@BQ6 zuw1v@a1wV$

z=*tkH}eC&@{jexag>Qh z1ztiX2t{?ShZ?d49zqQubSNx#A}Y}7IE$aBum zQ@DZn_gN+1mq;6CFR3lK{>f^ax6hhv7g|lVezYW6UY-;>d?Z0w_Q?)Ti(`xghWEKM zidV~Z#q#Ez#wYkXF$kL?*$g5YeTHY(wXT7VGxiQXIH&4@on*nLnQ!gy8VZSRfgIU6 zd>whz{NEwSO*#-OS8?>T4aOQvwyZ_#Yv+A%B3@g<{YiAUihyLr*7< z{l8N>kHpuWzj8C9qB7SkraPC|1uyOqCX23sS6rE+4wen{B3&LDZ?X-Lk>1N8i5f-VFcCy=mg|fE8Ic$HII-UwCm4}I#$IMzm`^Dx?c+sv z4`P+z?6esb?7mu0nNnc}Gdj26;J4&5MOlNTiw>37hslvQ$-YGGUP2=Vk}&Zqqu>YM z|0d`TI}o%O>6quS19ZADH%v`lY#T330%HzDrq(*(z*N#3-q(s`$RrqQQM3X1$~E~= zs(TcXn1gj_rYN*WYJz3wSU8gZn%(&@CVg^R_2NWs4zw+V56-7ZyIth@7GRthm0w9N zvwq!rUI;y-;M?jazayqtZ^1yG;qQLJ^xFz}^GKf{-YCS1CTT-H3x8_DMDgP2L}Y89 z7%oQ&ARnq$Z3@reelm)eYI%Kb$<7zp*F~07H(iA#?%P~}66(PV?CA^y9_OO1kVcW| z4B0F~YGXhFlt1HhHkO0!b=!Oa-Ff+n~sVJDS3|4W2nDPdGU+jw(So#I|+k}A90zL+Y z5lb}jpRx3B(2YZ6Hy_bYDFKoMcdkf*N?@SVvP6ng;201ycAor;x46EMOmnuiB6cr~ z&4U!u%s8e1YPrysDJZh*mMk-$)JMu>r<@j0NTVhNIPiW4vw1{#KOw6eD<{2jrUG_c z>!Yhuyh4c_vrh;a*Mgp;x|n6_x6|Zcn9rwKc<}knNMG$Vxz*)d$5aZ62KA~QwK&u< za#M^b=QHJ{ZNcdE?J39j!Y^v3Fj-;h#<9KELlEHK0N)2Q5buPj3^(Wi(np^zMvCbU&0MKQ6O@gU`yu#Y>H35AqahoRE2&vh&!|bc(j(-|Z#1LP}vy1FtO~woy z5al9|Q<+wNazpP#!a7=82wkhFqbd$owFIe=F}1h!6+)+$m|4$l6n4FXraw<#R1ULw zbceAY(ADqDx8J0dlz@2o9^r`%LbWLk(Gv-D!${PfW=yXCCs^@%jYG$s|Knv*9+8c< zBS2?P8bYw%yRVGu^ik^4(|3=3Nu>1U2px#10A1A9P8Bs|4LckEqf!Zv{qL44Q$PV; zQTF~!KTe8%9}Obc_q8bF(vpG9%=&wk#?9HSu8yebdRTO!q$YI)5v~)9WzVS98V=L41pCd+|ZDMHd z4Az#*rhj^$$DdG(1@b-?CXk^6aWW_-uQ0qz(BV}BT-$QUDLT$zSMG*=odR`X?i8d< zhFGn0LPInsaY1ti@C_Nk7Zk|QW5jm0>1^=vp@}~V(}HfZL@+v0mOt(xt#6>}x#MgN zzc^=A4FW@s9~m=8CN{8wH8XO}^Z|3FlIbbXF#DG;=iaQffqkleBWLQx4$}c4~ zFc?DpYOHfTMO)X~wFRycWa0r5PBk=s&1-+or;8+;WftD9g=x1EgL$^;l0*)BODb*# zzud$0xa3FVvYc~GXgc-sjhcULo{Z3dsZ#;rRLSvMdUsY2l){Z!#y0&OrzIT3?zk(d zKI62)YEQekn{gD^nMca{3*eTPlh)f{K~KqXXD6!Ufca1kfq2jB3VGku4iCY>Va&)9 zo08o}@u+5O@sQbXbLF6@=*xBt@^P;wX$Nki2;}Txpkkam>!x0w(Lxm`Lir@on#)qu z3~)`CBh}qDt|ISMjjiB7BLdzoQ4OEcolzx~a%nn#`V(V98~c>A`yv*`sM`g3qPqraF?1YlnjQJ8E>h zZ2jF2!)QYo)fukwTFtZ=n0BIh+`NE>!EV)umH1ze8O&e9h*)ZURDSs&pX;Ct4;ZRP z2LpIqGrUTnbpg~fAcqm9s~(0H4TC0vkIU~X|5`jCfw9dTVFb~N-T8+A z3Hkv1bAtlvZ){yQ?Y-4|629ZZ|CNE#$18jVw#8W$}_6NG4)=@oG`4GnWyc(FJ`O zr1XP`XWp#aeq|F#A=Ne7gP$#WS~#YwzULvtR$?^Wz*V4F(R&>U@c!MZdBs$~?nV4h z;vy`{79OC-Fm{gSDdu)Ip>v%i#goSl63Z^QUw>18qcRCnb8MU*T+kB!9Aas|` zeO)@Ahv*Fo5!>%@aiD)qv%s`^lxexa?-+|Q!!2;QR@F*7EfTh?1Mvozq?p3cb2{f) zxp?6q6#u)RBKL>At^LJ(*}NlEKU)M)z>%Mv>4Wmt=Dw7l(}H*#2d3cv0mS;6X|Eib zv2E=JlRf;~RX&*!l~>Hcc262ubb~|}g&Wc!rWO$9da&>y=xCePdRs7>VLkm&T!;{} z!yi*)u?;p}pY6k1BEZa*Wm2Wu6+rce^_&RxRQ$6U2^hPjS2Yp5*H8}f^VzMn*~T(m zTsDa8?lEpRi|nX9Z*RM;=i2UVFRhH-RMd29Kq#@rC=79&BHThDJ==w&b$4uCLBqm@ zBldU>y)}x0Jm%c@5fy#OMDy^IH`+jAg)Y5%w?i&vi|uTrXw%*48oFVr$Ym3qh~8QN%?3=c zH7rO^cHL8_==GG2(62McC^+}o(*O%DTT277;pGW$3X(^^`Md2kJATMy#d%+-qL0Li zT7K)jB*-$4-NtY?#qNvhsBCEZv!mJtfJo(N0(C77%1QK4!azT*;nqyq{!YU(_({a9 zZquecwO`~a1idYMe+3@)wLyCYN>`h8Pxa3s4*}15^LXkAzd4tq*-haYUft)PzO>fZ zWK9C2m?M}loQw^=Z^GVhMebDE?;VIY>t{~>GPBhrWaT*wHk_AW-X5s9>>kd$OyThrXV18Mjbycmd~17{ndAj1!|Q}!(uHtH z#0AKXNuF7PGJO0Y|IS83Ps1u_N>{^}t!N#?Zc^TeGF_@N|wF)qc| zmW4d&JW3^w*#292q`L5;tzrPDot=fZw{)(lBZjF5FrDyf=71i09DngE_#u-${v~>K zsPO|w;=>nyD)bG{w=kQ)y~d}4tLW(a)FTZGXi+U7q5)V>@_7QlmfOf zH8E+v3)L{W^+QinZKnpPKqjAawf(bHGo|G!f(4-ixIY7^WF{4oxD-h9~d%Jr_CUjkKw||IsvrJf-F%^I5ZBfnz_pNkAc#2&rJHhh%B^Xb(*h zFUL6rC&;Z~5M>~Le842D2=x!E2~_duRY@A1#3Z8)S;r0+wk@06Q)Kcpr|r);nD&KV z1h6%Lg>&vq-z@LXG=V0=j2(RcBtT)GAxfxkMbt)?8;E(ThNLkooYF2o+ZK$+S40N7 zsBYsQ1cTx;AsETBI?*{q+D^a($&H%7W0*!W{Q%<&n@j8<;q<^(W-xp)4s}r2qoWV z5o$v~&koB$=h5@&T$ahPNy~SC&??t~X&Dx_v`@Dpvln1p=UyYiGhLgS{MzxKvLjVu znNGH`X}dw^h9$17iIE|5m4eC}Sikn8M$Wkf+d>{V8?Z8?+MpY zkgZ79?t*0+{A9wiXbyTGb4lH2krmuWD6_iRWz5AJSm$~mJCOMyv7OnEP$^ix!|q=) z%!F&yUc~kFM|}$-p;5_p1M_O?UClwR3&j$&4gIefL3d*JKT0U6R1h? z7u_yMzcnCl|60}`e2|SDabO4`tk*cU7fVJ>Xg}1OTUrO;_)FV8t~uS6_ybvryDBmv zvwgoNO>x=d7m7&1jg2obhEb6@0P^vwRGMIQwOXT%_Y56Fdjl5YnL{aM^s3h>&J-7% z36lMD9k1GjN?KAKxQ4h~I(j(soTHWD`koxjFVA9VAQ;_>nb4v2_g;w27dGk6G?SbC zE@i>r!)v=CQF){C2fF3B1t9L=y)bd5zw{6aE_!ZLV8(Za?;4nf6Nu0|E3N!A=$+$(oICkcM7P~600=Z zG|`rS9k>{zbg$Fg<**3%t9cSEV201#3kegw zbNLk0x8i@}eCm4|m7~NTaAf6chH@2Zr_r`eE@F>-^TAS!S z@IUM6u$s`?k$b8z*r?1N3H)?`7YuJ7=ZO z8@l||?~^=TYo`d8A;7uQGSQxhNNVOC%HO`%odIAIp>q7Zvv2U1^n5pGzyS))AG$g_ z#H*zWo#f74CpUawFB^9s8@zu)_w`|#gMWZDuT1%)tg@jAu9u6XyQFpY0r?~@HFIbc znePM`gO}D{Q2w(g&~YKtHQ0wCUi25YV-VN-NO!2jzp+smYt*KVqRS$e@in`lDVOV} zw_%1#?P+nOEjZ8JWbf+}0gCj#3Pb)XGE*RUjk7)yr~yRs>LHx5+eQ#Q*b$2EInQ8} zj$gNJu3k>GLy(SPs7D8s$+)Po!>yFORXYH)Zh59*6-U|Mm1w&#qgk}%m2EWK>?4OJ ze%}1_+aB2sRKX={Q>{jDjGcaw`RuE2tmRlBxW|fMdFpKSpHESv$q@ZHPm`-hjAE~z#KBoyu^i^K9 z$otdZbaFeJxa?y~dtqxw+Tn+sb$ognLHJcAXMBtxK{5oiq$F8E;2DRiCEE!p&y$ic z?+*1kbx5KCU`)nt-8xBye1k{int3dqzvG5!k0a|1$%h2htW;;WWA3}QBLg+(GS&eq z{wx;b^KBaVfQuM{=0RXcAywdhRDaJ#2f_1lSwv$iP;D|{f7{gQt11$c?M1b90X4d4-I}*zW+9hFiCFur^E1^u1YJw|kb0ud?7Wo}UUhDbMNq zD8ardn`LV;X>jii;D6{ghAyqf-1NUxe8mqnFpgtgLwRKQZg40wIa#TRz|~Kg{(V)p zs^0R^@vqD=OB|XjSS}7tuyA>(*YOm&Hn3lW^a4l>m((!-YWHRrBvM&Hi4iP|*=#u`eO-)nVJhuh|1e*zR+{9IIh@1jn*6 z>V0|=P%99foz0W8sLAIw3Th8R{@`&_8nrzF09Wn0no;S0^@3hQ310M++8mONREVTK z8n!pl9c4)ak0vq#jevl>RiS~g-;r@Y=^OjgbZ$*>iM^J{sDcNpUUs?r*1hIXm&VUf zX^?M!31+#M+s)V(A`Y+K$^$j6s~kaWG*WvGo2M@$^m#L13KI!nQi&LeLsbXGYDDl@ zZkBaBW*@VKLV>VsOjY)^&5LObgJ&`QjNJZ1t?6G(*)hv$!5tY)tj7z8Unjn4KLU`X zC$Dh#K0&2v$B*ui7aBf38Vs&<8o(k0>t;;{n_a%0vUwoT-A-Q=vp)YpQ=*vbb<73e zAHpsMQ(PYtU5Qqq`e^+xCyLG#VU~4BO{T492 zwjgmwPLa@QII4;n`;x;OM0iSE(TJ9I)pwxsr!zs>JUJ7a?avx)>GIO-KLU5*eN{>J zhB4{8qn4qhZSgNmlynfUSeMEr2@Y*o>A3;Ie=!JM>w!G1HV2;Z#_A7<{e718zVAm( z0_OVDLDJ3Y(>V$cMoVI4Smyq`g4Yy#EkVUZr0B@YQrn0+WUhip?s+MjP)b~6$3qHn*0BiD0bZTRdk#{F?L?OXP#k);(nL}F9hsa-b~n$;T{s7 zQLNWDpir{xTB+|Cc`l7Nq*ameKac2y-R_>66if{vCY50)ojK^)u4J58 z2gC`B)7ET=8&^w)w|u}XUp4T9YIb;RwF{&RgwOdWl8d9vPP3bm}D^_cKT=vkXk z5q_@i)e4>JT6E`taEI<1uFuX7U}qA|@7vzIL2*74SuCPo;f+YSMqL9sWL5B% z)%>bC%Z(?V&IQ{!ko&QXIps7aMc_S^l>y1`z>uXoF)Kg9a7)T|@f{XK>^lLcgtAMC zPybq}r@6q1FQ>3gxXJb{*V}_y@2}-veluz(Yg4nGcyvFYa=C#2Ey|HC!HZ2!Yd=#3 z7E!>)0;1J%!hRR39VAF!X_3jT5DkMTdpA(B+$D2ZeWprC;j-?!9kz{m0PVT%vOR^} z-S?Xmy{AC&biud2CCHM|k%Ve&!uHEY&wXFNd`9-Qwu#IJG|WVHtArk=%GzIb&#E-L zzed4iOl3O`-acYcN?0B(!Ry}(H~VJ7aq|!qGVxwE6!C}Hhq9&scG+SLbVMpP+4?aN zgJl;Pnf5{`<Gp3@pYAy0NZXcNi$@R+o?wHOFTA&_7tMYyJBM4UG3;(^Zv4Urii9;lQ8K2<6nc-z2zhOVt%F+@-1H84dC@ zju?{uDhqbcsOlIX%3|c3{9au;#irH2pkg-^0@XB`P?g36{F$U~2+%x!r~u8@NDOXe zscL~vlw&r^Ld|pVwMIhkGWbzu9>abmgm7vNmA_<1J(+Ef!>#PyWDiX7^v_s7?K1S@ z6o^Be7%#+E)sZId_k7Iyl?uej*Sl4!i#)%^Cw}WHt!&!4D>=BuT+C})rw>Sggp3T{ zBYRJ-d=%~%q&SO$fT z3tT&<8_D5bTe>;4&q0BSJ2!60`3$aA_RpSlCfl+vMQs6@>f%&f){rM-L?%|j=8bc- zPsFmzffZo)8#idEyI>`A@3D_~M#EXK>o*5yMS1R&!KF`@{XMR*JXw^EF}fbtQOUMW za{U1T&i$WQWcjIwT;d zn0G;{s4|97PMfF}J)pLaX#f;+W3l6$G=ox`ycw3!HNU)6u%Ri4U2XT|Z zY?nq$Mc;aSap4NIaghoLh65fb5M*t3^BT8s%z0-L(q{9U(=ys+cnogr2M>4{G>lpo zTI2wvty22iG}Tsyg(caht_@oFkOIih@K8by7>II|D#L>$pNYuSK$#Jw#?GGUWo0Dr z1|DK<03QO})~*cQ_Z5y1rpXPR?{k|S*S=+WOA_O&$ygoGCS?IKd@{oWS^{u^7A;@C zW5lz@jUHAYWc$)+M|4p2{52=eQM}%iFzy#ef$BWCwn44T2^S8ZZ~<&#b~`@TXEhzr zFjUb3CdLJ+RfyC7u-9}1Jj~=MiW$oSzATt3?FjgELrtUL5!iRPba#skA#5dT{Uj?5 zpzqJ0&Y4h$Yi@5SH0Wyv>hCDnSE`ZzP}ubON0Xr89&;6WgY2Rc1-T)hZQblmp)OfY=BV))@8VArbsL&mep~oK0 z(yY3^xhADJZ0WVW+{M%7bZ>uwWsRaod@qzYMUYGweRd*W;y}&s^(UlTsF15va*P-B zhq(El5eqU&UY^V#VKzER6;P)FxkuKDh)Wu+4|f@ZwU}b3e3?PA`&MM^z+L2^R_48> zFy||YPCE+to8P;Hy)6)p9DlMj%39JnvQI9AT+@L^=q(ncXI%AB{68251uYl(dkJMi zwn_flrDE`L?r$%qBv#3Q&2l@2rE$kg$*qflV%x37lvDVlnDLX!XnbP}nQljh_ChH( zi7}$8w57uxE|LJF3Y8X?W64!p0+#MR4I~$whZ*>A<^(3}zhR?)%!A1KcghxNVCh{A zEGckw!3Z&6vFAcbYF01NT{;c;mbN*uE{nGN4;kq>edED-8Ro5=#5kb$VD*H_4ftfi z4k4NfH=nd5erh-=)AOtAPegbI?;EVK%Q}6%X{`TP}<8Q z+QsSCV=vax0XR&+V%`Jf)508#Q|f|;2U+IcNID4X=`1G_tYPjB!kZc!pidbnz*h!VCKd+qwgOKH)RTHW-KU+$(pmhMGRvxi+WaW zze+Xp(!1Bm>dv11r#-#Jg|8riQ-G$Nqn6p0e8J9Ki!=;X#

<&HI7i=8+Pb=DrCR zf;awiP??p za@O2065P8*#jz4)Nv9^*K=m&~brgGe)#^smFe2Wb1bDoZf|fb3Ph-}18vRd0hag){xtyeq3| zRnl*snH}CYS+G;mC9pVQN)0(b`JZyZwBrxrnc?csX)?h-(9C$V)vv|*|C*|kS&ydt zk&76p(Y;R|(!wjZAm2Kksyn1}OmyiFx~N;-A+0X(*2^F@=JffGikN1)6Y34+K5@vd zBe&(kkW%_3dRQ}#Myp72mK{?Gtf$XNaxbD+i~dQNo{m#u>u-1~^8fVksgJ?;__Ei| z(U)IcdmO^=J9C7qk`;X(t=N?gSax4R_qC|;u2^*mc&U?LJ`LPFnPMd0O5-#51ht>w z)(BH@XZLd73TowiY=$$@tZ5+??7P}1JEO19rLM2rpEimuMCo0aJ*OU}y?gV6Do#sY zP(=TH1~tQ(p*Qg@&Y%-n(0A3bZzRY$1%r`e@)i9$FhFe1k`1kG++DHbCHcb%nd0?y z;m^75WfkM05T|9xB*Zz5e0z47WQxrZPIrxH+Y%kuEFPp-83nL(;Z4}}w1>>dTqhiW zw-`#JnHU+g)_nj1$dp4#YES^3ewbjpD_gkAt9J0zgI2e&Xf7?;d_!*CB&CGLeu-hf~^24C+x=~-hQq@VWw3Zd78~Fbh%iKm=`#REsZE6Alg^&Z- zdEN4o8dQr$4QdR+M>yb#S}qr8ZwQP_hLa(oYu*uJn4qW=>9%B==w7pS!H zeCvMNUGe81FFC)#c6@SRSMWfgD(*=6L=nDvg!JyhfF9o1S_CAFfek0h+f;JxDHf~< z=<>|HI%1&b-E)zVEaVg|lywvdw8RP4%A~7o&mOlRKXAM6nZ()o-^rwl^RUy(XwFRC z1jm+rRwu6Cx4Ulo4tL**k5Js7arfrwI5$vBKigw;FY@Qk)2R#w9oi|^t&jmtPO3(@ zz3^2$oNG*sxrirkAVpwwf$8rr?8VYqlqc?i+><(WG2%ektlV^u$RBQq@?ea>3dv%L z98h}h!PNw3BwVFzHa8`l;B#)KImEjcM0ySJ^jD`cW

kc*qk~dJC2CE(23CnkK#6 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 T<*g?S-uiAmQ#)MHUq@@2+4_^?mNc; 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∈2ar&t~WY6^mEy<&hN;8EdO$Hvv;gUu_f_N*k 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ȗg>Vn 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

fN5Tk1ulu->AUc&iAa353i9E4w88a_(8zb-kUe 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

&XudDW5lgr| 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 z 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

i#sM548N1-}H=?-g+QgGR{J;2d>J;Nb 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%0AI`}b%1*T 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�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 z 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

XUsm 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

ow*K@tbd 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

Kd4=Ojvb5~bTmrh_-QO|T zHd7T}cO*V0a+lfN&OEx0h56GTXtm30vAjlOwjxuj*%Ut1(8C{-coRNDXHXhPdvp)P zYWt4Es1t#QPawd!a5{F&4hnP;&DqUeWnsYa=OsXvSQ zfqow@#svEK1rHNt%>AZZHY%QQgy19llwd-|zN^D%sRfH0M8RWsAC`Q%mFVqGA?258 zN`}Cp11jQH)wlCcdm#cAxggqD%?cpkl8SrNZzaYV?_7u#YbhgCRu6*=^6p8jIOCCR;U;T@@Yxmo+4{(a4gWyzPKRgOK=9Geg=Zt`aSM1&)SsAJdR=M#w1c;xi8e|w5 zZttlUIhc`QP>aj~X;h>}GL@AW8=ZoOdK#*xHdW1NeJaPMLu0fK4Laf+>WF$AKAiEX zTAb1uli!)%8Pbf-oKl_18LCS?4)x}@xM0!|D@WDCNmAONNIR1pl3b(_+2>eLVYQ-Q zN1qcZi#rGN$_@5Ju3)>$eNl3~v2=uuAru?yltt=|33*_ZM%60y#-!;O(@<`(HfmF6 zFG8qmR9mrVEY}!JpYfOmm{@LVIJs_btVK?ZRGs=9k=CcrQEV#C(ZN|k7ify{I0TmV zwj@|U*;tDZpR{^N8&;38cBGz57SC5zJrZphn_jLXvUp;Gb?UuOz4wJYF@-B3PoMlv zA5MwU4Q?qIyEPdItt*J@%>Ed=IKa(-s)JjEgv3hznJu5^gi&etrIntJCRf4&~F{y%{Z+F>M;ilk^0e6SM12o4{VJkS0l7WD_`FDLa0m3k(L4WzClb)`z}D^CeK z^FL4O0+q_9t326{{@|7lh%$MT$OG|ciW?sd9q-W{38ja?<$NlLtZUf4`8O5f*Jw8e zJlfS9M)^jnc!1;Tro_k8jaRPxM+N%F`}l97FFVjbg}@ya6}SUyXwm=q>s{H}6^vUH zZ>VW$6P-%y%661k)XO$tlvJBlrd>mwmb&rFR<=up4)+0Sb8e4@qbrF6LiwSN+#Kl7 z+HenUs{e8lZ^1F`<^0AkqpFh46Mf^GT7B0_t)o-jbkt=~ z!pbiz)!jg>oD#S_$PUCdYVS(~5*bWg=Cby1;s|X;_j)&R!9VevNGS8GT&(a*on(Bv#vZo+34QJ`1rb#`1O=248%(4SS&BCSr?w3G0fAO z6(H&^+Y}r}8*tnP9MM1u7zKp1>UC&WQX&4)h}JMcHMA12#9btEh`5oc5ezAZdIg%L zI!Kuw)I)*(Y~KoEWcn5a`mgcb8t5PAyY9&=1N}E_MoY~^0sHC9Ee8mw&J(Q{<~>QK$Pi_L+Q-DlLHl(8n!u5`@<%@zt5gh*wYwLxD0MZr5*T z3UATFDt!wsUHii44Yyp_U)p1zw~0$G24atWy5D1p1BK5(MHZj}4zstXs~2bx;f698|ZX2vwukY`}j+*w`g{1782}yhS+AKO*i&c)Dy<-hXzp9i3bIIgzLCyV2l51Q45Y!@v(vy6K`BI1 z!>`9Ha;U?k3AX48=p@Ee$4X5GzG!Qd&PVlXQY!IYKD!M1Tni+J&_|s}R>uk~fM&sXSPD0+ZFmuRp>KG^=mQtdDh$D};*4O3eJ<8IpvGB2kMx7NI*So!@5b{6 zdT@6$y0$gbI^+~?$r423KXO2w<{k3yG0Op;$+u80Lt>h14|xY>dh>lVlzN)Yr(kk< ztPCOtBZb8jaCVqaEqM_~NZF9!g3r=)kl;_a;cIHst}|}+uKNZo7iP;{N(~B%hX(O@ zL676-S%}JLX4>(TQh%Y|P*toN?B|RKZRMzB(%&QTk`(_;Xsd)aZ#41+uwu@)UGM^3Sby;=OU^r`*abTBr6Lyg-E)Kqw z<(y$g8T7X3D=m^YGP3;|Ip2!d#smqQx;<0HNB)W&c7{$XOt zMzj94pobvR3h4d*IjkxNc|x{j#S{I-^P)A1y_bNUTe4wKi+=5yq;*`*#F9gzCX2dg ziv|^w<#U?|Ty91|IGL_{?Cd}=6_rK zM*g?N3y2Hh|FVT}ryc%Isxf!?rEVg$>F=fv{{eaT@B4SUpS9sC|K`u*u%g3%kkpJ0 z{~=Y_8w$y}o&Q7ohEbt=r>ag#0iNT;c6UhXw6xS|acAgWcUl7eyd)}ebFk@ITJ;O*j~Sp}j9chv+J=d5?BP!)u7M=jbbM<+av^lu(z({fr$dF}lJSX)=R ztoL{P4Lv1&)T=77Zz!c+YhP%=t%b#kqGK5+)l);x`ds{3QB!C^aeR}M5KbsDya?E( zQhQM)no1nhuwkauaob<3V@AAKN?cOMjQE}Msf0otCez&RB+4vkqpmi4a`T5~@-h8*I-FGJh zHED~1GSG7>X)v81YL*j9D3yku*>iD1M?72Il8_fd+(aDFaL1e7*`9OMt>|aF4~+Pq zRfcU;va&bd%ht}|^pR19yom-+x8m+A?cz=BDu{4{=Y-HDzh@B71^b;%?+D-0jtzP) zsxK}|Ijlv5m-$jmb%sV+kK6p{x<5DtFg{a(%x%T7yMpP8@p{IYr*%-JJ zaYSAywb)g}KrT|F;Izjk)pF*Iq-W=A?bek|iLm z$Dtd4s^fS|?M^TQE9hUV&jWkq1kR)_Odjf$z9RR$D}aH~&+4uZhiNXmaHglxi-#ea!)X&+h?qX#S)A zXcK)A8$}L|oj;A%t@#$`^r5c6yK}^G*H4eFJ)YrSDbW)ULV2i2`mC6zciJ!u&>pXf zUCq#zzfwZLFlsE88*{R`P(AqjAm@IjRyhnR<;*UXzLuW(J$BZ2q4II`dVFINT(d6u z!~o0;zL5P%xzw*3OI4Q57YvVz@W)-W^VhVtvkJ`3Dcbo>dA=&W_uJ4zfU{&l2 z)s4I#GDR*QcZ>)06Fee@$LlsF9^m8X(+sv`Ix%Vi`izsW3|eFZx|SIVSeqwvj(iC1hpKj#9(IDv7* zHj%)31rc5_`$oxWW4G)yf?FxQc2FM|j6p zrId5EYw{RQTnG5#V~Qhy#9A;BpA? z-DE)!z~XF_1twQBosHksLAl82fHrApw$}1Z^8)kGNQ}vE^5w^SWCJyK!u&gaK2lw3D@b!9B~hcjGwbPGU>^Sv5FHDXdH)>LAHT>kn|P zS9VQGl{8kVlEy}4N0#qCj#D=AK1DELR!|kbAA>9VV((hTw+e^z`Pk9li86>kxA6x} zPYu#)w3n#Dhn!87tc@QEwfBv$iuu1l7a(R=qY~Jz2w1;P)y^oYb|uM;da_R5&Ioy{ z?S>aYd!T2}uU4RXVchy$92&=#>s?nOfT;2?`)ibgzIvh;=RJ}TX2n6abN4|xG_{9+ zi~FwDxXs$>f7c1Xi=Ue!JPeTve+~JZLUXO92!wND0FYMYX{uyQp)RUWLc5b{V3F3& z=4Vs|v;~&u2TqQRViuIZ+9&rgerIa}^)6fZx7tcYJPQ=H-KU=YNfd;{Jo+}2Tj!q3 zQI%-(L@EU8?1uFbl?N0jY3lUNL(aj85+5u#Q1V!OimLYa(w0?wPSsu-|EEjqa3t%{ z-Up7cWYr@W83Rf7W)7~ejt%e48xHbLWM><_OLg{2zejU$GEBntwWwn^} z#vdPhp`E`4VlJE-n~!2t7(Pao-TWpPWv=Na3a?`+!2XVJL5d6`*lLQp({QKtA; zPza#N)E-k~hiW3qA-&Bbui1M_3{jBd$A-ER+Ns06oFTK>YVEe>bXg9tzeAj0iu0>t zf56fz#Gvxdw~z5%RV$RfDt7;GF5&wH!7e7Vf1?%HA-?)TkJbdBQg{1GMAj-zExKu^WZUj|fV;bCwP2GeRZvGjRbkdfDGPC5VO~`% zq*oE%B9)`p$tnw~#|MSlAXtZ*Mf?tJE5qh*=0R;_aiv2W+2L0eu51@w{GS=3o?tGI zl>(CG%XQ;;QK$e3gH$C6RYlGBW4I#}(TIj2*BKF@a z!Qp*EePp8c3B92@S$Y+*Uu_2C`;^Fk0l$lgNz#;_cf@aqNfoh4zd}rUPl-vwNL7FI zLjOr2PNFW`z3psApq=49|0_z^H|qTlwn_L%3#hTL5@oVsIE^z8QR^tdv}FSoP`Rf5$C;% zG+!~CH1ACjW*|aOvK~kg=IZK-SZh$>8v7m{5aA~wtAxlD^7@h79%KjV$-`)cWTCyv zMqV$v5unROH2V6;QK8^T!VA^)_c*QX&CghbYzxW75Jc)Qu|Qm67J|L~$Y{^i(n`O) zk42JFq(mY&FJaYZV?Svjq$$&}gxGzFDI^em1vRr?*B(}5 zLFJ96dx$v3(urg265?o3#){Y>wPx|hIru`7GFHS&kET<`m(F_zuk#VX1KoU*BJLB4 zsPD@n)AK80U)zKali(Ib5udt0MG>oqQ^bncBa{nn5sC;o9KIy}k%gRE5@_x(A(r^Z zd#2&ci%1^O#!cZZjYl(07Y^e}uxTqMZ|CQ)u{#?Zc?xZLIa^c))A=pMg?lY4M5p4` z4rAw75!oTy#%f&8OBm|?C#ig>kp1f`7xQYpY_d zUxCiJ7OA+%wL#Css@P8?#R!~C%H*opb1FrTolFY84ML)+CS z)^&IuWllCVbbd$Xmh14FxL{FU`=57OFe!dCXqJ6zR%~mL(qW4hf$>e0$~>EFR5<8) zln68a`bV?z_3oYLJ}N?{6&G;NL$moK;STuoJ^hb(NDIFmeb*8JQ=tttK^MZHJHhK= zveaugFP3CpEV%T#=Yrd>!_z6%T-U0qxlWFc$#{koACG)+H2L+Jh%Fn>@{82_%wT0d zFDsHS1H3HNUpg8yR`RK-V_rrR#|<_qCbd=`?%;4@X-1=*8*x*mAXs@qQnqK5e=OOX zc-p}eUhBIh!Bc|I$ay1LsA$BC^51`&)*dJfa-1U(HzIpRv<^_JzEuy(k-hxvkHYnv z+^xiJz{Mon;Gst^1c{r+yFvM z21O(}=vh$}Tc=XMM?IyqDz;iu#)33@3c|`_Qn--qum245KeoeDf%^7jj_mI$peetB zV+Qsp@R~IDK8fbamyfII&*RGxVlg51!>n+`c#z_Xjm)hVoG276w^^<2{uE3tzf*iCuQFAtUC$>Yba4@L8B2Q4oq%umxPa!5xQe8ruIIPC+%XoxdB%9bw z6SPeQf^t+oS?ZWPj&Y!gPF5}ms4Ab_JyJ5x7?n>RR#%wLsE z$_C~bgGY71;IHBf?hYph599<#)yMk0=#cv@$9Cx-b1=@wZwqw9ZeE9+tVnkvJny>a z@CSykSZ$utxSxvHS|ZQb)iN~)x>l#wXk`1V;uTaDswHTSy?cYcRFi=DssfBGR6K&Q zOn(q~cr}hWBd<=UhdQdsTS3~JfrpV-%Z$Vh&mxY{%J_NtE#!AUzX$j&H`V+|dnoLg zH!K$VIK-aSk+On@o;e_ty5`q9munqZv`4$IijU_8g|_;#W#qEZRg@I#)D?ISn$suN zsVm~scn#ODt~29%fatopol2j!BKFc#N&;iA?Gndzr>{cf;2Yu{Q+!3WS}#dRdSKz`e{Dypl;6{hI zbg&|!t*D)xhO#{nueAQ$beaBK>D*nvITsvqQ!3z?GnK#W z=6>3cghW=u!=(xF^`w<5vXC18@b<=E(w;Ud)ljzHkVP8FQ%xX@<<(ARAtWm+99|hm zG{aCpfawZ!7BrmJG2q_78?6i6^<$a4sr6$KS^sEk7E~U?0f52>-|3=_rV;r~3xWlxh_JqOLyh{aU zyKy}PMPiSvug`nwN4S1ECpY2J9HvIRZ2msc@P^#dCiFyYO#fOw-E_&PdGcxccYjjf z6{LR`te-BQ&b{Q*x7VrBvqEKo;+T)s-03Nv28C7hp#wiaME;HaN9RT8JPaV&-7p?I zMFCm=MUzC8+Kk6LaYW4ie6xWIKKq4E6CTXt4uAb-lQx1k2%_(*K^&WoBFU`fl2kyF zb~0ngK$D*oF|m3^|Qg~OVHL?(yS@;K^q6SumV zmY}DUjRhThU>N3ogCZ(7PtU!77%FW@=8n}je0;vV)3fPuu28#yYRPC3b3B_Q&Z0i& z^YssYDA)dp2-P@Sh~5iR)T0o^7aZzQsHMm}1bZsc_9nc=&Zbq&lfVRUm|HGV@A}E8 zGQQ|$U$=DjqP0hJW*v5ZyRCWY>|>HpmX^@9V4?O~%HF^BK+dc#9v*Oh+mm`(&dUQT zr*1Tl%iRes4R2TdO4YG_wm2-5Wa(pC@){#q`kR)#kz^X(UF`j$bIaQb2J=Kv^I*N= z`C@Qov0G%BuxCnOj}qNX+C5><;fSL+G;j7X_tC~y+(x@wi{)lg(_vpx*i#(#u0{wl z(M-)O`+92)ZX7&QIvds3;238>@~NOoGj5TjUd5O-FSf3Fycw^lWeP}RD!yF zwx#N;C{_|eCjqPk&=!SixTq&itf68^NSOJ4YoD3P#LN5rzvua$2QugEvoCA!z4qE` zuiL)vS&o;nu}IW16t9K$+RH9@MAeePORS=26I>M4ELPQQ{gP^I@oE4D%4&3zi|S+5 zjNU5zKr^G>Xz;??6rNfb58*&}wQIQsUKh1%O9g@h_bhGFmbzyIv^*?h7<_4h*vXZ zL^Z-d$Ey*<{EBL(sA?pGQ4PVtk&}*NbcC3Jg3ZDsX;YewF_GZV#+bOXW;ItXCH!8g zW5ZdeB+BVRzqYVg`FVu71I|#LkQY9H^!4JqqaA3vC%lmruZdXDC zdH;@j&vfPqOV0Z@Rjq9P*-C&QNw<*1(Kw(@Xx{Y8Ji(61&6|Fs9_-vnq#iPxH~mpP zWH)bm3V{ps4A=|~Ek&^*oMt$(1j=!}OyYk7m0iu{IC4v1#Ls=uo6BEUA4YP_*gHZV z)rXSLmFRCS&r=_YKKFsUIo7BTQ$F{>CaINW>yJVoV99Ut?vAiZ4ij$irIrL66@$ML z_|Ya3g*eV%#Xk)3fx9}rr&&IqnnWF}b$%gJmrV`qQwq<+@!y_XK$+g!{zlSoSZRUi4eRG-tycAI;g}bLd7b zh1w!j(UmHGHo2_YPSVubXc3Em=^$y5io!=uQ@@#<;jinzAvCwQ~z9dJg>%!ZsgJV=DCNP?a@`El20TbsXLO@ zVTSCDl3kk?m@lCb-V^GH;DJ*NXQ0?AhO0uPmFGtkD^D)=Nvs%$m@gDtGosiz6oWg4 z70ZiB1&yQ3olt#%v5`48QFwARiI=GoyuyR?btkftf_2btLmC@Pyaxe~2xpDg%}IF@ zXug>|Adix~8ri-}w$UD{2a#fkila70C*(vyp~S65&by_4k&ha$r4*#90>BUO7I43JtxG6Lk`Hvr0CJn z$pbM#YEH=il~nQXVB7jO!x>O;ZYL~0Fl0~;%h&by$Z>T0VsFbR?!{UGIbH+7_N?v$ zv6?~RZL&GE+WKfa|A$Xz?G<&#EbB!YP z9T~|Wev5LnlMp-AFhw$p+M3~Mtb%^i_c97XR^(E%6(-MglPiW|Z~cYFDM6uc{kwHy->%HH^s zQHcRldB36Zs&h!2q4e4-eQzHgu#70y*LM`Q-0A(B%W#jw?gJ~cTHBq$$8HscMr7)) z(5xYI$YKu7vYCB1oj+^7``WRocBq+I{?_hCKHhZ?(qHGJY&R-*SFJp6|#@$WzBphR^3xY4!Z2CO1Dm-%9nj zTzyz2AA(PQkDq4uQ1IbM;L~Tb^w%hcUIM>xfE z^o)EIaPS?eC*aYp!Yq8NugnUMB8u{n0q-tzbCx`P*qr5mOrY_c&aB74Y=7&~6bZxJ z#i}C=^EqK+eyn3q*Y6U+MswC2uUrvmcQm1cjC$KfMTv6TBos}V6e(xlD)&Schch_S zS^(+uEL05NP$}`y?mQI<91PC1{B+Weef<;L?zpqfkKZlE0HrEtEMu+pr)2ExzH?%S zztwOcUg&lZ$uP%XdUK@Z`O=98af+IO-B33FGxd!$FM<7#@;p4-8H0oLG5! z@#3kwiYkXzol{hP#*HQV9(-vgiR1YY@cVa5Rqkni?fghfU$;ez7HRf+a+M=+)a)wX z`7_0e)yE3vPPjeOLO!)#yJ!kr7u$zQG(M6qF|$_b@cWj{k+8#4rMX#~|7 zs7A~{U9)c{#$fH$&d0ueBwCB=(5^4;P&Phi_}&|wb5n&gFY)Pm<5TqWWxo|KdjT1| zJC{1`iIfadm}}4o)Uq6cHv2mwt)4b(X!d+lXk(a_YYuJn^23|xM$Mtw6=vVY9uj=z zL!ph0lEb$#k59hxLC>JovC&78zw)#vZ0ih1+Jef*hf!f>{528i59n#xLt%gUpfA^7 z6ZOq~lK0!D`D@Nd6{kzwhVoxZ8hV;yxek&UJ>c07u&C*)cPG zAz4>~W&a7@(&F<;GPaQ6REqd+b6O6Rmd44BG1^JDq)>~hK^RqNj)H=Attdk`XjdA|Sci3fpa z<+;z>Cw5F^)FQ=u>UJ7UZJ?>}kHpC;{2c2evcU1;fmdausU^&`bXsRnj2j z1iQKtyZhnd3sH%FLdQ!e@p88@eq*~ogOkc|N4a^_=^5q3pM=GMOU=COIWL{g@zvh|+&VzRw1%IqQkC+A`TcOx$+|2f4%*DS2w1;@D zaITIOyVEFUpxcP?GzQb3%AOS;(NL05M-nXahpmyoRjfD|iL;k4BXE(jc( zS{2C)rQ+)bgR=6{kr_K7t478q% zCW;Zb#q3#gWtPc5djats1~EJAI#?>!hsV3rkFKkqo?i9SS*m{CoU48gR;ZuDxA7Cw zIDc-$6rOo+K|&We*m^8AgFh+weQdFcJt^CVY~a?Af9`z0N48J4R<>~fm~t6Aiz#AojRt;6^&zEZ06Rxvq?9FFd%9r8(2OA!Ax;%aeE+=^szI() z6rN&4A<07Sle|7;vfe>d6x;vg^}VYVDid!&+G2~3XpZ7}Q!aCCxRjaj5R)XrhT0J2 zgfFI4l4<)EhBDFW*J-ujLesm^j5g##+2)ZjovmO7fn;6dGuP*@>?>Zx-6|WtPi@;v zaY@CdR+v}2ejHHzHG^!Y1?yuatj2O6+1@h@sZXpi{)`P`i zZ?G)oWV42?Kx=Sb{EaEs28U4-eNA)un;_^2?8MVQ&~TVNdW`?ZX+AE;?Fuv;wC?a{ z`%Bg9n?6)doj&ZsV|Z&IZS-?U`!w%@v>+@ukhUlX8hnoJ`t4VVf0o3_GB6f~T$s7h z-jBf9Gv@WX70&MPoGEp@`1cqpldMpgFs@A7$od@A2Rd&7X)yU#O`Mvhkohw#;!jGE z-AP!Tl!e0_gCr$;!mU1 zh}J`xz2ezZ9UFd#+{{=9g@+bG0POnVLW5o;uL9#sJ74@7gd`tl7h@Svd?9$|zR z7Pi0}*Q^d{CE(h1{J)-y&1V=Fpkt>U(yrqF)udgc(mdNF*0?3u@Xe66)bt1J#)A#_ z^Rpz_P{Yq$pLU~9yD8Xk^S#f!e6rMJ`a^K04KH0|ZJ7>}(yrOM)Q|nR`XRovBxd)h zpB!0mXfv@j#j3Vld$Uv}A1qTphm8f;HBY@AH`bxPNWJyQa>OrbiTXLYl%MAEem4=4 z9)d>So)d=Af5^hqS(w&()|JYQ;&U`}a21B@QzV4)O%Lp64aS@ScQmJ7I`lwkE3ZGueGT`ZLZ-!sCOS5i25rl{X6n){*FwG z=cv`P%hEDx_oyBI>QXjcUpZrRbK`#3B+uzo_h?V6-DdZdGidXOt6~f;rjtZ>nm5J` z#5bLVG38j8;E+auo{jH92(YNM7WOr}CpWvx+O>RAAUqF|jA7RjR>mE%YTTD#|6p;C zM>%cX5iBcm4sTBLuDae=cGcB#X^6Hin3-)YFSG9TFP`sj7W!ii`Ie-V_~xZdGt93* zk7Dhix~HSsWUp2>%^Tvb>wI^>(;(KJ>wxMVXqxw)GHBljTRaBYhT-%Qlj}Tx`8rQG zq0p_X9HcB2dupetTM$reLqpnqCT>Hkd}t-yg8RN@eXuLLt#A0}jhcS!nS#0(+EH=9cb#tF6I_o<8^GlH&O!5q*x{-aXv!Aysd^x54OGcMaei}VlN>7}g z)8_Eye9x}8P2EK(h=z4z96xD|aC|@EUv$+B-=dVI{9ePaQ({J>2;63gInfP_Si5!V zNEKQ?V2{3Pi1mi^cqNy+>-SC(N`o$U-C6asxf9&;vRWQ)JlCBjH}EcDZtho4HBim+ z8s_Jl1hSV{@0Ckrv)Zk8cS(Yw(w2tLCf7IlxKzmelHJ-+u6h%P zqBtP`B8igsQ_{&wR{#;39TF+wTxIVMk8V9OMqV=tqMM=)YD_BrD~c;2uUPg)<*MJ? z9UHEI<}mlK39*aiU8uXr2_`#UoUeJ0uvff;|C0AuTE-r777!RjIC0|i8kp?P@SL`} zQ=#!(SrKnk_q z3Bn^Q-LDPA3D4QaYd%*^gh|ea$en>5`3Qd0>MuXzZ-we;VPAQV{C?!q4nt?Oe+9HI zLXCJO)Q{psBO%RUntBL+)J!y|L9@`yP8MW`DSQR^2y5z&1UiC3C$BmxEis*bYEX{aMJ2^dC zkA<1@m-k2j88BSJ#mrL6({6CvoDZUDjtw}Wvw{Yq+M7|W%hNCb1O7V})#ujGmP!B1 z8hVnC#v0niMY}>sUuV#FLP*u1Lr5J>8)(LNPWQw7;IeA0F#^-y^Ct3Z7TISZ?WFJq z{lSI-etH!r5NtT{2M`{9pjmsBKwY5y|L3(xgs}g=7GHDuld|eUS`Ym8;s1T*9ac-N zC%*FjF0V|*5u304eIBN^c#c?Eg}(9+{5VvPDu3UneJH;lG`9FK&-rnyr#0JGegxZ9 zc|6Nkew4^a#b$?hrPNgOVQ1KKNQAGPBxT7km1g%jvLx%WWeu`I_R2D8H-)k5Ad-x+ z$DA(<&CPzHF~57PvPgsTu5}XNAw1qltaJ=7-A}({>9TBDORpPi)>^m8@bV@)3BDlF zuUNn=-d+}O(sJ!`jhCfrt^3$Bm|Z{FU%r>cdD36r&QE`QGfu{#esIV=#&=G5G!?~Z zKtG<)jz$qMe{nf~7-RqYCkSe?+d9;4Yfsv3`_&%X%h(O5rxUW<%34jVdlqf-x|iMd zq}pwVPZJ||+jy&+Xmywz#8a1(N)udhR4Fbw3a0;y4L4qVs_F`RUyMxTI5zx<)f6Wa z@ocGN`_kPuX{#N%!^TVQ`E96d~sG zotGh95YLtjEnDzqyRl$|wTf~V&QVJSf6nFrc2Oi_hfsc_ z*i#gf!>{5=P+SZm(#Wd&eJoNjJzIbr%U^01`GLLK`FN>y6sIrLW<>ef9_2Qxs-mZ) zC3n7l3sn&`$|`|6hKO|S?XqG%XVphJ@;2BlZZv4+ z*&~!x5+@3M&1fUMpgB`4$VxrS{2oOz6L;UOkuSxb6zO;>Y`&iw(g?xdyk&*b)=l$0lD$wgJY z)7!9~?Rb`J!2ZP)B#Vlw^uPR3ovRPCj;r*o`3f;W92muU*Jj}vpauw3DBM5S+jY|0 zGUe0>h(! zeihWa9~{jHKpnd17MJ3t$yG%JOS7&&nnv4P+^fkO*$YfrVkh12c}?U5*18$7URrDf zfoq7Mf;2!0r}%-$!h(^};wooqKEl}meMajM2UiMrsY@EDM-W4e6^B4ZD{~cho)VY6 z%N*9o3~JpaqK8tL&i-&Ab5oRMtTh%I{h;>Nu5k)5lLre$CZwNuY(~OTfi$D0f8mI6 z|JJ3lcIFssr-x0km^vLBmdYU4=h(r0%)osFNxilEa0CZwF2-D<4mQ(3LXR-{zlnA&B5)k+9}nnJn-Rf zmp}@>4_B3;bydXDUL?&4AD&`l`EOnW{p&wexf;5vlRiDdC$SlVp^s&DOJ-K%hoGFu z-96teF$LOPDS*SB91;xWCR^)~@v?Y1VsSBJN?;$peU4}^0UN;X){kuKkAi`Yj2(nz zkgIpZv{UTl4NFg(vh*YxhkBK-#-)i#Ae_4RbaXpsj(8W3@?KyXG7V*DhvQv5KpOV% zu@1M$8`esn%k(FejI;OLRN8l4zMTV0ywadldeN-@=;-WO;=yYS)f!bI-@j4t3;9TT zd|lYMPp%OCglF{)Cig_o>X{~2{`RHA)m<;utz%H)HBB{YipX^yL`*y=yVFcTmWFKb z#k1}POb|Wms3vRuv7cWgA=iFRh-j|%J@&@`iSYKudZxOqAUb#v_>r3(Lm6;Ocb^pp z3RB~Mdpoj7gMyTXwBvlX!$3hyTr;;lUTR9ESH~5aJe4P7XvzXjxGsUKp^PEn@O{k8 z#jm!r#>h5dqNM4l3jH6AZU6g!FOXpq+$UJ zou$h}v4Qb5f>dXI?B#pBpr#cL(7#cL0O40^;>2qagamz9ZY=LDQm|L)QE(EJm)B!2 z(|Cc!#y}4i(&Wwx{zAmg>)Vygd2#R;B6D8fzMa3}n11B>*PM??vtyke`N?#;_J43(#~sUd+6b9Pw;Lv22mwN-xIG zCh8ihq?sTo+k1i)egLF&PWvNf0L<9|l{M)mD{Mi8$B9kq9faB5LKZcxJpWprWu|z3 zQl4etcz#4ZGo3tpc;0#zjZQKyY}0zTo^8AdGGJLE6SZ|GnO!McU*!jH7^CEDspaR! zb1~2C`*dS{Nam5a>M{>#_=A~K0hc@%g| z6%ZArXZ3Yv*QN5+#YO3<6wBXEZGJXuJ**(@-X25ekd7Kk?4v*u5#eKdr)A(SK552}f z_Weq&W+67-d-`FpB#iG#F>H_p3OH|(fg9+QRxaD~^6hlQ?6!33mKGbFIqg{@Ex6iv zKQg(BZ*t|{!w-6lT?#Gwtc{n?sD0s^C@bec`R8jeA)p`z2^RY5wcEoD+ zdC4Zf!`b6K*Hn@5s2ZaZ?>v(0*l)eZ-ixDc&Lh4Y5L*8p(uea zBSlY%0i~ny656hIwv?L95?62idGHIzc_DaKAi_Ri_kNg4*gx-HvwjcX0&k$Y+t^(x@ioE?@zM9jhhTF9sVLIuL+JP|mYS1MTFG09EmhG}0_{ejV3o&=dOM0K}N;4#~ z;dBbYChF6@t$7E!GWx?QDnfB_Wt148<-JH)T60SebonZy>Doy`2SZm~wtkRP=spPq>pw7YPczTNX5wlk+4M@Qou)ENIz1rFvt9qwxuO_CV4G7!7~+sz zglO^@w_iu`jIbqT^^#TXd8cWR4eqq9?wRDx4J8AVSn=8k<-45l2+Tg<_;FipZgpf& zh38m?uiT;MKOxq#VD+BbwOA7>JGj#&*>b`=o$c37_dVe7cWzlbaR-N)(-X0Elp(CR zbpbkEi}T3`jzoP=eGE?266ehxTsuF~7D`Lltj%6v_SN(e7ha$6OR~(w?4iQBlrk!} zK9)qp3xcrTozs|bP7&4;jMqM*LNC$8f{*^2C$0kX43;{)8+fJ$t9IPmU%GY`tY_u)RgcD3w`Z6lDQTK_Gz3TklwphK;=1Ztq{ zufXK$j(^5*gHH9W`i6lV|NS}SsMhb4dg8W+_na+jR&c|o^@XSSyb3Y29^Ohy-Fd@s zBoL!ozd&^lm15sak9OJuKHYGG!iCG}A1D^X0s|`FQ-T;t$ng6^AValYgh%uURLK84 zDzM6xmx1xPT$7A^5RprAhuEzGJfp@ zHoMw@XGexl>!v1Oc{H?f8=0Up!cp^cDYalCE1WeyuNpr-y#uy|t1 z>eoIKZ1yW`?y#13c?U|@t_#|xkHBQ1NALWXh*-K6k^5L3gg%4LN$>fQA*oQ*uKCRb zwbMRZb-#hp6}0+!a_6VMBy#utvjnRNBby(d<}d#^hSjaUn_u?{i0(_`FeR{BfYPYM zuXRK5$b|~bcf*rRorwo)_dBY410%Y3_$#|N__N{eolxBypkFe_{K&)`-TT9V;qDEr zy2n|{;5+aAlI}f2eM#NhGA7ZzDgN>kz=^3GxCMA$(Y0DCh<6Qq`OFv*5XZ#x4X=B& z<1FLjv1L37K1Y%CO8}+T8Jm#cYjWJH)>pI*L?zLftf%Dkw@|->L^*G64Dt#(FE)NY zGkzq1w<-9?W=ZKv+hk(3vT)1!d^dYycX9bZ{WzI5u-*m(;_?(TN@w`pX9rq!4leghDR9q=VC` zBi_Liid@LJB$12vAs6opxj5t4AR#tnUK3oP`<&QzUs_t)u9m8)l!IDMJXP2MS->pl z($7z10FtQsoBOf!H;Gk5H1ZX!;%WV2|6p{>jES?2wcEm)t(^gj9M~Ss7%k8rtb1r(%*>ep2pF^?gR}B6^+~Ns|-arwZ-<*Y^O@gN8@I^^wKGp9SZuP8)$`NbX zQ}@qsN@Nc$N3>I(hEtxpAH`eW$V_m)iP1v+#4E^wH;Ls8ooC z|Ca0JM#d>(i3b&kmO`pPbSnfS(gD8AkPjRc9R8}C|MHEA*wR&@U_|Fhmk?P&Ll)NB z?|_CBx2@#FDYp3zI2O`T)*5N7cS32zobZgKGh~afof`gkyx{qT7fKznF9G$Rj~RqQ zHr(1$r#+s&-AGrSd7!%T+?(Qj>^reyoB8bBd0TDjVgk3Wz21xo+NaO(7Hl~9=`)U| z(~No%?n)`(NjOiI3fj0SSr7;DcEtY4?%5H6dr*#`LW+=&PKnoDrt0Qk=P+&0Coz1L zGDDElGNx3R5qpFr6qj9@RiDeyM9NYQMz}LrlsR@i%_yvlKM>IVt*GWqo!m}p3gcgy z0D}=4pn0R=4$xke-Sd6vlxq0@z0H>4Hh*N4OSH*E(<0HblW<+l{J~+p~#i? zQ2x{Ya)+M)e1@B%Y%~#5xkFrXqK1p1Bn_E(n~S%@Ag+u4dDpS6oH3OTB5v@_omN`P zrKj!}6jF0rFMhsqdx%^spd3-~|Fw%eED+*uciA!V3D#ZRg8Z3xwy{(4t^h`=0zFbP z`RbTkO<+xawuG~c>D;eN8_7dd>(@P+;2^5?vJ^vdw5PMXn$~WT)~fY%qbVq%aTlxX z%@|ag)vc+{KY)Z46%~5B4Pj;tCKI`yhf7TEa}9koHeK#C{l8!5uHEVSD{t__?FK0r zKbzh8o^2upMz4dI^wEFti88WXS=?ul(uMFVoW?_7pNxp-VGU;TN90E^PUh(4HT~7W zhbM;Qz9>v5i6hrf$Up9WIM9WTwP|Ld>rQo>1e%vKfTpfBQeGci)+O&d^SR|wcJ`H5 zJC~wt#MT1LuF^Zz$85UKvoJJD{rW2)&c&!f)@+zEvp;l75o zODy>c#^564V&N2h`@3r1r*E^k$oTHN)zER4MRwxv!3o#l;T1u{>+c zmK4moUcK@a8nRJimHspvRJRz%^85m%uv?rN1>eWWU3Hm;k;U_*h3}6k11qZBqx3cZ zCMz3{Nk4?)dbdvst-j9U8n5IlYHBJL0Iz)jcpuOo=;P;J&sIZVe*+-K0ZXUdb%+MS zbB(5UQ&Td3TBRQeByfv>Bo;O3VWS8^WKwf3f}1eBWz^ryCG_J&1Lc_84719$=q#1@D>RF47sG(D-XrS*nE?otg2Tvunnq&ew z{whGR8Y7e#pkFn|2Wa7l0Sb_=2IvW< zPX?&G9~A|ce{rWT@H(0nKpnUboO!Bn+GC?#C6)EC?aC0}n5cQlh?=jIn#~M-iK@92 zWgwC@93GKHJ|*1#UBha5$gY+HHOvlV?d!&-h9SZ;c#6~JLbl_L*Bx^N7mVA> za;r^u3R=kPn^8gI{4H2Zcl6mFg<*+wxIbn8!P>L&JHn7w6YtP1%|rv!HU>hiI@8P5 z9UhExn{FXP;0@LAbn$AuiuZhn|DX#;j=?}^pPrxA`tPy6vg>*=uJC@aE--D2sv)vx zKK3Nj`vFvEc$~le5ew5muCq2#`%hl{|1*;z}AvV~}5#-PHXc87>r<5Fm_bJz@!tHwTtXckBz} z5-|N;*ZrKEPAof=Zhbp2k5n1o;_^>jw;HD1yEvZQm9p|OU?JkqvX&HUJJ*Bvf@5|) zlB@8mgq!C$l-!k4_fBn!e8a{lC6QTwe2WZzW@JtZJcgs`$1=4NRmBLYvS8uVL)Arh zrmVzrJ>EhnMra%_+L!H04KBKp8jGz1z9rWzh*;Re``z!;-km9Ruh-gwYg1#FXy?#Q za|3psT=5(sHj8Ing~ff7ENBjEIA6Oa$@Iz%(jm`kK8^R!U*NA;z~w!5|6R8h-*&6( z?Bcn%x>Jg(Z*^rD`e|F;&agy>0QE&>5%IRC8d^+S-7k~SlM_pIpx-|yMH-d{L930j zBQW}OWhzffzt?YVhk~KA5Gu-w^b5kl`2MHx&<%k%xGVLb`#%4?>r*`gQP-VvV#cQM zjJ3SqpLuQZZdYnCpWHwuZl<=nW8vwB>p`b00}%J?eVzH-?>x1I0L9m*`VR(n?>`oJ zV}Dm*_jBe^2kkY{EoNTc*nf1?4!bC0PpS*xl@YPlpAs!+LEp}TrWXSJW&`@*{HdIk zRR_u?V1d9pm53j^tpxe+1FqQzK4|K7aHg_SNj`J-Ar;|+~k)|X;Em8cYJM);JbHh1X)X9dKfmV=gE|4U<> z;{6l~s7rO$W&BYBt2lhS_XHryO9k;eH9@J&b!6wDH&sOPjdcT>b9hetoy?aiMo3S2G~Kw%p3CuRcWwn zw$s`g!I})zjdikV0*C{LUDy)0_zKYH*JJ>u9wJv$$h8)elT2op-hWxwRYxv!B=viW z(eEqbuqENr90i{WNuv4>i~=A5fZ6Y?iEdh!+~ib^yZzYywuv>G;r-dEri43!s%!It zayLMQe#J8bgkc~(sBMn9GoDA1e9x2bqj_O^XePLpK*&y_NXr5XXinK#8^_CLmKNtd zM84Cab2FPydmuQ+rWl|H$<-$%V1En_Cphi>#Y=Yg#|DdyaB^eJ3#Q zr;fmdY=GUV`@$A{EF7L=X_g(9LzX?37K`=(ewF19@U%<96YS&a$57eXrRGrC1^m$- z67Gey`;he=|B?$f7aw$;=NXI&@qGwqNn73V@F?S}uk3=&fvZo2WSU%aj4jvF68MJ! z2F*!RQx93VV@2_qRC<6&9*fT2T)fXU&T~47dm^q+LZR3R`Q)2-_U4H8Amr@9ply?4 zIYxsR4768srhD6SqvcB-O&x4i&aG}^!L8Q6$EZ7hop@cwD{~+k8hV1Wr{?smxvCWI zr9(z9RKOX~u-WP_Re=~vd!Mxa%`qL0fErzARJ}kMdgH+KH{*t!RMl`h`)>K-`g|d{*fWwZ~ zg7bS`#AIv<$7T}aYrgxf+PuQP!u@vznSD=@*?qZZ&DnV-_az~g-7b3j#qxGc=Lgv3 zW~uV+H@pApoEL}CSMz}W@mfXwd^Ha>H!$wk$+!#63TY33Sr4+IxF58-ok7=Cn?2V@ z9gS@=C+#D~3881p|IM5XPf5F)l4)@`bSFUgQ<(v-?!ka>=lBuzf8{)A_l=l{k@JwB zsC|^`BBoOhdKw1)Rlc;j*G3Q zP$*`Co#|&8xriciG9WyVneFI?V7-|eNaZMqqa6S2ddGhTupOF;mwnQ2Av%*bi3c)*J_6IxoGO! zve~}v%k{RWvrFFOejj)P5f0FVjSS62ogRa*FU{<_n%jB{Q)}()kXNP#m^p{oZf6yC z1i7m?INMgyoTVTC4b(I{I6D(5^+BHH{7cnsx!%y70>Vq2QwX`-QX=Op=~Lr5YBLz# zS3M26mh)RmJq_b6=kJ=C(druKd|hT$F(1>`D8%)4L~GjE1rT6lF56$WunL6DMa)e^ zm%Z@l)*XR&4;)jE=}&G3cOiu14;%|-&Im*fe3>@;s$###}5OL6P!2tB)*79;6G#K_F-{yir;?T2Y5cs z|3T!-L*RxDxodf*nB{e)bMdILOa6R)&sHFi&SVF*$+88G`n9kED*_FIq=fHA)X=Ui zk{%METkV1xyCC=w(!RxJS0r2Fsam^iu=y4G>%XFODkY~LQhY%-d$=ja36yObYS!iv zNB}Nq9`nC~d)4%F)5P6iZlH4RzHY8;H8v&qxKYTw4=7VFPs18^*a~)?Qa9l?DY#sJ z?UMlnF@f@Vs*q%d9Xk7kU+6621U4u5)pBVVJ+| zKgZe;(Y_tobBk}$=w~^ReiYHZ#iV{K=-M>YmkPPv&GzWkmKfXRB1h9NcxTuNe%-EB z7^A(&ZxUI?XN+Jc$7G-OEtO#jm$$^G!*B9;bjq+5mw(IAxSfnrK#WkOEsm|h%#FCW zP7Vxk;}`>P*j;5#e4LN7F^D zH?OvcmkLMI2|4wO$NSwez7v^RKh}&VLEONpX19ocWJF|O8`tyTy=TZY8_H!d5?%KM zQiUgGpx~pBuLa)8cPu*u6fKHX?lK4G-8|LW;Vt>T$$c%?mj!mP(h3jVin#R#%!3ac z<4)~B2h{n%G3Vr!u`|S}0~i0iXeTY`Ppwiti)uqECTFiZ5P)FAPHQL2I5vpL$IS_` zhCZnnJqCOFDn(g%1X z@kCn(Rw@D;Ue4H5IA2esZ&T^n#;I{Ro=AVDT`+yQTn~s?!|`Ip)ojHTSIHlw5v7H< zRs?5?$OFn#RI$MMSfZ*GswyJUEca{6s!@8WCq%0 zU``=84Oop9n$x6Yn|@4$sXOz+PbxRr3CQ%4x4d+}%^o{3bLE@~>n#7C14o06n+}r9Y^u>p z&sHNBo?7AT1<|AfnW_VyjOajro!YiUtXri=yQKrf*p}115=z8X1NW;z%I=oyhKw=J zRby<(F4Q=74oTr`tmEo~+HuCdm;XuMe|Sc|<0I1>6*HFOUq0Bc#$a6vTnnB1M!-5x zU^PV0Rr*2&Yf;qALGO6@?h#GB6H%ai^^`sqYvuHJq?LmsTKRyqL@OWbQj^gNvS^T! zIg?2>NDG30<57*kB4sN)K3t*@Jf;)4E!NccRa5VdXzF2U%B*DS1f*9@O-mAj;w_XD z$f^z$1=<7qhH;*wfY??>xva8;JA0kybL&czuSJ|8y7*aXSVu?1VUsrck(2L7SfE5NhEmsB__5-q$;9nNWq*FW&enYFOxu7oTswZH`RgSAOf3algR zc!&8tGM3wLI?Ted3)ZI6;Ca~--&d1OMI15FY2j8liT!z4=`?;JO1>&C z*6s;DT!M)$RdRk1A00>IpP?r)DH_`A@5b0E{Wh8i;77n#hZr{BS}TmX;)!5x)U=Bb zURI-SQq50LhY(RY)<})*B6Aa+VO)jCZc*50C=q#_oq-e6$(R=LEx-}|XiRU2{z~+7 zhWZnQk5%gpl;v^?cQndbF{VlUf%F0J{ukw8brrfp-Ktg{v*1Rqh`blth|QJWjgvNO z1CuDv>RD#DR%;4R=3Om^qCgtX=cp&Y0T>Ezt`j5@e+M#HCPtZfpv1Q9?|% z_ZxLm=`l_!$I;-)NyVM*Sv$w<&Ix*t%cx`r16}faZF5ocm|AntE5lY1yrD##itYLj z6z`GaSxZMaL)Zg@`ZU(q;wts^v-hM~JlBTNN0dU&gK^Xd^y||Bl!AqQwN`}^RaHuS ztM?s6Z{;Q;V?MefQF8}Ztq9&l+#RJD>9d+$%fw^E2w9MYU%yO<>iQN%G)2G5dWflY z@ywJq72CIKS$y2OS$xCeW_*2yuSx4+3t-6RfxB8;x;KObw8y;xwiY_)U1xTPg9O3& z(0It9C8YI=kcZ>e8SaKfQ(>!L!TuigmlaJ76SN)@auA`9tnl={vZ5^P1(qGca4CY< z@h?_{uU2dmN>zWPQqUnNN9|4t^LJ<-Q$Imb7D-fylLT4s}+}W6-&IJ{nfH&%JH{3ni5!-trhZ zg>}sI-qRys*sHLW>o*162a%s`H?^2jxlqh|nMr!&@N50?s6{wSs6{QYnVhCPQ>wC{ z=wGP+_mP1p=Pd4WlSn2c{D6d)2|gl{+Iz1pA9Cd*aLY4zG-tm;yM=nk{UEgXB%%bP zuj#4E|GgLAcT3%7zgO9;N`QcEhRv!32(U%34yOfD>E2ltP9YbnwI3F|=M>L(UO`d5YaL~`tOG;ZXh^jSgh%P!EfDWpYU-H?d1c^XH<9MEW-snVPH6n4URL5?(=G$|Rk^O(Yaa zZA)UcU8YKvjs_Ae_T#B%t5jkro-(^8ILl_Gs+vx}OUn#~NpfQs5>Nk-bSNB#sK%h3 zVkFNcAGm={s<)NX{Gg3-a%|Yo+N-Ly7)Ecur4})I+y5_Qa%knm9%yIo93eeoKik|e zJg}*KbMS6fNY+ECq>=p>uQIA40KROS;3hQt6kJo4ezSlD-Xs!c48z&Z+@7-3?Q;6Y z%5mduz65G|?O|xLjmyXG zl?97l_|zP4n^FIZP*1ZP2DaC^`FlpLG30XkcyWr$k8^@N#m{h`-IJi&Rr=6j8P#cl z1{p-5-0j9VHZYFIWRELnNit03y(96@!M^^T#0a_XjUip!1$lO$=G1lrH`FK<&@;96 z7$yeod|tO3XrSIxd6zlgu8da6a9V*iS50=0(aYaJhLR_`*RkRL5o>0_0%N@ta#|Q- zV&P>n`)thEx2GOLAIy2bwaXIBOzSHf11-r!IqP|O4!fG!Jsrl!+7W2HQm(d#5r2WPAxz*XHGD(1y2kicqL#8C z9ea6N~3@7-5^?0vFD^1^mb>70`R2m22aC~rS6A{4EHL_f_|Hr zVr^J9JeCUsOY*aoO=~qqspFj!Vk>hgl@(k>K5qx>GM+l0)Wjmaj+fEs3Lq=-b^8sH zBxXWMtd{enmT0s~0{-NYFP@&J^5w^E7H@X0h!yC5M{sA`Xg_08kw`sAs&iT_ONbZh zv`C#6GR4!Mm!do8s>x6a@h4-VegXn89VYH~HqQuY7EegCriV0JOGrzB$4E^JX=&}g z8UpjC^Ej&CSCbLaGRKFs(d5o5#S$B%=Ip?hN)r<>i zx!CfY%i2AU8qOaZ(#DhJ0Z>UTX_ryq*Z4mH z&(6!ij)~Jk+9Yb34C8bK&tIp3Z%hekQ}}izz)WokX@ysWv}r^mxGJQz(4$t8cX&ct z8$H^|=fBaT5M62KxdT{t0nl!Gw4H6El8O*FQLH#Gq)k7ch}R6|b!5Gsv6%sA zrHsqW%R<_${*ZP9O_nk28qc$No^x(Uo7+ZYX3EZ^OgUBFa$!iDPuU8}E&$A1d0t4j z7BMB2;6)W6S2K{eQO{!Pxjj|C`k&Dsm`*lJtO3N{dPVawS#1{AkBHnxGxNRC${ z16#x8?$$Rr(gh#+fe;{~Up8w?{b_Ujjye8u=xNdXRMvA>xvz4I{|Vu^h{NqGzpwa! z`_faI=;}({=XnNt-S(1c?lB>)9w~uCy#Qc+MWB3ZARV&{;+eV6E*bA0L%GqO*A%}d zZWr~QsC!A&y(Q{igPgre_x*DqdWm-5D6QV7y&84%Z%OTp_{aa@qj%?IW!oUOUWx9d z1{;d#UP`cGo^(%6KJ+Nj55V<1eC752M+N>lbf9>TdyEmm$y{$QxlBQlQgW_)5+4Zd zWPle7JQb}c5Szt4v*=MtMmeFmif+5beWiew69=vHA76w!@$n2F<8apkcWw4?!JqKW z7*`nF;sdVH_+z+76+NNavgE&KOjCm~O@T*VR-43;v>R`9-FBl(<0qRDP0jDm%neuO zpUNB;p0D1IW?I6w{9~Cou&f|~uBbj4)qf*a{ntF@EAqk@s{$Wojtb}Ghch$6S?awv zGn)!dWR9T%^n}SEe_eGaHx_2E>Hjd=vFZ)0Uk)Z5ToSz4@7|*K$;{b*k>D(fF=x%j zS3+o2B+|YoX^LnYJmWpQ7et5P8BLi&g-c>(ZDDT}_il_)BY%g1@bIlsrI`Lsx zqS&gYsOu6hw&@pmqp7Z3Z#2VobG0)smgiNKCp#>z3xU0XhTa2Rh3y4V3}*`aV|%W% zOKrtf`eWo32b^4hsnRE@b|)Kq8<(KPLziU)8cwdqjpV&3!k31V-0=M}d!h+>cd033 zpsCYk$spp*c$0hlsU0ReEJ5n}y`qZe4Y`Q%W|8b3labl`;hCm=M!HQ-K10$+gFS%P zyF*0zGQ@GXesn-Bix^znZ{w5uhB$D=lsCY?k8DI+JT~CnBT;2krO(DX`a3FJn8-Ox zRalZ7InKcPOb&+k6m3*%swR;=i|pHFh9xC%P>t2;{RlG%;8t!&{26EyW>{pPdDA=U ziH>8(?1Mmih_^Cu>=K?QQCWzBtYDI2Ag+#qXahu%#2YRvMyEsqgQ6r96uh4nq zu|n!I3(RV{uAzgYz6`pbP$mIF6E6jC326LD0+D8(*-1#=IRB!_)IbayyOE&fldS{v@^Youqay zG}=k@xkAbeAEXoM*CkgxNiq!|q!S~aOF9%b-iIB$CMr0!H@+hkT+12k?`Fxh`F0%xIOVj!*k=PoJf}M8iMh<;$>e6X|hirYYbOBf2~`qV8|U zGmK3JcdpcUF@TQF1JDW~?sNsRH%;0#9`kvG@+RY$@gbWJ#?y9{1vlQf1a!fIs%mvu z0`_c{>q7nAHx&KP4D=$>!%^bBDwOKIiaalbIP0OQ z9D;__n!Fur*$1d}K((8#WNL|)TvD*t`-Z5z6}{VHw4%RMm0bU=WTSGFSP5qYWVS^O zXm1bJ+86507*Y;@B0hkJ9Wn)1nK9FVYulzydhRhsBY>leL7tLYiW!AEti2_& zA~}}#+v@&0JUWPoU>@1}$}`1MW7NVbYkTkopX_=5R57SU4+{%cvEWwc(zQpTtzm1e z*>emJs7jIl`)Ydho=OA(5EO^mHg>Z^=Z5U%7)PKuKyK|J$nSpRr4#P zMVfyf(qz~<)v}c*%Sx*CU3`PI)LIE$w~wOCOaeWb0EsP_>siO;z1q+@96&hsMRF0> zaEj>v8V3{(F{e4a3{G@3;jknYzV6((wc{MFe#kwb=g*MwalBY|)lh}-+3a7;hh4u} z222|tD7AeqTmOh``DF8IxnS57{0n;BPy6T8SXweMb8D%nwIx@0T7jS2E#ko79L_Mg z2wHmuBn&W>qCm+`kwc6G%2@I-sQ!ma;!usqCoW^Mo5k`4r7`Vf46GjauOnKnSIIha zbLs-pHjWITz#D`cUVj7`3>M8?%Q`eOP`0TCo2vr^8;tj1M7>uTouD?%iK%K^^2!U; zup&fXVAV1ecZp$EuCq)D*w7MgC8Bq81B_q4{={xL%e##a%^G?Zy^$1{j8ocp#b@O@ zUVL=?1Pgl0tU}n$Bc>M2OUrY(e)yi8=nVAH8|5nkXCeb5{ZAY1VN}CJIF3M8@IhB_ zjIy@(HBMR0g0#47T(;+t+R5k|N2tfMrS`6|g<4L5i6*bqa>8jLm1=T6Zm?*8_3c^@Nh zbsSVWaydC6u27`GYNsuhX&ISVT{0|r42yaIM%Q%z#&Z}RRQbwfFkKm~6~A3ibn6@u z8imtj8sM72^46{#V+^z7V<<&|6I2{ReI_&p{@$cu&xvCL5dEY>Itj@m*R!!)?^Gy& zNRDF%86PC0sCiyf6}zU!nOm1AJMy=?KqJ{)$vK0ZNT6&c#oLiksEWp9S|;}uan?G2 z`=T3C;-%7!Qpl}h)tqUU2D#oQz7b*&>n%TtgEs=~_&#!7(msOW1YsEsq2amCQia#D zX$c*9Mpc%5u|$$gY$?HSBrn%nBx zllxqXzsJ%APydl^WUYem{&fDVh?N_%K!#I)V5%VgRPjnT9+# zbL#$TA{!7W28lZ$TssVc49_DWmdnA`@VRo*xQL)In-y-#r@!9yL+icjt@ra1Ef-|@ggDR3<-ZCshlK^GOQ03m*yEmMaM!pWvlz4GToR8=1QDI z&ugQEIJ*mCAt{)aD*YEbn3figOiPu1+s$fPy5)WVrTi8vfw4$fMO}wlQ`41BQ}i;0 zhf1Xj$}d)IYFziAkCHIO>&kLoD+$jzCw9W1%h-vM?7ZGW3U9n#5O zETWx{(Y~kK!dBsP=m%~R?cZ3!)0ITsX?{5Av0;00niwxc@i7@hb1RAz^gc}};pwg@ z&RSH50no8wG25#kU}&Szu~hfDPM37gR%ImE^*S1Wl?*=+-%Ey1#j>eP^)!r)5(s1| zrJQHM9wjrS9IGfDGrOqLr?;xj0&sn*H9Ak<5Nn7U#AsEws^*Be&+ef#kG6}<&+lZIs5G-$xtDlh1R+?0Zx=7kSI!tyRYyJ3HU%dsH?@pW=#S z`sKL7>_0KQhtZM>%Ve*H*%g0(B9E(``Q964wb;hMa`fauM+GCR59hwHzaJet|D&;P?`7&w_)V5O$Vs0pb{Q;R#-|CA&3Sw*Tm|bN;Xyp z{9bUQqKr7us+Ktf<85t|O~SYU0n@3Wz+S{cSOzg*7%6#=_G2cOt)ejWyFcM_1FR5+ zMoC=pJ$HEqQ`}c4BjvF4?xL9VZk)3y2F0^;6c)$0R#;A7ZW7CqiyXjU!(oJUglpXS z;MsngC|nmW_IF6IRV~AeqxPo7r1`Xr?iT^jn5L3cN8@jJD@k)S{vY{Gb$A|A)P|k8Aq8{>Bp$BnWL{#fmMhw9?L2w+0d*kno`L0c=G>6_6^*Hk(Cs zoz+Bb2O64$d>)Jso!#6$zs_xTU$^?*Y-a`Q13?*}buB(@b=9@hx-KqmrPC=^O78c$ zJ_$x^@B90E`s4R{-M(Iu>vOJiJ)P@Z=XyHVIc{9)HmKngVII8bKzWKJ&~)rQ4FMQo zrY#k4utA_(T?ZZ%_p5sRo7n}k1S?>0Q1l_$PWbc6L<9AX;ay>5gL3ePvOTB4m^0 zIru$6du~qXs$(>tcVRvkBlGz>)PiyQ(g~hn-tU8uv#7Nyh}XWMt&%SKVNGecy*fg^mK7=(|Cb0aRA&wMOKu*7H85 zd|FP?iV18Nqxn|hpQbdBJELe*m{yDfI)?*(b(`eTv+=_w1UAMnt6i}NB18RH36li0 zbH!WMpz|=)#n?4JnVY%f{3%#EM4p2peC@#5CXIiMqd}~L!>gMEcY7qm7my)MYd6QM z&cB{&5P7_V*^>BZy!0NZC3SRj8pcI%y*ZHdzL3fWt%e4z4#wj#W`oW@uvzj7rojRK zHpTSGfW1JNQzxJCQ@4BonLWc|43xaKLFWEbg@R7@y0Zw zOG;$qll>jINWmmX6?#>sQDPbNQ&2;6(<*e+&55A-QVQnw$n(%9sI>)~aCBZ>17*M9 zpAZ6Vvd%)4ov$0f(FA+V^g2coUpI);Fxexgy}cyY-pz6yA-vv`n{LHK@jJZVQ||eXr$dC z0@A)FsE4$V9*bdz1-bzE$X_W(n4uZo7`-GpvEv$G8wRLYz}(zR`djEAE33evsr@xH zubme5H8nNC$M<2bm5p;9vZ3bCc)Nip*Y~rq0dgH;n>^Xjg5A?1OTdh&>>wU9ksI%W z>~kXEyN1CcbQSHX5%AS1j0Nd|#Dc$2txN1dubk0YL{WuyMe4Gxjh)RR;}THE-WEaI z12j7y`S?$KVDU%E{wtE~JHyF}q4H{<8^LU%WNDF)W%vN+lD()i=U6SU5<@{o_K_Sh z({=GaC7QlpKDn*6_jyoH=s+2e*v}==;tfg0LgL$ZP!#t0sffa{4+h^fh`59rron?n zX3AS6;ioA9z=#4s1pw-Oab1MCTCX1=aT-p}dR&d;;^J00Va+uT2gO!w3p5Z(iTFPf zIs!@RU^QAO4Rm}O=l&Z`I!g*PR!qf|eYCh&(TnUw7(l)FUt=#ujYA`9 z?0u1WY(X&_Q`FIIy8(kA7#=^+#w7%_x&R2&Vyx_6W_I3Sg%u|RkyQ@P9}ej`Wip+d z0*N-TFP<1en=4WzSmjUSx$&4i@w~57XYL?#c>a&j-Wpfa_;jsX)&w8Kvd-|f`=cT< zv-M{choj0X8X(be(jdW(JQ6^E7|s|1Smt8gjiWQNM#4;bY4_sg78J2lG^frdRt1@j zosj$46r45U>Fga)F3BkLCL>zm4^UzFNVi+jj+@XP2EAmTa|`qhKymU;&kegZO!vM9 z!)u6I$&EL|&dj=p*l@%COPZ0P7B~HFa-6~t$ltUFt0S%V5ZWbf+5=errZ*Xcm|ooU zCWGu{5E$nMWG{oXG6>Hg9Sm|95a)~Hro-&(2z@OTHyvSLo%FRp+|zD=<8m9#U^&7!<2!$o1z$3LgLYZ_pLf4_SiIiQozr~9HEHOA9 zukKPPgFmnTBJ4WU0!&3Mc8`t}ZR`5Es5!#!j%UmrYgC4Cnbf^-0U6VCUxHz_K{i{{ zDiKY=i>^L)X6tQXby{G52RUIq_eX(F{$Y&_=2sLhg@bFD323_vl?DLE$&mhOcJdl$ zWs!Y|Y?uYCA0vQi3sYkaMbO)jPL`0Kd`VS;v+DcNX8ot zSD6XNHUsl{v9s8zES0(z#L^v)U#@vZc^&~#h%QJ9fq+h-TzeM>uDBJ7B`52}%_H*> z&2QF>{YIQ3lD>rcEv;JGqom|DRzo;gwF^(Waqc;idNu_fgF|W&0j7REp=+lW-58-_ zOxL3dSLG_`}-6CToM)m3wc&EdWITl?0=tHL&)X-5w#B9mcf6YT5hC_p_W7bj8f}a`7=tb zYF11vwMt}!D7AEPOwasC6k9HfSsQur~|dgfDIW+{tR9k?3=SEsf=5r>#F-M%H5Kk3Ou zmv1UU_?d#AwNQ1$WAe2aJ2-p%46f7{U%dz!FF4Ps`k5!aDnyBH8bLNp=x{Fb1%A1I z+dBHxwxkY%eHIDR!5z+q-XP)G#ZoAOeJNyX{tKRcLK|3hMBByoTs_gERJ`oae_HQEK>%8cn8{p9F`m%jZF5s(vXShQJTi} zh5Z{WXo^X>B92$m+N=R5Sn#odEJ0~~*%x7|Ws=`l1uT%;mZw?qgiX*;J3wcub_{-Y z`4?e;{2K~n?3iqEEis(!pG$|c{pNos+Ye9;mMz)qKqX?b#p%&-wl5)DKWs!dJQ4%^ zE`ac7Dpj0@rZ~~i?@>~pvu4=@{s+jCg~_XnuYwhzr&i`fS~)~*WX-*;vE|WP<$S4D z*yIe?>Js+_4H>Z~LyKGj=x+@&f|pgIw(Fz*hI@gGn4=)Nt>YsYP58IA_2_IkgbKcn zq^x9{RMBTk>hb$(BlQ#TjXFL?oZg3u#+3Iu8qA25|D|eSGc{bTs^Pp7xgew3qcO3$ z6bsEHzi-w}ie$%91na#Rd86YrU>AU_ zsc^k+6Ph>4*%0GBb+ZEI*a|T0+q&dUR9oAMY8dZajr(ItoFkV=Ma*MGFy1ysiuf{b z*GBU;-#KsGq7M^yU|OU#H+#BaTul6#Xgup!a0Khz%1BEiojd6coqHOUW}Q1NT4m)5 zl}%8J)yv?uedScKbg_7>_u}JN>RRGg86fXeZ)^7oG~U@698Y#YFUI-RQ(z-R+v;jg zBnd#7+4AI^WH}>?2$0z2`deSvrt%Sre*+oML1{MkK>Ugk4e@gkX5Bj~rfq{$S=))O z^s+S~GrpRxO4cOwnSnC@GV5TIF-+I($eZ!%gczVC7YJw0jCD51*--h@S@~=<|8H66 zMRW;covb@o18;kWt1%8GlKex*k<=gtzdI)S^C@yP9R5DUW)6Spa%)3+48|E?U=!;v zU14o_C77!SH&P&qQ$)w&1Q8>?1Ry4s5pT+RAEKE5QFo1aimIAAL{=^8Lx%5VRRZA z5q?zdu+1HK@wQR?7ScoDv2_L>OohW-p9?on-!Y$i zkk9Y^EuDADhs^zdIiJVxn2(C(gTA-Ff>bfhzfly^e9*{?XrhsQ^R0NNqIfYq62)y8 zACuv)fk+HcItG6;;2NN|9A$qhIN9g{qGM@HACAk zEUGjnYI!v3VHQ;u6IBz9n!x0p$W}x|*tk{dtUzew>m%}e?h8EJ5l4%(fWIQC63=fh zxC7;}tDSqInPgD@62(uCjsI6cq`8j_$3Gbxe^QQT4SRGL<*8Vd-$t|e+HgD>9~&my zhG_i6;rNQ!`0qvIAB(gz9Wz01khK)9dT@4UL=uZ7zYK3_ zn{h}S8QxkC9erWa7vn=EpXvLtg&VDn;HcHo}OI3XkQXm7`d&63Ts~p;w_>94MZuRUlfbNE4KG zN1)m0PFF;>?YEuaxDJe@b2OzhvCE?&?pGX%1mffqtz>rJiR&Y%Uud8%`T!ZTbL#MJ z1s~6i{~R9hr2gPc1nAn9(^?x;@})MSb@^N29$iOl&)kEcpVXmXoyCvVi7o^jYL!;0+m2T%LO=rqU;_X zjxNT%^&1Pj}hN(e@%1eC7CzO^RE>}t$ZYJXdS%S+19c$L$- z9PwYrs~3g#w|Ey)bw$;IQs@M4rgCxMH<*=#WLSAYq1f|8YSeCGZ6FH5I6bFjCap2! zrIIu5#Bz8PEBy{$SK+UwtJDr<4Hkwl;6MtbCV z7J=tGk%%)CQ9*RS+7agf%irwthp5l5cBpTKJ}g5=IAQ0TgM#NNnQ0cEq+=FUcb6wF zV+PUsNK=Qg;Zh2sldcJ#V{rhOlT1D zEo7#S<K*v`VDjlV2sA*kWNlE=E?C_8mO;D$o6r=l+xDcJkb>c<$Fc_ZrXb;<^9gx!>^IZ}G^ui+ddk zp>IIj?RR+Aya(5wZ^A0#UY={^xi+5L$8&G-+*dl^Bhk0&+*(}cZ>l`^cb*IJ zRhRIX9Qpqf`F{#k0^AY6R?~zb_}1jPfAJjrwp_s>GS6M*IlMg|NXMxz6ns9P2)k=| zHG|_%cR1{L3Nizix(Br6$O&EreoT4?I0Wg$&yut8svAqfBVc)Whjwpr-aK=UlNS8r zDsffwv^A(&&2Fu{T(VQ`{gdObyJ29PDJ8=VmC8BG)y5tfI!m>CPcAu`cFhyFnl6y& zmd()Iq@!mw&e6?H$wp|qJ0I#+Vzs8&4MFN|(rKNeq7j;ICG^!5p}%IyE~?y@mPT$y zD0f`p2~Agoraqx52yL1D9|F}AaE@tLl=p?99%5xb!2piOLo=atIHq0qG>fQbKf&!u zh{(35u9Gj;+aJR1Ju?VS?icO5r5KAMzd&3AURMNvvxVJp+czSXZsSEn;PS4yXdzd< z(2;E~kHD7?XZE!(WmX-{?3;3CuC;e7w6AbUkRH&5_z_xRPh;84LxGP0Ih<=(1Awpl zDd`kHw;7lA!LlczynxGRSRUJK4OZfd0`^NHL+ww;a-y{inm8p^`)L_=4zS_m8YE~a zc6UPpZ-(#5QPK3BGVX5R+PBN$9S9>Il4IE1i5~qlm<;E+&!HRIpf{YXz4jUDQsMj` zPo`QbAl^umsXGImLTz$l0_wLfMOH+yxhyZ8tb!-a8bpu9yWu1(5j~XTzOHgY0bvNY zf@BCw+o}~?CZnvk=t{w6K1PvYWhfiB7;0?o<6%wD`40;opI}Fik2q%^#@w2~HVnmolt5lpx*c&)btEF_fisAi z60TRV_@KZI`V*!<2z9a$G+I4xAp~R2o;Mf- zE^s_MS!fWUZ3xl6rY=RCa?W)`gZbAx3M}Zlkq9d=Q~F>~EF-~^;DiCX3(&e_w#PJ3 z$M>#5!lAcs_Sf!6ZFW9Lwb4OTeBSXlnE5@D1Z9a!Qh8s;-?UJZ3~TX@8*btLl5|L& z9;cY@cx1ZcK9~%+rvWeT;7e~m^hn4&OL8bh(uVG`Nm`uQhvG#nc8)@ekd;RdF|e)Z zx7#CS8c`-ol`55Am{4&gsT}iK@n6c3z%jnuF&3{Qv~vF6K>n0@lAsMG*zhNg*HWHZ z?{CoPXuj!@e9vLufJyV>%ZRh6B3`R%`=lcs!L$r5v>eGvOB@+%OHt0&z5L(@~j7$A_6x zw%r=RFJ-k#hv6jY`{1N$=fo-<$Px5c^ufbLa3@rr&_u9&MznYO>;pcztdT6O4hbhT zT}f){3yq-P@8ex%I1a**JsuA>6orxjP&vm^wl~{xbThjc3_Z;FFt!Q5ON%z)4@{{? zZo&fA1lYTc;NxDS-_A#B;zE+pgHc+fN1zSE8F}Q4;8<~3B%FyTY~ghju^80rAUB}A z@9x$^beOp_+LsPsoZ9z9@E%}zQ450FR$TU1`x}X=uA9KZw^hD>;4C@usy=_^m_ykAV{Aeoop6O6n&rTXu5NxL6M!5 zxG>uI((eVU1ZuGESL~4=wtwGKh`#Bgh}|LLO23QdVBrVr+AXx#uN8l^54rHrm9C%e z{FmrkggWpor$H3a_bdzlk)(M^#^l*mczHUjA;rJ`JwRY6y-u`-`O2`U<41|`V_K;c zt#N#1oM=_?l`7Gy<}1~rHJ-1G7p+Nr8LCL-_?XKe=nu-2NtVaLrM-&zWi3{qf z!|Gk_2N+-k%7c{}x2^sQSNpf3eOM1%dSgk&58+I(6xD$$1^fOqQXuS)h`tADuJ&0E2$UpyA;h4l?NF+o0_X`VR&z8pb69!+zhtZo}D#G9p^g4 zz%U`v{yQXOgSQ@IH`?(ZV#w`51Oy2r<1#f##$}@KO&NqyNIH_5&O3Htg=xYUtFLjE( zHj2X)6cQ1aV*d^#lK(kc25Qh_Z+(6ru1t7yM30DyGDmZw{(d27;kk{UX>LtY2h`hABH4V8(NntiXF zqDYM#NoGj>zLSV_nY6p_B*YdGvx>eCpif_l+c z4$@$@%LFt>F3I^wb?{Fwu}RQ5p+QM6b^h`OTg_likF{xwhf3ASKEqLb#Cf>rt3+0O z=^D}Zr<)~#=8KpdT=a$LdlCqsD31FbBS7sBLGzi5(na4>x5C>Qyjb+jpbT5QD9+Ws zf@CP0mgtTe9qa%A-7UypE9Eaq{#q@6`Q@({<*yC$SEKy3N&Z?RfBiuIa>-wGUF>R~ zg%7zzAHGH3d$+bq%{b ziyO`YM=X7TEHkN-HK7E!C3nUrtNGFwL|;De!87ri(igDHi*u?F5PkOnDw}%ZTS&EC z^bH~pzQu*iMc)@J+|0t`fQf4)&rv5CS}+1k}wctGC+{YYXIU~4xm`khkHhZ_p|zPl)AelBLiR5M84$^;cWOC;Qp2= zkl)nx6Y<5bpNlVX!(%M`Jr;hPg^048u#IKA~$KiQk^LgY16EIJ@ zj}1;mw9#-j5R97!-*M1=7Zb5-R+VJvJ%5JMnNzF!134-4=%=EI%Ftc0p9&G#4+X*{ z8Ad9|qFMffX4HW$Lfoj;SoiP8hG%4?YrW55A_7F8ia)9Kz)7R~FT`bNy(YxD+K*HJ z*3E+(JKrBzU;YoYf@Tr=Ra`4wgugC|HDYM;E%YRVV(C}0Z~;zH=+X;saOprcSzMn+ zdGOC*7>es3VBvWz{2&X@XW{WIT*ty+V_|y#C9Z#jg%`2#L>B%I3qQufi&^+_7H(kS zNeI{Q{1Wyt86OR5o~L(X{Ni@ zCH|1ol#zk7IB{&;Ndm_am?#FY#)-qZu^|->+zogFosg+3!*|Dd6@8^<>ck&r$%x4} z5j)Pu8+6U*`>>$``V{u~GTFI~J!`}xUNTgwnoq7`GwO?=Qis&Awyd zaPn_LZ{F{}1iu88{tY)kM#>f!c3nOU0^Gfo)hI)WcmM&V1o#*9d*@;;k5lw$ZB1x^ zy$#m_`!|C!R-rCAjC1b+Z7V~>)uAC^6IfVI3MZIH7SeS{y1QwBG`$<|w&ihyPK_KL zf*(eDZejT+-ulC76MjVB!{`hgAo49`INo-(8=(KLaNOP1l8H~HTu)4@FJPln?zq3) zk=)(#IG6?hT%mi1!_dDP4i`(lrWovR$k;lhIZLSlmq)Y zc9=#oi~^X#HlenbxciPi+{3TukWTcy90Mt35ZY<-Ed?yR0U6RFE0Sf@HX#lUx?0Mp zT!;!5U|TbSh`vW@9%(6OVOl`*BSar9Yxz>8=%XzaU#jx^=rM!Kw1{?9V{s@@ij|BD zAcg-&-S|tZ?b2e=_Y%T<=@gMMF<&|rM=uOAP4soJK#5rPJYR|fhyTLDgD*uNE(T?@9}d_Nl(8g z)xiS%pjsFW4HfY|K2;pY&sB@HYWHC^KUX9El-7Pz=*=U)pb|MayF}lAuzFSbTdF|; z3>?4j5(tV@^XBe;1R^EC){j_x&Z1ix-=LdI5)3aqaNQQPzBv$+_ym zrD?vQNLMIUj&vUhyHAEyZ;w9Q+!4lo2{{5$xO)}W%AoHNNTZ5DehN-)uZS3A$(D5F zoF1F=)jh}=S|u!FbtGf(&21Tn!zw#kpq4ZKhMX}{(SuBQV}+X$G!}OaW(Z0@E*x)) z5GL?;K!jMkxKGi}WTGSqJ$Pnv8cp1%jwk4L`(^?SWRBsi-Hs&FWQhY@PhFCO9VIFh zdiIo$&ZRNuN-mPXlBULAHTd+f%(aFq)A3#(VpjvPJ9wMe)yQI(EG=|SMkPizcavlk z@}M{NkOJ5Er}1l(Owf?K zZ0q<$V{`vaX-m3hbH6j+Cg_I_yFOPh--s7EEoieLa72DZ=Q>0ss%skb^BRl`on_kA zmI0iStBzQMo71ql=_$6xfOvqSpWW8ra>D3qAI1R4Mxf4Av4yh5xlXbr-l4IK(0XYP z8cmAKbAiV$6^0W7_}H!4kH)8b;}A`V0^(zEkmS?*DIc&wY(5_W7?b2}e9CtbF~EZW zLPaPFK~_5m0uKc-pe?s%^wMn@sLo234PI2wI|2iqzeFS36}WZBdwiH@#>znLMd zV7kOPvZ1&pI2z#ES{Vpy;SE!3f{GZB!ZF%)h<0rhH>DW!l&rI+pHcy|q@;9sLx?(HQMHYJMc-HL88J5kTjh-7Vc(cBo#=a-N!78CDNcy< zQy?m&Dcf4M>}8p;tz`>sEhB{*a8-cGK9X6jV{A=VOEI_*7L01>Cm6&Mpf;4uZzCwb zjetZd8gNYIphh}GV~$k&V3B7w#G{m8KZ8MAgOv^@avXS%f@XxUZ8HkR*$f_;h91Qz zM6`~sF;d;^wK2vAfG{VmtF0AU2$wlTV)shTm)4=BWCKqlwXy*|f{Gg+-_4JuMl~4$qrnIYm}h} zU5BVCu=M6WMDGkoI+F9Yv1ik`QrD=YmN6qCcL&l}ea*B@1x+evvT0i!{i@AJR*i0m z3%>PRNLpMMBq?g?DxFfnKnk^MHvBZk($5Jmi^Js7lLIeYqA_B@P)68__Yt_49l(KG zR|{2J9fBqjz1s(clWS|4c*GT%jZ*xwaQey_Ltg3)l1N;iY zpPylYq-J%cUE&mM`ZBPAOQi~Fy-sv0YYa+xP%h=#PheM^wYIs7D1-*#Z6yv>M#L?w zgVU`}9b;$AAM`Z6TH1XZk5O+Bk1=j;Oaf_frx>=T)Yd|?$KHk|e9%1>bPA-3#ig|o z$n!EpDt@r`$i*LGv4#=Td})yEaXky4FwCu2LqhGLUQBHMrq0W+O24CGX9r(H17`DX z8qqJpm2UB4D3K?M#o+=E)*0c7F-J`BbT zQpZXOStl`yN5T+L+|c0@LFZMNKfFk1j$q@Xo!xb~H|*UBYRDU3*3CwQlkW>F5g0$HA9YG2y!Ty0g-C@C53DdtJF|p#-t#>Is+_a~(WI zaIJS1DhL0gYcI|~zH4fLLTrz??OZo>F+qZ;>XSuP@D?^ol(;^) z9D}&S?aiqnkZOiB!mg?BBUVeTtqm32Ue~N1)E4#oZ`Dqk7O~xM-_AJaz4D`ITpzj) zu3{whJOYmJS6pB<>vAvBLad|s)sZTap1L~&;tDJevq1@9Uo1&qyceUMHhFn4d9vqH(5n?<%}RE*pW>k*Xho_-H_lx6dXcwm%f%_p0B-Xps`2 zbv)<}XkY?z`4hCSOhbi0>IAvTN;rK;stJAolF*>6wS~EJO6TBX&H=Vx_1yzrnjIX( zZhLt6O=CvJplT7ZG&&ppgfM4dV$gaMK+_s|?r;{v3{iVA6c8X5C0MwK2*&a31v=qX%$8L`k> zSpV7Un1frkxp2NCBP*N_$;cY`S9n2fUJd;(DbH+jjFe15p0rvmyr7OJ^90QubOQFI zvnTI|Z2pRrp@F#>Cd`Ev*+Pc@5E(qM2?_oddTVd*9|MyM!H;JRhN}S#ew;=&AHJ7F zRMss-_f`jg1zJHy%9L_nDhI7;d|f#B)IHz`_+|^Fx{8u(!AdJewh_Nv z{1K*4sY=I>mv}Fl*l}@G^HFR#T(DmwiHV3*iShU=)OB`zbe~WWNP62jvYQJ4H61YO z5*|7?W0#zKK$xGU#D6*jlD`u11%tBm1tByN6Is?MfW{0Xj2lW2VW=7UnGYZ?Ch;{6 z!b_!al(B#kN4s=)l*8xr)3T$G*cV!PWKjm*WdLd5~N=B(1f z?DfzwVaw~Nl(2=?r^1$BvA_R?zkHR}^yA24=f||z(RxOsq0%N=3z<)8J@NRG>(OyO z1yuprGpSg-DA1xVsGsT`JY5zO`Q$7a&p#t`lr-uwv=0tyr^CtLX`!lDsycB02{<=` zac+sXC*oY8zc~K&ZgG{Q+T=RCP|M#Noac4U@^Bl&U&W z1)|F^EK!C<`bnY+RzMlB@3Bf`a6y`rHD+8T>KpAu>KgKG1f4e+N$u4=<_=jDAEdJ>_?}B)F*-8am}~3!Xw)Rwb{dc>4#02x{ck^1 z*ZJhNlR{NsLN6m&=Y$iJxL%>|oKSUI>d|`GUT!Ze?SjMg=mtGC3)*YcGyqjyP+v-k za1ixLzchW+V{j)$fidGy2;AmX^n&!#3F+<8=#`32dbm)@s9O2IA?jn+QPPaeG2_Zn zC{>}mL_dybIRwd0-_&EnwL+Bw5BQVya+ElVPl*KmCHhg4j#vZlfr`~Izdd_-Bj^8#=7F`zj)Lr9T{FxZU&XOfRnMK7 zR_4&-LWDzmWKn=lJq}S2Gwi>bLs4^_p4~3y{sS|0-j7MlVL6B}>pD=Y@Aj_y6*|^# zEmkPyt_#$oGv-7-!NEkIT?Csu3_DJ+Ed-lC41<2DF6aTw-C1n!kMyO$brSfygnDHd zc8OrM1RIFy^Kt?V4kKM4BqLy?zX}dibxGw)sTk6)zZvTy#Q=mXOYc-exFm+-X&g`wjv(y5aN7tH2MFAfkma~2#Rwc)NZEEqvW?P> zVoo3??7VObF%AMYdzc!8^%@|^mN9Xk%*1*egUD59Oq@U^fQeb(5ffJv6MwcqhO)X4 z^cjMljX+sF2)clvzn7uIJxCGXqKI7)bk>IiwGs4(5h&|Lf;JG;6@jv@Bg!2f#A zlr~Z!@|cQD?Xgp3L`Jb$70wIno6o{&f3R2p-HR5|AU_a)2~n4xRGv=(BrbAINi$L8L7 zVge0?jlXBLf}ewh(WO5-k@B~e7pvh!-VsqYuGxS2H0_oKa}O#N!Ee?PC#48Z%^}+O znm{xKoobadbWLl&M4ZD!=xd~ z-~(*G-e<{~Yt(hP!(0X5b4|EMgpq=D98NU0JvfbhJS@5CSfZM(+q=26pZ)MMj8UJ|($VvJ^t;EWi6S zVN064nX^`?gqgD#YJW{bx&gV=Z~B^HkZpwz@Q3;p~1@Y&5ZVo9cGz%fC1l{)yzPv|}*sY9B%5QH-yTcur|AkD;^ zuN5PNQp&{Ly&zoC=zJFym>txiw}B~?ep_g1MlQmd?{t?gK|lvR%5O+++P8G{-6xbb zNvL59seehOH9`xWAV{V2+ySM%VGNSByaIsVTmScPc=Wq9R$={*@f}wWm7Mk=yHJwp6;Wz?5<(rzM1iCZ+fbM~};~;_E87D;UjIR?k^`Xd}ae`gGGd@Na z#DQU4x-)LWuFZY`EEh>G-x*U~D*gU>>+ln~GxmOrswlg>t@IO06idIyd-p)R;{2D= zgq?c7pCx1X$yeQbuzFEp@6E7q()HW<*TcNG1LfHyu!i96l!Ma|>_Si~eM<25u)r+A zdz=Mk3*KH9s1dxUSzw;vJ;MSE1@Acu$fWmrs47f3Pw?_A%oaG_bu3J@7rbP@U1H=H zyqj5=C@*;N{tR%Uy5PkbB5Lw&!MlS6z9V>HHV%*_wSpHm8^c}RanPDnbb0T?Pq>R) zs}QT!8UoN*!Fi~3-3#X;v}h~9vOw}k+j083Bz&*n@!t=0zj~awaSuTJ=DQ~0TinPV zkZmsbh#GQY$;kz(Q$p3E=EF0-C-ZsK zU%I{|JeuEJkdFq68^4ay@sUTZ^%R)!qa0$bCbU{tTPlPO-Nw3_)+%^U!JCwbTZ_d{+Kw!-wwdMx?4m(#y{=d{4oC!f!r{jl`0`0!f`JcnW?G5OO+-p8|y+#cqVle;oT%v0E7p?aPYk!LAZDd{uoWd1k5`2 z%_PQd5-}+8&xHJI85z#PS^h32Z9E0++r#o>3lu-ENT)*+s_;eNmLvT~_(hq2r5_nJ zRE7?bI+g_P71qU5_jh^Xi5rM3s6(iKsIyp)Odk9q>s67}N=#Xwh+*))XY-_*>M_6=sgKc^42cnzw1bA+p=q8TKuc+Mrd$y7SeHB0WDET>03C=@aib*S!cUwwjpszsO;%d* zkXm$;ItHFovpGSY4Iuc_aAO)C2-{aZNmE4dr+7q#W4Jk5tTUc%R7m?t+JKp|PDVu# zo?6~78`FfeakVj9nlM-2#;j*L6XjdwlOZ@zJ1mB#bL_~|$_yn8$T zE;*Vats6%fED5Jb2gXxq(sgih2*|>L_)qZ@8Y4-jk*NF*2E~|T;2~}WRWU{T((_>w zD=RSF@!pF_AiBvWseL=h>zAl}%um0@eAvaPqU5~;7cm|ZBGcGL?7aL^E(!qJlcWKK zX-RZnMNN3`HNteW14Zu#EKF0i;62a6cOfiFGzz64!{S z>t6_pa0){i53(@XLgl^J5ylQy;7a`7v6xQj-UeMJaC5r6R}rV+{h#Bi9+l}8 zjcn^LRg}QH?>$n}oQ4s#Qvc;wZLdl=*KL{~<{I7Hocr8?`-t6o-Onz9QKS_L5e~OI za0SsDbnS1z;l7%$SOPs+X!v6Lx(KpkKGV1;oOMA31w>X_ zB{Cz%m#b`&L`Ee5Q;QqOU^5vBLjmwJ>~S$2U+W$4M3SPwD{x-@QF~RQ}v2d!n|k9*FYyxiNHh(Org+Y zEEMN|{ZYt*<_-Y~0DT-#iJKu*ER`ze_z#Skgzs0IJIdk51`!hb8AyzGAkkX*L>nnt`-@`JY&zjxYbCO`5qD1p7d$FxsRvkbgv3BG>7cN{cPGXSNUmr=3Hk{;Nq;sg|>pDAwI0-^`9Dw|lLHaQaF8&)$ zX}-Su`6NoUgdiU?NN_)cOeDw&8S-W_;nZVfTx@5Mo)7LK$QGOzT%_YtpoPZ0?~X=iUC-CB(dnf3{acqtMR{ z@wLrev_-~cFA_eVBsh!x``!kio10A2jce@}3daMIvzV@@$B0`0o-qcn(HqK>=aE2j zFD9)pSKQqFFW`nNCgZ^YXC$jJ%^hSL#~t`axS|9MsP+B~GdN_0R54d_&X-0sO!Tk2 zD~OzGm@pjCFw(z)u2L(3fEXiUA`$Wa4b?Xz3U7&+Cr6kTAAJD5qpHv$>9i;YN*cjL zadS7l%0g86aCy#DXjx!&(ag=D(bde=f09l=bB1tdBriE;z+5}6Of*uH#hwBrzwb;l zRDy0wAIwJaiRfY|a{)?g7`=Z(&;=D%2#n^Aap-Q=28yx=Kp_8yROBGXPLIY`G)B@k zcef!e2nR-xsY1IbJ!TtB)zm&$(+Z9Dr9HSBw9}20e_FlO@BPbsB91epfY@UW{dCXa&v^e2zU_}%v^kZi*05z@Y$2nnk-(!O0RkSy)n z%>p`U-yRl7k@mH*K&m7hpg?(AyaGiG!5z=%W>(zt&8&W5XSqEUH@?Ab*KS!*SncHm zRdN>f!(aZ z)kFmx_*_va?#4S8sspZX^$jVs=$XE5AUp~FfCdfWh7_R*^xjJd!A!tWaTV7nG{L;8 zI&?4dn1zdLfx~=;>ZmEGX(;w{$E|idHTEZ0DNS|6fzRT^n| zzu9?i`2?VuooANczbZk>GCNN%zh@F|&$u%eb5>y*O}kc;7MRJ~5B z9#7SiRbuk$dSKK-H8+pzam2$^Lat1{5E+VB^{GEl!_3*!cc)~Glm#&{-Wa(C=mNg3WM00Y_SIOt`CHpx$UGb z4luW6RNW4%{R|yGno&{G-}BL8dLJ@TODC?K$0)s4R<9_=0to}Xs^2kP+xnvwSc}-q zryK>^R^L=FMQLp2BaUz2^EDUxzx7{}`W>1{t+YfBjhN)4UnG0+I{h?hCVehcX+jym zzL5x)Xr=Y}mlME5Qk{mXfcrnXx$Bn0$Dz1H*N80Qg488c1+RT%xLOL$1fgoc{HNun zRZ!qtnbl7HU5%@Neq2)Ex3{l}u7^;Zd1$$T(e&%lav~MnaI>uUA`~?bt$JT>*(oZi+mQ;pEfF$CQq{_- zZW=9YzO*GOt)&(^%B}&c`Mq|!&mpM{VH{2lc0v3@7~^D>#aM$+{v`~xa~$3CbxAb# z#>37}*zavdGWe>yP9qp^88L#B+<^yXIYVrSCb1!!bn6gJMvY*WF9~|BXs|Al-%{MW zg#8C8Kf1Qp4rdA5V--mqAH_p{m$4yQ#)fDa8=_@wh?cP-TE>QG(N_&os3~4>cSD8@ zIDdxcO#a5WAPvdR8f)+e|E5uTJUU7{N7eO4M(Hb`qN9p1Dx15nU<^wM#1Cb-TfYG1 zS4=z1$>B{k&##B~(&epuxrfrMwI8@q8cev48VF2d?=t4$rq?+5WZ7!TF-9~6W&W#ZP8mqlm=qs0{&mYQno~zrD-EQo7t0kDrZ}nkia8Ezj6wVAzb+ek;g3Lfu2;>^}DOCU;qV2ISCaaiBMPl zad_m&=;<ajTstv`O(Z4`)u%@-3JQ^N8H!d%hSnk zp~`XBwfFJr#dmDdiOav1j!7rrDd6&Jh>(t5{`I`M3y;Y8M*l)3wx)WvZ7b{GcvR^gl}ZssiL z%#fP7&U4Zkf9(t&>us9Uae0T-gV+)7f2!P{s-zC8$g4=?NMX<}HIBU*2GU>NG1vAV z^A_N#2P%XKK&(i%!722q`V^bls#{r9ZJT7(Ny}2*^{EQ+*r`vX@^qU}mE537T$bWJ zx-v!5PZ!G5rE*vnHr_o&Se7c3C*!uOTxT<%SaoE9?J=uP+gh%Ztf{B|o@h;BmW|Za z(z29>^x8=vG3c3m>Yvu&8Zbz0EqR$jJzy#A(jskZFYd7pcbwNXXp#=s`kM}4ehqKz z%v|z{F`$*UwF+fIMS~02!ip(RI{($6tu+K1bT|p!_KZz(#2>bu`oyMk#Bal$iX(n| zaq*MRpe?WJkYi*U&VLjaKP1_R$3>I46vJ6O(3?gB{)luLMWn3CL;flLCzTlZST9%g zYg<2qw}~sZQ%mEwNyjEZY~48ZHw@`wylv{Y361dq=ZDz(>Q+6}FiP9nRXgb&{~RuW zR1Lb?Nj-#IY!mXQPMzueC*^FDN~*TW83whj{WkAaM<&WXcB&5*v6=g!Jlm8ysY~1X zj^8p%+uDNz&DMUYtK$=0QrC%#mtPxw)OPtbC{Mwg`k(?0pLFch$C$aatw$iQWGZRh zq}>iB3>rOLKXy`BBJ|q4Ct*Jh5!%+ns(^of{8nvi5^574V3zygD>EoKFWJmhDXWay z)()GwOY7c3`BbH%8h*=@(mQAlH;AlYvyF96(&6D6g_fbkV#O6u;8bu@RSLE@+SZfs zml1l(<~ETxb!WP^72aZD@MZq2$8EyaS?LAv6eUVZ2vYuGkK*7yFk** z#FPzFao3R^InkszXv3?kCmHl(84AKmhik$0#Pf%!ru$r=|1j_0OTBJw?xO0DF}*oB z^2g@Q5V#lsn&GG+Y{L!hs@YO0JRo+299*QDB|Vr2sHg2 zxP!~3dH6|Q@gUxlO?nsXf!r$n9+nsFS${>k#+}Lj7HXBX0bZOb6Ks*7FFOJyV8uZl zMsI82gs!F`u{!t;t5d)LdgHxCvd!G>EGGC~!0kgAz}nU`{+4@jjfS~>I`Wrb)C~k| z?lK~4P!W0VQ-Fh{p(MzUi*&q#(<^h2)=g(mRR^g7L@Jpzw$7AUc*{l(gv*tm^PXg%EdR_n36ZkAtFIQ6&gh- z&IhR}AqGkTanInb5lDtt{?s5vnd&ddqUj%@y8(2;h~ZWSFSD7!&f1qs!QyR1f;yXd zU`6^q3dT~M@*t`kutbolPQ-2i`62g@4rIRY0Q(lw)MbF>Lylo7#}i!zWmX*U|tDkXIsPG!!#lftcjAnan0k>pHG0#Zmjrd z9tgq+Pc4xNUx-$M@XXaB;~((UWKamrnMke~&p5wZ(?;(@Z00j7M$^8zG-E|Aw!?gy zCS0ls6;uaLfv0Mv9>h)RC~rOzht%5E8=(h*B&I2)Y7L(@3aHXdO|f}q#)`D&ZkhYT zO@FBl2C$eNF3a&sQ~;28-bbqWc@=3Z;-L?J6xM8$H5htvbMd;8+^1UOU}bl10z96t zR(1SMqxu{mWh9`B0!DOvtWmv>nD}Tw%>quG=7iSzYczRP$t%9+&FljWTR|}h~oNVNc>x>(Xn~htHTaDX|JB&MxyNtVydyKm5lZole6{N#%xoz zC3|=Fp6s^l1KEM>&g`D-k2j&Y%bVRu(e>IV6Z?@s4mnLCKu`oQwmcH(+blIGYU5rZZ6zXxV3P5;f}(cg}VxO z7w#!+D?Ct`T9j6lUX)QZv1oFUzQ|Z)DzX$67nKxkFWOPGvuIb*?xH+AK4^mhGH{W85nzgpj@zf;*03nv%yh3oEE2VGH0(VgnB zrD*FN>!3(iC>qh<>G}-)MEzvFUT@T!^cH=wzC>THpP}EW-=*KJ-=lBSAJ7N%o%$aA zaec4;w7x!bQKmg}Y38y_N9O9x#!OeHCzH=ym#NPw&avjy=Pb){k6c zEa?`#rPyM%)PrwamW`I}mfe72L(hKwj#Rb-adhm-2JhHuDcR`?_x1g_} zzaZMvx>STt*TaxJeu&O@>VKm1 z8T~nZpZIWv*pDTDZs(DC{ikDLh`- zTX?$gOyRl0zQPNI!NN<0x3|Dvw6thhk)wzXg|~xOtT}UX=H|>tFE7fm=PX5EJ91X% zH0GSiIftIUkQ2m!i)dxvO&<(es{MK6hPiF!vJr{YvgY z?jU+!ZPJ*M!2>DidxvSYsSzCDG4ZB#;DgPkEvBue0n;G3K%J+_O9n5b`& z37$MYZyoqybKaJ`t>B6sc{}rVAU(4a%6kKjyuYc|5wMdRiW7Re`74` zGmV+1OiN~QW=Upw=8Q~h=A6vAne#LCS;j0=mL*ly4W|v!IYDnU8cjxvvDjE*EH};=o)g-P2aEw@r?JO)+}LY8 zZH&$d#n~m<<=Hc`t=V(3=Vs5pTiqTtsqsplGm2Q4hI`v9Hjp z^%{M$UZ+pdr|Q%6Ob#0+8}tUF!DO%u)7Wa5W7uujV`wuRFa!*phA6Gi7|t1DX>2vl zG0rv4H`W^$-9qCt#&gC#;{{{Tc*&?(hW8^VdV9<~9or|nbN1x40Odro;w3Fd`|A%-1%&52XZ@edvcFMj-SpwlY0)*`~n-><)#^s<#SAPP4gkq7n$s) zrEF~XnogU}n9f0}UoZttmmu4(u(3TiZ$2dZqC9)vQpk5l-s-$YHn#inF60ICEFNK_UB-`=)@5zX+MKl|Yiri_tQ}c9vvy_e z&e}6PZhNwhXZ2>C&N`EIE~_u=Le{eX$=rW{HMK2$!1zuG5GfKB1r-&gh&_e$5KyWG z1r-$)yQtU@6Ktr#paK!>9((V-D^?H%QS4nj3Mv}Jf(=oTe807mAm`q5{_lJ5|9hY3 z<9WiKz4q)?X3d&4GkfnDfl4s-Z}dFsCPghnJNejo|9+Si!Ag_@7L$BMc*sVCKFens0r+i$LUdmz0S<2OTCQRLAkZp>Z z$Zg8=;thgs@_;uE(yN8AmGFx2mavt$otP&UiUY-+#i8PGF^kp{9?Dgog9k&+Gif_wr$mjDrU`2Kk3=nMh-sgSH+gBJQ>@K`2ye)hz943kpO%uHn zTTA%T{@9B$rPk0rCo0kuVLlN)!+qxal=`rgPRb6-XyrtuPPs{W9{cS_Wh37nzSBsX zWegHCjQYXr#1DbS-AUXkUkw*d2dl7F6mNN^hRwwHI5 zw*~q#ML18m1Uy+R+#_a5{G@ZGx20EQk7TXo>l6o}!92yoQS$b0TO4*mGCcDB=v_ulyi2?< zyw?0+et+yLm-z+!Vt!+RNH9z=MX*9}PH+cShL?AL@9Ewt-bc|>z4tF~ccDP&BOE3i z_iyX(;6GRrg+d!q9g$9S7&=M0$OAK;BHk^&0ez#fq>Ut8G6?c$ykrUVicONslE35i z>C#l`dg(6d5$Q?kN2!ghk<4G#OEz2kxS&`_G#>Y2wx5>*A)8*OHHta*2!7A5zeU_S_1eHL&EY zl(x!I%1O$2C5P<6nM|r5x?PJ~gq2>-y~NAoUE|&2-Qzvt{mCoB+?DX&@jmjt^1kza z@fdtdel5N|zYX7y--|y1vh+SU_q)(S#1^^ATFW}fyg(;0;f0$_V%AaVlFgDM5&&gP z$`OZ`plpGnNYMwMJdmIT1Sd(NlWZY491F??hpFD@y|cY@y{~%T@V?{yz`MZvl7hnP zjYJL<@ELN7YeCo5S)gMKn`s3-A-hj#yDOh)rLr^MHaL?zX494tw>R% zD~>BpfyXW=auin-*A=%F_Z5$c)H-M!uLpKJy#ByXkk0U-I4t_!-GcLiY(cKzs^A7> z#sfitpg`g5!}sar69sD?ZThijx|NXj!&o%k3|uAlJugw1*h)qXVbOBeLGV-X*}GWS zSYj?sG-G7rWs_uT*)-WqS)yzW*8gc(%ugYG7;-Cll5!QzUzRkz zwY(*~RlNP8Bcf}f+oBJ!@al*gi2r~DeGh-iF9j8ANnJ*JaoCM!LtA{flq6nj@X08_{@YqXP3`mpEKajm+GcmZbBR^4$1?`BMctfkc=F zc^x3?F6t%9l3s;JgW70G^QHyYo?DkY4%Togtl(7=D$|nQ!);(MG~`a^&V;0$07+Wt zZ6$mxeg%8_t5_se%HR0ZQ&KlAsRd}h9ajd4yp($h8cikF3f7*IHEX-q=WP{|6 zL?(^E9x_52iLu6lkM6_QQY;h6&&pdXV&Hq5ra0^K5tb2EXygqi_?d+8Z>{6*hF57R z^zPlfDE?&V0jd0V{BQj2g1)d^CV0ESQz#Q|5_Z8Zc^^A?2eDLqiRKaqiN8cGnJ-x^ zS%V$yyfj~WAKWoSHbpiI`|>H-4cTLvm3*Llwp=IQFFz%J4Bf64ctfb@2%kqRygGXo z`S9m>`}q5efFEb6&wiilK97BV_|#IiQgW4H%2?$RrIWANH^?{IH_mqnBv_X3HQ#q+ z$ABz1(%%JsvfkX`TrGDYm+bjZxi-8Nf zu#W&RUWzAs!$(;Kc6w(;Q?jkrMjmGmrkr*RBC8G`+ zaldkLU#1mtDN!4Q`-EqO--UHVO+@WQOmQ>NE?sgTmeyTZPjzKY^?x zrYe`ilX+5k3BI5LCAG+!mPbjjC0>K${e@kGal*x@H4pmbM)0OJ-Ofn<82)&EA$C=J zWnK70+kkqDv6?n2>-#o?4|F@coyW-74_eba+m0)SXK@v82k$U;+5y-@6Zv}S52>B3 zzdT!UM=^xR>`ZGa9|w~q{5KxSuz&EBYPd<+ zWesG_;7Q`iN?~RG0;hS(J3w3NC_e$od{6NVyW|w#S>TvFUkV>ckm-CZs1R7dE56tJ zq_+wyeWh@>@Cbb0ow3@LutR!@2Z?hfw^^BWW*bn)DB8iS)B{ zF0IcGg~Yq4xC#$;2Op77XIP@dcAJc~eqMP?Y3thv>$DZ2^F}r`4u>7wCW4mmKMnHs zhK~c9t!S)hx#*tALd+IBik0x=F2p{>f!FndG*5afzMtX!q7JfY+j2d(F0VPS4UfyKFW3&f{*mYfe8(3g z(6S&0jQrc28w%}Q1dTjX=!w~VE}ABu2amBOtQbd0b9tydPX4FdLQz}!9_x)w@7r^E zmhg_Oh6iL9|1p1xpcbsjUfxOGd%StV6T(8Flc*lNQEj9dcrx%>#+0{`i||BXJS>Jw z@+pehilvIx@cg3>g+_k-$z}682?M0jQk0dkX*;|fFM?NwQP;v#g{Ja0av@}DFZo#c zRQVkFeEDH{HncFNqP;?~BUJ8EGJHot8@@xvM%AMEyfrrpJNQaGR~hb2aca@B zVj_PIe?ET)|1AFw{}rDr5DF%Pf45?Vy#NPQi6c?-6X-ju6fKp3%D&1Z!jrDGXxm`| zcL}!+_;DFeB}h>2P?jjMg1EJ48DGHt$hGD*;#mkSd>fKJ_!-NsxNEpF-dTRMV2H>L znq~`%svkj3poUWusW@sR)fw;@NP;lHW2o_@^Z4w8be~JLr*{FokAT0|F>b#WTVD)0 zyuQ`h_eDD;D|TB^EkdXYs6UOFlY_kLkG%7|>)d*df8<*aZNl8(p!DBwY146I_W4%n zS3UMJJwiV-o`>#p^ZhIm`hIr%Xko#osI9>iC$vA^ftEoDC{P(wioWCvoheFhs z{12D@|0!;-8aY*k3T|SIq`zdW=6;*&b%i^#ecZ@#6Nj7nfWB-b7jdll=SNYUYM$4G zBfX?qBb!YKIPx_~Sebk4VwaRRwd~JvJ8iUhm$UR}`tpBey~&nsGP}3ob=lHrS)UnU z0d2pZebO|?aJTES@`h1OiemfpoLuW&$3^`EG{+CG3tOKY_^+JW&qZ(bpv##6?V^v& zk>A`k8Wu!0ejD+FX-G^xV%`yxjw-{CvZPHl$`wa0et!6c;Wq?74X*!B_r?-D{1)N2 z5x;}@W#Y%d&lNu|et!6^khHS!Y@3O1VjN1_&LM{qzpS;E$yCY8%#L!`W~Ii1>FkXW zQk#zU#`@FpRPa^Kj!gd8%JrN+Y>zpTAz zy>w9~MJe0h5D~6yQ?h6dIlN(KQX8p*CC0;>fUIQ}NmQxvP!gaeXKyIBEA{5vdJBp@ zble+ui{G#Wp>{tny4(o6kaDDKCL5&-DL26j zXne{5uAmms_(pguDW`52pqNlwNx2E$i}D-jv@2TJi*hsU*BnH`tNYH@j+CF(y3BDO7_$C-Ufxek| ziSCaHru$=p>He5_jK(iS=fGn$z6qxBO)!mbgk1=}nfD0387BBqdF>E< zGfeQ!Fu^ykDd3yeksa`>Vc=K8z&FF_2i3MMRf3o$kavLF|AzD1Q6&|nh$RROFTcZY zcr?nh%M4W{cED(qo8fUNr_gbtQjSBp8SaL1EC2&#S(oaDax?5m$}0@Hq+Lf+Zh}XU zatHJ$jG{)6auXbjas&{;?JxyVZiXf3KUvR22a=%wX4sF^W0+0j`;mG~a6a$%Sn>rm z;QBRSr{C~s;G4%d8u-;P@T+0qo8fW5H;;WB@T+0qSHr+J!`*;yrb##8SHr-shJkN} z9SOdfZUo;96MQpF@Xhoj_-1+%d^1e&%`m|?(;4_?+QtIE8U}tf416;z;r^z%gkJ-8 ztN}Op4f~P)nCFG`#|)GHm|@Z%6U-(&S%rwE3|L`=SIuzi8n9Ol*s})gUIT7X19trl zhZ*;+Ot6n-m~r2t;ofw4Cdh6{^`^^>@FMJ^U}wW9*jtORkDB2y!QsU8AP>*L03b_LE#jE6Tw(PB}wzQv;6*lEJ{Fl(0@4<%Gq z%3xcEQsaRrcD{Z-M6vUwdX!AfN@|R+oQUoxB>G)V#qO^<<6o6i;~A|%3eC5_Y5Nz2 z*QC@^OdT%qq^xkHKml1q0 zJ-Vz}M)1ur!8gMM-vn3hZMB@K>b;G?;2+dsa3(PL#|)eIHfN&Gf!~bffUEHVSK~v^ z1Am%v%zGQT*SxpUa1Hz#{Lc*g&Hv1>-~7)Eqxsp8iF%p6tNEWv^{(cBz}5T@n8qjk zkLRc~eQ@XhQuq2#b))}O*Zfa)H7~mVh3NnPPWSr1)@5nk6uGLabyG7;^P8!h<~Jk! zpX!1X<~OUE!NB&zkTJj2Fy^-!#{8OLS~topGe9;_v~FaE2|t)&!Vf0+Kecm`ArB3Z z+w^**?IP2rPVf3dOMt{sO(TB~nBKoiy{wKXXfZ$^> zpn58R;G5uo(*J2a-%Jx)-!{>K=;3BPla!nFOq82-$eQ|mKFZB~HrpL!jQ?b({9o&b z(DzDdxe-q5QNLj*Le=F~HDJj3Y8}j^U(vdvNx!0DlYT|u1;%|1d<8!az3&sc0jA}! z38v++5&kFr^Pl`di%k9b-|Bn+ZGY(cP5Ll_|EWJk|1blONiJ=MAh!oL( z=JrVac$`4h!p{yrd;D1V5g!!!SdcVogCDUa&DVSN(Q8{#)Rv^VB?kRmK<5H94iv(f zQ%RXq>*<%GL_Y!lP{P*aX_DCp`OVSa!J`pm;?ur$#OK}m@z6JQ6)8w4s22m(vJ5ro zC~aXCz8U7|-ANG>MbSF)u_(%1^ch+h}+|S?aWU9@8+Pu#13@b78GkrE~ z%!H}eCb&B@)g5)#9#j=Y`4HAnTbBp8*W;*TeBgIAow=$9`Vh~m@tU8yyAS1wGXcTW zsM?k)Nj;$H-__INFZDPY5W9=?e+tVW*6(W#A{+bfFgF&WQ(xAS9)kx>k%st`)XU*S zM|bjtvYoE8D`E-YtNzT=+9nFI`(^k=l;E5FX!%VLXc`El{|kY-{cZpRTKadDw>DNj z%@dilsw*c1WA!_~kyLK{&iwxy1WN$J{FPwmF%beol%9*pH>PpsXO>zWWR)@xTH)hr zM4_mdY!O`gOuvFg)U*EwJS+s4jDQ8?3+pV0q@CbwZ5ES;*8Ha)lyuAJYAWfZ%_=7)vW$*shd|tppJ(^u&K8M6_i&J77Z zAX$-a(HSh}So1n=;QZwV*W_v}rbFT&K0vnqsT)Xy zNI1WRtG0wv@j9z4JFA0A8`r~zL#4{(iAT%V>`XcyCc(^Wz)$6pQH)MWxDuuXn(YjO?Fc46p?|IA+<#q#c zt1#6!)NRsE9mEx#Lt>Ey{0=D&iKmX@y#KZ`2Q}a!fQiNLuso}j$|$B&Y=rf7TL&gg`KD9S?MGq{fFuAwLpc(yEC$i z5EzK_C^;1S@PX@$kXOA(QAamVd+9RNZExxYQGy)4G?{2tuY`NGd%M`qoIrfLJy* zY-H3)%-RdOrvyIKF_32I1GYl_A~0Tv${~b=3a_F{ZSda;$)y9U*qWJDRQznjG^o;! z{DPa_>ZNp7`yh_;m#pXPv}HDhs4eTcoy7%RABD~?72F!b>|bhuxYC#*1gpu@7CA)A zuc%y2r-?x7BQ#iKIvnq2iFC0Emfw+lNZ-TM7KxS?`Zmq(Mpls>*fALu63yo) zNT_e~H#lg+j28MZg{@bh4N0IOZjEjx@)YSc5{B9rEDXLo&mt=@S4a4k3&kjp2*j)s zJMHsI+gr#P2F}dIoFUbb9}72YGdTzjm&ZV0;2>58huoW`o#jmFIBHAn^Pfm4euZVc zD~oUtRI$19NN0mwv=T}^T<7oYLH2R&<=7N|Z=HXv2T}f0{A1H}W-Tfi`J9OY5hXYXT>&yh zLGr2MQadpO<;Z7ic@8Chsa=@mSqzm`;&q&9b~0(m52#s2P(udBvb>8oXmw~B)}@2( z^%S-sue=k3rLxQ*`h9sPCJXoF5#3)mfR&hinP6LZ81SqJd1@_8an%s@i`7>*)h~5k z6%R}o%uq?8=Mor%@Gw--dM-HyiGmr3HdW&)vCV9=XoAsq{JvyQtetT7;-CUa1REJ|5L&h`WYM0IIKQ3FVrQkU{z zCPNK*ZSE(X-wXOU=_lkV9j+|A7oDEln&bdSz9AS$rtq+HGZRR7oVDm7(y^w6vg!QR zrt3tS$Fd-`wbvPXjSEmh5e=p@%~lK8v)Im7MjvV`lf$>&3$$AxY|3;?LB`W^`D zgYoHSA&d|?o<#5=93iF##mh-V-bz!HVUW5FQbW~IdEmdRsu{Yh>lh+gSpl|I)zNh( z+jDq$m|lgsK*h+@a}dTY<_YPB%}K5FKVZ^YZbjFPmf}v9YFMur2D(-R0>#Akf9tME zeHcUOa!LBuYbcA1)LgZ}h1Bf#F_R*7x8Aycup9CoLOdqc&bEJYpy55r>@@FSYDyB zi)o7(X6qm}K!;o_G_1)DVzHr3q|9RLED%L8%vonKdMmI^;29(6j;K$F*JF$mNE8va zQ4!IDp@|{_Rz@&0M@)|)*3l4aXNYC#iRF)GqG-jAWHCO;M0=`^2t0+J{T5m}1b8H} z8S*nNuo4;z2Z_Rv%Nll14C!#Zn>&jr zr7b(FTso`jbXHl>t!1aB`nlrGss?GPTym_Pmg-85R%xk@IASw+&M+9tY;S53+*yp2 zIx1@dFx5;Q(MVA{snfl)s!?YZr@BtdAW}s=OA$HPS$dL#rDY==qIFPn@*qFeU(E_F z_60H@|O4aoS3WQnNw z3kfvSy{G{yx3qM^FVINACb21S+YmOwDWczfw8#F(NMVqzz#KvoK~DRS#X+`%zs&BM z1{f~Us&$$&bk;cJo4QV9Drq`*3d6}DBHt8NMk-&>C!k+d*+D@xl?Oo;iOSZ`1e+kR zwYrTygj8AW?$RZ1ZH}6X95gT`Yo{e2#2NfgpX?yW$qFQTKUA0sy#f``VIkRc_Ezf#eF9pCkV6`u2JtNv7E_uc z@OdWKIXCdF0|N`9HqJTlMB)52hDhXfp-EmNSS7Nyv9u!#DX4>WRQ}}Rm+;YTabFAz za@kuq^NTi@eeNWr%QpNW=&^3*TWkv{Q=RE}%A6cO7fLfrN~xzIKRdK*4Ybg-g?lkK zx$~3ppIXE*8ugT)c4iqSN!>hcAzs0wau|(i^Fl_}l?)bt?tFI?tGdlaU&l{ahMC`7g-Su$N>Pi10^WOuC4=+7Wfc(?EADOp&T(Dhq==rjhhEPObdKM z%DMP?LqmoH#Kok6xCk3Z&UQ!&r@=2d9bFiS212VTT*zpLzF6U35L8*ua-=txSrSU+ zgd&IIA}9UcL8}4P98Of6CSF4jo2mBHS-E8!eS|itS2VEW!MnYUZbI+W3+{FbHvEMC zWMb6rM%=dWAkw&Yn(u72mk-{LN0J-hS}2(6hK6_~4}iEqbaDDqYc*)|1WG*y2;qLx=e@kU5loHBJ$>~byf-a!M+#H!E*I;yP_;Q=8t`2~rE%C!s0 zRl3j>W`TAQPA%wD&=f&Vv8DIYlPo%*gz2iPPRbNGO@hI-ncB-%u!mTP-|U3tj9|{X z+&;bZmFSW|U8z%7;N%{t)mMKDIuc!-zL!29?^PptNx20>6{u6c)aD@l(*5XnbaimP zprbFNKj>ywBC%(MURImjh(s%8`W%1=;u`qU;}?cV?)iWLqLp$B<|$%Rs2Z3?tFni% zn~th%FCdKNbb72!%Pm-{hNc0lkkJ(c>uAR5INdxrC)3D0zLPdEw%lOoTd*96AUDmO z9iD*f#e`tuXsdsBJ!17c%p;-O5fl=d=5XBOaNI5`4|7>l{p+|MP0^u8Y>G% zjzw8{QayTV)U|Vi=q4Z@i0-Q$SwWT0Arrw-fzClwF%EiCF_fv=SsY4T7o~*yJDFeRELU9BUPeZjVE9hvY0v;&04ElGf*JK7 zk0Qxh!?+JI)vP3&QU{uN_9$fFi2$rd<{=9*_s8=Dm*I&KTu$i$Z=bm~k1CpK#`@6P z%PjO+7nESH@dLSn64KI%Feak>i{Ym|#X@QiBtutZt2sbXjl4ausyXvZ(07ZMyd9uCK|W03Te-R|Q#L!+3gFd%)w8Us>Q zw*EdK*~7Sk(G*_YjxmgOG}dwl#WASZ;AYOejxQPtOecXn8o-8JzAE?AKb z9^W(AkzKk@sUK#w48#anYx8r=y<6mnyk zxfH%f(p`AzMx?E%G*?Fk3oK5eaacc%17O4NZ*xjfMj6u5{m3OkbOE^^)`ae{x>MSU z0Mi}55cn7}gS2*@a&@H$sWqj2=;1dq*Q_o2NxUg^wfrm#L+K9E7vz*R*OQk?*O0bi zoT*-gpV1`*d5?N2Qm-r2ll0!?dYx|%+S>N`etpOMT$-C zJQYrC?EIkJCeZifGPY2Bi?no&>CB6|iu#gFXHBUQSS=v|uyhjh7#E3f3kgUK3DV?Y ziB~X_LxPZTZ>E72*DftRncPDju27bx4e5a*uabcgSGVRRsAnJ=)c5kl#lU31>*_a& zGFj%@w=R9Kz0E@%Au6X3hq+qp3D7N7MqTqD4z#W*F`lo)q2^ME0CumwX@M`p(xNKT zW`5BJqW~r*o;++uTe>K?dNU(;x~e*U)9yt9;YgKGx8ez)w0RHlAGx`{3w~%{`wG6N zNOUXi(id)4Ur2mSo-)waBG@LGgU3obQW>pjR>6^-no3q?YF4J6>CPaMUR7H`o&nvW z^$EyFlrb=Olm^9dP=sWc)nk!Di*ynF!&N4_h=;n;h>Ccqz;AV|MHV0#TU+$Y_C}`^ zwmhODPOpWN9znnhq@fk@b!enyAlW*1l!sQteHhJY2_>Qr7A+#BN0w)EkR)JcnN8d^ z(15PkA;}qXgG`UZ+&Bip7OxwGP`Tjj7BB2E3eqMJwB z_aF~WkWGs|AvHMvZjK0$DvBQd7Yu*qODY~-+%Gzo*3=&(0$i3f;ToF=XY4DvMrlm6 zD^5$N=bE7{%p_#Q1F1YT8lfk&tY@NSt}TZqWf{ti-DdxLw{!ogEmKD;;)>JeYtXdW zV-C8(?N~yl8nkDs#s3xal@9*RE?|{#!YGaYiBSZ%1$aXJ|C>?T!KMzT*~C(7u!*~A zoK1R>5?r#LBYYG3B_4Cf)|_E4LDNVa zk6_w&3Tp-GF&$q(&ve2lSZstUo79^SE2@E-A52wW_%VBF zGAd9?sk#Wt%jt&<3~VP0H7FwQpH!tV%%zQ>A_?ifBv#QX(ks&ym4o(!CR%50*88jn z4=}ns!o!IzK@?5>OH3c0t;sJq%)LOWo>z$fc;colv}$u9h8?MD-R6SI2|sqOHB=U= z)HTHcfyALnP^B)p){sjO>y`Kzfhx7nwZ@)IpZc0>(iS@7$$mR+1xM9HTj8v7$hAOE zfrC%oaZ7Wp8{Lgk=ahOzmjJ28f@MTOrKS#P3td%?+6q_oXiT5hl}a303BAHl3TuF! z7+OjBp-OB4s4rJCP*Yku z*)poRvywQG$nHXDpJ^Ldk-{(;1CIJl7?H_*fJ4S1sR(F&1m%5G)RigfFDdGZ6m^+? zHRuclvrF3Poun3PZ3P=-sbWvAtF5q@?UrVjV_F@Rr45iaCZUeD!g{t{TDP2srt&XA z$N{78g=*kNm6yex5tOH$E<|1W=4k(4Uk9OaCbu!R(-alXwEx{iMJcJc&{T05skk&l zJM%3b!ot|g5oWYm}v>)Ezs)W&NS^q>c! zLgSz_2BUvTD~a8ts)d{tc#M`3t|GVBNm{wkSQ-f1t|BEwWiqwH!~5tBU??cvf^vO5 zRE3VsAhVvygw;$s?A|+)VB@f>wpv zYpZHcZbjchT4W#vDqP^*D@fi`a!+v0d-{&h23Fbx>DPcZ#v!DemtZgbXmpD<(aG{h z!jTGxq2T@Rv2A~qXj>6sOwMd)IBwf&5S6l1sj@^VYNzWlHX|*LGq~*7p z%>yfgwAnWL*3}JO)6LhTK5e0|?jh>>3`70zxy7A~Daq_}<`eTCb+B7->x;>TgGg$fBvP6oqe!&^?D=T#|wHDdLM~JnJ^AZ&kgn&$vyb_WG-Dzva!)Tc;R3VVM~inp^Gw%jU^i!Gh^WuAJg^f%8Y;&Ud7Rn zPLj6->6iIVl18)jcwj&g*`q@y8hEz6V4a(ucM_`LabX$~jN-i+2u}u9eYwsLqU--O zpA0(m?|&Q;X$Nt5YedN>G4fp`UXr$mkbho!9TBx$WFHZK=@3yjT`4;5S7*c}{3v=Z zHi$Wr#uAxinsl_RuRH`1Lsue(XQhv=vYT>%@&}?4;T|;Lh{G1%5#CYJX~ZzRDk9n@ zn#MH;{umJf{{GJe@q)q-Eoe0L?~#IP)7A3+5+`V7gTPT9&X>BZTK73De`Zu%6ygNc z4>!dL@)@zLqVvUDozi#CJ^L_cz*FYym!d|;f5Zf*tH<=WjQ{oE@8bkzg;C6v{kp$* zlty-1H{r>Q2g@vOIAh<6LYEn-Wa*PXzO<6T98z~UfBA|ld-cnC6DPcx_0dkdc*3SYBBtcKxju22ctSVuf#V8I zX;vmp`I>vCuJUfggIE6htC~Ms5jwKZ@>i_et7|7+4q9OsFK9Tizvx%X zMLqeq_=+_HT`so{&42Eg)b*oN=Vw25REDNMId@#p-*?9fhs(QaJ(}P2L;8?<_j&DR zy%sZZ|XS{Ae2>g}@?`_3OXKqD`S z%e4N;j=tjIb?y1$cC&x+n`JEbthaOi$FX50%K}CY-f^;P(NL*V(VfdzU0>wS>bqB- zFfmvf)l2;6XxX!)y9K|#xZiA+&}vD*!*kP|#-w~by<%<89xHpCpEI7hYxa|dPY{{$9>)OaecnC)2`Zl zmn$8tlD!@)ldD?JzMTGiW_alBOHzvNYt43HulY~&N}jb@V*aC#*ep33c=dVTm#jFa z$(sVcR*h2Uv}1UB!ITT*W4t+2`cK@l`{U~`Gml<9pRxYew)kI{uQb}V zvG>4Bow|OQ`f&653rDtht9ytWu_MxFMA6ZXhekIUJ8X?Znfgze*RFyP=gLu|hi@$_ z*B)g=e|a&W(bGmdta8?!413V1!RStv2VRU8)p@Xf^DDuo5e3&R^OtpWSl_|p*v5Lb zoTLj}rJF4?9?vamep?@Jt>2M2*-BY@+iK;|#p6FG4!HGa#xvO;!e*D9PG8zIzwWWB z&I2+YES2t>6Vxvz>QBDCzhvW<=8bYX;fwLk%bwZC4(i@={jFOARvc*%{6N-y@t~E7 z-S_0X8+K?quikAf-~Z;?$%~JC<|Hr3E@Q3DPMc_H)1a(F;hH-I8&)1#Y`gbqT$g}B z)BC#IvuZUcY|ykz2a4M-T~+Z@{e8wtrzfdGd%yEzR&6<E|@Yy9`Phd=EH6gDf~bk#kzS@)tdtt+n;W!5Xr;U0Z{-FwTd-VGMZJ*EezJpJR~ zSn;A-;}^b}|9F1L11F6-<5=kOB^~DbsPeA22%Yz2m*0st`+Pm}<{x!ia%AV2v%~j| zJ$UQEU3c#%1MBR$q)Cey-KW5L+4_OUvpZXk42o#!)~K1-_u1Yhd*$(?@7sM_?*A&K zPnv7#)9!ctCdOI3nC>;P$F<^53U*h?tqYx--<7*JqAKEcS6FNf+Z5BPWUX|ut80J% zjFt7S$TsY%_)&hvp^SNW_VKGe1+IVW9CxGPx9rGPp{y%C9u^&4n#^C*4e_DG`@&CG zHRSD|dNDbmY0|Jzk2wFNm9jRB9&GRPZ5CG~wjSCbxW&d`+Xjo~G>^$|6j#KES`qN^ zyC4}A1Rh! z4&ArBDS6fWyM%LpInU}_dA*yllj?f7U)(=BdQsr}ZS|54wtMi&;&aY@w?60kJ$O{l z=cR1#7D;=Dx{rofE0)Dha+|%|{d1F66E-AMjn{2m-5xvl4yy!jlO(l4{lm9-Xz{Uw=S#C#>9j+?QRYB zd35J)%U0oapIq-HyVB@$r-`~d`3yzX>y?qKGHy*B@pZ-8ck4#i6$dxqL@wSveNhjO z^_e!yggp1iHcvgm8b*tfICFd$k@2@qUPkZz9TJ172k;MdbG)V z!JHf2`^=tYH+THTA(Q!)WBRnYHZ)4sysD_lsokerO#HJX-R{o~E4$5_;WD|iwh`Zb z^Q#V1Z|kyuKKVL(uGgOxqx6b8s~>Z=E@7mvJtvniE?701vX`0>?tk{lh+D(0vkMz7 z?$zno%pOxy^;Fv`h>P4mp$t@ZB_Y@24_O!&w5_pHrqAw+EbVFfwz_( z6C~`K+4l4Pbx96S+YG#~R95QN9h`CQi1Ve9Zgn~^td`dkd95C^uj*bz#`mBN+d?B| zrg=Plad&$A3zNIeyb*p@Ct5nA$(MURo&NOfCgyIoym7L$^Rua64f85GuUz)}{QA

LY>Gh%~=_qVeU->=oM^6mAo&`lL>)^C_>vumUMUH#%ubyud&8-MVE&*GeY z@9rttA!{nE#92K(9(^Bk`t(SuYsSbUjlF9fr|fzTJJ8lMvGF-g$E|+Nn@t{)^rooA zI?8R~_UzU_-MhEANZodtTD-*hRR!^OQXZ8iQCi0&er_|cW8C*;J+~fsc-yu7@r$aXE9zMvyt#Hk zlZFd-ek&+jVEi1eyb(Akm>p7+2w0YllGd$(x>kGVUJERYsHN0w9>+?ar+S}g! zJ%syIKV~F&-mEi5>$96R)U;WtF)H->Yb$#2e$Pdrxd z=ej>XE^g@W)%Voo0r{3QyXe|ecQQ{{{CGFM<+)cM)>|?y9);cSn^8DL_cqaQ;OGMG zP0L-YMMK+8kJHt%blT4Hm^R&V_R6gfQfE=`pKL$Ry<8ML z_Q;LN%T-O;IXRQBsW)CeLCrd!%S+s!x1@V)V~-Oerz1O;Vnwg{cI()I@+4GT= zhg&!`f7Cl5@wCebUd;`@Q$uC*^l_uvN#~U0-mb=jsN1UmaSkSh8!@!~5Na)){t9{2^`Lpc!%bYpn*< z3m@Jo)N0(Y{Q8IDD%J0n;l04Rog?4vmV8@Y8u(rEa*Dj!_QMGbb$IZ$HgB93mN0|A$5;9vp2k!qznSk6 zG^)>`tC267zV9*p!-XDh!%yV@$R2W49uw1NL#sZ$4hMM3oD%=oHhZYWgb>;M6-{e3 zzWAd>R$}UuI~Se%k4-6Czu&>}S{6?r_TUaAi(b(*7yYH`cLKv&Oy}-p;=P zXC>qGudW@6Csn+YaXGWXW2260ex4r~&s@;-kF$-P@}HjBR;STqDt}M!W-$V{4zphN zTI}B~e0!tJhSE!ITvr{s8Z-3iE8qG*w%mJjES1X`*K23*hW(m84ZN0HqPuiyub^k% zy3iNfug(xI?A_~5k9ikWKTj?ESYNfpJ?_-`9SYsX!Eu%CE*yKYASWlWWZ~kU%iG_$ z%iZkd$!pdA)Meg~!xJ;EXP)X>8GfN#`LLbcS|SevK*~*u%Q-*s7tmeXlsa?s3N=Pkr&U}qEADWC}Qx9VQp6N+uIftzP>)L!I{YO+t{AV zqCI5kFHWa7*>4DvpYywWCwz%-veU3BPYa|2quV}fUJ^jnPfX(X7%OGe6FN@X^Xk{O z4g+<&m65Hl)G50CW>)|7jHgHYdEWJm7;xyO=di+n3;n*dEnG6OcKogmp^Ulb+|GW! z|D#JYi_4!{mQLVBT1|WL)OB$i&8s>aU4PuWXmfFF?e{Y@8@jMwR4&?jbWh^*!mJ1z zzD-tuYk2qL^)*LlcX5vqckQ@pL+tCAT;7@ieJt)>-xJ4DGRAUG^>vW%Tvu1-HRYPqaY42X5=+-j_g*Wj3dUbF5PglmX?h_)K zdv@L&S5FzYt9#ql%cf4-@?)dHIeydpOI2>mw~J@3jNLw`^G$xIN1rziQQhef?c)3` z<5ag1H$6ABZTSC(w7}R4y`jg)G2#~eNmtB3mW|?i0}^Gai@J|@rN}wy7#^Jc#h+@ zN|OA?0+%cEV4On|}?xAMgj^EEeCYbP@?^`i`fpwSW`-&5tw)(OL2OOI>az}BK z;sm!u?MGtPJYIL=G57u7S3lo&EVV4~ll9(5-50n{ z=x86(f5%nlkbK{|a|F{uR{R*c^qTd8&&!j>PF`jG=hAr(+l=ziHog}B=KwEBz_{(b zj_H591?my z_WMWPu;?xgl~<<5hYis)x}HrNd?WcndTFuW_xwp~*h0oQyLRUik6jq6t86qnv_YqS z-d8(}%1Pt)UF&#uY}df!6GtaK&mEX|V&U*%K35ktp0gwI^TfihO+Pmd`06%cep=yy zvpw#_Z|rk*N1rc&J73Pth&z4D>*Ia*yZPlUt{h+Z?A7C!9fJ#6kLgoTcC_Ax;V%Tk zd{mP-_xW2#73fFYu((uOyZ!B_cQcL`$2MA2pXs!1Q`Y&1X_57J-d^!WR5jyVR>k)R z>s(tO_pZHx(XPznO21vJmjoC246bE=u{_e^y<*pe`p3sy2suBATeduHNj@fdS*JFzZl{`t`zOQjKr$OYcXYrfn#5eqYwdMD2V}cvsH*CLmvhnoiF$A^2gVwOvF^|O19 z)R@F?f7l&w<$t^KTwK=B#UnEJ+fSdlwe^CtfzR^iT&jO}OR>$XX7L*bwCR0lmhXY1 z-M@aE8Z&{rciqiylF6$UK00|qv*bv!Jfef$ruzZAyl%LU33$zxevIw@o~^&W-WR$n-c6ye(J33%YS~ z%bO4>C!|yM=hQb#n6^(CWqI{S_iz3zRamFc&-2Erpu;NB1=cXT2>)`fVDmZzXv2^s0CM-hx*f7rd!Dnr{Tq@R_^SV01ue)d8pCa2Mw$1%6PPipX>zz4#SC7zE9WORI zbS{t8+-Lvs+H(SKSpNBV{F$cT(qFD~pE7Rqhnp#Px(*u7K6a*Iw%c>5zhm5_$L#cu zExt<{j(uX`cT{;iJa`SGuIka2TVJz8$@am9^yYn-z*rgoF-{*MoYLl7bhF^o0Mor-;eZT43f4Fl}U7qo6 zn&)&IUUMf^!zP#Uk@sm-#?rE z;bRMLM%ve>QxfM%Di5CEgipHKEX1+Nz$0BM>wowD;q^7{wr+lM*pAOS@zwdRTRDCa z3r}xITi;{n*~Xf2Gg1?dZWB1v5qJS9Q3EFp`PnY;sbA&57wjV$ zgMLi;c#&DuU?j6c@S*d`6E8eE^Eu)A^L5&)Pxq3e`U%BLUFA=|#chk7)2ZQ{iJXNS zS|(V!uFY^ra6h&&camM|=#@!c`r*_29-lFguimkHdi%zK8Oi>OcO1U*V{OUfPj1-ipxd&{CDg~ zp7V5m!O^?TUtgcoEphpuIrej1CByA|ZvN!BA+)&m@XVC8_B}<1C(5r4X>n0suW5JI z#G+SXvEz*cFV~)RFTc1yFn9Ai$1#gjKb7C`?z8V?m`j`G@~ao6nMr34OPfY)emACq zx7c0d@<(agLc0s!?@xWZYQhC>{rn4GM$S4ltmmVkArVg%pF6Owy&T}%;Ma?~D@$kh z9BY;Ne)F)KGiLYg-p4=qUU926VoLiZ;qvDC3$@SH*EXHmka&@qP#)I(Y||yH&sIGB zelh>y%h3B*nil7-PdbzDbB5Jsu8761DzEzU(e{hm(ge1m*)y~sj}%GvD2CO0-m3eg z`w6vX9uqX)&?nonotvL+j|XF_W`0d{oO9{vw)y_U5~Ej*&YiRMyyw%E*$LF6(Tywn zcWBXf?)|2N7vG&3SdgHQCwUh&Tdo|Ra$v)Wgus^n4|8t;RL2(Xdv4ragS$iU;I6@4 z5-dn?CwQ>n7A(PCf?IHRx8P3DjRtp_CMV~<^Ul39Q}4Z7HPcnQd-dwCzvZiY)!zI6 z%j%_W?5;&Ve@)s4{%pC}pvBj?fhvDC+$L&#Ta8`1q(#c$7dKc?vhbt$zWU6k5}^V(CJii(Gwvy%SP0J@FS^0YQ^SDmmA+= z$eGePUWaqW8HVNS1JRDm$U?g2$W*TNcj+SbXqoEB5d|`wym_y4&sH_a(yURQ#~U}< z?O9PaFSGE3((9hb)+N7^<#v@Jd3N*-U3L8;!d(@0)`kBt@~R{?E!vYNtfZROrU@=k zhL|$Gd1O59JV&k;TW2Zwm5pei8MA@X(MgGl@UJV0>(du2?(|;%RSu;VFHK(1V`7>2 z2J+?)7COi$CLaVhP2AivGA1ep(A^-lsG_ zDAcVTB4G~?iZ`}8I@yovpx3K<-aEeN;I*mg!T=46zd@}?l+8rRmx`%YeyfWgA8sVI3?a+S~)DYr!=8S<8rdVo0_?b>;+W+m)3v^BNxYc;DtZh7$(=EfH zyk1qVuq3nKB>uZmRK0bcBnzhu6=?&}z4b|uf=w^FK<{yacl-*Z# zT`l982$l`L>WzIV;X+k56N1F-NW3byH6xuOx4o^4+KE+c_axtE%E~t~#Jtn3O_c1> zY`T@dW%Hby@l`*G^z@$z6Mcu_4H}(I7$>B)Nzvf$ZUKL0#=60d$YO~=YKhWLR+XMq zV+djxE2QU+_&j1{Ps0Cw1S#J*IPg5!T~^#&M3#~6^8HvtOipkH>}aLAcK5X*zS#Ht z{Bp=l8wR+fY5`Xg+*`{YjKj*j7(1hnx`AD%g}TEbq|0Iaey8~D;_9xsN=S`Q2l$9L zuOV(M?$OHEBj6eMZ)ni^xb;z&ldkqe3@so-+?LrY^}6{t$Rp4KWybB2ruya~8*CYA zG4<1QqOSLM!va+6Cya$5pUgnnrDTi=wQ<*Gx$5Q;|af7 zthPubh4qXMO|4MJ?q6S53UOEp(o27_Cg+9g9ek-oV+9FYIs@G{`cM##M<&$k_yN(B zzO;jBX}n+1f%jF+H>n>*p>A)4<#xTXx3RVpu=HFig{&}MZVPLP?;lO7z1V+jf~!ry zOOFaj+KO%FcDcay5a0|W|9a~qz0#L7oJ<}eSBF)JU01R4!AcMlQ+-U*L-Yr}#2MXItb9Ch%3@C0doVkjz@1h+}g%R>@IzB9rV( zlneWc4$DYqm*o-k5#lYg4`kU*mmjOpsn6chaYZ|m?>UZ)kS11}66x$J)-(iu!uu45 zho%y5Zx8pB#{9-BkRRhPjrpa!>+&(Skk(HFXPU8q7wQO|KjWIda@5FsKw%Vs?|EGk zu#D7ws!!Q$Q3V4gkY!NJ6}!ZjwvUx8jP{j3dJ6h! zUFLG|FrAOIiB?vi;7VnX1tzls-|io^*nVk^rHXsa{;p+IGo@ac zW?HqjB9@fkm&fZ_R>Q-00a2V5ThmAQ78(@l{AYEiAP(a?Pc2I}sM|@4jDdye#olIG z=4s{mu9{VBQ99w)Wc2>DM^lNmi@6Rl(?%?_Z4%C>pv`l;ocvYxuW2&!h{T4+2E}HC zhhJf`S?4iXBFz$a8jORp1*hlud55L;m~rk9{Bj|42sRa4KXA{Lb^NOAzd?|jc3k6M z3n&7c82e`W3b%btAvOAndn^({XF*#t*r`Faun2Kbl})64zuJ5F_GQl=k|M#nXnaZN%=N=Z`3D@=laS@zeS^zSZ_k~f9m#{^c#e3}sSE}< zxvunB_m|L$-jn`-N@R(p;)``osqfv>|D|Wn3>koUsA{ZW=L-khUwW}iq8~noXEYD{ z(zio7Yy@(iUE2m(R7`TXD{Q0GM~}0^%jrZM%0FsnL_*emTa>jekb9!6eX3=Y0fS|p zCZ0L)uzw-LA#ozYRbul1uQe>Y9VexA_?m2cMYxr*^8(j(t)I`23F?038dHW+IZL1? zNLdE+WQDW4QAPPPd!4D5xL&a8HNl&1(=U2^-ozp8NmkgT$+LxqV(;sRM+XM926iwm zz3(M89iyB$TS~9gqHgHG#1j2A6)!@%ko>R#kMY7P=rYfA)k@|@(F}Sr)T)6c8oxMSM zxYC*K%Ouhkjg`g}bqmP)hplS4R@t2$))$-}6UA89d1^bBp=>`EmSmJnO32n)uIv?v zkGPt$(E1f$!IWxC5P@A2d(MO`Vc|FY@P;pVYTa~b9Rwz&iKrGYiW)C%8>7a3kUD<$ z*AZSh&$@$B#8l^LpPXIqj?TzA`njq{M_DiI%hV;rWL>_Q_E()tO3mb=#T{ z<;g~?QSvgO3Q_3jQ-95V4PDS)yDRi$cx<^v79)S#ZGF?ZO}J}bSG1p#z{F3G^=q0F zuW<(lP?+*=ei!LBH?J!8-P4~RlH5zy?>uC4b6P~9q3^h8>}%w6Y^YNt$Ps;6`PJ| zfB@RZmY$bsl@Y^=-&ac-t6XIjpN@|A1}4F8&|hbaz^k>XzmeHdZkS)QmV&g`WlfqNaS(Af(wP?Hhe4B*)~wNB z(-D%etzDns8PQvK z?^n$ZiJ(sjgTA%6F>F2`D!s&vc?)i5819v+ExWKk*agMSU zs!=UNZq&4I`vJe}Qqax122h>nC@Ggvv;)tE0T(%ph3xZ2l>Ts%RTk|5#mmj3>2ao6p9++0;5c|zN)zHm6gA$-H~8*Zm;Fn#g2Wz^0>?B z()XVhpqM*~hI(TPhtL|1kYvYSvs$9I5YJpDcsB^2!>+f?(hfiL( zbZESj-j;cT34-g0t_ngjHmyLKW9#9e=F`L$34F;?;d*XLfpnkZT>Q?u1$(_0!DMwL z_!MLi68za1Q~e}4q%viKcc1B~C9(y_Xq%MdeZ0w;i|)@gY#rGaIH4;asVs~OxX-FK zUV)%0C&ZdN2a2R%;H_TDEW(n;%3K}gPGp|kkZl?n!O_8ukK$G-6JE2;;utQOx@ajr zF)WxtS+UcT1MwQk9s*6@*aI&Ma`_tTi9;tl;Gv3nNobD?@ln*wQdq%wGHz#dU}wFJ z4QBCO*(=fMyTO8G&z|A1h7#kZn3s2+7L#}E><4n8C`U&c^I6i9@FASV%=Wym-NlmT z#ym%;mSACW`n13Y`LJFQdr}l132eK{rznxq)k)HqdJ;I z{e?6|K{N0_a|0&~OKLRoTr5>T<*AK?uIK2u!qD6Er1Ro6f91Wk3!Yb#oak-5+1>lX zfb$AN&*yW(QRAy1V|173D<^gd#KfA&CvOZ70`-=wr*d74*AQ3r%7VxiD_l_szYbVL zox`pL>%!%yy8=xx3Y&tKhi%C6k|hi;m&|!~=LH9DloH(>1t&;JN8Ok_A_n;i%>qC5Dm7#H+#39 z-*nHKE&Uh{e6ptm{?wB+$19d)L&Z7`4yQ*Dh6fvgP$22!qIhu-m+Ag6+ zVlNnfl!PIA8*icTNL}!QWaE#vN=GA7AY1i2`@*CVS)0iN-C`IWON3NiCJSOH<}RrlQ#obDT4on2!cey;m518_0m%3lIyRoc=OYAsr^hdRSKrN$ zXEN$%G^oZ&AfhGE6h4Ire8p zPEeUkfavVE&XFY|&!!uQog!tC=uMTqn!y&SIAnc{_+oFeerVji{!X5aJ zU-|_+eTp z(&e^Di34QR*<@&4*QUE(+a@HMTWS`{5soY4xudReUALK;{gG5MJLGejO;253v1$ zx1eyJdqKcXS!b$#inp&RhQ^d~lLRHT{{` zzc_um^u!tDl}y|XnoN4&i>dj;>N=^9*U?(a@Zx^%+sATzI_gsc2qmOVo$sUv$l^F3f=BWa+ zK?VWp2XgxgrycK7i9D`*?a40uuI5H&(vp`xo)P)%KCw|w)Np*3>%0*P_uF(t5~1Y& zr1kwQqGXe}YIMj>J43+7Di7U_9FoGJbXQ_B4f7u*(CVVxuR54`pXskEsslAlP z;0}qZVBlMWn8=s)bS(6BP?h(}!@!b4VW@9j^Vo2xKaPn7dvSLRgOhHcV&LAB z%?6ik%R1aQqgg$8shUoGrtT=aYv`=pVwFA1&ps+P+uIsy$byJyE{PKI!?7@WeTrZG zusPwLvd4X~+%qYl9)nhyefUXL48!Jy=!gXOMy3^klN6T;u|q%fV^BrBsDr#maYxU@ z5c}$C=4*&jNVBv?GbfNk;uy~%m2gS~-<*!&f`x`^bncSC< zt9!wf2e0u>U+U+1tO}?1BPEC+oNZ}Fo z!gSs9-qa4HMCYCi*zzzO4AP8q<9VcwDQ%Ozh8=P+NQlAybyy#8GIv<{p8d;G_Oil|5HPZO5RmIlWw&@y0^T22w2qbf~so9`#L?&0(rq3 zAc$o_%CZzu;49MzEKON6ua+T`Luhv2_`Vsv*#c-s%S}A#$Ve0dHqLa)Vx3F^sl6i2 z_{^>E3i@>$q?9B*ayH~@SQ%5L>y~-UtEPe&j3@>Xr|`Isg)}hij!@jdgP2Mu#)cZf>kyfHu)oo5*Z| zN%$C0jf;Ni7Zf{`vujF*ta(*Q=kV<5ZQ*=(H3S{62{} z?mR~LD%(2p0xJ6uU@(glCyjL!@ZzFbtm8C_va=)|U1?=L zZq=dBWTsY)xG7heGW7_f8=#4 zoO+-!h?^+rstrcb&X?_KsU_2^h`1;}yvmjE=uXKyyY(DLUwB)-HE}XUAVA&o(ylG& z;OSKms!o^blN6tzo4V_#`x3p(v8W;EExE6(FH>Cb-!+ZpR=XWbKEN+z`tfVl3MA=p zwKRMQcyCQ1D8m!(C?DhNV^UM583Lu^NnzcOLf9mR+r20#uWRzzjAR#H%MmZLb&K9v z#|7uq3)eEYKx`j9MOhEoXxG5LFBuO8yrSjjfQ>A~SNXeNXahufRY{0hLQQiDmg@T0QyLmPGo~cD`PHNK+INdEb?;7pq!4oVn z;Y?_Uv+9*^**&Z0H)O|dkWl>4aF*ga`KYoMHe_2xpyTIvcQ4Jl zh3!m=Vx=WEsqw4CZNUCuD2F%FNBi~82d>-i4g#V@vZ^V~FGTe98~U#Y1T>&)6fLmn z^h7X{t5%lugp3HsuGH(_)2B>OB2qp&oqSMt>Jb;-I2%^{RDh;P%Z-gD;%{ka>ZMz_ zwBoloh;Fp_CXv`xB$8-hSO9}cUEpYF;l@kiM>pcSG3$&lQ}GNn%hQ-?Y-Kqi_}7lb zCricV9bRfK4lA)I@S_68tdBC9!w8qQaa6y&+JSzN?Twe5UM%)6>QIGI@e{#$ITQ`- z7g=7+W>uK32Y@tZon3$e;|4ocPz=x{BABi;bb{Tm+LdSMAT6c!oa7~ zjuROl_b9HDG?=x)&uc%&684c)kY-)VSlK_l^g`i}&mpY-)Dn$|W&T6G>`(|^q7_*} zgCGD;%mv4PqKOYLvh93Tp#HQ|Lq)a1ZuR!#0}agU9Spg!^s%#D9L@vl>R%5T%p|Mu zYY=%$Sx2D7FBvJU^u4YV4W8>7m%>Wu7Eprl5fWaAM#3mOwmg~ejS0v}>OOPtTsL6S z)a#ty;fLp$ig&R=+_F&9ZyK{TDHG@xZ%uc?+cM!!7nHYnYt}3%ecjxU9&1o8+w?<- zwA0@CTu+Gfonw6I8^^B*g+}}wVO6`c2?1JjAvD1nOhj|MzBt!!#%PS^cwTh@m9t-%9PxOQJRibS`+a7Rkqx?AMK0r`A=aznxg|iOLj2X6xup z7s=uWzJOOHXiDv`Qgmdo%Elxcyk=N_GdooN8gUTr|x(x-s)Ei zb5pQ#Sd%X&eJoSIZA{ELR-^J7h44F*XtR;+5O~bLoy!}mcChw-y|ed;*=^J$duB@d zC&tK6?7?k@s+_`DVuBHjrqA@5Dp_hg_G0QNwhz*`utr`s*uymi3Sshr@M&IQTl<3+ z7^q7hQ)nbZXChhdySjgs3di``Qm|^%fW^Cv5c#51;3OD(pNhB-8(HEM@vfxppjrz-!57Tn8CGX|w zuI^naFI5Wb593#kbi*g>PCpCN;@ys$KI6UZacRq@in*>zRwIdiN%sy#Yt5*QRASVzV1=*rMSbl zIct$7M)RiaHi~A+)WnqNiMSMu zH<>J+w7q70VfWBmU#PRZBCEr-IE6uQXoHl4wVh^=Z7eKX1g)}X8quxM;cGI}_4qT}B8r6g#5~A{&$48Ff z2E11mMc{>cJ86qQ^79H_GO__~h$V@Oq+qgkN>7Sol?jQK5iw7)Hs;;JZGmDTU#Dth zhwcL{SA1Gws@q)PXg{1ouG`#w*E##)i*e;$!xhKD5*QJ_`js=MnND(2<6hDfOD;C< zczc_v0IBO6Ns_pOt-Bv7)y}nE<}VAxdRedwUhraRjH)6A-q65Ykdo)RZlN1$VeCeI zVI!4O)`F}YDxLQ$EVL3U&!={A|56C6c@wsb=Fl}bm4-WXiYm`L-;)*h+N1B}>%sji zu^v82DrWhJsoE03ZI@*iva(B6ZK`6Vgm0gSg)pQgIGZCXYRz=N$52yRRpH;6E!XFT`=A# zj3LYDv8=0)sN&}3l3htwYbc!HLvD>-H=OgmDtTJ(5#$n5YbnOC4#ZPWT*68QBhvxD zJHUGRq3hAPHCgnPyexNT2()EYO`Q%&JJJ*``H6mG!718ZKjC!uZHiw&K-dUl%~KM{ z>!GQ=VBCJ}RpuRNrQ=vr_Z`!#nS$&wZlZv82Y>SEof2v(mb^J^+4qxl0$+@O+AL}) z2B78k-8`6%`KRQES)s(>hHmNWx`{fCe|x0Br@5Mv%prssd!jh;ts4`(eGv07rDt~U zLmDs8S{L=j3sYGO@>=mD)lC;6rVOOX7;Q3g2{f*8||emYYU>>-ZF z9^_CHJ9T_pOidU>EiW@lkC1}voqs4-M6#a8wdb_1dNKWL0xZ;<%JNZXD?@#8E{;2! zlLA49MIjctur4$3#(HDTc4$o=y`mi=bOi_cYl0!FDdKWqhq(Q{KG`FnCJ@@{M}gIo4>f6f5F_M$&$Op zP2wmVg+J*1Eiqd9#kWyn4=))$VM#>+FH&TIVU#qw^QeJ&c_`sgE$#7&O_&MprBs2f zFZ-2KD6u$%v;AVWSM-G>zJ7y z4EGOdPkvi62fOR&sVC)_$?7^AiMkjij67)M=MM>=KBAVL;clK)a*h)2lzxdpwOepz z-FyB*6QP^)we&IrK_Sbg;>VL$o&@RpN=~yUUBeOK*+i+E$SkbTrFW?-{n48sv(%k9 z`k1(uC$<`qwedFDKs!J7wr?SZ);llx&h!i}{Vtuk5Fh4>zK&9e~^&M?+|-(gZH5|Rm(a~i0+cGTS`yQORDmS8vKrEz(I=u{8&S+ z>|4Tx6$m27l>8$rZgmg|Zcl4jfsWzC4@GJel(k=BSOpH&C1f+~C--~vv)XJYb~r&Y zMtK3|3tn5_7``GnuSSKh4a#>q|3X`Mpdgt}%MVYZ*%ek&q1`1OGTF@!S6e#?To`;E76 z{xEts%gWMaP6(l?4@BL9;KQ2fG_KBJoYvknc}Q^WcJ>PDv@c29g$vIOAKnd8`53SQ zj2(zk^uK^w{g@#S9q|6Xe~8i;vj{P4*xAg%)J2Cj#LOJL)-!QdI8KQu-*501KYbN# zj{kHBO7XOrMm)jq^>HkEn#JET_nL3{tv( zqV337L+~x+g>>>O`gNo^vSmRvvXt&(Ke$+~S5IeWWoTkHr)G%8_LvlUf?vNzIA2>6 z#6??JP#Wx=6a>;ag@=huw5c+ZniAkmde*>r5N5GL1cN3XhZdAgjvLd$k1 zPs5>#?_nA~st0Jp@2ywcB38b>W+ikM3zGSu2ql(6N}By%^9NyF3DOLct89{SZb@8J zW2i)DW82rLitrwZ9=;|m7xO7J)i0VCqXsWf9m)>a$m|r#Bb>(&al|1If0dXUcfZ1v z)2~4Ci{no#Ka>1=OzF-AmDp&)Qf$As!|h4m-u=zNg3sfmq7vNRg8~gfUGZ&1HM(16 zgJ~wMtWqo^2Y0AYQQ--ap?MNrfz&WtOsk7UZ($!J7MxSBmWG&Wr{GRvl|U4q4|;`D zoc8K7XVPwXPN^$=#L0G03yOfsY;}XvW#>*FvXj{CE~)inm2GeI@tZQPj}ZDVVGTfa z7GHktsI+3JwN3Hkt4JWF(Y=$LHLPgiO}gkl`l_M%v%=?jA^k!V4g^uwq2D9s^ zL0ygu@5C2)2%rwEIxGDW5m+A4Nm#zuR#g;EX=WW&RCMC3-eaUAa%XBgqZPJ zMh9CF0#t_rjJ((h`DJ{h#1awtMiELNn2Y$)b0e{UuaeQ{Q+tVQ3OcFs)x;l%!(=!- zC4YTLTq69aC1g0|+u)|5RPo6tx$_kUA}uv~s3A(0LjuDS-LTQ2Wx~{F9h_Hz(@l!8 zDT#uw1I`-6+lRQrPDndk*%d`v2()(`XVi{5!k@Iy?gX2trPSd+MvODq&HremrZN@8 zCDvuCA=m6+h~KHK&EK8>@r5{Ydrplr7<)B|S9U!Sib|ZB=PCwacO`I-SRei4ZnOY> z%?p?Ic0Uy)&pCSM1%3+(`h;vU$8tPGroMp^0`dns-e{q|N<3?r7eUezY*1}1*CkPc z1y1-}dk&Gq{!B@{g;BaJ#UqQOwfY%dE~TyHT+NHOyKf&aGia|QECpItI)%N^%^XDc zFf;SCRh7!jP(#fh{Sz(kW?!RuyaH44#E^M1f^TGz{LX2;3zU2k9XhxsA)mH->ea?Pq>L=^!O>AWCMEF`vBURJ!{+Pf`ryMOS& zpx{y`)8(m((N||oypF6s+-g>kz=TI4&(1QgPnNT*gA2^Jk}pYAz)4_t3oB|+EG^ZL zlD|NdOw}=1k%^Y@7!eO87Y#KpW7yiH7hu_Az^`O;!`hkAl&Ph1mYMaBs0oeFtpYcQb{A-y&ig9lltcHj(xJybz1 zx2ALE=&H@SdfGP4p-hlq$Pi9vQt$C2QU3)UeBQnqMH@6?Gr~lm&1Wz|^izn_P;0U~ zCI_EI0&1#;K~lAxEQ*6Lq9hMHk0HCo#G2;-H+@GF_aeu7fTd7mvwz$t285%?#_;Cq zc3|OzL3WwD{5@6DjAu>nKt+lx*@zS&n&?mLUKHoInAVP(FTRvy6&hC1BVjxS<6PD3 zuOMmMkLsjOLXVnUIx~DORHxrO!BBi_5Uf;$NSIXHsL0Wh!z}D9F@V%U)oe=YX?AFR zrr6s{fR$8?3pStXKkl@OLT)fQ)h1L8!$EbFi}L1rbV(rZ@-{##k(Uukw5xm&@adMJ z^T5}zDOwVNs3*oNRJ0L|g-XeDfNzSG)R+>Mp!AWUI54zV=EP7SYhY@PYL=0=WkEMgE+r4(!;>R-oY3^~riPy+a_Rif)gqt^Fl)74zzZ~ye zao4H7f{FDzinsdU{T0&Ug$eLzQ>&3lCS!;zmf1NOX<8K54JqU8)omg;zBqr@dLVRQ z5yj`WvtNeI-W8E}ll6+&pIkXynyR4XfhsP?21YJq{Bhi1BTLgQ4C>`i;d!Yqj**eq znp2f_-_Ppo3`6Do4!ynh;$yxj8|d(V(SKs&u8%y5H^Iu~0Cf({M1QyQ+g=GUovW$g zyfx01%RRL7heo5`$KI8}@ZK5r*+B3)R~)XZC*-pEeCo;lbVQJ!#e=7Ul%;RKcUpd; z97ny2Ui-37OD?CFxKr?(Wu9qabu*0;6$7U(m;PJK9>I0{Y@@m}cgVJ{iVd&J{GSNE z*%n5)RAC1|rH59sWeyy#7%|->31xf5qm~bHrtxropOz|)E0ljUwxK~`uxlff)utRn z7FzEw;)g&PTGUbQT_ED*5Z*d=Uovc8+=;Gv10- zMXX)Xa0NQyMAave9(dMV%qHS(U;fm~YziF7ZTPrq8!wl8ySgpuX88f(@hiGC*YXO@ zdiuyE3y$A%48jF5InC58O{If+$lt4kvu#ZxCuVlc%RKADitfP)1VqUt*jzIL0z z5&;gwLfv(4Ph)ovC215Ui)GgX9_z|w&6W~BzPTS=*2l9GPrB`x*aJ0I$|?)y1m&y6 zP6|87SnhKRMIikec;)!F5xA6)JPrQ^776hlRdV$>z&5Ic7snRdzu;q7? z>fF7}{;kY06|Z+gM3}(W=Vcut!S*{2!_Vwq-PqE6rZ-Ica(NxVpG`&vFYPu0Vpa|{ zpVpS;$1{u?Xp^)q0j8wa(VYG0Q=6AJDJYK>jT9$<;{`p@MTC_}|JlIz6l)fmQh5LS za6!zyq=CE`ilHnX%itfJmM6N!`9h>;VXbe$Xw&hB9td~8MrL)4MU#VQ5oEi_)ljEA z9WWjq_T&uE2nW0?m+vsBHivMsuPNca-v!NJ)nF(5?WE>k5XmgBEdr`5c! zk))HBt}~P2zaPXl8o-ZJQ4gjK@(3D-c?v3973s$#4zDQ9m&dOksbKeSSZ_nEMy!E+{i}~Ki0Ih4V zxa&+a>ldtT`q^0iU|i$-pj2dd5eUa^=^5*@A(^gIb*lS%{s><_k}aYtYs0%}%(~3F z=F1)^DXL`F^*~`1ay7NS2j_UU#@9WMP+{f+O0op$p@|I9lvA_Ao&g6^W*!c{>0Kdm zLgOPPFSS1gj^I1v(vb*FP~>7lmYj?tBh@}Oq)=Ye1-ZM~vcsn7Frz@4#|VEJCF{P8 z;yrOg;IZnvj?&XMBr_s&R9j#-jkVJunKN3QECN+kiK;qNNy)4pnlGth=t zA^*AEeP*|gOQzzUI=j^TojNnQj!56v5Zxu{lWxO<{X#MZd~e%_Y+s#RkA=f)+&j!; zYicHo>;ZP4^ZaHevrrE4Y5GQN3x>Sw)SXwVDV_q?NUAFJH9zJ-*l?QaSl})rH6j+H z%X8`hFU!(Ij&SLvat8d6IG`B?ea?%`q&9r)b`A^e~wi+Z+e zsHP&`3{14LE%jwhNH}{G*>e+J~R(`R~ zsUD@sxSu?oXLp_vXtn>`+E--gQhF5OSEtq^YI_lL!ryt&w^ecS1eRxHT3E>d;|>ht zd}WIwX}hFX(j0o(v&eWecueZUlqRKz?aCtC%{7_tl;0;TKq-;5pXH9B)1%(;Yu;bR z0rwiBy3XG_L~J9SSWw}th{So1MhGMw{0KknDkIHjxQCLoFv6NKJwANYU`^L&sP*u+ zBDfaC-+y?pF{WlE6FLI^o3E(5OMC$`{_z88oB?Y|{#q!E1%E9LvS0~qOIrYf$S0I( z0U39{GpFe5J%O^vrQ_*1plE49)OA6KAmzqBqi`xFQlvDIW$nJp^8kBEa| z1G9g~b8UZ&W&vvsqK}zI2vf3W#b~8i9^k;DK=$i@K`^F->XKY~!F=C9Ep|2gZkTI% zR{=5cd$#9;3hGkQ3{98T_?Kl0ff-1Jr?c)2)7l`d8AnuADX z(_%GC!=WQ}a$rKPHyxdE-k*qb| zxc(z7WIesgvdWHEfRL$=jm>p%74r`Z)yV74L#k3kNI0l#W|Gr2sdW7BbXU1`UJ1_U zEpRUh$6RQ?ZZi<~EH~?w6I#Q1QS651U*o+Ck_jIyu=#vzsrzuszDUqmknh#) zr2ghqNTmBGMr9OotCuEq@1~5IcS-=1$qJB_4Np`Oe0HBwYf~ zMHE8;UDJU;gpe1u^$ax!oT4?FJnDm_KfnKH8ASMQWDvT7?q5oW|2zBo|DBuuo9

1_Lb(($W7*U==%3@<};T@<91n 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

buBgOF%g)U)VK1|IXRCt^ahYQOVAk4|3WLsXsG4 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

kHMZ&Z+zSx7 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 z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ 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 z 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 z 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

M0LXS{?l<&~R|1f+oslpjAzEyYR+ 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𝔶W^w4tzUr%7I*LKE9-XYpv)&B6&;}$ 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

n4hz?lxw&=2dxmY2a}sI+(0S2~jop9M8NYVs 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 nND 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 AglR|LDO@_iC>Kw)DOehQ`60v-!S;0?67mOu> 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

>k-5o|L5n_=_KYSSxF*_8 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

-qpN(Y-^(qa@xmaPWlWotmKFWul1$ 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 literal 0 HcmV?d00001 diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme new file mode 100644 index 0000000000000000000000000000000000000000..7be3d61ea2158de261c8ec568dfcb9f3eecea9d8 GIT binary patch literal 1105536 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Þ#@QVtm1O1uQPU4S>c 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 0: + os.close(fd) + return True, val_list + + +def getPMCreg(location): + retval = 'ERR' if not os.path.isfile(location): return "%s %s notfound" % (retval, location) try: - with open(location, "r") as fd: + with open(location, 'r') as fd: retval = fd.read() - except Exception: - pass - # logging.error("Unable to open ", location, "file !") + except Exception as error: + return "ERR %s" % str(error) - retval = retval.rstrip("\r\n") + retval = retval.rstrip('\r\n') retval = retval.lstrip(" ") return retval # Get a mailbox register def get_pmc_register(reg_name): - retval = "ERR" - if reg_name[0:4] == "/rif" or reg_name[0:4] == "/ma1" or reg_name[0:4] == "/eth": - mb_reg_file = PORTS_DIR + reg_name - else: - mb_reg_file = MAILBOX_DIR + reg_name + retval = 'ERR' + mb_reg_file = reg_name filepath = glob.glob(mb_reg_file) if len(filepath) == 0: return "%s %s notfound" % (retval, mb_reg_file) - mb_reg_file = filepath[0] # use first found patch + mb_reg_file = filepath[0] if not os.path.isfile(mb_reg_file): + # print mb_reg_file, 'not found !' return "%s %s notfound" % (retval, mb_reg_file) try: - with open(mb_reg_file, "r") as fd: + with open(mb_reg_file, 'rb') as fd: retval = fd.read() - except Exception: - pass - # logging.error("Unable to open ", mb_reg_file, "file !") + retval = typeTostr(retval) + except Exception as error: + retval = "%s %s read failed, msg: %s" % (retval, mb_reg_file, str(error)) - retval = retval.rstrip("\r\n") + retval = retval.rstrip('\r\n') retval = retval.lstrip(" ") return retval -class checktype: +class checktype(): def __init__(self, test1): self.test1 = test1 @staticmethod - def check(name, location, bit, value, tips, err1): - psu_status = int(get_pmc_register(location), 16) - val = (psu_status & (1 << bit)) >> bit - if val != value: - err1["errmsg"] = tips - err1["code"] = -1 - return -1 - else: - err1["errmsg"] = "none" - err1["code"] = 0 - return 0 - - @staticmethod - def getValue(location, bit, type): - value_t = get_pmc_register(location) - if value_t.startswith("ERR"): + def getValue(location, bit, data_type, coefficient=1, addend=0): + try: + value_t = get_pmc_register(location) + if value_t.startswith("ERR") or value_t.startswith("NA"): + return value_t + if data_type == 1: + return float('%.1f' % ((float(value_t) / 1000) + addend)) + if data_type == 2: + return float('%.1f' % (float(value_t) / 100)) + if data_type == 3: + psu_status = int(value_t, 16) + return (psu_status & (1 << bit)) >> bit + if data_type == 4: + return int(value_t, 10) + if data_type == 5: + return float('%.1f' % (float(value_t) / 1000 / 1000)) + if data_type == 6: + return Decimal(float(value_t) * coefficient / 1000).quantize(Decimal('0.000')) return value_t - if type == 1: - return float(value_t) / 1000 - elif type == 2: - return float(value_t) / 100 - elif type == 3: - psu_status = int(value_t, 16) - return (psu_status & (1 << bit)) >> bit - elif type == 4: - return int(value_t, 10) - else: + except Exception as e: + value_t = "ERR %s" % str(e) return value_t - # temperature + # fanFRU @staticmethod - def getTemp(self, name, location, ret_t): - ret2 = self.getValue(location + "temp1_input", " ", 1) - ret3 = self.getValue(location + "temp1_max", " ", 1) - ret4 = self.getValue(location + "temp1_max_hyst", " ", 1) - ret_t["temp1_input"] = ret2 - ret_t["temp1_max"] = ret3 - ret_t["temp1_max_hyst"] = ret4 + def decodeBinByValue(retval): + fru = ipmifru() + fru.decodeBin(retval) + return fru @staticmethod - def getLM75(name, location, result): - c1 = checktype - r1 = {} - c1.getTemp(c1, name, location, r1) - result[name] = r1 + def getfruValue(prob_t, root, val): + try: + ret, binval_bytes = dev_file_read(val, 0, 256) + if ret is False: + return binval_bytes + binval = byteTostr(binval_bytes) + fanpro = {} + ret = checktype.decodeBinByValue(binval) + fanpro['fan_type'] = ret.productInfoArea.productName + fanpro['hw_version'] = str(int(ret.productInfoArea.productVersion, 16)) + fanpro['sn'] = ret.productInfoArea.productSerialNumber + fan_display_name_dict = status.getDecodValue(root, "fan_display_name") + fan_name = fanpro['fan_type'].strip() + if len(fan_display_name_dict) == 0: + return fanpro + if fan_name not in fan_display_name_dict: + prob_t['errcode'] = -1 + prob_t['errmsg'] = '%s' % ("ERR fan name: %s not support" % fan_name) + else: + fanpro['fan_type'] = fan_display_name_dict[fan_name] + return fanpro + except Exception as error: + return "ERR " + str(error) + + @staticmethod + def getslotfruValue(val): + try: + binval = checktype.getValue(val, 0, 0) + if binval.startswith("ERR"): + return binval + slotpro = {} + ret = checktype.decodeBinByValue(binval) + slotpro['slot_type'] = ret.boardInfoArea.boardProductName + slotpro['hw_version'] = ret.boardInfoArea.boardextra1 + slotpro['sn'] = ret.boardInfoArea.boardSerialNumber + return slotpro + except Exception as error: + return "ERR " + str(error) + + @staticmethod + def getpsufruValue(prob_t, root, val): + try: + psu_match = False + binval = checktype.getValue(val, 0, 0) + if binval.startswith("ERR"): + return binval + psupro = {} + ret = checktype.decodeBinByValue(binval) + psupro['type1'] = ret.productInfoArea.productPartModelName + psupro['sn'] = ret.productInfoArea.productSerialNumber + psupro['hw_version'] = ret.productInfoArea.productVersion + psu_dict = status.getDecodValue(root, "psutype") + psupro['type1'] = psupro['type1'].strip() + if len(psu_dict) == 0: + return psupro + for psu_name, display_name in psu_dict.items(): + if psu_name in psupro['type1']: + psupro['type1'] = display_name + psu_match = True + break + if psu_match is not True: + prob_t['errcode'] = -1 + prob_t['errmsg'] = '%s' % ("ERR psu name: %s not support" % psupro['type1']) + return psupro + except Exception as error: + return "ERR " + str(error) -class status: +class status(): def __init__(self, productname): self.productname = productname @@ -119,10 +241,12 @@ class status: @staticmethod def getDecodValue(collection, decode): - decodes = collection.find("decode") + decodes = collection.find('decode') testdecode = decodes.find(decode) test = {} - for neighbor in testdecode.iter("code"): + if testdecode is None: + return test + for neighbor in testdecode.iter('code'): test[neighbor.attrib["key"]] = neighbor.attrib["value"] return test @@ -136,37 +260,67 @@ class status: for neighbor in root.iter(tagname): prob_t = {} prob_t = neighbor.attrib - prob_t["errcode"] = 0 - prob_t["errmsg"] = "" + prob_t['errcode'] = 0 + prob_t['errmsg'] = '' for pros in neighbor.iter("property"): - ret = dict(neighbor.attrib.items() + pros.attrib.items()) - if "type" not in ret.keys(): + ret = dict(list(neighbor.attrib.items()) + list(pros.attrib.items())) + if ret.get('e2type') == 'fru' and ret.get("name") == "fru": + fruval = checktype.getfruValue(prob_t, root, ret["location"]) + if isinstance(fruval, str) and fruval.startswith("ERR"): + prob_t['errcode'] = -1 + prob_t['errmsg'] = fruval + break + prob_t.update(fruval) + continue + + if ret.get("name") == "psu" and ret.get('e2type') == 'fru': + psuval = checktype.getpsufruValue(prob_t, root, ret["location"]) + if isinstance(psuval, str) and psuval.startswith("ERR"): + prob_t['errcode'] = -1 + prob_t['errmsg'] = psuval + break + prob_t.update(psuval) + continue + + if ret.get("gettype") == "config": + prob_t[ret["name"]] = ret["value"] + continue + + if 'type' not in ret.keys(): val = "0" else: val = ret["type"] - if "bit" not in ret.keys(): + if 'bit' not in ret.keys(): bit = "0" else: bit = ret["bit"] - s = checktype.getValue(ret["location"], int(bit), int(val)) + if 'coefficient' not in ret.keys(): + coefficient = 1 + else: + coefficient = float(ret["coefficient"]) + if 'addend' not in ret.keys(): + addend = 0 + else: + addend = float(ret["addend"]) + + s = checktype.getValue(ret["location"], int(bit), int(val), coefficient, addend) if isinstance(s, str) and s.startswith("ERR"): - prob_t["errcode"] = -1 - prob_t["errmsg"] = s - if "default" in ret.keys(): - rt = status.getDecodValue(root, ret["decode"]) - prob_t["errmsg"] = rt[str(s)] + prob_t['errcode'] = -1 + prob_t['errmsg'] = s + break + if 'default' in ret.keys(): + rt = status.getDecodValue(root, ret['decode']) + prob_t['errmsg'] = rt[str(s)] if str(s) != ret["default"]: - prob_t["errcode"] = -1 + prob_t['errcode'] = -1 break else: - if "decode" in ret.keys(): - rt = status.getDecodValue(root, ret["decode"]) - if ( - ret["decode"] == "psutype" - and s.replace("\x00", "").rstrip() not in rt.keys() - ): # PSU type detect - prob_t["errcode"] = -1 - prob_t["errmsg"] = "%s" % ("The power type does not match, please check whether the power is correct!") + if 'decode' in ret.keys(): + rt = status.getDecodValue(root, ret['decode']) + if (ret['decode'] == "psutype" and s.replace("\x00", "").rstrip() not in rt): + prob_t['errcode'] = -1 + prob_t['errmsg'] = '%s' % ("ERR psu name: %s not support" % + (s.replace("\x00", "").rstrip())) else: s = rt[str(s).replace("\x00", "").rstrip()] name = ret["name"] @@ -187,46 +341,39 @@ class status: for i in range(len(L)): prob_t = {} prob_t["name"] = getPMCreg("%s/temp%d_label" % (location, i + 1)) - prob_t["temp"] = ( - float(getPMCreg("%s/temp%d_input" % (location, i + 1))) / 1000 - ) - prob_t["alarm"] = ( - float(getPMCreg("%s/temp%d_crit_alarm" % (location, i + 1))) / 1000 - ) - prob_t["crit"] = ( - float(getPMCreg("%s/temp%d_crit" % (location, i + 1))) / 1000 - ) + prob_t["temp"] = float(getPMCreg("%s/temp%d_input" % (location, i + 1))) / 1000 + prob_t["alarm"] = float(getPMCreg("%s/temp%d_crit_alarm" % (location, i + 1))) / 1000 + prob_t["crit"] = float(getPMCreg("%s/temp%d_crit" % (location, i + 1))) / 1000 prob_t["max"] = float(getPMCreg("%s/temp%d_max" % (location, i + 1))) / 1000 a.append(prob_t) @staticmethod def getFileName(): - return os.path.dirname(os.path.realpath(__file__)) + "/" + CONFIG_NAME - - @staticmethod - def getFan(ret): - _filename = status.getFileName() - _tagname = "fan" - status.getvalue(ret, _filename, _tagname) + fpath = os.path.dirname(os.path.realpath(__file__)) + for file in DEV_XML_FILE_LIST: + xml = fpath + "/" + file + if os.path.exists(xml): + return xml + return fpath + "/" + CONFIG_NAME @staticmethod def checkFan(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() + # _filename = "/usr/local/bin/" + status.getFileName() _tagname = "fan" status.getETValue(ret, _filename, _tagname) @staticmethod def getTemp(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() + # _filename = "/usr/local/bin/" + status.getFileName() _tagname = "temp" status.getETValue(ret, _filename, _tagname) @staticmethod def getPsu(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() + # _filename = "/usr/local/bin/" + status.getFileName() _tagname = "psu" status.getETValue(ret, _filename, _tagname) @@ -237,8 +384,19 @@ class status: status.getCPUValue(ret, _filename, _tagname) @staticmethod - def getMgmtRx(ret): + def getDcdc(ret): _filename = status.getFileName() - # _filename = "/usr/local/bin/" + status.getFileName() - _tagname = "mgmt_rx" + _tagname = "dcdc" + status.getETValue(ret, _filename, _tagname) + + @staticmethod + def getmactemp(ret): + _filename = status.getFileName() + _tagname = "mactemp" + status.getETValue(ret, _filename, _tagname) + + @staticmethod + def getmacpower(ret): + _filename = status.getFileName() + _tagname = "macpower" status.getETValue(ret, _filename, _tagname) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml index 90ebf17406..7b026cec39 100644 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pcie.yaml @@ -82,6 +82,12 @@ id: 8c10 name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 (rev d5)' +- bus: '00' + dev: 1c + fn: '1' + id: 8c12 + name: 'PCI bridge: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express + Root Port #2 (rev d5)' - bus: '00' dev: 1d fn: '0' @@ -109,9 +115,8 @@ - bus: '01' dev: '00' fn: '0' - id: '1533' - name: 'Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev - 03)' + id: b873 + name: 'Ethernet controller: Broadcom Inc. and subsidiaries Device b873 (rev 01)' - bus: '03' dev: '00' fn: '0' @@ -149,8 +154,14 @@ - bus: '07' dev: '00' fn: '0' - id: b873 - name: 'Ethernet controller: Broadcom Limited Device b873 (rev 01)' + id: '1537' + name: 'Ethernet controller: Intel Corporation I210 Gigabit Backplane Connection + (rev 03)' +- bus: 08 + dev: '00' + fn: '0' + id: '7022' + name: 'Memory controller: Xilinx Corporation Device 7022' - bus: ff dev: 0b fn: '0' diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json deleted file mode 100644 index ffa06ff743..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pd-plugin.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "XCVR": { - "xcvr_present": { - "i2c": { - "valmap-SFP28": { - "1": true, - "0": false - }, - "valmap-QSFP28": { - "1": true, - "0": false - } - } - } - }, - - "PSU": { - "psu_present": { - "i2c": { - "valmap": { - "1": true, - "0": false - } - } - }, - - "psu_power_good": { - "i2c": { - "valmap": { - "1": true, - "0": false - } - } - }, - - "psu_fan_dir": { - "i2c": { - "valmap": { - "F2B": "EXHAUST", - "B2F": "INTAKE" - } - } - }, - "PSU_FAN_MAX_SPEED": "18000" - }, - - "FAN": { - "direction": { - "i2c": { - "valmap": { - "1": "INTAKE", - "0": "EXHAUST" - } - } - }, - "present": { - "i2c": { - "valmap": { - "1": true, - "0": false - } - } - }, - "duty_cycle_to_pwm": "lambda dc: dc*255/100", - "pwm_to_duty_cycle": "lambda pwm: pwm*100/255" - } -} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json deleted file mode 100644 index e9fc701bb8..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf/pddf-device.json +++ /dev/null @@ -1,6502 +0,0 @@ -{ - "PLATFORM": { - "num_psus": 2, - "num_fantrays": 4, - "num_fans_pertray": 1, - "num_ports": 56, - "num_temps": 3, - "pddf_dev_types": { - "description": "RA-B6510-48v8c", - "CPLD": [ - "i2c_cpld" - ], - "PSU": [ - "psu_eeprom", - "psu_pmbus" - ], - "FAN": [ - "fan_ctrl", - "fan_cpld", - "fan_eeprom" - ], - "PORT_MODULE": [ - "pddf_xcvr", - "optoe1", - "optoe2" - ] - }, - "std_kos": [ - "i2c-ismt", - "i2c-i801", - "i2c_dev", - "i2c_gpio", - "i2c_algo_bit", - "i2c_mux_pca9641", - "i2c_mux_pca954x force_create_bus=1 close_chan_force_reset=1", - "lm75", - "optoe", - "at24", - "pmbus_core" - ], - "pddf_kos": [ - "pddf_client_module", - "pddf_cpld_module", - "pddf_cpld_driver", - "pddf_mux_module", - "pddf_xcvr_module", - "pddf_xcvr_driver_module", - "pddf_psu_driver_module", - "pddf_psu_module", - "pddf_fan_driver_module", - "pddf_fan_module", - "pddf_led_module", - "pddf_sysstatus_module" - ], - "custom_kos": [ - "ragile_platform", - "ragile_common dfd_my_type=0x404a", - "rg_cpld", - "rg_fan", - "rg_psu", - "rg_gpio_xeon", - "csu550" - ] - - }, - - "SYSTEM": { - "dev_info": { - "device_type": "CPU", - "device_name": "ROOT_COMPLEX", - "device_parent": null - }, - "i2c": { - "CONTROLLERS": [{ - "dev_name": "i2c-0", - "dev": "SMBUS0" - }, { - "dev_name": "i2c-2", - "dev": "SMBUS1" - }, { - "dev_name": "i2c-1", - "dev": "I2C-GPIO0" - }] - } - }, - - "SMBUS0": { - "dev_info": { - "device_type": "SMBUS", - "device_name": "SMBUS0", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x0" - }, - "DEVICES": [{ - "dev": "CPU_CPLD" - }, - { - "dev": "CONNECT_BOARD_CPLD1" - } - ] - } - }, - - "CPU_CPLD": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CPU_CPLD", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x0d", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "CONNECT_BOARD_CPLD1": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CONNECT_BOARD_CPLD1", - "device_parent": "SMBUS0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x0", - "dev_addr": "0x32", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "SMBUS1": { - "dev_info": { - "device_type": "SMBUS", - "device_name": "SMBUS1", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x2" - }, - "DEVICES": [{ - "dev": "MAC_BOARD_CPLD1_A" - }, - { - "dev": "MAC_BOARD_CPLD2_A" - }, - { - "dev": "CONNECT_BOARD_CPLD2" - }, - { - "dev": "FAN-CTRL" - }, - { - "dev": "TEMP1" - }, - { - "dev": "TEMP2" - }, - { - "dev": "TEMP3" - }, - { - "dev": "EEPROM1" - }, - { - "dev": "MUX1" - } - ] - } - }, - - "MAC_BOARD_CPLD1_A": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD1_A", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x33", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "MAC_BOARD_CPLD2_A": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD2_A", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x35", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "FAN-CTRL": { - "dev_info": { - "device_type": "FAN", - "device_name": "FAN-CTRL", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x66", - "dev_type": "fan_cpld" - }, - "dev_attr": { - "num_fantrays": "4" - }, - "attr_list": [{ - "attr_name": "fan1_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x1", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan2_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x2", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan3_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x4", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan4_present", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x30", - "attr_mask": "0x8", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "fan1_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x1b", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan2_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x1d", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan3_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x1f", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan4_input", - "attr_devname": "CONNECT_BOARD_CPLD2", - "attr_devtype": "cpld", - "attr_devaddr": "0x37", - "attr_offset": "0x21", - "attr_mult": "1", - "attr_len": "2" - }, - { - "attr_name": "fan1_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - }, - { - "attr_name": "fan2_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - }, - { - "attr_name": "fan3_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - }, - { - "attr_name": "fan4_pwm", - "attr_devtype": "cpld", - "attr_devaddr": "0x32", - "attr_offset": "0x15", - "attr_mask": "0xff", - "attr_len": "1" - } - ] - } - }, - - "CONNECT_BOARD_CPLD2": { - "dev_info": { - "device_type": "CPLD", - "device_name": "CONNECT_BOARD_CPLD2", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x37", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "TEMP1": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "MAC_TEMP_INLET", - "device_parent": "SMBUS1" - }, - "dev_attr": { - "display_name": "Temp_1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x48", - "dev_type": "lm75" - }, - "attr_list": [{ - "attr_name": "temp1_high_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - - "TEMP2": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "MAC_TEMP_OUTLET", - "device_parent": "SMBUS1" - }, - "dev_attr": { - "display_name": "Temp_2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x49", - "dev_type": "lm75" - }, - "attr_list": [{ - "attr_name": "temp1_high_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - - "TEMP3": { - "dev_info": { - "device_type": "TEMP_SENSOR", - "device_name": "MAC_TEMP_HOTEST", - "device_parent": "SMBUS1" - }, - "dev_attr": { - "display_name": "Temp_3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x4a", - "dev_type": "lm75" - }, - "attr_list": [{ - "attr_name": "temp1_high_threshold", - "drv_attr_name": "temp1_max" - }, - { - "attr_name": "temp1_max_hyst" - }, - { - "attr_name": "temp1_input" - } - ] - } - }, - - "EEPROM1": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "EEPROM1", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x57", - "dev_type": "24c02" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "MUX1": { - "dev_info": { - "device_type": "MUX", - "device_name": "MUX1", - "device_parent": "SMBUS1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2", - "dev_addr": "0x70", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x3" - }, - "channel": [{ - "chn": "0", - "dev": "FAN1-EEPROM" - }, - { - "chn": "1", - "dev": "FAN2-EEPROM" - }, - { - "chn": "2", - "dev": "FAN3-EEPROM" - }, - { - "chn": "3", - "dev": "FAN4-EEPROM" - }, - { - "chn": "4", - "dev": "PSU1" - }, - { - "chn": "5", - "dev": "PSU2" - } - ] - } - }, - - "FAN1-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN1-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "FAN2-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN2-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x4", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "FAN3-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN3-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x5", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "FAN4-EEPROM": { - "dev_info": { - "device_type": "EEPROM", - "device_name": "FAN4-EEPROM", - "device_parent": "MUX1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x6", - "dev_addr": "0x53", - "dev_type": "rg_fan" - }, - "dev_attr": { - "access_mode": "BLOCK" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PSU1": { - "dev_info": { - "device_type": "PSU", - "device_name": "PSU1", - "device_parent": "MUX1" - }, - "dev_attr": { - "dev_idx": "1", - "num_psu_fans": "1" - }, - "i2c": { - "interface": [{ - "itf": "pmbus", - "dev": "PSU1-PMBUS" - }, - { - "itf": "eeprom", - "dev": "PSU1-EEPROM" - } - ] - } - }, - - "PSU1-PMBUS": { - "dev_info": { - "device_type": "PSU-PMBUS", - "device_name": "PSU1-PMBUS", - "device_parent": "MUX1", - "virt_parent": "PSU1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x7", - "dev_addr": "0x58", - "dev_type": "psu_pmbus" - }, - "attr_list": [{ - "attr_name": "psu_present", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x1", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "psu_model_name", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x9a", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "12" - }, - { - "attr_name": "psu_power_good", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x2", - "attr_cmpval": "0x2", - "attr_len": "1" - }, - { - "attr_name": "psu_mfr_id", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x99", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "10" - }, - { - "attr_name": "psu_fan_dir", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0xc3", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "5" - }, - { - "attr_name": "psu_v_out", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x8b", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_i_out", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x8c", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_p_out", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x96", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_fan1_speed_rpm", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x90", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_temp1_input", - "attr_devaddr": "0x58", - "attr_devtype": "pmbus", - "attr_offset": "0x8d", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - } - ] - } - }, - - "PSU1-EEPROM": { - "dev_info": { - "device_type": "PSU-EEPROM", - "device_name": "PSU1-EEPROM", - "device_parent": "MUX1", - "virt_parent": "PSU1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x7", - "dev_addr": "0x50", - "dev_type": "psu_eeprom" - }, - "attr_list": [{ - "attr_name": "psu_serial_num", - "attr_devaddr": "0x50", - "attr_devtype": "eeprom", - "attr_offset": "0x38", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "20" - }] - } - }, - - "PSU2": { - "dev_info": { - "device_type": "PSU", - "device_name": "PSU2", - "device_parent": "MUX1" - }, - "dev_attr": { - "dev_idx": "2", - "num_psu_fans": "1" - }, - "i2c": { - "interface": [{ - "itf": "pmbus", - "dev": "PSU2-PMBUS" - }, - { - "itf": "eeprom", - "dev": "PSU2-EEPROM" - } - ] - } - }, - - "PSU2-PMBUS": { - "dev_info": { - "device_type": "PSU-PMBUS", - "device_name": "PSU2-PMBUS", - "device_parent": "MUX1", - "virt_parent": "PSU2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x8", - "dev_addr": "0x5b", - "dev_type": "psu_pmbus" - }, - "attr_list": [{ - "attr_name": "psu_present", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x10", - "attr_cmpval": "0x0", - "attr_len": "1" - }, - { - "attr_name": "psu_model_name", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x9a", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "12" - }, - { - "attr_name": "psu_power_good", - "attr_devaddr": "0x37", - "attr_devtype": "cpld", - "attr_offset": "0x51", - "attr_mask": "0x20", - "attr_cmpval": "0x20", - "attr_len": "1" - }, - { - "attr_name": "psu_mfr_id", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x99", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "10" - }, - { - "attr_name": "psu_fan_dir", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0xc3", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "5" - }, - { - "attr_name": "psu_v_out", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x8b", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_i_out", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x8c", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_p_out", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x96", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_fan1_speed_rpm", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x90", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - }, - { - "attr_name": "psu_temp1_input", - "attr_devaddr": "0x5b", - "attr_devtype": "pmbus", - "attr_offset": "0x8d", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "2" - } - ] - } - }, - - "PSU2-EEPROM": { - "dev_info": { - "device_type": "PSU-EEPROM", - "device_name": "PSU2-EEPROM", - "device_parent": "MUX1", - "virt_parent": "PSU2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x8", - "dev_addr": "0x53", - "dev_type": "psu_eeprom" - }, - "attr_list": [{ - "attr_name": "psu_serial_num", - "attr_devaddr": "0x53", - "attr_devtype": "eeprom", - "attr_offset": "0x38", - "attr_mask": "0x0", - "attr_cmpval": "0xff", - "attr_len": "20" - }] - } - }, - - "I2C-GPIO0": { - "dev_info": { - "device_type": "I2C-GPIO", - "device_name": "I2C-GPIO0", - "device_parent": "SYSTEM" - }, - "i2c": { - "topo_info": { - "dev_addr": "0x1" - }, - "DEVICES": [{ - "dev": "MAC_BOARD_CPLD1_B" - }, - { - "dev": "MAC_BOARD_CPLD2_B" - }, - { - "dev": "PORT-MUX1" - }, - { - "dev": "PORT-MUX2" - }, - { - "dev": "PORT-MUX3" - }, - { - "dev": "PORT-MUX4" - }, - { - "dev": "PORT-MUX5" - }, - { - "dev": "PORT-MUX6" - }, - { - "dev": "PORT-MUX7" - }, - { - "dev": "PORT-MUX8" - } - ] - } - }, - - "MAC_BOARD_CPLD1_B": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD1_B", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x34", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "MAC_BOARD_CPLD2_B": { - "dev_info": { - "device_type": "CPLD", - "device_name": "MAC_BOARD_CPLD2_B", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x36", - "dev_type": "i2c_cpld" - }, - "dev_attr": {} - } - }, - - "PORT-MUX1": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX1", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x70", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0xb" - }, - "channel": [{ - "chn": "0", - "dev": "PORT1" - }, - { - "chn": "1", - "dev": "PORT2" - }, - { - "chn": "2", - "dev": "PORT3" - }, - { - "chn": "3", - "dev": "PORT4" - }, - { - "chn": "4", - "dev": "PORT5" - }, - { - "chn": "5", - "dev": "PORT6" - }, - { - "chn": "6", - "dev": "PORT7" - }, - { - "chn": "7", - "dev": "PORT8" - } - ] - } - }, - - "PORT-MUX2": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX2", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x71", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x13" - }, - "channel": [{ - "chn": "0", - "dev": "PORT9" - }, - { - "chn": "1", - "dev": "PORT10" - }, - { - "chn": "2", - "dev": "PORT11" - }, - { - "chn": "3", - "dev": "PORT12" - }, - { - "chn": "4", - "dev": "PORT13" - }, - { - "chn": "5", - "dev": "PORT14" - }, - { - "chn": "6", - "dev": "PORT15" - }, - { - "chn": "7", - "dev": "PORT16" - } - ] - } - }, - - "PORT-MUX3": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX3", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x72", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x1b" - }, - "channel": [{ - "chn": "0", - "dev": "PORT17" - }, - { - "chn": "1", - "dev": "PORT18" - }, - { - "chn": "2", - "dev": "PORT19" - }, - { - "chn": "3", - "dev": "PORT20" - }, - { - "chn": "4", - "dev": "PORT21" - }, - { - "chn": "5", - "dev": "PORT22" - }, - { - "chn": "6", - "dev": "PORT23" - }, - { - "chn": "7", - "dev": "PORT24" - } - ] - } - }, - - "PORT-MUX4": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX4", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x73", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x23" - }, - "channel": [{ - "chn": "0", - "dev": "PORT25" - }, - { - "chn": "1", - "dev": "PORT26" - }, - { - "chn": "2", - "dev": "PORT27" - }, - { - "chn": "3", - "dev": "PORT28" - }, - { - "chn": "4", - "dev": "PORT29" - }, - { - "chn": "5", - "dev": "PORT30" - }, - { - "chn": "6", - "dev": "PORT31" - }, - { - "chn": "7", - "dev": "PORT32" - } - ] - } - }, - - "PORT-MUX5": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX5", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x74", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x2b" - }, - "channel": [{ - "chn": "0", - "dev": "PORT33" - }, - { - "chn": "1", - "dev": "PORT34" - }, - { - "chn": "2", - "dev": "PORT35" - }, - { - "chn": "3", - "dev": "PORT36" - }, - { - "chn": "4", - "dev": "PORT37" - }, - { - "chn": "5", - "dev": "PORT38" - }, - { - "chn": "6", - "dev": "PORT39" - }, - { - "chn": "7", - "dev": "PORT40" - } - ] - } - }, - - "PORT-MUX6": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX6", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x75", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x33" - }, - "channel": [{ - "chn": "0", - "dev": "PORT41" - }, - { - "chn": "1", - "dev": "PORT42" - }, - { - "chn": "2", - "dev": "PORT43" - }, - { - "chn": "3", - "dev": "PORT44" - }, - { - "chn": "4", - "dev": "PORT45" - }, - { - "chn": "5", - "dev": "PORT46" - }, - { - "chn": "6", - "dev": "PORT47" - }, - { - "chn": "7", - "dev": "PORT48" - } - ] - } - }, - - "PORT-MUX7": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX7", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x76", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x3b" - }, - "channel": [{ - "chn": "0", - "dev": "PORT49" - }, - { - "chn": "1", - "dev": "PORT50" - }, - { - "chn": "2", - "dev": "PORT51" - }, - { - "chn": "3", - "dev": "PORT52" - }, - { - "chn": "4", - "dev": "PORT53" - }, - { - "chn": "5", - "dev": "PORT54" - }, - { - "chn": "6", - "dev": "PORT55" - }, - { - "chn": "7", - "dev": "PORT56" - } - ] - } - }, - - "PORT-MUX8": { - "dev_info": { - "device_type": "MUX", - "device_name": "PORT-MUX8", - "device_parent": "I2C-GPIO0" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1", - "dev_addr": "0x77", - "dev_type": "pca9548" - }, - "dev_attr": { - "virt_bus": "0x43" - }, - "channel": [] - } - }, - - "PORT1": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT1", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "1" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT1-EEPROM" - }, { - "itf": "control", - "dev": "PORT1-CTRL" - }] - } - }, - - "PORT1-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT1-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xb", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT1-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT1-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT1" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xb", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT2": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT2", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "2" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT2-EEPROM" - }, { - "itf": "control", - "dev": "PORT2-CTRL" - }] - } - }, - - "PORT2-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT2-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xc", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT2-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT2-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT2" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xc", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT3": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT3", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "3" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT3-EEPROM" - }, { - "itf": "control", - "dev": "PORT3-CTRL" - }] - } - }, - - "PORT3-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT3-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xd", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT3-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT3-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT3" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xd", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT4": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT4", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "4" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT4-EEPROM" - }, { - "itf": "control", - "dev": "PORT4-CTRL" - }] - } - }, - - "PORT4-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT4-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT4" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xe", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT4-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT4-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT4" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xe", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT5": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT5", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "5" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT5-EEPROM" - }, { - "itf": "control", - "dev": "PORT5-CTRL" - }] - } - }, - - "PORT5-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT5-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT5" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xf", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT5-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT5-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT5" - }, - "i2c": { - "topo_info": { - "parent_bus": "0xf", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT6": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT6", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "6" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT6-EEPROM" - }, { - "itf": "control", - "dev": "PORT6-CTRL" - }] - } - }, - - "PORT6-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT6-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT6" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x10", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT6-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT6-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT6" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x10", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT7": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT7", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "7" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT7-EEPROM" - }, { - "itf": "control", - "dev": "PORT7-CTRL" - }] - } - }, - - "PORT7-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT7-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT7" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x11", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT7-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT7-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT7" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x11", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT8": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT8", - "device_parent": "PORT-MUX1" - }, - "dev_attr": { - "dev_idx": "8" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT8-EEPROM" - }, { - "itf": "control", - "dev": "PORT8-CTRL" - }] - } - }, - - "PORT8-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT8-EEPROM", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT8" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x12", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT8-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT8-CTRL", - "device_parent": "PORT-MUX1", - "virt_parent": "PORT8" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x12", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT9": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT9", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "9" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT9-EEPROM" - }, { - "itf": "control", - "dev": "PORT9-CTRL" - }] - } - }, - - "PORT9-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT9-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT9" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x13", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT9-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT9-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT9" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x13", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT10": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT10", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "10" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT10-EEPROM" - }, { - "itf": "control", - "dev": "PORT10-CTRL" - }] - } - }, - - "PORT10-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT10-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT10" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x14", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT10-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT10-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT10" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x14", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT11": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT11", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "11" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT11-EEPROM" - }, { - "itf": "control", - "dev": "PORT11-CTRL" - }] - } - }, - - "PORT11-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT11-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT11" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x15", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT11-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT11-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT11" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x15", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT12": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT12", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "12" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT12-EEPROM" - }, { - "itf": "control", - "dev": "PORT12-CTRL" - }] - } - }, - - "PORT12-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT12-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT12" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x16", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT12-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT12-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT12" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x16", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT13": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT13", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "13" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT13-EEPROM" - }, { - "itf": "control", - "dev": "PORT13-CTRL" - }] - } - }, - - "PORT13-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT13-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT13" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x17", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT13-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT13-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT13" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x17", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT14": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT14", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "14" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT14-EEPROM" - }, { - "itf": "control", - "dev": "PORT14-CTRL" - }] - } - }, - - "PORT14-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT14-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT14" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x18", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT14-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT14-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT14" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x18", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT15": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT15", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "15" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT15-EEPROM" - }, { - "itf": "control", - "dev": "PORT15-CTRL" - }] - } - }, - - "PORT15-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT15-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT15" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x19", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT15-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT15-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT15" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x19", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT16": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT16", - "device_parent": "PORT-MUX2" - }, - "dev_attr": { - "dev_idx": "16" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT16-EEPROM" - }, { - "itf": "control", - "dev": "PORT16-CTRL" - }] - } - }, - - "PORT16-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT16-EEPROM", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT16" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1a", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT16-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT16-CTRL", - "device_parent": "PORT-MUX2", - "virt_parent": "PORT16" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT17": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT17", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "17" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT17-EEPROM" - }, { - "itf": "control", - "dev": "PORT17-CTRL" - }] - } - }, - - "PORT17-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT17-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT17" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1b", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT17-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT17-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT17" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT18": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT18", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "18" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT18-EEPROM" - }, { - "itf": "control", - "dev": "PORT18-CTRL" - }] - } - }, - - "PORT18-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT18-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT18" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1c", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT18-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT18-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT18" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT19": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT19", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "19" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT19-EEPROM" - }, { - "itf": "control", - "dev": "PORT19-CTRL" - }] - } - }, - - "PORT19-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT19-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT19" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1d", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT19-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT19-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT19" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT20": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT20", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "20" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT20-EEPROM" - }, { - "itf": "control", - "dev": "PORT20-CTRL" - }] - } - }, - - "PORT20-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT20-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT20" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1e", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT20-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT20-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT20" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT21": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT21", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "21" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT21-EEPROM" - }, { - "itf": "control", - "dev": "PORT21-CTRL" - }] - } - }, - - "PORT21-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT21-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT21" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1f", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT21-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT21-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT21" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x1f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT22": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT22", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "22" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT22-EEPROM" - }, { - "itf": "control", - "dev": "PORT22-CTRL" - }] - } - }, - - "PORT22-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT22-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT22" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x20", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT22-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT22-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT22" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x20", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT23": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT23", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "23" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT23-EEPROM" - }, { - "itf": "control", - "dev": "PORT23-CTRL" - }] - } - }, - - "PORT23-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT23-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT23" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x21", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT23-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT23-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT23" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x21", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT24": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT24", - "device_parent": "PORT-MUX3" - }, - "dev_attr": { - "dev_idx": "24" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT24-EEPROM" - }, { - "itf": "control", - "dev": "PORT24-CTRL" - }] - } - }, - - "PORT24-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT24-EEPROM", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT24" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x22", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT24-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT24-CTRL", - "device_parent": "PORT-MUX3", - "virt_parent": "PORT24" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x22", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD1_B", - "attr_devaddr": "0x34", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT25": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT25", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "25" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT25-EEPROM" - }, { - "itf": "control", - "dev": "PORT25-CTRL" - }] - } - }, - - "PORT25-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT25-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT25" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x23", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT25-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT25-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT25" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x23", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT26": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT26", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "26" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT26-EEPROM" - }, { - "itf": "control", - "dev": "PORT26-CTRL" - }] - } - }, - - "PORT26-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT26-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT26" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x24", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT26-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT26-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT26" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x24", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT27": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT27", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "27" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT27-EEPROM" - }, { - "itf": "control", - "dev": "PORT27-CTRL" - }] - } - }, - - "PORT27-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT27-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT27" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x25", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT27-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT27-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT27" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x25", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT28": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT28", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "28" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT28-EEPROM" - }, { - "itf": "control", - "dev": "PORT28-CTRL" - }] - } - }, - - "PORT28-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT28-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT28" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x26", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT28-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT28-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT28" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x26", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT29": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT29", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "29" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT29-EEPROM" - }, { - "itf": "control", - "dev": "PORT29-CTRL" - }] - } - }, - - "PORT29-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT29-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT29" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x27", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT29-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT29-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT29" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x27", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT30": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT30", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "30" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT30-EEPROM" - }, { - "itf": "control", - "dev": "PORT30-CTRL" - }] - } - }, - - "PORT30-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT30-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT30" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x28", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT30-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT30-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT30" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x28", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT31": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT31", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "31" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT31-EEPROM" - }, { - "itf": "control", - "dev": "PORT31-CTRL" - }] - } - }, - - "PORT31-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT31-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT31" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x29", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT31-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT31-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT31" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x29", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT32": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT32", - "device_parent": "PORT-MUX4" - }, - "dev_attr": { - "dev_idx": "32" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT32-EEPROM" - }, { - "itf": "control", - "dev": "PORT32-CTRL" - }] - } - }, - - "PORT32-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT32-EEPROM", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT32" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2a", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT32-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT32-CTRL", - "device_parent": "PORT-MUX4", - "virt_parent": "PORT32" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x30", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x60", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x40", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT33": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT33", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "33" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT33-EEPROM" - }, { - "itf": "control", - "dev": "PORT33-CTRL" - }] - } - }, - - "PORT33-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT33-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT33" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2b", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT33-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT33-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT33" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT34": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT34", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "34" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT34-EEPROM" - }, { - "itf": "control", - "dev": "PORT34-CTRL" - }] - } - }, - - "PORT34-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT34-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT34" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2c", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT34-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT34-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT34" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT35": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT35", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "35" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT35-EEPROM" - }, { - "itf": "control", - "dev": "PORT35-CTRL" - }] - } - }, - - "PORT35-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT35-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT35" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2d", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT35-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT35-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT35" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT36": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT36", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "36" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT36-EEPROM" - }, { - "itf": "control", - "dev": "PORT36-CTRL" - }] - } - }, - - "PORT36-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT36-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT36" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2e", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT36-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT36-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT36" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT37": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT37", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "37" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT37-EEPROM" - }, { - "itf": "control", - "dev": "PORT37-CTRL" - }] - } - }, - - "PORT37-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT37-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT37" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2f", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT37-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT37-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT37" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x2f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT38": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT38", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "38" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT38-EEPROM" - }, { - "itf": "control", - "dev": "PORT38-CTRL" - }] - } - }, - - "PORT38-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT38-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT38" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x30", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT38-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT38-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT38" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x30", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT39": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT39", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "39" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT39-EEPROM" - }, { - "itf": "control", - "dev": "PORT39-CTRL" - }] - } - }, - - "PORT39-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT39-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT39" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x31", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT39-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT39-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT39" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x31", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT40": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT40", - "device_parent": "PORT-MUX5" - }, - "dev_attr": { - "dev_idx": "40" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT40-EEPROM" - }, { - "itf": "control", - "dev": "PORT40-CTRL" - }] - } - }, - - "PORT40-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT40-EEPROM", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT40" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x32", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT40-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT40-CTRL", - "device_parent": "PORT-MUX5", - "virt_parent": "PORT40" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x32", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x31", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x61", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x41", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT41": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT41", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "41" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT41-EEPROM" - }, { - "itf": "control", - "dev": "PORT41-CTRL" - }] - } - }, - - "PORT41-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT41-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT41" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x33", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT41-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT41-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT41" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x33", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT42": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT42", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "42" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT42-EEPROM" - }, { - "itf": "control", - "dev": "PORT42-CTRL" - }] - } - }, - - "PORT42-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT42-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT42" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x34", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT42-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT42-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT42" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x34", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT43": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT43", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "43" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT43-EEPROM" - }, { - "itf": "control", - "dev": "PORT43-CTRL" - }] - } - }, - - "PORT43-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT43-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT43" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x35", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT43-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT43-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT43" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x35", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT44": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT44", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "44" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT44-EEPROM" - }, { - "itf": "control", - "dev": "PORT44-CTRL" - }] - } - }, - - "PORT44-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT44-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT44" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x36", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT44-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT44-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT44" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x36", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT45": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT45", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "45" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT45-EEPROM" - }, { - "itf": "control", - "dev": "PORT45-CTRL" - }] - } - }, - - "PORT45-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT45-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT45" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x37", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT45-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT45-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT45" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x37", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT46": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT46", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "46" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT46-EEPROM" - }, { - "itf": "control", - "dev": "PORT46-CTRL" - }] - } - }, - - "PORT46-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT46-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT46" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x38", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT46-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT46-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT46" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x38", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT47": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT47", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "47" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT47-EEPROM" - }, { - "itf": "control", - "dev": "PORT47-CTRL" - }] - } - }, - - "PORT47-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT47-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT47" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x39", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT47-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT47-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT47" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x39", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT48": { - "dev_info": { - "device_type": "SFP28", - "device_name": "PORT48", - "device_parent": "PORT-MUX6" - }, - "dev_attr": { - "dev_idx": "48" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT48-EEPROM" - }, { - "itf": "control", - "dev": "PORT48-CTRL" - }] - } - }, - - "PORT48-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT48-EEPROM", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT48" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3a", - "dev_addr": "0x50", - "dev_type": "optoe2" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT48-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT48-CTRL", - "device_parent": "PORT-MUX6", - "virt_parent": "PORT48" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3a", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x32", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_txdisable", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x62", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_intr_status", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x42", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT49": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT49", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "49" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT49-EEPROM" - }, { - "itf": "control", - "dev": "PORT49-CTRL" - }] - } - }, - - "PORT49-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT49-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT49" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3b", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT49-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT49-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT49" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3b", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x00", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT50": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT50", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "50" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT50-EEPROM" - }, { - "itf": "control", - "dev": "PORT50-CTRL" - }] - } - }, - - "PORT50-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT50-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT50" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3c", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT50-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT50-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT50" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3c", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x01", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT51": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT51", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "51" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT51-EEPROM" - }, { - "itf": "control", - "dev": "PORT51-CTRL" - }] - } - }, - - "PORT51-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT51-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT51" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3d", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT51-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT51-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT51" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3d", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x02", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT52": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT52", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "52" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT52-EEPROM" - }, { - "itf": "control", - "dev": "PORT52-CTRL" - }] - } - }, - - "PORT52-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT52-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT52" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3e", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT52-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT52-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT52" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3e", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x03", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT53": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT53", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "53" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT53-EEPROM" - }, { - "itf": "control", - "dev": "PORT53-CTRL" - }] - } - }, - - "PORT53-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT53-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT53" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3f", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT53-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT53-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT53" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x3f", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x04", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - - "PORT54": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT54", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "54" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT54-EEPROM" - }, { - "itf": "control", - "dev": "PORT54-CTRL" - }] - } - }, - - "PORT54-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT54-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT54" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x40", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT54-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT54-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT54" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x40", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x05", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT55": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT55", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "55" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT55-EEPROM" - }, { - "itf": "control", - "dev": "PORT55-CTRL" - }] - } - }, - - "PORT55-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT55-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT55" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x41", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT55-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT55-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT55" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x41", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x06", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "PORT56": { - "dev_info": { - "device_type": "QSFP28", - "device_name": "PORT56", - "device_parent": "PORT-MUX7" - }, - "dev_attr": { - "dev_idx": "56" - }, - "i2c": { - "interface": [{ - "itf": "eeprom", - "dev": "PORT56-EEPROM" - }, { - "itf": "control", - "dev": "PORT56-CTRL" - }] - } - }, - - "PORT56-EEPROM": { - "dev_info": { - "device_type": "", - "device_name": "PORT56-EEPROM", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT56" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x42", - "dev_addr": "0x50", - "dev_type": "optoe1" - }, - "attr_list": [{ - "attr_name": "eeprom" - }] - } - }, - - "PORT56-CTRL": { - "dev_info": { - "device_type": "", - "device_name": "PORT56-CTRL", - "device_parent": "PORT-MUX7", - "virt_parent": "PORT56" - }, - "i2c": { - "topo_info": { - "parent_bus": "0x42", - "dev_addr": "0x53", - "dev_type": "pddf_xcvr" - }, - "attr_list": [{ - "attr_name": "xcvr_present", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devaddr": "0x36", - "attr_devtype": "cpld", - "attr_offset": "0x33", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }, { - "attr_name": "xcvr_reset", - "attr_devaddr": "0x36", - "attr_devname": "MAC_BOARD_CPLD2_B", - "attr_devtype": "cpld", - "attr_offset": "0xb9", - "attr_mask": "0x07", - "attr_cmpval": "0x0", - "attr_len": "1" - }] - } - }, - - "FRONT_BOARD_BMC_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "DIAG_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb1" - } - ] - } - }, - - "FRONT_BOARD_CPU_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "SYS_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb2" - } - ] - } - }, - - "FRONT_BOARD_PSU_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "LOC_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb3" - } - ] - } - }, - - "FRONT_BOARD_FAN_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FAN_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "2:0", - "value": "0x2", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "2:0", - "value": "0x1", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "2:0", - "value": "0x4", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "2:0", - "value": "0x3", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "2:0", - "value": "0x6", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "2:0", - "value": "0x5", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "2:0", - "value": "0x0", - "swpld_addr": "0x33", - "swpld_addr_offset": "0xb4" - } - ] - } - }, - - "FAN1_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "0" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x23" - } - ] - } - }, - - "FAN2_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "1" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x24" - } - ] - } - }, - - "FAN3_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "2" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x25" - } - ] - } - }, - - "FAN4_LED": { - "dev_info": { - "device_type": "LED", - "device_name": "FANTRAY_LED" - }, - "dev_attr": { - "index": "3" - }, - "i2c": { - "attr_list": [{ - "attr_name": "STATUS_LED_COLOR_RED", - "descr": "Red", - "bits": "3:0", - "value": "0xa", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_RED_BLINK", - "descr": "Red Blinking", - "bits": "3:0", - "value": "0xe", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN", - "descr": "Green", - "bits": "3:0", - "value": "0x9", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_GREEN_BLINK", - "descr": "Green Blinking", - "bits": "3:0", - "value": "0xd", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER", - "descr": "Amber", - "bits": "3:0", - "value": "0x3", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_AMBER_BLINK", - "descr": "Amber Blinking", - "bits": "3:0", - "value": "0x7", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - }, - { - "attr_name": "STATUS_LED_COLOR_OFF", - "descr": "Off", - "bits": "3:0", - "value": "0xb", - "swpld_addr": "0x32", - "swpld_addr_offset": "0x26" - } - ] - } - } -} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json new file mode 100644 index 0000000000..6e9b40b805 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform.json @@ -0,0 +1,402 @@ +{ + "chassis": { + "name": "RA-B6510-48V8C", + "thermal_manager": false, + "status_led": { + "controllable": false, + "colors": ["green", "blinking_green", "amber", "blinking_amber"] + }, + "components": [ + { + "name": "CPU_CPLD" + }, + { + "name": "CONNECT_CPLD" + }, + { + "name": "CONNECT_CPLD-FAN" + }, + { + "name": "MAC_CPLD1" + }, + { + "name": "MAC_CPLD2" + }, + { + "name": "FPGA" + }, + { + "name": "BIOS" + } + ], + "fans": [ + { + "name": "Fantray1_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray1_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray2_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray2_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray3_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray3_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray4_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + }, + { + "name": "Fantray4_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false, + "colors": ["off", "red", "amber", "green"] + } + } + ], + "fan_drawers":[ + { + "name": "Fantray1", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray1_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray1_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Fantray2", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray2_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray2_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Fantray3", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray3_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray3_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Fantray4", + "num_fans" : 2, + "status_led": { + "controllable": false, + "colors": ["amber", "green", "off"] + }, + "fans": [ + { + "name": "FanTray4_1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + }, + { + "name": "FanTray4_2", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + } + ], + "psus": [ + { + "name": "Psu1", + "voltage": true, + "current": true, + "power": true, + "max_power": false, + "voltage_high_threshold": true, + "voltage_low_threshold": true, + "temperature": true, + "fans_target_speed": true, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU1_FAN1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + }, + { + "name": "Psu2", + "voltage": true, + "current": true, + "power": true, + "max_power": false, + "voltage_high_threshold": true, + "voltage_low_threshold": true, + "temperature": true, + "fans_target_speed": true, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "PSU2_FAN1", + "speed": { + "controllable": true, + "minimum": 50, + "maximum": 100 + }, + "status_led": { + "available": false + } + } + ] + } + ], + "thermals": [ + { + "name": "ASIC_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "CPU_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "INLET_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "OUTLET_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "MAC_OUT_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "MAC_IN_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "PSU1_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + }, + { + "name": "PSU2_TEMP", + "controllable": false, + "low-crit-threshold": true, + "high-crit-threshold": true, + "low-threshold": true, + "high-threshold": true, + "minimum-recorded": true, + "maximum-recorded": true + } + ], + "modules": [], + "sfps": [] + }, + "interfaces": {} +} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json new file mode 100644 index 0000000000..2e6f4b8d12 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_components.json @@ -0,0 +1,37 @@ +{ + "chassis": { + "RA-B6510-48V8C": { + "component": { + "CPU_CPLD": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/cpu_cpld_upgrade_header.vme", + "version": "27190516" + }, + "CONNECT_CPLD": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version": "49191230" + }, + "CONNECT_CPLD-FAN": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version": "49191230" + }, + "MAC_CPLD1": { + "firmware" : "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version" : "16190108" + }, + "MAC_CPLD2": { + "firmware" : "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/other_cpld_upgrade_header.vme", + "version" : "17200110" + }, + "FPGA": { + "firmware": "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/fpga_upgrade_header.bin", + "version": "7a150016" + }, + "BIOS": { + "firmware" : "/usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0/latest_firmware/bios_upgrade_header.bin", + "version" : "5.11(3BARB029)" + } + } + } + } +} + diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py deleted file mode 100755 index cf7215e0c9..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/eeprom.py +++ /dev/null @@ -1,25 +0,0 @@ -try: - import os - import sys - import json - sys.path.append('/usr/share/sonic/platform/plugins') - import pddfparse - #from sonic_eeprom import eeprom_base - from sonic_eeprom import eeprom_tlvinfo -except ImportError as 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): - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - # system EEPROM always has device name EEPROM1 - self.eeprom_path = pddf_obj.get_path("EEPROM1", "eeprom") - super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py deleted file mode 100755 index 58c38d1d73..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/fanutil.py +++ /dev/null @@ -1,187 +0,0 @@ -# Sample pddf_fanutil file -# All the supported FAN SysFS aattributes are -#- fan_present -#- fan_direction -#- fan_input -#- fan_pwm -#- fan_fault -# where idx is in the range [1-12] -# - - -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json - -try: - from sonic_fan.fan_base import FanBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class FanUtil(FanBase): - """PDDF generic FAN util class""" - - def __init__(self): - FanBase.__init__(self) - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - - self.num_fans = (self.platform['num_fantrays'] * self.platform['num_fans_pertray']) - - def get_num_fans(self): - return self.num_fans - - def get_presence(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return False - - attr_name = "fan" + str(idx) + "_present" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr_name) - if not output: - return False - - mode = output['mode'] - presence = output['status'].rstrip() - - vmap = plugin_data['FAN']['present'][mode]['valmap'] - - if presence in vmap: - status = vmap[presence] - else: - status = False - - return status - - def get_status(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return False - - speed = self.get_speed(idx) - status = True if (speed != 0) else False - return status - - def get_direction(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return None - - attr = "fan" + str(idx) + "_direction" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr) - if not output: - return None - - mode = output['mode'] - val = output['status'] - - val = val.rstrip() - vmap = plugin_data['FAN']['direction'][mode]['valmap'] - - if val in vmap: - direction = vmap[val] - else: - direction = val - - return direction - - def get_directions(self): - num_fan = self.get_num_fan() - - for i in range(1, num_fan+1): - attr = "fan" + str(i) + "_direction" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr) - if not output: - return None - - mode = output['mode'] - val = output['status'] - - val = val.rstrip() - vmap = plugin_data['FAN']['direction'][mode]['valmap'] - - direction = vmap[str(val)] - - print("FAN-%d direction is %s" % (i, direction)) - - return 0 - - def get_speed(self, idx): - # 1 based fan index - if idx < 1 or idx > self.num_fans: - print("Invalid fan index %d\n" % idx) - return 0 - - attr = "fan" + str(idx) + "_input" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr) - if not output: - return 0 - - #mode = output['mode'] - val = output['status'].rstrip() - - if val.isalpha(): - return 0 - else: - rpm_speed = int(float(val)) - - return rpm_speed - - def get_speeds(self): - num_fan = self.get_num_fan() - ret = "FAN_INDEX\t\tRPM\n" - - for i in range(1, num_fan+1): - attr1 = "fan" + str(i) + "_input" - output = pddf_obj.get_attr_name_output("FAN-CTRL", attr1) - if not output: - return "" - - #mode = output['mode'] - val = output['status'].rstrip() - - if val.isalpha(): - frpm = 0 - else: - frpm = int(val) - - ret += "FAN-%d\t\t\t%d\n" % (i, frpm) - - return ret - - def set_speed(self, val): - if val < 0 or val > 100: - print("Error: Invalid speed %d. Please provide a valid speed percentage" % val) - return False - - #num_fan = self.num_fans - if 'duty_cycle_to_pwm' not in plugin_data['FAN']: - print("Setting fan speed is not allowed !") - return False - else: - print("setspeed nothing to do") - return False - - #return True - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('fan') - - def get_change_event(self): - """ - TODO: This function need to be implemented - when decide to support monitoring FAN(fand) - on this platform. - """ - raise NotImplementedError diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py deleted file mode 100755 index 5f9e2e99db..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ledutil.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse - - -class LedUtil: - color_map = { - "STATUS_LED_COLOR_GREEN": "on", - "STATUS_LED_COLOR_RED": "faulty", - "STATUS_LED_COLOR_OFF": "off" - } - - def __init__(self): - global pddf_obj - pddf_obj = pddfparse.PddfParse() - self.path = "pddf/devices/led" - self.cur_state_path = "pddf/devices/led/cur_state" - - def set_status_led(self, led_device_name, color, color_state="SOLID"): - if (not led_device_name in list(pddf_obj.data.keys())): - status = "ERROR: " + led_device_name + " is not configured" - return (status) - - if (not color in list(self.color_map.keys())): - status = "ERROR: Invalid color" - return (status) - - index = pddf_obj.data[led_device_name]['dev_attr']['index'] - pddf_obj.create_attr('device_name', led_device_name, self.path) - pddf_obj.create_attr('index', index, self.path) - pddf_obj.create_attr( - 'color', self.color_map[color], self.cur_state_path) - pddf_obj.create_attr('color_state', color_state, self.cur_state_path) - pddf_obj.create_attr('dev_ops', 'set_status', self.path) - return ("Executed") - - def get_status_led(self, led_device_name): - if (not led_device_name in list(pddf_obj.data.keys())): - status = "ERROR: " + led_device_name + " is not configured" - return (status) - - index = pddf_obj.data[led_device_name]['dev_attr']['index'] - pddf_obj.create_attr('device_name', led_device_name, self.path) - pddf_obj.create_attr('index', index, self.path) - pddf_obj.create_attr('dev_ops', 'get_status', self.path) - color_f = "/sys/kernel/" + self.cur_state_path + "/color" - color_state_f = "/sys/kernel/" + self.cur_state_path + "/color_state" - - try: - with open(color_f, 'r') as f: - color = f.read().strip("\r\n") - with open(color_state_f, 'r') as f: - color_state = f.read().strip("\r\n") - except IOError: - status = "ERROR :" + color_f + " open failed" - return (status) - status = "%s-%s:\t%s %s\n" % (led_device_name, - index, color, color_state) - return (status) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py deleted file mode 100755 index dccb1ac1a1..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/psuutil.py +++ /dev/null @@ -1,270 +0,0 @@ -# -# Sample pddf_psuutil file -# -# All the supported PSU SysFS aattributes are -#- psu_present -#- psu_model_name -#- psu_power_good -#- psu_mfr_id -#- psu_serial_num -#- psu_fan_dir -#- psu_v_out -#- psu_i_out -#- psu_p_out -#- psu_fan1_speed_rpm -# - -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json - -try: - from sonic_psu.psu_base import PsuBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class PsuUtil(PsuBase): - """PDDF generic PSU util class""" - - def __init__(self): - PsuBase.__init__(self) - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - - def get_num_psus(self): - return int(self.platform['num_psus']) - - def get_psu_status(self, index): - if index is None: - return False - - device = "PSU" + "%d" % index - output = pddf_obj.get_attr_name_output(device, "psu_power_good") - if not output: - return False - - mode = output['mode'] - val = output['status'] - - val = val.rstrip() - vmap = plugin_data['PSU']['psu_power_good'][mode]['valmap'] - - if val in vmap: - return vmap[val] - else: - return False - - def get_psu_presence(self, index): - if index is None: - return False - - status = 0 - device = "PSU" + "%d" % index - output = pddf_obj.get_attr_name_output(device, "psu_present") - if not output: - return False - - mode = output['mode'] - status = output['status'] - - vmap = plugin_data['PSU']['psu_present'][mode]['valmap'] - - if status.rstrip('\n') in vmap: - return vmap[status.rstrip('\n')] - else: - return False - - def get_powergood_status(self, idx): - if idx is None: - return False - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return False - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_power_good") - if not output: - return False - - mode = output['mode'] - status = output['status'] - - vmap = plugin_data['PSU']['psu_power_good'][mode]['valmap'] - - if status.rstrip('\n') in vmap: - return vmap[status.rstrip('\n')] - else: - return False - - def get_model(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_model_name") - if not output: - return None - - model = output['status'] - - # strip_non_ascii - stripped = (c for c in model if 0 < ord(c) < 127) - model = ''.join(stripped) - - return model.rstrip('\n') - - def get_mfr_id(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_mfr_id") - if not output: - return None - - mfr = output['status'] - - return mfr.rstrip('\n') - - def get_serial(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_serial_num") - if not output: - return None - - serial = output['status'] - - return serial.rstrip('\n') - - def get_direction(self, idx): - if idx is None: - return None - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return None - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_fan_dir") - if not output: - return None - - mode = output['mode'] - direction = output['status'].rstrip('\n') - - vmap = plugin_data['PSU']['psu_fan_dir'][mode]['valmap'] - if direction in vmap: - airflow_dir_real = vmap[direction] - else: - airflow_dir_real = direction - - return airflow_dir_real - - def get_output_voltage(self, idx): - if idx is None: - return 0.0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0.0 - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_v_out") - if not output: - return 0.0 - - v_out = output['status'] - - # value returned by the psu driver is in mV - return float(v_out)/1000 - - def get_output_current(self, idx): - if idx is None: - return 0.0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0.0 - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_i_out") - if not output: - return 0.0 - - i_out = output['status'] - - # current in mA - return float(i_out)/1000 - - def get_output_power(self, idx): - if idx is None: - return 0.0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0.0 - - device = "PSU"+"%d" % (idx) - output = pddf_obj.get_attr_name_output(device, "psu_p_out") - if not output: - return 0.0 - - p_out = output['status'] - - # power is returned in micro watts - return float(p_out)/1000000 - - def get_fan_rpm(self, idx, fan_idx): - if idx is None or fan_idx is None: - return 0 - - if idx < 1 or idx > self.platform['num_psus']: - print("Invalid index %d\n" % idx) - return 0 - - device = "PSU"+"%d" % (idx) - num_fans = pddf_obj.get_num_psu_fans(device) - - if fan_idx < 1 or fan_idx > num_fans: - print("Invalid PSU-fan index %d\n" % fan_idx) - return 0 - - output = pddf_obj.get_attr_name_output(device, "psu_fan"+str(fan_idx)+"_speed_rpm") - if not output: - return 0 - - #mode = output['mode'] - output['status'] = output['status'].rstrip() - if output['status'].isalpha(): - return 0 - else: - speed = int(output['status']) - - return speed - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('psu') diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py old mode 100755 new mode 100644 index 1ca9256108..3e195a36f6 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sfputil.py @@ -1,236 +1,243 @@ -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import time - from ctypes import create_string_buffer + import os + import traceback from sonic_sfp.sfputilbase import SfpUtilBase except ImportError as e: - raise ImportError(str(e) + "- required module not found") - + raise ImportError("%s - required module not found" % str(e)) class SfpUtil(SfpUtilBase): - """Platform generic PDDF SfpUtil class""" + """Platform-specific SfpUtil class""" + + PORT_START = 1 + PORT_END = 56 + PORTS_IN_BLOCK = 57 + + EEPROM_OFFSET = 32 + SFP_DEVICE_TYPE = "optoe2" + QSFP_DEVICE_TYPE = "optoe1" + I2C_MAX_ATTEMPT = 3 _port_to_eeprom_mapping = {} - _port_start = 0 - _port_end = 0 - _port_to_type_mapping = {} - _qsfp_ports = [] - _sfp_ports = [] - - def __init__(self): - SfpUtilBase.__init__(self) - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - self._port_start = 0 - self._port_end = self.get_num_ports() - - for port_num in range(self._port_start, self._port_end): - device = "PORT" + "%d" % (port_num+1) - port_eeprom_path = pddf_obj.get_path(device, "eeprom") - self._port_to_eeprom_mapping[port_num] = port_eeprom_path - port_type = pddf_obj.get_device_type(device) - self._port_to_type_mapping[port_num] = port_type - self.populate_port_type(port_num) - - def get_num_ports(self): - return int(self.platform['num_ports']) - - def is_valid_port(self, port_num): - if port_num < self._port_start or port_num > self._port_end: - return False - else: - return True - - def get_presence(self, port_num): - if port_num < self._port_start or port_num > self._port_end: - return False - - device = "PORT" + "%d" % (port_num+1) - output = pddf_obj.get_attr_name_output(device, 'xcvr_present') - if not output: - return False - - #mode = output['mode'] - modpres = output['status'].rstrip() - if 'XCVR' in plugin_data: - if 'xcvr_present' in plugin_data['XCVR']: - ptype = self._port_to_type_mapping[port_num] - vtype = 'valmap-'+ptype - if vtype in plugin_data['XCVR']['xcvr_present']: - vmap = plugin_data['XCVR']['xcvr_present'][vtype] - if modpres in vmap: - return vmap[modpres] - else: - return False - # if plugin_data doesn't specify anything regarding Transceivers - if modpres == '1': - return True - - return False - - def populate_port_type(self, port): - if self._port_to_type_mapping[port] == 'QSFP' or self._port_to_type_mapping[port] == 'QSFP28': - self._qsfp_ports.append(port) - elif self._port_to_type_mapping[port] == 'SFP' or self._port_to_type_mapping[port] == 'SFP28': - self._sfp_ports.append(port) + port_to_i2cbus_mapping ={} @property def port_start(self): - return self._port_start + return self.PORT_START @property def port_end(self): - return (self._port_end - 1) + return self.PORT_END + + @property + def qsfp_ports(self): + return range(49, self.PORTS_IN_BLOCK) @property def port_to_eeprom_mapping(self): return self._port_to_eeprom_mapping - @property - def qsfp_ports(self): - return self._qsfp_ports + def __init__(self): + for x in range(self.PORT_START, self.PORTS_IN_BLOCK): + self.port_to_i2cbus_mapping[x] = x + self.EEPROM_OFFSET - 1 + SfpUtilBase.__init__(self) - def reset(self, port_num): - if port_num < self._port_start or port_num > self._port_end: - return False + def _sfp_read_file_path(self, file_path, offset, num_bytes): + attempts = 0 + while attempts < self.I2C_MAX_ATTEMPT: + try: + file_path.seek(offset) + read_buf = file_path.read(num_bytes) + except Exception: + attempts += 1 + time.sleep(0.05) + return True, read_buf + return False, None - device = "PORT" + "%d" % (port_num+1) - port_ps = pddf_obj.get_path(device, "xcvr_reset") - if port_ps is None: + def _sfp_eeprom_present(self, sysfs_sfp_i2c_client_eeprompath, offset): + """Tries to read the eeprom file to determine if the + device/sfp is present or not. If sfp present, the read returns + valid bytes. If not, read returns error 'Connection timed out""" + + if not os.path.exists(sysfs_sfp_i2c_client_eeprompath): return False + with open(sysfs_sfp_i2c_client_eeprompath, "rb", buffering=0) as sysfsfile: + rv, buf = self._sfp_read_file_path(sysfsfile, offset, 1) + return rv + + def _add_new_sfp_device(self, sysfs_sfp_i2c_adapter_path, devaddr, devtype): + try: + sysfs_nd_path = "%s/new_device" % sysfs_sfp_i2c_adapter_path + + # Write device address to new_device file + nd_str = "%s %s" % (devtype, hex(devaddr)) + with open(sysfs_nd_path, "w") as nd_file: + nd_file.write(nd_str) + + except Exception as err: + print("Error writing to new device file: %s" % str(err)) + return 1 + else: + return 0 + + def _get_port_eeprom_path(self, port_num, devid): + sysfs_i2c_adapter_base_path = "" + + if port_num in self.port_to_eeprom_mapping: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[port_num] + else: + sysfs_i2c_adapter_base_path = "/sys/class/i2c-adapter" + + i2c_adapter_id = self._get_port_i2c_adapter_id(port_num) + if i2c_adapter_id is None: + print("Error getting i2c bus num") + return None + + # Get i2c virtual bus path for the sfp + sysfs_sfp_i2c_adapter_path = "%s/i2c-%s" % (sysfs_i2c_adapter_base_path, + str(i2c_adapter_id)) + + # If i2c bus for port does not exist + if not os.path.exists(sysfs_sfp_i2c_adapter_path): + print("Could not find i2c bus %s. Driver not loaded?" % sysfs_sfp_i2c_adapter_path) + return None + + sysfs_sfp_i2c_client_path = "%s/%s-00%s" % (sysfs_sfp_i2c_adapter_path, + str(i2c_adapter_id), + hex(devid)[-2:]) + + # If sfp device is not present on bus, Add it + if not os.path.exists(sysfs_sfp_i2c_client_path): + if port_num in self.qsfp_ports: + ret = self._add_new_sfp_device( + sysfs_sfp_i2c_adapter_path, devid, self.QSFP_DEVICE_TYPE) + else: + ret = self._add_new_sfp_device( + sysfs_sfp_i2c_adapter_path, devid, self.SFP_DEVICE_TYPE) + if ret != 0: + print("Error adding sfp device") + return None + + sysfs_sfp_i2c_client_eeprom_path = "%s/eeprom" % sysfs_sfp_i2c_client_path + + return sysfs_sfp_i2c_client_eeprom_path + + def _read_eeprom_specific_bytes(self, sysfsfile_eeprom, offset, num_bytes): + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + rv, raw = self._sfp_read_file_path(sysfsfile_eeprom, offset, num_bytes) + if rv is False: + return None try: - reg_file = open(port_ps, 'w') - except IOError as e: - print("Error: unable to open file: %s" % str(e)) + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + except Exception: + return None + + return eeprom_raw + + def get_eeprom_dom_raw(self, port_num): + if port_num in self.qsfp_ports: + # QSFP DOM EEPROM is also at addr 0x50 and thus also stored in eeprom_ifraw + return None + # Read dom eeprom at addr 0x51 + return self._read_eeprom_devid(port_num, self.IDENTITY_EEPROM_ADDR, 256) + + 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 + presence_path = "/sys/wb_plat/sff/sff%d/present" % port_num + try: - reg_file.seek(0) - reg_file.write('1') - time.sleep(1) - reg_file.seek(0) - reg_file.write('0') - reg_file.close() + with open(presence_path, "rb") as data: + presence_data = data.read(2) + if presence_data == "": + return False + result = int(presence_data, 16) + except IOError: + return False + + if result == 1: return True - except IOError as e: - return False + return False def get_low_power_mode(self, port_num): # Check for invalid port_num - if port_num < self._port_start or port_num > self._port_end: - return False - if not self.get_presence(port_num): - return False - - device = "PORT" + "%d" % (port_num+1) - output = pddf_obj.get_attr_name_output(device, 'xcvr_lpmode') - if not output: - if port_num not in self.qsfp_ports: - return False # Read from eeprom only for QSFP ports - try: - eeprom = None - eeprom = open(self.port_to_eeprom_mapping[port_num], "rb") - # check for valid connector type - eeprom.seek(2) - ctype = eeprom.read(1) - if ctype in ['21', '23']: - return False - - eeprom.seek(93) - lpmode = ord(eeprom.read(1)) - - if ((lpmode & 0x3) == 0x3): - return True # Low Power Mode if "Power override" bit is 1 and "Power set" bit is 1 - else: - # High Power Mode if one of the following conditions is matched: - # 1. "Power override" bit is 0 - # 2. "Power override" bit is 1 and "Power set" bit is 0 - return False - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom is not None: - eeprom.close() - time.sleep(0.01) - else: - #mode = output['mode'] - status = int(output['status'].rstrip()) - - if status == 1: - return True - else: - return False + return True def set_low_power_mode(self, port_num, lpmode): # Check for invalid port_num - if port_num < self._port_start or port_num > self._port_end: + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: return False - if not self.get_presence(port_num): - return False # Port is not present, unable to set the eeprom + return True - device = "PORT" + "%d" % (port_num+1) - port_ps = pddf_obj.get_path(device, "xcvr_lpmode") - if port_ps is None: - if port_num not in self.qsfp_ports: - return False # Write to eeprom only for QSFP ports + def get_transceiver_change_event(self, timeout=0): + return False, {} + + def get_highest_temperature(self): + offset = 0 + hightest_temperature = -9999 + + presence_flag = False + read_eeprom_flag = False + temperature_valid_flag = False + + for port in range(49, self.PORTS_IN_BLOCK): + if self.get_presence(port) is False: + continue + + presence_flag = True + + if port in self.qsfp_ports: + offset = 22 + else: + offset = 96 + + eeprom_path = self._get_port_eeprom_path(port, 0x50) try: - eeprom = None - eeprom = open(self.port_to_eeprom_mapping[port_num], "r+b") - # check for valid connector type - eeprom.seek(2) - ctype = eeprom.read(1) - if ctype in ['21', '23']: - return False + with open(eeprom_path, mode="rb", buffering=0) as eeprom: + read_eeprom_flag = True + eeprom_raw = self._read_eeprom_specific_bytes(eeprom, offset, 2) + msb = int(eeprom_raw[0], 16) + lsb = int(eeprom_raw[1], 16) - # Fill in write buffer - regval = 0x3 if lpmode else 0x1 # 0x3:Low Power Mode, 0x1:High Power Mode - buffer = create_string_buffer(1) - buffer[0] = chr(regval) + result = (msb << 8) | (lsb & 0xff) + result = float(result / 256.0) + if -50 <= result <= 200: + temperature_valid_flag = True + hightest_temperature = max(hightest_temperature, result) + except Exception: + print(traceback.format_exc()) - # Write to eeprom - eeprom.seek(93) - eeprom.write(buffer[0]) - return True - except IOError as e: - print("Error: unable to open file: %s" % str(e)) - return False - finally: - if eeprom is not None: - eeprom.close() - time.sleep(0.01) - else: - try: - f = open(port_ps, 'w') - if lpmode: - f.write('1') - else: - f.write('0') - f.close() - return True - except IOError as e: - return False + # all port not presence + if presence_flag is False: + hightest_temperature = -10000 - def get_transceiver_change_event(self): - """ - TODO: This function need to be implemented - when decide to support monitoring SFP(Xcvrd) - on this platform. - """ - raise NotImplementedError + # all port read eeprom fail + elif read_eeprom_flag is False: + hightest_temperature = -9999 - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('xcvr') + # all port temperature invalid + elif read_eeprom_flag is True and temperature_valid_flag is False: + hightest_temperature = -10000 + + hightest_temperature = round(hightest_temperature, 2) + + return hightest_temperature diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py new file mode 100755 index 0000000000..89d3ccd770 --- /dev/null +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/ssd_util.py @@ -0,0 +1,311 @@ +# +# ssd_util.py +# +# Generic implementation of the SSD health API +# SSD models supported: +# - InnoDisk +# - StorFly +# - Virtium + +try: + import re + import os + import subprocess + from sonic_platform_base.sonic_ssd.ssd_base import SsdBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +SMARTCTL = "smartctl {} -a" +INNODISK = "iSmart -d {}" +VIRTIUM = "SmartCmd -m {}" +DISK_LIST_CMD = "fdisk -l -o Device" +DISK_FREE_CMD = "df -h" +MOUNT_CMD = "mount" + +NOT_AVAILABLE = "N/A" +PE_CYCLE = 3000 +FAIL_PERCENT = 95 + +# Set Vendor Specific IDs +INNODISK_HEALTH_ID = 169 +INNODISK_TEMPERATURE_ID = 194 + +class SsdUtil(SsdBase): + """ + Generic implementation of the SSD health API + """ + model = NOT_AVAILABLE + serial = NOT_AVAILABLE + firmware = NOT_AVAILABLE + temperature = NOT_AVAILABLE + health = NOT_AVAILABLE + remaining_life = NOT_AVAILABLE + sata_rate = NOT_AVAILABLE + ssd_info = NOT_AVAILABLE + vendor_ssd_info = NOT_AVAILABLE + + def __init__(self, diskdev): + self.vendor_ssd_utility = { + "Generic" : { "utility" : SMARTCTL, "parser" : self.parse_generic_ssd_info }, + "InnoDisk" : { "utility" : INNODISK, "parser" : self.parse_innodisk_info }, + "M.2" : { "utility" : INNODISK, "parser" : self.parse_innodisk_info }, + "StorFly" : { "utility" : VIRTIUM, "parser" : self.parse_virtium_info }, + "Virtium" : { "utility" : VIRTIUM, "parser" : self.parse_virtium_info } + } + + """ + The dict model_attr keys relate the vendors + LITEON : "ER2-GD","AF2MA31DTDLT" + Intel : "SSDSCKKB" + SMI : "SM619GXC" + samsung: "MZNLH" + ADATA : "IM2S3134N" + """ + self.model_attr = { + "ER2-GD" : { "temperature" : "\n190\s+(.+?)\n", "remainingLife" : "\n202\s+(.+?)\n" }, + "AF2MA31DTDLT" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n202\s+(.+?)\n" }, + "SSDSCK" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n233\s+(.+?)\n" }, + "SM619GXC" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n169\s+(.+?)\n" }, + "MZNLH" : { "temperature" : "\n190\s+(.+?)\n", "remainingLife" : "\n245\s+(.+?)\n" }, + "IM2S3134N" : { "temperature" : "\n194\s+(.+?)\n", "remainingLife" : "\n231\s+(.+?)\n" } + } + + self.key_list = list(self.model_attr.keys()) + self.attr_info_rule = "[\s\S]*SMART Attributes Data Structure revision number: 1|SMART Error Log Version[\s\S]*" + self.dev = diskdev + # Generic part + self.fetch_generic_ssd_info(diskdev) + self.parse_generic_ssd_info() + self.fetch_vendor_ssd_info(diskdev, "Generic") + + # Known vendor part + if self.model: + model_short = self.model.split()[0] + if model_short in self.vendor_ssd_utility: + self.fetch_vendor_ssd_info(diskdev, model_short) + self.parse_vendor_ssd_info(model_short) + else: + # No handler registered for this disk model + pass + else: + # Failed to get disk model + self.model = "Unknown" + + def _execute_shell(self, cmd): + process = subprocess.Popen(cmd.split(), universal_newlines=True, stdout=subprocess.PIPE) + output, error = process.communicate() + exit_code = process.returncode + if exit_code: + return None + return output + + def _parse_re(self, pattern, buffer): + res_list = re.findall(pattern, str(buffer)) + return res_list[0] if res_list else NOT_AVAILABLE + + def fetch_generic_ssd_info(self, diskdev): + self.ssd_info = self._execute_shell(self.vendor_ssd_utility["Generic"]["utility"].format(diskdev)) + + # Health and temperature values may be overwritten with vendor specific data + def parse_generic_ssd_info(self): + if "nvme" in self.dev: + self.model = self._parse_re('Model Number:\s*(.+?)\n', self.ssd_info) + + health_raw = self._parse_re('Percentage Used\s*(.+?)\n', self.ssd_info) + if health_raw == NOT_AVAILABLE: + self.health = NOT_AVAILABLE + else: + health_raw = health_raw.split()[-1] + self.health = 100 - float(health_raw.strip('%')) + + temp_raw = self._parse_re('Temperature\s*(.+?)\n', self.ssd_info) + if temp_raw == NOT_AVAILABLE: + self.temperature = NOT_AVAILABLE + else: + temp_raw = temp_raw.split()[-2] + self.temperature = float(temp_raw) + else: + self.model = self._parse_re('Device Model:\s*(.+?)\n', self.ssd_info) + model_key = "" + for key in self.key_list: + if re.search(key, self.model): + model_key = key + break + if model_key != "": + self.remaining_life = self._parse_re(self.model_attr[model_key]["remainingLife"], re.sub(self.attr_info_rule,"",self.ssd_info)).split()[2] + self.temperature = self._parse_re(self.model_attr[model_key]["temperature"], re.sub(self.attr_info_rule,"",self.ssd_info)).split()[8] + self.health = self.remaining_life + # Get the LITEON ssd health value by (PE CYCLE - AVG ERASE CYCLE )/(PE CYCLE) + if model_key in ["ER2-GD", "AF2MA31DTDLT"]: + avg_erase = int(self._parse_re('\n173\s+(.+?)\n' ,re.sub(self.attr_info_rule,"",self.ssd_info)).split()[-1]) + self.health = int(round((PE_CYCLE - avg_erase)/PE_CYCLE*100,0)) + if self.remaining_life != NOT_AVAILABLE and int(self.remaining_life) < FAIL_PERCENT: + self.remaining_life = "Fail" + self.sata_rate = self._parse_re('SATA Version is:.*current: (.+?)\)\n', self.ssd_info) + self.serial = self._parse_re('Serial Number:\s*(.+?)\n', self.ssd_info) + self.firmware = self._parse_re('Firmware Version:\s*(.+?)\n', self.ssd_info) + + def parse_innodisk_info(self): + if self.vendor_ssd_info: + self.health = self._parse_re('Health:\s*(.+?)%', self.vendor_ssd_info) + self.temperature = self._parse_re('Temperature\s*\[\s*(.+?)\]', self.vendor_ssd_info) + else: + if self.health == NOT_AVAILABLE: + health_raw = self.parse_id_number(INNODISK_HEALTH_ID) + self.health = health_raw.split()[-1] + if self.temperature == NOT_AVAILABLE: + temp_raw = self.parse_id_number(INNODISK_TEMPERATURE_ID) + self.temperature = temp_raw.split()[-6] + + def parse_virtium_info(self): + if self.vendor_ssd_info: + self.temperature = self._parse_re('Temperature_Celsius\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info) + nand_endurance = self._parse_re('NAND_Endurance\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info) + avg_erase_count = self._parse_re('Average_Erase_Count\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info) + try: + self.health = 100 - (float(avg_erase_count) * 100 / float(nand_endurance)) + except (ValueError, ZeroDivisionError): + # Invalid avg_erase_count or nand_endurance. + pass + + def fetch_vendor_ssd_info(self, diskdev, model): + self.vendor_ssd_info = self._execute_shell(self.vendor_ssd_utility[model]["utility"].format(diskdev)) + + def parse_vendor_ssd_info(self, model): + self.vendor_ssd_utility[model]["parser"]() + + def check_readonly2(self, partition, filesystem): + # parse mount cmd output info + mount_info = self._execute_shell(MOUNT_CMD) + for line in mount_info.split('\n'): + column_list = line.split() + if line == '': + continue + if column_list[0] == partition and column_list[2] == filesystem: + if column_list[5].split(',')[0][1:] == "ro": + return partition + else: + return NOT_AVAILABLE + return NOT_AVAILABLE + + def check_readonly(self, partition, filesystem): + ret = os.access(filesystem, os.W_OK) + if ret == False: + return partition + else: + return NOT_AVAILABLE + + def get_health(self): + """ + Retrieves current disk health in percentages + + Returns: + A float number of current ssd health + e.g. 83.5 + """ + return float(self.health) + + def get_temperature(self): + """ + Retrieves current disk temperature in Celsius + + Returns: + A float number of current temperature in Celsius + e.g. 40.1 + """ + return float(self.temperature) + + def get_model(self): + """ + Retrieves model for the given disk device + + Returns: + A string holding disk model as provided by the manufacturer + """ + return self.model + + def get_firmware(self): + """ + Retrieves firmware version for the given disk device + + Returns: + A string holding disk firmware version as provided by the manufacturer + """ + return self.firmware + + def get_serial(self): + """ + Retrieves serial number for the given disk device + + Returns: + A string holding disk serial number as provided by the manufacturer + """ + return self.serial + def get_sata_rate(self): + """ + Retrieves SATA rate for the given disk device + Returns: + A string holding current SATA rate as provided by the manufacturer + """ + return self.sata_rate + def get_remaining_life(self): + """ + Retrieves remaining life for the given disk device + Returns: + A string holding disk remaining life as provided by the manufacturer + """ + return self.remaining_life + def get_vendor_output(self): + """ + Retrieves vendor specific data for the given disk device + + Returns: + A string holding some vendor specific disk information + """ + return self.vendor_ssd_info + + def parse_id_number(self, id): + return self._parse_re('{}\s*(.+?)\n'.format(id), self.ssd_info) + + def get_readonly_partition(self): + """ + Check the partition mount filesystem is readonly status,then output the result. + Returns: + The readonly partition list + """ + + ro_partition_list = [] + partition_list = [] + + # parse fdisk cmd output info + disk_info = self._execute_shell(DISK_LIST_CMD) + begin_flag = False + for line in disk_info.split('\n'): + if line == "Device": + begin_flag = True + continue + if begin_flag: + if line != "": + partition_list.append(line) + else: + break + + # parse df cmd output info + disk_free = self._execute_shell(DISK_FREE_CMD) + disk_dict = {} + line_num = 0 + for line in disk_free.split('\n'): + line_num = line_num + 1 + if line_num == 1 or line == "": + continue + column_list = line.split() + disk_dict[column_list[0]] = column_list[5] + + # get partition which is readonly + for partition in partition_list: + if partition in disk_dict: + ret = self.check_readonly(partition, disk_dict[partition]) + if (ret != NOT_AVAILABLE): + ro_partition_list.append(ret) + + return ro_partition_list diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py deleted file mode 100755 index af4dd59153..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/sysstatutil.py +++ /dev/null @@ -1,82 +0,0 @@ -import os.path -import sys -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse -import json - - -class SYSStatusUtil(): - """Platform-specific SYSStatus class""" - - def __init__(self): - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - - def get_board_info(self): - device = "SYSSTATUS" - node = pddf_obj.get_path(device, "board_info") - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("board_info : %s" % status) - except IOError: - return False - - def get_cpld_versio(self): - device = "SYSSTATUS" - node = pddf_obj.get_path(device, "cpld1_version") - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("cpld1_version : %s" % status) - except IOError: - return False - - def get_power_module_status(self): - device = "SYSSTATUS" - node = pddf_obj.get_path(device, "power_module_status") - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("power_module_status : %s" % status) - except IOError: - return False - - def get_system_reset_status(self): - device = "SYSSTATUS" - for i in range(1, 8): - node = pddf_obj.get_path(device, "system_reset"+str(i)) - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("system_reset%s : %s" % (i, status)) - except IOError: - print("system_reset%s not supported" % i) - - def get_misc_status(self): - device = "SYSSTATUS" - for i in range(1, 3): - node = pddf_obj.get_path(device, "misc"+str(i)) - if node is None: - return False - try: - with open(node, 'r') as f: - status = f.read() - print("misc%s : %s" % (i, status)) - except IOError: - print("system_reset%s not supported" % i) - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('sys-status') diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py deleted file mode 100755 index 6aef47b7e9..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/plugins/thermalutil.py +++ /dev/null @@ -1,75 +0,0 @@ -import os.path -import sys -import json -sys.path.append('/usr/share/sonic/platform/plugins') -import pddfparse - - -class ThermalUtil: - def __init__(self): - global pddf_obj - global plugin_data - with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: - plugin_data = json.load(pd) - - pddf_obj = pddfparse.PddfParse() - self.platform = pddf_obj.get_platform() - self.num_thermals = self.platform['num_temps'] - self.info = [] - - def get_num_thermals(self): - return (self.num_thermals) - - def get_thermal_info(self): - list = [] - pddf_obj.get_device_list(list, "TEMP_SENSOR") - list.sort() - for dev in list: - data = {} - device_name = dev['dev_info']['device_name'] - topo_info = dev['i2c']['topo_info'] - label = "%s-i2c-%d-%x" % (topo_info['dev_type'], - int(topo_info['parent_bus'], 0), int(topo_info['dev_addr'], 0)) - attr_list = dev['i2c']['attr_list'] - data['device_name'] = device_name - data['label'] = label - for attr in attr_list: - attr_name = attr['attr_name'] - node = pddf_obj.get_path(device_name, attr_name) - if node is None: - return False - try: - with open(node, 'r') as f: - attr_value = int(f.read()) - except IOError: - return False - data[attr_name] = attr_value/float(1000) - self.info.append(data) - - def show_thermal_temp_values(self, idx): - if idx < 1 or idx > self.num_thermals: - print("Invalid temperature sensor idx %d" % idx) - return None - self.get_thermal_info() - thermal_name = "TEMP"+"%d" % idx - label = "" - value = "" - for temp in self.info: - if thermal_name == temp['device_name']: - label = temp['label'] - value = "temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % ( - temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst']) - else: - continue - - return (label, value) - - def show_temp_values(self): - self.get_thermal_info() - for temp in self.info: - print(temp['label']) - print("temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % - (temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst'])) - - def dump_sysfs(self): - return pddf_obj.cli_dump_dsysfs('temp-sensors') diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json index 50c21289d2..94592fa8ce 100644 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json +++ b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pmon_daemon_control.json @@ -1,3 +1,3 @@ -{ - "skip_ledd": true -} +{ + "skip_ledd": true +} diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf deleted file mode 100755 index 9b0569d154..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sensors.conf +++ /dev/null @@ -1,21 +0,0 @@ -# libsensors configuration file -# ---------------------------------------------- -# - -bus "i2c-2" "i2c-0-mux (chan_id 0)" - -chip "lm75-i2c-2-48" - label temp1 "LM75_0 air_inlet" - set temp1_max 80 - set temp1_max_hyst 75 - -chip "lm75-i2c-2-49" - label temp1 "LM75_1 air_outlet" - set temp1_max 80 - set temp1_max_hyst 75 - -chip "lm75-i2c-2-4a" - label temp1 "LM75_2 hottest" - set temp1_max 80 - set temp1_max_hyst 75 - diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json deleted file mode 100644 index c5ea46918f..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/chassis.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "eeprom": {"bus": 2, "loc": "0057"} -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json deleted file mode 100644 index 35f4b45864..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/component.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "components": [ - { - "name": "CPLD1 (MAC Board A)", - "firmware_version": { - "bus": 2, - "addr": 51, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 0 - }, - { - "name": "CPLD2 (MAC Board B)", - "firmware_version": { - "bus": 2, - "addr": 53, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 0 - }, - { - "name": "CPLD3 (CONNECT Board A)", - "firmware_version": { - "bus": 2, - "addr": 55, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 0 - }, - { - "name": "CPLD4 (CPU Board)", - "firmware_version": { - "bus": 0, - "addr": 13, - "offset": 0, - "size": 4, - "way": 1, - "format": 7, - "sep": "/" - }, - "desc": "Used for managing IO modules, SFP+ modules and system LEDs", - "slot": 1 - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json deleted file mode 100644 index de7030ec1f..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/fan.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "fans": [ - { - "name": "fan1", - "e2loc": {"bus": 3, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 0 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 0 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/3-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/3-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan0_led", - "format": 6, - "mask": 11 - }, - "led_colors": { - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan1_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - }, - { - "name": "fan2", - "e2loc": {"bus": 4, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 1 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 1 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/4-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/4-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan1_led", - "format": 6, - "mask": 11 - }, - "led_colors": { - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan2_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - }, - { - "name": "fan3", - "e2loc": {"bus": 3, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 2 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 2 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/5-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/5-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan2_led", - "format": 6, - "mask": 11 - }, - "led_colors": { - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan3_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - }, - { - "name": "fan4", - "e2loc": {"bus": 3, "addr": 83, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": 2, - "bit": 3 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": 2, - "bit": 3 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/6-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/6-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan3_led", - "format": 6, - "mask": 11 - }, - "led_colors":{ - "green": 9, - "red": 10, - "amber": 3 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan4_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": 23000 - } - ] - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json deleted file mode 100644 index c807b51fc4..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/psu.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "psus": [ - { - "name": "psu1", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 0 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 1 - }, - "sn": {"loc": "/sys/bus/i2c/devices/7-0050/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr1_input", - "format": 4 - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in1_input", - "format": 4 - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in2_input", - "format": 4 - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr2_input", - "format": 4 - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/temp1_input", - "format": 4 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/7-0050/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/7-0050/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_fault" - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 1 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_input" - }, - "speed_max": 28000 - } - ] - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power1_input", - "format": 5 - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power2_input", - "format": 5 - } - }, - { - "name": "psu2", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 4 - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 5 - }, - "sn": {"loc": "/sys/bus/i2c/devices/8-0053/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr1_input", - "format": 4 - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in1_input", - "format": 4 - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in2_input", - "format": 4 - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr2_input", - "format": 4 - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/temp1_input", - "format": 4 - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/8-0053/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/8-0053/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_fault" - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": 2, - "bit": 5 - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_input" - }, - "speed_max": 28000 - } - ] - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power1_input", - "format": 5 - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power2_input", - "format": 5 - } - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json deleted file mode 100644 index 3193366735..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/sonic_platform_config/thermal.json +++ /dev/null @@ -1,130 +0,0 @@ -{"thermals": [ - { - "name": "INLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": null, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_input", - "format": 4 - } - }, - { - "name": "OUTLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": null, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_input", - "format": 4 - } - }, - { - "name": "BOARD TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": null, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_input", - "format": 4 - } - }, - { - "name": "PHYSICAL ID 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp1_input", - "format": 4 - } - }, - { - "name": "CPU CORE 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp2_input", - "format": 4 - } - }, - { - "name": "CPU CORE 1", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp3_input", - "format": 4 - } - }, - { - "name": "CPU CORE 2", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp4_input", - "format": 4 - } - }, - { - "name": "CPU CORE 3", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_max", - "format": 4 - }, - "low": null, - "crit_low": null, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_crit", - "format": 4 - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp5_input", - "format": 4 - } - } - ] -} \ No newline at end of file diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf_support b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/system_health_monitoring_config.json old mode 100644 new mode 100755 similarity index 100% rename from device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/pddf_support rename to device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/system_health_monitoring_config.json diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py b/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py deleted file mode 100644 index 38e9ff6aa0..0000000000 --- a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/systest.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: UTF-8 -*- -""" -* onboard temperature sensors -* FAN trays -* PSU -""" -import time -import datetime -from monitor import status - -def doWork(): - a=[]; - ''' - return: [{'status': '1', 'hw_version': '1.00', 'errcode': 0, 'fan_type': 'M6510-FAN-F', 'errmsg': 'OK', 'Speed': '9778', 'id': 'fan1', 'present': '0', 'sn': '1000000000014'}, - {'id': 'fan2', 'errmsg': 'not present', 'errcode': -1}, - {'id': 'fan3', 'errmsg': 'not present', 'errcode': -1}, - {'id': 'fan4', 'errmsg': 'not present', 'errcode': -1} - ] - description: 1.get id - 2.errcode equal 0 : dev normal - not equal 0 : get errmsg - 3.other message add when all check success - ''' - status.checkFan(a) - #status.getTemp(a) - #status.getPsu(a) - - nowTime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') - print(nowTime) - print(a) -def run(interval): - while True: - try: - time_remaining = interval - time.time()%interval - time.sleep(time_remaining) - doWork() - except Exception as e: - print(e) - -if __name__ == '__main__': - interval = 1 - run(interval) diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 82c96104a0..d4289fd4e2 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -78,9 +78,6 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELTA_AGC032_PLATFORM_MODULE) \ $(RUIJIE_B6510_48VS8CQ_PLATFORM_MODULE) \ $(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE) \ - $(RAGILE_RA_B6910_64C_PLATFORM_MODULE) \ - $(RAGILE_RA_B6510_32C_PLATFORM_MODULE) \ - $(RAGILE_RA_B6920_4S_PLATFORM_MODULE) \ $(NOKIA_IXR7250_PLATFORM_MODULE) \ $(TENCENT_TCS8400_PLATFORM_MODULE) \ $(TENCENT_TCS9400_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-ragile.mk b/platform/broadcom/platform-modules-ragile.mk index 12236b1e72..b0cc3b91b2 100644 --- a/platform/broadcom/platform-modules-ragile.mk +++ b/platform/broadcom/platform-modules-ragile.mk @@ -10,25 +10,25 @@ SONIC_DPKG_DEBS += $(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE) SONIC_STRETCH_DEBS += $(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE) ## RA-B6910-64C -RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION = 1.0 -export RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION +## RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION = 1.0 +## export RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION -RAGILE_RA_B6910_64C_PLATFORM_MODULE = platform-modules-ragile-ra-b6910-64c_$(RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION)_amd64.deb -$(RAGILE_RA_B6910_64C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6910-64c-r0 -$(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6910_64C_PLATFORM_MODULE))) +## RAGILE_RA_B6910_64C_PLATFORM_MODULE = platform-modules-ragile-ra-b6910-64c_$(RAGILE_RA_B6910_64C_PLATFORM_MODULE_VERSION)_amd64.deb +## $(RAGILE_RA_B6910_64C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6910-64c-r0 +## $(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6910_64C_PLATFORM_MODULE))) ## RA-B6510-32C -RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION = 1.0 -export RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION +## RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION = 1.0 +## export RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION -RAGILE_RA_B6510_32C_PLATFORM_MODULE = platform-modules-ragile-ra-b6510-32c_$(RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION)_amd64.deb -$(RAGILE_RA_B6510_32C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6510-32c-r0 -$(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6510_32C_PLATFORM_MODULE))) +## RAGILE_RA_B6510_32C_PLATFORM_MODULE = platform-modules-ragile-ra-b6510-32c_$(RAGILE_RA_B6510_32C_PLATFORM_MODULE_VERSION)_amd64.deb +## $(RAGILE_RA_B6510_32C_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6510-32c-r0 +## $(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6510_32C_PLATFORM_MODULE))) ## RA-B6920-4s -RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION = 1.0 -export RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION +## RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION = 1.0 +## export RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION -RAGILE_RA_B6920_4S_PLATFORM_MODULE = platform-modules-ragile-ra-b6920-4s_$(RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION)_amd64.deb -$(RAGILE_RA_B6920_4S_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6920-4s-r0 -$(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6920_4S_PLATFORM_MODULE))) +## RAGILE_RA_B6920_4S_PLATFORM_MODULE = platform-modules-ragile-ra-b6920-4s_$(RAGILE_RA_B6920_4S_PLATFORM_MODULE_VERSION)_amd64.deb +## $(RAGILE_RA_B6920_4S_PLATFORM_MODULE)_PLATFORM = x86_64-ragile_ra-b6920-4s-r0 +## $(eval $(call add_extra_package,$(RAGILE_RA_B6510_48V8C_PLATFORM_MODULE),$(RAGILE_RA_B6920_4S_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-ragile/LICENSE b/platform/broadcom/sonic-platform-modules-ragile/LICENSE old mode 100755 new mode 100644 index d37122689f..5681cac344 --- a/platform/broadcom/sonic-platform-modules-ragile/LICENSE +++ b/platform/broadcom/sonic-platform-modules-ragile/LICENSE @@ -1,5 +1,4 @@ Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2018 Ragile Network Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/Makefile index 6daf3d2b2f..578d65b3bf 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/common/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/common/Makefile @@ -9,33 +9,34 @@ SUB_BUILD_DIR = $(PWD)/build DIR_KERNEL_SRC = $(PWD)/modules SCRIPT_DIR = $(PWD)/script SERVICE_DIR = $(PWD)/service -DEPMOD_CONF_DIR = $(PWD)/depmod_conf +BLACK_DRIVER_CONF_DIR = $(PWD)/modprobe_conf -KBUILD_EXTRA_SYMBOLS += $(DIR_KERNEL_SRC)/Module.symvers -export KBUILD_EXTRA_SYMBOLS +app_dir = $(PWD)/app +app_build_dir = $(app_dir)/build +modules_build_dir = $(DIR_KERNEL_SRC)/build INSTALL_MODULE_DIR = $(SUB_BUILD_DIR)/$(KERNEL_SRC)/$(INSTALL_MOD_DIR) INSTALL_SCRIPT_DIR = $(SUB_BUILD_DIR)/usr/local/bin INSTALL_SERVICE_DIR = $(SUB_BUILD_DIR)/lib/systemd/system -INSTALL_LIB_DIR = $(SUB_BUILD_DIR)/usr/lib/python3.7/dist-packages -INSTALL_DEPMOD_CONF = $(SUB_BUILD_DIR)/etc/depmod.d +INSTALL_LIB_DIR = $(SUB_BUILD_DIR)/usr/lib/python3/dist-packages +INSTALL_BLACK_DRIVER = $(SUB_BUILD_DIR)/etc/modprobe.d all: - $(MAKE) -C $(KERNEL_SRC)/build M=$(DIR_KERNEL_SRC) modules + $(MAKE) -C $(app_dir) + $(MAKE) -C $(DIR_KERNEL_SRC) @if [ ! -d ${INSTALL_MODULE_DIR} ]; then mkdir -p ${INSTALL_MODULE_DIR} ;fi @if [ ! -d ${INSTALL_SCRIPT_DIR} ]; then mkdir -p ${INSTALL_SCRIPT_DIR} ;fi @if [ ! -d ${INSTALL_SERVICE_DIR} ]; then mkdir -p ${INSTALL_SERVICE_DIR} ;fi @if [ ! -d ${INSTALL_LIB_DIR} ]; then mkdir -p ${INSTALL_LIB_DIR} ;fi @if [ -d $(PWD)/lib/ ]; then cp -r $(PWD)/lib/* ${INSTALL_LIB_DIR} ;fi - @if [ -d $(PWD)/lib/ ]; then cp -r $(PWD)/lib/* ${INSTALL_LIB_DIR2} ;fi - @if [ ! -d ${INSTALL_DEPMOD_CONF} ]; then mkdir -p ${INSTALL_DEPMOD_CONF} ;fi - cp -r $(DEPMOD_CONF_DIR)/* $(INSTALL_DEPMOD_CONF) - cp -r $(DIR_KERNEL_SRC)/*.ko $(INSTALL_MODULE_DIR) + @if [ -d $(PWD)/sonic_platform/ ]; then cp -rf $(PWD)/sonic_platform ${INSTALL_LIB_DIR} ;fi + cp -r $(app_build_dir)/module/*.ko $(INSTALL_MODULE_DIR) + cp -r $(modules_build_dir)/*.ko $(INSTALL_MODULE_DIR) + cp -r $(app_dir)/build/app/* $(INSTALL_SCRIPT_DIR) cp -r $(SCRIPT_DIR)/* $(INSTALL_SCRIPT_DIR) cp -r $(SERVICE_DIR)/* $(INSTALL_SERVICE_DIR) @if [ -d $(INSTALL_SCRIPT_DIR) ]; then chmod +x $(INSTALL_SCRIPT_DIR)/* ;fi + @if [ ! -d ${INSTALL_BLACK_DRIVER} ]; then mkdir -p ${INSTALL_BLACK_DRIVER} ;fi + cp -r $(BLACK_DRIVER_CONF_DIR)/* $(INSTALL_BLACK_DRIVER) clean: - rm -f ${DIR_KERNEL_SRC}/*.o ${DIR_KERNEL_SRC}/*.ko ${DIR_KERNEL_SRC}/*.mod.c ${DIR_KERNEL_SRC}/.*.cmd - rm -f ${DIR_KERNEL_SRC}/Module.markers ${DIR_KERNEL_SRC}/Module.symvers ${DIR_KERNEL_SRC}/modules.order - rm -rf ${DIR_KERNEL_SRC}/.tmp_versions rm -rf $(SUB_BUILD_DIR) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile new file mode 100644 index 0000000000..25ba3c5a91 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/Makefile @@ -0,0 +1,25 @@ +pes_parent_dir:=$(shell pwd)/$(lastword $(MAKEFILE_LIST)) +pes_parent_dir:=$(shell dirname $(pes_parent_dir)) + +SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "build") print $$9}') +INC = -I./inc + +COMMON_OUT_PUT := $(shell pwd)/build +common_out_put_dir := $(COMMON_OUT_PUT)/app +common_module_dir := $(COMMON_OUT_PUT)/module/ +export common_out_put_dir common_module_dir + +all : CHECK $(SUBDIRS) +CHECK : + @echo $(pes_parent_dir) + +$(SUBDIRS):ECHO + #@echo $@ + make -C $@ + +ECHO: + @echo $(SUBDIRS) + +.PHONY : clean +clean : + -rm -rf $(COMMON_OUT_PUT) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile new file mode 100644 index 0000000000..e4078716eb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/Makefile @@ -0,0 +1,30 @@ +top_srcdir:=$(shell pwd) +#include $(top_srcdir)/Rules.mk +DIR=$(shell pwd) +BUILD_OUTPUT=$(DIR)/tmp +SRCS=$(wildcard *.c) +OBJS=$(patsubst %.c, $(BUILD_OUTPUT)/%.o, $(SRCS)) +DEPS=$(patsubst %.o, %.d, $(OBJS)) +CFLAGS+=-Wall -W -g -I$(DIR)/include +LDFLAGS= +PROGRAM=dfd_debug + +.PHONY: all + +all:$(OBJS) + $(CC) $(OBJS) $(LDFLAGS) -o $(BUILD_OUTPUT)/$(PROGRAM) + @if [ ! -d ${common_out_put_dir} ]; then mkdir -p ${common_out_put_dir} ;fi + cp -p $(BUILD_OUTPUT)/$(PROGRAM) $(common_out_put_dir) + +$(OBJS):$(SRCS) + @if [ ! -d ${BUILD_OUTPUT} ]; then mkdir -p ${BUILD_OUTPUT} ;fi + $(CC) -c $(CFLAGS) $(INCLUDE) $(*F).c -o $@ + +.PHONY: install +install: + @mkdir -p $(common_out_put_dir) + cp -p $(BUILD_OUTPUT)/$(PROGRAM) $(common_out_put_dir) + +rebuild: clean all +clean: + @rm -rf $(BUILD_OUTPUT)/* diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c new file mode 100644 index 0000000000..93ed6066ef --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_debug.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "dfd_utest.h" + +int g_dfd_debug_sw = 0; +int g_dfd_debugpp_sw = 0; + +void dfd_debug_set_init(void) +{ + FILE *fp; + char buf[10]; + + mem_clear(buf, sizeof(buf)); + fp = fopen(DFD_DEBUGP_DEBUG_FILE, "r"); + if (fp != NULL) { + + g_dfd_debug_sw = 1; + fclose(fp); + } + + fp = fopen(DFD_DEBUGPP_DEBUG_FILE, "r"); + if (fp != NULL) { + + g_dfd_debugpp_sw = 1; + fclose(fp); + } + + return; +} + +int main(int argc, char* argv[]) +{ + dfd_debug_set_init(); + dfd_utest_cmd_main(argc, argv); + + return 0; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c new file mode 100644 index 0000000000..9c71183095 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.c @@ -0,0 +1,1802 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dfd_utest.h" + +#define DFD_UTEST_MAX_RDWR_NUM (256) +#define DFD_UTEST_DEFAULT_WR_NUM (1) + +#define DEV_MEM_NAME "/dev/mem" +#define DEV_KMEM_NAME "/dev/kmem" + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) +#define DFD_UTEST_MAX_BIT_WIDTH (4) + +#ifdef DFD_UTEST_ITEM +#undef DFD_UTEST_ITEM +#endif +#define DFD_UTEST_ITEM(_id, _type_str, _help_info, _help_info_detail) {_id, #_type_str, dfd_utest_##_type_str, _help_info, _help_info_detail}, +static dfd_utest_t g_dfd_unit_test[] = { + DFD_UTEST_ITEM_ALL +}; + +static int g_sys_page_size; +#define SYS_PAGE_SIZE g_sys_page_size +#define SYS_PAGE_MASK (~(SYS_PAGE_SIZE - 1)) + +void dfd_utest_print_cmd(int argc, char* argv[]) +{ + int i; + + for (i = 1; i < argc; i++) { + if (i != 1) { + printf(" "); + } + printf("%s", argv[i]); + } + return; +} + +void dfd_utest_print_all_help(void) +{ + int i, tbl_size; + + tbl_size = sizeof(g_dfd_unit_test) / sizeof(g_dfd_unit_test[0]); + + for (i = 0; i < tbl_size; i++) { + printf("%-20s\t\t\t%s\r\n", g_dfd_unit_test[i].type_str, g_dfd_unit_test[i].help_info); + } + + return; +} + +void dfd_utest_printf_single_help(int utest_type) +{ + int i, tbl_size; + + tbl_size = sizeof(g_dfd_unit_test) / sizeof(g_dfd_unit_test[0]); + for (i = 0; i < tbl_size; i++) { + if (g_dfd_unit_test[i].utest_type == utest_type) { + printf("%-20s\t\t\t%s\r\n", g_dfd_unit_test[i].type_str, g_dfd_unit_test[i].help_info_detail); + return; + } + } + + DFD_DEBUG_DBG("type: %d not match.\n", utest_type); + return; + +} + +void dfd_utest_printf_reg(uint8_t *buf, int buf_len, uint32_t offset_addr) +{ + int i, j, tmp; + + j = offset_addr % 16; + tmp = j; + offset_addr -= j; + printf("\n "); + + for (i = 0; i < 16; i++) { + printf("%2x ", i); + } + + for (i = 0; i < buf_len + j; i++) { + if ((i % 16) == 0) { + printf("\n0x%08x ", offset_addr); + offset_addr = offset_addr + 16; + } + if (tmp) { + printf(" "); + tmp--; + } else { + printf("%02x ", buf[i-j]); + } + } + + printf("\n"); + return; +} + +#define I2C_RETRIES 0x0701 +#define I2C_TIMEOUT 0x0702 +#define I2C_RDWR 0x0707 + +#define I2C_SLAVE 0x0703 /* Use this slave address */ + +#define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it + is already in use by a driver! */ +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ + +struct i2c_msg +{ + unsigned short addr; + unsigned short flags; +#define I2C_M_TEN 0x0010 +#define I2C_M_RD 0x0001 + unsigned short len; + unsigned char *buf; +}; + +struct i2c_rdwr_ioctl_data +{ + struct i2c_msg *msgs; + int nmsgs; + +}; + +#define DFD_I2C_SHORT_ADDR_TYPE 0 +#define DFD_I2C_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define DFD_I2C_RETRY_TIME (50000 / DFD_I2C_RETRY_SLEEP_TIME) +/* i2c_smbus_xfer read or write markers */ +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +/* SMBus transaction types (size parameter in the above functions) + Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) +/* fix tjm */ + +#ifndef __ASSEMBLY__ +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +typedef __signed__ int __s32; +typedef unsigned int __u32; + +typedef __signed__ long __s64; +typedef unsigned long __u64; + +#endif /* __ASSEMBLY__ */ + +#else +/* do noting add tjm */ +#endif + +/* + * Data for SMBus Messages + */ +#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */ + /* and one more for user-space compatibility */ +}; + +/* This is the structure as used in the I2C_SMBUS ioctl call */ +struct i2c_smbus_ioctl_data { + __u8 read_write; + __u8 command; + __u32 size; + union i2c_smbus_data *data; +}; +int32_t dfd_read_port_i2c_one_time_smbus(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *recv_buf, int32_t size, int addr_type) +{ + union i2c_smbus_data data; + struct i2c_smbus_ioctl_data ioctl_data; + unsigned long addr = dev_addr; + int fd; + int rc; + int rv; + int i; + + mem_clear(&ioctl_data, sizeof(struct i2c_smbus_ioctl_data)); + if (i2c_name == NULL || recv_buf == NULL) { + DFD_DEBUG_ERROR("i2c_num = NULL, recv_buf = NULL\r\n"); + return -1; + } + + DFD_DEBUG_DBG("i2c name: %s, dev_addr: 0x%x, offset_addr: 0x%x, size: %d, addr_type: %d.\n", i2c_name, dev_addr, + offset_addr, size, addr_type); + + rv = 0; + fd = open(i2c_name, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + rv = fd; + goto err; + } + if (ioctl(fd, I2C_SLAVE_FORCE , addr) < 0) { + DFD_DEBUG_ERROR("ioctl 2C_SLAVE_FORCE %d.\n", errno); + rv =-1; + goto fail; + } + for (i = 0 ;i < size; i++) { + data.byte = 0; + ioctl_data.read_write = I2C_SMBUS_READ; + ioctl_data.command = (offset_addr + i); + ioctl_data.size = I2C_SMBUS_BYTE_DATA; + ioctl_data.data= &data; + + rc = ioctl(fd, I2C_SMBUS, &ioctl_data); + if (rc < 0) { + DFD_DEBUG_ERROR("read, I2C_SMBUS failed: %d.\n", errno); + rv = -1; + goto fail; + } + *(recv_buf + i) = data.byte; + } + fail: + close(fd); + err: + return rv; + +} + +int32_t dfd_read_port_i2c_one_time(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *recv_buf, int32_t size, int addr_type) +{ + + int32_t fd, rv; + struct i2c_rdwr_ioctl_data ioctl_data; + struct i2c_msg msgs[2]; + uint8_t buf[2]; + + if (i2c_name == NULL || recv_buf == NULL) { + DFD_DEBUG_ERROR("i2c_num = NULL, recv_buf = NULL\r\n"); + return -1; + } + + DFD_DEBUG_DBG("i2c name %s, dev_addr 0x%x, offset_addr 0x%x, size %d, addr_type %d.\n", i2c_name, dev_addr, + offset_addr, size, addr_type); + + rv = 0; + fd = open(i2c_name, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + return -1; + } + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(msgs, sizeof(msgs)); + mem_clear(buf, sizeof(buf)); + if (ioctl(fd, I2C_SLAVE, dev_addr) < 0) { + + DFD_DEBUG_ERROR("%s %dioctl fail(ret:%d, errno:%s)!\r\n", __func__ , __LINE__, rv, strerror(errno)); + rv = -1; + goto fail; + } + + buf[0] = (uint8_t)(offset_addr); + msgs[0].addr= dev_addr; + msgs[0].len= 2; + msgs[0].buf= buf; + msgs[1].addr= dev_addr; + msgs[1].flags|= I2C_M_RD; + msgs[1].len= 1; + msgs[1].buf= recv_buf; + ioctl_data.nmsgs= 1; + ioctl_data.msgs= msgs; + + rv = ioctl(fd, I2C_RDWR, &ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("%s %dioctl fail(ret:%d, errno:%s)!\r\n", __func__ , __LINE__, rv, strerror(errno)); + goto fail; + } + ioctl_data.msgs= &msgs[1]; + DFD_DEBUG_DBG("ioctlread, return :%d/n", ioctl(fd, I2C_RDWR, &ioctl_data)); + DFD_DEBUG_DBG("dfd_read_port_i2c addr: 0x%X, offset: 0x%X, value: 0x%X\n", dev_addr, offset_addr, *recv_buf); + fail: + close(fd); + return rv; + +} + +int32_t dfd_read_port_i2c(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *recv_buf, int32_t size) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_read_port_i2c_one_time_smbus(i2c_name, dev_addr, offset_addr, recv_buf, size, DFD_I2C_SHORT_ADDR_TYPE); + if (rv < 0) { + DFD_DEBUG_ERROR("(read times %d)i2c name %s, dev_addr 0x%X, offset_addr 0x%X, addr_type %d\n", i, i2c_name, dev_addr, offset_addr, DFD_I2C_SHORT_ADDR_TYPE); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +int32_t dfd_write_port_i2c_one_time(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *write_buf, int32_t size,int addr_type) +{ + int32_t fd, rv; + int index; + struct i2c_smbus_ioctl_data ioctl_data; + union i2c_smbus_data data; + uint8_t addr_buf[2]; + uint8_t write_buf_tmp[256]; + + if (i2c_name == NULL || write_buf == NULL ) { + DFD_DEBUG_ERROR("i2c_num = NULL \r\n"); + return -1; + } + + if (size <= 0) { + DFD_DEBUG_ERROR("error:size\n"); + return -1; + } + DFD_DEBUG_DBG("i2c name %s, dev_addr 0x%x, offset_addr 0x%x, size %d, addr_type %d\n",i2c_name, dev_addr, + offset_addr, size, addr_type); + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(addr_buf, sizeof(addr_buf)); + mem_clear(write_buf_tmp, sizeof(write_buf_tmp)); + + rv = 0; + + fd = open(i2c_name, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + return -1; + } + + if (ioctl(fd, I2C_SLAVE_FORCE, dev_addr) < 0) { + DFD_DEBUG_ERROR("ioctl, I2C_SLAVE failed: %d.\n", errno); + rv = -1; + goto fail; + } + + for (index = 0; index < size; index++) { + data.byte = *(write_buf + index); + ioctl_data.read_write = I2C_SMBUS_WRITE; + ioctl_data.command = (offset_addr + index); + ioctl_data.size = I2C_SMBUS_BYTE_DATA; + ioctl_data.data= &data; + rv = ioctl(fd, I2C_SMBUS, (unsigned long)&ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("ioctl fail(ret:%d, errno:%s %d) !\r\n", rv, strerror(errno),errno); + break; + } + DFD_DEBUG_DBG("ret:%d value:0x%02x\n", rv, data.byte); + usleep(5000); + } + +fail: + close(fd); + return rv; +} + +int32_t dfd_write_port_i2c(char *i2c_name, uint16_t dev_addr, uint16_t offset_addr, + uint8_t *write_buf, int32_t size) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_write_port_i2c_one_time(i2c_name, dev_addr, offset_addr, write_buf,size, DFD_I2C_SHORT_ADDR_TYPE); + if (rv < 0) { + DFD_DEBUG_ERROR("(write times %d)i2c name %s, dev_addr 0x%X, offset_addr 0x%X, addr_type %d\n", + i, i2c_name, dev_addr, offset_addr, DFD_I2C_SHORT_ADDR_TYPE); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +static int dfd_read_io_port(uint16_t offset_addr, uint8_t *recv_buf, int32_t size) +{ + int fd; + int ret; + + fd = open("/dev/port", O_RDWR); + if (fd < 0) { + printf("open failed ret %d.\n", fd); + return -1; + } + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek failed ret %d.\n", ret); + goto exit; + } + + ret = read(fd, recv_buf, size); + if (ret != size) { + printf("read failed ret %d size %d.\n", ret, size); + ret = -1; + goto exit; + } + +exit: + close(fd); + return ret; +} + +static int dfd_write_io_port(uint16_t offset_addr, uint8_t *write_buf, int32_t size) +{ + int fd; + int ret; + + fd = open("/dev/port", O_RDWR); + if (fd < 0) { + printf("open failed ret %d.\n", fd); + return -1; + } + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek failed ret %d.\n", ret); + goto exit; + } + + ret = write(fd, write_buf, size); + if (ret != size) { + printf("write failed ret %d size %d.\n", ret, size); + ret = -1; + goto exit; + } + +exit: + close(fd); + return ret; +} + +static int dfd_process_mem(char *dev_name, char is_wr, char width, off_t offset, uint8_t *buf, int32_t size) +{ + int mfd, ret = 0; + void *base; + int i, j; + unsigned int val; + off_t map_offset; + size_t map_size; + + if (size & (width - 1)) { + printf("size %d invalid.\n", size); + return -1; + } + + mfd = open(dev_name, O_RDWR); + if (mfd < 0) { + printf("Cannot open %s.\n", dev_name); + return -1; + } + + g_sys_page_size = getpagesize(); + map_offset = offset & SYS_PAGE_MASK; + map_size = size + offset - map_offset; + base = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, map_offset); + if (base == MAP_FAILED) { + printf("mmap offset 0x%lx failed error(%s).\n", map_offset, strerror(errno)); + close(mfd); + return -1; + } + printf("width %d map_offset 0x%lx, offset 0x%lx, mmap base %p, g_sys_page_size %d\n", + width, map_offset, offset, base, g_sys_page_size); + + if (is_wr) { + for (i = 0; i < size; i = i + width) { + val = 0; + for (j = 0; j < width; j++) { + val |= buf[i + j] << (8 * j); + } + switch (width) { + case 1: + *((volatile unsigned char*)(base + i + offset - map_offset)) = val; + break; + case 2: + *((volatile unsigned short*)(base + i + offset - map_offset)) = val; + break; + case 4: + *((volatile unsigned int*)(base + i + offset - map_offset)) = val; + break; + default: + ret = -1; + printf("Not support width %d.\n", width); + goto exit; + } + } + } else { + for (i = 0; i < size; i = i + width) { + switch (width) { + case 1: + val = *((volatile unsigned char*)(base + i + offset - map_offset)); + break; + case 2: + val = *((volatile unsigned short*)(base + i + offset - map_offset)); + break; + case 4: + val = *((volatile unsigned int*)(base + i + offset - map_offset)); + break; + default: + ret = -1; + printf("Not support width %d.\n", width); + goto exit; + } + for (j = 0; j < width; j++) { + buf[i + j] = (val >> (8 * j)) & 0xff; + } + } + } +exit: + munmap(base, map_size); + close(mfd); + return ret; +} + +int32_t dfd_i2c_gen_read_one_time(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *recv_buf, int32_t rd_len) +{ + int32_t fd, rv, i; + struct i2c_rdwr_ioctl_data ioctl_data; + struct i2c_msg msgs[2]; + uint8_t buf[DFD_UTEST_MAX_BIT_WIDTH]; + + fd = open(i2c_path, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd:%d\n", fd); + return -1; + } + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(msgs, sizeof(msgs)); + mem_clear(buf, sizeof(buf)); + + i = 0; + + switch (addr_bitwidth) { + case WIDTH_4Byte: + buf[i++] = (offset_addr >> 24) & 0xFF; + buf[i++] = (offset_addr >> 16) & 0xFF; + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_2Byte: + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_1Byte: + buf[i++] = offset_addr & 0xFF; + break; + default: + DFD_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set %u addr_bitwidth \n", addr_bitwidth); + rv = -1; + goto fail; + } + + msgs[0].addr = dev_addr; + msgs[0].flags = 0; + msgs[0].len = addr_bitwidth; + msgs[0].buf = buf; + msgs[1].addr = dev_addr; + msgs[1].flags |= I2C_M_RD; + msgs[1].len = rd_len; + msgs[1].buf = recv_buf; + ioctl_data.nmsgs = 2; + ioctl_data.msgs = msgs; + + rv = ioctl(fd, I2C_RDWR, &ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("%s %d Error: Sending messages failed:(ret:%d, errno:%s)!\n", __func__ , __LINE__, rv, strerror(errno)); + goto fail; + } + +fail: + close(fd); + return rv; +} + +int32_t dfd_i2c_gen_read(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *recv_buf, int32_t rd_len) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_i2c_gen_read_one_time(i2c_path, dev_addr, addr_bitwidth, offset_addr, recv_buf, rd_len); + if (rv < 0) { + DFD_DEBUG_ERROR("(read times:%d) i2c_path:%s, dev_addr:0x%x, addr_bitwidth:%u, offset_addr:0x%x, rd_len:%u\n", + i, i2c_path, dev_addr, addr_bitwidth, offset_addr, rd_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +int dfd_utest_i2c_gen_rd(int argc, char* argv[]) +{ + int ret; + uint32_t i2c_bus, dev_addr, addr_bitwidth, offset_addr, data_bitwidth, rd_len, i, j; + char *stopstring; + char i2c_path[32]; + uint8_t tmp_value[DFD_UTEST_MAX_RDWR_NUM]; + uint8_t rd_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc != 8) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_RD); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + addr_bitwidth = strtol(argv[4], &stopstring, 10); + offset_addr = strtol(argv[5], &stopstring, 16); + data_bitwidth = strtol(argv[6], &stopstring, 10); + rd_len = strtol(argv[7], &stopstring, 10); + + if (rd_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", rd_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + mem_clear(tmp_value, sizeof(tmp_value)); + ret = dfd_i2c_gen_read(i2c_path, dev_addr, addr_bitwidth, offset_addr, tmp_value, rd_len); + if (ret < 0) { + printf("read failed. ret:%d\n", ret); + goto exit; + } + + mem_clear(rd_value, sizeof(rd_value)); + if (data_bitwidth == WIDTH_1Byte) { + memcpy(rd_value, tmp_value, rd_len); + } else { + for (i = 0; i < rd_len; i += data_bitwidth) { + for (j = 0; (j < data_bitwidth) && (i + j < rd_len); j++) { + rd_value[i + data_bitwidth - j - 1] = tmp_value[i + j]; + } + } + } + + dfd_utest_printf_reg(rd_value, rd_len, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int32_t dfd_i2c_gen_write_one_time(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *wr_value, uint32_t wr_len) +{ + int32_t fd, rv, i; + struct i2c_rdwr_ioctl_data ioctl_data; + struct i2c_msg msgs[1]; + uint8_t buf[DFD_UTEST_MAX_BIT_WIDTH + DFD_UTEST_MAX_RDWR_NUM]; + + fd = open(i2c_path, O_RDWR | O_SYNC); + if (fd < 0) { + DFD_DEBUG_ERROR("i2c open fail fd %d\n", fd); + return -1; + } + mem_clear(&ioctl_data, sizeof(ioctl_data)); + mem_clear(msgs, sizeof(msgs)); + mem_clear(buf, sizeof(buf)); + + i = 0; + + switch (addr_bitwidth) { + case WIDTH_4Byte: + buf[i++] = (offset_addr >> 24) & 0xFF; + buf[i++] = (offset_addr >> 16) & 0xFF; + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_2Byte: + buf[i++] = (offset_addr >> 8) & 0xFF; + buf[i++] = offset_addr & 0xFF; + break; + case WIDTH_1Byte: + buf[i++] = offset_addr & 0xFF; + break; + default: + DFD_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set %u addr_bitwidth \r\n", addr_bitwidth); + rv = -1; + goto fail; + } + + memcpy(buf + addr_bitwidth, wr_value, wr_len); + + msgs[0].addr= dev_addr; + msgs[0].flags = 0; + msgs[0].len= addr_bitwidth + wr_len; + msgs[0].buf= buf; + + ioctl_data.nmsgs= 1; + ioctl_data.msgs= msgs; + + rv = ioctl(fd, I2C_RDWR, &ioctl_data); + if(rv < 0) { + DFD_DEBUG_ERROR("%s %dError: Sending messages failed:(ret:%d, errno:%s)!\n", __func__ , __LINE__, rv, strerror(errno)); + goto fail; + } else if (rv < ioctl_data.nmsgs) { + DFD_DEBUG_ERROR("%s %dWarning: only %d/%d messages were sent\n", __func__ , __LINE__, rv, ioctl_data.nmsgs); + } + +fail: + close(fd); + return rv; +} + +int32_t dfd_i2c_gen_write(char *i2c_path, uint32_t dev_addr, uint32_t addr_bitwidth, + uint32_t offset_addr, uint8_t *wr_value, uint32_t wr_len) +{ + int i; + int rv; + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + rv = dfd_i2c_gen_write_one_time(i2c_path, dev_addr, addr_bitwidth, offset_addr, wr_value, wr_len); + if (rv < 0) { + DFD_DEBUG_ERROR("(write times:%d)i2c_path:%s, dev_addr:0x%x, addr_bitwidth:%u, offset_addr:0x%x, wr_len:%u\n", + i, i2c_path, dev_addr, addr_bitwidth, offset_addr, wr_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + return rv; +} + +int dfd_utest_i2c_gen_wr(int argc, char* argv[]) +{ + int ret; + uint32_t i2c_bus, dev_addr, addr_bitwidth, offset_addr, data_bitwidth, wr_len, tmp_data, para_len, i, j; + char *stopstring; + char i2c_path[32]; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 8) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_WR); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + addr_bitwidth = strtol(argv[4], &stopstring, 10); + offset_addr = strtol(argv[5], &stopstring, 16); + data_bitwidth = strtol(argv[6], &stopstring, 10); + + para_len = argc - 7; + wr_len = para_len * data_bitwidth; + + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_GEN_WR); + goto exit; + } + + if (data_bitwidth == WIDTH_1Byte) { + for (i = 0; i < para_len; i++) { + wr_value[i] = strtol(argv[7 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value 0x%x\n", i , wr_value[i]); + } + } else { + for (i = 0; i < para_len; i++) { + tmp_data = strtol(argv[7 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value 0x%x\n", i , tmp_data); + for (j = 0; j < data_bitwidth; j++) { + tmp_data = strtol(argv[7 + i], &stopstring, 16); + wr_value[j + i * data_bitwidth] = (tmp_data >> (24 - 8 * j)) & 0xFF; + } + } + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + + ret = dfd_i2c_gen_write(i2c_path, dev_addr, addr_bitwidth, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("write failed. ret:%d\n", ret); + } else { + printf("write success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_i2c_rd(int argc, char* argv[]) +{ + int ret; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + uint16_t dev_addr, offset_addr; + char *stopstring; + int num, i2c_bus; + char i2c_path[32]; + + if (argc != 6) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_RD); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + offset_addr = strtol(argv[4], &stopstring, 16); + num = strtol(argv[5], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + mem_clear(value, sizeof(value)); + ret = dfd_read_port_i2c(i2c_path, dev_addr, offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; + +} + +int dfd_utest_i2c_wr(int argc, char* argv[]) +{ + int ret; + uint16_t dev_addr, offset_addr; + char *stopstring; + int i2c_bus; + char i2c_path[32]; + uint8_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 6) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_WR); + goto exit; + } + + wr_len = argc - 5; + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + offset_addr = strtol(argv[4], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[5+i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + + ret = dfd_write_port_i2c(i2c_path, dev_addr, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_io_rd(int argc, char* argv[]) +{ + int ret; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + uint16_t offset_addr; + char *stopstring; + int num; + + if (argc != 4) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_RD); + goto exit; + } + + offset_addr = strtol(argv[2], &stopstring, 16); + num = strtol(argv[3], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + mem_clear(value, sizeof(value)); + ret = dfd_read_io_port(offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_io_wr(int argc, char* argv[]) +{ + int ret; + uint16_t offset_addr; + char *stopstring; + int32_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 4) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_WR); + goto exit; + } + + wr_len = argc - 3; + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_IO_WR); + goto exit; + } + + offset_addr = strtol(argv[2], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[3 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + ret = dfd_write_io_port(offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_phymem_rd(int argc, char* argv[]) +{ + int ret, width; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + off_t offset_addr; + char *stopstring; + int num; + + if (argc != 5) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_RD); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + num = strtol(argv[4], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + mem_clear(value, sizeof(value)); + ret = dfd_process_mem(DEV_MEM_NAME, 0, width, offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_phymem_wr(int argc, char* argv[]) +{ + int ret, width; + off_t offset_addr; + char *stopstring; + int32_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 5) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_WR); + goto exit; + } + + wr_len = argc - 4; + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_PHYMEM_WR); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[4 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + ret = dfd_process_mem(DEV_MEM_NAME, 1, width, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_kmem_rd(int argc, char* argv[]) +{ + int ret, width; + uint8_t value[DFD_UTEST_MAX_RDWR_NUM]; + uint16_t offset_addr; + char *stopstring; + int num; + + if (argc != 5) { + DFD_DEBUG_ERROR("params error\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_RD); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + num = strtol(argv[4], &stopstring, 10); + + if (num > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", num); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_RD); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + mem_clear(value, sizeof(value)); + ret = dfd_process_mem(DEV_KMEM_NAME, 0, width, offset_addr, value, num); + if (ret < 0) { + printf("failed ret %d\n", ret); + goto exit; + } + + dfd_utest_printf_reg(value, num, offset_addr); + +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_kmem_wr(int argc, char* argv[]) +{ + int ret; + uint16_t offset_addr, width; + char *stopstring; + int32_t wr_len,i; + uint8_t wr_value[DFD_UTEST_MAX_RDWR_NUM]; + + if (argc < 5) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_WR); + goto exit; + } + + wr_len = argc - 4; + if (wr_len > DFD_UTEST_MAX_RDWR_NUM) { + DFD_DEBUG_ERROR("Input num %d exceed max.\n", wr_len); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_KMEM_WR); + goto exit; + } + + width = strtol(argv[2], &stopstring, 10); + offset_addr = strtol(argv[3], &stopstring, 16); + + for (i = 0; i < wr_len; i++) { + wr_value[i] = strtol(argv[4 + i], &stopstring, 16); + DFD_DEBUG_DBG(" index :%d value %x\n", i , wr_value[i]); + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + ret = dfd_process_mem(DEV_KMEM_NAME, 1, width, offset_addr, wr_value, wr_len); + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +static unsigned long dfd_utest_get_file_size(const char *path) +{ + unsigned long filesize; + struct stat statbuff; + + if (stat(path, &statbuff) < 0) { + filesize = -1; + } else { + filesize = statbuff.st_size; + } + + return filesize; +} + +int dfd_utest_i2c_file_wr(int argc, char* argv[]) +{ + int ret; + uint16_t dev_addr, offset_addr; + char *stopstring; + int i2c_bus; + char i2c_path[32]; + char *file_name; + unsigned long filesize; + int fd; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len; + int bpt; /* byte per times*/ + int page_left; + + if (argc != 7) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_I2C_FILE_WR); + goto exit; + } + + i2c_bus = strtol(argv[2], &stopstring, 10); + dev_addr = strtol(argv[3], &stopstring, 16); + offset_addr = strtol(argv[4], &stopstring, 16); + bpt = strtol(argv[5], &stopstring, 10); + file_name = argv[6]; + + if ((bpt <= 0) || (bpt > DFD_UTEST_MAX_RDWR_NUM)) { + bpt = DFD_UTEST_MAX_RDWR_NUM; + } + + if ((bpt & (bpt - 1)) != 0) { + printf("Bytes per times %d isn't power of two.\n",bpt); + goto exit; + } + + filesize = dfd_utest_get_file_size(file_name); + if (filesize <= 0) { + printf("Input invalid file %s, filesize %lu.\n", file_name, filesize); + goto exit; + } + + fd = open(file_name, O_RDONLY); + if (fd < 0) { + printf("open file[%s] fail.\n", file_name); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_bus); + + while (filesize > 0) { + mem_clear(wr_buf, DFD_UTEST_MAX_RDWR_NUM); + len = bpt; + if (offset_addr & (bpt - 1)) { + page_left = bpt - (offset_addr & (bpt - 1)); + len = len > page_left ? page_left : len; + } + + len = read(fd, wr_buf, len); + + ret = dfd_write_port_i2c(i2c_path, dev_addr, offset_addr, wr_buf, len); + if (ret < 0) { + break; + } + offset_addr += len; + filesize -= len; + } + + close(fd); + + if (ret < 0) { + printf("failed ret %d\n", ret); + } else { + printf("success\n"); + } + +exit: + return DFD_RV_MODE_NOTSUPPORT; + +} + +/* compare with sys_flie_wr, One more step is read back verification */ +int dfd_utest_sysfs_file_upg(int argc, char* argv[]) +{ + int ret = 0; + uint32_t offset_addr; + char *file_name; + char *sysfs_loc; + char *stopstring; + unsigned long filesize; + int fd, file_fd; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len, write_len, per_wr_len; + int i; + uint8_t reread_buf[DFD_UTEST_MAX_RDWR_NUM]; + int reback_len, reread_len; + int j = 0; + + if (argc != 5 && argc != 6) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_FILE_UPG); + goto exit; + } + + sysfs_loc = argv[2]; + offset_addr = strtol(argv[3], &stopstring, 16); + file_name = argv[4]; + + if (argc == 6) { + per_wr_len = strtol(argv[5], &stopstring, 10); + if (per_wr_len > DFD_UTEST_MAX_RDWR_NUM || per_wr_len <= 0) { + printf("per_wr_byte %d invalid, not in range (0, 256]\n", per_wr_len); + goto exit; + } + } else { + per_wr_len = DFD_UTEST_DEFAULT_WR_NUM; + } + DFD_DEBUG_DBG("per_wr_byte: %d\n", per_wr_len); + filesize = dfd_utest_get_file_size(file_name); + if (filesize <= 0) { + printf("Input invalid file %s, filesize %lu.\n", file_name, filesize); + goto exit; + } + + fd = open(sysfs_loc, O_RDWR | O_SYNC); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + + file_fd = open(file_name, O_RDONLY); + if (file_fd < 0) { + printf("open file[%s] fail.\n", file_name); + goto open_dev_err; + } + + dfd_utest_print_cmd(argc, argv); + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek file[%s offset=%d] fail,\n", sysfs_loc, offset_addr); + goto fail; + } + + printf(":\n"); + while (filesize > 0) { + if (filesize > (unsigned long)per_wr_len) { + len = per_wr_len; + } else { + len = filesize; + } + + mem_clear(wr_buf, DFD_UTEST_MAX_RDWR_NUM); + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + len = read(file_fd, wr_buf, len); + if (len < 0) { + DFD_DEBUG_ERROR("read file[%s] fail, offset = 0x%x retrytimes = %d ret = %d\n", + sysfs_loc, offset_addr, i ,len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("read file[%s] fail, offset = 0x%x, ret = %d\n", sysfs_loc, offset_addr, len); + goto fail; + } + + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + write_len = write(fd, wr_buf, len); + if (write_len != len) { + DFD_DEBUG_ERROR("write file[%s] fail,offset = 0x%x retrytimes = %d len = %d,write_len =%d\n", + sysfs_loc, offset_addr, i ,len, write_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("write file[%s] fail, offset = 0x%x, len = %d,write_len =%d\n", + sysfs_loc, offset_addr, len, write_len); + goto fail; + } + + reback_len = write_len; + ret = lseek(fd, -reback_len, SEEK_CUR); + if (ret < 0) { + printf("reread lseek file[%s offset=%d] fail,lseek len=%d\n", + sysfs_loc, offset_addr, reback_len); + goto fail; + } + + mem_clear(reread_buf, DFD_UTEST_MAX_RDWR_NUM); + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + reread_len = read(fd, reread_buf, reback_len); + if (reread_len != reback_len) { + DFD_DEBUG_ERROR("reread file[%s] fail,offset = 0x%x retrytimes = %d reread_len = %d,reback_len =%d\n", + sysfs_loc, offset_addr, i ,reread_len, reback_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("reread file[%s] fail, offset = 0x%x, reread_len = %d,reback_len = %d\n", + sysfs_loc, offset_addr, reread_len, reback_len); + goto fail; + } + + if (memcmp(reread_buf, wr_buf, reread_len) != 0) { + if (j < DFD_I2C_RETRY_TIME) { + DFD_DEBUG_ERROR("memcmp file[%s] fail,offset = 0x%x retrytimes = %d\n", + sysfs_loc, offset_addr, j); + j++; + ret = lseek(file_fd, -len, SEEK_CUR); + if (ret < 0) { + printf("retry file_fd lseek fail,lseek len=%d\n", len); + goto fail; + } + ret = lseek(fd, -write_len, SEEK_CUR); + if (ret < 0) { + printf("retry fd lseek fail,lseek len=%d\n", write_len); + goto fail; + } + continue; + } + + printf("upgrade file[%s] fail, offset = 0x%x.\n", sysfs_loc, offset_addr); + printf("want to write buf :\n"); + for (i = 0; i < reread_len; i++) { + printf("0x%x ", wr_buf[i]); + } + printf("\n"); + + printf("actually reread buf :\n"); + for (i = 0; i < reread_len; i++) { + printf("0x%x ", reread_buf[i]); + } + printf("\n"); + + goto fail; + } + + offset_addr += len; + filesize -= len; + usleep(5000); + } + + printf("success\n"); + close(file_fd); + close(fd); + return DFD_RV_OK; + +fail: + close(file_fd); +open_dev_err: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_sysfs_file_wr(int argc, char* argv[]) +{ + int ret = 0; + uint32_t offset_addr; + char *file_name; + char *sysfs_loc; + char *stopstring; + unsigned long filesize; + int fd, file_fd; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len, write_len, per_wr_len; + int i; + + if (argc != 5 && argc != 6) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_FILE_WR); + goto exit; + } + + sysfs_loc = argv[2]; + offset_addr = strtol(argv[3], &stopstring, 16); + file_name = argv[4]; + + if (argc == 6) { + per_wr_len = strtol(argv[5], &stopstring, 10); + if (per_wr_len > DFD_UTEST_MAX_RDWR_NUM || per_wr_len <= 0) { + printf("per_wr_byte %d invalid, not in range (0, 256]\n", per_wr_len); + goto exit; + } + } else { + per_wr_len = DFD_UTEST_DEFAULT_WR_NUM; + } + DFD_DEBUG_DBG("per_wr_byte: %d\n", per_wr_len); + filesize = dfd_utest_get_file_size(file_name); + if (filesize <= 0) { + printf("Input invalid file %s, filesize %lu.\n", file_name, filesize); + goto exit; + } + + fd = open(sysfs_loc, O_RDWR | O_SYNC); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + + file_fd = open(file_name, O_RDONLY); + if (file_fd < 0) { + printf("open file[%s] fail.\n", file_name); + goto open_dev_err; + } + + dfd_utest_print_cmd(argc, argv); + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek file[%s offset=%d] fail,\n", sysfs_loc, offset_addr); + goto fail; + } + + printf(":\n"); + while (filesize > 0) { + if (filesize > (unsigned long)per_wr_len) { + len = per_wr_len; + } else { + len = filesize; + } + + mem_clear(wr_buf, DFD_UTEST_MAX_RDWR_NUM); + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + len = read(file_fd, wr_buf, len); + if (len < 0) { + DFD_DEBUG_ERROR("read file[%s] fail, offset = 0x%x retrytimes = %d ret = %d\n", + sysfs_loc, offset_addr, i ,len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == DFD_I2C_RETRY_TIME) { + printf("read file[%s] fail, offset = 0x%x, ret = %d\n", sysfs_loc, offset_addr, len); + goto fail; + } + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + write_len = write(fd, wr_buf, len); + if (write_len != len) { + DFD_DEBUG_ERROR("write file[%s] fail,offset = 0x%x retrytimes = %d len = %d,write_len =%d\n", sysfs_loc, offset_addr, i ,len, write_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + break; + } + + if(i == DFD_I2C_RETRY_TIME) { + printf("write file[%s] fail, offset = 0x%x, len = %d,write_len =%d\n", sysfs_loc, offset_addr, len, write_len); + ret = -1; + goto fail; + } + offset_addr += len; + filesize -= len; + usleep(5000); + } + + printf("success\n"); + close(file_fd); + close(fd); + return DFD_RV_OK; + +fail: + close(file_fd); +open_dev_err: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_sysfs_file_rd(int argc, char* argv[]) +{ + int ret = 0; + uint32_t offset_addr; + char *sysfs_loc; + char *stopstring; + int fd; + uint8_t rd_buf[DFD_UTEST_MAX_RDWR_NUM]; + int len, read_len;; + + if (argc != 5) { + printf("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_FILE_RD); + goto exit; + } + + sysfs_loc = argv[2]; + offset_addr = strtol(argv[3], &stopstring, 16); + len = strtol(argv[4], &stopstring, 10); + + if (len > DFD_UTEST_MAX_RDWR_NUM) { + printf("Input num %d exceed max 256.\n", len); + goto exit; + } + + fd = open(sysfs_loc, O_RDONLY); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + dfd_utest_print_cmd(argc, argv); + + printf(":\n"); + + ret = lseek(fd, offset_addr, SEEK_SET); + if (ret < 0) { + printf("lseek failed ret %d.\n", ret); + goto fail; + } + + mem_clear(rd_buf, DFD_UTEST_MAX_RDWR_NUM); + read_len = read(fd, rd_buf, len); + if (read_len != len) { + printf("read failed read_len %d len %d.\n", read_len, len); + goto fail; + } + dfd_utest_printf_reg(rd_buf, read_len, offset_addr); + close(fd); + return DFD_RV_OK; + +fail: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_msr_rd(int argc, char* argv[]) +{ + int fd; + char msr_file_name[64]; + uint64_t data; + uint64_t read_result; + char *stopstring; + uint8_t cpu_index, width; + uint64_t offset; + + if (argc != 5) { + printf("rdmsr failed: Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_MSR_RD); + goto exit; + } + + cpu_index = strtol(argv[2], &stopstring, 10); + offset = strtol(argv[3], &stopstring, 16); + width = strtol(argv[4], &stopstring, 10); + + if (width != 8 && width != 16 && width != 32 && width != 64) { + printf("rdmsr failed: width:%u Input invalid.only support 8 16 32 64\n", width); + goto exit; + } + + mem_clear(msr_file_name, sizeof(msr_file_name)); + sprintf(msr_file_name, "/dev/cpu/%u/msr", cpu_index); + + fd = open(msr_file_name, O_RDONLY); + if (fd < 0) { + if (errno == ENXIO) { + fprintf(stderr, "rdmsr failed: No CPU %u\n", cpu_index); + } else if (errno == EIO) { + fprintf(stderr, "rdmsr failed: CPU %u doesn't support MSRs\n", cpu_index); + } else if (errno == ENOENT) { + fprintf(stderr, "rdmsr failed: can't find %s file, Please check if modprobe msr driver already\n", msr_file_name); + } else { + printf("rdmsr failed: %s open failed. errno:%d\n", msr_file_name, errno); + } + goto exit; + } + + if (pread(fd, &data, sizeof(data), offset) != sizeof(data)) { + fprintf(stderr, "rdmsr failed: CPU:%u offset:0x%lx read failed\n", cpu_index, offset); + goto fail; + } + + switch (width) { + case 8: + read_result = (volatile uint8_t)data; + break; + case 16: + read_result = (volatile uint16_t)data; + break; + case 32: + read_result = (volatile uint32_t)data; + break; + case 64: + read_result = (volatile uint64_t)data; + break; + default: + printf("rdmsr failed: width:%u illegal width.\n", width); + goto fail; + } + + printf("0x%lx\n", read_result); + close(fd); + return DFD_RV_OK; + +fail: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_utest_sysfs_data_wr(int argc, char* argv[]) +{ + uint32_t offset; + char *sysfs_loc; + char *stopstring; + uint8_t wr_buf[DFD_UTEST_MAX_RDWR_NUM]; + int ret, i; + int fd, len, write_len, index; + + if (argc < 5) { + DFD_DEBUG_ERROR("Input invalid.\n"); + dfd_utest_printf_single_help(DFD_UTEST_ITEM_SYSFS_DATA_WR); + goto exit; + } + + dfd_utest_print_cmd(argc, argv); + printf(":\n"); + + sysfs_loc = argv[2]; + offset = strtol(argv[3], &stopstring, 16); + len = argc - 4; + mem_clear(wr_buf, sizeof(wr_buf)); + for (i = 0; i < len; i++) { + wr_buf[i] = strtol(argv[4 + i], &stopstring, 16); + DFD_DEBUG_DBG("index :%d value %x\n", i , wr_buf[i]); + } + + fd = open(sysfs_loc, O_RDWR | O_SYNC); + if (fd < 0) { + printf("open file[%s] fail.\n", sysfs_loc); + goto exit; + } + + ret = lseek(fd, offset, SEEK_SET); + if (ret < 0) { + printf("lseek file[%s offset=%d] fail,\n", sysfs_loc, offset); + goto fail; + } + index = 0; + while (len > 0) { + for (i = 0; i < DFD_I2C_RETRY_TIME; i++) { + write_len = write(fd, &wr_buf[index], len); + if (write_len < 0) { + DFD_DEBUG_ERROR("write file[%s] fail, retrytimes: %d, offset: 0x%x, len: %d, write_len: %d\n", + sysfs_loc, offset, i, len, write_len); + usleep(DFD_I2C_RETRY_SLEEP_TIME); + continue; + } + if (write_len == 0) { + DFD_DEBUG_ERROR("write file[%s] EOF, offset: 0x%x, len: %d, write_len: %d\n", + sysfs_loc, offset, len, write_len); + goto fail; + } + break; + } + if(i == DFD_I2C_RETRY_TIME) { + printf("write file[%s] fail, offset: 0x%x, len: %d, write_len: %d\n", + sysfs_loc, offset, len, write_len); + goto fail; + } + offset += write_len; + index += write_len; + len -= write_len; + usleep(5000); + } + printf("success\n"); + close(fd); + return DFD_RV_OK; +fail: + close(fd); +exit: + return DFD_RV_MODE_NOTSUPPORT; +} + +dfd_utest_proc_fun dfd_utest_get_proc_func(char *type_str) +{ + int i, tbl_size; + + tbl_size = sizeof(g_dfd_unit_test) / sizeof(g_dfd_unit_test[0]); + + for (i = 0; i < tbl_size; i++) { + if (!strncmp(g_dfd_unit_test[i].type_str, type_str, strlen(g_dfd_unit_test[i].type_str))) { + return g_dfd_unit_test[i].utest_func; + } + } + DFD_DEBUG_DBG("type: %s not match.\n", type_str); + return NULL; +} + +void dfd_utest_cmd_main(int argc, char* argv[]) +{ + dfd_utest_proc_fun pfunc; + int ret; + + if (argc < 2) { + dfd_utest_print_all_help(); + return; + } + + pfunc = dfd_utest_get_proc_func(argv[1]); + if (pfunc == NULL) { + DFD_DEBUG_DBG("utest type %s in not support.\n", argv[1]); + dfd_utest_print_all_help(); + return; + } + ret = pfunc(argc, argv); + if ((ret != DFD_RV_MODE_NOTSUPPORT) && (ret != DFD_RV_INDEX_INVALID)) { + if (ret == DFD_RV_OK) { + DFD_DEBUG_DBG(" [SUCCESS]\n"); + } else { + DFD_DEBUG_DBG(" [FAIL(%d)]\n", ret); + } + } + + return; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h new file mode 100644 index 0000000000..aa194a4dcd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/dev_util/dfd_utest.h @@ -0,0 +1,103 @@ +/* monitor_utest.h */ +#ifndef __DFD_UTEST_H__ +#define __DFD_UTEST_H__ + +#include + +extern int g_dfd_debug_sw; +extern int g_dfd_debugpp_sw; + +#define DFD_UTEST_TRUE_FALSE_STRING(flag) ((flag == true) ? "true" : "false") + +#define DFD_DEBUG_DBG(fmt, args...) do { \ + if (g_dfd_debug_sw) { \ + printf("" fmt,\ + ##args); \ + } \ +} while (0) + +#define DFD_DEBUG_ERROR(fmt, args...) do { \ + if (g_dfd_debugpp_sw) { \ + printf("" fmt,\ + ##args); \ + } \ +} while (0) + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum dfd_rv_s { + DFD_RV_OK = 0, + DFD_RV_INIT_ERR = 1, + DFD_RV_SLOT_INVALID = 2, + DFD_RV_MODE_INVALID = 3, + DFD_RV_MODE_NOTSUPPORT = 4, + DFD_RV_TYPE_ERR = 5, + DFD_RV_DEV_NOTSUPPORT = 6, + DFD_RV_DEV_FAIL = 7, + DFD_RV_INDEX_INVALID = 8, + DFD_RV_NO_INTF = 9, + DFD_RV_NO_NODE = 10, + DFD_RV_NODE_FAIL = 11, +} dfd_rv_t; + +#define DFD_DEBUG_BUF_LEN (32) +#define DFD_DEBUGP_DEBUG_FILE "/sbin/.dfd_debugp_flag" +#define DFD_DEBUGPP_DEBUG_FILE "/sbin/.dfd_debugpp_flag" + +#define DFD_UTEST_MAX_PARA_NUM (4) +#define DFD_UTEST_TYPE_STRING_LEN (64) +#define DFD_UTEST_MATCH_STRING_LEN (64) +#define DFD_UTEST_HELP_STRING_LEN (256) +#define DFD_UTEST_INVALID_PARA (-1) +#define DFD_UTEST_BUFF_LEN (64) + +typedef enum dfd_fpga_cpld_flag_e { + DFD_CPLD_RW_FLAG = 0x00, + DFD_FPGA_RW_FLAG = 0x01, +} dfd_fpga_cpld_flag_t; + +typedef int (* dfd_utest_proc_fun)(int argc, char* argv[]); + +#define DFD_UTEST_ITEM_ALL \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_RD, i2c_rd, "i2c_rd [i2c_bus] [slave_addr] [offset] [len]", "i2c_rd [i2c_bus] [slave_addr] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_WR, i2c_wr, "i2c_wr [i2c_bus] [slave_addr] [offset] [data0] ... [dataN]", "i2c_wr [i2c_bus] [slave_addr] [offset] [data0] ... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_IO_RD, io_rd, "io_rd [offset] [len]", "io_rd [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_IO_WR, io_wr, "io_wr [offset] [data0]... [dataN]", "io_wr [offset] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_PHYMEM_RD, phymem_rd, "phymem_rd [bit_width] [offset] [len]", "phymem_rd [bit_width] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_PHYMEM_WR, phymem_wr, "phymem_wr [bit_width] [offset] [data0]... [dataN]", "phymem_wr [bit_width] [offset] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_KMEM_RD, kmem_rd, "kmem_rd [bit_width] [offset] [len]", "kmem_rd [bit_width] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_KMEM_WR, kmem_wr, "kmem_wr [bit_width][offset] [data0]... [dataN]", "kmem_wr [bit_width] [offset] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_FILE_WR, i2c_file_wr, "i2c_file_wr [i2c_bus] [slave_addr] [offset] [bpt] [filename]", "i2c_file_wr [i2c_bus] [slave_addr] [offset] [bpt] [filename]\nbpt:bytes per times") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_FILE_WR, sysfs_file_wr, "sysfs_file_wr [sysfs_loc] [offset] [filename] [per_wr_byte]", "sysfs_file_wr [sysfs_loc] [offset] [filename] [per_wr_byte]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_FILE_RD, sysfs_file_rd, "sysfs_file_rd [sysfs_loc] [offset] [len]", "sysfs_file_rd [sysfs_loc] [offset] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_FILE_UPG, sysfs_file_upg, "sysfs_file_upg [sysfs_loc] [offset] [filename] [per_wr_byte]", "sysfs_file_upg [sysfs_loc] [offset] [filename] [per_wr_byte]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_GEN_RD, i2c_gen_rd, "i2c_gen_rd [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [len]", "i2c_gen_rd [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [len]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_I2C_GEN_WR, i2c_gen_wr, "i2c_gen_wr [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [data0]... [dataN]", "i2c_gen_wr [i2c_bus] [slave_addr] [addr_bitwidth] [offset] [data_bitwidth] [data0]... [dataN]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_MSR_RD, msr_rd, "msr_rd [cpu_index] [offset] [width]", "msr_rd [cpu_index] [offset] [width]") \ + DFD_UTEST_ITEM(DFD_UTEST_ITEM_SYSFS_DATA_WR, sysfs_data_wr, "sysfs_data_wr [sysfs_loc] [offset] [data0] ... [dataN]", "sysfs_data_wr [sysfs_loc] [offset] [data0] ... [dataN]]") \ + +#ifdef DFD_UTEST_ITEM +#undef DFD_UTEST_ITEM +#endif +#define DFD_UTEST_ITEM(_id, _type_str, _help_info, _help_info_detail) _id, +typedef enum dfd_utest_item_id_s { + DFD_UTEST_ITEM_ALL +} dfd_utest_item_id_t; + +typedef struct { + int utest_type; + char type_str[DFD_UTEST_TYPE_STRING_LEN]; + dfd_utest_proc_fun utest_func; + char help_info[DFD_UTEST_HELP_STRING_LEN]; + char help_info_detail[DFD_UTEST_HELP_STRING_LEN]; +} dfd_utest_t; + +void dfd_utest_cmd_main(int argc, char* argv[]); + +#ifdef DFD_UTEST_ITEM +#undef DFD_UTEST_ITEM +#endif +#define DFD_UTEST_ITEM(_id, _type_str, _help_info, _help_info_detail) int dfd_utest_##_type_str(int argc, char* argv[]); +DFD_UTEST_ITEM_ALL + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile new file mode 100644 index 0000000000..62663efdbb --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Makefile @@ -0,0 +1,19 @@ +top_srcdir:=$(shell pwd) +include $(top_srcdir)/Rules.mk + +firmware-y:= +firmware-y += firmware_driver +firmware-y += firmware_upgrade + +.PHONY: all +all: build + +.PHONY: build +build: $(firmware-y) +$(foreach dir,$(firmware-y),$(eval $(call compile_dirs,$(dir)))) + +.PHONY: rpmpkg +rpmpkg: +ifeq ("$(CONFIG_CPLD_UPGRADE_ISPVME)", "y") + #$(RPMPKG) $(install_cpld_dir) firmware-cpld-ispvme.spec git +endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk new file mode 100644 index 0000000000..5fb5a09d34 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/Rules.mk @@ -0,0 +1,42 @@ +CC ?= $(CROSS)gcc +AR ?= $(CROSS)ar +AS ?= $(CROSS)as +LD ?= $(CROSS)ld +STRIP ?= $(CROSS)strip + +install_root:=${top_srcdir}/images + +install_header_dir:=${install_root}/header +install_adir:=$(install_root)/lib +install_symbol_dir:=$(install_root)/symbol +symbol_files:=$(shell find $(EXPORT_SYMBOL) -name 'Module.symvers') +# +# symbol_files += $(shell find $(install_symbol_dir) -name 'Module.symvers') +# KBUILD_EXTRA_SYMBOLS += $(symbol_files) +# export KBUILD_EXTRA_SYMBOLS + +# top root: install_rootfs_dir +install_rootfs_dir:=$(install_root)/rootfs + +install_sodir:=$(install_rootfs_dir)/$(INSTALL_SODIR) + +install_usr_bin_dir:=$(install_rootfs_dir)/usr/bin +install_sbin_dir:=$(install_rootfs_dir)/sbin +install_etc_dir:=$(install_rootfs_dir)/etc + +export INSTALL_MOD_PATH:=$(ROOT) + +BUILD_CFLAGS:=$(CFLAGS) -I$(install_header_dir) +BUILD_LDFLAGS:=$(LDFLAGS) -L/$(install_sodir) -L/$(install_adir) + +define compile_dirs +.PHONY: $(1) +$(1): + @echo;echo "building $(1)..." + @$(MAKE) -C ${1} +endef + +compile.c = $(CC) $(BUILD_CFLAGS) -d -c -o $@ $< +%.o: %.c + $(compile.c) + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile new file mode 100644 index 0000000000..e8879aeff5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/Makefile @@ -0,0 +1,19 @@ +include $(top_srcdir)/Rules.mk + +firmware-y:= +firmware-y += firmware_driver_ispvme +firmware-y += firmware_driver_cpld +firmware-y += firmware_driver_sysfs + +.PHONY: all +all: build + +.PHONY: build +build: $(firmware-y) +$(foreach dir,$(firmware-y),$(eval $(call compile_dirs,$(dir)))) + +.PHONY: rpmpkg +rpmpkg: +ifeq ("$(CONFIG_CPLD_UPGRADE_ISPVME)", "y") + #$(RPMPKG) $(install_cpld_dir) firmware-cpld-ispvme.spec git +endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile new file mode 100644 index 0000000000..0add28cb90 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/Makefile @@ -0,0 +1,23 @@ +#include $(top_srcdir)/debian/rules +#KERNELDIR := ${KBUILD_OUTPUT} + +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../include) +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) +EXTRA_CFLAGS+= -Wall + +firmware_driver_cpld-objs := firmware.o +firmware_driver_cpld-objs += firmware_cpld.o firmware_cpld_upgrade.o +firmware_driver_cpld-objs += jbicomp.o jbijtag.o jbimain.o jbistub.o + +#ifndef CONFIG_FRM_PRODUCT_FILE + +$(warning $(firmware_driver_cpld-objs)) +obj-m := firmware_driver_cpld.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(common_module_dir) ]; then mkdir -p $(common_module_dir) ;fi + cp -p $(PWD)/*.ko $(common_module_dir) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c new file mode 100644 index 0000000000..db72b36946 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware.c @@ -0,0 +1,144 @@ +#include +#include +#include + +int g_firmware_driver_debug = 0; +module_param(g_firmware_driver_debug, int, S_IRUGO | S_IWUSR); + +static LIST_HEAD(drv_list); +static LIST_HEAD(dev_list); + +/** + * firmware_driver_register + * function:Registered Device Driver + * @fw_drv:param[in] Driver information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_driver_register(firmware_driver_t *fw_drv) +{ + int ret; + + if (fw_drv == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + + ret = platform_driver_register(fw_drv->drv); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: failed to register firmware upgrade driver \n"); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_drv->list, &drv_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware upgrade driver register sucess \n"); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_driver_unregister + * function:unregister Device Driver + * @fw_drv:param[in] Driver information + */ +void firmware_driver_unregister(firmware_driver_t *fw_drv) +{ + list_del_init(&fw_drv->list); + platform_driver_unregister(fw_drv->drv); +} + +/* + * firmware_get_device_by_minor + * function: Get device information based on minor + */ +firmware_device_t *firmware_get_device_by_minor(int minor) +{ + firmware_device_t *tmp; + + list_for_each_entry(tmp, &dev_list, list) { + if (tmp->dev.minor == minor) { + return tmp; + } + } + + return NULL; +} + +/** + * firmware_device_register + * function:Registered Driver Device + * @fw_dev: param[in] Driver information + * return value:success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_device_register(firmware_device_t *fw_dev) +{ + int ret; + firmware_device_t *tmp; + + if (fw_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + /* Check whether the device file name already exists in the device linked list */ + list_for_each_entry(tmp, &dev_list, list) { + if (strcmp(tmp->name, fw_dev->name) == 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("devie %s already exists.\n", fw_dev->name); + return FIRMWARE_FAILED; + } + } + + /* Registere device */ + ret = misc_register(&fw_dev->dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("register misc error, ret=%d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Adds a device to the device list */ + list_add(&fw_dev->list, &dev_list); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_device_unregister + * function: unregister Driver Device + */ +void firmware_device_unregister(firmware_device_t *fw_dev) +{ + list_del(&fw_dev->list); + misc_deregister(&fw_dev->dev); +} + +static int __init firmware_driver_init(void) +{ + int ret; + + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver init.\n"); + ret = firmware_cpld_init(); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware driver init failed.\n"); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +static void __exit firmware_driver_exit(void) +{ + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver exit.\n"); + firmware_cpld_exit(); + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + return; +} + +module_init(firmware_driver_init); +module_exit(firmware_driver_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Firmware upgrade driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c new file mode 100644 index 0000000000..18ec509d0f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld.c @@ -0,0 +1,384 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_cpld_open(struct inode *inode, struct file *file) +{ + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Open cpld device.\n"); + frm_dev = firmware_get_device_by_minor(MINOR(inode->i_rdev)); + if (frm_dev == NULL) { + return -ENXIO; + } + file->private_data = frm_dev; + + return FIRMWARE_SUCCESS; +} + +static ssize_t firmware_cpld_read (struct file *file, char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static ssize_t firmware_cpld_write (struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static loff_t firmware_cpld_llseek(struct file *file, loff_t offset, int origin) +{ + return 0; +} + +/* + * firmware_cpld_ioctl + * function: ioctl command parsing function + * @file: param[in] device file name + * @cmd: param[in] command + * @arg: param[in] the parameters in the command + * return value: success-FIRMWARE_SUCCESS; fail:other value + */ +static long firmware_cpld_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret; + char *buf; + void __user *argp; + char version[FIRMWARE_NAME_LEN]; + char chip_name[FIRMWARE_NAME_LEN]; + cmd_info_t cmd_info; + firmware_device_t *frm_dev; + firmware_cpld_t *cpld_info; + + /* Get device private data */ + mem_clear(&cmd_info, sizeof(cmd_info_t)); + frm_dev = (firmware_device_t *)file->private_data; + cpld_info = NULL; + if (frm_dev != NULL) { + if (frm_dev->priv != NULL) { + cpld_info = (firmware_cpld_t *)frm_dev->priv; + } + } + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to frm_dev->priv sysfs info.\n"); + return FIRMWARE_FAILED; + } + argp = (void __user *)arg; + + switch (cmd) { + case FIRMWARE_GET_CHIPNAME: + /* get chip name */ + if (copy_from_user(&cmd_info, argp, sizeof(cmd_info_t))) { + return -EFAULT; + } + mem_clear(chip_name, FIRMWARE_NAME_LEN); + ret = fmw_cpld_upg_get_chip_name(frm_dev->chain, cpld_info, chip_name, FIRMWARE_NAME_LEN); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get chip name.\n"); + return -ENXIO; + } + if (copy_to_user(cmd_info.data, chip_name, cmd_info.size)) { + return -EFAULT; + } + break; + case FIRMWARE_PROGRAM: + case FIRMWARE_PROGRAM_JBI: + /* firmware upgrade */ + if (copy_from_user(&cmd_info, argp, sizeof(cmd_info_t))) { + return -EFAULT; + } + buf = (char *) kzalloc(cmd_info.size + 1, GFP_KERNEL); + if (buf == NULL) { + return -ENOMEM; + } + if (copy_from_user(buf, cmd_info.data, cmd_info.size)) { + kfree(buf); + return -EFAULT; + } + buf[cmd_info.size] = 0; + if (cmd == FIRMWARE_PROGRAM_JBI) { + /* JBI firmware upgrade */ + ret = fmw_cpld_upg_program_jbi(frm_dev->chain, cpld_info, buf, cmd_info.size); + } else { + /* ISC firmware upgrade */ + ret = fmw_cpld_upg_program(frm_dev->chain, cpld_info, buf, cmd_info.size); + } + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program cpld.\n"); + kfree(buf); + return -ESRCH; + } + kfree(buf); + break; + case FIRMWARE_GET_VERSION: + /* get version */ + if (copy_from_user(&cmd_info, argp, sizeof(cmd_info_t))) { + return -EFAULT; + } + mem_clear(version, FIRMWARE_NAME_LEN); + ret = fmw_cpld_upg_get_version(frm_dev->chain, cpld_info, version, FIRMWARE_NAME_LEN); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get version.\n"); + return -ENXIO; + } + if (copy_to_user(cmd_info.data, version, cmd_info.size)) { + return -EFAULT; + } + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("not find cmd: %d\r\n", cmd); + return -ENOTTY; + } /* End of switch */ + + return FIRMWARE_SUCCESS; +} + +static int firmware_cpld_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations cpld_dev_fops = { + .owner = THIS_MODULE, + .llseek = firmware_cpld_llseek, + .read = firmware_cpld_read, + .write = firmware_cpld_write, + .unlocked_ioctl = firmware_cpld_ioctl, + .open = firmware_cpld_open, + .release = firmware_cpld_release, +}; + +static int of_firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int ret; + char *name; + int i; + char buf[64]; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + ret = 0; + ret += of_property_read_string(dev->of_node, "type", (const char **)&name); + ret += of_property_read_u32(dev->of_node, "tdi", &cpld_info->tdi); + ret += of_property_read_u32(dev->of_node, "tck", &cpld_info->tck); + ret += of_property_read_u32(dev->of_node, "tms", &cpld_info->tms); + ret += of_property_read_u32(dev->of_node, "tdo", &cpld_info->tdo); + + ret += of_property_read_u32(dev->of_node, "chain", &cpld_info->chain); + ret += of_property_read_u32(dev->of_node, "chip_index", &cpld_info->chip_index); + + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config error, ret:%d.\n", ret); + return -ENXIO; + } + + strncpy(cpld_info->type, name, sizeof(cpld_info->type) - 1); + + ret = of_property_read_u32(dev->of_node, "tck_delay", &cpld_info->tck_delay); + if(ret != 0) { + cpld_info->tck_delay = 60; + } + + cpld_info->gpio_en_info_num = 0; + /* Enable through GPIO */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_gpio_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_gpio); + if(ret != 0) { + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_level_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_level); + if(ret != 0) { + break; + } + cpld_info->gpio_en_info_num++; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, en_info_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int i; + + firmware_upgrade_device_t *firmware_upgrade_device; + firmware_jtag_device_t jtag_upg_device; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + if (dev->platform_data == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("platform data config error.\n"); + return -1; + } + firmware_upgrade_device = dev->platform_data; + jtag_upg_device = firmware_upgrade_device->upg_type.jtag; + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + + strncpy(cpld_info->type, firmware_upgrade_device->type, sizeof(cpld_info->type) - 1); + cpld_info->tdi = jtag_upg_device.tdi; + cpld_info->tck = jtag_upg_device.tck; + cpld_info->tms = jtag_upg_device.tms; + cpld_info->tdo = jtag_upg_device.tdo; + cpld_info->chain = firmware_upgrade_device->chain; + cpld_info->chip_index = firmware_upgrade_device->chip_index; + + if (jtag_upg_device.tck_delay == 0) { + cpld_info->tck_delay = 60; + FIRMWARE_DRIVER_DEBUG_VERBOSE("no config tck_delay, use default value:%u\n", cpld_info->tck_delay); + } else { + cpld_info->tck_delay = jtag_upg_device.tck_delay; + } + + if (firmware_upgrade_device->en_gpio_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_gpio_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_gpio_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + cpld_info->gpio_en_info_num = firmware_upgrade_device->en_gpio_num; + /* Enable through GPIO */ + for (i = 0; i < cpld_info->gpio_en_info_num; i++) { + cpld_info->gpio_en_info[i].en_gpio = firmware_upgrade_device->en_gpio[i]; + cpld_info->gpio_en_info[i].en_level = firmware_upgrade_device->en_level[i]; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, en_info_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_cpld_probe(struct platform_device *pdev) +{ + int ret; + firmware_cpld_t *cpld_info; + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_cpld_probe\r\n"); + /* Gets the information in the device tree */ + cpld_info = devm_kzalloc(&pdev->dev, sizeof(firmware_cpld_t), GFP_KERNEL); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc cpld device tree.\n"); + return -EPERM; + } + + if (pdev->dev.of_node) { + ret = of_firmware_upgrade_config_init(&pdev->dev, cpld_info); + } else { + ret = firmware_upgrade_config_init(&pdev->dev, cpld_info); + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("get config init from dts error.\n"); + return -EPERM; + } + + frm_dev = devm_kzalloc(&pdev->dev, sizeof(firmware_device_t), GFP_KERNEL); + if (frm_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc firmware device.\n"); + return -EPERM; + } + + /* Based on the link number, determine the name of the device file */ + frm_dev->chain = cpld_info->chain; + snprintf(frm_dev->name, FIRMWARE_NAME_LEN - 1, "firmware_cpld%d", frm_dev->chain); + strncpy(cpld_info->devname, frm_dev->name, strlen(frm_dev->name) + 1); + + INIT_LIST_HEAD(&frm_dev->list); + frm_dev->dev.minor = MISC_DYNAMIC_MINOR; + frm_dev->dev.name = frm_dev->name; + frm_dev->dev.fops = &cpld_dev_fops; + frm_dev->priv = cpld_info; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Register cpld firmware chain:%d, name:%s.\n", frm_dev->chain, frm_dev->name); + + ret = firmware_device_register(frm_dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to register firmware device.\n"); + return -EPERM; + } + + platform_set_drvdata(pdev, frm_dev); + return 0; +} + +static int __exit firmware_cpld_remove(struct platform_device *pdev) +{ + firmware_device_t *frm_dev; + + frm_dev = (firmware_device_t *)platform_get_drvdata(pdev); + firmware_device_unregister(frm_dev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct of_device_id cpld_match[] = { + { + .compatible = "firmware_cpld", + }, + {}, +}; + +static struct platform_driver cpld_driver = { + .driver = { + .name = "firmware_cpld", + .owner = THIS_MODULE, + .of_match_table = cpld_match, + }, + .probe = firmware_cpld_probe, + .remove = firmware_cpld_remove, +}; + +static firmware_driver_t fmw_drv_cpld = { + .name = "firmware_cpld", + .drv = &cpld_driver, +}; + +int firmware_cpld_init(void) +{ + int ret; + + INIT_LIST_HEAD(&fmw_drv_cpld.list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("cpld upgrade driver register \n"); + ret = firmware_driver_register(&fmw_drv_cpld); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("cpld upgrade driver register failed.\n"); + return ret; + } + return 0; +} + +void firmware_cpld_exit(void) +{ + firmware_driver_unregister(&fmw_drv_cpld); + INIT_LIST_HEAD(&fmw_drv_cpld.list); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c new file mode 100644 index 0000000000..8252c2a39b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/firmware_cpld_upgrade.c @@ -0,0 +1,1879 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* CPLD file parses the relevant parameters */ +#define CPLD_HEX 16 +#define DEC_VAL 10 +#define CPLD_INIT_CNT 4 +#define CPLD_UNIT_SZ 4 +#define CPLD_HEAD_KEYWORD "Header" +#define CPLD_NAME_KEYWORD "Entity" +#define CPLD_INIT_KEYWORD "INITIALIZE" +#define CPLD_REPEAT_KEYWORD "REPEAT" +#define CPLD_END_CHAR ',' + +/* TCK clock MAX 16MHz */ +#define TCK_DELAY (current_fmw_cpld->tck_delay) + +/* + * The instruction format of the MAX II CPLD is 10 bits + * For shift_ir state machine use + */ +#define BYPASS 0x3FF +#define EXTEST 0xF +#define SAMPLE 0x5 +#define IDCODE 0x6 +#define USERCODE 0x7 +#define CLAMP 0xA +#define HIGHZ 0xB + +/* Following 7 instructions are IEEE 1532 instructions */ +#define ISC_ENABLE 0x2CC +#define ISC_DISABLE 0x201 +#define ISC_PROGRAM 0x2F4 +#define ISC_ERASE 0x2F2 +#define ISC_ADDRESS_SHIFT 0x203 +#define ISC_READ 0x205 +#define ISC_NOOP 0x210 + +/* + * MAX II devices support the real-time in-system programmability (ISP) + * feature that allows you to program the device while it is still in operation. + * when there is either a power cycle to the device (powering down and powering + * up again) or with the execution of certain ISP instructions to start the SRAM + * download process when realtime ISP has completed. + */ +#define RT_ISC_ENABLE 0x199 +#define RT_ISC_DISABLE 0x166 + +/* Chip ID */ +#define EPM240_G 0x020A10DD +#define EPM570_G 0x020A20DD +#define EPM1270_G 0x020A30DD +#define EPM2210_G 0x020A40DD +#define EPM240_Z 0x020A50DD +#define EPM570_Z 0x020A60DD + +/* The size of the output data for ID validation */ +#define VERIFY_IDCODE_SIZE 0x5 + +/* Erasure and programmatic delay handling */ +#define ERASE_DELAY 0x1024 +#define PROGRAM_DELAY 0x5 + +/* Chip instruction register */ +#define CPLD_INSTRUCTION_SIZE 10 + +/* + * Currently, only two connectors are supported + * The size of the instruction register needs to be changed + * when more than two connectors are used + */ +#ifndef CPLD_MAX_CHIP +#define CPLD_MAX_CHIP 2 +#endif + +typedef struct cpld_chip_id { + char *name; + uint id; + int addr_register_length; + int data_register_length; + int eeprom_array_length; + int first_blank_check_length; + int second_blank_check_length; + int first_erase_addr; + int second_erase_addr; + int third_erase_addr; + int verify_idcode_addr; +} cpld_chip_id_t; + +static cpld_chip_id_t cpld_id_table[] = { + {"EPM240T100", EPM240_G, 13, 16, 4604, 3327, 511, 0x0, 0x1, 0x11, 0x89}, + {"EPM570T144", EPM570_G, 14, 16, 8700, 3327, 511, 0x0, 0x1, 0x21, 0x111}, + {"EPM1270F256", EPM1270_G, 15, 16, 16892, 16383, 511, 0x0, 0x1, 0x41, 0x221}, + {"5M240Z", EPM240_Z, 13, 16, 4604, 3327, 511, 0x0, 0x1, 0x11, 0x89}, + {"5M570Z", EPM570_Z, 14, 16, 8700, 3327, 511, 0x0, 0x1, 0x21, 0x111}, + {NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +}; + +static cpld_chip_id_t *chip_cpld_info = NULL; + +/* The following variables are used when cascading multiple chips */ +static int chip_num, current_chip_index; +static firmware_cpld_t *current_fmw_cpld; + +static int TDI_PULL_UP(void); +static int TDI_PULL_DOWN(void); +static int TMS_PULL_UP(void); +static int TMS_PULL_DOWN(void); +static int TCK_PULL_UP(void); +static int TCK_PULL_DOWN(void); + +/* + * set_currrent_cpld_info + * function: Save the current device information + * @info: param[in] Information about the device to be updated + */ +static void set_currrent_cpld_info(firmware_cpld_t *info) +{ + current_fmw_cpld = info; +} + +/* + * firmware_upgrade_en + * function: Upgrade access enabling switch + * @flag: !0:enable 0:disable + */ +static int firmware_upgrade_en(int flag) +{ + int i; + int ret; + + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (flag) { + ret = gpio_request(current_fmw_cpld->gpio_en_info[i].en_gpio, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade EN[%d] GPIO[%d] failed!\n", + i, current_fmw_cpld->gpio_en_info[i].en_gpio); + goto free_gpio; + } + gpio_direction_output(current_fmw_cpld->gpio_en_info[i].en_gpio, current_fmw_cpld->gpio_en_info[i].en_level); + current_fmw_cpld->gpio_en_info[i].flag = 1; + } else { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } + } + return 0; +free_gpio: + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (current_fmw_cpld->gpio_en_info[i].flag == 1) { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } else { + break; + } + } + + return -1; +} + +/* + * init_cpld + * function:Initialize CPLD + * return value: 0 success ; -1 fail + */ +static int init_cpld(void) +{ + int ret; + + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = gpio_request(current_fmw_cpld->tdi, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TDI GPIO failed!\n"); + return ret; + } + ret = gpio_request(current_fmw_cpld->tck, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TCK GPIO failed!\n"); + goto free_tdi; + } + ret = gpio_request(current_fmw_cpld->tms, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TMS GPIO failed!\n"); + goto free_tck; + } + ret = gpio_request(current_fmw_cpld->tdo, "cpld_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_upgrade TDO GPIO failed!\n"); + goto free_tms; + } + + gpio_direction_output(current_fmw_cpld->tdi, 1); + gpio_direction_output(current_fmw_cpld->tck, 1); + gpio_direction_output(current_fmw_cpld->tms, 1); + + gpio_direction_input(current_fmw_cpld->tdo); + ret = firmware_upgrade_en(1); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: open firmware upgrade en failed, ret %d.\n", ret); + goto free_tdo; + } + + /* test GPIO */ + if (TDI_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_UP failed.\n"); + goto free_tdo; + } + if (TDI_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TMS_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_UP failed.\n"); + goto free_tdo; + } + if (TMS_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TCK_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_UP failed.\n"); + goto free_tdo; + } + if (TCK_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_DOWN failed.\n"); + goto free_tdo; + } + + mdelay(10); + return 0; + +free_tdo: + gpio_free(current_fmw_cpld->tdo); +free_tms: + gpio_free(current_fmw_cpld->tms); +free_tck: + gpio_free(current_fmw_cpld->tck); +free_tdi: + gpio_free(current_fmw_cpld->tdi); + return ret; +} + +/* + * finish_cpld + * function: finish CPLD upgrade operation + * return value: 0 success ; -1 fail + */ +static int finish_cpld(void) +{ + int ret; + + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = firmware_upgrade_en(0); + if (ret < 0){ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: close firmware upgrade en failed, ret %d.\r\n", ret); + } + + gpio_free(current_fmw_cpld->tdi); + gpio_free(current_fmw_cpld->tck); + gpio_free(current_fmw_cpld->tms); + gpio_free(current_fmw_cpld->tdo); + mdelay(10); + return 0; +} + +/* Loop waiting for */ +static int pull_wait(int gpio, int value) { + int i, j; + /* Timeout time is two seconds */ + for (i = 0; i < 20; i++) { + for (j = 0; j < 100; j++) { + if (!!gpio_get_value(gpio) == !!value ) { + return 0; + } + /* The first loop does not delay, normally the first loop can immediately return the result */ + if (i) { + mdelay(1); + } + } + /* The CPU is released every 100ms */ + schedule(); + } + /* timeout */ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Wait gpio %d pull to %d failed.\n", gpio, value); + return -1; +} + +/* TDI pull-up */ +static int pull_tdi_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 1); +} + +/* TDI pull-down */ +static int pull_tdi_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 0); +} + +/* TCK pull-up */ +static int pull_tck_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 1); +} + +/* TCK pull-down */ +static int pull_tck_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 0); +} + +/* TMS pull-up */ +static int pull_tms_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 1); +} + +/* TMS pull-down */ +static int pull_tms_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 0); +} + +/* Read TDO */ +static int read_tdo(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + return gpio_get_value(current_fmw_cpld->tdo); +} + +static firmware_cpld_function_t function_fmw_cpld = { + .pull_tdi_up = pull_tdi_up, + .pull_tdi_down = pull_tdi_down, + .pull_tck_up = pull_tck_up, + .pull_tck_down = pull_tck_down, + .pull_tms_up = pull_tms_up, + .pull_tms_down = pull_tms_down, + .read_tdo = read_tdo, + .init_cpld = init_cpld, + .finish_cpld = finish_cpld, +}; + +/* + * TDI_PULL_DOWN + * function: Lower TDI + */ +static int TDI_PULL_DOWN(void) +{ + if ( function_fmw_cpld.pull_tdi_down != NULL) { + return function_fmw_cpld.pull_tdi_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TDI_PULL_UP + * function: High TDI + */ +static int TDI_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tdi_up != NULL) { + return function_fmw_cpld.pull_tdi_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_UP.\n"); + return -1; + } +} + +/* + * TCK_PULL_DOWN + * function: Lower TCK + */ +static int TCK_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tck_down != NULL) { + return function_fmw_cpld.pull_tck_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TCK_PULL_UP + * function: High TCK + */ +static int TCK_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tck_up != NULL) { + return function_fmw_cpld.pull_tck_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_UP.\n"); + return -1; + } +} + +/* + * TMS_PULL_DOWN + * function: Lower TMS + */ +static int TMS_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tms_down != NULL) { + return function_fmw_cpld.pull_tms_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TMS_PULL_UP + * function: High TMS + */ +static int TMS_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tms_up != NULL) { + return function_fmw_cpld.pull_tms_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_UP.\n"); + return -1; + } +} + +/* + * TDO_READ + * function:Read the TDO level + */ +static int TDO_READ(void) +{ + if (function_fmw_cpld.read_tdo != NULL) { + return function_fmw_cpld.read_tdo(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDO_READ.\n"); + return -1; + } +} + +/* + * tap_test_logic_reset + * function: reset JTAG + * No matter what the original state of the controoler, it will enter + * Test_Logic_Reset when TMS is held high for at least five rising + * edges of TCK (16MHz) + * The controller remains in this state while TMS is high + */ +static void tap_test_logic_reset(void) +{ + int i; + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + + for (i = 0; i < 5; i++) { + TCK_PULL_UP(); + ndelay(TCK_DELAY); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + } + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_run_test_idle + * function: A controller state between scan operations.Once entered, the controller + * will remain in the Run_Test/Idle state as long as TMS is held low. + */ +static void tap_run_test_idle(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_select_dr_scan + * function :This is a temporary controller state in which all test data registers + * selected by the current instruction retain their previous state. + */ +static void tap_select_dr_scan(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_capture_dr + * function : In this controller state data may be parallel-loaded into test data + * register selected by the current instruction on the rising edge of TCK + */ +static void tap_capture_dr(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_shift_dr + * function: In this controller state.the test data register connected between TDI + * and TDO as a result of the current instruction shifts one stage + * toward its serial output on each rising edge of TCK. + */ +static void tap_shift_dr(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_exit1_dr + * function: This is a temporary controller state. + */ +static void tap_exit1_dr(int data) +{ + int j; + if (data) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + + /* need to idle here */ + for (j = 1; j < current_chip_index; j++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + } + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_update_dr + * function : Some test data registers may be provided with a latched parallel output to + * prevent changes at the parallel out-put while data is shifted in the + * associated whift-register path in response to certain instructions.Data is + * latched onto the parallel output of these test data registers from the + * shift-register path on the falling edge of TCK in the Update-DR controler state. + */ +static void tap_update_dr(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_select_ir_scan + * function:This is a temporarily controler state in which all test data register selected + * by the current instruction retain their previous state. + */ +static void tap_select_ir_scan(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_capture_ir + * function :In this controller state the shift-register contained in the instruction + * register loads a pattern of fixed logic values on the rising edge of + * TCK.design-specific data may be loaded into shift-register stages that + * are not required to be set to fixed values. + */ +static void tap_capture_ir(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_exit1_ir + * function : enter exit1 ir state. This is a temporary controller state. + */ +static void tap_exit1_ir(int data) +{ + if (data) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * tap_shift_ir + * function: In this controller state the shift-register contained in the instruction + * register is connected between TDI and TDO and shifts data one stage + * toward its serial output on each rising edge of TCK. + */ +static void tap_shift_ir(void) +{ + TMS_PULL_DOWN(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +/* + * The instruction shifted into the instruction register is latched onto the parallel output + * from the shift-register path on the falling edge of TCK in this controller state.Once the + * new instruction has been latched,it becomes the current instruction. + * + */ +static void tap_update_ir(void) +{ + TMS_PULL_UP(); + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); +} + +static void tap_send_instruction(int instruction, int ins_len) +{ + int i; + for (i = 0; i < (ins_len - 1); i++) { + if (instruction & 0x1) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + instruction = instruction >> 1; + } +} + +static void tap_send_data(int data, int data_len) +{ + int i; + for (i = 0; i < (data_len - 1); i++) { + if (data & 0x1) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + data = data >> 1; + } +} + +/* + * tap_rcv_byte + * function : Receive data from the device side + * @data : param[out] Received data */ +static void tap_rcv_byte(u8 *data) +{ + int i; + u8 rec_data = 0; + unsigned char tmp; + ndelay(TCK_DELAY); + for (i = 0; i < 8; i++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + tmp = TDO_READ(); + rec_data |= (tmp << i); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + } + *data = rec_data; +} + +/* + * tap_idle + * function :Used for state machine idling + */ +static void tap_idle(void) +{ + int i; + for (i = 0; i < 0x100; i++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + + /* Timely release of CPU */ + schedule(); + } +} + +/* + * jtag_read_data + * function :Read the JTAG output data + * @size: param[in] buffer size + * @data: param[out] read data buffer + */ +static void jtag_read_data(u8 *buf, int size) +{ + int i, j; + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_capture_dr(); + tap_shift_dr(); + for (j = current_chip_index; j < chip_num; j++) { + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + TCK_PULL_UP(); + ndelay(TCK_DELAY); + } + /* Receive data from the device side */ + for (i = 0; i < size; i++) { + tap_rcv_byte(&buf[i]); + } + /* JTAG state switching */ + tap_exit1_dr(0); + tap_update_dr(); + tap_run_test_idle(); +} + +/* + * jtag_send_instruction + * function :JTAG instruction sending interface + * @instruction: param[in] Instruction to be sent + * @ins_length: param[in] Instruction length + */ +static void jtag_send_instruction(int instruction, int ins_length) +{ + int i, j; + i = 1 << (ins_length - 1); + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_select_ir_scan(); + tap_capture_ir(); + tap_shift_ir(); + + for (j = chip_num; j > 1; j--) { + if (j == current_chip_index) { + tap_send_instruction(instruction, ins_length + 1); + } else { + tap_send_instruction(BYPASS, ins_length + 1); + } + } + + if (current_chip_index == 1) { + tap_send_instruction(instruction, ins_length); + /* Gets the highest bit of the instruction */ + tap_exit1_ir((instruction & i) >> (ins_length - 1)); + } else { + tap_send_instruction(BYPASS, ins_length); + /* Gets the highest bit of the instruction */ + tap_exit1_ir((BYPASS & i) >> (ins_length - 1)); + } + + /* JTAG state switching */ + tap_update_ir(); + tap_run_test_idle(); +} + +/* + * jtag_send_data + * function :JTAG data sending interface + * @buf : param[in] Data that needs to be sent + * @data_length: param[in] Data length + */ +static void jtag_send_data(unsigned int buf, int data_length) +{ + int i; + i = 1 << (data_length - 1); + + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_capture_dr(); + tap_shift_dr(); + tap_send_data(buf, data_length); + /* Gets the highest bit of the instruction */ + tap_exit1_dr((buf & i) >> (data_length - 1)); + tap_update_dr(); + tap_run_test_idle(); +} + +/* + * jtag_program_donebit + * JTAG programming end point */ +static void jtag_program_donebit(void) +{ + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + + switch (chip_cpld_info->id) { + case EPM240_G: + case EPM570_G: + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x7BFF, chip_cpld_info->data_register_length); + tap_idle(); + break; + case EPM1270_G: + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x7FFF, chip_cpld_info->data_register_length); + tap_idle(); + + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0xFFFF, chip_cpld_info->data_register_length); + tap_idle(); + + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0xFFBF, chip_cpld_info->data_register_length); + tap_idle(); + + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0xFFFF, chip_cpld_info->data_register_length); + tap_idle(); + break; + default: + break; + } /* End of switch */ +} + +/* + * jtag_rt_disable + * JTAG Disable state machine under Real-Time ISP + */ +static void jtag_rt_disable(void) +{ + jtag_send_instruction(RT_ISC_DISABLE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_instruction(BYPASS, CPLD_INSTRUCTION_SIZE); + tap_idle(); +} + +/* + * jtag_verify_idcode + * function :JTAG internal ID reading + */ +static void jtag_verify_idcode(void) +{ + int data, i; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->verify_idcode_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + for (i = 0; i < VERIFY_IDCODE_SIZE; i++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + + /* When validating the ID, the data is compared to the corresponding chip value, + which is retrieved from the BSDL file*/ + data = (buf[1] << 8) | buf[0]; + } +} + +/* + * jtag_rt_enable + * Enter Real-Time ISP mode; JTAG Enable State Machine under Real-Time ISP + */ +static void jtag_rt_enable(void) +{ + jtag_send_instruction(RT_ISC_ENABLE, CPLD_INSTRUCTION_SIZE); + tap_idle(); +} + +/* + * jtag_erase + * JTAG erases the timing + */ +static void jtag_erase(void) +{ + int i; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->first_erase_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + jtag_send_instruction(ISC_ERASE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + for (i = 0; i < ERASE_DELAY; i++) { + tap_idle(); + tap_idle(); + } + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->second_erase_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + jtag_send_instruction(ISC_ERASE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + for (i = 0; i < ERASE_DELAY; i++) { + tap_idle(); + tap_idle(); + } + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(chip_cpld_info->third_erase_addr, + chip_cpld_info->addr_register_length); + tap_idle(); + jtag_send_instruction(ISC_ERASE, CPLD_INSTRUCTION_SIZE); + tap_idle(); + for (i = 0; i < ERASE_DELAY; i++) { + tap_idle(); + tap_idle(); + } +} + +/* + * jtag_blank_check + * JTAG blank detection */ +static void jtag_blank_check(void) +{ + int j; + int data; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->first_blank_check_length; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + } + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x1, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->second_blank_check_length; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + } +} + +/* + * jtag_verify1 + * function :JTAG content validation + * @buffer : param[in] original data + * return value 0 validation success; -1 validation failed + */ +static int jtag_verify1(unsigned int *buffer) +{ + int j, ret = 0; + unsigned int data; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->eeprom_array_length; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + + if (data != buffer[j]) { + FIRMWARE_DRIVER_DEBUG_ERROR("%d: %02x, %02x.\n", j, data, buffer[j]); + ret = -1; + break; + } + } + return ret; +} + +/* + * jtag_read_buffer + * function:JTAG internal data reading + * @size: param[in] Read size + * @buffer: param[out] Pointer to read data + */ +static void jtag_read_buffer(unsigned int *buffer, int size) +{ + int j; + int data; + u8 buf[2]; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < size; j++) { + jtag_send_instruction(ISC_READ, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_read_data(buf, 2); + data = (buf[1] << 8) | buf[0]; + buffer[j] = data; + } +} + +/* + * jtag_program + * function:JTAG programming timing + * @buffer: param[in] data pointer to program + */ +static void jtag_program(unsigned int *buffer) +{ + int i, j; + + jtag_send_instruction(ISC_ADDRESS_SHIFT, CPLD_INSTRUCTION_SIZE); + tap_idle(); + jtag_send_data(0x0, chip_cpld_info->addr_register_length); + tap_idle(); + for (j = 0; j < chip_cpld_info->eeprom_array_length; j++) { + jtag_send_instruction(ISC_PROGRAM, CPLD_INSTRUCTION_SIZE); + tap_idle(); + + jtag_send_data(buffer[j], chip_cpld_info->data_register_length); + for (i = 0; i < PROGRAM_DELAY; i++) { + tap_idle(); + tap_idle(); + } + } +} + +/* + * cpld_read_id + * function: CPLD chip ID read + * @chip: param[in] chip index + * id : param[out] ID point */ +static void cpld_read_id(int chip, unsigned int *id) +{ + u8 data[sizeof(int)]; + if (!chip_num || chip > chip_num) { + return; + } + current_chip_index = chip; + /* Send instructions */ + jtag_send_instruction(IDCODE, CPLD_INSTRUCTION_SIZE); + /* Read Data */ + jtag_read_data(data, sizeof(int)); + *id = (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; +} + +/* + * chip_num_init + * function:CPLD number of chips initialized */ +static void chip_num_init(void) +{ + unsigned int i, id; + unsigned char buf[sizeof(int) * CPLD_MAX_CHIP]; + chip_num = 0; + + /* JTAG state switching */ + tap_run_test_idle(); + tap_select_dr_scan(); + tap_capture_dr(); + tap_shift_dr(); + + for (i = 0; i < sizeof(int) * CPLD_MAX_CHIP; i++) { + tap_rcv_byte(&buf[i]); + } + + /* JTAG state switching */ + tap_exit1_dr(0); + tap_update_dr(); + tap_run_test_idle(); + + for (i = 0; i < sizeof(int) * CPLD_MAX_CHIP; i += 4) { + id = (buf[i + 3] << 24) | (buf[i + 2] << 16) | (buf[i + 1] << 8) | buf[i]; + FIRMWARE_DRIVER_DEBUG_VERBOSE("ID: %04x\n", id); + if (id != 0xFFFFFFFF && id != 0) { + chip_num++; + } + } +} + +/* + * cpld_reset + * function: reset JTAG + * @chip: param[in] chip index + */ +static void cpld_reset(int chip) +{ + unsigned int chip_type_id = 0; + int i; + /* JTAG enters the reset state */ + tap_test_logic_reset(); + /* Gets the number of chips in the CPLD */ + chip_num_init(); + if (!chip_num) { + pr_notice("There is no CPLD chip or the chip is not supported!!\r\n"); + FIRMWARE_DRIVER_DEBUG_ERROR("chip_num == NULL.\n"); + } else { + FIRMWARE_DRIVER_DEBUG_VERBOSE("enter cpld read id.\n"); + current_chip_index = chip; + /* Read chip ID */ + cpld_read_id(current_chip_index, &chip_type_id); + FIRMWARE_DRIVER_DEBUG_VERBOSE("get cpld id: 0x%x.\n", chip_type_id); + for (i = 0; cpld_id_table[i].name != NULL; i++) { + if (cpld_id_table[i].id == chip_type_id) { + chip_cpld_info = &cpld_id_table[i]; + break; + } + } + } + current_chip_index = -1; + tap_test_logic_reset(); +} + +/* + * cpld_program + * function: CPLD programming interface + * @chip: param[in] Chip serial number/chip index + * @buffer: param[in] data pointer to program + * return value: 0 success; -1 fail + */ +static int cpld_program(int chip, unsigned int *buffer) +{ + int ret; + int counte; + + if (!chip_num || chip > chip_num + || chip_cpld_info == NULL) { + return -1; + } + current_chip_index = chip; + + /* Enter Real-Time ISP mode */ + jtag_rt_enable(); + /* JTAG internal ID reading */ + jtag_verify_idcode(); + /* JTAG erases */ + jtag_erase(); + /* JTAG blank detection */ + jtag_blank_check(); + /* JTAG programming timing */ + jtag_program(buffer); + + /* In the process of upgrade, there is a problem with reading data, + * which may occur in the process of reading. Some bit reading fails, + * but the reason is not found. + * Avoidance resolution: perform multiple checks */ + for (counte = 0; counte < 4; counte++) { + ret = jtag_verify1(buffer); + if (counte > 0) { + pr_notice("Verify again(%d).\n", counte + 1); + } + + if (ret == 0) { + break; + } + } + pr_notice("Write chip %d cpld success(%d).\n", chip, ret); + jtag_program_donebit(); + + /* JTAG Disable state machine under Real-Time ISP */ + jtag_rt_disable(); + + return ret; +} + +static void cpld_read_buffer(int chip, unsigned int *buffer, unsigned int size) +{ + if (!chip_num || chip > chip_num + || chip_cpld_info == NULL) { + return; + } + current_chip_index = chip; + + /* Enter Real-Time ISP mode */ + jtag_rt_enable(); + + /* JTAG internal ID reading */ + jtag_verify_idcode(); + + /* JTAG internal data reading */ + jtag_read_buffer(buffer, size); + + jtag_rt_disable(); + +} + +/* + * cpld_eeprom_size + * function:CPLD chip capacity size + * return value :Returns chip capacity on success, or 0 on failure + */ +static int cpld_eeprom_size(void) +{ + int ret; + + if (!chip_num || chip_cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("chip_num:%d or chip_cpld_info == NULL.\n", chip_num); + ret = 0; + } else { + ret = chip_cpld_info->eeprom_array_length; + FIRMWARE_DRIVER_DEBUG_ERROR("chip_cpld_info->eeprom_array_length = %d.\n", + chip_cpld_info->eeprom_array_length); + } + + return ret; +} + +/* + * cpld_read_name + * function: Gets the CPLD chip name + * @chip: param[in] Chip serial number/chip index + * return value :chip name */ +static char *cpld_read_name(int chip) +{ + uint chip_type_id; + int i; + + chip_type_id = 0; + cpld_read_id(chip, &chip_type_id); + for (i = 0; cpld_id_table[i].name != NULL; i++) { + if (cpld_id_table[i].id == chip_type_id) { + return cpld_id_table[i].name; + } + } + + return NULL; +} + +/* + * cpld_upgrade_init + * function:Initialize GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_init(void) +{ + int ret; + + if (function_fmw_cpld.init_cpld != NULL) { + ret = function_fmw_cpld.init_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +/* + * cpld_upgrade_finish + * function:Release GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_finish(void) +{ + int ret; + + if (function_fmw_cpld.finish_cpld != NULL) { + ret = function_fmw_cpld.finish_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +static int cpld_str_hex_to_dec(char *str, char end_char) +{ + int i; + int result; + + if (str == NULL) { + return FIRMWARE_FAILED; + } + + i = 0; + result = 0; + while (str[i] != end_char) { + /* Check for hexadecimal characters:0123456789abcdef */ + if (!isxdigit(str[i]) || i >= CPLD_UNIT_SZ) { + return FIRMWARE_FAILED; + } + /* Check for a number between 0 and 9 */ + if (isdigit(str[i])) { + result = result * CPLD_HEX + str[i] - '0'; + } + /* Check if the character is uppercase */ + else if (isupper(str[i])) { + result = result * CPLD_HEX + str[i] - 'A' + DEC_VAL; + } else { + result = result * CPLD_HEX + str[i] - 'a' + DEC_VAL; + } + + i++; + } + + return result; +} + +static int cpld_check_upgrade_data(char *src, int src_len, int *dst, int dst_len) +{ + int i, init_lcnt, tmp; + char *ptr; + int ret; + + if (src == NULL || dst == NULL) { + return FIRMWARE_FAILED; + } + /* Pointers the ptr pointer to the data following the CPLD_INIT_KEYWORD */ + ret = FIRMWARE_SUCCESS; + ptr = strstr(src, CPLD_INIT_KEYWORD); + if (ptr == NULL) { + return FIRMWARE_FAILED; + } else { + ptr += strlen(CPLD_INIT_KEYWORD); + while (*ptr == '(' || *ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + /* Converts a hexadecimal string to decimal, with 4 groups of 4 bytes each */ + i = 0; + init_lcnt = 0; + for (init_lcnt = 0; init_lcnt < CPLD_INIT_CNT; init_lcnt++) { + tmp = cpld_str_hex_to_dec(ptr, CPLD_END_CHAR); + if (tmp < 0) { + ret = tmp; + return ret; + } + /* int type is 4 bytes */ + dst[i++] = tmp; + if (i >= dst_len) { + return FIRMWARE_SUCCESS; + } + + ptr += CPLD_UNIT_SZ + 1; + + while (*ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + /* Point the ptr pointer to the data after CPLD_REPEAT_KEYWORD */ + ptr = strstr(src, CPLD_REPEAT_KEYWORD); + if (ptr == NULL) { + return FIRMWARE_FAILED; + } else { + ptr += strlen(CPLD_REPEAT_KEYWORD); + while (*ptr == '(' || *ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + while (1) { + /* Converts the 4 bytes before ',' to base 10 */ + tmp = cpld_str_hex_to_dec(ptr, CPLD_END_CHAR); + if (tmp < 0) { + ret = tmp; + break; + } + dst[i++] = tmp; + if (i >= dst_len) { + return FIRMWARE_SUCCESS; + } + + ptr += CPLD_UNIT_SZ + 1; + + while (*ptr == '\r' || *ptr == '\n') { + ptr++; + } + } + + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_get_chip_name + * function:get chip name + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @len: param[in] chip name length + * @info: param[out] chip name + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_get_chip_name(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int ret; + char *name; + + /* Check the input and output parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to get chip name.\n"); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit." + "(chain = %d, current chain = %d, current name: %s)\n", + chain, current_fmw_cpld->chain, current_fmw_cpld->devname); + } + + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error:Failed to get chip name when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG */ + cpld_reset(current_fmw_cpld->chip_index); + /* Read chip name */ + name = cpld_read_name(current_fmw_cpld->chip_index); + if (name == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get chip name when read name.(chain %d, index %d)\n", + chain, current_fmw_cpld->chip_index); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + /* Release GPIO */ + ret = cpld_upgrade_finish( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get chip name when finish upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + strncpy(info, name, len); + + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_program + * function:Upgrade CPLD(ISC file format) + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @info: param[in] Data to be written + * @len: param[in] Length of data to be written + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_program(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int i; + int time; + int ret; + int target_len; + int *target_buf; + + /* Check the input parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to program chip.\n"); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG */ + cpld_reset(current_fmw_cpld->chip_index); + /* CPLD chip capacity size */ + target_len = cpld_eeprom_size(); + if (target_len <= 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get cpld size.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + target_buf = (int *) kzalloc(target_len * sizeof(int), GFP_KERNEL); + if (target_buf == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to malloc target buffer.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("cpld_check_upgrade_data start.(chain = %d, %d)\n", + chain, target_len); + /* Remove extraneous information */ + ret = cpld_check_upgrade_data(info, len, target_buf, target_len); + if (ret < 0){ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to check data.(chain = %d)\n", + chain); + kfree(target_buf); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + for (i = 0; i < 16 * 8; i += 8) { + FIRMWARE_DRIVER_DEBUG_VERBOSE(" %x %x %x %x %x %x %x %x\n", + target_buf[i], target_buf[i + 1], + target_buf[i + 2], target_buf[i + 3], + target_buf[i + 4], target_buf[i + 5], + target_buf[i + 6], target_buf[i + 7]); + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("cpld_check_upgrade_data finish.(chain = %d)\n", chain); + + /* CPLD device writing */ + for (time = 0; time < 10; time++) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("Start upgrade cpld: %d.(chain = %d)\n", time, chain); + ret = cpld_program(current_fmw_cpld->chip_index, target_buf); + if (ret >= 0) { + break; + } + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program.(chain = %d)\n", chain); + kfree(target_buf); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("SUCCESS PROGRAM.\n"); + + /* Release GPIO */ + ret = cpld_upgrade_finish(); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program when finish upgrade.(chain = %d)\n", + chain); + } + + kfree(target_buf); + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_program_jbi + * function: Upgrade CPLD(JBI file format) + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @info: param[in] Data to be written + * @len: param[in] Length of data to be written + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_program_jbi(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int time, ret; + int argc = 3; + char *argv[] = { + "-r", + "-aprogram", + "-ddo_real_time_isp=1" + }; + + /* Check the input parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to program chip %d(%p,%p,%d).\n", + chain, cpld, info, len); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG */ + cpld_reset(current_fmw_cpld->chip_index); + + for (time = 0; time < 30; time++) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("Start upgrade cpld: %d.(chain = %d)\n", time, chain); + ret = jbi_main((unsigned char *) info, (unsigned long) len, argc, argv); + if (ret == 0) { + break; + } + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program.(chain = %d)\n", chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + FIRMWARE_DRIVER_DEBUG_VERBOSE("SUCCESS PROGRAM.\n"); + + /* Release GPIO and CPLD */ + ret = cpld_upgrade_finish( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program when finish upgrade.(chain = %d)\n", + chain); + } + + return FIRMWARE_SUCCESS; +} + +/** + * fmw_cpld_upg_get_version + * function: get version + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @len: param[in] Data length + * @info: param[out] Version information buffer + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_get_version(int chain, firmware_cpld_t *cpld, char *info, int len) +{ + int ret; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to get version.\n"); + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + + /* CPLD device can't get version */ + if (function_fmw_cpld.get_version != NULL) { + ret = function_fmw_cpld.get_version(chain, info, len); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed get version in chain: %d.\n", chain); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("The get_version is NULL in chain: %d.\n", chain); + } + + return FIRMWARE_FAILED; +} + +/** + * fmw_cpld_upg_get_chip_info + * function: Get chip content + * @chain: param[in] chain + * @cpld: param[in] Device private data + * @len: param[in] Data length + * @info: param[out] Read Data Buffer + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int fmw_cpld_upg_get_chip_info(int chain, firmware_cpld_t *cpld, void *info, int len) +{ + int i; + int ret; + int target_len; + int *target_buf; + + /* Check input and output parameters */ + if (chain < 0 || info == NULL || len <= 0) { + return FIRMWARE_FAILED; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to read chip.\n"); + + if (cpld == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to get gpio info.(chain = %d)\n", chain); + } else { + set_currrent_cpld_info(cpld); + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Cpld driver to read chip: %s.\n",current_fmw_cpld->devname); + if (chain != current_fmw_cpld->chain) { + FIRMWARE_DRIVER_DEBUG_ERROR("The chain num is not fit.(chain = %d, current chain = %d)\n", + chain, current_fmw_cpld->chain); + } + + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to program when init upgrade.(chain = %d)\n", + chain); + return FIRMWARE_FAILED; + } + + /* reset JTAG*/ + cpld_reset(current_fmw_cpld->chip_index); + /* CPLD chip capacity size */ + target_len = cpld_eeprom_size(); + if (target_len <= 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to get cpld size.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + + target_buf = (int *) kzalloc(target_len * sizeof(int), GFP_KERNEL); + if (target_buf == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to malloc target buffer.(chain = %d)\n", + chain); + cpld_upgrade_finish( ); + return FIRMWARE_FAILED; + } + /* Read chip */ + cpld_read_buffer(current_fmw_cpld->chip_index, target_buf, target_len); + + for (i = 0; i < 16 * 8; i += 8) { + FIRMWARE_DRIVER_DEBUG_VERBOSE(" %x %x %x %x %x %x %x %x\n", + target_buf[i], target_buf[i + 1], + target_buf[i + 2], target_buf[i + 3], + target_buf[i + 4], target_buf[i + 5], + target_buf[i + 6], target_buf[i + 7]); + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Success Read.\n"); + + /* Release GPIO and CPLD */ + ret = cpld_upgrade_finish( ); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to program when finish upgrade.(chain = %d)\n", + chain); + } + + if (copy_to_user(info, target_buf, (len > target_len) ? target_len : len)) { + kfree(target_buf); + return FIRMWARE_FAILED; + } + + kfree(target_buf); + return FIRMWARE_SUCCESS; +} + +/** + * jbi_jtag_io_ + * function: JBI GPIO operation + * @tms: param[in] TMS signal level + * @tdi: param[in] TDI signal level + * @read_tdo: param[in] Whether to read the level of the TDO + * return value : tdo + */ +int __attribute__ ((weak)) jbi_jtag_io_(int tms, int tdi, int read_tdo) +{ + int tdo = 0; + + if (tms) { + TMS_PULL_UP(); + } else { + TMS_PULL_DOWN(); + } + + if (tdi) { + TDI_PULL_UP(); + } else { + TDI_PULL_DOWN(); + } + + TCK_PULL_UP(); + ndelay(TCK_DELAY); + + if (read_tdo) { + tdo = TDO_READ(); + } + + TCK_PULL_DOWN(); + ndelay(TCK_DELAY); + + return tdo; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h new file mode 100644 index 0000000000..3a6ab117df --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware.h @@ -0,0 +1,82 @@ +#ifndef __FIRMWARE_H__ +#define __FIRMWARE_H__ + +#include +#include + +#include + +/* Debug switch level */ +typedef enum { + FIRWMARE_VERBOSE, + FIRWMARE_WARN, + FIRWMARE_ERROR, + FIRWMARE_END, +} firmware_debug_level_t; + +#define FIRMWARE_DRIVER_DEBUG_VERBOSE(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_VERBOSE)) { \ + printk(KERN_INFO "[FIRMWARW_DRIVER_CPLD][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_DRIVER_DEBUG_ERROR(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_ERROR)) { \ + printk(KERN_ERR "[FIRMWARW_DRIVER_CPLD][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_NAME_LEN 48 + +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS 0 + +/* ioctl publi command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ + +/* firmware cpld driver ioctl command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_TYPE 'J' +#define FIRMWARE_PROGRAM _IOW(FIRMWARE_TYPE, 1, char) /* firmware upgrade ISC */ +#define FIRMWARE_READ_CHIP _IOR(FIRMWARE_TYPE, 5, int) /* read the contents of the chip */ +#define FIRMWARE_PROGRAM_JBI _IOW(FIRMWARE_TYPE, 6, char) /* firmware upgrade JBI */ + +typedef struct cmd_info_s { + uint32_t size; + void __user *data; +} cmd_info_t; + +typedef struct firmware_device_s { + struct list_head list; /* device list */ + uint32_t chain; /* chain number */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct miscdevice dev; /* device */ + void *priv; /* private data */ +} firmware_device_t; + +typedef struct firmware_driver_s { + struct list_head list; /* list */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct platform_driver *drv; /* driver */ + void *priv; /* private data */ +} firmware_driver_t; + +extern int g_firmware_driver_debug; + +/* Get device information based on minor */ +extern firmware_device_t *firmware_get_device_by_minor(int minor); +/* Registere device */ +extern int firmware_device_register(firmware_device_t *fw_dev); +/* Unregister device */ +extern void firmware_device_unregister(firmware_device_t *fw_dev); +/* Registere driver */ +extern int firmware_driver_register(firmware_driver_t *fw_drv); +/* Unregister driver */ +extern void firmware_driver_unregister(firmware_driver_t *fw_drv); +/* CPLD upgrade initialized */ +extern int firmware_cpld_init(void); +/* CPLD unload function */ +extern void firmware_cpld_exit(void); + +#endif /* end of __FIRMWARE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h new file mode 100644 index 0000000000..ef69655a4b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/firmware_cpld.h @@ -0,0 +1,64 @@ +#ifndef __FIRMWARE_CPLD_H__ +#define __FIRMWARE_CPLD_H__ + +#define FIRMWARE_DEV_NAME_LEN 32 +#define FIRMWARE_MAX_CPLD_NUM 16 +#define FIRMWARE_TYPE_LEN 10 +#define FIRMWARE_EN_INFO_MAX 16 +#define FIRMWARE_EN_INFO_BUF 128 + +typedef struct firmware_gpio_jtag_en_s { + uint32_t en_gpio; /* GPIO enable pin */ + uint32_t en_level; /* GPIO enable level */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_gpio_jtag_en_t; + +typedef struct firmware_cpld_s { + char devname[FIRMWARE_DEV_NAME_LEN]; /* Device name */ + char type[FIRMWARE_TYPE_LEN]; /* interface type */ + uint32_t tdi; /* TDI signal corresponding to GPIO pin information */ + uint32_t tck; /* TCK signal corresponding to GPIO pin information */ + uint32_t tms; /* TMS signal corresponding to GPIO pin information */ + uint32_t tdo; /* TDO signal corresponding to GPIO pin information */ + uint32_t chain; /* chain num */ + uint32_t chip_index; /* chip index */ + uint32_t tck_delay; /* Delay time */ + uint32_t gpio_en_info_num; /* GPIO Enable Number */ + firmware_gpio_jtag_en_t gpio_en_info[FIRMWARE_EN_INFO_MAX]; /* GPIO Enable Information */ +} firmware_cpld_t; + +typedef struct firmware_cpld_function_s{ + int (*pull_tdi_up)(void); /* TDI pull-up */ + int (*pull_tdi_down)(void); /* TDI pull-down */ + int (*pull_tck_up)(void); /* TCK pull-up */ + int (*pull_tck_down)(void); /* TCK pull-down */ + int (*pull_tms_up)(void); /* TMS pull-up */ + int (*pull_tms_down)(void); /* TCK pull-down */ + int (*read_tdo)(void); /* Read TDO */ + int (*init_cpld)(void); /* CPLD upgrade initializes the operation */ + int (*init_chip)(int chain); /* chip initializes the operation */ + int (*finish_chip)(int chain); /* chip completes the operation*/ + int (*finish_cpld)(void); /* CPLD upgrade completes the operation */ + int (*get_version)(int chain, char *ver, int len); /* get version */ +}firmware_cpld_function_t; + +/* get chip name */ +extern int fmw_cpld_upg_get_chip_name(int chain, firmware_cpld_t *cpld, char *info, int len); +/* ISC firmware upgrad */ +extern int fmw_cpld_upg_program(int chain, firmware_cpld_t *cpld, char *info, int len); +/* get version */ +extern int fmw_cpld_upg_get_version(int chain, firmware_cpld_t *cpld, char *info, int len); +/* Read the contents of Chip */ +extern int fmw_cpld_upg_get_chip_info(int chain, firmware_cpld_t *cpld, void *info, int len); +/* operate TDI */ +extern int fwm_cpld_tdi_op(int value); +/* operate TCK */ +extern int fwm_cpld_tck_op(int value); +/* operate TMS */ +extern int fwm_cpld_tms_op(int value); +/* operate TDO */ +extern int fwm_cpld_tdo_op(void); +/* JBI firmware upgrad */ +extern int fmw_cpld_upg_program_jbi(int chain, firmware_cpld_t *cpld, char *info, int len); + +#endif /* __FIRMWARE_CPLD_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h new file mode 100644 index 0000000000..865c8d3521 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/include/jbi.h @@ -0,0 +1,15 @@ +#ifndef __JBI_H__ +#define __JBI_H__ + +#include + +/* JTAG operation interface*/ +extern int jbi_jtag_io_(int tms, int tdi, int read_tdo); +/* delay function */ +extern void jbi_jtag_udelay(unsigned long us); +/* Debug switch */ +extern int jbi_debug(int level); +/* JBI upgrade function */ +extern int jbi_main(unsigned char *addr, unsigned long size, int argc, char * const argv[]); + +#endif /* __JBI_JTAG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c new file mode 100644 index 0000000000..064d0ae50e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.c @@ -0,0 +1,438 @@ +/****************************************************************************/ +/* */ +/* Module: jbicomp.c */ +/* */ +/* Copyright (C) Altera Corporation 1997-2001 */ +/* */ +/* Description: Contains the code for compressing and uncompressing */ +/* Boolean array data. */ +/* */ +/* This algorithm works by searching previous bytes in the */ +/* data that match the current data. If a match is found, */ +/* then the offset and length of the matching data can */ +/* replace the actual data in the output. */ +/* */ +/* Revisions: 2.2 fixed /W4 warnings */ +/* */ +/****************************************************************************/ + +#include "jbiport.h" +#include "jbiexprt.h" +#include "jbicomp.h" +#include "jbistub.h" + +#define SHORT_BITS 16 +#define CHAR_BITS 8 +#define DATA_BLOB_LENGTH 3 +#define MATCH_DATA_LENGTH 8192 +#define JBI_ACA_REQUEST_SIZE 1024 +#define JBI_ACA_BUFFER_SIZE (MATCH_DATA_LENGTH + JBI_ACA_REQUEST_SIZE) + +unsigned long jbi_in_length = 0L; +unsigned long jbi_in_index = 0L; /* byte index into compressed array */ +unsigned int jbi_bits_avail = CHAR_BITS; + +#if PORT == DOS +int jbi_current_variable_id = -1; +int jbi_current_page = -1; +int jbi_version = 0; +unsigned long jbi_out_length = 0L; +unsigned int jbi_out_index = 0; /* byte index into jbi_aca_out_buffer[] */ +unsigned long jbi_aca_in_offset = 0L; +unsigned char jbi_aca_out_buffer[JBI_ACA_BUFFER_SIZE]; +#endif + +/****************************************************************************/ +/* */ +/* The following functions implement incremental decompression of Boolean */ +/* array data, using a small memory window. */ +/* */ +/* This algorithm works by searching previous bytes in the data that match */ +/* the current data. If a match is found, then the offset and length of */ +/* the matching data can replace the actual data in the output. */ +/* */ +/* Memory usage is reduced by maintaining a "window" buffer which contains */ +/* the uncompressed data for one 8K page, plus some extra amount specified */ +/* by JBI_ACA_REQUEST_SIZE. The function jbi_uncompress_page() is used to */ +/* request a subrange of the uncompressed data, starting at a particular */ +/* bit position and extending a maximum of JBI_ACA_REQUEST_SIZE bytes. */ +/* */ +/****************************************************************************/ + +/****************************************************************************/ +/* */ + +unsigned int jbi_bits_required(unsigned int n) + +/* */ +/* Description: Calculate the minimum number of bits required to */ +/* represent n. */ +/* */ +/* Returns: Number of bits. */ +/* */ +/****************************************************************************/ +{ + unsigned int result = SHORT_BITS; + + if (n == 0) + { + result = 1; + } + else + { + /* Look for the highest non-zero bit position */ + while ((n & (1 << (SHORT_BITS - 1))) == 0) + { + n <<= 1; + --result; + } + } + + return (result); +} + +/****************************************************************************/ +/* */ + +unsigned int jbi_read_packed +( +#if PORT!=DOS + unsigned char *buffer, +#endif + unsigned int bits +) + +/* */ +/* Description: Read the next value from the input array "buffer". */ +/* Read only "bits" bits from the array. The amount of */ +/* bits that have already been read from "buffer" is */ +/* stored internally to this function. */ +/* */ +/* Returns: Up to 16 bit value. -1 if buffer overrun. */ +/* */ +/****************************************************************************/ +{ + unsigned int result = 0; + unsigned int shift = 0; + unsigned int databyte = 0; + + while (bits > 0) + { +#if PORT==DOS + databyte = GET_BYTE(jbi_aca_in_offset + jbi_in_index); +#else + databyte = buffer[jbi_in_index]; +#endif + result |= (((databyte >> (CHAR_BITS - jbi_bits_avail)) + & (0xFF >> (CHAR_BITS - jbi_bits_avail))) << shift); + + if (bits <= jbi_bits_avail) + { + result &= (0xFFFF >> (SHORT_BITS - (bits + shift))); + jbi_bits_avail -= bits; + bits = 0; + } + else + { + ++jbi_in_index; + shift += jbi_bits_avail; + bits -= jbi_bits_avail; + jbi_bits_avail = CHAR_BITS; + } + } + + return (result); +} + +#if PORT==DOS + +/****************************************************************************/ +/* */ + +void jbi_uncompress_next_page(int version) + +/* */ +/* Description: Uncompresses one page of compressed data, using */ +/* data page as reference for repeated sections. */ +/* Overwrites previous page of data in buffer. */ +/* */ +/* Returns: TRUE for success, FALSE if error encountered */ +/* */ +/****************************************************************************/ +{ + unsigned int i, j, offset, length; + unsigned int end_index; + unsigned long tmp_in_index = jbi_in_index; + unsigned int tmp_out_index = jbi_out_index; + unsigned int tmp_bits_avail = jbi_bits_avail; + unsigned int prev[3]; + unsigned long long_end; + unsigned int match_data_length = MATCH_DATA_LENGTH; + + if (version > 0) --match_data_length; + + if (jbi_current_page < 0) + { + /* this is the first page of the array */ + jbi_current_page = 0; + jbi_in_index = 4; /* skip over length field */ + jbi_out_index = 0; + end_index = (jbi_out_length < JBI_ACA_BUFFER_SIZE) ? + (unsigned int) jbi_out_length : JBI_ACA_BUFFER_SIZE; + } + else + { + /* this is not the first page */ + ++jbi_current_page; + jbi_out_index -= MATCH_DATA_LENGTH; + long_end = jbi_out_length - + ((long) jbi_current_page * (long) MATCH_DATA_LENGTH); + end_index = (long_end < JBI_ACA_BUFFER_SIZE) ? + (unsigned int) long_end : JBI_ACA_BUFFER_SIZE; + + /* copy extra data from end of circular buffer to beginning */ + for (i = 0; i < jbi_out_index; ++i) + { + jbi_aca_out_buffer[i] = jbi_aca_out_buffer[i + MATCH_DATA_LENGTH]; + } + } + + while (jbi_out_index < end_index) + { + /* save state so we can undo the last packet when we reach the end */ + tmp_in_index = jbi_in_index; + tmp_out_index = jbi_out_index; + tmp_bits_avail = jbi_bits_avail; + + /* A 0 bit indicates literal data. */ + if (jbi_read_packed(1) == 0) + { + for (i = 0; i < DATA_BLOB_LENGTH; ++i) + { + if (jbi_out_index < end_index) + { + if (version == 0) + { + prev[i] = jbi_aca_out_buffer[jbi_out_index] & 0xff; + } + jbi_aca_out_buffer[jbi_out_index++] = + (unsigned char) jbi_read_packed(CHAR_BITS); + } + } + } + else + { + /* A 1 bit indicates offset/length to follow. */ + offset = jbi_read_packed(jbi_bits_required( + (jbi_current_page > 0) ? match_data_length : + (jbi_out_index > match_data_length ? match_data_length : + jbi_out_index))); + length = jbi_read_packed(CHAR_BITS); + + if ((version == 0) && (offset == match_data_length + 3)) + { + jbi_aca_out_buffer[jbi_out_index++] = (unsigned char) prev[0]; + jbi_aca_out_buffer[jbi_out_index++] = (unsigned char) prev[1]; + jbi_aca_out_buffer[jbi_out_index++] = (unsigned char) prev[2]; + length -= 3; + } + + for (i = 0; i < length; ++i) + { + if (jbi_out_index < end_index) + { + if (offset > jbi_out_index) + { + j = jbi_out_index + MATCH_DATA_LENGTH - offset; + } + else j = jbi_out_index - offset; + jbi_aca_out_buffer[jbi_out_index] = jbi_aca_out_buffer[j]; + ++jbi_out_index; + } + } + + if (version == 0) + { + prev[0] = jbi_aca_out_buffer[jbi_out_index - 3] & 0xff; + prev[1] = jbi_aca_out_buffer[jbi_out_index - 2] & 0xff; + prev[2] = jbi_aca_out_buffer[jbi_out_index - 1] & 0xff; + } + } + } + + /* restore the state before the previous packet */ + jbi_in_index = tmp_in_index; + jbi_out_index = tmp_out_index; + jbi_bits_avail = tmp_bits_avail; +} + +/****************************************************************************/ +/* */ + +void jbi_uncompress_page +( + int variable_id, + int page, + int version +) + +/* */ +/* Description: Uncompress requested page of variable data. Stores */ +/* uncompressed data in jbi_aca_out_buffer[]. */ +/* */ +/* Returns: TRUE if successful, otherwise FALSE if: */ +/* 1) variable is not a compressed array */ +/* 2) compressed data is illegal or corrupted */ +/* 3) requested page is beyond the end of the array */ +/* 4) internal error in the code */ +/* */ +/****************************************************************************/ +{ + unsigned long symbol_table; + unsigned long data_section; + unsigned long offset; + unsigned long value; + int delta = version * 2; + + if (variable_id != jbi_current_variable_id) + { + /* initialize to uncompress the desired variable */ + symbol_table = GET_DWORD(16 + (version * 8)); + data_section = GET_DWORD(20 + (version * 8)); + offset = symbol_table + ((11 + delta) * variable_id); + value = GET_DWORD(offset + 3 + delta); + jbi_current_variable_id = variable_id; + jbi_current_page = -1; + jbi_bits_avail = CHAR_BITS; + jbi_in_length = GET_DWORD(offset + 7 + delta); + jbi_out_length = + (((unsigned long) GET_BYTE(data_section + value)) | + (((unsigned long) GET_BYTE(data_section + value + 1)) << 8) | + (((unsigned long) GET_BYTE(data_section + value + 2)) << 16) | + (((unsigned long) GET_BYTE(data_section + value + 3)) << 24)); + jbi_in_index = 4; /* skip over length field */ + jbi_out_index = 0; + jbi_aca_in_offset = data_section + value; + } + + /* to look back at an earlier page, start over at the beginning */ + if (page < jbi_current_page) + { + jbi_current_page = -1; + jbi_in_index = 4; /* skip over length field */ + jbi_bits_avail = CHAR_BITS; + } + + /* uncompress sequentially up to the desired page */ + while (page > jbi_current_page) + { + jbi_uncompress_next_page(version); + } +} + +#else + +/****************************************************************************/ +/* */ + +unsigned long jbi_uncompress +( + unsigned char *in, + unsigned long in_length, + unsigned char *out, + unsigned long out_length, + int version +) + +/* */ +/* Description: Uncompress data in "in" and write result to "out". */ +/* */ +/* Returns: Length of uncompressed data. -1 if: */ +/* 1) out_length is too small */ +/* 2) Internal error in the code */ +/* 3) in doesn't contain ACA compressed data. */ +/* */ +/****************************************************************************/ +{ +#ifdef CONFIG_64BIT + unsigned int data_length = 0; +#else + unsigned long data_length = 0L; +#endif + unsigned long i, j; + unsigned int offset, length; + unsigned int match_data_length = MATCH_DATA_LENGTH; + + if (version > 0) --match_data_length; + + jbi_in_length = in_length; + jbi_bits_avail = CHAR_BITS; + jbi_in_index = 0L; + for (i = 0; i < out_length; ++i) out[i] = 0; + + /* Read number of bytes in data. */ +#ifdef CONFIG_64BIT + for (i = 0; i < sizeof(unsigned int); ++i) + { + data_length = data_length | ((unsigned int) + jbi_read_packed(in, CHAR_BITS) << (i * CHAR_BITS)); + } +#else + for (i = 0; i < sizeof (in_length); ++i) + { + data_length = data_length | ((unsigned long) + jbi_read_packed(in, CHAR_BITS) << (i * CHAR_BITS)); + } +#endif + + if (data_length > out_length) + { +#ifdef CONFIG_64BIT + jbi_dbg(DEBUG_ERR, "data_length(0x%x,0x%lx)\n", + data_length, out_length); + data_length = 0; +#else + jbi_dbg(DEBUG_ERR, "data_length(0x%lx,0x%lx)\n", + data_length, out_length); + data_length = 0L; +#endif + } + else + { + i = 0; + while (i < data_length) + { + /* A 0 bit indicates literal data. */ + if (jbi_read_packed(in, 1) == 0) + { + for (j = 0; j < DATA_BLOB_LENGTH; ++j) + { + if (i < data_length) + { + out[i] = (unsigned char) jbi_read_packed(in, CHAR_BITS); + i++; + } + } + } + else + { + /* A 1 bit indicates offset/length to follow. */ + offset = jbi_read_packed(in, jbi_bits_required((short) (i > match_data_length ? match_data_length : i))); + length = jbi_read_packed(in, CHAR_BITS); + + for (j = 0; j < length; ++j) + { + if (i < data_length) + { + out[i] = out[i - offset]; + i++; + } + } + } + } + } + + return (data_length); +} + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h new file mode 100644 index 0000000000..4dacdcd5d7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbicomp.h @@ -0,0 +1,37 @@ +/****************************************************************************/ +/* */ +/* Module: jbicomp.h */ +/* */ +/* Copyright (C) Altera Corporation 1997-2001 */ +/* */ +/* Description: Contains the function prototypes for compressing */ +/* and uncompressing Boolean array data. */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBICOMP_H +#define INC_JBICOMP_H + +#if PORT==DOS + +void jbi_uncompress_page +( + int variable_id, + int page, + int version +); + +#else + +unsigned long jbi_uncompress +( + unsigned char *in, + unsigned long in_length, + unsigned char *out, + unsigned long out_length, + int version +); + +#endif /* PORT==DOS */ + +#endif /* INC_JBICOMP_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h new file mode 100644 index 0000000000..ef4699dd6d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiexprt.h @@ -0,0 +1,224 @@ +/****************************************************************************/ +/* */ +/* Module: jbiexprt.h */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Jam STAPL ByteCode Player Export Header File */ +/* */ +/* Revisions: */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBIEXPRT_H +#define INC_JBIEXPRT_H + +/****************************************************************************/ +/* */ +/* Return codes from most JBI functions */ +/* */ +/****************************************************************************/ + +#define JBI_RETURN_TYPE int + +#define JBIC_SUCCESS 0 +#define JBIC_OUT_OF_MEMORY 1 +#define JBIC_IO_ERROR 2 +/* #define JAMC_SYNTAX_ERROR 3 */ +#define JBIC_UNEXPECTED_END 4 +#define JBIC_UNDEFINED_SYMBOL 5 +/* #define JAMC_REDEFINED_SYMBOL 6 */ +#define JBIC_INTEGER_OVERFLOW 7 +#define JBIC_DIVIDE_BY_ZERO 8 +#define JBIC_CRC_ERROR 9 +#define JBIC_INTERNAL_ERROR 10 +#define JBIC_BOUNDS_ERROR 11 +/* #define JAMC_TYPE_MISMATCH 12 */ +/* #define JAMC_ASSIGN_TO_CONST 13 */ +/* #define JAMC_NEXT_UNEXPECTED 14 */ +/* #define JAMC_POP_UNEXPECTED 15 */ +/* #define JAMC_RETURN_UNEXPECTED 16 */ +/* #define JAMC_ILLEGAL_SYMBOL 17 */ +#define JBIC_VECTOR_MAP_FAILED 18 +#define JBIC_USER_ABORT 19 +#define JBIC_STACK_OVERFLOW 20 +#define JBIC_ILLEGAL_OPCODE 21 +/* #define JAMC_PHASE_ERROR 22 */ +/* #define JAMC_SCOPE_ERROR 23 */ +#define JBIC_ACTION_NOT_FOUND 24 + +/****************************************************************************/ +/* */ +/* Macro Definitions */ +/* */ +/****************************************************************************/ + +/* +* For DOS port, program data is stored in a set of 16K pages, accessed +* through a pointer table. For 32-bit version, the buffer is continuous. +* The macro GET_BYTE gets a single byte for either case. +*/ +#if PORT==DOS +#define PROGRAM_PTR unsigned char ** +#else +#define PROGRAM_PTR unsigned char * +#endif + +#if PORT==DOS +#define GET_BYTE(x) (jbi_program[(x) >> 14L][(x) & 0x3fffL]) +#else +#define GET_BYTE(x) (program[x]) +#endif + +#define GET_WORD(x) \ + (((((unsigned short) GET_BYTE(x)) << 8) & 0xFF00) | \ + (((unsigned short) GET_BYTE((x)+1)) & 0x00FF)) + +#define GET_DWORD(x) \ + (((((unsigned long) GET_BYTE(x)) << 24L) & 0xFF000000L) | \ + ((((unsigned long) GET_BYTE((x)+1)) << 16L) & 0x00FF0000L) | \ + ((((unsigned long) GET_BYTE((x)+2)) << 8L) & 0x0000FF00L) | \ + (((unsigned long) GET_BYTE((x)+3)) & 0x000000FFL)) + +/****************************************************************************/ +/* */ +/* Structured Types */ +/* */ +/****************************************************************************/ + +typedef struct JBI_PROCINFO_STRUCT +{ + char *name; + unsigned char attributes; + struct JBI_PROCINFO_STRUCT *next; +} +JBI_PROCINFO; + +/****************************************************************************/ +/* */ +/* Global Data Prototypes */ +/* */ +/****************************************************************************/ + +#if PORT==DOS +extern unsigned char jbi_aca_out_buffer[8192 + 1024]; +#endif + +extern PROGRAM_PTR jbi_program; + +extern char *jbi_workspace; + +extern long jbi_workspace_size; + +/****************************************************************************/ +/* */ +/* Function Prototypes */ +/* */ +/****************************************************************************/ + +JBI_RETURN_TYPE jbi_execute +( + PROGRAM_PTR program, + long program_size, + char *workspace, + long workspace_size, + char *action, + char **init_list, + int reset_jtag, + long *error_address, + int *exit_code, + int *format_version +); + +JBI_RETURN_TYPE jbi_get_note +( + PROGRAM_PTR program, + long program_size, + long *offset, + char *key, + char *value, + int length +); + +JBI_RETURN_TYPE jbi_check_crc +( + PROGRAM_PTR program, + long program_size, + unsigned short *expected_crc, + unsigned short *actual_crc +); + +JBI_RETURN_TYPE jbi_get_file_info +( + PROGRAM_PTR program, + long program_size, + int *format_version, + int *action_count, + int *procedure_count +); + +JBI_RETURN_TYPE jbi_get_action_info +( + PROGRAM_PTR program, + long program_size, + int index, + char **name, + char **description, + JBI_PROCINFO **procedure_list +); + +int jbi_jtag_io +( + int tms, + int tdi, + int read_tdo +); + +void jbi_message +( + char *message_text +); + +void jbi_export_integer +( + char *key, + long value +); + +void jbi_export_boolean_array +( + char *key, + unsigned char *data, + long count +); + +void jbi_delay +( + long microseconds +); + +int jbi_vector_map +( + int signal_count, + char **signals +); + +int jbi_vector_io +( + int signal_count, + long *dir_vect, + long *data_vect, + long *capture_vect +); + +void *jbi_malloc +( + unsigned int size +); + +void jbi_free +( + void *ptr +); + +#endif /* INC_JBIEXPRT_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c new file mode 100644 index 0000000000..f013100eec --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.c @@ -0,0 +1,1679 @@ +/****************************************************************************/ +/* */ +/* Module: jbijtag.c */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Contains JTAG interface functions */ +/* */ +/* Revisions: 2.2 updated state transition paths */ +/* 2.0 added multi-page scan code for 16-bit PORT */ +/* */ +/****************************************************************************/ + +#include "jbiport.h" +#include "jbiexprt.h" +#include "jbicomp.h" +#include "jbijtag.h" + +#define NULL 0 + +char *jbi_workspace = NULL; +long jbi_workspace_size = 0L; + +/****************************************************************************/ +/* */ +/* Enumerated Types */ +/* */ +/****************************************************************************/ + +/* maximum JTAG IR and DR lengths (in bits) */ +#define JBIC_MAX_JTAG_IR_PREAMBLE 256 +#define JBIC_MAX_JTAG_IR_POSTAMBLE 256 +#define JBIC_MAX_JTAG_IR_LENGTH 512 +#define JBIC_MAX_JTAG_DR_PREAMBLE 1024 +#define JBIC_MAX_JTAG_DR_POSTAMBLE 1024 +#define JBIC_MAX_JTAG_DR_LENGTH 2048 + +/* +* Global variable to store the current JTAG state +*/ +JBIE_JTAG_STATE jbi_jtag_state = JBI_ILLEGAL_JTAG_STATE; + +/* +* Store current stop-state for DR and IR scan commands +*/ +JBIE_JTAG_STATE jbi_drstop_state = IDLE; +JBIE_JTAG_STATE jbi_irstop_state = IDLE; + +/* +* Store current padding values +*/ +unsigned int jbi_dr_preamble = 0; +unsigned int jbi_dr_postamble = 0; +unsigned int jbi_ir_preamble = 0; +unsigned int jbi_ir_postamble = 0; +unsigned int jbi_dr_length = 0; +unsigned int jbi_ir_length = 0; +unsigned char *jbi_dr_preamble_data = NULL; +unsigned char *jbi_dr_postamble_data = NULL; +unsigned char *jbi_ir_preamble_data = NULL; +unsigned char *jbi_ir_postamble_data = NULL; +unsigned char *jbi_dr_buffer = NULL; +unsigned char *jbi_ir_buffer = NULL; + +/* +* This structure shows, for each JTAG state, which state is reached after +* a single TCK clock cycle with TMS high or TMS low, respectively. This +* describes all possible state transitions in the JTAG state machine. +*/ +struct JBIS_JTAG_MACHINE +{ + JBIE_JTAG_STATE tms_high; + JBIE_JTAG_STATE tms_low; +} jbi_jtag_state_transitions[] = +{ +/* RESET */ { RESET, IDLE }, +/* IDLE */ { DRSELECT, IDLE }, +/* DRSELECT */ { IRSELECT, DRCAPTURE }, +/* DRCAPTURE */ { DREXIT1, DRSHIFT }, +/* DRSHIFT */ { DREXIT1, DRSHIFT }, +/* DREXIT1 */ { DRUPDATE, DRPAUSE }, +/* DRPAUSE */ { DREXIT2, DRPAUSE }, +/* DREXIT2 */ { DRUPDATE, DRSHIFT }, +/* DRUPDATE */ { DRSELECT, IDLE }, +/* IRSELECT */ { RESET, IRCAPTURE }, +/* IRCAPTURE */ { IREXIT1, IRSHIFT }, +/* IRSHIFT */ { IREXIT1, IRSHIFT }, +/* IREXIT1 */ { IRUPDATE, IRPAUSE }, +/* IRPAUSE */ { IREXIT2, IRPAUSE }, +/* IREXIT2 */ { IRUPDATE, IRSHIFT }, +/* IRUPDATE */ { DRSELECT, IDLE } +}; + +/* +* This table contains the TMS value to be used to take the NEXT STEP on +* the path to the desired state. The array index is the current state, +* and the bit position is the desired endstate. To find out which state +* is used as the intermediate state, look up the TMS value in the +* jbi_jtag_state_transitions[] table. +*/ +unsigned short jbi_jtag_path_map[16] = +{ +/* RST RTI SDRS CDR SDR E1DR PDR E2DR */ + 0x0001, 0xFFFD, 0xFE01, 0xFFE7, 0xFFEF, 0xFF0F, 0xFFBF, 0xFFFF, +/* UDR SIRS CIR SIR E1IR PIR E2IR UIR */ + 0xFEFD, 0x0001, 0xF3FF, 0xF7FF, 0x87FF, 0xDFFF, 0xFFFF, 0x7FFD +}; + +/* +* Flag bits for jbi_jtag_io() function +*/ +#define TMS_HIGH 1 +#define TMS_LOW 0 +#define TDI_HIGH 1 +#define TDI_LOW 0 +#define READ_TDO 1 +#define IGNORE_TDO 0 + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_init_jtag() + +/* */ +/****************************************************************************/ +{ + /* initial JTAG state is unknown */ + jbi_jtag_state = JBI_ILLEGAL_JTAG_STATE; + + /* initialize global variables to default state */ + jbi_drstop_state = IDLE; + jbi_irstop_state = IDLE; + jbi_dr_preamble = 0; + jbi_dr_postamble = 0; + jbi_ir_preamble = 0; + jbi_ir_postamble = 0; + jbi_dr_length = 0; + jbi_ir_length = 0; + + if (jbi_workspace != NULL) + { + jbi_dr_preamble_data = (unsigned char *) jbi_workspace; + jbi_dr_postamble_data = &jbi_dr_preamble_data[JBIC_MAX_JTAG_DR_PREAMBLE / 8]; + jbi_ir_preamble_data = &jbi_dr_postamble_data[JBIC_MAX_JTAG_DR_POSTAMBLE / 8]; + jbi_ir_postamble_data = &jbi_ir_preamble_data[JBIC_MAX_JTAG_IR_PREAMBLE / 8]; + jbi_dr_buffer = &jbi_ir_postamble_data[JBIC_MAX_JTAG_IR_POSTAMBLE / 8]; + jbi_ir_buffer = &jbi_dr_buffer[JBIC_MAX_JTAG_DR_LENGTH / 8]; + } + else + { + jbi_dr_preamble_data = NULL; + jbi_dr_postamble_data = NULL; + jbi_ir_preamble_data = NULL; + jbi_ir_postamble_data = NULL; + jbi_dr_buffer = NULL; + jbi_ir_buffer = NULL; + } + + return (JBIC_SUCCESS); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_drstop_state +( + JBIE_JTAG_STATE state +) + +/* */ +/****************************************************************************/ +{ + jbi_drstop_state = state; + + return (JBIC_SUCCESS); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_irstop_state +( + JBIE_JTAG_STATE state +) + +/* */ +/****************************************************************************/ +{ + jbi_irstop_state = state; + + return (JBIC_SUCCESS); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_dr_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_DR_PREAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_preamble = count; + } + } + else + { + if (count > jbi_dr_preamble) + { + jbi_free(jbi_dr_preamble_data); + jbi_dr_preamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_dr_preamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_preamble = count; + } + } + else + { + jbi_dr_preamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (preamble_data == NULL) + { + jbi_dr_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (preamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_dr_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_dr_preamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_ir_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_IR_PREAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_preamble = count; + } + } + else + { + if (count > jbi_ir_preamble) + { + jbi_free(jbi_ir_preamble_data); + jbi_ir_preamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_ir_preamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_preamble = count; + } + } + else + { + jbi_ir_preamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (preamble_data == NULL) + { + jbi_ir_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (preamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_ir_preamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_ir_preamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_dr_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_DR_POSTAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_postamble = count; + } + } + else + { + if (count > jbi_dr_postamble) + { + jbi_free(jbi_dr_postamble_data); + jbi_dr_postamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_dr_postamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_postamble = count; + } + } + else + { + jbi_dr_postamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (postamble_data == NULL) + { + jbi_dr_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (postamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_dr_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_dr_postamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_set_ir_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +) + +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int i; + unsigned int j; + + if (jbi_workspace != NULL) + { + if (count > JBIC_MAX_JTAG_IR_POSTAMBLE) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_postamble = count; + } + } + else + { + if (count > jbi_ir_postamble) + { + jbi_free(jbi_ir_postamble_data); + jbi_ir_postamble_data = (unsigned char *) jbi_malloc((count + 7) >> 3); + + if (jbi_ir_postamble_data == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_postamble = count; + } + } + else + { + jbi_ir_postamble = count; + } + } + + if (status == JBIC_SUCCESS) + { + for (i = 0; i < count; ++i) + { + j = i + start_index; + + if (postamble_data == NULL) + { + jbi_ir_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + if (postamble_data[j >> 3] & (1 << (j & 7))) + { + jbi_ir_postamble_data[i >> 3] |= (1 << (i & 7)); + } + else + { + jbi_ir_postamble_data[i >> 3] &= + ~(unsigned int) (1 << (i & 7)); + } + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_jtag_reset_idle(void) + +/* */ +/****************************************************************************/ +{ + int i; + + /* + * Go to Test Logic Reset (no matter what the starting state may be) + */ + for (i = 0; i < 5; ++i) + { + jbi_jtag_io(TMS_HIGH, TDI_LOW, IGNORE_TDO); + } + + /* + * Now step to Run Test / Idle + */ + jbi_jtag_io(TMS_LOW, TDI_LOW, IGNORE_TDO); + + jbi_jtag_state = IDLE; +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_goto_jtag_state +( + JBIE_JTAG_STATE state +) + +/* */ +/****************************************************************************/ +{ + int tms; + int count = 0; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned int tmp_state; + + if (jbi_jtag_state == JBI_ILLEGAL_JTAG_STATE) + { + /* initialize JTAG chain to known state */ + jbi_jtag_reset_idle(); + } + + if (jbi_jtag_state == state) + { + /* + * We are already in the desired state. If it is a stable state, + * loop here. Otherwise do nothing (no clock cycles). + */ + if ((state == IDLE) || + (state == DRSHIFT) || + (state == DRPAUSE) || + (state == IRSHIFT) || + (state == IRPAUSE)) + { + jbi_jtag_io(TMS_LOW, TDI_LOW, IGNORE_TDO); + } + else if (state == RESET) + { + jbi_jtag_io(TMS_HIGH, TDI_LOW, IGNORE_TDO); + } + } + else + { + while ((jbi_jtag_state != state) && (count < 9)) + { + /* + * Get TMS value to take a step toward desired state + */ + if (state < 0) { + tmp_state = 0; + } else { + tmp_state = state; + } + tms = (jbi_jtag_path_map[jbi_jtag_state] & (1 << tmp_state)) ? + TMS_HIGH : TMS_LOW; + + /* + * Take a step + */ + jbi_jtag_io(tms, TDI_LOW, IGNORE_TDO); + + if (tms) + { + jbi_jtag_state = + jbi_jtag_state_transitions[jbi_jtag_state].tms_high; + } + else + { + jbi_jtag_state = + jbi_jtag_state_transitions[jbi_jtag_state].tms_low; + } + + ++count; + } + } + + if (jbi_jtag_state != state) + { + status = JBIC_INTERNAL_ERROR; + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_wait_cycles +( + long cycles, + JBIE_JTAG_STATE wait_state +) + +/* */ +/* Description: Causes JTAG hardware to loop in the specified stable */ +/* state for the specified number of TCK clock cycles. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int tms; + long count; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + + if (jbi_jtag_state != wait_state) + { + status = jbi_goto_jtag_state(wait_state); + } + + if (status == JBIC_SUCCESS) + { + /* + * Set TMS high to loop in RESET state + * Set TMS low to loop in any other stable state + */ + tms = (wait_state == RESET) ? TMS_HIGH : TMS_LOW; + + for (count = 0L; count < cycles; count++) + { + jbi_jtag_io(tms, TDI_LOW, IGNORE_TDO); + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_wait_microseconds +( + long microseconds, + JBIE_JTAG_STATE wait_state +) + +/* */ +/* Description: Causes JTAG hardware to sit in the specified stable */ +/* state for the specified duration of real time. If */ +/* no JTAG operations have been performed yet, then only */ +/* a delay is performed. This permits the WAIT USECS */ +/* statement to be used in VECTOR programs without causing */ +/* any JTAG operations. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + + if ((jbi_jtag_state != JBI_ILLEGAL_JTAG_STATE) && + (jbi_jtag_state != wait_state)) + { + status = jbi_goto_jtag_state(wait_state); + } + + if (status == JBIC_SUCCESS) + { + /* + * Wait for specified time interval + */ + jbi_delay(microseconds); + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_jtag_concatenate_data +( + unsigned char *buffer, + unsigned char *preamble_data, + unsigned int preamble_count, + unsigned char *target_data, + unsigned long start_index, + unsigned int target_count, + unsigned char *postamble_data, + unsigned int postamble_count +) + +/* */ +/* Description: Copies preamble data, target data, and postamble data */ +/* into one buffer for IR or DR scans. */ +/* */ +/* Returns: nothing */ +/* */ +/****************************************************************************/ +{ + unsigned long i; + unsigned long j; + unsigned long k; + + for (i = 0L; i < preamble_count; ++i) + { + if (preamble_data[i >> 3L] & (1L << (i & 7L))) + { + buffer[i >> 3L] |= (1L << (i & 7L)); + } + else + { + buffer[i >> 3L] &= ~(unsigned int) (1L << (i & 7L)); + } + } + + j = start_index; + k = preamble_count + target_count; + for (; i < k; ++i, ++j) + { + if (target_data[j >> 3L] & (1L << (j & 7L))) + { + buffer[i >> 3L] |= (1L << (i & 7L)); + } + else + { + buffer[i >> 3L] &= ~(unsigned int) (1L << (i & 7L)); + } + } + + j = 0L; + k = preamble_count + target_count + postamble_count; + for (; i < k; ++i, ++j) + { + if (postamble_data[j >> 3L] & (1L << (j & 7L))) + { + buffer[i >> 3L] |= (1L << (i & 7L)); + } + else + { + buffer[i >> 3L] &= ~(unsigned int) (1L << (i & 7L)); + } + } +} + +int jbi_jtag_drscan +( + int start_state, + int count, + unsigned char *tdi, + unsigned char *tdo +) +{ + int i = 0; + int tdo_bit = 0; + int status = 1; + + /* + * First go to DRSHIFT state + */ + switch (start_state) + { + case 0: /* IDLE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(0, 0, 0); /* DRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* DRSHIFT */ + break; + + case 1: /* DRPAUSE */ + jbi_jtag_io(1, 0, 0); /* DREXIT2 */ + jbi_jtag_io(1, 0, 0); /* DRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(0, 0, 0); /* DRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* DRSHIFT */ + break; + + case 2: /* IRPAUSE */ + jbi_jtag_io(1, 0, 0); /* IREXIT2 */ + jbi_jtag_io(1, 0, 0); /* IRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(0, 0, 0); /* DRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* DRSHIFT */ + break; + + default: + status = 0; + } + + if (status) + { + /* loop in the SHIFT-DR state */ + for (i = 0; i < count; i++) + { + tdo_bit = jbi_jtag_io( + (i == count - 1), + tdi[i >> 3] & (1 << (i & 7)), + (tdo != NULL)); + + if (tdo != NULL) + { + if (tdo_bit) + { + tdo[i >> 3] |= (1 << (i & 7)); + } + else + { + tdo[i >> 3] &= ~(unsigned int) (1 << (i & 7)); + } + } + } + + jbi_jtag_io(0, 0, 0); /* DRPAUSE */ + } + + return (status); +} + +int jbi_jtag_irscan +( + int start_state, + int count, + unsigned char *tdi, + unsigned char *tdo +) +{ + int i = 0; + int tdo_bit = 0; + int status = 1; + + /* + * First go to IRSHIFT state + */ + switch (start_state) + { + case 0: /* IDLE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(1, 0, 0); /* IRSELECT */ + jbi_jtag_io(0, 0, 0); /* IRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* IRSHIFT */ + break; + + case 1: /* DRPAUSE */ + jbi_jtag_io(1, 0, 0); /* DREXIT2 */ + jbi_jtag_io(1, 0, 0); /* DRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(1, 0, 0); /* IRSELECT */ + jbi_jtag_io(0, 0, 0); /* IRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* IRSHIFT */ + break; + + case 2: /* IRPAUSE */ + jbi_jtag_io(1, 0, 0); /* IREXIT2 */ + jbi_jtag_io(1, 0, 0); /* IRUPDATE */ + jbi_jtag_io(1, 0, 0); /* DRSELECT */ + jbi_jtag_io(1, 0, 0); /* IRSELECT */ + jbi_jtag_io(0, 0, 0); /* IRCAPTURE */ + jbi_jtag_io(0, 0, 0); /* IRSHIFT */ + break; + + default: + status = 0; + } + + if (status) + { + /* loop in the SHIFT-IR state */ + for (i = 0; i < count; i++) + { + tdo_bit = jbi_jtag_io( + (i == count - 1), + tdi[i >> 3] & (1 << (i & 7)), + (tdo != NULL)); + + if (tdo != NULL) + { + if (tdo_bit) + { + tdo[i >> 3] |= (1 << (i & 7)); + } + else + { + tdo[i >> 3] &= ~(unsigned int) (1 << (i & 7)); + } + } + } + + jbi_jtag_io(0, 0, 0); /* IRPAUSE */ + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_jtag_extract_target_data +( + unsigned char *buffer, + unsigned char *target_data, + unsigned int start_index, + unsigned int preamble_count, + unsigned int target_count +) + +/* */ +/* Description: Copies target data from scan buffer, filtering out */ +/* preamble and postamble data. */ +/* */ +/* Returns: nothing */ +/* */ +/****************************************************************************/ +{ + unsigned int i; + unsigned int j; + unsigned int k; + + j = preamble_count; + k = start_index + target_count; + for (i = start_index; i < k; ++i, ++j) + { + if (buffer[j >> 3] & (1 << (j & 7))) + { + target_data[i >> 3] |= (1 << (i & 7)); + } + else + { + target_data[i >> 3] &= ~(unsigned int) (1 << (i & 7)); + } + } +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_irscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned int start_index +) + +/* */ +/* Description: Shifts data into instruction register */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_ir_preamble + count + jbi_ir_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_IR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_ir_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_ir_buffer); + jbi_ir_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_ir_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, IR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_ir_buffer, + jbi_ir_preamble_data, + jbi_ir_preamble, + tdi_data, + start_index, + count, + jbi_ir_postamble_data, + jbi_ir_postamble + ); + + /* + * Do the IRSCAN + */ + jbi_jtag_irscan + ( + start_code, + shift_count, + jbi_ir_buffer, + NULL + ); + + /* jbi_jtag_irscan() always ends in IRPAUSE state */ + jbi_jtag_state = IRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_irstop_state != IRPAUSE) + { + status = jbi_goto_jtag_state(jbi_irstop_state); + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_swap_ir +( + unsigned int count, + unsigned char *in_data, + unsigned int in_index, + unsigned char *out_data, + unsigned int out_index +) + +/* */ +/* Description: Shifts data into instruction register, capturing output */ +/* data */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_ir_preamble + count + jbi_ir_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_IR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_ir_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_ir_buffer); + jbi_ir_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_ir_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_ir_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, IR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_ir_buffer, + jbi_ir_preamble_data, + jbi_ir_preamble, + in_data, + in_index, + count, + jbi_ir_postamble_data, + jbi_ir_postamble + ); + + /* + * Do the IRSCAN + */ + jbi_jtag_irscan + ( + start_code, + shift_count, + jbi_ir_buffer, + jbi_ir_buffer + ); + + /* jbi_jtag_irscan() always ends in IRPAUSE state */ + jbi_jtag_state = IRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_irstop_state != IRPAUSE) + { + status = jbi_goto_jtag_state(jbi_irstop_state); + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Now extract the returned data from the buffer + */ + jbi_jtag_extract_target_data + ( + jbi_ir_buffer, + out_data, + out_index, + jbi_ir_preamble, + count + ); + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_drscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned long start_index +) + +/* */ +/* Description: Shifts data into data register (ignoring output data) */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_dr_preamble + count + jbi_dr_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_DR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_dr_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_dr_buffer); + jbi_dr_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_dr_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, DR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_dr_buffer, + jbi_dr_preamble_data, + jbi_dr_preamble, + tdi_data, + start_index, + count, + jbi_dr_postamble_data, + jbi_dr_postamble + ); + + /* + * Do the DRSCAN + */ + jbi_jtag_drscan + ( + start_code, + shift_count, + jbi_dr_buffer, + NULL + ); + + /* jbi_jtag_drscan() always ends in DRPAUSE state */ + jbi_jtag_state = DRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_drstop_state != DRPAUSE) + { + status = jbi_goto_jtag_state(jbi_drstop_state); + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_swap_dr +( + unsigned int count, + unsigned char *in_data, + unsigned long in_index, + unsigned char *out_data, + unsigned int out_index +) + +/* */ +/* Description: Shifts data into data register, capturing output data */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + int start_code = 0; + unsigned int alloc_chars = 0; + unsigned int shift_count = jbi_dr_preamble + count + jbi_dr_postamble; + JBI_RETURN_TYPE status = JBIC_SUCCESS; + JBIE_JTAG_STATE start_state = JBI_ILLEGAL_JTAG_STATE; + + switch (jbi_jtag_state) + { + case JBI_ILLEGAL_JTAG_STATE: + case RESET: + case IDLE: + start_code = 0; + start_state = IDLE; + break; + + case DRSELECT: + case DRCAPTURE: + case DRSHIFT: + case DREXIT1: + case DRPAUSE: + case DREXIT2: + case DRUPDATE: + start_code = 1; + start_state = DRPAUSE; + break; + + case IRSELECT: + case IRCAPTURE: + case IRSHIFT: + case IREXIT1: + case IRPAUSE: + case IREXIT2: + case IRUPDATE: + start_code = 2; + start_state = IRPAUSE; + break; + + default: + status = JBIC_INTERNAL_ERROR; + break; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_jtag_state != start_state) + { + status = jbi_goto_jtag_state(start_state); + } + } + + if (status == JBIC_SUCCESS) + { + if (jbi_workspace != NULL) + { + if (shift_count > JBIC_MAX_JTAG_DR_LENGTH) + { + status = JBIC_OUT_OF_MEMORY; + } + } + else if (shift_count > jbi_dr_length) + { + alloc_chars = (shift_count + 7) >> 3; + jbi_free(jbi_dr_buffer); + jbi_dr_buffer = (unsigned char *) jbi_malloc(alloc_chars); + + if (jbi_dr_buffer == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + jbi_dr_length = alloc_chars * 8; + } + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Copy preamble data, DR data, and postamble data into a buffer + */ + jbi_jtag_concatenate_data + ( + jbi_dr_buffer, + jbi_dr_preamble_data, + jbi_dr_preamble, + in_data, + in_index, + count, + jbi_dr_postamble_data, + jbi_dr_postamble + ); + + /* + * Do the DRSCAN + */ + jbi_jtag_drscan + ( + start_code, + shift_count, + jbi_dr_buffer, + jbi_dr_buffer + ); + + /* jbi_jtag_drscan() always ends in DRPAUSE state */ + jbi_jtag_state = DRPAUSE; + } + + if (status == JBIC_SUCCESS) + { + if (jbi_drstop_state != DRPAUSE) + { + status = jbi_goto_jtag_state(jbi_drstop_state); + } + } + + if (status == JBIC_SUCCESS) + { + /* + * Now extract the returned data from the buffer + */ + jbi_jtag_extract_target_data + ( + jbi_dr_buffer, + out_data, + out_index, + jbi_dr_preamble, + count + ); + } + + return (status); +} + +/****************************************************************************/ +/* */ + +void jbi_free_jtag_padding_buffers(int reset_jtag) + +/* */ +/* Description: Frees memory allocated for JTAG IR and DR buffers */ +/* */ +/* Returns: nothing */ +/* */ +/****************************************************************************/ +{ + /* + * If the JTAG interface was used, reset it to TLR + */ + if (reset_jtag && (jbi_jtag_state != JBI_ILLEGAL_JTAG_STATE)) + { + jbi_jtag_reset_idle(); + } + + if (jbi_workspace == NULL) + { + if (jbi_dr_preamble_data != NULL) + { + jbi_free(jbi_dr_preamble_data); + jbi_dr_preamble_data = NULL; + } + + if (jbi_dr_postamble_data != NULL) + { + jbi_free(jbi_dr_postamble_data); + jbi_dr_postamble_data = NULL; + } + + if (jbi_dr_buffer != NULL) + { + jbi_free(jbi_dr_buffer); + jbi_dr_buffer = NULL; + } + + if (jbi_ir_preamble_data != NULL) + { + jbi_free(jbi_ir_preamble_data); + jbi_ir_preamble_data = NULL; + } + + if (jbi_ir_postamble_data != NULL) + { + jbi_free(jbi_ir_postamble_data); + jbi_ir_postamble_data = NULL; + } + + if (jbi_ir_buffer != NULL) + { + jbi_free(jbi_ir_buffer); + jbi_ir_buffer = NULL; + } + } +} + +#if PORT==DOS + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_do_drscan_multi_page +( + unsigned int variable_id, + unsigned long count, + unsigned long start_index, + int version +) + +/* */ +/* Description: Shifts data into data register (ignoring output data) */ +/* Scan data comes from compressed Boolean array. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned long shift_count = jbi_dr_preamble + count + jbi_dr_postamble; + unsigned long i; + unsigned long j; + unsigned long k; + unsigned int bi; + + if (status == JBIC_SUCCESS) + { + status = jbi_goto_jtag_state(DRSHIFT); + } + + if (status == JBIC_SUCCESS) + { + /* + * Get preamble data, DR data, and postamble data one bit at a time + * and immediately scan it into the JTAG chain + */ + + for (i = 0L; i < jbi_dr_preamble; ++i) + { + jbi_jtag_io((i == shift_count - 1), + (int) (jbi_dr_preamble_data[i >> 3L] & (1L << (i & 7L))), 0); + } + + j = start_index; + k = jbi_dr_preamble + count; + + jbi_uncompress_page(variable_id, (unsigned int) (j >> 16L), version); + + for (; i < k; ++i, ++j) + { + bi = (unsigned int) (j & 0x0000ffffL); + + /* check for page boundary - load next page if necessary */ + if (bi == 0) + { + jbi_uncompress_page(variable_id, (unsigned int) (j >> 16L), version); + } + + jbi_jtag_io((i == shift_count - 1), + (int) (jbi_aca_out_buffer[bi >> 3] & (1 << (bi & 7))), 0); + } + + j = 0L; + k = jbi_dr_preamble + count + jbi_dr_postamble; + for (; i < k; ++i, ++j) + { + jbi_jtag_io((i == shift_count - 1), + (int) (jbi_dr_postamble_data[j >> 3L] & (1L << (j & 7L))), 0); + } + + jbi_jtag_io(0, 0, 0); /* DRPAUSE */ + + /* jbi_jtag_drscan() always ends in DRPAUSE state */ + jbi_jtag_state = DRPAUSE; + + if (jbi_drstop_state != DRPAUSE) + { + status = jbi_goto_jtag_state(jbi_drstop_state); + } + } + + return (status); +} + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h new file mode 100644 index 0000000000..fab2dac026 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbijtag.h @@ -0,0 +1,146 @@ +/****************************************************************************/ +/* */ +/* Module: jbijtag.h */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Definitions of JTAG constants, types, and functions */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBIJTAG_H +#define INC_JBIJTAG_H + +/****************************************************************************/ +/* */ +/* Function Prototypes */ +/* */ +/****************************************************************************/ +typedef enum +{ + JBI_ILLEGAL_JTAG_STATE = -1, + RESET = 0, + IDLE = 1, + DRSELECT = 2, + DRCAPTURE = 3, + DRSHIFT = 4, + DREXIT1 = 5, + DRPAUSE = 6, + DREXIT2 = 7, + DRUPDATE = 8, + IRSELECT = 9, + IRCAPTURE = 10, + IRSHIFT = 11, + IREXIT1 = 12, + IRPAUSE = 13, + IREXIT2 = 14, + IRUPDATE = 15 + +} JBIE_JTAG_STATE; + +JBI_RETURN_TYPE jbi_init_jtag +( + void +); + +JBI_RETURN_TYPE jbi_set_drstop_state +( + JBIE_JTAG_STATE state +); + +JBI_RETURN_TYPE jbi_set_irstop_state +( + JBIE_JTAG_STATE state +); + +JBI_RETURN_TYPE jbi_set_dr_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +); + +JBI_RETURN_TYPE jbi_set_ir_preamble +( + unsigned int count, + unsigned int start_index, + unsigned char *preamble_data +); + +JBI_RETURN_TYPE jbi_set_dr_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +); + +JBI_RETURN_TYPE jbi_set_ir_postamble +( + unsigned int count, + unsigned int start_index, + unsigned char *postamble_data +); + +JBI_RETURN_TYPE jbi_goto_jtag_state +( + JBIE_JTAG_STATE state +); + +JBI_RETURN_TYPE jbi_do_wait_cycles +( + long cycles, + JBIE_JTAG_STATE wait_state +); + +JBI_RETURN_TYPE jbi_do_wait_microseconds +( + long microseconds, + JBIE_JTAG_STATE wait_state +); + +JBI_RETURN_TYPE jbi_do_irscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned int start_index +); + +JBI_RETURN_TYPE jbi_swap_ir +( + unsigned int count, + unsigned char *in_data, + unsigned int in_index, + unsigned char *out_data, + unsigned int out_index +); + +JBI_RETURN_TYPE jbi_do_drscan +( + unsigned int count, + unsigned char *tdi_data, + unsigned long start_index +); + +JBI_RETURN_TYPE jbi_swap_dr +( + unsigned int count, + unsigned char *in_data, + unsigned long in_index, + unsigned char *out_data, + unsigned int out_index +); + +void jbi_free_jtag_padding_buffers +( + int reset_jtag +); + +JBI_RETURN_TYPE jbi_do_drscan_multi_page +( + unsigned int variable_id, + unsigned long long_count, + unsigned long long_index, + int version +); + +#endif /* INC_JBIJTAG_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c new file mode 100644 index 0000000000..b8cab48570 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbimain.c @@ -0,0 +1,3362 @@ +/****************************************************************************/ +/* */ +/* Module: jbimain.c */ +/* */ +/* Copyright (C) Altera Corporation 1998-2001 */ +/* */ +/* Description: Jam STAPL ByteCode Player (Interpreter) */ +/* */ +/* Revisions: 2.2 fixed /W4 warnings */ +/* 2.0 added support for STAPL ByteCode format */ +/* */ +/****************************************************************************/ + +#include "jbiport.h" +#include "jbiexprt.h" +#include "jbijtag.h" +#include "jbicomp.h" +#include "jbistub.h" + +/****************************************************************************/ +/* */ +/* MACROS */ +/* */ +/****************************************************************************/ + +#ifndef NULL +#define NULL 0 +#endif + +#define JBI_STACK_SIZE 128 + +#define JBIC_MESSAGE_LENGTH 1024 + +/* +* This macro checks if enough parameters are available on the stack. The +* argument is the number of parameters needed. +*/ +#define IF_CHECK_STACK(x) \ + if (stack_ptr < (int) (x)) \ + { \ + status = JBIC_STACK_OVERFLOW; \ + } \ + else + +/* +* This macro checks if a code address is inside the code section +*/ +#define CHECK_PC \ + if ((pc < code_section) || (pc >= debug_section)) \ + { \ + status = JBIC_BOUNDS_ERROR; \ + } + +/****************************************************************************/ +/* */ +/* GLOBAL VARIABLES */ +/* */ +/****************************************************************************/ + +#if PORT==DOS +/* +* jbi_program is a global pointer used by macros GET_BYTE, GET_WORD, and +* GET_DWORD to read data from the JBC file +*/ +PROGRAM_PTR jbi_program; +#endif + +/****************************************************************************/ +/* */ +/* UTILITY FUNCTIONS */ +/* */ +/****************************************************************************/ + +int jbi_strlen(char *string) +{ + int len = 0; + + while (string[len] != '\0') ++len; + + return (len); +} + +long jbi_atol(char *buffer) +{ + long result = 0L; + int index = 0; + + while ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + result = (result * 10) + (buffer[index] - '0'); + ++index; + } + + return (result); +} + +void jbi_ltoa(char *buffer, long number) +{ + int index = 0; + int rev_index = 0; + char reverse[32]; + + if (number < 0L) + { + buffer[index++] = '-'; + number = 0 - number; + } + else if (number == 0) + { + buffer[index++] = '0'; + } + + while (number != 0) + { + reverse[rev_index++] = (char) ((number % 10) + '0'); + number /= 10; + } + + while (rev_index > 0) + { + buffer[index++] = reverse[--rev_index]; + } + + buffer[index] = '\0'; +} + +char jbi_toupper(char ch) +{ + return ((char) (((ch >= 'a') && (ch <= 'z')) ? (ch + 'A' - 'a') : ch)); +} + +int jbi_stricmp(char *left, char *right) +{ + int result = 0; + char l, r; + + do + { + l = jbi_toupper(*left); + r = jbi_toupper(*right); + result = l - r; + ++left; + ++right; + } + while ((result == 0) && (l != '\0') && (r != '\0')); + + return (result); +} + +void jbi_strncpy(char *left, char *right, int count) +{ + char ch; + + do + { + *left = *right; + ch = *right; + ++left; + ++right; + --count; + } + while ((ch != '\0') && (count != 0)); +} + +void jbi_make_dword(unsigned char *buf, unsigned long num) +{ + buf[0] = (unsigned char) num; + buf[1] = (unsigned char) (num >> 8L); + buf[2] = (unsigned char) (num >> 16L); + buf[3] = (unsigned char) (num >> 24L); +} + +unsigned long jbi_get_dword(unsigned char *buf) +{ + return + (((unsigned long) buf[0]) | + (((unsigned long) buf[1]) << 8L) | + (((unsigned long) buf[2]) << 16L) | + (((unsigned long) buf[3]) << 24L)); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_execute +( + PROGRAM_PTR program, + long program_size, + char *workspace, + long workspace_size, + char *action, + char **init_list, + int reset_jtag, + long *error_address, + int *exit_code, + int *format_version +) + +/* */ +/* Description: */ +/* */ +/* Returns: */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned long first_word = 0L; + unsigned long action_table = 0L; + unsigned long proc_table = 0L; + unsigned long string_table = 0L; + unsigned long symbol_table = 0L; + unsigned long data_section = 0L; + unsigned long code_section = 0L; + unsigned long debug_section = 0L; + unsigned long action_count = 0L; + unsigned long proc_count = 0L; + unsigned long symbol_count = 0L; + /*char message_buffer[JBIC_MESSAGE_LENGTH + 1];*/ + char *message_buffer; + addr_t *variables = NULL; + long *variable_size = NULL; + char *attributes = NULL; + unsigned char *proc_attributes = NULL; + unsigned long pc; + unsigned long opcode_address; + unsigned long args[3]; + unsigned int opcode; + unsigned long name_id; + addr_t stack[JBI_STACK_SIZE] = {0}; + unsigned char charbuf[4]; + long long_temp; + unsigned int variable_id; + unsigned char *charptr_temp; + unsigned char *charptr_temp2; + long *longptr_temp; + int version = 0; + int delta = 0; + int stack_ptr = 0; + unsigned int arg_count; + int done = 0; + int bad_opcode = 0; + unsigned int count; + unsigned int index; + unsigned int index2; + long long_count; + long long_index; + long long_index2; + unsigned int i; + unsigned int j; + unsigned long uncompressed_size, uncompressed_result; + unsigned int offset; + unsigned long value; + int current_proc = 0; + char *equal_ptr; + int length; + int reverse; + + unsigned long debug_cnt = 0; + +#if PORT==DOS + char name[33]; +#else + char *name; +#endif + + jbi_workspace = workspace; + jbi_workspace_size = workspace_size; + +#if PORT==DOS + jbi_program = program; +#endif + + /* Resolve compilation warnings: the frame size of 1664 bytes is larger than 1024 bytes */ + message_buffer = (char *) kzalloc(JBIC_MESSAGE_LENGTH + 1, GFP_KERNEL); + if (message_buffer == NULL) { + jbi_dbg(DEBUG_DETAIL, "Memory not enough jbi_execute \n"); + return JBIC_OUT_OF_MEMORY; + } + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + version = (int) (first_word & 1L); + *format_version = version + 1; + delta = version * 8; + + action_table = GET_DWORD(4); + proc_table = GET_DWORD(8); + string_table = GET_DWORD(4 + delta); + symbol_table = GET_DWORD(16 + delta); + data_section = GET_DWORD(20 + delta); + code_section = GET_DWORD(24 + delta); + debug_section = GET_DWORD(28 + delta); + action_count = GET_DWORD(40 + delta); + proc_count = GET_DWORD(44 + delta); + symbol_count = GET_DWORD(48 + (2 * delta)); + + jbi_dbg(DEBUG_DETAIL, "version: %d\n", version); + jbi_dbg(DEBUG_DETAIL, "delta: %d\n", delta); + jbi_dbg(DEBUG_DETAIL, "action_table: 0x%08lx\n", action_table); + jbi_dbg(DEBUG_DETAIL, "proc_table: 0x%08lx\n", proc_table); + jbi_dbg(DEBUG_DETAIL, "string_table: 0x%08lx\n", string_table); + jbi_dbg(DEBUG_DETAIL, "symbol_table: 0x%08lx\n", symbol_table); + jbi_dbg(DEBUG_DETAIL, "data_section: 0x%08lx\n", data_section); + jbi_dbg(DEBUG_DETAIL, "code_section: 0x%08lx\n", code_section); + jbi_dbg(DEBUG_DETAIL, "debug_section: 0x%08lx\n", debug_section); + jbi_dbg(DEBUG_DETAIL, "action_count: 0x%08lx\n", action_count); + jbi_dbg(DEBUG_DETAIL, "proc_count: 0x%08lx\n", proc_count); + jbi_dbg(DEBUG_DETAIL, "symbol_count: 0x%08lx\n", symbol_count); + jbi_dbg(DEBUG_DETAIL, "\n"); + } + + if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) + { + jbi_dbg(DEBUG_ERR, "first_word 0x%lx\n", first_word); + done = 1; + status = JBIC_IO_ERROR; + } + + if ((status == JBIC_SUCCESS) && (symbol_count > 0)) + { + variables = (addr_t *) jbi_malloc( + (unsigned int) symbol_count * sizeof(long)); + + if (variables == NULL) status = JBIC_OUT_OF_MEMORY; + + if (status == JBIC_SUCCESS) + { + variable_size = (long *) jbi_malloc( + (unsigned int) symbol_count * sizeof(long)); + + if (variable_size == NULL) status = JBIC_OUT_OF_MEMORY; + } + + if (status == JBIC_SUCCESS) + { + attributes = (char *) jbi_malloc((unsigned int) symbol_count); + + if (attributes == NULL) status = JBIC_OUT_OF_MEMORY; + } + + if ((status == JBIC_SUCCESS) && (version > 0)) + { + proc_attributes = (unsigned char *) jbi_malloc((unsigned int) proc_count); + + if (proc_attributes == NULL) status = JBIC_OUT_OF_MEMORY; + } + + if (status == JBIC_SUCCESS) + { + delta = version * 2; + + for (i = 0; i < (unsigned int) symbol_count; ++i) + { + offset = (unsigned int) (symbol_table + ((11 + delta) * i)); + + value = GET_DWORD(offset + 3 + delta); + + attributes[i] = GET_BYTE(offset); + + /* use bit 7 of attribute byte to indicate that this buffer */ + /* was dynamically allocated and should be freed later */ + attributes[i] &= 0x7f; + + variable_size[i] = GET_DWORD(offset + 7 + delta); + + jbi_dbg(DEBUG_NOISY, "symbol %03d: 0x%02x,0x%08lx,0x%08lx\n", + i, attributes[i], value, variable_size[i]); + + /* + * Attribute bits: + * bit 0: 0 = read-only, 1 = read-write + * bit 1: 0 = not compressed, 1 = compressed + * bit 2: 0 = not initialized, 1 = initialized + * bit 3: 0 = scalar, 1 = array + * bit 4: 0 = Boolean, 1 = integer + * bit 5: 0 = declared variable, + * 1 = compiler created temporary variable + */ + + if ((attributes[i] & 0x0c) == 0x04) + { + /* initialized scalar variable */ + variables[i] = value; + } + else if ((attributes[i] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ +#if PORT==DOS + /* for DOS port, get the size but do not uncompress */ + long_index = data_section + value; + uncompressed_size = + (((unsigned long) GET_BYTE(long_index)) | + (((unsigned long) GET_BYTE(long_index + 1L)) << 8L) | + (((unsigned long) GET_BYTE(long_index + 2L)) << 16L) | + (((unsigned long) GET_BYTE(long_index + 3L)) << 24L)); + variable_size[i] = uncompressed_size; +#else + uncompressed_size = jbi_get_dword( + &program[data_section + value]); + + /* allocate a buffer for the uncompressed data */ + variables[i] = (addr_t) jbi_malloc(uncompressed_size); + + if (variables[i] == (addr_t) 0L) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* set flag so buffer will be freed later */ + attributes[i] |= 0x80; + + /* uncompress the data */ + uncompressed_result = + jbi_uncompress( + &program[data_section + value], + variable_size[i], + (unsigned char *) variables[i], + uncompressed_size, + version); + if (uncompressed_result != uncompressed_size) + { + /* decompression failed */ + jbi_dbg(DEBUG_ERR, "uncompress fail(0x%lx,0x%lx,0x%lx)(0x%lx)\n", + variable_size[i], uncompressed_result, uncompressed_size, value); + status = JBIC_IO_ERROR; + } + else + { + variable_size[i] = uncompressed_size * 8L; + } + } +#endif + } + else if ((attributes[i] & 0x1e) == 0x0c) + { + /* initialized Boolean array */ +#if PORT==DOS + /* flag attributes so that memory is freed */ + attributes[i] |= 0x80; + + if (variable_size[i] > 0) + { + unsigned int size = (unsigned int) + ((variable_size[i] + 7L) / 8L); + + variables[i] = (long) jbi_malloc(size); + + if (variables[i] == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + unsigned char *p = (unsigned char *) variables[i]; + /* copy array values into buffer */ + for (j = 0; j < size; ++j) + { + p[j] = GET_BYTE(data_section + value + j); + } + } + } + else + { + variables[i] = 0; + } +#else + variables[i] = value + data_section + (addr_t) program; +#endif + } + else if ((attributes[i] & 0x1c) == 0x1c) + { + /* initialized integer array */ + variables[i] = value + data_section; + } + else if ((attributes[i] & 0x0c) == 0x08) + { + /* uninitialized array */ + + /* flag attributes so that memory is freed */ + attributes[i] |= 0x80; + + if (variable_size[i] > 0) + { + unsigned int size; + + if (attributes[i] & 0x10) + { + /* integer array */ + size = (unsigned int) + (variable_size[i] * sizeof(long)); + } + else + { + /* Boolean array */ + size = (unsigned int) + ((variable_size[i] + 7L) / 8L); + } + + variables[i] = (addr_t) jbi_malloc(size); + + if (variables[i] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* zero out memory */ + for (j = 0; j < size; ++j) + { + ((unsigned char *)(variables[i]))[j] = 0; + } + } + } + else + { + variables[i] = 0; + } + } + else + { + variables[i] = 0; + } + + jbi_dbg(DEBUG_NOISY, " variables: 0x%08lx,0x%016llx\n", + variable_size[i], (long long) variables[i]); + } + } + + jbi_dbg(DEBUG_NOISY, "\n"); + } + + /* + * Initialize variables listed in init_list + */ + if ((status == JBIC_SUCCESS) && (init_list != NULL) && (version == 0)) + { + delta = version * 2; + count = 0; + while (init_list[count] != NULL) + { + equal_ptr = init_list[count]; + length = 0; + while ((*equal_ptr != '=') && (*equal_ptr != '\0')) + { + ++equal_ptr; + ++length; + } + if (*equal_ptr == '=') + { + ++equal_ptr; + value = jbi_atol(equal_ptr); + jbi_strncpy(message_buffer, init_list[count], length); + message_buffer[length] = '\0'; + for (i = 0; i < (unsigned int) symbol_count; ++i) + { + offset = (unsigned int) (symbol_table + ((11 + delta) * i)); + name_id = (version == 0) ? GET_WORD(offset + 1) : + GET_DWORD(offset + 1); +#if PORT==DOS + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + name_id]; +#endif + + if (jbi_stricmp(message_buffer, name) == 0) + { + variables[i] = value; + } + + jbi_dbg(DEBUG_NOISY, "init_list %03d: 0x%08lx,%s,0x%016llx\n", + i, name_id, name, (long long) variables[i]); + } + } + + ++count; + } + + jbi_dbg(DEBUG_NOISY, "\n"); + } + + if (status != JBIC_SUCCESS) done = 1; + + jbi_init_jtag(); + + pc = code_section; + message_buffer[0] = '\0'; + + /* + * For JBC version 2, we will execute the procedures corresponding to + * the selected ACTION + */ + if (version > 0) + { + if (action == NULL) + { + status = JBIC_ACTION_NOT_FOUND; + done = 1; + } + else + { + int action_found = 0; + + for (i = 0; (i < action_count) && !action_found; ++i) + { + name_id = GET_DWORD(action_table + (12 * i)); + +#if PORT==DOS + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + name_id]; +#endif + + if (jbi_stricmp(action, name) == 0) + { + action_found = 1; + current_proc = (int) GET_DWORD(action_table + (12 * i) + 8); + } + + jbi_dbg(DEBUG_NOISY, "action %03d: 0x%08lx,%s, %d,%d\n", + i, name_id, name, action_found, current_proc); + } + + if (!action_found) + { + status = JBIC_ACTION_NOT_FOUND; + done = 1; + } + } + + if (status == JBIC_SUCCESS) + { + int first_time = 1; + i = current_proc; + while ((i != 0) || first_time) + { + first_time = 0; + /* check procedure attribute byte */ + proc_attributes[i] = (unsigned char) + (GET_BYTE(proc_table + (13 * i) + 8) & 0x03); + + jbi_dbg(DEBUG_NOISY, " proc_attributes %03d: 0x%02x\n", + i, proc_attributes[i]); + + if (proc_attributes[i] != 0) + { + /* + * BIT0 - OPTIONAL + * BIT1 - RECOMMENDED + * BIT6 - FORCED OFF + * BIT7 - FORCED ON + */ + if (init_list != NULL) + { + name_id = GET_DWORD(proc_table + (13 * i)); +#if PORT==DOS + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + name_id]; +#endif + + jbi_dbg(DEBUG_NOISY, " init_list %03d: 0x%08lx,%s\n", + i, name_id, name); + + count = 0; + while (init_list[count] != NULL) + { + equal_ptr = init_list[count]; + length = 0; + while ((*equal_ptr != '=') && (*equal_ptr != '\0')) + { + ++equal_ptr; + ++length; + } + if (*equal_ptr == '=') + { + ++equal_ptr; + jbi_strncpy(message_buffer, init_list[count], length); + message_buffer[length] = '\0'; + + if (jbi_stricmp(message_buffer, name) == 0) + { + if (jbi_atol(equal_ptr) == 0) + { + proc_attributes[i] |= 0x40; + } + else + { + proc_attributes[i] |= 0x80; + } + } + } + + jbi_dbg(DEBUG_NOISY, " proc_attributes %03d: 0x%02x\n", + i, proc_attributes[i]); + + ++count; + } + } + } + + i = (unsigned int) GET_DWORD(proc_table + (13 * i) + 4); + } + + /* + * Set current_proc to the first procedure to be executed + */ + i = current_proc; + while ((i != 0) && + ((proc_attributes[i] == 1) || + ((proc_attributes[i] & 0xc0) == 0x40))) + { + i = (unsigned int) GET_DWORD(proc_table + (13 * i) + 4); + } + + if ((i != 0) || ((i == 0) && (current_proc == 0) && + ((proc_attributes[0] != 1) && + ((proc_attributes[0] & 0xc0) != 0x40)))) + { + current_proc = i; + pc = code_section + GET_DWORD(proc_table + (13 * i) + 9); + CHECK_PC; + } + else + { + /* there are no procedures to execute! */ + done = 1; + } + } + + jbi_dbg(DEBUG_NOISY, "\n"); + } + + message_buffer[0] = '\0'; + + jbi_dbg(DEBUG_NOISY, "excute pc: 0x%lx,%d\n", pc, current_proc); + while (!done) + { + opcode = (unsigned int) (GET_BYTE(pc) & 0xff); + debug_cnt++; + jbi_dbg(DEBUG_NOISY, "op: 0x%02x(%03d:0x%08lx,%08lx)", + opcode, stack_ptr, pc, debug_cnt); + opcode_address = pc; + ++pc; + + arg_count = (opcode >> 6) & 3; + jbi_dbg(DEBUG_NOISY, " - %u:", arg_count); + for (i = 0; i < arg_count; ++i) + { + args[i] = GET_DWORD(pc); + jbi_dbg(DEBUG_NOISY, " 0x%08lx", args[i]); + pc += 4; + } + jbi_dbg(DEBUG_NOISY, "\n"); + + switch (opcode) + { + case 0x00: /* NOP */ + /* do nothing */ + break; + + case 0x01: /* DUP */ + IF_CHECK_STACK(1) + { + stack[stack_ptr] = stack[stack_ptr - 1]; + ++stack_ptr; + } + break; + + case 0x02: /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + break; + + case 0x03: /* ADD */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] += stack[stack_ptr]; + } + break; + + case 0x04: /* SUB */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] -= stack[stack_ptr]; + } + break; + + case 0x05: /* MULT */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] *= stack[stack_ptr]; + } + break; + + case 0x06: /* DIV */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] /= stack[stack_ptr]; + } + break; + + case 0x07: /* MOD */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] %= stack[stack_ptr]; + } + break; + + case 0x08: /* SHL */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] <<= stack[stack_ptr]; + } + break; + + case 0x09: /* SHR */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] >>= stack[stack_ptr]; + } + break; + + case 0x0A: /* NOT */ + IF_CHECK_STACK(1) + { + stack[stack_ptr - 1] ^= (-1L); + } + break; + + case 0x0B: /* AND */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] &= stack[stack_ptr]; + } + break; + + case 0x0C: /* OR */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] |= stack[stack_ptr]; + } + break; + + case 0x0D: /* XOR */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] ^= stack[stack_ptr]; + } + break; + + case 0x0E: /* INV */ + IF_CHECK_STACK(1) + { + stack[stack_ptr - 1] = stack[stack_ptr - 1] ? 0L : 1L; + } + break; + + case 0x0F: /* GT */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] = + (stack[stack_ptr - 1] > stack[stack_ptr]) ? 1L : 0L; + } + break; + + case 0x10: /* LT */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] = + (stack[stack_ptr - 1] < stack[stack_ptr]) ? 1L : 0L; + } + break; + + case 0x11: /* RET */ + if ((version > 0) && (stack_ptr == 0)) + { + /* + * We completed one of the main procedures of an ACTION. + * Find the next procedure to be executed and jump to it. + * If there are no more procedures, then EXIT. + */ + i = (unsigned int) GET_DWORD(proc_table + (13 * current_proc) + 4); + while ((i != 0) && + ((proc_attributes[i] == 1) || + ((proc_attributes[i] & 0xc0) == 0x40))) + { + i = (unsigned int) GET_DWORD(proc_table + (13 * i) + 4); + } + + if (i == 0) + { + /* there are no procedures to execute! */ + done = 1; + *exit_code = 0; /* success */ + } + else + { + current_proc = i; + pc = code_section + GET_DWORD(proc_table + (13 * i) + 9); + CHECK_PC; + } + } + else IF_CHECK_STACK(1) + { + pc = stack[--stack_ptr] + code_section; + CHECK_PC; + if (pc == code_section) + { + status = JBIC_BOUNDS_ERROR; + } + } + break; + + case 0x12: /* CMPS */ + /* + * Array short compare + * ...stack 0 is source 1 value + * ...stack 1 is source 2 value + * ...stack 2 is mask value + * ...stack 3 is count + */ + IF_CHECK_STACK(4) + { + long a = stack[--stack_ptr]; + long b = stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[stack_ptr - 1]; + + if ((count < 1) || (count > 32)) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + long_temp &= ((-1L) >> (32 - count)); + + stack[stack_ptr - 1] = + ((a & long_temp) == (b & long_temp)) ? 1L : 0L; + } + } + break; + + case 0x13: /* PINT */ + /* + * PRINT add integer + * ...stack 0 is integer value + */ + IF_CHECK_STACK(1) + { + jbi_ltoa(&message_buffer[jbi_strlen(message_buffer)], + stack[--stack_ptr]); + } + break; + + case 0x14: /* PRNT */ + /* + * PRINT finish + */ + jbi_message(message_buffer); + message_buffer[0] = '\0'; + break; + + case 0x15: /* DSS */ + /* + * DRSCAN short + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_do_drscan(count, charbuf, 0); + } + break; + + case 0x16: /* DSSC */ + /* + * DRSCAN short with capture + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[stack_ptr - 1]; + jbi_make_dword(charbuf, long_temp); + status = jbi_swap_dr(count, charbuf, 0, charbuf, 0); + stack[stack_ptr - 1] = jbi_get_dword(charbuf); + } + break; + + case 0x17: /* ISS */ + /* + * IRSCAN short + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_do_irscan(count, charbuf, 0); + } + break; + + case 0x18: /* ISSC */ + /* + * IRSCAN short with capture + * ...stack 0 is scan data + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + count = (unsigned int) stack[stack_ptr - 1]; + jbi_make_dword(charbuf, long_temp); + status = jbi_swap_ir(count, charbuf, 0, charbuf, 0); + stack[stack_ptr - 1] = jbi_get_dword(charbuf); + } + break; + + case 0x19: /* VSS */ + /* + * VECTOR short + * ...stack 0 is scan data + * ...stack 1 is count + */ + bad_opcode = 1; + break; + + case 0x1A: /* VSSC */ + /* + * VECTOR short with capture + * ...stack 0 is scan data + * ...stack 1 is count + */ + bad_opcode = 1; + break; + + case 0x1B: /* VMPF */ + /* + * VMAP finish + */ + bad_opcode = 1; + break; + + case 0x1C: /* DPR */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_dr_preamble(count, 0, NULL); + } + break; + + case 0x1D: /* DPRL */ + /* + * DRPRE with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_dr_preamble(count, 0, charbuf); + } + break; + + case 0x1E: /* DPO */ + /* + * DRPOST + * ...stack 0 is count + */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_dr_postamble(count, 0, NULL); + } + break; + + case 0x1F: /* DPOL */ + /* + * DRPOST with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_dr_postamble(count, 0, charbuf); + } + break; + + case 0x20: /* IPR */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_ir_preamble(count, 0, NULL); + } + break; + + case 0x21: /* IPRL */ + /* + * IRPRE with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_ir_preamble(count, 0, charbuf); + } + break; + + case 0x22: /* IPO */ + /* + * IRPOST + * ...stack 0 is count + */ + IF_CHECK_STACK(1) + { + count = (unsigned int) stack[--stack_ptr]; + status = jbi_set_ir_postamble(count, 0, NULL); + } + break; + + case 0x23: /* IPOL */ + /* + * IRPOST with literal data + * ...stack 0 is count + * ...stack 1 is literal data + */ + IF_CHECK_STACK(2) + { + count = (unsigned int) stack[--stack_ptr]; + long_temp = stack[--stack_ptr]; + jbi_make_dword(charbuf, long_temp); + status = jbi_set_ir_postamble(count, 0, charbuf); + } + break; + + case 0x24: /* PCHR */ + IF_CHECK_STACK(1) + { + unsigned char ch; + count = jbi_strlen(message_buffer); + ch = (char) stack[--stack_ptr]; + if ((ch < 1) || (ch > 127)) + { + /* character code out of range */ + /* instead of flagging an error, force the value to 127 */ + ch = 127; + } + message_buffer[count] = ch; + message_buffer[count + 1] = '\0'; + } + break; + + case 0x25: /* EXIT */ + IF_CHECK_STACK(1) + { + *exit_code = (int) stack[--stack_ptr]; + } + done = 1; + break; + + case 0x26: /* EQU */ + IF_CHECK_STACK(2) + { + --stack_ptr; + stack[stack_ptr - 1] = + (stack[stack_ptr - 1] == stack[stack_ptr]) ? 1L : 0L; + } + break; + + case 0x27: /* POPT */ + IF_CHECK_STACK(1) + { + --stack_ptr; + } + break; + + case 0x28: /* TRST */ + bad_opcode = 1; + break; + + case 0x29: /* FRQ */ + bad_opcode = 1; + break; + + case 0x2A: /* FRQU */ + bad_opcode = 1; + break; + + case 0x2B: /* PD32 */ + bad_opcode = 1; + break; + + case 0x2C: /* ABS */ + IF_CHECK_STACK(1) + { + if (stack[stack_ptr - 1] < 0) + { + stack[stack_ptr - 1] = 0 - stack[stack_ptr - 1]; + } + } + break; + + case 0x2D: /* BCH0 */ + /* + * Batch operation 0 + * SWP + * SWPN 7 + * SWP + * SWPN 6 + * DUPN 8 + * SWPN 2 + * SWP + * DUPN 6 + * DUPN 6 + */ + + /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWPN 7 */ + index = 7 + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWPN 6 */ + index = 6 + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* DUPN 8 */ + index = 8 + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + + /* SWPN 2 */ + index = 2 + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* SWP */ + IF_CHECK_STACK(2) + { + long_temp = stack[stack_ptr - 2]; + stack[stack_ptr - 2] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + + /* DUPN 6 */ + index = 6 + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + + /* DUPN 6 */ + index = 6 + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + break; + + case 0x2E: /* BCH1 */ + /* + * Batch operation 1 + * SWPN 8 + * SWP + * SWPN 9 + * SWPN 3 + * SWP + * SWPN 2 + * SWP + * SWPN 7 + * SWP + * SWPN 6 + * DUPN 5 + * DUPN 5 + */ + bad_opcode = 1; + break; + + case 0x2F: /* PSH0 */ + stack[stack_ptr++] = 0; + break; + + case 0x40: /* PSHL */ + stack[stack_ptr++] = (long) args[0]; + break; + + case 0x41: /* PSHV */ + stack[stack_ptr++] = variables[args[0]]; + break; + + case 0x42: /* JMP */ + pc = args[0] + code_section; + CHECK_PC; + break; + + case 0x43: /* CALL */ + stack[stack_ptr++] = pc; + pc = args[0] + code_section; + CHECK_PC; + break; + + case 0x44: /* NEXT */ + /* + * Process FOR / NEXT loop + * ...argument 0 is variable ID + * ...stack 0 is step value + * ...stack 1 is end value + * ...stack 2 is top address + */ + IF_CHECK_STACK(3) + { + long step = stack[stack_ptr - 1]; + long end = stack[stack_ptr - 2]; + long top = stack[stack_ptr - 3]; + long iterator = variables[args[0]]; + int break_out = 0; + + if (step < 0) + { + if (iterator <= end) break_out = 1; + } + else + { + if (iterator >= end) break_out = 1; + } + + if (break_out) + { + stack_ptr -= 3; + } + else + { + variables[args[0]] = iterator + step; + pc = top + code_section; + CHECK_PC; + } + } + break; + + case 0x45: /* PSTR */ + /* + * PRINT add string + * ...argument 0 is string ID + */ +#if PORT==DOS + long_index = string_table + args[0]; + index2 = jbi_strlen(message_buffer); + + do + { + i = GET_BYTE(long_index); + message_buffer[index2] = (char) i; + ++long_index; + ++index2; + } + while ((i != '\0') && (index2 < JBIC_MESSAGE_LENGTH)); +#else + count = jbi_strlen(message_buffer); + jbi_strncpy(&message_buffer[count], + (char *) &program[string_table + args[0]], + JBIC_MESSAGE_LENGTH - count); +#endif + message_buffer[JBIC_MESSAGE_LENGTH] = '\0'; + break; + + case 0x46: /* VMAP */ + /* + * VMAP add signal name + * ...argument 0 is string ID + */ + bad_opcode = 1; + break; + + case 0x47: /* SINT */ + /* + * STATE intermediate state + * ...argument 0 is state code + */ + status = jbi_goto_jtag_state((int) args[0]); + break; + + case 0x48: /* ST */ + /* + * STATE final state + * ...argument 0 is state code + */ + status = jbi_goto_jtag_state((int) args[0]); + break; + + case 0x49: /* ISTP */ + /* + * IRSTOP state + * ...argument 0 is state code + */ + status = jbi_set_irstop_state((int) args[0]); + break; + + case 0x4A: /* DSTP */ + /* + * DRSTOP state + * ...argument 0 is state code + */ + status = jbi_set_drstop_state((int) args[0]); + break; + + case 0x4B: /* SWPN */ + /* + * Exchange top with Nth stack value + * ...argument 0 is 0-based stack entry to swap with top element + */ + index = ((int) args[0]) + 1; + IF_CHECK_STACK(index) + { + long_temp = stack[stack_ptr - index]; + stack[stack_ptr - index] = stack[stack_ptr - 1]; + stack[stack_ptr - 1] = long_temp; + } + break; + + case 0x4C: /* DUPN */ + /* + * Duplicate Nth stack value + * ...argument 0 is 0-based stack entry to duplicate + */ + index = ((int) args[0]) + 1; + IF_CHECK_STACK(index) + { + stack[stack_ptr] = stack[stack_ptr - index]; + ++stack_ptr; + } + break; + + case 0x4D: /* POPV */ + /* + * Pop stack into scalar variable + * ...argument 0 is variable ID + * ...stack 0 is value + */ + IF_CHECK_STACK(1) + { + variables[args[0]] = stack[--stack_ptr]; + } + break; + + case 0x4E: /* POPE */ + /* + * Pop stack into integer array element + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is value + */ + IF_CHECK_STACK(2) + { + variable_id = (unsigned int) args[0]; + + /* + * If variable is read-only, convert to writable array + */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x1c)) + { + /* + * Allocate a writable buffer for this array + */ + count = (unsigned int) variable_size[variable_id]; + long_temp = variables[variable_id]; + longptr_temp = (long *) jbi_malloc(count * sizeof(long)); + variables[variable_id] = (addr_t) longptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + /* copy previous contents into buffer */ + for (i = 0; i < count; ++i) + { + longptr_temp[i] = GET_DWORD(long_temp); + long_temp += 4L; + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x9c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + /* check that variable is a writable integer array */ + if ((attributes[variable_id] & 0x1c) != 0x18) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + longptr_temp = (long *) variables[variable_id]; + + /* pop the array index */ + index = (unsigned int) stack[--stack_ptr]; + + /* pop the value and store it into the array */ + longptr_temp[index] = stack[--stack_ptr]; + } + } + break; + + case 0x4F: /* POPA */ + /* + * Pop stack into Boolean array + * ...argument 0 is variable ID + * ...stack 0 is count + * ...stack 1 is array index + * ...stack 2 is value + */ + IF_CHECK_STACK(3) + { + variable_id = (unsigned int) args[0]; + + /* + * If variable is read-only, convert to writable array + */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x0c)) + { + /* + * Allocate a writable buffer for this array + */ + long_temp = (variable_size[variable_id] + 7L) >> 3L; + charptr_temp2 = (unsigned char *) variables[variable_id]; + charptr_temp = jbi_malloc((unsigned int) long_temp); + variables[variable_id] = (addr_t) charptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* zero the buffer */ + for (long_index = 0L; + long_index < long_temp; + ++long_index) + { + charptr_temp[long_index] = 0; + } + + /* copy previous contents into buffer */ + for (long_index = 0L; + long_index < variable_size[variable_id]; + ++long_index) + { +#if PORT==DOS + if ((attributes[variable_id] & 0x02) && + ((long_index & 0x0000FFFF) == 0L)) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index2 = long_index & 0xFFFF; + } +#else + long_index2 = long_index; +#endif + + if (charptr_temp2[long_index2 >> 3] & + (1 << (long_index2 & 7))) + { + charptr_temp[long_index >> 3] |= + (1 << (long_index & 7)); + } + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x8c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + /* check that variable is a writable Boolean array */ + if ((attributes[variable_id] & 0x1c) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + charptr_temp = (unsigned char *) variables[variable_id]; + + /* pop the count (number of bits to copy) */ + long_count = stack[--stack_ptr]; + + /* pop the array index */ + long_index = stack[--stack_ptr]; + + reverse = 0; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + + if (long_index > long_count) + { + reverse = 1; + long_temp = long_count; + long_count = 1 + long_index - long_count; + long_index = long_temp; + + /* reverse POPA is not supported */ + status = JBIC_BOUNDS_ERROR; + break; + } + else + { + long_count = 1 + long_count - long_index; + } + } + + /* pop the data */ + long_temp = stack[--stack_ptr]; + + if (long_count < 1) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + for (i = 0; i < (unsigned int) long_count; ++i) + { + if (long_temp & (1L << (long) i)) + { + charptr_temp[long_index >> 3L] |= + (1L << (long_index & 7L)); + } + else + { + charptr_temp[long_index >> 3L] &= + ~ (unsigned int) (1L << (long_index & 7L)); + } + ++long_index; + } + } + } + } + break; + + case 0x50: /* JMPZ */ + /* + * Pop stack and branch if zero + * ...argument 0 is address + * ...stack 0 is condition value + */ + IF_CHECK_STACK(1) + { + if (stack[--stack_ptr] == 0) + { + pc = args[0] + code_section; + CHECK_PC; + } + } + break; + + case 0x51: /* DS */ + case 0x52: /* IS */ + /* + * DRSCAN + * IRSCAN + * ...argument 0 is scan data variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + long_index = stack[--stack_ptr]; + long_count = stack[--stack_ptr]; + + reverse = 0; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + /* stack 2 = count */ + long_temp = long_count; + long_count = stack[--stack_ptr]; + + if (long_index > long_temp) + { + reverse = 1; + long_index = long_temp; + } + } + +#if PORT==DOS + if (((long_index & 0xFFFF0000) == 0) && + ((long_count & 0xFFFF0000) == 0)) + { + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + long_index &= 0x0000ffff; + charptr_temp = jbi_aca_out_buffer; + } + else + { + charptr_temp = (unsigned char *) variables[variable_id]; + } + + if (reverse) + { + /* allocate a buffer and reverse the data order */ + charptr_temp2 = charptr_temp; + charptr_temp = jbi_malloc((unsigned int) + ((long_count >> 3L) + 1L)); + + if (charptr_temp == NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + long_temp = long_index + long_count - 1; + long_index2 = 0; + while (long_index2 < long_count) + { + if (charptr_temp2[long_temp >> 3] & + (1 << (long_temp & 7))) + { + charptr_temp[long_index2 >> 3] |= + (1 << (long_index2 & 7)); + } + else + { + charptr_temp[long_index2 >> 3] &= + ~(1 << (long_index2 & 7)); + } + + --long_temp; + ++long_index2; + } + } + } + + if (opcode == 0x51) /* DS */ + { + status = jbi_do_drscan((unsigned int) long_count, + charptr_temp, (unsigned long) long_index); + } + else /* IS */ + { + status = jbi_do_irscan((unsigned int) long_count, + charptr_temp, (unsigned int) long_index); + } + + if (reverse) jbi_free(charptr_temp); + } + else if ((opcode == 0x51) && !reverse) + { + status = jbi_do_drscan_multi_page( + (unsigned int) args[0], + (unsigned long) long_count, + (unsigned long) long_index, version); + } + else + { + /* reverse multi-page scans are not supported */ + /* multi-page IR scans are not supported */ + status = JBIC_BOUNDS_ERROR; + } +#else + charptr_temp = (unsigned char *) variables[args[0]]; + + if (reverse) + { + /* allocate a buffer and reverse the data order */ + charptr_temp2 = charptr_temp; + charptr_temp = jbi_malloc((long_count >> 3) + 1); + if (charptr_temp == NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + long_temp = long_index + long_count - 1; + long_index2 = 0; + while (long_index2 < long_count) + { + if (charptr_temp2[long_temp >> 3] & + (1 << (long_temp & 7))) + { + charptr_temp[long_index2 >> 3] |= + (1 << (long_index2 & 7)); + } + else + { + charptr_temp[long_index2 >> 3] &= + ~(1 << (long_index2 & 7)); + } + + --long_temp; + ++long_index2; + } + } + } + + if (opcode == 0x51) /* DS */ + { + status = jbi_do_drscan((unsigned int) long_count, + charptr_temp, (unsigned long) long_index); + } + else /* IS */ + { + status = jbi_do_irscan((unsigned int) long_count, + charptr_temp, (unsigned int) long_index); + } +#endif + + if (reverse && (charptr_temp != NULL)) + { + jbi_free(charptr_temp); + } + } + break; + + case 0x53: /* DPRA */ + /* + * DRPRE with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_dr_preamble(count, index, charptr_temp); + } + break; + + case 0x54: /* DPOA */ + /* + * DRPOST with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_dr_postamble(count, index, charptr_temp); + } + break; + + case 0x55: /* IPRA */ + /* + * IRPRE with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_ir_preamble(count, index, charptr_temp); + } + break; + + case 0x56: /* IPOA */ + /* + * IRPOST with array data + * ...argument 0 is variable ID + * ...stack 0 is array index + * ...stack 1 is count + */ + IF_CHECK_STACK(2) + { + index = (unsigned int) stack[--stack_ptr]; + count = (unsigned int) stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + charptr_temp = (unsigned char *) variables[args[0]]; + status = jbi_set_ir_postamble(count, index, charptr_temp); + } + break; + + case 0x57: /* EXPT */ + /* + * EXPORT + * ...argument 0 is string ID + * ...stack 0 is integer expression + */ + IF_CHECK_STACK(1) + { +#if PORT==DOS + name_id = args[0]; + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + args[0]]; +#endif + long_temp = stack[--stack_ptr]; + jbi_export_integer(name, long_temp); + } + break; + + case 0x58: /* PSHE */ + /* + * Push integer array element + * ...argument 0 is variable ID + * ...stack 0 is array index + */ + IF_CHECK_STACK(1) + { + variable_id = (unsigned int) args[0]; + index = (unsigned int) stack[stack_ptr - 1]; + + /* check variable type */ + if ((attributes[variable_id] & 0x1f) == 0x19) + { + /* writable integer array */ + longptr_temp = (long *) variables[variable_id]; + stack[stack_ptr - 1] = longptr_temp[index]; + } + else if ((attributes[variable_id] & 0x1f) == 0x1c) + { + /* read-only integer array */ + long_temp = variables[variable_id] + (4L * index); + stack[stack_ptr - 1] = GET_DWORD(long_temp); + } + else + { + status = JBIC_BOUNDS_ERROR; + } + } + break; + + case 0x59: /* PSHA */ + /* + * Push Boolean array + * ...argument 0 is variable ID + * ...stack 0 is count + * ...stack 1 is array index + */ + IF_CHECK_STACK(2) + { + variable_id = (unsigned int) args[0]; + + /* check that variable is a Boolean array */ + if ((attributes[variable_id] & 0x18) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + charptr_temp = (unsigned char *) variables[variable_id]; + + /* pop the count (number of bits to copy) */ + count = (unsigned int) stack[--stack_ptr]; + + /* pop the array index */ + index = (unsigned int) stack[stack_ptr - 1]; + + if (version > 0) + { + /* stack 0 = array right index */ + /* stack 1 = array left index */ + count = 1 + count - index; + } + + if ((count < 1) || (count > 32)) + { + status = JBIC_BOUNDS_ERROR; + } + else + { +#if PORT==DOS + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (stack[stack_ptr - 1] >> 16), version); + charptr_temp = jbi_aca_out_buffer; + } +#endif + long_temp = 0L; + + for (i = 0; i < count; ++i) + { + if (charptr_temp[(i + index) >> 3] & + (1 << ((i + index) & 7))) + { + long_temp |= (1L << i); + } + } + + stack[stack_ptr - 1] = long_temp; + } + } + } + break; + + case 0x5A: /* DYNA */ + /* + * Dynamically change size of array + * ...argument 0 is variable ID + * ...stack 0 is new size + */ + IF_CHECK_STACK(1) + { + variable_id = (unsigned int) args[0]; + long_temp = stack[--stack_ptr]; + + if (long_temp > variable_size[variable_id]) + { + variable_size[variable_id] = long_temp; + + if (attributes[variable_id] & 0x10) + { + /* allocate integer array */ + long_temp *= 4; + } + else + { + /* allocate Boolean array */ + long_temp = (long_temp + 7) >> 3; + } + + /* + * If the buffer was previously allocated, free it + */ + if ((attributes[variable_id] & 0x80) && + (variables[variable_id] != (addr_t) NULL)) + { + jbi_free((void *) variables[variable_id]); + variables[variable_id] = (addr_t) NULL; + } + + /* + * Allocate a new buffer of the requested size + */ + variables[variable_id] = (addr_t) + jbi_malloc((unsigned int) long_temp); + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + /* + * Set the attribute bit to indicate that this buffer + * was dynamically allocated and should be freed later + */ + attributes[variable_id] |= 0x80; + + /* zero out memory */ + count = (unsigned int) + ((variable_size[variable_id] + 7L) / 8L); + charptr_temp = (unsigned char *) + (variables[variable_id]); + for (index = 0; index < count; ++index) + { + charptr_temp[index] = 0; + } + } + } + } + break; + + case 0x5B: /* EXPR */ + bad_opcode = 1; + break; + + case 0x5C: /* EXPV */ + /* + * Export Boolean array + * ...argument 0 is string ID + * ...stack 0 is variable ID + * ...stack 1 is array right index + * ...stack 2 is array left index + */ + IF_CHECK_STACK(3) + { + if (version == 0) + { + /* EXPV is not supported in JBC 1.0 */ + bad_opcode = 1; + break; + } +#if PORT==DOS + name_id = args[0]; + for (j = 0; j < 32; ++j) + { + name[j] = GET_BYTE(string_table + name_id + j); + } + name[32] = '\0'; +#else + name = (char *) &program[string_table + args[0]]; +#endif + variable_id = (unsigned int) stack[--stack_ptr]; + long_index = stack[--stack_ptr]; /* right index */ + long_index2 = stack[--stack_ptr]; /* left index */ + + if (long_index > long_index2) + { + /* reverse indices not supported */ + status = JBIC_BOUNDS_ERROR; + break; + } + + long_count = 1 + long_index2 - long_index; + + charptr_temp = (unsigned char *) variables[variable_id]; + charptr_temp2 = NULL; + +#if PORT==DOS + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index &= 0x0000FFFF; + } +#endif + + if ((long_index & 7L) != 0) + { + charptr_temp2 = jbi_malloc((unsigned int) + ((long_count + 7L) / 8L)); + if (charptr_temp2 == NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + long k = long_index; + for (i = 0; i < (unsigned int) long_count; ++i) + { + if (charptr_temp[k >> 3] & (1 << (k & 7))) + { + charptr_temp2[i >> 3] |= (1 << (i & 7)); + } + else + { + charptr_temp2[i >> 3] &= ~(1 << (i & 7)); + } + + ++k; + } + charptr_temp = charptr_temp2; + } + } + else if (long_index != 0) + { + charptr_temp = &charptr_temp[long_index >> 3]; + } + + jbi_export_boolean_array(name, charptr_temp, long_count); + + /* free allocated buffer */ + if (((long_index & 7L) != 0) && (charptr_temp2 != NULL)) + { + jbi_free(charptr_temp2); + } + } + break; + + case 0x80: /* COPY */ + /* + * Array copy + * ...argument 0 is dest ID + * ...argument 1 is source ID + * ...stack 0 is count + * ...stack 1 is dest index + * ...stack 2 is source index + */ + IF_CHECK_STACK(3) + { + long copy_count = stack[--stack_ptr]; + long copy_index = stack[--stack_ptr]; + long copy_index2 = stack[--stack_ptr]; + long destleft; + long src_count; + long dest_count; + int src_reverse = 0; + int dest_reverse = 0; + + reverse = 0; + + if (version > 0) + { + /* stack 0 = source right index */ + /* stack 1 = source left index */ + /* stack 2 = destination right index */ + /* stack 3 = destination left index */ + destleft = stack[--stack_ptr]; + + if (copy_count > copy_index) + { + src_reverse = 1; + reverse = 1; + src_count = 1 + copy_count - copy_index; + /* copy_index = source start index */ + } + else + { + src_count = 1 + copy_index - copy_count; + copy_index = copy_count; /* source start index */ + } + + if (copy_index2 > destleft) + { + dest_reverse = 1; + reverse = !reverse; + dest_count = 1 + copy_index2 - destleft; + copy_index2 = destleft; /* destination start index */ + } + else + { + dest_count = 1 + destleft - copy_index2; + /* copy_index2 = destination start index */ + } + + copy_count = (src_count < dest_count) ? src_count : dest_count; + + if ((src_reverse || dest_reverse) && + (src_count != dest_count)) + { + /* If either the source or destination is reversed, */ + /* we can't tolerate a length mismatch, because we */ + /* "left justify" the arrays when copying. This */ + /* won't work correctly with reversed arrays. */ + status = JBIC_BOUNDS_ERROR; + } + } + + count = (unsigned int) copy_count; + index = (unsigned int) copy_index; + index2 = (unsigned int) copy_index2; + + /* + * If destination is a read-only array, allocate a buffer + * and convert it to a writable array + */ + variable_id = (unsigned int) args[1]; + if ((version > 0) && ((attributes[variable_id] & 0x9c) == 0x0c)) + { + /* + * Allocate a writable buffer for this array + */ + long_temp = (variable_size[variable_id] + 7L) >> 3L; + charptr_temp2 = (unsigned char *) variables[variable_id]; + charptr_temp = jbi_malloc((unsigned int) long_temp); + variables[variable_id] = (addr_t) charptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + /* zero the buffer */ + for (long_index = 0L; + long_index < long_temp; + ++long_index) + { + charptr_temp[long_index] = 0; + } + + /* copy previous contents into buffer */ + for (long_index = 0L; + long_index < variable_size[variable_id]; + ++long_index) + { +#if PORT==DOS + if ((attributes[variable_id] & 0x02) && + ((long_index & 0x0000FFFF) == 0L)) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index2 = long_index & 0xFFFF; + } +#else + long_index2 = long_index; +#endif + + if (charptr_temp2[long_index2 >> 3] & + (1 << (long_index2 & 7))) + { + charptr_temp[long_index >> 3] |= + (1 << (long_index & 7)); + } + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x8c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + charptr_temp = (unsigned char *) variables[args[1]]; + charptr_temp2 = (unsigned char *) variables[args[0]]; + +#if PORT==DOS + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (copy_index >> 16), version); + charptr_temp2 = jbi_aca_out_buffer; + } +#endif + + /* check that destination is a writable Boolean array */ + if ((attributes[args[1]] & 0x1c) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + break; + } + + if (count < 1) + { + status = JBIC_BOUNDS_ERROR; + } + else + { + if (reverse) + { + index2 += (count - 1); + } + + for (i = 0; i < count; ++i) + { + if (charptr_temp2[index >> 3] & (1 << (index & 7))) + { + charptr_temp[index2 >> 3] |= (1 << (index2 & 7)); + } + else + { + charptr_temp[index2 >> 3] &= + ~(unsigned int) (1 << (index2 & 7)); + } + ++index; + if (reverse) --index2; else ++index2; + } + } + } + break; + + case 0x81: /* REVA */ + /* + * ARRAY COPY reversing bit order + * ...argument 0 is dest ID + * ...argument 1 is source ID + * ...stack 0 is dest index + * ...stack 1 is source index + * ...stack 2 is count + */ + bad_opcode = 1; + break; + + case 0x82: /* DSC */ + case 0x83: /* ISC */ + /* + * DRSCAN with capture + * IRSCAN with capture + * ...argument 0 is scan data variable ID + * ...argument 1 is capture variable ID + * ...stack 0 is capture index + * ...stack 1 is scan data index + * ...stack 2 is count + */ + IF_CHECK_STACK(3) + { + long scan_right, scan_left; + long capture_count = 0; + long scan_count = 0; + long capture_index = stack[--stack_ptr]; + long scan_index = stack[--stack_ptr]; + if (version > 0) + { + /* stack 0 = capture right index */ + /* stack 1 = capture left index */ + /* stack 2 = scan right index */ + /* stack 3 = scan left index */ + /* stack 4 = count */ + scan_right = stack[--stack_ptr]; + scan_left = stack[--stack_ptr]; + capture_count = 1 + scan_index - capture_index; + scan_count = 1 + scan_left - scan_right; + scan_index = scan_right; + } + long_count = stack[--stack_ptr]; + + /* + * If capture array is read-only, allocate a buffer + * and convert it to a writable array + */ + variable_id = (unsigned int) args[1]; + if ((version > 0) && ((attributes[variable_id] & 0x9c) == 0x0c)) + { + /* + * Allocate a writable buffer for this array + */ + long_temp = (variable_size[variable_id] + 7L) >> 3L; + charptr_temp2 = (unsigned char *) variables[variable_id]; + charptr_temp = jbi_malloc((unsigned int) long_temp); + variables[variable_id] = (addr_t) charptr_temp; + + if (variables[variable_id] == (addr_t) NULL) + { + status = JBIC_OUT_OF_MEMORY; + break; + } + else + { + /* zero the buffer */ + for (long_index = 0L; + long_index < long_temp; + ++long_index) + { + charptr_temp[long_index] = 0; + } + + /* copy previous contents into buffer */ + for (long_index = 0L; + long_index < variable_size[variable_id]; + ++long_index) + { +#if PORT==DOS + if ((attributes[variable_id] & 0x02) && + ((long_index & 0x0000FFFF) == 0L)) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (long_index >> 16), version); + charptr_temp = jbi_aca_out_buffer; + long_index2 = long_index & 0xFFFF; + } +#else + long_index2 = long_index; +#endif + + if (charptr_temp2[long_index2 >> 3] & + (1 << (long_index2 & 7))) + { + charptr_temp[long_index >> 3] |= + (1 << (long_index & 7)); + } + } + + /* set bit 7 - buffer was dynamically allocated */ + attributes[variable_id] |= 0x80; + + /* clear bit 2 - variable is writable */ + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } + } + +#if PORT==DOS + /* for 16-bit version, allow writing in allocated buffers */ + if ((version > 0) && + ((attributes[variable_id] & 0x9c) == 0x8c)) + { + attributes[variable_id] &= ~0x04; + attributes[variable_id] |= 0x01; + } +#endif + + charptr_temp = (unsigned char *) variables[args[0]]; + charptr_temp2 = (unsigned char *) variables[args[1]]; + +#if PORT==DOS + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + /* initialized compressed Boolean array */ + jbi_uncompress_page(variable_id, + (int) (scan_index >> 16), version); + scan_index &= 0x0000ffff; + charptr_temp = jbi_aca_out_buffer; + } +#endif + + if ((version > 0) && + ((long_count > capture_count) || (long_count > scan_count))) + { + status = JBIC_BOUNDS_ERROR; + } + + /* check that capture array is a writable Boolean array */ + if ((attributes[args[1]] & 0x1c) != 0x08) + { + status = JBIC_BOUNDS_ERROR; + } + + if (status == JBIC_SUCCESS) + { + if (opcode == 0x82) /* DSC */ + { + status = jbi_swap_dr((unsigned int) long_count, + charptr_temp, (unsigned long) scan_index, + charptr_temp2, (unsigned int) capture_index); + } + else /* ISC */ + { + status = jbi_swap_ir((unsigned int) long_count, + charptr_temp, (unsigned int) scan_index, + charptr_temp2, (unsigned int) capture_index); + } + } + } + break; + + case 0x84: /* WAIT */ + /* + * WAIT + * ...argument 0 is wait state + * ...argument 1 is end state + * ...stack 0 is cycles + * ...stack 1 is microseconds + */ + IF_CHECK_STACK(2) + { + long_temp = stack[--stack_ptr]; + + if (long_temp != 0L) + { + status = jbi_do_wait_cycles(long_temp, (unsigned int) args[0]); + } + + long_temp = stack[--stack_ptr]; + + if ((status == JBIC_SUCCESS) && (long_temp != 0L)) + { + status = jbi_do_wait_microseconds(long_temp, (unsigned int) args[0]); + } + + if ((status == JBIC_SUCCESS) && (args[1] != args[0])) + { + status = jbi_goto_jtag_state((unsigned int) args[1]); + } + + if (version > 0) + { + --stack_ptr; /* throw away MAX cycles */ + --stack_ptr; /* throw away MAX microseconds */ + } + } + break; + + case 0x85: /* VS */ + /* + * VECTOR + * ...argument 0 is dir data variable ID + * ...argument 1 is scan data variable ID + * ...stack 0 is dir array index + * ...stack 1 is scan array index + * ...stack 2 is count + */ + bad_opcode = 1; + break; + + case 0xC0: /* CMPA */ + /* + * Array compare + * ...argument 0 is source 1 ID + * ...argument 1 is source 2 ID + * ...argument 2 is mask ID + * ...stack 0 is source 1 index + * ...stack 1 is source 2 index + * ...stack 2 is mask index + * ...stack 3 is count + */ + IF_CHECK_STACK(4) + { + long a, b; + unsigned char *source1 = (unsigned char *) variables[args[0]]; + unsigned char *source2 = (unsigned char *) variables[args[1]]; + unsigned char *mask = (unsigned char *) variables[args[2]]; + unsigned long index1 = stack[--stack_ptr]; + unsigned long index2 = stack[--stack_ptr]; + unsigned long mask_index = stack[--stack_ptr]; + long_count = stack[--stack_ptr]; + + if (version > 0) + { + /* stack 0 = source 1 right index */ + /* stack 1 = source 1 left index */ + /* stack 2 = source 2 right index */ + /* stack 3 = source 2 left index */ + /* stack 4 = mask right index */ + /* stack 5 = mask left index */ + long mask_right = stack[--stack_ptr]; + long mask_left = stack[--stack_ptr]; + a = 1 + index2 - index1; /* source 1 count */ + b = 1 + long_count - mask_index; /* source 2 count */ + a = (a < b) ? a : b; + b = 1 + mask_left - mask_right; /* mask count */ + a = (a < b) ? a : b; + index2 = mask_index; /* source 2 start index */ + mask_index = mask_right; /* mask start index */ + long_count = a; + } + + long_temp = 1L; + + if (long_count < 1) + { + status = JBIC_BOUNDS_ERROR; + } + else + { +#if PORT==DOS + variable_id = (unsigned int) args[0]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + jbi_uncompress_page(variable_id, + (int) (index1 >> 16), version); + index1 &= 0x0000ffff; + source1 = jbi_aca_out_buffer; + } + + variable_id = (unsigned int) args[1]; + if ((attributes[variable_id] & 0x1e) == 0x0e) + { + jbi_uncompress_page(variable_id, + (int) (index2 >> 16), version); + index2 &= 0x0000ffff; + source2 = jbi_aca_out_buffer; + } +#endif + count = (unsigned int) long_count; + + for (i = 0; i < count; ++i) + { + if (mask[mask_index >> 3] & (1 << (mask_index & 7))) + { + a = source1[index1 >> 3] & (1 << (index1 & 7)) + ? 1 : 0; + b = source2[index2 >> 3] & (1 << (index2 & 7)) + ? 1 : 0; + + if (a != b) long_temp = 0L; /* failure */ + } + ++index1; + ++index2; + ++mask_index; + } + } + + stack[stack_ptr++] = long_temp; + } + break; + + case 0xC1: /* VSC */ + /* + * VECTOR with capture + * ...argument 0 is dir data variable ID + * ...argument 1 is scan data variable ID + * ...argument 2 is capture variable ID + * ...stack 0 is capture index + * ...stack 1 is scan data index + * ...stack 2 is dir data index + * ...stack 3 is count + */ + bad_opcode = 1; + break; + + default: + /* + * Unrecognized opcode -- ERROR! + */ + bad_opcode = 1; + break; + } + + if (bad_opcode) + { + status = JBIC_ILLEGAL_OPCODE; + } + + if ((stack_ptr < 0) || (stack_ptr >= JBI_STACK_SIZE)) + { + status = JBIC_STACK_OVERFLOW; + } + + if (status != JBIC_SUCCESS) + { + done = 1; + *error_address = (long) (opcode_address - code_section); + } + } + jbi_dbg(DEBUG_DETAIL, "debug_cnt(total): 0x%lx\n", debug_cnt); + + jbi_dbg(DEBUG_NOISY, "jbi_free_jtag_padding_buffers\n"); + jbi_free_jtag_padding_buffers(reset_jtag); + + /* + * Free all dynamically allocated arrays + */ + jbi_dbg(DEBUG_NOISY, "jbi_free_attributes\n"); + if ((attributes != NULL) && (variables != NULL)) + { + for (i = 0; i < (unsigned int) symbol_count; ++i) + { + if ((attributes[i] & 0x80) && (variables[i] != (addr_t) NULL) + && (variables[i] != (addr_t) 1)) + { + jbi_free((void *) variables[i]); + } + } + } + + if (variables != NULL) jbi_free(variables); + + if (variable_size != NULL) jbi_free(variable_size); + + if (attributes != NULL) jbi_free(attributes); + + if (proc_attributes != NULL) jbi_free(proc_attributes); + + jbi_dbg(DEBUG_NOISY, "return status %d\n", status); + kfree(message_buffer); + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_get_note +( + PROGRAM_PTR program, + long program_size, + long *offset, + char *key, + char *value, + int length +) + +/* */ +/* Description: Gets key and value of NOTE fields in the JBC file. */ +/* Can be called in two modes: if offset pointer is NULL, */ +/* then the function searches for note fields which match */ +/* the key string provided. If offset is not NULL, then */ +/* the function finds the next note field of any key, */ +/* starting at the offset specified by the offset pointer. */ +/* */ +/* Returns: JBIC_SUCCESS for success, else appropriate error code */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_UNEXPECTED_END; + unsigned long note_strings = 0L; + unsigned long note_table = 0L; + unsigned long note_count = 0L; + unsigned long first_word = 0L; + int version = 0; + int delta = 0; + char *key_ptr; + char *value_ptr; + int i; + +#if PORT==DOS + int count = 0; + int done = 0; + long long_index = 0; + char key_buffer[256]; + char value_buffer[256]; + + jbi_program = program; +#endif + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + version = (int) (first_word & 1L); + delta = version * 8; + + note_strings = GET_DWORD(8 + delta); + note_table = GET_DWORD(12 + delta); + note_count = GET_DWORD(44 + (2 * delta)); + } + + if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) + { + status = JBIC_IO_ERROR; + } + else if (note_count > 0L) + { + if (offset == NULL) + { + /* + * We will search for the first note with a specific key, and + * return only the value + */ + for (i = 0; (i < (int) note_count) && (status != JBIC_SUCCESS); ++i) + { +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + GET_DWORD(note_table + (8 * i)); + while ((count < 255) && !done) + { + key_buffer[count] = GET_BYTE(long_index); + if (key_buffer[count] == '\0') done = 1; + ++long_index; + ++count; + } + key_buffer[255] = '\0'; + key_ptr = key_buffer; +#else + key_ptr = (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i))]; +#endif + if ((key != NULL) && (jbi_stricmp(key, key_ptr) == 0)) + { + status = JBIC_SUCCESS; + +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + GET_DWORD(note_table + (8 * i) + 4); + while ((count < 255) && !done) + { + value_buffer[count] = GET_BYTE(long_index); + if (value_buffer[count] == '\0') done = 1; + ++long_index; + ++count; + } + value_buffer[255] = '\0'; + value_ptr = value_buffer; +#else + value_ptr = (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i) + 4)]; +#endif + + if (value != NULL) + { + jbi_strncpy(value, value_ptr, length); + } + } + } + } + else + { + /* + * We will search for the next note, regardless of the key, and + * return both the value and the key + */ + + i = (int) *offset; + + if ((i >= 0) && (i < (int) note_count)) + { + status = JBIC_SUCCESS; + + if (key != NULL) + { +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + + GET_DWORD(note_table + (8 * i)); + + while ((count < length) && !done) + { + key[count] = GET_BYTE(long_index); + if (key[count] == '\0') done = 1; + ++long_index; + ++count; + } +#else + jbi_strncpy(key, (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i))], length); +#endif + } + + if (value != NULL) + { +#if PORT==DOS + done = 0; + count = 0; + long_index = note_strings + + GET_DWORD(note_table + (8 * i) + 4); + + while ((count < length) && !done) + { + value[count] = GET_BYTE(long_index); + if (value[count] == '\0') done = 1; + ++long_index; + ++count; + } +#else + jbi_strncpy(value, (char *) &program[note_strings + + GET_DWORD(note_table + (8 * i) + 4)], length); +#endif + } + + *offset = i + 1; + } + } + } + + return (status); +} + +/****************************************************************************/ +/* */ + +JBI_RETURN_TYPE jbi_check_crc +( + PROGRAM_PTR program, + long program_size, + unsigned short *expected_crc, + unsigned short *actual_crc +) + +/* */ +/* Description: This function reads the entire input file and computes */ +/* the CRC of everything up to the CRC field. */ +/* */ +/* Returns: JBIC_SUCCESS for success, JBIC_CRC_ERROR for failure */ +/* */ +/****************************************************************************/ +{ + JBI_RETURN_TYPE status = JBIC_SUCCESS; + unsigned short local_expected, local_actual, shift_reg = 0xffff; + int bit, feedback; + unsigned char databyte; + unsigned long i; + unsigned long crc_section = 0L; + unsigned long first_word = 0L; + int version = 0; + int delta = 0; + +#if PORT==DOS + jbi_program = program; +#endif + + if (program_size > 52L) + { + first_word = GET_DWORD(0); + version = (int) (first_word & 1L); + delta = version * 8; + + crc_section = GET_DWORD(32 + delta); + } + + if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) + { + status = JBIC_IO_ERROR; + } + + if (crc_section >= (unsigned long) program_size) + { + status = JBIC_IO_ERROR; + } + + if (status == JBIC_SUCCESS) + { + local_expected = (unsigned short) GET_WORD(crc_section); + if (expected_crc != NULL) *expected_crc = local_expected; + + for (i = 0; i < crc_section; ++i) + { + databyte = GET_BYTE(i); + for (bit = 0; bit < 8; bit++) /* compute for each bit */ + { + feedback = (databyte ^ shift_reg) & 0x01; + shift_reg >>= 1; /* shift the shift register */ + if (feedback) shift_reg ^= 0x8408; /* invert selected bits */ + databyte >>= 1; /* get the next bit of input_byte */ + } + } + + local_actual = (unsigned short) ~shift_reg; + if (actual_crc != NULL) *actual_crc = local_actual; + + if (local_expected != local_actual) + { + status = JBIC_CRC_ERROR; + } + } + + return (status); +} + +JBI_RETURN_TYPE jbi_get_file_info +( + PROGRAM_PTR program, + long program_size, + int *format_version, + int *action_count, + int *procedure_count +) +{ + JBI_RETURN_TYPE status = JBIC_IO_ERROR; + unsigned long first_word = 0; + int version = 0; + +#if PORT==DOS + jbi_program = program; +#endif + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + + if ((first_word == 0x4A414D00L) || (first_word == 0x4A414D01L)) + { + status = JBIC_SUCCESS; + + version = (int) (first_word & 1L); + *format_version = version + 1; + + if (version > 0) + { + *action_count = (int) GET_DWORD(48); + *procedure_count = (int) GET_DWORD(52); + } + } + + } + + return (status); +} + +JBI_RETURN_TYPE jbi_get_action_info +( + PROGRAM_PTR program, + long program_size, + int index, + char **name, + char **description, + JBI_PROCINFO **procedure_list +) +{ + JBI_RETURN_TYPE status = JBIC_IO_ERROR; + JBI_PROCINFO *procptr = NULL; + JBI_PROCINFO *tmpptr = NULL; + unsigned long first_word = 0L; + unsigned long action_table = 0L; + unsigned long proc_table = 0L; + unsigned long string_table = 0L; + unsigned long note_strings = 0L; + unsigned long action_count = 0L; + unsigned long proc_count = 0L; + unsigned long act_name_id = 0L; + unsigned long act_desc_id = 0L; + unsigned long act_proc_id = 0L; + unsigned long act_proc_name = 0L; + unsigned char act_proc_attribute = 0; + +#if PORT==DOS + int i, length; + jbi_program = program; +#endif + + /* + * Read header information + */ + if (program_size > 52L) + { + first_word = GET_DWORD(0); + + if (first_word == 0x4A414D01L) + { + action_table = GET_DWORD(4); + proc_table = GET_DWORD(8); + string_table = GET_DWORD(12); + note_strings = GET_DWORD(16); + action_count = GET_DWORD(48); + proc_count = GET_DWORD(52); + + if (index < (int) action_count) + { + act_name_id = GET_DWORD(action_table + (12 * index)); + act_desc_id = GET_DWORD(action_table + (12 * index) + 4); + act_proc_id = GET_DWORD(action_table + (12 * index) + 8); + +#if PORT==DOS + length = 0; + while (GET_BYTE(string_table + act_name_id + length) != 0) ++length; + *name = jbi_malloc(length + 1); + if (*name == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + for (i = 0; i < length; ++i) + { + (*name)[i] = GET_BYTE(string_table + act_name_id + i); + } + (*name)[length] = '\0'; + } +#else + *name = (char *) &program[string_table + act_name_id]; +#endif + + if (act_desc_id < (note_strings - string_table)) + { +#if PORT==DOS + length = 0; + while (GET_BYTE(string_table + act_desc_id + length) != 0) ++length; + *description = jbi_malloc(length + 1); + if (*description == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + for (i = 0; i < length; ++i) + { + (*description)[i] = GET_BYTE(string_table + act_desc_id + i); + } + (*description)[length] = '\0'; + } +#else + *description = (char *) &program[string_table + act_desc_id]; +#endif + } + + do + { + act_proc_name = GET_DWORD(proc_table + (13 * act_proc_id)); + act_proc_attribute = (unsigned char) + (GET_BYTE(proc_table + (13 * act_proc_id) + 8) & 0x03); + + procptr = (JBI_PROCINFO *) jbi_malloc(sizeof(JBI_PROCINFO)); + + if (procptr == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { +#if PORT==DOS + length = 0; + while (GET_BYTE(string_table + act_proc_name + length) != 0) ++length; + procptr->name = jbi_malloc(length + 1); + if (procptr->name == NULL) + { + status = JBIC_OUT_OF_MEMORY; + } + else + { + for (i = 0; i < length; ++i) + { + procptr->name[i] = + GET_BYTE(string_table + act_proc_name + i); + } + procptr->name[length] = '\0'; + } +#else + procptr->name = (char *) + &program[string_table + act_proc_name]; +#endif + procptr->attributes = act_proc_attribute; + procptr->next = NULL; + + /* add record to end of linked list */ + if (*procedure_list == NULL) + { + *procedure_list = procptr; + } + else + { + tmpptr = *procedure_list; + while (tmpptr->next != NULL) tmpptr = tmpptr->next; + tmpptr->next = procptr; + } + } + + act_proc_id = + GET_DWORD(proc_table + (13 * act_proc_id) + 4); + } + while ((act_proc_id != 0) && (act_proc_id < proc_count)); + } + } + + } + + return (status); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h new file mode 100644 index 0000000000..28669dc81f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbiport.h @@ -0,0 +1,45 @@ +/****************************************************************************/ +/* */ +/* Module: jbiport.h */ +/* */ +/* Copyright (C) Altera Corporation 2000-2001 */ +/* */ +/* Description: Defines porting macros */ +/* */ +/****************************************************************************/ + +#ifndef INC_JBIPORT_H +#define INC_JBIPORT_H + +/* +* PORT defines the target platform: DOS, WINDOWS, UNIX, or EMBEDDED +* +* PORT = DOS means a 16-bit DOS console-mode application +* +* PORT = WINDOWS means a 32-bit WIN32 console-mode application for +* Windows 95, 98, 2000, ME or NT. On NT this will use the +* DeviceIoControl() API to access the Parallel Port. +* +* PORT = UNIX means any UNIX system. BitBlaster access is support via +* the standard ANSI system calls open(), read(), write(). +* The ByteBlaster is not supported. +* +* PORT = EMBEDDED means all DOS, WINDOWS, and UNIX code is excluded. +* Remaining code supports 16 and 32-bit compilers. +* Additional porting steps may be necessary. See readme +* file for more details. +*/ + +#define DOS 2 +#define WINDOWS 3 +#define UNIX 4 +#define EMBEDDED 5 + +#define PORT EMBEDDED + +#ifndef PORT +/* change this line to build a different port */ +#define PORT WINDOWS +#endif + +#endif /* INC_JBIPORT_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c new file mode 100644 index 0000000000..396c92caca --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.c @@ -0,0 +1,2518 @@ +/****************************************************************************/ +/* */ +/* Module: jbistub.c */ +/* */ +/* Copyright (C) Altera Corporation 1997-2001 */ +/* */ +/* Description: Jam STAPL ByteCode Player main source file */ +/* */ +/* Supports Altera ByteBlaster hardware download cable */ +/* on Windows 95 and Windows NT operating systems. */ +/* (A device driver is required for Windows NT.) */ +/* */ +/* Also supports BitBlaster hardware download cable on */ +/* Windows 95, Windows NT, and UNIX platforms. */ +/* */ +/* Revisions: 1.1 fixed control port initialization for ByteBlaster */ +/* 2.0 added support for STAPL bytecode format, added code */ +/* to get printer port address from Windows registry */ +/* 2.1 improved messages, fixed delay-calibration bug in */ +/* 16-bit DOS port, added support for "alternative */ +/* cable X", added option to control whether to reset */ +/* the TAP after execution, moved porting macros into */ +/* jbiport.h */ +/* 2.2 added support for static memory */ +/* fixed /W4 warnings */ +/* */ +/****************************************************************************/ + +#ifndef NO_ALTERA_STDIO +#define NO_ALTERA_STDIO +#endif + +#if 0 +#if ( _MSC_VER >= 800 ) +#pragma warning(disable:4115) +#pragma warning(disable:4201) +#pragma warning(disable:4214) +#pragma warning(disable:4514) +#endif +#endif + +#include "jbiport.h" + +#if PORT == WINDOWS +#include +#else +typedef int BOOL; +typedef unsigned char BYTE; +typedef unsigned short WORD; +#if PORT == EMBEDDED +typedef unsigned int DWORD; +#else +typedef unsigned long DWORD; +#endif +#define TRUE 1 +#define FALSE 0 +#endif + +#if PORT != EMBEDDED +#include +#include +#include +#include +#include +#include +#endif + +#include + +#include "jbiexprt.h" +#include "jbistub.h" + +#if defined(USE_STATIC_MEMORY) + #define N_STATIC_MEMORY_KBYTES ((unsigned int) USE_STATIC_MEMORY) + #define N_STATIC_MEMORY_BYTES (N_STATIC_MEMORY_KBYTES * 1024) + #define POINTER_ALIGNMENT sizeof(DWORD) +#else /* USE_STATIC_MEMORY */ + /* #include */ + #define POINTER_ALIGNMENT sizeof(BYTE) +#endif /* USE_STATIC_MEMORY */ + +#if PORT != EMBEDDED +#include +#include +#include +#include +#include +#endif + +#if PORT == DOS +#include +#endif + +int jbi_debug_level = DEBUG_NONE; +static long jbi_delay_us = 0, jbi_delay_count = 0, jbi_peak_us = 0; + +void __jbi_jtag_udelay(unsigned long us) +{ + udelay(us); +} +void jbi_jtag_udelay(unsigned long us) __attribute__((weak, alias("__jbi_jtag_udelay"))); + +#if PORT == WINDOWS +#define PGDC_IOCTL_GET_DEVICE_INFO_PP 0x00166A00L +#define PGDC_IOCTL_READ_PORT_PP 0x00166A04L +#define PGDC_IOCTL_WRITE_PORT_PP 0x0016AA08L +#define PGDC_IOCTL_PROCESS_LIST_PP 0x0016AA1CL +#define PGDC_READ_INFO 0x0a80 +#define PGDC_READ_PORT 0x0a81 +#define PGDC_WRITE_PORT 0x0a82 +#define PGDC_PROCESS_LIST 0x0a87 +#define PGDC_HDLC_NTDRIVER_VERSION 2 +#define PORT_IO_BUFFER_SIZE 256 +#endif + +#if PORT == WINDOWS +#ifdef __BORLANDC__ +/* create dummy inp() and outp() functions for Borland 32-bit compile */ +WORD inp(WORD address) { address = address; return(0); } +void outp(WORD address, WORD data) { address = address; data = data; } +#else +#pragma intrinsic (inp, outp) +#endif +#endif + +/* +* For Borland C compiler (16-bit), set the stack size +*/ +#if PORT == DOS +#ifdef __BORLANDC__ +extern unsigned int _stklen = 50000; +#endif +#endif + +/************************************************************************ +* +* Global variables +*/ + +/* file buffer for Jam STAPL ByteCode input file */ +#if PORT == DOS +unsigned char **file_buffer = NULL; +#else +unsigned char *file_buffer = NULL; +#endif +long file_pointer = 0L; +long file_length = 0L; + +/* delay count for one millisecond delay */ +long one_ms_delay = 0L; + +/* serial port interface available on all platforms */ +BOOL jtag_hardware_initialized = FALSE; +char *serial_port_name = NULL; +BOOL specified_com_port = FALSE; +int com_port = -1; +void initialize_jtag_hardware(void); +void close_jtag_hardware(void); + +#if defined(USE_STATIC_MEMORY) + unsigned char static_memory_heap[N_STATIC_MEMORY_BYTES] = { 0 }; +#endif /* USE_STATIC_MEMORY */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + unsigned int n_bytes_allocated = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + unsigned int peak_memory_usage = 0; + unsigned int peak_allocations = 0; + unsigned int n_allocations = 0; +#if defined(USE_STATIC_MEMORY) + unsigned int n_bytes_not_recovered = 0; +#endif /* USE_STATIC_MEMORY */ + const DWORD BEGIN_GUARD = 0x01234567; + const DWORD END_GUARD = 0x76543210; +#endif /* MEM_TRACKER */ + +#if PORT == WINDOWS || PORT == DOS +/* parallel port interface available on PC only */ +BOOL specified_lpt_port = FALSE; +BOOL specified_lpt_addr = FALSE; +int lpt_port = 1; +int initial_lpt_ctrl = 0; +WORD lpt_addr = 0x3bc; +WORD lpt_addr_table[3] = { 0x3bc, 0x378, 0x278 }; +BOOL alternative_cable_l = FALSE; +BOOL alternative_cable_x = FALSE; +void write_byteblaster(int port, int data); +int read_byteblaster(int port); +#endif + +#if PORT==WINDOWS +#ifndef __BORLANDC__ +WORD lpt_addresses_from_registry[4] = { 0 }; +#endif +#endif + +#if PORT == WINDOWS +/* variables to manage cached I/O under Windows NT */ +BOOL windows_nt = FALSE; +int port_io_count = 0; +HANDLE nt_device_handle = INVALID_HANDLE_VALUE; +struct PORT_IO_LIST_STRUCT +{ + USHORT command; + USHORT data; +} port_io_buffer[PORT_IO_BUFFER_SIZE]; +extern void flush_ports(void); +BOOL initialize_nt_driver(void); +#endif + +/* function prototypes to allow forward reference */ +extern void delay_loop(long count); + +/* +* This structure stores information about each available vector signal +*/ +struct VECTOR_LIST_STRUCT +{ + char *signal_name; + int hardware_bit; + int vector_index; +}; + +struct VECTOR_LIST_STRUCT vector_list[] = +{ + /* add a record here for each vector signal */ + { "", 0, -1 } +}; + +#define VECTOR_SIGNAL_COUNT ((int)(sizeof(vector_list)/sizeof(vector_list[0]))) + +BOOL verbose = FALSE; + +/************************************************************************ +* +* Customized interface functions for Jam STAPL ByteCode Player I/O: +* +* jbi_jtag_io() +* jbi_message() +* jbi_delay() +*/ + +int jbi_jtag_io(int tms, int tdi, int read_tdo) +{ +#if PORT == WINDOWS || PORT == DOS + int data = 0; +#endif + int tdo = 0; + int i = 0; + int result = 0; + char ch_data = 0; + + if (!jtag_hardware_initialized) + { + initialize_jtag_hardware(); + jtag_hardware_initialized = TRUE; + } + + if (specified_com_port) + { + ch_data = (char) + ((tdi ? 0x01 : 0) | (tms ? 0x02 : 0) | 0x60); + + write(com_port, &ch_data, 1); + + if (read_tdo) + { + ch_data = 0x7e; + write(com_port, &ch_data, 1); + for (i = 0; (i < 100) && (result != 1); ++i) + { + result = read(com_port, &ch_data, 1); + } + if (result == 1) + { + tdo = ch_data & 0x01; + } + else + { + fprintf(stderr, "Error: BitBlaster not responding\n"); + } + } + + ch_data = (char) + ((tdi ? 0x01 : 0) | (tms ? 0x02 : 0) | 0x64); + + write(com_port, &ch_data, 1); + } + else + { +#if PORT == WINDOWS || PORT == DOS + data = (alternative_cable_l ? ((tdi ? 0x01 : 0) | (tms ? 0x04 : 0)) : + (alternative_cable_x ? ((tdi ? 0x01 : 0) | (tms ? 0x04 : 0) | 0x10) : + ((tdi ? 0x40 : 0) | (tms ? 0x02 : 0)))); + + write_byteblaster(0, data); + + if (read_tdo) + { + tdo = read_byteblaster(1); + tdo = (alternative_cable_l ? ((tdo & 0x40) ? 1 : 0) : + (alternative_cable_x ? ((tdo & 0x10) ? 1 : 0) : + ((tdo & 0x80) ? 0 : 1))); + } + + write_byteblaster(0, data | (alternative_cable_l ? 0x02 : (alternative_cable_x ? 0x02: 0x01))); + + write_byteblaster(0, data); +#elif PORT == EMBEDDED + /* Output variables TDI, TMS to the corresponding pin; As read_tdo, return the corresponding pin to the variable tdo */ + tdo = jbi_jtag_io_(tms, tdi, read_tdo); +#else + /* parallel port interface not available */ + tdo = 0; +#endif + } + + return (tdo); +} + +void jbi_message(char *message_text) +{ + puts(message_text); + puts("\n"); + fflush(stdout); +} + +void jbi_export_integer(char *key, long value) +{ + if (verbose) + { + printf("Export: key = \"%s\", value = %ld\n", key, value); + fflush(stdout); + } +} + +#define HEX_LINE_CHARS 72 +#define HEX_LINE_BITS (HEX_LINE_CHARS * 4) + +char conv_to_hex(unsigned long value) +{ + char c; + + if (value > 9) + { + c = (char) (value + ('A' - 10)); + } + else + { + c = (char) (value + '0'); + } + + return (c); +} + +void jbi_export_boolean_array(char *key, unsigned char *data, long count) +{ + char string[HEX_LINE_CHARS + 1]; + long i, offset; + unsigned long size, line, lines, linebits, value, j, k; + + if (verbose) + { + if (count > HEX_LINE_BITS) + { + printf("Export: key = \"%s\", %ld bits, value = HEX\n", key, count); + lines = (count + (HEX_LINE_BITS - 1)) / HEX_LINE_BITS; + + for (line = 0; line < lines; ++line) + { + if (line < (lines - 1)) + { + linebits = HEX_LINE_BITS; + size = HEX_LINE_CHARS; + offset = count - ((line + 1) * HEX_LINE_BITS); + } + else + { + linebits = count - ((lines - 1) * HEX_LINE_BITS); + size = (linebits + 3) / 4; + offset = 0L; + } + + string[size] = '\0'; + j = size - 1; + value = 0; + + for (k = 0; k < linebits; ++k) + { + i = k + offset; + if (data[i >> 3] & (1 << (i & 7))) value |= (1 << (i & 3)); + if ((i & 3) == 3) + { + string[j] = conv_to_hex(value); + value = 0; + --j; + } + } + if ((k & 3) > 0) string[j] = conv_to_hex(value); + + printf("%s\n", string); + } + + fflush(stdout); + } + else + { + size = (count + 3) / 4; + string[size] = '\0'; + j = size - 1; + value = 0; + + for (i = 0; i < count; ++i) + { + if (data[i >> 3] & (1 << (i & 7))) value |= (1 << (i & 3)); + if ((i & 3) == 3) + { + string[j] = conv_to_hex(value); + value = 0; + --j; + } + } + if ((i & 3) > 0) string[j] = conv_to_hex(value); + + printf("Export: key = \"%s\", %ld bits, value = HEX %s\n", + key, count, string); + fflush(stdout); + } + } +} + +void jbi_delay(long microseconds) +{ + if (jbi_peak_us < microseconds) { + jbi_peak_us = microseconds; + } + jbi_delay_us += microseconds; + jbi_delay_count++; + +#if PORT == WINDOWS + /* if Windows NT, flush I/O cache buffer before delay loop */ + if (windows_nt && (port_io_count > 0)) flush_ports(); +#endif + +#if PORT == EMBEDDED + udelay(microseconds); +#else + delay_loop(microseconds * + ((one_ms_delay / 1000L) + ((one_ms_delay % 1000L) ? 1 : 0))); +#endif +} + +int jbi_vector_map +( + int signal_count, + char **signals +) +{ + int signal, vector, ch_index, diff; + int matched_count = 0; + char l, r; + + for (vector = 0; (vector < VECTOR_SIGNAL_COUNT); ++vector) + { + vector_list[vector].vector_index = -1; + } + + for (signal = 0; signal < signal_count; ++signal) + { + diff = 1; + for (vector = 0; (diff != 0) && (vector < VECTOR_SIGNAL_COUNT); + ++vector) + { + if (vector_list[vector].vector_index == -1) + { + ch_index = 0; + do + { + l = signals[signal][ch_index]; + r = vector_list[vector].signal_name[ch_index]; + diff = (((l >= 'a') && (l <= 'z')) ? (l - ('a' - 'A')) : l) + - (((r >= 'a') && (r <= 'z')) ? (r - ('a' - 'A')) : r); + ++ch_index; + } + while ((diff == 0) && (l != '\0') && (r != '\0')); + + if (diff == 0) + { + vector_list[vector].vector_index = signal; + ++matched_count; + } + } + } + } + + return (matched_count); +} + +int jbi_vector_io +( + int signal_count, + long *dir_vect, + long *data_vect, + long *capture_vect +) +{ + int signal, vector, bit; + int matched_count = 0; + int data = 0; + int mask = 0; + int dir = 0; + int i = 0; + int result = 0; + char ch_data = 0; + + if (!jtag_hardware_initialized) + { + initialize_jtag_hardware(); + jtag_hardware_initialized = TRUE; + } + + /* + * Collect information about output signals + */ + for (vector = 0; vector < VECTOR_SIGNAL_COUNT; ++vector) + { + signal = vector_list[vector].vector_index; + + if ((signal >= 0) && (signal < signal_count)) + { + bit = (1 << vector_list[vector].hardware_bit); + + mask |= bit; + if (data_vect[signal >> 5] & (1L << (signal & 0x1f))) data |= bit; + if (dir_vect[signal >> 5] & (1L << (signal & 0x1f))) dir |= bit; + + ++matched_count; + } + } + + /* + * Write outputs to hardware interface, if any + */ + if (dir != 0) + { + if (specified_com_port) + { + ch_data = (char) (((data >> 6) & 0x01) | (data & 0x02) | + ((data << 2) & 0x04) | ((data << 3) & 0x08) | 0x60); + write(com_port, &ch_data, 1); + } + else + { +#if PORT == WINDOWS || PORT == DOS + + write_byteblaster(0, data); + +#endif + } + } + + /* + * Read the input signals and save information in capture_vect[] + */ + if ((dir != mask) && (capture_vect != NULL)) + { + if (specified_com_port) + { + ch_data = 0x7e; + write(com_port, &ch_data, 1); + for (i = 0; (i < 100) && (result != 1); ++i) + { + result = read(com_port, &ch_data, 1); + } + if (result == 1) + { + data = ((ch_data << 7) & 0x80) | ((ch_data << 3) & 0x10); + } + else + { + fprintf(stderr, "Error: BitBlaster not responding\n"); + } + } + else + { +#if PORT == WINDOWS || PORT == DOS + + data = read_byteblaster(1) ^ 0x80; /* parallel port inverts bit 7 */ + +#endif + } + + for (vector = 0; vector < VECTOR_SIGNAL_COUNT; ++vector) + { + signal = vector_list[vector].vector_index; + + if ((signal >= 0) && (signal < signal_count)) + { + bit = (1 << vector_list[vector].hardware_bit); + + if ((dir & bit) == 0) /* if it is an input signal... */ + { + if (data & bit) + { + capture_vect[signal >> 5] |= (1L << (signal & 0x1f)); + } + else + { + capture_vect[signal >> 5] &= ~(unsigned long) + (1L << (signal & 0x1f)); + } + } + } + } + } + + return (matched_count); +} + +void *jbi_malloc(unsigned int size) +{ + unsigned int n_bytes_to_allocate = +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + sizeof(unsigned int) + +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ +#if defined(MEM_TRACKER) + (2 * sizeof(DWORD)) + +#endif /* MEM_TRACKER */ + (POINTER_ALIGNMENT * ((size + POINTER_ALIGNMENT - 1) / POINTER_ALIGNMENT)); + + unsigned char *ptr = 0; + +#if defined(MEM_TRACKER) + if ((n_bytes_allocated + n_bytes_to_allocate) > peak_memory_usage) + { + peak_memory_usage = n_bytes_allocated + n_bytes_to_allocate; + } + if ((n_allocations + 1) > peak_allocations) + { + peak_allocations = n_allocations + 1; + } +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) + if ((n_bytes_allocated + n_bytes_to_allocate) <= N_STATIC_MEMORY_BYTES) + { + ptr = (&(static_memory_heap[n_bytes_allocated])); + } +#else /* USE_STATIC_MEMORY */ + ptr = (unsigned char *) malloc(n_bytes_to_allocate); +#endif /* USE_STATIC_MEMORY */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + if (ptr != 0) + { + unsigned int i = 0; + +#if defined(MEM_TRACKER) + for (i = 0; i < sizeof(DWORD); ++i) + { + *ptr = (unsigned char) (BEGIN_GUARD >> (8 * i)); + ++ptr; + } +#endif /* MEM_TRACKER */ + + for (i = 0; i < sizeof(unsigned int); ++i) + { + *ptr = (unsigned char) (size >> (8 * i)); + ++ptr; + } + +#if defined(MEM_TRACKER) + for (i = 0; i < sizeof(DWORD); ++i) + { + *(ptr + size + i) = (unsigned char) (END_GUARD >> (8 * i)); + /* don't increment ptr */ + } + + ++n_allocations; +#endif /* MEM_TRACKER */ + + n_bytes_allocated += n_bytes_to_allocate; + } +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + + jbi_dbg(DEBUG_MM, "malloc 0x%p(%d,%d)\n", ptr, size, n_bytes_to_allocate); + + return ptr; +} + +void jbi_free(void *ptr) +{ + jbi_dbg(DEBUG_MM, "free 0x%p\n", ptr); + + if + ( +#if defined(MEM_TRACKER) + (n_allocations > 0) && +#endif /* MEM_TRACKER */ + (ptr != 0) + ) + { + unsigned char *tmp_ptr = (unsigned char *) ptr; + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + unsigned int n_bytes_to_free = 0; + unsigned int i = 0; + unsigned int size = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ +#if defined(MEM_TRACKER) + DWORD begin_guard = 0; + DWORD end_guard = 0; + + tmp_ptr -= sizeof(DWORD); +#endif /* MEM_TRACKER */ +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + tmp_ptr -= sizeof(unsigned int); +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + ptr = tmp_ptr; + +#if defined(MEM_TRACKER) + for (i = 0; i < sizeof(DWORD); ++i) + { + begin_guard |= (((DWORD)(*tmp_ptr)) << (8 * i)); + ++tmp_ptr; + } +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + for (i = 0; i < sizeof(unsigned int); ++i) + { + size |= (((unsigned int)(*tmp_ptr)) << (8 * i)); + ++tmp_ptr; + } +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + tmp_ptr += size; + + for (i = 0; i < sizeof(DWORD); ++i) + { + end_guard |= (((DWORD)(*tmp_ptr)) << (8 * i)); + ++tmp_ptr; + } + + if ((begin_guard != BEGIN_GUARD) || (end_guard != END_GUARD)) + { + fprintf(stderr, "Error: memory corruption detected for allocation #%d... bad %s guard\n", + n_allocations, (begin_guard != BEGIN_GUARD) ? "begin" : "end"); + } + + --n_allocations; +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + n_bytes_to_free = +#if defined(MEM_TRACKER) + (2 * sizeof(DWORD)) + +#endif /* MEM_TRACKER */ + sizeof(unsigned int) + + (POINTER_ALIGNMENT * ((size + POINTER_ALIGNMENT - 1) / POINTER_ALIGNMENT)); +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) + if ((((unsigned long) ptr - (unsigned long) static_memory_heap) + n_bytes_to_free) == (unsigned long) n_bytes_allocated) + { + n_bytes_allocated -= n_bytes_to_free; + } +#if defined(MEM_TRACKER) + else + { + n_bytes_not_recovered += n_bytes_to_free; + } +#endif /* MEM_TRACKER */ +#else /* USE_STATIC_MEMORY */ +#if defined(MEM_TRACKER) + n_bytes_allocated -= n_bytes_to_free; +#endif /* MEM_TRACKER */ + free(ptr); +#endif /* USE_STATIC_MEMORY */ + } +#if defined(MEM_TRACKER) + else + { + if (ptr != 0) + { + fprintf(stderr, "Error: attempt to free unallocated memory\n"); + } + } +#endif /* MEM_TRACKER */ +} + +#if PORT == WINDOWS || PORT == DOS +/************************************************************************ +* +* get_tick_count() -- Get system tick count in milliseconds +* +* for DOS, use BIOS function _bios_timeofday() +* for WINDOWS use GetTickCount() function +* for UNIX use clock() system function +*/ +DWORD get_tick_count(void) +{ + DWORD tick_count = 0L; + +#if PORT == WINDOWS + tick_count = GetTickCount(); +#elif PORT == DOS + _bios_timeofday(_TIME_GETCLOCK, (long *)&tick_count); + tick_count *= 55L; /* convert to milliseconds */ +#else + /* assume clock() function returns microseconds */ + tick_count = (DWORD) (clock() / 1000L); +#endif + + return (tick_count); +} +#endif + +#define DELAY_SAMPLES 10 +#define DELAY_CHECK_LOOPS 10000 + +void calibrate_delay(void) +{ +#if PORT == WINDOWS || PORT == DOS + int sample = 0; + int count = 0; + DWORD tick_count1 = 0L; + DWORD tick_count2 = 0L; +#endif + + one_ms_delay = 0L; + +#if PORT == WINDOWS || PORT == DOS + for (sample = 0; sample < DELAY_SAMPLES; ++sample) + { + count = 0; + tick_count1 = get_tick_count(); + while ((tick_count2 = get_tick_count()) == tick_count1) {}; + do { delay_loop(DELAY_CHECK_LOOPS); count++; } while + ((tick_count1 = get_tick_count()) == tick_count2); + one_ms_delay += ((DELAY_CHECK_LOOPS * (DWORD)count) / + (tick_count1 - tick_count2)); + } + + one_ms_delay /= DELAY_SAMPLES; +#else + /* This is system-dependent! Update this number for target system */ + one_ms_delay = 1000L; +#endif +} + +char *error_text[] = +{ +/* JBIC_SUCCESS 0 */ "success", +/* JBIC_OUT_OF_MEMORY 1 */ "out of memory", +/* JBIC_IO_ERROR 2 */ "file access error", +/* JAMC_SYNTAX_ERROR 3 */ "syntax error", +/* JBIC_UNEXPECTED_END 4 */ "unexpected end of file", +/* JBIC_UNDEFINED_SYMBOL 5 */ "undefined symbol", +/* JAMC_REDEFINED_SYMBOL 6 */ "redefined symbol", +/* JBIC_INTEGER_OVERFLOW 7 */ "integer overflow", +/* JBIC_DIVIDE_BY_ZERO 8 */ "divide by zero", +/* JBIC_CRC_ERROR 9 */ "CRC mismatch", +/* JBIC_INTERNAL_ERROR 10 */ "internal error", +/* JBIC_BOUNDS_ERROR 11 */ "bounds error", +/* JAMC_TYPE_MISMATCH 12 */ "type mismatch", +/* JAMC_ASSIGN_TO_CONST 13 */ "assignment to constant", +/* JAMC_NEXT_UNEXPECTED 14 */ "NEXT unexpected", +/* JAMC_POP_UNEXPECTED 15 */ "POP unexpected", +/* JAMC_RETURN_UNEXPECTED 16 */ "RETURN unexpected", +/* JAMC_ILLEGAL_SYMBOL 17 */ "illegal symbol name", +/* JBIC_VECTOR_MAP_FAILED 18 */ "vector signal name not found", +/* JBIC_USER_ABORT 19 */ "execution cancelled", +/* JBIC_STACK_OVERFLOW 20 */ "stack overflow", +/* JBIC_ILLEGAL_OPCODE 21 */ "illegal instruction code", +/* JAMC_PHASE_ERROR 22 */ "phase error", +/* JAMC_SCOPE_ERROR 23 */ "scope error", +/* JBIC_ACTION_NOT_FOUND 24 */ "action not found", +}; + +#define MAX_ERROR_CODE (int)(sizeof(error_text)/sizeof(error_text[0])) + +/************************************************************************/ + +#if 0 +int main(int argc, char **argv) +{ + BOOL help = FALSE; + BOOL error = FALSE; + char *filename = NULL; + long offset = 0L; + long error_address = 0L; + JBI_RETURN_TYPE crc_result = JBIC_SUCCESS; + JBI_RETURN_TYPE exec_result = JBIC_SUCCESS; + unsigned short expected_crc = 0; + unsigned short actual_crc = 0; + char key[33] = {0}; + char value[257] = {0}; + int exit_status = 0; + int arg = 0; + int exit_code = 0; + int format_version = 0; + time_t start_time = 0; + time_t end_time = 0; + int time_delta = 0; + char *workspace = NULL; + char *action = NULL; + char *init_list[10]; + int init_count = 0; + FILE *fp = NULL; + struct stat sbuf; + long workspace_size = 0; + char *exit_string = NULL; + int reset_jtag = 1; + int execute_program = 1; + int action_count = 0; + int procedure_count = 0; + int index = 0; + char *action_name = NULL; + char *description = NULL; + JBI_PROCINFO *procedure_list = NULL; + JBI_PROCINFO *procptr = NULL; + + verbose = FALSE; + + init_list[0] = NULL; + + /* print out the version string and copyright message */ + fprintf(stderr, "Jam STAPL ByteCode Player Version 2.2\nCopyright (C) 1998-2001 Altera Corporation\n\n"); + + for (arg = 1; arg < argc; arg++) + { +#if PORT == UNIX + if (argv[arg][0] == '-') +#else + if ((argv[arg][0] == '-') || (argv[arg][0] == '/')) +#endif + { + switch(toupper(argv[arg][1])) + { + case 'A': /* set action name */ + if (action == NULL) + { + action = &argv[arg][2]; + } + else + { + error = TRUE; + } + break; + +#if PORT == WINDOWS || PORT == DOS + case 'C': /* Use alternative ISP download cable */ + if(toupper(argv[arg][2]) == 'L') + alternative_cable_l = TRUE; + else if(toupper(argv[arg][2]) == 'X') + alternative_cable_x = TRUE; + break; +#endif + + case 'D': /* initialization list */ + if (argv[arg][2] == '"') + { + init_list[init_count] = &argv[arg][3]; + } + else + { + init_list[init_count] = &argv[arg][2]; + } + init_list[++init_count] = NULL; + break; + +#if PORT == WINDOWS || PORT == DOS + case 'P': /* set LPT port address */ + specified_lpt_port = TRUE; + if (sscanf(&argv[arg][2], "%d", &lpt_port) != 1) error = TRUE; + if ((lpt_port < 1) || (lpt_port > 3)) error = TRUE; + if (error) + { + if (sscanf(&argv[arg][2], "%x", &lpt_port) == 1) + { + if ((lpt_port == 0x3bc) || + (lpt_port == 0x378) || + (lpt_port == 0x278)) + { + error = FALSE; + specified_lpt_addr = TRUE; + lpt_addr = (WORD) lpt_port; + lpt_port = 1; + } + } + } + break; +#endif + + case 'R': /* don't reset the JTAG chain after use */ + reset_jtag = 0; + break; + + case 'S': /* set serial port address */ + serial_port_name = &argv[arg][2]; + specified_com_port = TRUE; + break; + + case 'M': /* set memory size */ + if (sscanf(&argv[arg][2], "%ld", &workspace_size) != 1) + error = TRUE; + if (workspace_size == 0) error = TRUE; + break; + + case 'H': /* help */ + help = TRUE; + break; + + case 'V': /* verbose */ + verbose = TRUE; + break; + + case 'I': /* show info only, do not execute */ + verbose = TRUE; + execute_program = 0; + break; + + default: + error = TRUE; + break; + } + } + else + { + /* it's a filename */ + if (filename == NULL) + { + filename = argv[arg]; + } + else + { + /* error -- we already found a filename */ + error = TRUE; + } + } + + if (error) + { + fprintf(stderr, "Illegal argument: \"%s\"\n", argv[arg]); + help = TRUE; + error = FALSE; + } + } + +#if PORT == WINDOWS || PORT == DOS + if (specified_lpt_port && specified_com_port) + { + fprintf(stderr, "Error: -s and -p options may not be used together\n\n"); + help = TRUE; + } +#endif + + if (help || (filename == NULL)) + { + fprintf(stderr, "Usage: jbi [options] \n"); + fprintf(stderr, "\nAvailable options:\n"); + fprintf(stderr, " -h : show help message\n"); + fprintf(stderr, " -v : show verbose messages\n"); + fprintf(stderr, " -i : show file info only - does not execute any action\n"); + fprintf(stderr, " -a : specify an action name (Jam STAPL)\n"); + fprintf(stderr, " -d : initialize variable to specified value (Jam 1.1)\n"); + fprintf(stderr, " -d : enable optional procedure (Jam STAPL)\n"); + fprintf(stderr, " -d : disable recommended procedure (Jam STAPL)\n"); +#if PORT == WINDOWS || PORT == DOS + fprintf(stderr, " -p : parallel port number or address (for ByteBlaster)\n"); + fprintf(stderr, " -c : alternative download cable compatibility: -cl or -cx\n"); +#endif + fprintf(stderr, " -s : serial port name (for BitBlaster)\n"); + fprintf(stderr, " -r : don't reset JTAG TAP after use\n"); + exit_status = 1; + } + else if ((workspace_size > 0) && + ((workspace = (char *) jbi_malloc((size_t) workspace_size)) == NULL)) + { + fprintf(stderr, "Error: can't allocate memory (%d Kbytes)\n", + (int) (workspace_size / 1024L)); + exit_status = 1; + } + else if (access(filename, 0) != 0) + { + fprintf(stderr, "Error: can't access file \"%s\"\n", filename); + exit_status = 1; + } + else + { + /* get length of file */ + if (stat(filename, &sbuf) == 0) file_length = sbuf.st_size; + + if ((fp = fopen(filename, "rb")) == NULL) + { + fprintf(stderr, "Error: can't open file \"%s\"\n", filename); + exit_status = 1; + } + else + { + /* + * Read entire file into a buffer + */ +#if PORT == DOS + int pages = 1 + (int) (file_length >> 14L); + int page; + file_buffer = (unsigned char **) jbi_malloc( + (size_t) (pages * sizeof(char *))); + + for (page = 0; page < pages; ++page) + { + /* allocate enough 16K blocks to store the file */ + file_buffer[page] = (unsigned char *) jbi_malloc (0x4000); + if (file_buffer[page] == NULL) + { + /* flag error and break out of loop */ + file_buffer = NULL; + page = pages; + } + } +#else + file_buffer = (unsigned char *) jbi_malloc((size_t) file_length); +#endif + + if (file_buffer == NULL) + { + fprintf(stderr, "Error: can't allocate memory (%d Kbytes)\n", + (int) (file_length / 1024L)); + exit_status = 1; + } + else + { +#if PORT == DOS + int pages = 1 + (int) (file_length >> 14L); + int page; + size_t page_size = 0x4000; + for (page = 0; (page < pages) && (exit_status == 0); ++page) + { + if (page == (pages - 1)) + { + /* last page may not be full 16K bytes */ + page_size = (size_t) (file_length & 0x3fffL); + } + if (fread(file_buffer[page], 1, page_size, fp) != page_size) + { + fprintf(stderr, "Error reading file \"%s\"\n", filename); + exit_status = 1; + } + } +#else + if (fread(file_buffer, 1, (size_t) file_length, fp) != + (size_t) file_length) + { + fprintf(stderr, "Error reading file \"%s\"\n", filename); + exit_status = 1; + } +#endif + } + + fclose(fp); + } + + if (exit_status == 0) + { + /* + * Get Operating System type + */ +#if PORT == WINDOWS + windows_nt = !(GetVersion() & 0x80000000); +#endif + + /* + * Calibrate the delay loop function + */ + calibrate_delay(); + + /* + * Check CRC + */ + crc_result = jbi_check_crc(file_buffer, file_length, + &expected_crc, &actual_crc); + + if (verbose || (crc_result == JBIC_CRC_ERROR)) + { + switch (crc_result) + { + case JBIC_SUCCESS: + printf("CRC matched: CRC value = %04X\n", actual_crc); + break; + + case JBIC_CRC_ERROR: + printf("CRC mismatch: expected %04X, actual %04X\n", + expected_crc, actual_crc); + break; + + case JBIC_UNEXPECTED_END: + printf("Expected CRC not found, actual CRC value = %04X\n", + actual_crc); + break; + + case JBIC_IO_ERROR: + printf("Error: File format is not recognized.\n"); + exit(1); + break; + + default: + printf("CRC function returned error code %d\n", crc_result); + break; + } + } + + if (verbose) + { + /* + * Display file format version + */ + jbi_get_file_info(file_buffer, file_length, + &format_version, &action_count, &procedure_count); + + printf("File format is %s ByteCode format\n", + (format_version == 2) ? "Jam STAPL" : "pre-standardized Jam 1.1"); + + /* + * Dump out NOTE fields + */ + while (jbi_get_note(file_buffer, file_length, + &offset, key, value, 256) == 0) + { + printf("NOTE \"%s\" = \"%s\"\n", key, value); + } + + /* + * Dump the action table + */ + if ((format_version == 2) && (action_count > 0)) + { + printf("\nActions available in this file:\n"); + + for (index = 0; index < action_count; ++index) + { + jbi_get_action_info(file_buffer, file_length, + index, &action_name, &description, &procedure_list); + + if (description == NULL) + { + printf("%s\n", action_name); + } + else + { + printf("%s \"%s\"\n", action_name, description); + } + +#if PORT == DOS + if (action_name != NULL) jbi_free(action_name); + if (description != NULL) jbi_free(description); +#endif + + procptr = procedure_list; + while (procptr != NULL) + { + if (procptr->attributes != 0) + { + printf(" %s (%s)\n", procptr->name, + (procptr->attributes == 1) ? + "optional" : "recommended"); + } + +#if PORT == DOS + if (procptr->name != NULL) jbi_free(procptr->name); +#endif + + procedure_list = procptr->next; + jbi_free(procptr); + procptr = procedure_list; + } + } + + /* add a blank line before execution messages */ + if (execute_program) printf("\n"); + } + } + + if (execute_program) + { + /* + * Execute the Jam STAPL ByteCode program + */ + time(&start_time); + exec_result = jbi_execute(file_buffer, file_length, workspace, + workspace_size, action, init_list, reset_jtag, + &error_address, &exit_code, &format_version); + time(&end_time); + + if (exec_result == JBIC_SUCCESS) + { + if (format_version == 2) + { + switch (exit_code) + { + case 0: exit_string = "Success"; break; + case 1: exit_string = "Checking chain failure"; break; + case 2: exit_string = "Reading IDCODE failure"; break; + case 3: exit_string = "Reading USERCODE failure"; break; + case 4: exit_string = "Reading UESCODE failure"; break; + case 5: exit_string = "Entering ISP failure"; break; + case 6: exit_string = "Unrecognized device"; break; + case 7: exit_string = "Device revision is not supported"; break; + case 8: exit_string = "Erase failure"; break; + case 9: exit_string = "Device is not blank"; break; + case 10: exit_string = "Device programming failure"; break; + case 11: exit_string = "Device verify failure"; break; + case 12: exit_string = "Read failure"; break; + case 13: exit_string = "Calculating checksum failure"; break; + case 14: exit_string = "Setting security bit failure"; break; + case 15: exit_string = "Querying security bit failure"; break; + case 16: exit_string = "Exiting ISP failure"; break; + case 17: exit_string = "Performing system test failure"; break; + default: exit_string = "Unknown exit code"; break; + } + } + else + { + switch (exit_code) + { + case 0: exit_string = "Success"; break; + case 1: exit_string = "Illegal initialization values"; break; + case 2: exit_string = "Unrecognized device"; break; + case 3: exit_string = "Device revision is not supported"; break; + case 4: exit_string = "Device programming failure"; break; + case 5: exit_string = "Device is not blank"; break; + case 6: exit_string = "Device verify failure"; break; + case 7: exit_string = "SRAM configuration failure"; break; + default: exit_string = "Unknown exit code"; break; + } + } + + printf("Exit code = %d... %s\n", exit_code, exit_string); + } + else if ((format_version == 2) && + (exec_result == JBIC_ACTION_NOT_FOUND)) + { + if ((action == NULL) || (*action == '\0')) + { + printf("Error: no action specified for Jam STAPL file.\nProgram terminated.\n"); + } + else + { + printf("Error: action \"%s\" is not supported for this Jam STAPL file.\nProgram terminated.\n", action); + } + } + else if (exec_result < MAX_ERROR_CODE) + { + printf("Error at address %ld: %s.\nProgram terminated.\n", + error_address, error_text[exec_result]); + } + else + { + printf("Unknown error code %ld\n", exec_result); + } + + /* + * Print out elapsed time + */ + if (verbose) + { + time_delta = (int) (end_time - start_time); + printf("Elapsed time = %02u:%02u:%02u\n", + time_delta / 3600, /* hours */ + (time_delta % 3600) / 60, /* minutes */ + time_delta % 60); /* seconds */ + } + } + } + } + + if (jtag_hardware_initialized) close_jtag_hardware(); + + if (workspace != NULL) jbi_free(workspace); + if (file_buffer != NULL) jbi_free(file_buffer); + +#if defined(MEM_TRACKER) + if (verbose) + { +#if defined(USE_STATIC_MEMORY) + fprintf(stdout, "Memory Usage Info: static memory size = %ud (%dKB)\n", N_STATIC_MEMORY_BYTES, N_STATIC_MEMORY_KBYTES); +#endif /* USE_STATIC_MEMORY */ + fprintf(stdout, "Memory Usage Info: peak memory usage = %ud (%dKB)\n", peak_memory_usage, (peak_memory_usage + 1023) / 1024); + fprintf(stdout, "Memory Usage Info: peak allocations = %d\n", peak_allocations); +#if defined(USE_STATIC_MEMORY) + if ((n_bytes_allocated - n_bytes_not_recovered) != 0) + { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", (n_bytes_allocated - n_bytes_not_recovered), ((n_bytes_allocated - n_bytes_not_recovered) + 1023) / 1024); + } +#else /* USE_STATIC_MEMORY */ + if (n_bytes_allocated != 0) + { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", n_bytes_allocated, (n_bytes_allocated + 1023) / 1024); + } +#endif /* USE_STATIC_MEMORY */ + if (n_allocations != 0) + { + fprintf(stdout, "Memory Usage Info: allocations not freed = %d\n", n_allocations); + } + } +#endif /* MEM_TRACKER */ + + return (exit_status); +} +#endif + +#if PORT==WINDOWS +#ifndef __BORLANDC__ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* SEARCH_DYN_DATA +* +* Searches recursively in Windows 95/98 Registry for parallel port info +* under HKEY_DYN_DATA registry key. Called by search_local_machine(). +*/ +void search_dyn_data +( + char *dd_path, + char *hardware_key, + int lpt +) +{ + DWORD index; + DWORD size; + DWORD type; + LONG result; + HKEY key; + int length; + WORD address; + char buffer[1024]; + FILETIME last_write = {0}; + WORD *word_ptr; + int i; + + length = strlen(dd_path); + + if (RegOpenKeyEx( + HKEY_DYN_DATA, + dd_path, + 0L, + KEY_READ, + &key) + == ERROR_SUCCESS) + { + size = 1023; + + if (RegQueryValueEx( + key, + "HardWareKey", + NULL, + &type, + (unsigned char *) buffer, + &size) + == ERROR_SUCCESS) + { + if ((type == REG_SZ) && (stricmp(buffer, hardware_key) == 0)) + { + size = 1023; + + if (RegQueryValueEx( + key, + "Allocation", + NULL, + &type, + (unsigned char *) buffer, + &size) + == ERROR_SUCCESS) + { + /* + * By "inspection", I have found five cases: size 32, 48, + * 56, 60, and 80 bytes. The port address seems to be + * located at different offsets in the buffer for these + * five cases, as shown below. If a valid port address + * is not found, or the size is not one of these known + * sizes, then I search through the entire buffer and + * look for a value which is a valid port address. + */ + + word_ptr = (WORD *) buffer; + + if ((type == REG_BINARY) && (size == 32)) + { + address = word_ptr[10]; + } + else if ((type == REG_BINARY) && (size == 48)) + { + address = word_ptr[18]; + } + else if ((type == REG_BINARY) && (size == 56)) + { + address = word_ptr[22]; + } + else if ((type == REG_BINARY) && (size == 60)) + { + address = word_ptr[24]; + } + else if ((type == REG_BINARY) && (size == 80)) + { + address = word_ptr[24]; + } + else address = 0; + + /* if not found, search through entire buffer */ + i = 0; + while ((i < (int) (size / 2)) && + (address != 0x278) && + (address != 0x27C) && + (address != 0x378) && + (address != 0x37C) && + (address != 0x3B8) && + (address != 0x3BC)) + { + if ((word_ptr[i] == 0x278) || + (word_ptr[i] == 0x27C) || + (word_ptr[i] == 0x378) || + (word_ptr[i] == 0x37C) || + (word_ptr[i] == 0x3B8) || + (word_ptr[i] == 0x3BC)) + { + address = word_ptr[i]; + } + ++i; + } + + if ((address == 0x278) || + (address == 0x27C) || + (address == 0x378) || + (address == 0x37C) || + (address == 0x3B8) || + (address == 0x3BC)) + { + lpt_addresses_from_registry[lpt] = address; + } + } + } + } + + index = 0; + + do + { + size = 1023; + + result = RegEnumKeyEx( + key, + index++, + buffer, + &size, + NULL, + NULL, + NULL, + &last_write); + + if (result == ERROR_SUCCESS) + { + dd_path[length] = '\\'; + dd_path[length + 1] = '\0'; + strcpy(&dd_path[length + 1], buffer); + + search_dyn_data(dd_path, hardware_key, lpt); + + dd_path[length] = '\0'; + } + } + while (result == ERROR_SUCCESS); + + RegCloseKey(key); + } +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* SEARCH_LOCAL_MACHINE +* +* Searches recursively in Windows 95/98 Registry for parallel port info +* under HKEY_LOCAL_MACHINE\Enum. When parallel port is found, calls +* search_dyn_data() to get the port address. +*/ +void search_local_machine +( + char *lm_path, + char *dd_path +) +{ + DWORD index; + DWORD size; + DWORD type; + LONG result; + HKEY key; + int length; + char buffer[1024]; + FILETIME last_write = {0}; + + length = strlen(lm_path); + + if (RegOpenKeyEx( + HKEY_LOCAL_MACHINE, + lm_path, + 0L, + KEY_READ, + &key) + == ERROR_SUCCESS) + { + size = 1023; + + if (RegQueryValueEx( + key, + "PortName", + NULL, + &type, + (unsigned char *) buffer, + &size) + == ERROR_SUCCESS) + { + if ((type == REG_SZ) && + (size == 5) && + (buffer[0] == 'L') && + (buffer[1] == 'P') && + (buffer[2] == 'T') && + (buffer[3] >= '1') && + (buffer[3] <= '4') && + (buffer[4] == '\0')) + { + /* we found the entry in HKEY_LOCAL_MACHINE, now we need to */ + /* find the corresponding entry under HKEY_DYN_DATA. */ + /* add 5 to lm_path to skip over "Enum" and backslash */ + search_dyn_data(dd_path, &lm_path[5], (buffer[3] - '1')); + } + } + + index = 0; + + do + { + size = 1023; + + result = RegEnumKeyEx( + key, + index++, + buffer, + &size, + NULL, + NULL, + NULL, + &last_write); + + if (result == ERROR_SUCCESS) + { + lm_path[length] = '\\'; + lm_path[length + 1] = '\0'; + strcpy(&lm_path[length + 1], buffer); + + search_local_machine(lm_path, dd_path); + + lm_path[length] = '\0'; + } + } + while (result == ERROR_SUCCESS); + + RegCloseKey(key); + } +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* GET_LPT_ADDRESSES_FROM_REGISTRY +* +* Searches Win95/98 registry recursively to get I/O port addresses for +* parallel ports. +*/ +void get_lpt_addresses_from_registry() +{ + char lm_path[1024]; + char dd_path[1024]; + + strcpy(lm_path, "Enum"); + strcpy(dd_path, "Config Manager"); + search_local_machine(lm_path, dd_path); +} +#endif +#endif + +void initialize_jtag_hardware() +{ + if (specified_com_port) + { + com_port = open(serial_port_name, O_RDWR); + if (com_port == -1) + { + fprintf(stderr, "Error: can't open serial port \"%s\"\n", + serial_port_name); + } + else + { + int i = 0, result = 0; + char data = 0; + + data = 0x7e; + write(com_port, &data, 1); + + for (i = 0; (i < 100) && (result != 1); ++i) + { + result = read(com_port, &data, 1); + } + + if (result == 1) + { + data = 0x70; write(com_port, &data, 1); /* TDO echo off */ + data = 0x72; write(com_port, &data, 1); /* auto LEDs off */ + data = 0x74; write(com_port, &data, 1); /* ERROR LED off */ + data = 0x76; write(com_port, &data, 1); /* DONE LED off */ + data = 0x60; write(com_port, &data, 1); /* signals low */ + } + else + { + fprintf(stderr, "Error: BitBlaster is not responding on %s\n", + serial_port_name); + close(com_port); + com_port = -1; + } + } + } + else + { +#if PORT == WINDOWS || PORT == DOS + +#if PORT == WINDOWS + if (windows_nt) + { + initialize_nt_driver(); + } + else + { +#ifdef __BORLANDC__ + fprintf(stderr, "Error: parallel port access is not available\n"); +#else + if (!specified_lpt_addr) + { + get_lpt_addresses_from_registry(); + + lpt_addr = 0; + + if (specified_lpt_port) + { + lpt_addr = lpt_addresses_from_registry[lpt_port - 1]; + } + + if (lpt_addr == 0) + { + if (lpt_addresses_from_registry[3] != 0) + lpt_addr = lpt_addresses_from_registry[3]; + if (lpt_addresses_from_registry[2] != 0) + lpt_addr = lpt_addresses_from_registry[2]; + if (lpt_addresses_from_registry[1] != 0) + lpt_addr = lpt_addresses_from_registry[1]; + if (lpt_addresses_from_registry[0] != 0) + lpt_addr = lpt_addresses_from_registry[0]; + } + + if (lpt_addr == 0) + { + if (specified_lpt_port) + { + lpt_addr = lpt_addr_table[lpt_port - 1]; + } + else + { + lpt_addr = lpt_addr_table[0]; + } + } + } + initial_lpt_ctrl = windows_nt ? 0x0c : read_byteblaster(2); +#endif + } +#endif + +#if PORT == DOS + /* + * Read word at specific memory address to get the LPT port address + */ + WORD *bios_address = (WORD *) 0x00400008; + + if (!specified_lpt_addr) + { + lpt_addr = bios_address[lpt_port - 1]; + + if ((lpt_addr != 0x278) && + (lpt_addr != 0x27c) && + (lpt_addr != 0x378) && + (lpt_addr != 0x37c) && + (lpt_addr != 0x3b8) && + (lpt_addr != 0x3bc)) + { + lpt_addr = lpt_addr_table[lpt_port - 1]; + } + } + initial_lpt_ctrl = read_byteblaster(2); +#endif + + /* set AUTO-FEED low to enable ByteBlaster (value to port inverted) */ + /* set DIRECTION low for data output from parallel port */ + write_byteblaster(2, (initial_lpt_ctrl | 0x02) & 0xDF); +#endif + } +} + +void close_jtag_hardware() +{ + if (specified_com_port) + { + if (com_port != -1) close(com_port); + } + else + { +#if PORT == WINDOWS || PORT == DOS + /* set AUTO-FEED high to disable ByteBlaster */ + write_byteblaster(2, initial_lpt_ctrl & 0xfd); + +#if PORT == WINDOWS + if (windows_nt && (nt_device_handle != INVALID_HANDLE_VALUE)) + { + if (port_io_count > 0) flush_ports(); + + CloseHandle(nt_device_handle); + } +#endif +#endif + } +} + +#if PORT == WINDOWS +/**************************************************************************/ +/* */ + +BOOL initialize_nt_driver() + +/* */ +/* Uses CreateFile() to open a connection to the Windows NT device */ +/* driver. */ +/* */ +/**************************************************************************/ +{ + BOOL status = FALSE; + + ULONG buffer[1]; + ULONG returned_length = 0; + char nt_lpt_str[] = { '\\', '\\', '.', '\\', + 'A', 'L', 'T', 'L', 'P', 'T', '1', '\0' }; + + nt_lpt_str[10] = (char) ('1' + (lpt_port - 1)); + + nt_device_handle = CreateFile( + nt_lpt_str, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (nt_device_handle == INVALID_HANDLE_VALUE) + { + fprintf(stderr, + "I/O error: cannot open device %s\nCheck port number and device driver installation", + nt_lpt_str); + } + else + { + if (DeviceIoControl( + nt_device_handle, /* Handle to device */ + PGDC_IOCTL_GET_DEVICE_INFO_PP, /* IO Control code */ + (ULONG *)NULL, /* Buffer to driver. */ + 0, /* Length of buffer in bytes. */ + &buffer, /* Buffer from driver. */ + sizeof(ULONG), /* Length of buffer in bytes. */ + &returned_length, /* Bytes placed in data_buffer. */ + NULL)) /* Wait for operation to complete */ + { + if (returned_length == sizeof(ULONG)) + { + if (buffer[0] == PGDC_HDLC_NTDRIVER_VERSION) + { + status = TRUE; + } + else + { + fprintf(stderr, + "I/O error: device driver %s is not compatible\n(Driver version is %lu, expected version %lu.\n", + nt_lpt_str, + (unsigned long) buffer[0], + (unsigned long) PGDC_HDLC_NTDRIVER_VERSION); + } + } + else + { + fprintf(stderr, "I/O error: device driver %s is not compatible.\n", + nt_lpt_str); + } + } + + if (!status) + { + CloseHandle(nt_device_handle); + nt_device_handle = INVALID_HANDLE_VALUE; + } + } + + if (!status) + { + /* error message already given */ + exit(1); + } + + return (status); +} +#endif + +#if PORT == WINDOWS || PORT == DOS +/**************************************************************************/ +/* */ + +void write_byteblaster +( + int port, + int data +) + +/* */ +/**************************************************************************/ +{ +#if PORT == WINDOWS + BOOL status = FALSE; + + int returned_length = 0; + int buffer[2]; + + if (windows_nt) + { + /* + * On Windows NT, access hardware through device driver + */ + if (port == 0) + { + port_io_buffer[port_io_count].data = (USHORT) data; + port_io_buffer[port_io_count].command = PGDC_WRITE_PORT; + ++port_io_count; + + if (port_io_count >= PORT_IO_BUFFER_SIZE) flush_ports(); + } + else + { + if (port_io_count > 0) flush_ports(); + + buffer[0] = port; + buffer[1] = data; + + status = DeviceIoControl( + nt_device_handle, /* Handle to device */ + PGDC_IOCTL_WRITE_PORT_PP, /* IO Control code for write */ + (ULONG *)&buffer, /* Buffer to driver. */ + 2 * sizeof(int), /* Length of buffer in bytes. */ + (ULONG *)NULL, /* Buffer from driver. Not used. */ + 0, /* Length of buffer in bytes. */ + (ULONG *)&returned_length, /* Bytes returned. Should be zero. */ + NULL); /* Wait for operation to complete */ + + if ((!status) || (returned_length != 0)) + { + fprintf(stderr, "I/O error: Cannot access ByteBlaster hardware\n"); + CloseHandle(nt_device_handle); + exit(1); + } + } + } + else +#endif + { + /* + * On Windows 95, access hardware directly + */ + outp((WORD)(port + lpt_addr), (WORD)data); + } +} + +/**************************************************************************/ +/* */ + +int read_byteblaster +( + int port +) + +/* */ +/**************************************************************************/ +{ + int data = 0; + +#if PORT == WINDOWS + + BOOL status = FALSE; + + int returned_length = 0; + + if (windows_nt) + { + /* flush output cache buffer before reading from device */ + if (port_io_count > 0) flush_ports(); + + /* + * On Windows NT, access hardware through device driver + */ + status = DeviceIoControl( + nt_device_handle, /* Handle to device */ + PGDC_IOCTL_READ_PORT_PP, /* IO Control code for Read */ + (ULONG *)&port, /* Buffer to driver. */ + sizeof(int), /* Length of buffer in bytes. */ + (ULONG *)&data, /* Buffer from driver. */ + sizeof(int), /* Length of buffer in bytes. */ + (ULONG *)&returned_length, /* Bytes placed in data_buffer. */ + NULL); /* Wait for operation to complete */ + + if ((!status) || (returned_length != sizeof(int))) + { + fprintf(stderr, "I/O error: Cannot access ByteBlaster hardware\n"); + CloseHandle(nt_device_handle); + exit(1); + } + } + else +#endif + { + /* + * On Windows 95, access hardware directly + */ + data = inp((WORD)(port + lpt_addr)); + } + + return (data & 0xff); +} + +#if PORT == WINDOWS +void flush_ports(void) +{ + ULONG n_writes = 0L; + BOOL status; + + status = DeviceIoControl( + nt_device_handle, /* handle to device */ + PGDC_IOCTL_PROCESS_LIST_PP, /* IO control code */ + (LPVOID)port_io_buffer, /* IN buffer (list buffer) */ + port_io_count * sizeof(struct PORT_IO_LIST_STRUCT),/* length of IN buffer in bytes */ + (LPVOID)port_io_buffer, /* OUT buffer (list buffer) */ + port_io_count * sizeof(struct PORT_IO_LIST_STRUCT),/* length of OUT buffer in bytes */ + &n_writes, /* number of writes performed */ + 0); /* wait for operation to complete */ + + if ((!status) || ((port_io_count * sizeof(struct PORT_IO_LIST_STRUCT)) != n_writes)) + { + fprintf(stderr, "I/O error: Cannot access ByteBlaster hardware\n"); + CloseHandle(nt_device_handle); + exit(1); + } + + port_io_count = 0; +} +#endif /* PORT == WINDOWS */ +#endif /* PORT == WINDOWS || PORT == DOS */ + +#if 0 +#if !defined (DEBUG) +#pragma optimize ("ceglt", off) +#endif +#endif + +void delay_loop(long count) +{ + while (count != 0L) count--; +} + +#if PORT == EMBEDDED + +static void jbi_init_mm(void) +{ +#if defined(USE_STATIC_MEMORY) + int i; +#endif /* USE_STATIC_MEMORY */ + +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + n_bytes_allocated = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + peak_memory_usage = 0; + peak_allocations = 0; + n_allocations = 0; +#if defined(USE_STATIC_MEMORY) + n_bytes_not_recovered = 0; +#endif /* USE_STATIC_MEMORY */ +#endif /* MEM_TRACKER */ + +#if defined(USE_STATIC_MEMORY) + jbi_dbg(DEBUG_DETAIL, "static_memory_heap: 0x%p(0x%x)\n", + static_memory_heap, N_STATIC_MEMORY_BYTES); + for (i = 0; i < N_STATIC_MEMORY_BYTES; i++) { + static_memory_heap[i] = 0; + } +#endif /* USE_STATIC_MEMORY */ + + jbi_delay_us = 0; + jbi_delay_count = 0; + jbi_peak_us = 0; +} + +static void jbi_exit_mm(void) +{ +#if defined(USE_STATIC_MEMORY) || defined(MEM_TRACKER) + jbi_dbg(DEBUG_DETAIL, "n_bytes_allocated: %u\n", n_bytes_allocated); + n_bytes_allocated = 0; +#endif /* USE_STATIC_MEMORY || MEM_TRACKER */ + +#if defined(MEM_TRACKER) + jbi_dbg(DEBUG_DETAIL, "peak_memory_usage: %u\n", peak_memory_usage); + jbi_dbg(DEBUG_DETAIL, "peak_allocations: %u\n", peak_allocations); + jbi_dbg(DEBUG_DETAIL, "n_allocations: %u\n", n_allocations); + peak_memory_usage = 0; + peak_allocations = 0; + n_allocations = 0; +#if defined(USE_STATIC_MEMORY) + jbi_dbg(DEBUG_DETAIL, "n_bytes_not_recovered: %u\n", n_bytes_not_recovered); + n_bytes_not_recovered = 0; +#endif /* USE_STATIC_MEMORY */ +#endif /* MEM_TRACKER */ + + jbi_dbg(DEBUG_DETAIL, "jbi_delay: %ld us, %ld count, peak %ld us\n", + jbi_delay_us, jbi_delay_count, jbi_peak_us); +} + +static char *get_exit_string(int format_version, int exit_code) +{ + char *exit_string = NULL; + + if (format_version == 2){ + switch (exit_code) { + case 0: + exit_string = "Success"; + break; + case 1: + exit_string = "Checking chain failure"; + break; + case 2: + exit_string = "Reading IDCODE failure"; + break; + case 3: + exit_string = "Reading USERCODE failure"; + break; + case 4: + exit_string = "Reading UESCODE failure"; + break; + case 5: + exit_string = "Entering ISP failure"; + break; + case 6: + exit_string = "Unrecognized device"; + break; + case 7: + exit_string = "Device revision is not supported"; + break; + case 8: + exit_string = "Erase failure"; + break; + case 9: + exit_string = "Device is not blank"; + break; + case 10: + exit_string = "Device programming failure"; + break; + case 11: + exit_string = "Device verify failure"; + break; + case 12: + exit_string = "Read failure"; break; + case 13: + exit_string = "Calculating checksum failure"; + break; + case 14: + exit_string = "Setting security bit failure"; + break; + case 15: + exit_string = "Querying security bit failure"; + break; + case 16: + exit_string = "Exiting ISP failure"; + break; + case 17: + exit_string = "Performing system test failure"; + break; + default: + exit_string = "Unknown exit code"; + break; + } + } else { + switch (exit_code) { + case 0: + exit_string = "Success"; + break; + case 1: + exit_string = "Illegal initialization values"; + break; + case 2: + exit_string = "Unrecognized device"; + break; + case 3: + exit_string = "Device revision is not supported"; + break; + case 4: + exit_string = "Device programming failure"; + break; + case 5: + exit_string = "Device is not blank"; + break; + case 6: + exit_string = "Device verify failure"; + break; + case 7: + exit_string = "SRAM configuration failure"; + break; + default: + exit_string = "Unknown exit code"; + break; + } + } + + return exit_string; +} + +static void jbi_help(void) +{ + fprintf(stderr, "Usage: jbi [options]\n"); + fprintf(stderr, "\nAvailable options:\n"); + fprintf(stderr, " -h : show help message\n"); + fprintf(stderr, " -v : show verbose messages\n"); + fprintf(stderr, " -i : show file info only - does not execute any action\n"); + fprintf(stderr, " -a : specify an action name (Jam STAPL)\n"); + fprintf(stderr, " -d : initialize variable to specified value (Jam 1.1)\n"); + fprintf(stderr, " -d : enable optional procedure (Jam STAPL)\n"); + fprintf(stderr, " -d : disable recommended procedure (Jam STAPL)\n"); + fprintf(stderr, " -r : don't reset JTAG TAP after use\n"); +} + +int jbi_debug(int level) +{ + jbi_debug_level = level; + + return 0; +} + +int jbi_main(unsigned char *addr, unsigned long size, int argc, char * const argv[]) +{ + BOOL help = FALSE; + BOOL error = FALSE; + long offset = 0L; + long error_address = 0L; + JBI_RETURN_TYPE crc_result = JBIC_SUCCESS; + JBI_RETURN_TYPE exec_result = JBIC_SUCCESS; + unsigned short expected_crc = 0; + unsigned short actual_crc = 0; + char key[33] = {0}; + char value[257] = {0}; + int exit_status = 0; + int arg = 0; + int exit_code = 0; + int format_version = 0; + char *workspace = NULL; + char *action = NULL; + char *init_list[10]; + int init_count = 0; + long workspace_size = 0; + char *exit_string = NULL; + int reset_jtag = 1; + int execute_program = 1; + int action_count = 0; + int procedure_count = 0; + int index = 0; + char *action_name = NULL; + char *description = NULL; + JBI_PROCINFO *procedure_list = NULL; + JBI_PROCINFO *procptr = NULL; + char *endp = NULL; + + verbose = FALSE; + + init_list[0] = NULL; + + /* print out the version string and copyright message */ + printf("Jam STAPL ByteCode Player Version 2.2\n"); + printf("Copyright (C) 1998-2001 Altera Corporation\n\n"); + + for (arg = 0; arg < argc; arg++) { + if (argv[arg][0] == '-') { + switch (toupper(argv[arg][1])) { + case 'A': /* set action name */ + if (action == NULL) { + action = &argv[arg][2]; + } else { + error = TRUE; + } + break; + case 'D': /* initialization list */ + if (argv[arg][2] == '"') { + init_list[init_count] = &argv[arg][3]; + } else { + init_list[init_count] = &argv[arg][2]; + } + init_list[++init_count] = NULL; + break; + case 'R': /* don't reset the JTAG chain after use */ + reset_jtag = 0; + break; + case 'M': /* set memory size */ + workspace = (char *) simple_strtoul(&argv[arg][2], &endp, 16); + if (workspace == NULL) { + printf("Error workspace\n"); + error = TRUE; + } else { + if (*endp == '.') { + workspace_size = simple_strtoul(endp + 1, &endp, 16); + if (*endp != '\0') { + printf("Error workspace size end\n"); + error = TRUE; + } + } else { + printf("No workspace size\n"); + error = TRUE; + } + } + break; + case 'H': /* help */ + help = TRUE; + break; + case 'V': /* verbose */ + verbose = TRUE; + break; + case 'I': /* show info only, do not execute */ + verbose = TRUE; + execute_program = 0; + break; + default: + error = TRUE; + break; + } + } else { + error = TRUE; + } + + if (error) { + fprintf(stderr, "Illegal argument: \"%s\"\n", argv[arg]); + help = TRUE; + error = FALSE; + } + } + + if (help) { + jbi_help(); + return 0; + } + + /* Calibrate the delay loop function */ + calibrate_delay(); + + jbi_init_mm(); + + /* Check CRC */ + crc_result = jbi_check_crc(addr, size, &expected_crc, &actual_crc); + if (verbose || (crc_result == JBIC_CRC_ERROR)) { + switch (crc_result) { + case JBIC_SUCCESS: + printf("CRC matched: CRC value = %04X\n", actual_crc); + break; + case JBIC_CRC_ERROR: + printf("CRC mismatch: expected %04X, actual %04X\n", expected_crc, actual_crc); + return -1; + case JBIC_UNEXPECTED_END: + printf("Expected CRC not found, actual CRC value = %04X\n", actual_crc); + return -1; + case JBIC_IO_ERROR: + printf("Error: File format is not recognized.\n"); + return -1; + default: + printf("CRC function returned error code %d\n", crc_result); + return -1; + } + } + + if (verbose) { + /* Display file format version */ + jbi_get_file_info(addr, size, &format_version, + &action_count, &procedure_count); + + printf("File format is %s ByteCode format\n", + (format_version == 2) ? "Jam STAPL" : "pre-standardized Jam 1.1"); + + /* Dump out NOTE fields */ + while (jbi_get_note(addr, size, &offset, key, value, 256) == 0) { + printf("NOTE \"%s\" = \"%s\"\n", key, value); + } + + /* Dump the action table */ + if ((format_version == 2) && (action_count > 0)) { + printf("\nActions available in this file:\n"); + + for (index = 0; index < action_count; ++index) { + jbi_get_action_info(addr, size, + index, &action_name, &description, &procedure_list); + + if (description == NULL) { + printf("%s\n", action_name); + } else { + printf("%s \"%s\"\n", action_name, description); + } + + procptr = procedure_list; + while (procptr != NULL) { + if (procptr->attributes != 0) { + printf(" %s (%s)\n", procptr->name, + (procptr->attributes == 1) ? "optional" : "recommended"); + } + + procedure_list = procptr->next; + jbi_free(procptr); + procptr = procedure_list; + } + } + + /* add a blank line before execution messages */ + if (execute_program) + printf("\n"); + } + } + + if (execute_program) { + /* Execute the Jam STAPL ByteCode program */ + exec_result = jbi_execute(addr, size, workspace, + workspace_size, action, init_list, reset_jtag, + &error_address, &exit_code, &format_version); + if (exec_result == JBIC_SUCCESS) { + exit_string = get_exit_string(format_version, exit_code); + printf("Exit code = %d... %s\n", exit_code, exit_string); + } else if ((format_version == 2) && (exec_result == JBIC_ACTION_NOT_FOUND)) { + if ((action == NULL) || (*action == '\0')) { + printf("Error: no action specified for Jam STAPL file.\n" + "Program terminated.\n"); + } else { + printf("Error: action \"%s\" is not supported for this Jam STAPL file.\n" + "Program terminated.\n", action); + } + } else if (exec_result < MAX_ERROR_CODE) { + printf("Error at address %ld: %s.\nProgram terminated.\n", + error_address, error_text[exec_result]); + } else { + printf("Unknown error code %d\n", exec_result); + } + } + + if (jtag_hardware_initialized) { + close_jtag_hardware(); + jtag_hardware_initialized = FALSE; + } + +#if defined(MEM_TRACKER) + if (verbose) { +#if defined(USE_STATIC_MEMORY) + fprintf(stdout, "Memory Usage Info: static memory size = %uBytes (%dKB)\n", + N_STATIC_MEMORY_BYTES, N_STATIC_MEMORY_KBYTES); +#endif /* USE_STATIC_MEMORY */ + fprintf(stdout, "Memory Usage Info: peak memory usage = %uBytes (%dKB)\n", + peak_memory_usage, (peak_memory_usage + 1023) / 1024); + fprintf(stdout, "Memory Usage Info: peak allocations = %u\n", + peak_allocations); +#if defined(USE_STATIC_MEMORY) + if ((n_bytes_allocated - n_bytes_not_recovered) != 0) { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", + (n_bytes_allocated - n_bytes_not_recovered), + ((n_bytes_allocated - n_bytes_not_recovered) + 1023) / 1024); + } +#else /* USE_STATIC_MEMORY */ + if (n_bytes_allocated != 0) { + fprintf(stdout, "Memory Usage Info: bytes still allocated = %d (%dKB)\n", + n_bytes_allocated, (n_bytes_allocated + 1023) / 1024); + } +#endif /* USE_STATIC_MEMORY */ + if (n_allocations != 0) { + fprintf(stdout, "Memory Usage Info: allocations not freed = %d\n", n_allocations); + } + } +#endif /* MEM_TRACKER */ + + jbi_exit_mm(); + + if (exec_result != JBIC_SUCCESS) { + return (-exec_result); + } + + if (exit_code != 0) { + return (exit_code); + } + + return (exit_status); +} + +#endif /* PORT == EMBEDDED */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h new file mode 100644 index 0000000000..5e5c5332f3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_cpld/jbistub.h @@ -0,0 +1,95 @@ +#ifndef __JBISTUB_H__ +#define __JBISTUB_H__ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_64BIT +typedef s64 addr_t; +#else +typedef s32 addr_t; +#endif +/* typedef long addr_t; */ + +/* #define USE_STATIC_MEMORY 100 */ +/* #define MEM_TRACKER */ + +/* #define O_RDWR 1 */ + +#define stdout (1) +#define stderr (2) + +#define puts printk +#define printf printk + +#define fprintf(std, fmt, arg...) \ + do { \ + printf(fmt, ##arg); \ + } while (0) + +#define DEBUG_NONE 0 +#define DEBUG_ERR 1 +#define DEBUG_DETAIL 2 +#define DEBUG_NOISY 3 +#define DEBUG_MM 4 + +#define jbi_dbg(level, fmt, arg...) \ + do { \ + if (level <= jbi_debug_level) { \ + printf(fmt, ##arg); \ + } \ + } while (0) + +extern int jbi_debug_level; + +static inline int open(char *path, int flag) +{ + return 0; +} + +static inline int close(int fd) +{ + return 0; +} + +static inline int read(int fd, char *buf, int count) +{ + return 0; +} + +static inline int write(int fd, char *buf, int count) +{ + return 0; +} + +static inline int fflush(int fd) +{ + return 0; +} + +static inline int clock(void) +{ + return 0; +} + +static inline int atoi(const char *nptr) +{ + return (int) simple_strtol(nptr, (char **) NULL, 10); +} + +static inline void *malloc(size_t size) +{ + return kmalloc(size, GFP_KERNEL); +} + +static inline void free(void *ptr) +{ + kfree(ptr); +} + +#endif /* __JBISTUB_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile new file mode 100644 index 0000000000..caad449480 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/Makefile @@ -0,0 +1,22 @@ +#include $(top_srcdir)/debian/rules +#KERNELDIR := ${KBUILD_OUTPUT} + +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../include) +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) +EXTRA_CFLAGS+= -Wall + +firmware_driver_ispvme-objs := firmware_ispvme.o +firmware_driver_ispvme-objs += firmware_cpld_ispvme.o firmware_cpld_upgrade_ispvme.o + +#ifndef CONFIG_FRM_PRODUCT_FILE + +$(warning $(firmware_driver_ispvme-objs)) +obj-m := firmware_driver_ispvme.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(common_module_dir) ]; then mkdir -p $(common_module_dir) ;fi + cp -p $(PWD)/*.ko $(common_module_dir) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c new file mode 100644 index 0000000000..9841782290 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_ispvme.c @@ -0,0 +1,450 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_cpld_open(struct inode *inode, struct file *file) +{ + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Open cpld device.\n"); + frm_dev = firmware_get_device_by_minor(MINOR(inode->i_rdev)); + if (frm_dev == NULL) { + return -ENXIO; + } + file->private_data = frm_dev; + + return FIRMWARE_SUCCESS; +} + +static ssize_t firmware_cpld_read (struct file *file, char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static ssize_t firmware_cpld_write (struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static loff_t firmware_cpld_llseek(struct file *file, loff_t offset, int origin) +{ + return 0; +} + +/* + * firmware_cpld_ioctl + * function: ispvme driver ioctl command parsing function + * @file: param[in] device file name + * @cmd: param[in] command + * @arg: param[in] the parameters in the command + * return value: success-FIRMWARE_SUCCESS; fail:other value + */ +static long firmware_cpld_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret; + void __user *argp; + firmware_device_t *frm_dev; + firmware_cpld_t *cpld_info; + char value; + + /* Get device private data */ + frm_dev = (firmware_device_t *)file->private_data; + cpld_info = NULL; + if (frm_dev != NULL) { + if (frm_dev->priv != NULL) { + cpld_info = (firmware_cpld_t *)frm_dev->priv; + } + } + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to frm_dev->priv sysfs info.\n"); + return FIRMWARE_FAILED; + } + argp = (void __user *)arg; + + switch (cmd) { + case FIRMWARE_JTAG_TDI: + /* Set the TDI signal */ + if (copy_from_user(&value, argp, sizeof(value))) { + return -EFAULT; + } + if (fwm_cpld_tdi_op(value) < 0 ) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_TCK: + /* Set the TCK signal */ + if (copy_from_user(&value, argp, sizeof(value))) { + return -EFAULT; + } + if (fwm_cpld_tck_op(value) < 0) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_TMS: + /* Set the TMS signal */ + if (copy_from_user(&value, argp, sizeof(value))) { + return -EFAULT; + } + if (fwm_cpld_tms_op(value) < 0) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_TDO: + /* Read the TDO signal */ + value = fwm_cpld_tdo_op(); + if (copy_to_user(argp, &value, sizeof(value))) { + return -EFAULT; + } + break; + case FIRMWARE_JTAG_INIT: + /* The VME upgrade mode initializes the operation */ + ret=firmware_init_vme(cpld_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to init upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + case FIRMWARE_JTAG_FINISH: + /* The VME upgrade mode completes the operation */ + ret=firmware_finish_vme(cpld_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to release upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("not find cmd: %d\r\n", cmd); + return -ENOTTY; + } /* End of switch */ + + return FIRMWARE_SUCCESS; +} + +static int firmware_cpld_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations cpld_dev_fops = { + .owner = THIS_MODULE, + .llseek = firmware_cpld_llseek, + .read = firmware_cpld_read, + .write = firmware_cpld_write, + .unlocked_ioctl = firmware_cpld_ioctl, + .open = firmware_cpld_open, + .release = firmware_cpld_release, +}; + +static int of_firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int ret; + char *name; + int i; + char buf[64]; + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + ret = 0; + ret += of_property_read_string(dev->of_node, "type", (const char **)&name); + ret += of_property_read_u32(dev->of_node, "tdi", &cpld_info->tdi); + ret += of_property_read_u32(dev->of_node, "tck", &cpld_info->tck); + ret += of_property_read_u32(dev->of_node, "tms", &cpld_info->tms); + ret += of_property_read_u32(dev->of_node, "tdo", &cpld_info->tdo); + + ret += of_property_read_u32(dev->of_node, "chain", &cpld_info->chain); + ret += of_property_read_u32(dev->of_node, "chip_index", &cpld_info->chip_index); + + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config error, ret:%d.\n", ret); + return -ENXIO; + } + + strncpy(cpld_info->type, name, sizeof(cpld_info->type) - 1); + + ret = of_property_read_u32(dev->of_node, "tck_delay", &cpld_info->tck_delay); + if(ret != 0) { + cpld_info->tck_delay = 60; + } + + cpld_info->gpio_en_info_num = 0; + /* Enable through GPIO */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_gpio_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_gpio); + if(ret != 0) { + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_level_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &cpld_info->gpio_en_info[i].en_level); + if(ret != 0) { + break; + } + cpld_info->gpio_en_info_num++; + } + + cpld_info->logic_dev_en_num = 0; + /* Enable through register */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + firmware_logic_dev_en_point = &cpld_info->logic_dev_en_info[i]; + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dev_%d", i); + ret = 0; + ret += of_property_read_string(dev->of_node, buf, (const char **)&name); + if(ret != 0) { + /* Failure to resolve to EN_LOGIC_DEV means no logical device is enabled. No failure is returned */ + ret = 0; + break; + } + strncpy(firmware_logic_dev_en_point->dev_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_addr_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->addr); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_addr_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_mask_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->mask); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_mask_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_en_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->en_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_en_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dis_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->dis_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_dis_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_width_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->width); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_width_%d ret =%d.\n", i, ret); + break; + } + + cpld_info->logic_dev_en_num++; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, gpio_en_info_num:%u logic_dev_en_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num, cpld_info->logic_dev_en_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_upgrade_config_init(struct device *dev, firmware_cpld_t *cpld_info) +{ + int i; + + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + firmware_upgrade_device_t *firmware_upgrade_device; + firmware_jtag_device_t jtag_upg_device; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_upgrade_config_init\r\n"); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + if (dev->platform_data == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("platform data config error.\n"); + return -1; + } + firmware_upgrade_device = dev->platform_data; + jtag_upg_device = firmware_upgrade_device->upg_type.jtag; + + mem_clear(cpld_info, sizeof(firmware_cpld_t)); + strncpy(cpld_info->type, firmware_upgrade_device->type, sizeof(cpld_info->type) - 1); + cpld_info->tdi = jtag_upg_device.tdi; + cpld_info->tck = jtag_upg_device.tck; + cpld_info->tms = jtag_upg_device.tms; + cpld_info->tdo = jtag_upg_device.tdo; + cpld_info->chain = firmware_upgrade_device->chain; + cpld_info->chip_index = firmware_upgrade_device->chip_index; + + if (jtag_upg_device.tck_delay == 0) { + cpld_info->tck_delay = 60; + FIRMWARE_DRIVER_DEBUG_VERBOSE("no config tck_delay, use default value:%u\n", cpld_info->tck_delay); + } else { + cpld_info->tck_delay = jtag_upg_device.tck_delay; + } + + if (firmware_upgrade_device->en_gpio_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_gpio_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_gpio_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + cpld_info->gpio_en_info_num = firmware_upgrade_device->en_gpio_num; + /* Enable through GPIO */ + for (i = 0; i < cpld_info->gpio_en_info_num; i++) { + cpld_info->gpio_en_info[i].en_gpio = firmware_upgrade_device->en_gpio[i]; + cpld_info->gpio_en_info[i].en_level = firmware_upgrade_device->en_level[i]; + } + + if (firmware_upgrade_device->en_logic_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_logic_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_logic_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + cpld_info->logic_dev_en_num = firmware_upgrade_device->en_logic_num; + /* Enable through register */ + for (i = 0; i < cpld_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_point = &cpld_info->logic_dev_en_info[i]; + strncpy(firmware_logic_dev_en_point->dev_name, firmware_upgrade_device->en_logic_dev[i], + FIRMWARE_DEV_NAME_LEN - 1); + firmware_logic_dev_en_point->addr = firmware_upgrade_device->en_logic_addr[i]; + firmware_logic_dev_en_point->mask = firmware_upgrade_device->en_logic_mask[i]; + firmware_logic_dev_en_point->en_val = firmware_upgrade_device->en_logic_en_val[i]; + firmware_logic_dev_en_point->dis_val = firmware_upgrade_device->en_logic_dis_val[i]; + firmware_logic_dev_en_point->width = firmware_upgrade_device->en_logic_width[i]; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("type:%s, chain:%u, chip_index:%u, gpio_en_info_num:%u logic_dev_en_num:%u\n", + cpld_info->type, cpld_info->chain, cpld_info->chip_index, cpld_info->gpio_en_info_num, cpld_info->logic_dev_en_num); + FIRMWARE_DRIVER_DEBUG_VERBOSE("tdi:%u, tck:%u, tms:%u, tdo:%u tck_delay:%u.\n", + cpld_info->tdi, cpld_info->tck, cpld_info->tms, cpld_info->tdo, cpld_info->tck_delay); + + return 0; +} + +static int firmware_cpld_probe(struct platform_device *pdev) +{ + int ret; + firmware_cpld_t *cpld_info; + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_cpld_probe\r\n"); + /* Gets the information in the device tree */ + cpld_info = devm_kzalloc(&pdev->dev, sizeof(firmware_cpld_t), GFP_KERNEL); + if (cpld_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc cpld device tree.\n"); + return -EPERM; + } + + if (pdev->dev.of_node) { + ret = of_firmware_upgrade_config_init(&pdev->dev, cpld_info); + } else { + ret = firmware_upgrade_config_init(&pdev->dev, cpld_info); + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("get config init from dts error.\n"); + return -EPERM; + } + + frm_dev = devm_kzalloc(&pdev->dev, sizeof(firmware_device_t), GFP_KERNEL); + if (frm_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc firmware device.\n"); + return -EPERM; + } + + /* Based on the link number, determine the name of the device file */ + frm_dev->chain = cpld_info->chain; + snprintf(frm_dev->name, FIRMWARE_NAME_LEN - 1, "firmware_cpld_ispvme%d", frm_dev->chain); + strncpy(cpld_info->devname, frm_dev->name, strlen(frm_dev->name) + 1); + + INIT_LIST_HEAD(&frm_dev->list); + frm_dev->dev.minor = MISC_DYNAMIC_MINOR; + frm_dev->dev.name = frm_dev->name; + frm_dev->dev.fops = &cpld_dev_fops; + frm_dev->priv = cpld_info; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Register cpld firmware chain:%d, name:%s.\n", frm_dev->chain, frm_dev->name); + + ret = firmware_device_register(frm_dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to register firmware device.\n"); + return -EPERM; + } + + platform_set_drvdata(pdev, frm_dev); + return 0; +} + +static int __exit firmware_cpld_remove(struct platform_device *pdev) +{ + firmware_device_t *frm_dev; + + frm_dev = (firmware_device_t *)platform_get_drvdata(pdev); + firmware_device_unregister(frm_dev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct of_device_id cpld_match[] = { + { + .compatible = "firmware_cpld_ispvme", + }, + {}, +}; + +static struct platform_driver cpld_driver = { + .driver = { + .name = "firmware_cpld_ispvme", + .owner = THIS_MODULE, + .of_match_table = cpld_match, + }, + .probe = firmware_cpld_probe, + .remove = firmware_cpld_remove, +}; + +static firmware_driver_t fmw_drv_cpld = { + .name = "firmware_cpld_ispvme", + .drv = &cpld_driver, +}; + +int firmware_cpld_init(void) +{ + int ret; + + INIT_LIST_HEAD(&fmw_drv_cpld.list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("ispvme upgrade driver register \n"); + ret = firmware_driver_register(&fmw_drv_cpld); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("ispvme upgrade driver register failed\n"); + return ret; + } + return 0; +} + +void firmware_cpld_exit(void) +{ + firmware_driver_unregister(&fmw_drv_cpld); + INIT_LIST_HEAD(&fmw_drv_cpld.list); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c new file mode 100644 index 0000000000..b8896ed75f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_cpld_upgrade_ispvme.c @@ -0,0 +1,691 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* TCK clock MAX 16MHz */ +#define TCK_DELAY (current_fmw_cpld->tck_delay) + +#if 0 +static firmware_cpld_t default_fmw_cpld; +#endif + +static firmware_cpld_t *current_fmw_cpld; + +static int TDI_PULL_UP(void); +static int TDI_PULL_DOWN(void); +static int TMS_PULL_UP(void); +static int TMS_PULL_DOWN(void); +static int TCK_PULL_UP(void); +static int TCK_PULL_DOWN(void); + +/* + * set_currrent_cpld_info + * function: Save the current device information + * @info: param[in] Information about the device to be updated + */ +static void set_currrent_cpld_info(firmware_cpld_t *info) +{ + current_fmw_cpld = info; +} + +static int firmware_file_read(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_read(filp, val, size, &pos); + if (ret != size) { + FIRMWARE_DRIVER_DEBUG_ERROR("read kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int firmware_file_write(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_write(filp, (void*)val, size, &pos); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("write kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +/* + * firmware_file_do_work + * function: Sets logical register values + * @path:param[in] Logic device descriptor + * @addr:param[in] Logic device address + * @value:param[in] the register value needs to be set + * @mask:param[in] register mask + * @width:param[in] register bit width + * return: 0:success, <0:failed + */ +static int firmware_file_do_work(char *path, uint32_t addr, uint32_t value, uint32_t mask, + int32_t width) +{ + int ret; + uint8_t read_value[4], write_value[4]; + uint8_t tmp_read8, tmp_write8, tmp_mask8; + uint32_t tmp_read32, tmp_write32; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("path=%s, addr=0x%x, value=0x%x mask=0x%x\r\n", path, addr, value, mask); + if ((width > 4) || (width < 0)) { + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + ret = 0; + mem_clear(read_value, sizeof(read_value)); + mem_clear(write_value, sizeof(write_value)); + ret = firmware_file_read(path, addr, read_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware sysfs read.\r\n"); + return -1; + } + + switch (width) { + case 1: + tmp_read8 = read_value[0]; + tmp_mask8 = (uint8_t)(mask) & 0xFF; + tmp_write8 = (uint8_t)value & 0xFF; + write_value[0] = (tmp_read8 & tmp_mask8) | tmp_write8; + FIRMWARE_DRIVER_DEBUG_VERBOSE("1 byte write val[0]:0x%x", write_value[0]); + break; + case 2: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + case 4: + memcpy((uint8_t *)&tmp_read32, read_value, 4); + tmp_write32 = (tmp_read32 & mask) | value; + memcpy(write_value, (uint8_t *)&tmp_write32, 4); + FIRMWARE_DRIVER_DEBUG_VERBOSE("4 byte write val[0]:0x%x, val[1]:0x%x, val[2]:0x%x, val[3]:0x%x", + write_value[0], write_value[1], write_value[2], write_value[3]); + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("write logic dev[%s] addr[0x%x].\r\n", path, addr); + ret = firmware_file_write(path, addr, write_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware_file_write %s addr 0x%x failed, ret=%d.\r\n", path, addr, ret); + return -1; + } + + return 0; +} + +/* + * firmware_upgrade_en + * function: Upgrade access enabling switch + * @flag: !0:enable 0:disable + */ +static int firmware_upgrade_en(int flag) +{ + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_info; + int ret, rv; + char *dev_name; + + ret = 0; + FIRMWARE_DRIVER_DEBUG_VERBOSE("%s en switch: gpio en num %d, logic reg en num %d.\n", + flag ? "Open" : "Close", current_fmw_cpld->gpio_en_info_num, current_fmw_cpld->logic_dev_en_num); + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (flag) { + ret = gpio_request(current_fmw_cpld->gpio_en_info[i].en_gpio, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade EN[%d] GPIO[%d] failed!\n", + i, current_fmw_cpld->gpio_en_info[i].en_gpio); + goto free_gpio; + } + gpio_direction_output(current_fmw_cpld->gpio_en_info[i].en_gpio, current_fmw_cpld->gpio_en_info[i].en_level); + current_fmw_cpld->gpio_en_info[i].flag = 1; + } else { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } + } + + for (i = 0; i < current_fmw_cpld->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = ¤t_fmw_cpld->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware sysfs [%d] dev_name[%s] addr[0x%x] mask[0x%x]" + " en_val[0x%x] dis_val[0x%x] width[%d]\n", + i , firmware_logic_dev_en_info->dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->mask, firmware_logic_dev_en_info->en_val, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->width); + if (flag) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->en_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Open logic register [%d] EN failed, ret %d.\n", i, ret); + goto free_logic_dev; + } else { + firmware_logic_dev_en_info->flag = 1; + } + } else { + rv = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (rv < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, rv); + ret = -1; + } + firmware_logic_dev_en_info->flag = 0; + } + } + + return ret; +free_logic_dev: + for (i = 0; i < current_fmw_cpld->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = ¤t_fmw_cpld->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + if (firmware_logic_dev_en_info->flag == 1) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, ret); + } + firmware_logic_dev_en_info->flag = 0; + } else { + break; + } + } +free_gpio: + for (i = 0; i < current_fmw_cpld->gpio_en_info_num; i++) { + if (current_fmw_cpld->gpio_en_info[i].flag == 1) { + gpio_set_value(current_fmw_cpld->gpio_en_info[i].en_gpio, !current_fmw_cpld->gpio_en_info[i].en_level); + gpio_free(current_fmw_cpld->gpio_en_info[i].en_gpio); + current_fmw_cpld->gpio_en_info[i].flag = 0; + } else { + break; + } + } + + return -1; +} + +/* + * init_cpld + * function:Initialize CPLD + * return value: 0 success ; -1 fail + */ +static int init_cpld(void) +{ + int ret; + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = 0; + ret = gpio_request(current_fmw_cpld->tdi, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TDI GPIO failed!\n"); + return ret; + } + ret = gpio_request(current_fmw_cpld->tck, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TCK GPIO failed!\n"); + goto free_tdi; + } + ret = gpio_request(current_fmw_cpld->tms, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TMS GPIO failed!\n"); + goto free_tck; + } + ret = gpio_request(current_fmw_cpld->tdo, "cpld_ispvme_upgrade"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade TDO GPIO failed!\n"); + goto free_tms; + } + + gpio_direction_output(current_fmw_cpld->tdi, 1); + gpio_direction_output(current_fmw_cpld->tck, 1); + gpio_direction_output(current_fmw_cpld->tms, 1); + + gpio_direction_input(current_fmw_cpld->tdo); + ret = firmware_upgrade_en(1); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: open firmware upgrade en failed, ret %d.\n", ret); + goto free_tdo; + } +#if 0 + /* test GPIO */ + if (TDI_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_UP failed.\n"); + goto free_tdo; + } + if (TDI_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TDI_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TMS_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_UP failed.\n"); + goto free_tdo; + } + if (TMS_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TMS_PULL_DOWN failed.\n"); + goto free_tdo; + } + if (TCK_PULL_UP() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_UP failed.\n"); + goto free_tdo; + } + if (TCK_PULL_DOWN() < 0 ) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: TCK_PULL_DOWN failed.\n"); + goto free_tdo; + } +#endif + mdelay(10); + return 0; + +free_tdo: + gpio_free(current_fmw_cpld->tdo); +free_tms: + gpio_free(current_fmw_cpld->tms); +free_tck: + gpio_free(current_fmw_cpld->tck); +free_tdi: + gpio_free(current_fmw_cpld->tdi); + return ret; +} + +/* + * finish_cpld + * function: finish CPLD upgrade operation + * return value: 0 success ; -1 fail + */ +static int finish_cpld(void) +{ + int ret; + + if (current_fmw_cpld == NULL) { + return -1; + } + mdelay(10); + ret = firmware_upgrade_en(0); + if (ret < 0){ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: close firmware upgrade en failed, ret %d.\r\n", ret); + } + + gpio_free(current_fmw_cpld->tdi); + gpio_free(current_fmw_cpld->tck); + gpio_free(current_fmw_cpld->tms); + gpio_free(current_fmw_cpld->tdo); + mdelay(10); + return 0; +} + +/* Loop waiting for */ +static int pull_wait(int gpio, int value) { + int i, j; + /* Timeout time is two seconds */ + for (i = 0; i < 20; i++) { + for (j = 0; j < 100; j++) { + if (!!gpio_get_value(gpio) == !!value ) { + return 0; + } + /* The first loop does not delay, normally the first loop can immediately return the result */ + if (i) { + mdelay(1); + } + } + /* The CPU is released every 100ms */ + schedule(); + } + /* timeout */ + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Wait gpio %d pull to %d failed.\n", gpio, value); + return -1; +} + +/* TDI pull-up */ +static int pull_tdi_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 1); +} + +/* TDI pull-down */ +static int pull_tdi_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tdi, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tdi, 0); +} + +/* TCK pull-up */ +static int pull_tck_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 1); +} + +/* TCK pull-down */ +static int pull_tck_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tck, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tck, 0); +} + +/* TMS pull-up */ +static int pull_tms_up(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 1); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 1); +} + +/* TMS pull-down */ +static int pull_tms_down(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + gpio_set_value(current_fmw_cpld->tms, 0); + + /* Wait for the GPIO value to be set successfully */ + return pull_wait(current_fmw_cpld->tms, 0); +} + +/* Read TDO */ +static int read_tdo(void) +{ + if (current_fmw_cpld == NULL) { + return -1; + } + return gpio_get_value(current_fmw_cpld->tdo); +} + +static firmware_cpld_function_t function_fmw_cpld = { + .pull_tdi_up = pull_tdi_up, + .pull_tdi_down = pull_tdi_down, + .pull_tck_up = pull_tck_up, + .pull_tck_down = pull_tck_down, + .pull_tms_up = pull_tms_up, + .pull_tms_down = pull_tms_down, + .read_tdo = read_tdo, + .init_cpld = init_cpld, + .finish_cpld = finish_cpld, +}; + +/* + * TDI_PULL_DOWN + * function: Lower TDI + */ +static int TDI_PULL_DOWN(void) +{ + if ( function_fmw_cpld.pull_tdi_down != NULL) { + return function_fmw_cpld.pull_tdi_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TDI_PULL_UP + * function: High TDI + */ +static int TDI_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tdi_up != NULL) { + return function_fmw_cpld.pull_tdi_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDI_PULL_UP.\n"); + return -1; + } +} + +/* + * TCK_PULL_DOWN + * function: Lower TCK + */ +static int TCK_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tck_down != NULL) { + return function_fmw_cpld.pull_tck_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TCK_PULL_UP + * function: High TCK + */ +static int TCK_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tck_up != NULL) { + return function_fmw_cpld.pull_tck_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TCK_PULL_UP.\n"); + return -1; + } +} + +/* + * TMS_PULL_DOWN + * function: Lower TMS + */ +static int TMS_PULL_DOWN(void) +{ + if (function_fmw_cpld.pull_tms_down != NULL) { + return function_fmw_cpld.pull_tms_down(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_DOWN.\n"); + return -1; + } +} + +/* + * TMS_PULL_UP + * function: High TMS + */ +static int TMS_PULL_UP(void) +{ + if (function_fmw_cpld.pull_tms_up != NULL) { + return function_fmw_cpld.pull_tms_up(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TMS_PULL_UP.\n"); + return -1; + } +} + +/* + * TDO_READ + * function:Read the TDO level + */ +static int TDO_READ(void) +{ + if (function_fmw_cpld.read_tdo != NULL) { + return function_fmw_cpld.read_tdo(); + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("NO support TDO_READ.\n"); + return -1; + } +} + +/* + * cpld_upgrade_init + * function:Initialize GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_init(void) +{ + int ret; + + if (function_fmw_cpld.init_cpld != NULL) { + ret = function_fmw_cpld.init_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +/* + * cpld_upgrade_finish + * function:Release GPIO and CPLD + * return value: success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int cpld_upgrade_finish(void) +{ + int ret; + + if (function_fmw_cpld.finish_cpld != NULL) { + ret = function_fmw_cpld.finish_cpld(); + if (ret != FIRMWARE_SUCCESS) { + return ret; + } + } + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_init_vme + * function: Initialize GPIO, + * @cpld_info: param[in] Information about the device to be written to + */ +int firmware_init_vme(firmware_cpld_t *cpld_info){ + int ret; + set_currrent_cpld_info(cpld_info); + /* Initialize GPIO and CPLD */ + ret = cpld_upgrade_init(); + return ret; +} + +/** + * firmware_finish_vme + * function: Release GPIO + * @cpld_info: param[in] Information about the device to be written to + */ +int firmware_finish_vme(firmware_cpld_t *cpld_info){ + int ret; + set_currrent_cpld_info(cpld_info); + ret = cpld_upgrade_finish(); + return ret; +} + +/** + * fwm_cpld_tdi_op + * function: Operate TDI + * @value: param[in] TDI level */ +int fwm_cpld_tdi_op(int value) +{ + if (value) { + return TDI_PULL_UP(); + } else { + return TDI_PULL_DOWN(); + } +} + +/** + * fwm_cpld_tck_op + * function: Operate TCK + * @value: param[in] TCK level */ +int fwm_cpld_tck_op(int value) +{ + if (value) { + return TCK_PULL_UP(); + } else { + return TCK_PULL_DOWN(); + } +} + +/** + * fwm_cpld_tms_op + * function: Operate TMS + * value: param[in] TMS level */ +int fwm_cpld_tms_op(int value) +{ + if (value) { + return TMS_PULL_UP(); + } else { + return TMS_PULL_DOWN(); + } +} + +/** + * fwm_cpld_tdo_op + * function: Read TDO + */ +int fwm_cpld_tdo_op() +{ + return TDO_READ(); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c new file mode 100644 index 0000000000..e8f75844ae --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/firmware_ispvme.c @@ -0,0 +1,140 @@ +#include +#include +#include + +int g_firmware_driver_debug = 0; +module_param(g_firmware_driver_debug, int, S_IRUGO | S_IWUSR); + +static LIST_HEAD(drv_list); +static LIST_HEAD(dev_list); + +/** + * firmware_driver_register + * function:Registered Device Driver + * @fw_drv:param[in] Driver information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_driver_register(firmware_driver_t *fw_drv) +{ + int ret; + + if (fw_drv == NULL) { + return FIRMWARE_FAILED; + } + + ret = platform_driver_register(fw_drv->drv); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: failed to register firmware upgrade driver \n"); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_drv->list, &drv_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware upgrade driver register sucess \n"); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_driver_unregister + * function:unregister Device Driver + * @fw_drv:param[in] Driver information + */ +void firmware_driver_unregister(firmware_driver_t *fw_drv) +{ + list_del_init(&fw_drv->list); + platform_driver_unregister(fw_drv->drv); +} + +/* + * firmware_get_device_by_minor + * function: Get device information based on minor + */ +firmware_device_t *firmware_get_device_by_minor(int minor) +{ + firmware_device_t *tmp; + + list_for_each_entry(tmp, &dev_list, list) { + if (tmp->dev.minor == minor) { + return tmp; + } + } + + return NULL; +} + +/** + * firmware_device_register + * function:Registered Driver Device + * @fw_dev: param[in] Driver information + * return value:success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_device_register(firmware_device_t *fw_dev) +{ + int ret; + firmware_device_t *tmp; + + if (fw_dev == NULL) { + return FIRMWARE_FAILED; + } + /* Check whether the device file name already exists in the device linked list */ + list_for_each_entry(tmp, &dev_list, list) { + if (strcmp(tmp->name, fw_dev->name) == 0) { + return FIRMWARE_FAILED; + } + } + + /* Registere device */ + ret = misc_register(&fw_dev->dev); + if (ret < 0) { + return FIRMWARE_FAILED; + } + + /* Adds a device to the device list */ + list_add(&fw_dev->list, &dev_list); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_device_unregister + * function: unregister Driver Device + */ +void firmware_device_unregister(firmware_device_t *fw_dev) +{ + list_del(&fw_dev->list); + misc_deregister(&fw_dev->dev); +} + +static int __init firmware_driver_init(void) +{ + int ret; + + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver ispvme init.\n"); + ret = firmware_cpld_init(); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware driver ispvme init failed.\n"); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +static void __exit firmware_driver_exit(void) +{ + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver ispvme exit.\n"); + firmware_cpld_exit(); + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + return; +} + +module_init(firmware_driver_init); +module_exit(firmware_driver_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Firmware upgrade ispvme driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h new file mode 100644 index 0000000000..eb737d3a56 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_cpld_ispvme.h @@ -0,0 +1,70 @@ +#ifndef __FIRMWARE_CPLD_H__ +#define __FIRMWARE_CPLD_H__ + +#define FIRMWARE_DEV_NAME_LEN 32 +#define FIRMWARE_MAX_CPLD_NUM 16 +#define FIRMWARE_TYPE_LEN 10 +#define FIRMWARE_EN_INFO_MAX 16 +#define FIRMWARE_EN_INFO_BUF 128 + +typedef struct firmware_gpio_jtag_en_s { + uint32_t en_gpio; /* GPIO enable pin */ + uint32_t en_level; /* GPIO enable level */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_gpio_jtag_en_t; + +typedef struct firmware_logic_dev_en_s { + char dev_name[FIRMWARE_DEV_NAME_LEN]; /* Logical device name */ + uint32_t addr; /* Enable register address */ + uint32_t mask; /* mask */ + uint32_t en_val; /* Enable value */ + uint32_t dis_val; /* Disable value*/ + uint32_t width; /* width */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_logic_dev_en_t; + +typedef struct firmware_cpld_s { + char devname[FIRMWARE_DEV_NAME_LEN]; /* Device name */ + char type[FIRMWARE_TYPE_LEN]; /* interface type */ + uint32_t tdi; /* TDI signal corresponding to GPIO pin information */ + uint32_t tck; /* TCK signal corresponding to GPIO pin information */ + uint32_t tms; /* TMS signal corresponding to GPIO pin information */ + uint32_t tdo; /* TDO signal corresponding to GPIO pin information */ + uint32_t chain; /* chain num */ + uint32_t chip_index; /* chip index */ + uint32_t tck_delay; /* Delay time */ + uint32_t gpio_en_info_num; /* GPIO Enable Number */ + firmware_gpio_jtag_en_t gpio_en_info[FIRMWARE_EN_INFO_MAX]; /* GPIO Enable Information */ + uint32_t logic_dev_en_num; /* Register Enable Number */ + firmware_logic_dev_en_t logic_dev_en_info[FIRMWARE_EN_INFO_MAX]; /* Register Enable Information */ +} firmware_cpld_t; + +typedef struct firmware_cpld_function_s{ + int (*pull_tdi_up)(void); /* TDI pull-up */ + int (*pull_tdi_down)(void); /* TDI pull-down */ + int (*pull_tck_up)(void); /* TCK pull-up */ + int (*pull_tck_down)(void); /* TCK pull-down */ + int (*pull_tms_up)(void); /* TMS pull-up */ + int (*pull_tms_down)(void); /* TCK pull-down */ + int (*read_tdo)(void); /* Read TDO */ + int (*init_cpld)(void); /* CPLD upgrade initializes the operation */ + int (*init_chip)(int chain); /* chip initializes the operation */ + int (*finish_chip)(int chain); /* chip completes the operation*/ + int (*finish_cpld)(void); /* CPLD upgrade completes the operation */ + int (*get_version)(int chain, char *ver, int len); /* get version */ +}firmware_cpld_function_t; + +/* operate TDI */ +extern int fwm_cpld_tdi_op(int value); +/* operate TCK */ +extern int fwm_cpld_tck_op(int value); +/* operate TMS */ +extern int fwm_cpld_tms_op(int value); +/* operate TDO */ +extern int fwm_cpld_tdo_op(void); +/* VME upgrade mode completes the operation*/ +extern int firmware_finish_vme(firmware_cpld_t *cpld_info); +/* VME upgrade mode initializes the operation*/ +extern int firmware_init_vme(firmware_cpld_t *cpld_info); + +#endif /* __FIRMWARE_CPLD_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h new file mode 100644 index 0000000000..39baf3f307 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_ispvme/include/firmware_ispvme.h @@ -0,0 +1,86 @@ +#ifndef __FIRMWARE_H__ +#define __FIRMWARE_H__ + +#include +#include + +#include + +/* Debug switch level */ +typedef enum { + FIRWMARE_VERBOSE, + FIRWMARE_WARN, + FIRWMARE_ERROR, + FIRWMARE_END, +} firmware_debug_level_t; + +#define FIRMWARE_DRIVER_DEBUG_VERBOSE(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_VERBOSE)) { \ + printk(KERN_INFO "[FIRMWARW_DRIVER_ISPVME][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_DRIVER_DEBUG_ERROR(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_ERROR)) { \ + printk(KERN_ERR "[FIRMWARW_DRIVER_ISPVME][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_NAME_LEN 48 + +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS 0 + +/* ioctl publi command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ + +/* firmware cpld ispvme driver ioctl command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_VME_TYPE 'V' +#define FIRMWARE_JTAG_TDI _IOR(FIRMWARE_VME_TYPE, 0, char) +#define FIRMWARE_JTAG_TDO _IOR(FIRMWARE_VME_TYPE, 1, char) +#define FIRMWARE_JTAG_TCK _IOR(FIRMWARE_VME_TYPE, 2, char) +#define FIRMWARE_JTAG_TMS _IOR(FIRMWARE_VME_TYPE, 3, char) +#define FIRMWARE_JTAG_EN _IOR(FIRMWARE_VME_TYPE, 4, char) +#define FIRMWARE_JTAG_INIT _IOR(FIRMWARE_VME_TYPE, 7, char) /* enable upgrade access */ +#define FIRMWARE_JTAG_FINISH _IOR(FIRMWARE_VME_TYPE, 8, char) /* disable upgrade access */ + +typedef struct cmd_info_s { + uint32_t size; + void __user *data; +} cmd_info_t; + +typedef struct firmware_device_s { + struct list_head list; /* device list */ + uint32_t chain; /* chain number */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct miscdevice dev; /* device */ + void *priv; /* private data */ +} firmware_device_t; + +typedef struct firmware_driver_s { + struct list_head list; /* list */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct platform_driver *drv; /* driver */ + void *priv; /* private data */ +} firmware_driver_t; + +extern int g_firmware_driver_debug; + +/* Get device information based on minor */ +extern firmware_device_t *firmware_get_device_by_minor(int minor); +/* Registere device */ +extern int firmware_device_register(firmware_device_t *fw_dev); +/* Unregister device */ +extern void firmware_device_unregister(firmware_device_t *fw_dev); +/* Registere driver */ +extern int firmware_driver_register(firmware_driver_t *fw_drv); +/* Unregister driver */ +extern void firmware_driver_unregister(firmware_driver_t *fw_drv); +/* CPLD upgrade initialized */ +extern int firmware_cpld_init(void); +/* CPLD unload function */ +extern void firmware_cpld_exit(void); + +#endif /* end of __FIRMWARE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile new file mode 100644 index 0000000000..a1d6d2e2ef --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/Makefile @@ -0,0 +1,22 @@ +#include $(top_srcdir)/debian/rules +#KERNELDIR := ${KBUILD_OUTPUT} + +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../include) +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) +EXTRA_CFLAGS+= -Wall + +firmware_driver_sysfs-objs := firmware.o +firmware_driver_sysfs-objs += firmware_sysfs.o firmware_sysfs_upgrade.o + +#ifndef CONFIG_FRM_PRODUCT_FILE + +$(warning $(firmware_driver_sysfs-objs)) +obj-m := firmware_driver_sysfs.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(common_module_dir) ]; then mkdir -p $(common_module_dir) ;fi + cp -p $(PWD)/*.ko $(common_module_dir) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c new file mode 100644 index 0000000000..fec51d6238 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware.c @@ -0,0 +1,143 @@ +#include +#include +#include + +int g_firmware_driver_debug = 0; +module_param(g_firmware_driver_debug, int, S_IRUGO | S_IWUSR); + +static LIST_HEAD(drv_list); +static LIST_HEAD(dev_list); + +/** + * firmware_driver_register + * function:Registered Device Driver + * @fw_drv:param[in] Driver information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_driver_register(firmware_driver_t *fw_drv) +{ + int ret; + + if (fw_drv == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + + ret = platform_driver_register(fw_drv->drv); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: failed to register firmware upgrade driver \n"); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_drv->list, &drv_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware upgrade driver register sucess \n"); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_driver_unregister + * function:unregister Device Driver + * @fw_drv:param[in] Driver information + */ +void firmware_driver_unregister(firmware_driver_t *fw_drv) +{ + list_del_init(&fw_drv->list); + platform_driver_unregister(fw_drv->drv); +} + +/* + * firmware_get_device_by_minor + * function: Get device information based on minor + */ +firmware_device_t *firmware_get_device_by_minor(int minor) +{ + firmware_device_t *tmp; + + list_for_each_entry(tmp, &dev_list, list) { + if (tmp->dev.minor == minor) { + return tmp; + } + } + + return NULL; +} + +/** + * firmware_device_register + * function:Registered Driver Device + * @fw_dev: param[in] Driver information + * return value:success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_device_register(firmware_device_t *fw_dev) +{ + int ret; + firmware_device_t *tmp; + + if (fw_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Parameter error.\n"); + return FIRMWARE_FAILED; + } + /* Check whether the device file name already exists in the device linked list */ + list_for_each_entry(tmp, &dev_list, list) { + if (strcmp(tmp->name, fw_dev->name) == 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("devie %s already exists.\n", fw_dev->name); + return FIRMWARE_FAILED; + } + } + + ret = misc_register(&fw_dev->dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("register misc error, ret=%d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Adds driver information to the driver list */ + list_add(&fw_dev->list, &dev_list); + + return FIRMWARE_SUCCESS; +} + +/** + * firmware_device_unregister + * function: unregister Driver Device + */ +void firmware_device_unregister(firmware_device_t *fw_dev) +{ + list_del(&fw_dev->list); + misc_deregister(&fw_dev->dev); +} + +static int __init firmware_driver_init(void) +{ + int ret; + + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver sysfs init.\n"); + ret = firmware_sysfs_init(); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware driver sysfs init failed.\n"); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +static void __exit firmware_driver_exit(void) +{ + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware driver sysfs exit.\n"); + firmware_sysfs_exit(); + INIT_LIST_HEAD(&drv_list); + INIT_LIST_HEAD(&dev_list); + return; +} + +module_init(firmware_driver_init); +module_exit(firmware_driver_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Firmware upgrade driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("1.0"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c new file mode 100644 index 0000000000..a823cdc4f2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs.c @@ -0,0 +1,495 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_sysfs_open(struct inode *inode, struct file *file) +{ + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Open device.\n"); + frm_dev = firmware_get_device_by_minor(MINOR(inode->i_rdev)); + if (frm_dev == NULL) { + return -ENXIO; + } + file->private_data = frm_dev; + + return FIRMWARE_SUCCESS; +} + +static ssize_t firmware_sysfs_read (struct file *file, char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static ssize_t firmware_sysfs_write (struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + return 0; +} + +static loff_t firmware_sysfs_llseek(struct file *file, loff_t offset, int origin) +{ + return 0; +} + +/* firmware_sysfs_ioctl +* function:ioctl command parsing function +* @file: param[in] device file name +* @cmd: param[in] command +* @arg: param[in] the parameters in the command +* return value: success-FIRMWARE_SUCCESS; fail:other value +*/ +static long firmware_sysfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + void __user *argp; + firmware_device_t *frm_dev; + firmware_sysfs_t *sysfs_info; + int ret; + + /* Get device private data */ + frm_dev = (firmware_device_t *)file->private_data; + sysfs_info = NULL; + if (frm_dev != NULL) { + if (frm_dev->priv != NULL) { + sysfs_info = (firmware_sysfs_t *)frm_dev->priv; + } + } + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to frm_dev->priv sysfs info.\n"); + return FIRMWARE_FAILED; + } + argp = (void __user *)arg; + + switch (cmd) { + case FIRMWARE_SYSFS_INIT: + /* enable upgrade access */ + ret = firmware_init_dev_loc(sysfs_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to init upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + case FIRMWARE_SYSFS_FINISH: + /* disable upgrade access */ + ret = firmware_finish_dev_loc(sysfs_info); + if (ret != FIRMWARE_SUCCESS) { + FIRMWARE_DRIVER_DEBUG_ERROR("Error: Failed to release upgrade.(chain = %d)\n", + frm_dev != NULL ? frm_dev->chain : -1); + return FIRMWARE_FAILED; + } + break; + case FIRMWARE_SYSFS_SPI_INFO: + /* Get SPI logic device information */ + if (copy_to_user(argp, &sysfs_info->info.spi_logic_info, sizeof(firmware_spi_logic_info_t))) { + return -EFAULT; + } + break; + case FIRMWARE_SYSFS_DEV_FILE_INFO: + /*Get logic device information */ + if (copy_to_user(argp, &sysfs_info->info.dev_file_info, sizeof(firmware_dev_file_info_t))) { + return -EFAULT; + } + break; + case FIRMWARE_SYSFS_MTD_INFO: + /*Get logic device information */ + if (copy_to_user(argp, &sysfs_info->info.mtd_info, sizeof(firmware_mtd_info_t))) { + return -EFAULT; + } + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("not find cmd: %d\r\n", cmd); + return -ENOTTY; + } /* End of switch */ + + return FIRMWARE_SUCCESS; +} + +static int firmware_sysfs_release(struct inode *inode, struct file *file) +{ + return 0; +} + +static const struct file_operations sysfs_dev_fops = { + .owner = THIS_MODULE, + .llseek = firmware_sysfs_llseek, + .read = firmware_sysfs_read, + .write = firmware_sysfs_write, + .unlocked_ioctl = firmware_sysfs_ioctl, + .open = firmware_sysfs_open, + .release = firmware_sysfs_release, +}; + +/* Gets the information in the device tree */ +static int of_firmware_upgrade_config_init(struct device *dev, firmware_sysfs_t *sysfs_info) +{ + int ret; + char *name; + int8_t buf[64]; + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + uint32_t test_base, test_size; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_dev_loc_config_init\r\n"); + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + mem_clear(sysfs_info, sizeof(firmware_sysfs_t)); + ret = 0; + ret += of_property_read_string(dev->of_node, "type", (const char **)&name); + + ret += of_property_read_u32(dev->of_node, "chain", &sysfs_info->chain); + ret += of_property_read_u32(dev->of_node, "chip_index", &sysfs_info->chip_index); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->type, name, sizeof(sysfs_info->type) - 1); + + ret = of_property_read_u32(dev->of_node, "test_base", &test_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config test_base, ret:%d.\n", ret); + test_base = 0; + } + + ret = of_property_read_u32(dev->of_node, "test_size", &test_size); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config test_size, ret:%d.\n", ret); + test_size = 0; + } + + if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SPI_LOGIC) == 0) { + ret = of_property_read_string(dev->of_node, "dev_name", (const char **)&name); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config dev_name error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->info.spi_logic_info.dev_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + ret = of_property_read_u32(dev->of_node, "flash_base", &sysfs_info->info.spi_logic_info.flash_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config flash_base error, ret:%d.\n", ret); + return -ENXIO; + } + + ret = of_property_read_u32(dev->of_node, "ctrl_base", &sysfs_info->info.spi_logic_info.ctrl_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config ctrl_base error, ret:%d.\n", ret); + return -ENXIO; + } + sysfs_info->info.spi_logic_info.test_base = test_base; + sysfs_info->info.spi_logic_info.test_size = test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SYSFS) == 0) { + ret = of_property_read_string(dev->of_node, "sysfs_name", (const char **)&name); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config sysfs_name error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->info.dev_file_info.sysfs_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + ret = of_property_read_u32(dev->of_node, "dev_base", &sysfs_info->info.dev_file_info.dev_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("dts don't config dev_base, dev_base is 0.\n"); + sysfs_info->info.dev_file_info.dev_base = 0; + } + + ret = of_property_read_u32(dev->of_node, "per_len", &sysfs_info->info.dev_file_info.per_len); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("dts don't config per_len, per_len is 0.\n"); + sysfs_info->info.dev_file_info.per_len = 0; + } + sysfs_info->info.dev_file_info.test_base = test_base; + sysfs_info->info.dev_file_info.test_size = test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_MTD) == 0) { + ret = of_property_read_string(dev->of_node, "mtd_name", (const char **)&name); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config mtd_name error, ret:%d.\n", ret); + return -ENXIO; + } + strncpy(sysfs_info->info.mtd_info.mtd_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + ret = of_property_read_u32(dev->of_node, "flash_base", &sysfs_info->info.mtd_info.flash_base); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config flash_base error, ret:%d.\n", ret); + return -ENXIO; + } + sysfs_info->info.mtd_info.test_base = test_base; + sysfs_info->info.mtd_info.test_size = test_size; + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("dts config sysfs type[%s] is not support, ret:%d.\n", sysfs_info->type, ret); + return -ENXIO; + } + + sysfs_info->gpio_en_info_num = 0; + /* Enable through GPIO */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_gpio_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &sysfs_info->gpio_en_info[i].en_gpio); + if(ret != 0) { + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_level_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &sysfs_info->gpio_en_info[i].en_level); + if(ret != 0) { + break; + } + sysfs_info->gpio_en_info_num++; + } + + sysfs_info->logic_dev_en_num = 0; + /* Enable through register */ + for (i = 0; i < FIRMWARE_EN_INFO_MAX; i++) { + firmware_logic_dev_en_point = &sysfs_info->logic_dev_en_info[i]; + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dev_%d", i); + ret = 0; + ret += of_property_read_string(dev->of_node, buf, (const char **)&name); + if(ret != 0) { + /* Failure to resolve to EN_LOGIC_DEV means no logical device is enabled. No failure is returned */ + ret = 0; + break; + } + strncpy(firmware_logic_dev_en_point->dev_name, name, FIRMWARE_DEV_NAME_LEN - 1); + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_addr_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->addr); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_addr_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_mask_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->mask); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_mask_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_en_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->en_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_en_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_dis_val_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->dis_val); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_dis_val_%d ret =%d.\n", i, ret); + break; + } + + mem_clear(buf, sizeof(buf)); + snprintf(buf, sizeof(buf) - 1, "en_logic_width_%d", i); + ret = of_property_read_u32(dev->of_node, buf, &firmware_logic_dev_en_point->width); + if (ret != 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to config en en_logic_width_%d ret =%d.\n", i, ret); + break; + } + + sysfs_info->logic_dev_en_num++; + } + + return ret; +} + +static int firmware_upgrade_config_init(struct device *dev, firmware_sysfs_t *sysfs_info) +{ + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_point; + firmware_upgrade_device_t *firmware_upgrade_device; + firmware_sysfs_device_t sysfs_upg_device; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_dev_loc_config_init\r\n"); + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("info is null\r\n"); + return -1; + } + + if (dev->platform_data == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("platform data config error.\n"); + return -1; + } + firmware_upgrade_device = dev->platform_data; + sysfs_upg_device = firmware_upgrade_device->upg_type.sysfs; + + mem_clear(sysfs_info, sizeof(firmware_sysfs_t)); + strncpy(sysfs_info->type, firmware_upgrade_device->type, sizeof(sysfs_info->type) - 1); + sysfs_info->chain = firmware_upgrade_device->chain; + sysfs_info->chip_index = firmware_upgrade_device->chip_index; + + if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SPI_LOGIC) == 0) { + strncpy(sysfs_info->info.spi_logic_info.dev_name, sysfs_upg_device.dev_name, FIRMWARE_DEV_NAME_LEN - 1); + sysfs_info->info.spi_logic_info.flash_base = sysfs_upg_device.flash_base; + sysfs_info->info.spi_logic_info.ctrl_base = sysfs_upg_device.ctrl_base; + sysfs_info->info.spi_logic_info.test_base = sysfs_upg_device.test_base; + sysfs_info->info.spi_logic_info.test_size = sysfs_upg_device.test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_SYSFS) == 0) { + strncpy(sysfs_info->info.dev_file_info.sysfs_name, sysfs_upg_device.sysfs_name, FIRMWARE_DEV_NAME_LEN - 1); + sysfs_info->info.dev_file_info.dev_base = sysfs_upg_device.dev_base; + sysfs_info->info.dev_file_info.per_len = sysfs_upg_device.per_len; + sysfs_info->info.dev_file_info.test_base = sysfs_upg_device.test_base; + sysfs_info->info.dev_file_info.test_size = sysfs_upg_device.test_size; + } else if (strcmp(sysfs_info->type, FIRMWARE_SYSFS_TYPE_MTD) == 0) { + strncpy(sysfs_info->info.mtd_info.mtd_name, sysfs_upg_device.mtd_name, FIRMWARE_DEV_NAME_LEN - 1); + sysfs_info->info.mtd_info.flash_base = sysfs_upg_device.flash_base; + sysfs_info->info.mtd_info.test_base = sysfs_upg_device.test_base; + sysfs_info->info.mtd_info.test_size = sysfs_upg_device.test_size; + } else { + FIRMWARE_DRIVER_DEBUG_ERROR("config sysfs type[%s] is not support.\n", sysfs_info->type); + return -ENXIO; + } + + if (firmware_upgrade_device->en_gpio_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_gpio_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_gpio_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + sysfs_info->gpio_en_info_num = firmware_upgrade_device->en_gpio_num; + /* Enable through GPIO */ + for (i = 0; i < sysfs_info->gpio_en_info_num; i++) { + sysfs_info->gpio_en_info[i].en_gpio = firmware_upgrade_device->en_gpio[i]; + sysfs_info->gpio_en_info[i].en_level = firmware_upgrade_device->en_level[i]; + } + + if (firmware_upgrade_device->en_logic_num > FIRMWARE_EN_INFO_MAX) { + FIRMWARE_DRIVER_DEBUG_ERROR("The number of en_logic_num:%u configurations exceeds the maximum limit:%u.\n", + firmware_upgrade_device->en_logic_num, FIRMWARE_EN_INFO_MAX); + return -ENXIO; + } + sysfs_info->logic_dev_en_num = firmware_upgrade_device->en_logic_num; + /* Enable through register */ + for (i = 0; i < sysfs_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_point = &sysfs_info->logic_dev_en_info[i]; + strncpy(firmware_logic_dev_en_point->dev_name, firmware_upgrade_device->en_logic_dev[i], FIRMWARE_DEV_NAME_LEN - 1); + firmware_logic_dev_en_point->addr = firmware_upgrade_device->en_logic_addr[i]; + firmware_logic_dev_en_point->mask = firmware_upgrade_device->en_logic_mask[i]; + firmware_logic_dev_en_point->en_val = firmware_upgrade_device->en_logic_en_val[i]; + firmware_logic_dev_en_point->dis_val = firmware_upgrade_device->en_logic_dis_val[i]; + firmware_logic_dev_en_point->width = firmware_upgrade_device->en_logic_width[i]; + } + + return 0; +} + +static int firmware_sysfs_probe(struct platform_device *pdev) +{ + int ret; + firmware_sysfs_t *sysfs_info; + firmware_device_t *frm_dev; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Enter firmware_sysfs_probe\r\n"); + sysfs_info = devm_kzalloc(&pdev->dev, sizeof(firmware_sysfs_t), GFP_KERNEL); + if (sysfs_info == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc device tree.\n"); + return -EPERM; + } + + if (pdev->dev.of_node) { + ret = of_firmware_upgrade_config_init(&pdev->dev, sysfs_info); + } else { + ret = firmware_upgrade_config_init(&pdev->dev, sysfs_info); + } + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("get config init from dts error.\n"); + return -EPERM; + } + + frm_dev = devm_kzalloc(&pdev->dev, sizeof(firmware_device_t), GFP_KERNEL); + if (frm_dev == NULL) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to kzalloc firmware device.\n"); + return -EPERM; + } + + /* Based on the link number, determine the name of the device file */ + frm_dev->chain = sysfs_info->chain; + snprintf(frm_dev->name, FIRMWARE_NAME_LEN - 1, "firmware_sysfs%d", frm_dev->chain); + strncpy(sysfs_info->devname, frm_dev->name, strlen(frm_dev->name) + 1); + + INIT_LIST_HEAD(&frm_dev->list); + frm_dev->dev.minor = MISC_DYNAMIC_MINOR; + frm_dev->dev.name = frm_dev->name; + frm_dev->dev.fops = &sysfs_dev_fops; + frm_dev->priv = sysfs_info; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("Register sysfs firmware chain:%d, name:%s.\n", frm_dev->chain, frm_dev->name); + + ret = firmware_device_register(frm_dev); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Failed to register firmware device.\n"); + return -EPERM; + } + + platform_set_drvdata(pdev, frm_dev); + return 0; +} + +static int __exit firmware_sysfs_remove(struct platform_device *pdev) +{ + firmware_device_t *frm_dev; + + frm_dev = (firmware_device_t *)platform_get_drvdata(pdev); + firmware_device_unregister(frm_dev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct of_device_id sysfs_match[] = { + { + .compatible = "firmware_sysfs", + }, + {}, +}; + +static struct platform_driver sysfs_driver = { + .driver = { + .name = "firmware_sysfs", + .owner = THIS_MODULE, + .of_match_table = sysfs_match, + }, + .probe = firmware_sysfs_probe, + .remove = firmware_sysfs_remove, +}; + +static firmware_driver_t fmw_drv_sysfs = { + .name = "firmware_sysfs", + .drv = &sysfs_driver, +}; + +int firmware_sysfs_init(void) +{ + int ret; + + INIT_LIST_HEAD(&fmw_drv_sysfs.list); + FIRMWARE_DRIVER_DEBUG_VERBOSE("sysfs upgrade driver register \n"); + ret = firmware_driver_register(&fmw_drv_sysfs); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("sysfs upgrade driver register failed\n"); + return ret; + } + return 0; +} + +void firmware_sysfs_exit(void) +{ + firmware_driver_unregister(&fmw_drv_sysfs); + INIT_LIST_HEAD(&fmw_drv_sysfs.list); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c new file mode 100644 index 0000000000..8b883006de --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/firmware_sysfs_upgrade.c @@ -0,0 +1,258 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int firmware_file_read(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_read(filp, val, size, &pos); + if (ret != size) { + FIRMWARE_DRIVER_DEBUG_ERROR("read kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int firmware_file_write(const char *path, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FIRMWARE_DRIVER_DEBUG_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + pos = (loff_t)addr; + ret = kernel_write(filp, (void*)val, size, &pos); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("write kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, addr, size, ret); + goto exit; + } + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +/* + * firmware_file_do_work + * function: Sets logical register values + * @path:param[in] Logic device descriptor + * @addr:param[in] Logic device address + * @value:param[in] the register value needs to be set + * @mask:param[in] register mask + * @width:param[in] register bit width + * return: 0:success, <0:failed + */ +static int firmware_file_do_work(char *path, uint32_t addr, uint32_t value, uint32_t mask, + int32_t width) +{ + int ret; + uint8_t read_value[4], write_value[4]; + uint8_t tmp_read8, tmp_write8, tmp_mask8; + uint32_t tmp_read32, tmp_write32; + + FIRMWARE_DRIVER_DEBUG_VERBOSE("path=%s, addr=0x%x, value=0x%x mask=0x%x\r\n", path, addr, value, mask); + if ((width > 4) || (width < 0)) { + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + ret = 0; + mem_clear(read_value, sizeof(read_value)); + mem_clear(write_value, sizeof(write_value)); + ret = firmware_file_read(path, addr, read_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware sysfs read.\r\n"); + return -1; + } + + switch (width) { + case 1: + tmp_read8 = read_value[0]; + tmp_mask8 = (uint8_t)(mask) & 0xFF; + tmp_write8 = (uint8_t)value & 0xFF; + write_value[0] = (tmp_read8 & tmp_mask8) | tmp_write8; + FIRMWARE_DRIVER_DEBUG_VERBOSE("1 byte write val[0]:0x%x", write_value[0]); + break; + case 2: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + case 4: + memcpy((uint8_t *)&tmp_read32, read_value, 4); + tmp_write32 = (tmp_read32 & mask) | value; + memcpy(write_value, (uint8_t *)&tmp_write32, 4); + FIRMWARE_DRIVER_DEBUG_VERBOSE("4 byte write val[0]:0x%x, val[1]:0x%x, val[2]:0x%x, val[3]:0x%x", + write_value[0], write_value[1], write_value[2], write_value[3]); + break; + default: + FIRMWARE_DRIVER_DEBUG_ERROR("width %d is not support.\r\n", width); + return -1; + } + + FIRMWARE_DRIVER_DEBUG_VERBOSE("write logic dev[%s] addr[0x%x].\r\n", path, addr); + ret = firmware_file_write(path, addr, write_value, width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("firmware_file_write %s addr 0x%x failed, ret=%d.\r\n", path, addr, ret); + return -1; + } + + return 0; +} + +/* + * firmware_upgrade_en + * function:param[in] Upgrade access enabling switch + * @flag:param[in] !0:enable 0:disable + * return: 0:success, <0:failed + */ +static int firmware_upgrade_en(firmware_sysfs_t *sysfs_info, int flag) +{ + int i; + firmware_logic_dev_en_t *firmware_logic_dev_en_info; + int ret, rv; + char *dev_name; + + ret = 0; + FIRMWARE_DRIVER_DEBUG_VERBOSE("%s en switch: gpio en num %d, logic reg en num %d.\n", + flag ? "Open" : "Close", sysfs_info->gpio_en_info_num, sysfs_info->logic_dev_en_num); + for (i = 0; i < sysfs_info->gpio_en_info_num; i++) { + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware sysfs [%d] gpio[%d] en_level[%d]\n", + i, sysfs_info->gpio_en_info[i].en_gpio, sysfs_info->gpio_en_info[i].en_level); + if (flag) { + ret = gpio_request(sysfs_info->gpio_en_info[i].en_gpio, "sysfs_upgrade_gpio_en"); + if (ret) { + FIRMWARE_DRIVER_DEBUG_ERROR("Requesting cpld_ispvme_upgrade EN[%d] GPIO[%d] failed!\n", + i, sysfs_info->gpio_en_info[i].en_gpio); + goto free_gpio; + } + gpio_direction_output(sysfs_info->gpio_en_info[i].en_gpio, sysfs_info->gpio_en_info[i].en_level); + sysfs_info->gpio_en_info[i].flag = 1; + } else { + gpio_set_value(sysfs_info->gpio_en_info[i].en_gpio, !sysfs_info->gpio_en_info[i].en_level); + gpio_free(sysfs_info->gpio_en_info[i].en_gpio); + sysfs_info->gpio_en_info[i].flag = 0; + } + } + + for (i = 0; i < sysfs_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = &sysfs_info->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + FIRMWARE_DRIVER_DEBUG_VERBOSE("firmware sysfs [%d] dev_name[%s] addr[0x%x] mask[0x%x]" + " en_val[0x%x] dis_val[0x%x] width[%d]\n", + i , firmware_logic_dev_en_info->dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->mask, firmware_logic_dev_en_info->en_val, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->width); + if (flag) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->en_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Open logic register [%d] EN failed, ret %d.\n", i, ret); + goto free_logic_dev; + } else { + firmware_logic_dev_en_info->flag = 1; + } + } else { + rv = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (rv < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, rv); + ret = -1; + } + firmware_logic_dev_en_info->flag = 0; + } + } + + return ret; +free_logic_dev: + for (i = 0; i < sysfs_info->logic_dev_en_num; i++) { + firmware_logic_dev_en_info = &sysfs_info->logic_dev_en_info[i]; + dev_name = firmware_logic_dev_en_info->dev_name; + if (firmware_logic_dev_en_info->flag == 1) { + ret = firmware_file_do_work(dev_name, firmware_logic_dev_en_info->addr, + firmware_logic_dev_en_info->dis_val, firmware_logic_dev_en_info->mask, + firmware_logic_dev_en_info->width); + if (ret < 0) { + FIRMWARE_DRIVER_DEBUG_ERROR("Close logic register [%d] EN failed, ret %d.\n", i, ret); + } + firmware_logic_dev_en_info->flag = 0; + } else { + break; + } + } +free_gpio: + for (i = 0; i < sysfs_info->gpio_en_info_num; i++) { + if (sysfs_info->gpio_en_info[i].flag == 1) { + gpio_set_value(sysfs_info->gpio_en_info[i].en_gpio, !sysfs_info->gpio_en_info[i].en_level); + gpio_free(sysfs_info->gpio_en_info[i].en_gpio); + sysfs_info->gpio_en_info[i].flag = 0; + } else { + break; + } + } + + return -1; +} + +/* + * firmware_init_dev_loc + * function: init logic device, enable upgrade access + * return: 0:success, <0:failed + */ +int firmware_init_dev_loc(firmware_sysfs_t *sysfs_info) +{ + int ret; + + ret = firmware_upgrade_en(sysfs_info, 1); + return ret; +} + +/* + * firmware_finish_dev_loc + * function: finish logic device, disable upgrade access + * return: 0:success, <0:failed + */ +int firmware_finish_dev_loc(firmware_sysfs_t *sysfs_info){ + int ret; + ret = firmware_upgrade_en(sysfs_info, 0); + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h new file mode 100644 index 0000000000..9da2303c7c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs.h @@ -0,0 +1,88 @@ +#ifndef __FIRMWARE_SYSFS_H__ +#define __FIRMWARE_SYSFS_H__ + +#include +#include + +#include + +/* Debug switch level */ +typedef enum { + FIRWMARE_VERBOSE, + FIRWMARE_WARN, + FIRWMARE_ERROR, + FIRWMARE_END, +} firmware_debug_level_t; + +#define FIRMWARE_DRIVER_DEBUG_VERBOSE(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_VERBOSE)) { \ + printk(KERN_INFO "[FIRMWARW_DRIVER_SYSFS][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_DRIVER_DEBUG_ERROR(fmt, args...) do { \ + if ((g_firmware_driver_debug) & (1U << FIRWMARE_ERROR)) { \ + printk(KERN_ERR "[FIRMWARW_DRIVER_SYSFS][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FIRMWARE_NAME_LEN 48 + +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS 0 + +/* ioctl publi command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ + +/* firmware sysfs driver ioctl command, the same as "firmware_upgrade\include\firmware_app.h" */ +#define FIRMWARE_SYSFS_TYPE 'S' +#define FIRMWARE_SYSFS_INIT _IOR(FIRMWARE_SYSFS_TYPE, 0, char) /* enable upgrade access */ +#define FIRMWARE_SYSFS_FINISH _IOR(FIRMWARE_SYSFS_TYPE, 1, char) /* disable upgrade access */ +#define FIRMWARE_SYSFS_SPI_INFO _IOR(FIRMWARE_SYSFS_TYPE, 2, char) /* spi flash upgrade */ +#define FIRMWARE_SYSFS_DEV_FILE_INFO _IOR(FIRMWARE_SYSFS_TYPE, 3, char) /* sysfs upgrade */ +#define FIRMWARE_SYSFS_MTD_INFO _IOR(FIRMWARE_SYSFS_TYPE, 4, char) /* sysfs mtd upgrade */ + +#define FIRMWARE_SYSFS_TYPE_SPI_LOGIC "SPI_LOGIC" +#define FIRMWARE_SYSFS_TYPE_SYSFS "SYSFS" +#define FIRMWARE_SYSFS_TYPE_MTD "MTD_DEV" + +typedef struct cmd_info_s { + uint32_t size; + void __user *data; +} cmd_info_t; + +typedef struct firmware_device_s { + struct list_head list; /* device list */ + uint32_t chain; /* chain number */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct miscdevice dev; /* device */ + void *priv; /* private data */ +} firmware_device_t; + +typedef struct firmware_driver_s { + struct list_head list; /* list */ + char name[FIRMWARE_NAME_LEN]; /* name */ + struct platform_driver *drv; /* driver */ + void *priv; /* private data */ +} firmware_driver_t; + +extern int g_firmware_driver_debug; + +/* Get device information based on minor */ +extern firmware_device_t *firmware_get_device_by_minor(int minor); +/* Registere device */ +extern int firmware_device_register(firmware_device_t *fw_dev); +/* Unregister device */ +extern void firmware_device_unregister(firmware_device_t *fw_dev); +/* Registere driver */ +extern int firmware_driver_register(firmware_driver_t *fw_drv); +/* Unregister driver */ +extern void firmware_driver_unregister(firmware_driver_t *fw_drv); +/* SYSFS upgrade initialized */ +extern int firmware_sysfs_init(void); +/* SYSFS unload function */ +extern void firmware_sysfs_exit(void); + +#endif /* end of __FIRMWARE_SYSFS_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h new file mode 100644 index 0000000000..9c6b970274 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/firmware_driver_sysfs/include/firmware_sysfs_upgrade.h @@ -0,0 +1,72 @@ +#ifndef __FIRMWARE_SYSFS_UPGRADE_H__ +#define __FIRMWARE_SYSFS_UPGRADE_H__ + +#define FIRMWARE_DEV_NAME_LEN 64 /* the macro definition needs to same as app space define */ +#define FIRMWARE_TYPE_LEN 10 +#define FIRMWARE_EN_INFO_MAX 16 + +typedef struct firmware_spi_logic_info_s { + char dev_name[FIRMWARE_DEV_NAME_LEN]; /* Logical device name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t ctrl_base; /* SPI upgrade control register base address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_spi_logic_info_t; + +typedef struct firmware_dev_file_info_s { + char sysfs_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t dev_base; /* device upgrade base address */ + uint32_t per_len; /* The length of bytes per operation */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_dev_file_info_t; + +typedef struct firmware_mtd_info_s { + char mtd_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_mtd_info_t; + +typedef struct firmware_gpio_jtag_en_s { + uint32_t en_gpio; /* GPIO enable pin */ + uint32_t en_level; /* GPIO enable level */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_gpio_jtag_en_t; + +typedef struct firmware_logic_dev_en_s { + char dev_name[FIRMWARE_DEV_NAME_LEN]; /* Logical device name */ + uint32_t addr; /* Enable register address */ + uint32_t mask; /* mask */ + uint32_t en_val; /* Enable value */ + uint32_t dis_val; /* Disable value*/ + uint32_t width; /* width */ + int flag; /* init flag; 1-init 0-not init */ +} firmware_logic_dev_en_t; + +typedef struct firmware_sysfs_s { + char devname[FIRMWARE_DEV_NAME_LEN]; /* Device name */ + char type[FIRMWARE_TYPE_LEN]; /* interface type */ + uint32_t chain; /* chain num */ + uint32_t chip_index; /* chip index */ + union { + firmware_spi_logic_info_t spi_logic_info; /* SPI logic Information */ + firmware_dev_file_info_t dev_file_info; /* device file Information */ + firmware_mtd_info_t mtd_info; /* mtd device Information */ + } info; + uint32_t gpio_en_info_num; /* GPIO Enable Number */ + firmware_gpio_jtag_en_t gpio_en_info[FIRMWARE_EN_INFO_MAX]; /* GPIO Enable Information */ + uint32_t logic_dev_en_num; /* Register Enable Number */ + firmware_logic_dev_en_t logic_dev_en_info[FIRMWARE_EN_INFO_MAX]; /* Register Enable Information */ +} firmware_sysfs_t; + +typedef struct firmware_sysfs_function_s{ + int (*init_dev)(void); /* upgrade initializes the operation */ + int (*finish_dev)(void); /* upgrade completes the operation */ +}firmware_sysfs_function_t; + +extern void firmware_set_sysfs_info(firmware_sysfs_t *sysfs_info); +extern int firmware_init_dev_loc(firmware_sysfs_t *sysfs_info); +extern int firmware_finish_dev_loc(firmware_sysfs_t *sysfs_info); + +#endif /* __FIRMWARE_SYSFS_UPGRADE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h new file mode 100644 index 0000000000..600c69646b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_driver/include/firmware_upgrade.h @@ -0,0 +1,57 @@ +#ifndef __FIRMWARE_UPGRADE_H__ +#define __FIRMWARE_UPGRADE_H__ + +#include + +#define TYPE_LEN (10) +#define DEV_NAME_LEN (64) +#define ENABLE_NUM (16) + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef struct firmware_jtag_device_s { + uint32_t tdi; + uint32_t tck; + uint32_t tms; + uint32_t tdo; + uint32_t tck_delay; +} firmware_jtag_device_t; + +typedef struct firmware_sysfs_device_s { + uint32_t test_base; + uint32_t test_size; + char dev_name[DEV_NAME_LEN]; + uint32_t flash_base; + uint32_t ctrl_base; + char sysfs_name[DEV_NAME_LEN]; + uint32_t dev_base; + uint32_t per_len; + char mtd_name[DEV_NAME_LEN]; +} firmware_sysfs_device_t; + +typedef struct firmware_upgrade_device_s { + char type[TYPE_LEN]; + uint32_t chain; + uint32_t chip_index; + + uint32_t en_gpio_num; /* the number of en_gpio */ + uint32_t en_gpio[ENABLE_NUM]; + uint32_t en_level[ENABLE_NUM]; + + uint32_t en_logic_num; /* the number of en_logic */ + char en_logic_dev[ENABLE_NUM][DEV_NAME_LEN]; + uint32_t en_logic_addr[ENABLE_NUM]; + uint32_t en_logic_mask[ENABLE_NUM]; + uint32_t en_logic_en_val[ENABLE_NUM]; + uint32_t en_logic_dis_val[ENABLE_NUM]; + uint32_t en_logic_width[ENABLE_NUM]; + + int device_flag; + union { + firmware_jtag_device_t jtag; + firmware_sysfs_device_t sysfs; + } upg_type; + +} firmware_upgrade_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile new file mode 100644 index 0000000000..176d44d2ab --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/Makefile @@ -0,0 +1,33 @@ +include $(top_srcdir)/Rules.mk + +#OBJ = firmware_app.o debug.o hardware.o ispvm_ui.o ivm_core.o crc32.o +PWD = $(shell pwd) +SRC := +SRC += $(shell find $(PWD) -name '*.c') + +OBJ := $(SRC:%.c=%.o) +LIB += $(BUILD_CFALGS) $(BUILD_LDFLAGS) -lpthread -lreadline -lncurses +INCLUDE = -Iinclude +INCLUDE+= -Wall +APP = firmware_upgrade +ELF_FILE = $(APP) +MAP_FILE = $(APP).map.sym + +.PHONY: build +build:$(OBJ) + $(CC) $^ -o $(ELF_FILE) $(LINKFLAGS) $(LIB) + $(NM) $(ELF_FILE) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' \ + | sort > $(MAP_FILE) + cp -p $(ELF_FILE) $(common_out_put_dir) + +%.o:%.c + $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ + +.PHONY: install +install: + echo "firmware_upgrade install success." + cp -p $(ELF_FILE) $(common_out_put_dir) + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c new file mode 100644 index 0000000000..5b60b40ad1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/crc32.c @@ -0,0 +1,216 @@ +/* + * This file is derived from crc32.c from the zlib-1.1.3 distribution + * by Jean-loup Gailly and Mark Adler. + */ + +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-1998 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ +/* xxxx: by chihl for compile error */ +#if 1 + +#ifndef FAR +#define FAR +#endif + +typedef unsigned char Byte; /* 8 bits */ +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +typedef Byte FAR Bytef; +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifndef OF /* function prototypes */ +#ifdef STDC +#define OF(args) args +#else +#define OF(args) () +#endif +#endif + +#endif + +#define local static +#define ZEXPORT /* empty */ +unsigned long crc32 (unsigned long, const unsigned char *, unsigned int); + +#define DYNAMIC_CRC_TABLE + +#ifdef DYNAMIC_CRC_TABLE + +local int crc_table_empty = 1; +local uLongf crc_table[256]; +local void make_crc_table OF((void)); + +/* + Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all + the information needed to generate CRC's on data a byte at a time for all + combinations of CRC register values and incoming bytes. +*/ +local void make_crc_table() +{ + uLong c; + int n, k; + uLong poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* make exclusive-or pattern from polynomial (0xedb88320L) */ + poly = 0L; + for (n = 0; n < sizeof(p)/sizeof(Byte); n++) + poly |= 1L << (31 - p[n]); + + for (n = 0; n < 256; n++) + { + c = (uLong)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[n] = c; + } + crc_table_empty = 0; +} +#else +/* ======================================================================== + * Table of CRC-32's of all single-byte values (made by make_crc_table) + */ +local const uLongf crc_table[256] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, + 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, + 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, + 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, + 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, + 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, + 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, + 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, + 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, + 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, + 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, + 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, + 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, + 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, + 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, + 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, + 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, + 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, + 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, + 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, + 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, + 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, + 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, + 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, + 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, + 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, + 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, + 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, + 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, + 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, + 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, + 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, + 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, + 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, + 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, + 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, + 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, + 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, + 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, + 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, + 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, + 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, + 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, + 0x2d02ef8dL +}; +#endif + +#if 0 +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const uLongf * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) make_crc_table(); +#endif + return (const uLongf *)crc_table; +} +#endif + +/* ========================================================================= */ +#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); +#define DO2(buf) DO1(buf); DO1(buf); +#define DO4(buf) DO2(buf); DO2(buf); +#define DO8(buf) DO4(buf); DO4(buf); + +/* ========================================================================= */ +uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len) +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif + crc = crc ^ 0xffffffffL; + while (len >= 8) + { + DO8(buf); + len -= 8; + } + if (len) do { + DO1(buf); + } while (--len); + return crc ^ 0xffffffffL; +} + +#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) + +/* No ones complement version. JFFS2 (and other things ?) + * don't use ones compliment in their CRC calculations. + */ +uLong ZEXPORT crc32_no_comp(uLong crc, const Bytef *buf, uInt len) +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif + while (len >= 8) + { + DO8(buf); + len -= 8; + } + if (len) do { + DO1(buf); + } while (--len); + + return crc; +} + +#endif /* CFG_CMD_JFFS2 */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c new file mode 100644 index 0000000000..dc1b1ccfc7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/debug.c @@ -0,0 +1,60 @@ +/* + * debug.c + * firmware upgrade debug switch control + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int is_debug_on = DEBUG_IGNORE; + +/* + * firmware_upgrade_debug + * function: Debug switch + * Parses the file "/var/tmp/.firmware_upgrade_debug" and returns the corresponding debug level + * return:off--DEBUG_OFF, app debug on---DEBUG_APP_ON, kernel debug on--DEBUG_KERN_ON, + * all debug on--DEBUG_ALL_ON, other--DEBUG_IGNORE + */ +int firmware_upgrade_debug(void) +{ + int size; + FILE *fp; + char debug_info[DEBUG_INFO_LEN]; + + fp = fopen(DEBUG_FILE, "r"); + if (fp == NULL) { + return DEBUG_IGNORE; + } + + mem_clear(debug_info, DEBUG_INFO_LEN); + size = fread(debug_info, DEBUG_INFO_LEN - 1, 1, fp); + if (size < 0) { + fclose(fp); + return DEBUG_IGNORE; + } + + if (strncmp(debug_info, DEBUG_ON_INFO, 1) == 0) { + fclose(fp); + return DEBUG_APP_ON; + } + + if (strncmp(debug_info, DEBUG_ON_ALL, 1) == 0) { + fclose(fp); + return DEBUG_ALL_ON; + } + + if (strncmp(debug_info, DEBUG_OFF_INFO, 1) == 0) { + fclose(fp); + return DEBUG_OFF; + } + + fclose(fp); + return DEBUG_IGNORE; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c new file mode 100644 index 0000000000..ecdc37ef35 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/firmware_app.c @@ -0,0 +1,985 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int header_offset; + +static firmware_file_name_t firmware_file_str[] = { + {"VME", FIRMWARE_VME}, + {"ISC", FIRMWARE_ISC}, + {"JBI", FIRMWARE_JBI}, + {"SPI-LOGIC-DEV", FIRMWARE_SPI_LOGIC_DEV}, + {"SYSFS", FIRMWARE_SYSFS_DEV}, + {"MTD", FIRMWARE_MTD}, +}; + +/** + * firmware_error_type + * function:set error code + * @action: param[in] The stage where the error occurs + * @info: param[in] Upgrade file information + * return value: error code + */ +int firmware_error_type(int action, name_info_t *info) +{ + if (info == NULL) { + return ERR_FW_UPGRADE; + } + + if((info->type <= FIRMWARE_UNDEF_TYPE) || (info->type > FIRMWARE_OTHER)) { + return ERR_FW_UPGRADE; + } + + if (info->type == FIRMWARE_CPLD) { + switch (action) { + case FIRMWARE_ACTION_CHECK: + return ERR_FW_CHECK_CPLD_UPGRADE; + case FIRMWARE_ACTION_MATCH: + return ERR_FW_MATCH_CPLD_UPGRADE; + case FIRMWARE_ACTION_VERCHECK: + return ERR_FW_SAMEVER_CPLD_UPGRADE; + case FIRMWARE_ACTION_UPGRADE: + return ERR_FW_DO_CPLD_UPGRADE; + case FIRMWARE_ACTION_SUPPORT: + return ERR_FW_DO_UPGRADE_NOT_SUPPORT; + default: + return ERR_FW_UPGRADE; + } + } else if (info->type == FIRMWARE_FPGA) { + switch (action) { + case FIRMWARE_ACTION_CHECK: + return ERR_FW_CHECK_FPGA_UPGRADE; + case FIRMWARE_ACTION_MATCH: + return ERR_FW_MATCH_FPGA_UPGRADE; + case FIRMWARE_ACTION_VERCHECK: + return ERR_FW_SAMEVER_FPGA_UPGRADE; + case FIRMWARE_ACTION_UPGRADE: + return ERR_FW_DO_FPGA_UPGRADE; + case FIRMWARE_ACTION_SUPPORT: + return ERR_FW_DO_UPGRADE_NOT_SUPPORT; + default: + return ERR_FW_UPGRADE; + } + } else { + switch (action) { + case FIRMWARE_ACTION_CHECK: + return ERR_FW_CHECK_UPGRADE; + case FIRMWARE_ACTION_MATCH: + return ERR_FW_MATCH_UPGRADE; + case FIRMWARE_ACTION_VERCHECK: + return ERR_FW_SAMEVER_UPGRADE; + case FIRMWARE_ACTION_UPGRADE: + return ERR_FW_DO_UPGRADE; + case FIRMWARE_ACTION_SUPPORT: + return ERR_FW_DO_UPGRADE_NOT_SUPPORT; + default: + return ERR_FW_UPGRADE; + } + } + +} + +/* + * firmware_check_file_info + * function:Check the file information to determine that the file is available for use on the device + * @info: param[in] Upgrade file information + * @main_type : param[in] main type + * @sub_type : param[in] sub type + * @slot : param[in] 0--main, sub slot starts at 1 + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_check_file_info(name_info_t *info, int main_type, int sub_type, int slot) +{ + int i; + + dbg_print(is_debug_on, "Check file info.\n"); + /* Check the mainboard type */ + for (i = 0; i < MAX_DEV_NUM; i++) { + if (main_type == info->card_type[i]) { + dbg_print(is_debug_on, "main type is 0x%x \n", main_type); + break; + } + } + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: The main type[0x%x] is not matched \n", main_type); + return firmware_error_type(FIRMWARE_ACTION_MATCH, info); + } + + /* Check the sub board type, if firwmare upgrade sub board, then sub_type must be 0 */ + for (i = 0; i < MAX_DEV_NUM; i++) { + if (sub_type == info->sub_type[i]) { + dbg_print(is_debug_on, "sub type is 0x%x \n", sub_type); + break; + } + } + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: The sub type[0x%x] is not matched \n", sub_type); + return firmware_error_type(FIRMWARE_ACTION_MATCH, info); + } + + /* if firwmare upgrade main board, then sub_type must be 0 and slot must be 0 + * if firwmare upgrade sub board, then sub_type must not be 0 and slot must not be 0 */ + if (((sub_type != 0) && (slot < 1)) || ((sub_type == 0) && (slot != 0))) { + dbg_print(is_debug_on, "Error: The sub type[0x%x] is not match slot %d error.\n", sub_type, slot); + return firmware_error_type(FIRMWARE_ACTION_MATCH, info); + } + + dbg_print(is_debug_on, "Success check file info.\n"); + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_get_dev_file_name + * function:Gets the name of the device file + * @info: param[in] Upgrade file information + * @len: param[in] Device file name length + * @file_name: param[out] Device file name + */ +static int firmware_get_dev_file_name(name_info_t *info, char *file_name, int len) +{ + int ret; + + ret = FIRMWARE_SUCCESS; + switch(info->file_type) { + case FIRMWARE_VME: + snprintf(file_name, len, "/dev/firmware_cpld_ispvme%d", info->chain); + break; + case FIRMWARE_ISC: + case FIRMWARE_JBI: + snprintf(file_name, len, "/dev/firmware_cpld%d", info->chain); + break; + case FIRMWARE_SPI_LOGIC_DEV: + case FIRMWARE_SYSFS_DEV: + case FIRMWARE_MTD: + snprintf(file_name, len, "/dev/firmware_sysfs%d", info->chain); + break; + default: + ret = FIRMWARE_FAILED; + break; + } + + return ret; + } + +/** + * firmware_check_chip_verison + * function: Check chip version + * @fd: param[in] Device file descriptor + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +int firmware_check_chip_verison(int fd, name_info_t *info) +{ + int ret; + cmd_info_t cmd_info; + char version[FIRMWARE_NAME_LEN + 1]; + + dbg_print(is_debug_on, "Check chip version.\n"); + mem_clear(version, FIRMWARE_NAME_LEN); + cmd_info.size = FIRMWARE_NAME_LEN; + cmd_info.data = (void *) version; + + /* Ignore version checking */ + if (strncmp("v", info->version, 1) == 0) { + dbg_print(is_debug_on, "Skip check chip version.\n"); + return FIRMWARE_SUCCESS; + } + + /* Get the program version from the device file */ + ret = ioctl(fd, FIRMWARE_GET_VERSION, &cmd_info); + if (ret < 0) { + dbg_print(is_debug_on, "Error: Failed to get version(chain %d, version %s).\n", + info->chain, info->version); + return firmware_error_type(FIRMWARE_ACTION_CHECK, NULL); + } + dbg_print(is_debug_on, "Chip verion: %s, file chip verion: %s.\n", version, info->version); + + /* The device version is the same and does not upgrade */ + if (strcmp(version, info->version) == 0) { + dbg_print(is_debug_on, "the file program version is same as the firmware version %s \n", + info->version); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + dbg_print(is_debug_on, "Check version pass.\n"); + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_get_file_size + * function: Gets the upgrade file size + * @file_name: param[in] Upgrade file name + * @size: param[out] Upgrade file size + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_get_file_size(char *file_name, uint32_t *size) +{ + int ret; + struct stat buf; + + ret = stat(file_name, &buf); + if (ret < 0) { + return FIRMWARE_FAILED; + } + + if (buf.st_size < 0 || buf.st_size - header_offset < 0) { + return FIRMWARE_FAILED; + } + /* Remove the upgrade file header information to actually upgrade the content size */ + *size = buf.st_size - header_offset; + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_get_file_info + * function: Gets the contents of the upgrade file + * @file_name: param[in] Upgrade file name + * @size: param[in] Upgrade file size + * @buf: param[out] Upgrade the file content + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_get_file_info(char *file_name, uint8_t *buf, uint32_t size) +{ + FILE *fp; + int len; + int ret; + + fp = fopen(file_name, "r"); + if (fp == NULL) { + return FIRMWARE_FAILED; + } + /* Removes the contents of the upgrade file header information */ + ret = fseek(fp, header_offset, SEEK_SET); + if (ret < 0) { + fclose(fp); + return FIRMWARE_FAILED; + } + + len = fread(buf, size, 1, fp); + if (len < 0) { + fclose(fp); + return FIRMWARE_FAILED; + } + fclose(fp); + + return FIRMWARE_SUCCESS; +} + +/* +* firmware_upgrade +* function: firmware upgrade +* @file_name: param[in] Upgrade file name +* @info: param[in] Upgrade file information +* return value : success--FIRMWARE_SUCCESS, other fail return error code +*/ +static int firmware_upgrade(char *file_name, name_info_t *info) +{ + int ret; + int fd; + uint32_t upg_size; + uint8_t *upg_buf; + char dev_file_name[FIRMWARE_NAME_LEN]; + unsigned long crc; + + dbg_print(is_debug_on, "Upgrade firmware: %s.\n", file_name); + mem_clear(dev_file_name, FIRMWARE_NAME_LEN); + ret = firmware_get_dev_file_name(info, dev_file_name, FIRMWARE_NAME_LEN - 1); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get dev file name.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + fd = open(dev_file_name, O_RDWR); + if (fd < 0) { + dbg_print(is_debug_on, "Error: Failed to open %s.\n", dev_file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + +#if 0 + /* check chip name */ + ret = firmware_check_chip_name(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip name: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } +#endif + + /* Check chip version */ + ret = firmware_check_chip_verison(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip version: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the upgrade file size */ + ret = firmware_get_file_size(file_name, &upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get file size: %s.\n", file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + if (upg_size == 0) { + dbg_print(is_debug_on, "Error: The upgrade file is empty \n"); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + upg_buf = (uint8_t *) malloc(upg_size + 1); + if (upg_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for upgrade file info: %s.\n", + dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the contents of the upgrade file */ + mem_clear(upg_buf, upg_size + 1); + ret = firmware_get_file_info(file_name, upg_buf, upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to read file info: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* file crc32 check */ + crc = crc32(0, (const unsigned char *)upg_buf, (unsigned int)upg_size); + if (crc != info->crc32) { + dbg_print(is_debug_on, "Error: Failed to check file crc: %s.\n", file_name); + dbg_print(is_debug_on, "the crc value is : %#08x.\n", (unsigned int)crc); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + dbg_print(is_debug_on, "Start upgrading firmware, wait...\n"); + + /* Start firmware upgrade */ + switch (info->file_type) { + case FIRMWARE_VME: + dbg_print(is_debug_on, "start to ispvme upgrade: %s.\n", file_name); + ret = firmware_upgrade_ispvme(fd, file_name, info); + break; + case FIRMWARE_ISC: + case FIRMWARE_JBI: + dbg_print(is_debug_on, "start to upgrade: %s.\n", file_name); + ret = firmware_upgrade_jtag(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_SPI_LOGIC_DEV: + dbg_print(is_debug_on, "start to spi logic dev upgrade: %s.\n", file_name); + ret = firmware_upgrade_spi_logic_dev(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_SYSFS_DEV: + dbg_print(is_debug_on, "start to sysfs upgrade: %s.\n", file_name); + ret = firmware_upgrade_sysfs(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_MTD: + dbg_print(is_debug_on, "start to mtd device upgrade: %s.\n", file_name); + ret = firmware_upgrade_mtd(fd, upg_buf, upg_size, info); + break; + default: + dbg_print(is_debug_on, "Error: file type is not support: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + + dbg_print(is_debug_on, "Completed.\n"); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to upgrade: %s.\n", dev_file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + + free(upg_buf); + close(fd); + + return FIRMWARE_SUCCESS; +} + +/* +* firmware_upgrade_test +* function: firmware upgrade test +* @file_name: param[in] Upgrade file name +* @info: param[in] Upgrade file information +* return value : success--FIRMWARE_SUCCESS, other fail return error code +*/ +static int firmware_upgrade_test(char *file_name, name_info_t *info) +{ + int ret; + int fd; + uint32_t upg_size; + uint8_t *upg_buf; + char dev_file_name[FIRMWARE_NAME_LEN]; + unsigned long crc; + + dbg_print(is_debug_on, "Upgrade firmware test: %s.\n", file_name); + mem_clear(dev_file_name, FIRMWARE_NAME_LEN); + ret = firmware_get_dev_file_name(info, dev_file_name, FIRMWARE_NAME_LEN - 1); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get dev file name.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + fd = open(dev_file_name, O_RDWR); + if (fd < 0) { + dbg_print(is_debug_on, "Error: Failed to open %s.\n", dev_file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + +#if 0 + /* check chip name */ + ret = firmware_check_chip_name(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip name: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } +#endif + + /* Check chip version */ + ret = firmware_check_chip_verison(fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip version: %s.\n", dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the upgrade file size */ + ret = firmware_get_file_size(file_name, &upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to get file size: %s.\n", file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + upg_buf = (uint8_t *) malloc(upg_size + 1); + if (upg_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for upgrade file info: %s.\n", + dev_file_name); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* Gets the contents of the upgrade file */ + mem_clear(upg_buf, upg_size + 1); + ret = firmware_get_file_info(file_name, upg_buf, upg_size); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to read file info: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + /* file crc32 check */ + crc = crc32(0, (const unsigned char *)upg_buf, (unsigned int)upg_size); + if (crc != info->crc32) { + dbg_print(is_debug_on, "Error: Failed to check file crc: %s.\n", file_name); + dbg_print(is_debug_on, "the crc value is : %#08x.\n", (unsigned int)crc); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + dbg_print(is_debug_on, "Start upgrading firmware test, wait...\n"); + + /* Start firmware upgrade */ + switch (info->file_type) { + case FIRMWARE_VME: + dbg_print(is_debug_on, "start to ispvme upgrade test: %s.\n", file_name); + /* WME upgrade link testing is the same as upgrading, using vme test file. */ + ret = firmware_upgrade_ispvme(fd, file_name, info); + break; + case FIRMWARE_ISC: + case FIRMWARE_JBI: + dbg_print(is_debug_on, "start to upgrade test: %s.\n", file_name); + ret = firmware_upgrade_jtag_test(fd, upg_buf, upg_size, info); + break; + case FIRMWARE_SPI_LOGIC_DEV: + dbg_print(is_debug_on, "start to spi logic dev upgrade test: %s.\n", file_name); + ret = firmware_upgrade_spi_logic_dev_test(fd,info); + break; + case FIRMWARE_SYSFS_DEV: + dbg_print(is_debug_on, "start to sysfs upgrade test: %s.\n", file_name); + ret = firmware_upgrade_sysfs_test(fd, info); + break; + case FIRMWARE_MTD: + dbg_print(is_debug_on, "start to mtd device upgrade test: %s.\n", file_name); + ret = firmware_upgrade_mtd_test(fd, info); + break; + default: + dbg_print(is_debug_on, "Error: test file type is not support: %s.\n", file_name); + free(upg_buf); + close(fd); + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to upgrade test: %s ret=%d.\n", dev_file_name, ret); + free(upg_buf); + close(fd); + if (ret == FIRMWARE_NOT_SUPPORT) { + return firmware_error_type(FIRMWARE_ACTION_SUPPORT, info); + } else { + return firmware_error_type(FIRMWARE_ACTION_UPGRADE, info); + } + } + + free(upg_buf); + close(fd); + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_file_type_map + * function:Gets the corresponding upgrade file type from the upgrade file type list + * @value : param[in] file type name + * return value : file type, firmware_file_type_t + */ +static firmware_file_type_t firmware_upgrade_file_type_map(char *type_str) +{ + int type_num; + int i; + + type_num = (sizeof(firmware_file_str) /sizeof(firmware_file_str[0])); + for (i = 0; i < type_num; i++) { + if (!strncmp(firmware_file_str[i].firmware_file_name_str, type_str, + strlen(firmware_file_str[i].firmware_file_name_str))) { + return firmware_file_str[i].firmware_file_type; + } + } + + dbg_print(is_debug_on, "firmware file type unknown\n"); + return FIRMWARE_NONE; +} + +/* + * firmware_upgrade_parse_kv + * function:Parses the header information of the upgrade file based on the key and value + * @key: param[in] key + * @value : param[in] value + * @info : param[out] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_parse_kv(const char *key, const char *value, name_info_t *info) +{ + int i; + if (key == NULL || value == NULL) { + dbg_print(is_debug_on, "Error: failed to get ther key or value.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } else if (strcmp(key, FILEHEADER_DEVTYPE) == 0) { + /* main board type */ + for (i = 0; i < MAX_DEV_NUM && info->card_type[i]; i++); + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: card type is full for %s. \n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + info->card_type[i] = strtoul(value, NULL, 0); + } else if (strcmp(key, FILEHEADER_SUBTYPE) == 0) { + /* sub board type */ + for (i = 0; i < MAX_DEV_NUM && info->sub_type[i]; i++); + if (i == MAX_DEV_NUM) { + dbg_print(is_debug_on, "Error: sub type is full for %s. \n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + info->sub_type[i] = strtoul(value, NULL, 0); + } else if (strcmp(key, FILEHEADER_TYPE) == 0) { + /* Device type */ + if (strcmp(value, FIRMWARE_CPLD_NAME) == 0) { + info->type = FIRMWARE_CPLD; + } else if (strcmp(value, FIRMWARE_FPGA_NAME) == 0) { + info->type = FIRMWARE_FPGA; + } else { + info->type = FIRMWARE_OTHER; + } + } else if (strcmp(key, FILEHEADER_CHAIN) == 0) { + /* link num */ + info->chain = strtoul(value, NULL, 10); + } else if (strcmp(key, FILEHEADER_CHIPNAME) == 0) { + /* chip name */ + if (strlen(value) >= FIRMWARE_NAME_LEN) { + dbg_print(is_debug_on, "Error: '%s' is too long for a chipname.\n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + mem_clear(info->chip_name, sizeof(info->chip_name)); + snprintf(info->chip_name, sizeof(info->chip_name) - 1, "%s", value); + } else if (strcmp(key, FILEHEADER_VERSION) == 0) { + /* version */ + if (strlen(value) >= FIRMWARE_NAME_LEN) { + dbg_print(is_debug_on, "Error: '%s' is too long for a version.\n", value); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + mem_clear(info->version, sizeof(info->version)); + snprintf(info->version, sizeof(info->version) - 1, "%s", value); + } else if (strcmp(key, FILEHEADER_FILETYPE) == 0) { + /* file type */ + info->file_type = firmware_upgrade_file_type_map((char *)value); + } else if (strcmp(key, FILEHEADER_CRC) == 0) { + /* file crc32 */ + info->crc32 = strtoul(value, NULL, 0); + } else { + dbg_print(is_debug_on, "Warning: key '%s' is unknown. Continue anyway.\n", key); + return FIRMWARE_SUCCESS; + } + dbg_print(is_debug_on, "key %s is matched.\n", key); + return FIRMWARE_SUCCESS; + } + +/* + * firmware_upgrade_parse_check + * function:Check the results of header parsing + * @file_name: Upgrade file name + * @info : Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_parse_check(char *file_name, name_info_t *info) +{ + int i; + if (info->card_type[0] == 0) { + dbg_print(is_debug_on, "Error: %s card type is missing.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if ((info->type <= FIRMWARE_UNDEF_TYPE) || (info->type > FIRMWARE_OTHER)) { + dbg_print(is_debug_on, "Error: %s type is unknown.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if (strlen(info->chip_name) == 0) { + dbg_print(is_debug_on, "Error: %s chip_name is empty.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if (strlen(info->version) == 0) { + dbg_print(is_debug_on, "Error: %s version is empty.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if ((info->file_type <= FIRMWARE_UNDEF_FILE_TYPE) || (info->file_type > FIRMWARE_NONE)) { + dbg_print(is_debug_on, "Error: %s file type is unknown.\n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + dbg_print(is_debug_on, "The file header parse:(%s) \n" , file_name); + dbg_print(is_debug_on, " card type: "); + for (i = 0; i < MAX_DEV_NUM && info->card_type[i]; i++){ + dbg_print(is_debug_on, "0x%x, ", info->card_type[i]); + } + dbg_print(is_debug_on, "\n" + " sub type : "); + for (i = 0; i < MAX_DEV_NUM && info->sub_type[i]; i++){ + dbg_print(is_debug_on, "0x%x, ", info->sub_type[i]); + } + dbg_print(is_debug_on, "\n" + " type : %d, \n" + " chain : %d, \n" + " chip name: %s \n" + " version : %s \n" + " file type: %d \n" + " the crc32 value: %#x \n", + info->type, info->chain, info->chip_name, info->version, info->file_type, info->crc32); + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_read_header + * function:Read the header information of the upgrade file + * @file_name: param[in] Upgrade file name + * @info : param[out] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_read_header( char *file_name, name_info_t *info) +{ + FILE *fp; + char *charp; + char *charn; + char header_buffer[MAX_HEADER_SIZE]; + char header_key[MAX_HEADER_KV_SIZE]; + char header_var[MAX_HEADER_KV_SIZE]; + int ret; + int len; + + fp = fopen(file_name, "r"); + if (fp == NULL) { + dbg_print(is_debug_on, "Error: Failed to open file: %s. \n", file_name); + perror("fopen"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + mem_clear(header_buffer, sizeof(header_buffer)); + len = fread(header_buffer, MAX_HEADER_SIZE - 1, 1, fp); + fclose(fp); + if (len < 0) { + dbg_print(is_debug_on, "Error: Failed to read header : %s. \n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + header_buffer[MAX_HEADER_SIZE - 1] = 0; + + charp = strstr(header_buffer, "FILEHEADER(\n"); + if (charp == NULL) { + dbg_print(is_debug_on, "Error: The file format %s is wrong. \n", file_name); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + charp += strlen("FILEHEADER(\n"); + + dbg_print(is_debug_on, "File parse start.\n"); + mem_clear(info, sizeof(name_info_t)); + ret = 0; + charn = charp; + mem_clear(header_key, sizeof(header_key)); + while (*charn != ')') { + charn = strpbrk(charp, "=,)\n"); + if (charn == NULL) { + dbg_print(is_debug_on, "Error: The parser can't find mark.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + if (charn - charp >= MAX_HEADER_KV_SIZE) { + dbg_print(is_debug_on, "Error: The parser find a overflow mark.\n"); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + switch (*charn) { + case '=': + mem_clear(header_key, sizeof(header_key)); + memcpy(header_key, charp, charn - charp); + break; + case '\n': + case ',': + mem_clear(header_var, sizeof(header_var)); + memcpy(header_var, charp, charn - charp); + dbg_print(is_debug_on, "Parser: %s = %s .\n", header_key, header_var); + firmware_upgrade_parse_kv(header_key, header_var, info); + break; + case ')': + break; + default: + dbg_print(is_debug_on, "Error: The parser get unexpected mark '%c(0x%02X)'.\n", *charn, *charn); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + charp = (charn + 1); + } + + ret = firmware_upgrade_parse_check(file_name, info); + if (ret != FIRMWARE_SUCCESS) { + return FIRMWARE_FAILED; + } + + header_offset = charp + 1 - header_buffer; /* charp at '\n' */ + dbg_print(is_debug_on,"the header offset is %d \n", header_offset); + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_one_file + * function: upgrade file + * @file_name: Upgrade file name + * @main_type: main board type + * @sub_type: sub board type + * @slot: 0--main, sub slot starts at 1 + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_one_file(char *file_name, int main_type, int sub_type, int slot) +{ + int ret; + name_info_t info; + + if ((slot < 0) || (file_name == NULL)) { + dbg_print(is_debug_on, "Failed firmware_upgrade_one_file parameter err.\n"); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "firmware upgrade %s 0x%x 0x%x %d\n", file_name, main_type, sub_type, slot); + /* Read the header information of the upgrade file */ + ret = firmware_upgrade_read_header(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to get file header: %s\n", file_name); + return ret; + } + + /* Check the file information to determine that the file is available for use on the device */ + ret = firmware_check_file_info(&info, main_type, sub_type, slot); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "File is not match with the device: %s.\n", file_name); + return ret; + } + + /* The link number corresponding to the upgrade file is calculated based on the slot number. + 16 links are reserved for each slot. main boade slot is 0. */ + info.chain += slot * FIRMWARE_SLOT_MAX_NUM; + ret = firmware_upgrade(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to upgrade: %s.\n", file_name); + return ret; + } + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_file_test + * function: upgrade file + * @file_name: Upgrade file name + * @main_type: main board type + * @sub_type: sub board type + * @slot: 0--main, sub slot starts at 1 + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +static int firmware_upgrade_file_test(char *file_name, int main_type, int sub_type, int slot) +{ + int ret; + name_info_t info; + + if ((slot < 0) || (file_name == NULL)) { + dbg_print(is_debug_on, "Failed firmware_upgrade_one_file parameter err.\n"); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "firmware upgrade %s 0x%x 0x%x %d\n", file_name, main_type, sub_type, slot); + /* Read the header information of the upgrade file */ + ret = firmware_upgrade_read_header(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to get file header: %s, ret=%d\n", file_name, ret); + return ret; + } + + /* Check the file information to determine that the file is available for use on the device */ + ret = firmware_check_file_info(&info, main_type, sub_type, slot); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "File is not match with the device: %s, ret=%d.\n", file_name, ret); + return ret; + } + + /* The link number corresponding to the upgrade file is calculated based on the slot number. + 16 links are reserved for each slot. main boade slot is 0. */ + info.chain += slot * FIRMWARE_SLOT_MAX_NUM; + ret = firmware_upgrade_test(file_name, &info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to upgrade: %s, ret=%d\n", file_name, ret); + return ret; + } + + return FIRMWARE_SUCCESS; +} + +static int firmware_upgrade_data_dump(char *argv[]) +{ + int ret; + uint32_t offset, len; + + /* dump by type */ + if (strcmp(argv[2], "spi_logic_dev") == 0) { + /* usag: firmware_upgrade dump spi_logic_dev dev_path offset size print/record_file_path */ + offset = strtoul(argv[4], NULL, 0); + len = strtoul(argv[5], NULL, 0); + /* offset needs align by 256 bytes */ + if ((offset & 0xff) || (len == 0)) { + dbg_print(is_debug_on,"only support offset align by 256 bytes.\n"); + return FIRMWARE_FAILED; + } + dbg_print(is_debug_on, "start to dump %s data. offset:0x%x, len:0x%x\n", argv[2], offset, len); + ret = firmware_upgrade_spi_logic_dev_dump(argv[3], offset, len, argv[6]); + } else { + dbg_print(is_debug_on, "Error: %s not support dump data.\n", argv[2]); + return FIRMWARE_FAILED; + } + + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to dump %s data. ret:%d\n", argv[3], ret); + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +int main(int argc, char *argv[]) +{ + int ret; + int main_type, sub_type, slot; + + is_debug_on = firmware_upgrade_debug(); + + signal(SIGTERM, SIG_IGN); /* ignore kill signal */ + signal(SIGINT, SIG_IGN); /* ignore ctrl+c signal */ + signal(SIGTSTP, SIG_IGN); /* ignore ctrl+z signal */ + + if ((argc != 5) && (argc != 6) && (argc != 7)) { + printf("Use:\n"); + printf(" upgrade file : firmware_upgrade file main_type sub_type slot\n"); + printf(" upgrade test : firmware_upgrade test file main_type sub_type slot\n"); + printf(" spi_logic_dev dump : firmware_upgrade dump spi_logic_dev dev_path offset size print/record_file_path\n"); + dbg_print(is_debug_on, "Failed to upgrade the number of argv: %d.\n", argc); + return ERR_FW_UPGRADE; + } + + if (argc == 5) { + main_type = strtoul(argv[2], NULL, 16); + sub_type = strtoul(argv[3], NULL, 16); + slot = strtoul(argv[4], NULL, 10); + printf("+================================+\n"); + printf("|Begin to upgrade, please wait...|\n"); + ret = firmware_upgrade_one_file(argv[1], main_type, sub_type, slot); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Failed to upgrade a firmware file: %s. (%d)\n", argv[1], ret); + printf("| Upgrade failed! |\n"); + printf("+================================+\n"); + return ret; + } + + printf("| Upgrade succeeded! |\n"); + printf("+================================+\n"); + dbg_print(is_debug_on, "Sucess to upgrade a firmware file: %s.\n", argv[1]); + return FIRMWARE_SUCCESS; + } else if ((argc == 6) && (strcmp(argv[1], "test") == 0)) { + main_type = strtoul(argv[3], NULL, 16); + sub_type = strtoul(argv[4], NULL, 16); + slot = strtoul(argv[5], NULL, 10); + printf("+=====================================+\n"); + printf("|Begin to upgrade test, please wait...|\n"); + ret = firmware_upgrade_file_test(argv[2], main_type, sub_type, slot); + if (ret == FIRMWARE_SUCCESS) { + printf("| Upgrade test succeeded! |\n"); + printf("+=====================================+\n"); + dbg_print(is_debug_on, "Sucess to upgrade test a firmware file: %s.\n", argv[2]); + return FIRMWARE_SUCCESS; + } else if (ret == ERR_FW_DO_UPGRADE_NOT_SUPPORT) { + dbg_print(is_debug_on, "do not support to upgrade test a firmware file: %s. (%d)\n", argv[2], ret); + printf("| Not support to upgrade test! |\n"); + printf("+=====================================+\n"); + return ret; + } else { + dbg_print(is_debug_on, "Failed to upgrade test a firmware file: %s. (%d)\n", argv[2], ret); + printf("| Upgrade test failed! |\n"); + printf("+=====================================+\n"); + return ret; + } + } else if (strcmp(argv[1], "dump") == 0) { + /* print device data */ + ret = firmware_upgrade_data_dump(argv); + if (ret == FIRMWARE_SUCCESS) { + printf("dump data succeeded.\n"); + return FIRMWARE_SUCCESS; + } else { + printf("dump data failed. ret:%d\n", ret); + return ret; + } + } + + printf("+=================+\n"); + printf("| UPGRADE FAIL! |\n"); + printf("+=================+\n"); + + return ERR_FW_UPGRADE; + } diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c new file mode 100644 index 0000000000..c43c9095fd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/hardware.c @@ -0,0 +1,263 @@ +/********************************************************************************* +* Lattice Semiconductor Corp. Copyright 2000-2008 +* +* This is the hardware.c of ispVME V12.1 for JTAG programmable devices. +* All the functions requiring customization are organized into this file for +* the convinience of porting. +*********************************************************************************/ +/********************************************************************************* +* Revision History: +* +* 09/11/07 NN Type cast mismatch variables +* 09/24/07 NN Added calibration function. +* Calibration will help to determine the system clock frequency +* and the count value for one micro-second delay of the target +* specific hardware. +* Modified the ispVMDelay function +* Removed Delay Percent support +* Moved the sclock() function from ivm_core.c to hardware.c +*********************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************************** +* Declaration of global variables +* +*********************************************************************************/ + +unsigned char g_siIspPins = 0x00; /*Keeper of JTAG pin state*/ +unsigned short g_usInPort = 0x379; /*Address of the TDO pin*/ +unsigned short g_usOutPort = 0x378; /*Address of TDI, TMS, TCK pin*/ +unsigned short g_usCpu_Frequency = 1000; /*Enter your CPU frequency here, unit in MHz.*/ + +/********************************************************************************* +* This is the definition of the bit locations of each respective +* signal in the global variable g_siIspPins. +* +* NOTE: Users must add their own implementation here to define +* the bit location of the signal to target their hardware. +* The example below is for the Lattice download cable on +* on the parallel port. +* +*********************************************************************************/ + +#if 0 +const unsigned char g_ucPinTDI = JTAG_TDI; /* Bit address of TDI */ +const unsigned char g_ucPinTCK = JTAG_TCK; /* Bit address of TCK */ +const unsigned char g_ucPinTMS = JTAG_TMS; /* Bit address of TMS */ +const unsigned char g_ucPinENABLE = JTAG_ENABLE; /* Bit address of ENABLE */ +const unsigned char g_ucPinTRST = JTAG_TRST; /* Bit address of TRST */ +const unsigned char g_ucPinTDO = JTAG_TDO; /* Bit address of TDO*/ +#endif +int g_file_fd = -1; +/*************************************************************** +* +* Functions declared in hardware.c module. +* +***************************************************************/ +void writePort(unsigned char a_ucPins, unsigned char a_ucValue); +unsigned char readPort(); +void sclock(); +void ispVMDelay(unsigned short a_usTimeDelay); +void calibration(void); + +/******************************************************************************** +* writePort +* To apply the specified value to the pins indicated. This routine will +* be modified for specific systems. +* As an example, this code uses the IBM-PC standard Parallel port, along with the +* schematic shown in Lattice documentation, to apply the signals to the +* JTAG pins. +* +* PC Parallel port pin Signal name Port bit address +* 2 g_ucPinTDI 1 +* 3 g_ucPinTCK 2 +* 4 g_ucPinTMS 4 +* 5 g_ucPinENABLE 8 +* 6 g_ucPinTRST 16 +* 10 g_ucPinTDO 64 +* +* Parameters: +* - a_ucPins, which is actually a set of bit flags (defined above) +* that correspond to the bits of the data port. Each of the I/O port +* bits that drives an isp programming pin is assigned a flag +* (through a #define) corresponding to the signal it drives. To +* change the value of more than one pin at once, the flags are added +* together, much like file access flags are. +* +* The bit flags are only set if the pin is to be changed. Bits that +* do not have their flags set do not have their levels changed. The +* state of the port is always manintained in the static global +* variable g_siIspPins, so that each pin can be addressed individually +* without disturbing the others. +* +* - a_ucValue, which is either HIGH (0x01 ) or LOW (0x00 ). Only these two +* values are valid. Any non-zero number sets the pin(s) high. +* +*********************************************************************************/ + +void writePort(unsigned char a_ucPins, unsigned char a_ucValue) +{ + switch (a_ucPins) { + case JTAG_TCK: + ioctl(g_file_fd, FIRMWARE_JTAG_TCK, &a_ucValue); + break; + case JTAG_TDI: + ioctl(g_file_fd, FIRMWARE_JTAG_TDI, &a_ucValue); + break; + case JTAG_TMS: + ioctl(g_file_fd, FIRMWARE_JTAG_TMS, &a_ucValue); + break; + case JTAG_ENABLE: + ioctl(g_file_fd, FIRMWARE_JTAG_EN, &a_ucValue); + break; + case JTAG_TRST: + //ioctl(g_file_fd, FIRMWARE_JTAG_TRST, &a_ucValue); + break; + default: + break; + } +} + +/********************************************************************************* +* +* readPort +* +* Returns the value of the TDO from the device. +* +**********************************************************************************/ +unsigned char readPort() +{ + unsigned char ucRet = 0; + + ioctl(g_file_fd, FIRMWARE_JTAG_TDO, &ucRet); + return (ucRet); +} + +/********************************************************************************* +* sclock +* +* Apply a pulse to TCK. +* +* This function is located here so that users can modify to slow down TCK if +* it is too fast (> 25MHZ). Users can change the IdleTime assignment from 0 to +* 1, 2... to effectively slowing down TCK by half, quarter... +* +*********************************************************************************/ +void sclock() +{ + unsigned short IdleTime = 0; //change to > 0 if need to slow down TCK + unsigned short usIdleIndex = 0; + IdleTime++; + for (usIdleIndex = 0; usIdleIndex < IdleTime; usIdleIndex++) { + writePort(JTAG_TCK, 0x01); + } + for (usIdleIndex = 0; usIdleIndex < IdleTime; usIdleIndex++) { + writePort(JTAG_TCK, 0x00); + } +} +/******************************************************************************** +* +* ispVMDelay +* +* +* Users must implement a delay to observe a_usTimeDelay, where +* bit 15 of the a_usTimeDelay defines the unit. +* 1 = milliseconds +* 0 = microseconds +* Example: +* a_usTimeDelay = 0x0001 = 1 microsecond delay. +* a_usTimeDelay = 0x8001 = 1 millisecond delay. +* +* This subroutine is called upon to provide a delay from 1 millisecond to a few +* hundreds milliseconds each time. +* It is understood that due to a_usTimeDelay is defined as unsigned short, a 16 bits +* integer, this function is restricted to produce a delay to 64000 micro-seconds +* or 32000 milli-second maximum. The VME file will never pass on to this function +* a delay time > those maximum number. If it needs more than those maximum, the VME +* file will launch the delay function several times to realize a larger delay time +* cummulatively. +* It is perfectly alright to provide a longer delay than required. It is not +* acceptable if the delay is shorter. +* +* Delay function example--using the machine clock signal of the native CPU------ +* When porting ispVME to a native CPU environment, the speed of CPU or +* the system clock that drives the CPU is usually known. +* The speed or the time it takes for the native CPU to execute one for loop +* then can be calculated as follows: +* The for loop usually is compiled into the ASSEMBLY code as shown below: +* LOOP: DEC RA; +* JNZ LOOP; +* If each line of assembly code needs 4 machine cycles to execute, +* the total number of machine cycles to execute the loop is 2 x 4 = 8. +* Usually system clock = machine clock (the internal CPU clock). +* Note: Some CPU has a clock multiplier to double the system clock for + the machine clock. +* +* Let the machine clock frequency of the CPU be F, or 1 machine cycle = 1/F. +* The time it takes to execute one for loop = (1/F ) x 8. +* Or one micro-second = F(MHz)/8; +* +* Example: The CPU internal clock is set to 100Mhz, then one micro-second = 100/8 = 12 +* +* The C code shown below can be used to create the milli-second accuracy. +* Users only need to enter the speed of the cpu. +* +**********************************************************************************/ +void ispVMDelay(unsigned short a_usTimeDelay) +{ + struct timespec ts; + + if (a_usTimeDelay & 0x8000) { + /* milliseconds */ + a_usTimeDelay &= 0x7FFF; + ts.tv_sec = (long int) (a_usTimeDelay / 1000); + ts.tv_nsec = (long int) (a_usTimeDelay % 1000) * 1000000ul; + } else { + /* microseconds */ + ts.tv_sec = 0; + ts.tv_nsec = (long int) a_usTimeDelay * 1000ul; + } + + nanosleep(&ts, NULL); +} + +/********************************************************************************* +* +* calibration +* +* It is important to confirm if the delay function is indeed providing +* the accuracy required. Also one other important parameter needed +* checking is the clock frequency. +* Calibration will help to determine the system clock frequency +* and the loop_per_micro value for one micro-second delay of the target +* specific hardware. +* +**********************************************************************************/ +void calibration(void) +{ + /*Apply 2 pulses to TCK.*/ + writePort(JTAG_TCK, 0x00); + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); + + /*Delay for 1 millisecond. Pass on 1000 or 0x8001 both = 1ms delay.*/ + ispVMDelay(0x8001); + + /*Apply 2 pulses to TCK*/ + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); + writePort(JTAG_TCK, 0x01); + writePort(JTAG_TCK, 0x00); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c new file mode 100644 index 0000000000..69a8e53852 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ispvm_ui.c @@ -0,0 +1,837 @@ +/************************************************************** +* +* Lattice Semiconductor Corp. Copyright 2008 +* +* ispVME Embedded allows programming of Lattice's suite of FPGA +* devices on embedded systems through the JTAG port. The software +* is distributed in source code form and is open to re - distribution +* and modification where applicable. +* +* ispVME Embedded C Source comprised with 3 modules: +* ispvm_ui.c is the module provides input and output support. +* ivm_core.c is the module interpret the VME file(s). +* hardware.c is the module access the JTAG port of the device(s). +* +* The optional module cable.c is for supporting Lattice's parallel +* port ispDOWNLOAD cable on DOS and Windows 95/98 O/S. It can be +* requested from Lattice's ispVMSupport. +* +***************************************************************/ + +/************************************************************** +* +* Revision History of ispvm_ui.c +* +* 3/6/07 ht Added functions vme_out_char(),vme_out_hex(), +* vme_out_string() to provide output resources. +* Consolidate all printf() calls into the added output +* functions. +* +* 09/11/07 NN Added Global variables initialization +* 09/24/07 NN Added a switch allowing users to do calibration. +* Calibration will help to determine the system clock frequency +* and the count value for one micro-second delay of the target +* specific hardware. +* Removed Delay Percent support +* 11/15/07 NN moved the checking of the File CRC to the end of processing +* 08/28/08 NN Added Calculate checksum support. +***************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +/*************************************************************** +* +* File pointer to the VME file. +* +***************************************************************/ + +FILE *g_pVMEFile = NULL; + +/*************************************************************** +* +* Functions declared in this ispvm_ui.c module +* +***************************************************************/ +unsigned char GetByte(void); +void vme_out_char(unsigned char charOut); +void vme_out_hex(unsigned char hexOut); +void vme_out_string(char *stringOut); +void ispVMMemManager(signed char cTarget, unsigned short usSize); +void ispVMFreeMem(void); +void error_handler(short a_siRetCode, char *pszMessage); +signed char ispVM(const char *a_pszFilename); + +/*************************************************************** +* +* Global variables. +* +***************************************************************/ +unsigned short g_usPreviousSize = 0; +unsigned short g_usExpectedCRC = 0; + +/*************************************************************** +* +* External variables and functions declared in ivm_core.c module. +* +***************************************************************/ +extern signed char ispVMCode(); +extern void ispVMCalculateCRC32(unsigned char a_ucData); +extern void ispVMStart(); +extern void ispVMEnd(); +extern unsigned short g_usCalculatedCRC; +extern unsigned short g_usDataType; +extern unsigned char *g_pucOutMaskData, +*g_pucInData, +*g_pucOutData, +*g_pucHIRData, +*g_pucTIRData, +*g_pucHDRData, +*g_pucTDRData, +*g_pucOutDMaskData, +*g_pucIntelBuffer; +extern unsigned char *g_pucHeapMemory; +extern unsigned short g_iHeapCounter; +extern unsigned short g_iHEAPSize; +extern unsigned short g_usIntelDataIndex; +extern unsigned short g_usIntelBufferSize; +extern LVDSPair *g_pLVDSList; +//08/28/08 NN Added Calculate checksum support. +extern unsigned long g_usChecksum; +extern unsigned int g_uiChecksumIndex; + +/* Added reinit for call ispvme more than once */ +extern void ivm_core_reinit(); +/*************************************************************** +* +* External variables and functions declared in hardware.c module. +* +***************************************************************/ +extern void calibration(void); +extern unsigned short g_usCpu_Frequency; +extern int g_file_fd; + +/*************************************************************** +* +* Supported VME versions. +* +***************************************************************/ + +const char *const g_szSupportedVersions[] = { "__VME2.0", "__VME3.0", "____12.0", "____12.1", 0 }; + +/*************************************************************** +* +* GetByte +* +* Returns a byte to the caller. The returned byte depends on the +* g_usDataType register. If the HEAP_IN bit is set, then the byte +* is returned from the HEAP. If the LHEAP_IN bit is set, then +* the byte is returned from the intelligent buffer. Otherwise, +* the byte is returned directly from the VME file. +* +***************************************************************/ + +char* strlwr(char *str) +{ + char *orig = str; +// process the string + for (; *str != '\0'; str++) + *str = tolower(*str); + return orig; +} + +unsigned char GetByte() +{ + unsigned char ucData = 0; + + if (g_usDataType & HEAP_IN) { + + /*************************************************************** + * + * Get data from repeat buffer. + * + ***************************************************************/ + + if (g_iHeapCounter > g_iHEAPSize) { + + /*************************************************************** + * + * Data over-run. + * + ***************************************************************/ + + return 0xFF; + } + + ucData = g_pucHeapMemory[g_iHeapCounter++]; + } + else if ( g_usDataType & LHEAP_IN ) { + + /*************************************************************** + * + * Get data from intel buffer. + * + ***************************************************************/ + + if (g_usIntelDataIndex >= g_usIntelBufferSize) { + + /*************************************************************** + * + * Data over-run. + * + ***************************************************************/ + + return 0xFF; + } + + ucData = g_pucIntelBuffer[g_usIntelDataIndex++]; + } + else { + + /*************************************************************** + * + * Get data from file. + * + ***************************************************************/ + + ucData = (unsigned char)fgetc(g_pVMEFile); + + if (feof(g_pVMEFile)) { + + /*************************************************************** + * + * Reached EOF. + * + ***************************************************************/ + + return 0xFF; + } + /*************************************************************** + * + * Calculate the 32-bit CRC if the expected CRC exist. + * + ***************************************************************/ + if( g_usExpectedCRC != 0) + { + ispVMCalculateCRC32(ucData); + } + } + + return (ucData); +} + +/*************************************************************** +* +* vme_out_char +* +* Send a character out to the output resource if available. +* The monitor is the default output resource. +* +* +***************************************************************/ +void vme_out_char(unsigned char charOut) +{ + dbg_print(is_debug_on, "%c", charOut); +} +/*************************************************************** +* +* vme_out_hex +* +* Send a character out as in hex format to the output resource +* if available. The monitor is the default output resource. +* +* +***************************************************************/ +void vme_out_hex(unsigned char hexOut) +{ + dbg_print(is_debug_on, "%.2X", hexOut); +} +/*************************************************************** +* +* vme_out_string +* +* Send a text string out to the output resource if available. +* The monitor is the default output resource. +* +* +***************************************************************/ +void vme_out_string(char *stringOut) +{ + dbg_print(is_debug_on,"%s",stringOut); +} +/*************************************************************** +* +* ispVMMemManager +* +* Allocate memory based on cTarget. The memory size is specified +* by usSize. +* +***************************************************************/ + +void ispVMMemManager(signed char cTarget, unsigned short usSize) +{ + switch (cTarget) { + case XTDI: + case TDI: + if (g_pucInData != NULL) { + if (g_usPreviousSize == usSize) { /*memory exist*/ + break; + } + else { + free(g_pucInData); + g_pucInData = NULL; + } + } + g_pucInData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + case XTDO: + case TDO: + if (g_pucOutData != NULL) { + if (g_usPreviousSize == usSize) { /*already exist*/ + break; + } + else { + free(g_pucOutData); + g_pucOutData = NULL; + } + } + g_pucOutData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + break; + case MASK: + if (g_pucOutMaskData != NULL) { + if (g_usPreviousSize == usSize) { /*already allocated*/ + break; + } + else { + free(g_pucOutMaskData); + g_pucOutMaskData = NULL; + } + } + g_pucOutMaskData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + break; + case HIR: + if (g_pucHIRData != NULL) { + free(g_pucHIRData); + g_pucHIRData = NULL; + } + g_pucHIRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case TIR: + if (g_pucTIRData != NULL) { + free(g_pucTIRData); + g_pucTIRData = NULL; + } + g_pucTIRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case HDR: + if (g_pucHDRData != NULL) { + free(g_pucHDRData); + g_pucHDRData = NULL; + } + g_pucHDRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case TDR: + if (g_pucTDRData != NULL) { + free(g_pucTDRData); + g_pucTDRData = NULL; + } + g_pucTDRData = (unsigned char *)malloc(usSize / 8 + 2); + break; + case HEAP: + if (g_pucHeapMemory != NULL) { + free(g_pucHeapMemory); + g_pucHeapMemory = NULL; + } + g_pucHeapMemory = (unsigned char *)malloc(usSize + 2); + break; + case DMASK: + if (g_pucOutDMaskData != NULL) { + if (g_usPreviousSize == usSize) { /*already allocated*/ + break; + } + else { + free(g_pucOutDMaskData); + g_pucOutDMaskData = NULL; + } + } + g_pucOutDMaskData = (unsigned char *)malloc(usSize / 8 + 2); + g_usPreviousSize = usSize; + break; + case LHEAP: + if (g_pucIntelBuffer != NULL) { + free(g_pucIntelBuffer); + g_pucIntelBuffer = NULL; + } + g_pucIntelBuffer = (unsigned char *)malloc(usSize + 2); + break; + case LVDS: + if (g_pLVDSList != NULL) { + free(g_pLVDSList); + g_pLVDSList = NULL; + } + g_pLVDSList = (LVDSPair * )calloc(usSize, sizeof(LVDSPair)); + break; + default: + return; + } +} + +/*************************************************************** +* +* ispVMFreeMem +* +* Free memory that were dynamically allocated. +* +***************************************************************/ + +void ispVMFreeMem() +{ + if (g_pucHeapMemory != NULL) { + free(g_pucHeapMemory); + g_pucHeapMemory = NULL; + } + + if (g_pucOutMaskData != NULL) { + free(g_pucOutMaskData); + g_pucOutMaskData = NULL; + } + + if (g_pucInData != NULL) { + free(g_pucInData); + g_pucInData = NULL; + } + + if (g_pucOutData != NULL) { + free(g_pucOutData); + g_pucOutData = NULL; + } + + if (g_pucHIRData != NULL) { + free(g_pucHIRData); + g_pucHIRData = NULL; + } + + if (g_pucTIRData != NULL) { + free(g_pucTIRData); + g_pucTIRData = NULL; + } + + if (g_pucHDRData != NULL) { + free(g_pucHDRData); + g_pucHDRData = NULL; + } + + if (g_pucTDRData != NULL) { + free(g_pucTDRData); + g_pucTDRData = NULL; + } + + if (g_pucOutDMaskData != NULL) { + free(g_pucOutDMaskData); + g_pucOutDMaskData = NULL; + } + + if (g_pucIntelBuffer != NULL) { + free(g_pucIntelBuffer); + g_pucIntelBuffer = NULL; + } + + if (g_pLVDSList != NULL) { + free(g_pLVDSList); + g_pLVDSList = NULL; + } +} + +/*************************************************************** +* +* error_handler +* +* Reports the error message. +* +***************************************************************/ + +void error_handler(short a_siRetCode, char *pszMessage) +{ + const char *pszErrorMessage[] = { "pass", + "verification fail", + "can't find the file", + "wrong file type", + "file error", + "option error", + "crc verification error" }; + + strcpy(pszMessage, pszErrorMessage[-a_siRetCode]); +} +/*************************************************************** +* +* ispVM +* +* The entry point of the ispVM embedded. If the version and CRC +* are verified, then the VME will be processed. +* +***************************************************************/ +signed char ispVM(const char *a_pszFilename) +{ + char szFileVersion[9] = { 0 }; + signed char cRetCode = 0; + signed char cIndex = 0; + signed char cVersionIndex = 0; + unsigned char ucReadByte = 0; + int ret; + /*************************************************************** + * + * Global variables initialization. + * + * 09/11/07 NN Added + ***************************************************************/ + g_pucHeapMemory = NULL; + g_iHeapCounter = 0; + g_iHEAPSize = 0; + g_usIntelDataIndex = 0; + g_usIntelBufferSize = 0; + g_usPreviousSize = 0; + + /*************************************************************** + * + * Open a file pointer to the VME file. + * + ***************************************************************/ + + if ((g_pVMEFile = fopen(a_pszFilename, "rb")) == NULL) { + return VME_FILE_READ_FAILURE; + } + /* Skip the contents of the file header */ + ret=fseek(g_pVMEFile, header_offset, SEEK_SET); + if (ret < 0) { + vme_out_string("Failed to skip header.\n"); + fclose(g_pVMEFile); + g_pVMEFile = NULL; + return VME_ARGUMENT_FAILURE; + } + + g_usCalculatedCRC = 0; + g_usExpectedCRC = 0; + ucReadByte = GetByte(); + switch (ucReadByte) { + case FILE_CRC: + + /*************************************************************** + * + * Read and store the expected CRC to do the comparison at the end. + * Only versions 3.0 and higher support CRC protection. + * + ***************************************************************/ + + g_usExpectedCRC = (unsigned char)fgetc(g_pVMEFile); + g_usExpectedCRC <<= 8; + g_usExpectedCRC |= fgetc(g_pVMEFile); + + /*************************************************************** + * + * Read and store the version of the VME file. + * + ***************************************************************/ + + for (cIndex = 0; cIndex < 8; cIndex++) { + szFileVersion[cIndex] = GetByte(); + } + break; + default: + + /*************************************************************** + * + * Read and store the version of the VME file. Must be version 2.0. + * + ***************************************************************/ + + szFileVersion[0] = (signed char)ucReadByte; + for (cIndex = 1; cIndex < 8; cIndex++) { + szFileVersion[cIndex] = GetByte(); + } + + break; + } + + /*************************************************************** + * + * Compare the VME file version against the supported version. + * + ***************************************************************/ + for (cVersionIndex = 0; g_szSupportedVersions[cVersionIndex] != 0; cVersionIndex++) { + for (cIndex = 0; cIndex < 8; cIndex++) { + if (szFileVersion[cIndex] != g_szSupportedVersions[cVersionIndex][cIndex]) { + cRetCode = VME_VERSION_FAILURE; + break; + } + cRetCode = 0; + } + + if (cRetCode == 0) { + + /*************************************************************** + * + * Found matching version, break. + * + ***************************************************************/ + + break; + } + } + + if (cRetCode < 0) { + + /*************************************************************** + * + * VME file version failed to match the supported versions. + * + ***************************************************************/ + + fclose(g_pVMEFile); + g_pVMEFile = NULL; + return VME_VERSION_FAILURE; + } + + /*************************************************************** + * + * Enable the JTAG port to communicate with the device. + * Set the JTAG state machine to the Test-Logic/Reset State. + * + ***************************************************************/ + ispVMStart(); + + /*************************************************************** + * + * Process the VME file. + * + ***************************************************************/ + + cRetCode = ispVMCode(); + + /*************************************************************** + * + * Set the JTAG State Machine to Test-Logic/Reset state then disable + * the communication with the JTAG port. + * + ***************************************************************/ + + ispVMEnd(); + + fclose(g_pVMEFile); + g_pVMEFile = NULL; + + ispVMFreeMem(); + + /*************************************************************** + * + * Compare the expected CRC versus the calculated CRC. + * + ***************************************************************/ + + if (cRetCode == 0 && g_usExpectedCRC != 0 && (g_usExpectedCRC != g_usCalculatedCRC)) { + printf("Expected CRC: 0x%.4X\n", g_usExpectedCRC); + printf("Calculated CRC: 0x%.4X\n", g_usCalculatedCRC); + return VME_CRC_FAILURE; + } + + return (cRetCode); +} + +/*************************************************************** +* +* ispvme_reinit +* +* Reinit ispvm_ui variables. +* +***************************************************************/ +static void ispvm_ui_reinit() +{ + g_pVMEFile = NULL; + g_usPreviousSize = 0; + g_usExpectedCRC = 0; +} + +/*************************************************************** +* +* main +* +***************************************************************/ + +int ispvme_main(int argc, char *argv[], int file_fd, name_info_t *info) +{ + unsigned short iCommandLineIndex = 0; + short siRetCode = 0; + char szExtension[5] = { 0 }; + char szCommandLineArg[300] = { 0 }; + short sicalibrate = 0; + + ispvm_ui_reinit(); + ivm_core_reinit(); + + //08/28/08 NN Added Calculate checksum support. + g_usChecksum = 0; + g_uiChecksumIndex = 0; + + if (file_fd < 0) { + dbg_print(is_debug_on, "Error:firmware upgrade ispvme dev parameters failed.\r\n"); + return -1; + } else { + g_file_fd = file_fd; + } + +#if 0 + ret = firmware_check_chip_name(g_file_fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip name: %s.\n", file_name); + close(g_file_fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } + + ret = firmware_check_chip_verison(g_file_fd, info); + if (ret != FIRMWARE_SUCCESS) { + dbg_print(is_debug_on, "Error: Failed to check chip version: %s.\n", file_name); + close(g_file_fd); + return firmware_error_type(FIRMWARE_ACTION_CHECK, info); + } +#endif + + vme_out_string(" Lattice Semiconductor Corp.\n"); + vme_out_string("\n ispVME(tm) V"); + vme_out_string(VME_VERSION_NUMBER); + vme_out_string(" Copyright 1998-2011.\n"); + vme_out_string("\nFor daisy chain programming of all in-system programmable devices\n\n"); + + if (argc < 2) { + vme_out_string("\nUsage: vme [option] vme_file [vme_file]\n"); + vme_out_string("Example: vme vme_file1.vme vme_file2.vme\n"); + vme_out_string("option -c: do the calibration.\n"); + vme_out_string("Example: vme -c\n"); + vme_out_string("Example: vme -c vme_file1.vme vme_file2.vme\n"); + vme_out_string("\n\n"); + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return -1; + } + for (iCommandLineIndex = 1; iCommandLineIndex < argc; iCommandLineIndex++) { + strncpy(szCommandLineArg, argv[iCommandLineIndex], sizeof(szCommandLineArg) - 1); + if (!strcmp(strlwr(szCommandLineArg), "-c") && (iCommandLineIndex == 1)) { + sicalibrate = 1; + } else if (!strcmp(strlwr(szCommandLineArg), "-c") && (iCommandLineIndex != 1)) { + vme_out_string("Error: calibrate option -c must be the first argument\n\n"); + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return -1; + //exit(1); + } else { + strcpy(szExtension, &szCommandLineArg[strlen(szCommandLineArg) - 4]); + strlwr(szExtension); + if (strcmp(szExtension, ".vme")) { + vme_out_string("Error: VME files must end with the extension *.vme\n\n"); + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return -1; + //exit(1); + } + } + } + siRetCode = 0; + + if (sicalibrate) { + calibration(); + } + for (iCommandLineIndex = 1; iCommandLineIndex < argc; iCommandLineIndex++) { /* Process all VME files sequentially */ + strcpy(szCommandLineArg, argv[iCommandLineIndex]); + if (!strcmp(strlwr(szCommandLineArg), "-c") && (iCommandLineIndex == 1)) { + + } else if (!strcmp(strlwr(szCommandLineArg), "-checksum")) { + + } else { + vme_out_string("Processing virtual machine file ("); + vme_out_string(szCommandLineArg); + vme_out_string(")......\n\n"); + siRetCode = ispVM(argv[iCommandLineIndex]); + if (siRetCode < 0) { + break; + } + } + } + + if (siRetCode < 0) { + error_handler(siRetCode, szCommandLineArg); + vme_out_string("Failed due to "); + vme_out_string(szCommandLineArg); + vme_out_string("\n\n"); + vme_out_string("+=======+\n"); + vme_out_string("| FAIL! |\n"); + vme_out_string("+=======+\n\n"); + } else { + vme_out_string("+=======+\n"); + vme_out_string("| PASS! |\n"); + vme_out_string("+=======+\n\n"); + //08/28/08 NN Added Calculate checksum support. + if (g_usChecksum != 0) { + g_usChecksum &= 0xFFFF; + printf("Data Checksum: %.4X\n\n", (unsigned int)g_usChecksum); + g_usChecksum = 0; + } + } + g_file_fd = -1; + /* Change return to determine whether the upgrade was successful */ + return siRetCode; + //exit(siRetCode); +} + +/* + * firmware_upgrade_ispvme + * function: ispvme firmware upgrade + * @file_fd: param[in] Upgrade devices fd + * @upgrade_file_name: param[in] Upgrade file name + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS, other fail return error code + */ +int firmware_upgrade_ispvme(int file_fd, char *upgrade_file_name, name_info_t *info) +{ + char *argv[2]; + int ret, rv, i, retry; + + argv[1] = upgrade_file_name; + + /* Initialize and enable */ + rv = ioctl(file_fd, FIRMWARE_JTAG_INIT,NULL); + if (rv < 0) { + vme_out_string("Failed to init GPIO.\n"); + return VME_ARGUMENT_FAILURE; + } + + i = 0; + retry = FIRMWARE_UPGRADE_RETRY_CNT; + + ret = 0; + while(i < retry) { + ret = ispvme_main(2, argv, file_fd, info); + if (ret < 0) { + i++; + dbg_print(is_debug_on, "%d times ispvme upgrade failed. ret %d.\n", i, ret); + continue; + } else { + dbg_print(is_debug_on, "ispvme upgrade success.\n"); + break; + } + } + + /* Upgrade completed, release */ + rv = ioctl(file_fd, FIRMWARE_JTAG_FINISH, NULL); + if (rv < 0) { + vme_out_string("Failed to release GPIO.\n"); + return VME_ARGUMENT_FAILURE; + } + + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c new file mode 100644 index 0000000000..540be481d3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_gpio_vme/ivm_core.c @@ -0,0 +1,3097 @@ +/*************************************************************** +* +* Lattice Semiconductor Corp. Copyright 2009 +* +* ispVME Embedded allows programming of Lattice's suite of FPGA +* devices on embedded systems through the JTAG port. The software +* is distributed in source code form and is open to re - distribution +* and modification where applicable. +* +* Revision History of ivm_core.c module: +* 4/25/06 ht Change some variables from unsigned short or int +* to long int to make the code compiler independent. +* 5/24/06 ht Support using RESET (TRST) pin as a special purpose +* control pin such as triggering the loading of known +* state exit. +* 3/6/07 ht added functions to support output to terminals +* +* 09/24/07 NN Type cast mismatch variables +* Moved the sclock() function to hardware.c +* 08/28/08 NN Added Calculate checksum support. +* 4/1/09 Nguyen replaced the recursive function call codes on +* the ispVMLCOUNT function +* +***************************************************************/ + +#include +#include +#include +#include + +/*************************************************************** +* +* Global variables used to specify the flow control and data type. +* +* g_usFlowControl: flow control register. Each bit in the +* register can potentially change the +* personality of the embedded engine. +* g_usDataType: holds the data type of the current row. +* +***************************************************************/ + +unsigned short g_usFlowControl = 0x0000; +unsigned short g_usDataType = 0x0000; + +/*************************************************************** +* +* Global variables used to specify the ENDDR and ENDIR. +* +* g_ucEndDR: the state that the device goes to after SDR. +* g_ucEndIR: the state that the device goes to after SIR. +* +***************************************************************/ + +unsigned char g_ucEndDR = DRPAUSE; +unsigned char g_ucEndIR = IRPAUSE; + +/*************************************************************** +* +* Global variables used to support header/trailer. +* +* g_usHeadDR: the number of lead devices in bypass. +* g_usHeadIR: the sum of IR length of lead devices. +* g_usTailDR: the number of tail devices in bypass. +* g_usTailIR: the sum of IR length of tail devices. +* +***************************************************************/ + +unsigned short g_usHeadDR = 0; +unsigned short g_usHeadIR = 0; +unsigned short g_usTailDR = 0; +unsigned short g_usTailIR = 0; + +/*************************************************************** +* +* Global variable to store the number of bits of data or instruction +* to be shifted into or out from the device. +* +***************************************************************/ + +unsigned short g_usiDataSize = 0; + +/*************************************************************** +* +* Stores the frequency. Default to 1 MHz. +* +***************************************************************/ + +int g_iFrequency = 1000; + +/*************************************************************** +* +* Stores the maximum amount of ram needed to hold a row of data. +* +***************************************************************/ + +unsigned short g_usMaxSize = 0; + +/*************************************************************** +* +* Stores the LSH or RSH value. +* +***************************************************************/ + +unsigned short g_usShiftValue = 0; + +/*************************************************************** +* +* Stores the current repeat loop value. +* +***************************************************************/ + +unsigned short g_usRepeatLoops = 0; + +/*************************************************************** +* +* Stores the current vendor. +* +***************************************************************/ + +signed char g_cVendor = LATTICE; + +/*************************************************************** +* +* Stores the VME file CRC. +* +***************************************************************/ + +unsigned short g_usCalculatedCRC = 0; + +/*************************************************************** +* +* Stores the Device Checksum. +* +***************************************************************/ +//08/28/08 NN Added Calculate checksum support. +unsigned long g_usChecksum = 0; +unsigned int g_uiChecksumIndex = 0; + +/*************************************************************** +* +* Stores the current state of the JTAG state machine. +* +***************************************************************/ + +signed char g_cCurrentJTAGState = 0; + +/*************************************************************** +* +* Global variables used to support looping. +* +* g_pucHeapMemory: holds the entire repeat loop. +* g_iHeapCounter: points to the current byte in the repeat loop. +* g_iHEAPSize: the current size of the repeat in bytes. +* +***************************************************************/ + +unsigned char *g_pucHeapMemory = NULL; +unsigned short g_iHeapCounter = 0; +unsigned short g_iHEAPSize = 0; + +/*************************************************************** +* +* Global variables used to support intelligent programming. +* +* g_usIntelDataIndex: points to the current byte of the +* intelligent buffer. +* g_usIntelBufferSize: holds the size of the intelligent +* buffer. +* +***************************************************************/ + +unsigned short g_usIntelDataIndex = 0; +unsigned short g_usIntelBufferSize = 0; + +/**************************************************************************** +* +* Holds the maximum size of each respective buffer. These variables are used +* to write the HEX files when converting VME to HEX. +* +*****************************************************************************/ + +unsigned short g_usTDOSize = 0; +unsigned short g_usMASKSize = 0; +unsigned short g_usTDISize = 0; +unsigned short g_usDMASKSize = 0; +unsigned short g_usLCOUNTSize = 0; +unsigned short g_usHDRSize = 0; +unsigned short g_usTDRSize = 0; +unsigned short g_usHIRSize = 0; +unsigned short g_usTIRSize = 0; +unsigned short g_usHeapSize = 0; + +/*************************************************************** +* +* Global variables used to store data. +* +* g_pucOutMaskData: local RAM to hold one row of MASK data. +* g_pucInData: local RAM to hold one row of TDI data. +* g_pucOutData: local RAM to hold one row of TDO data. +* g_pucHIRData: local RAM to hold the current SIR header. +* g_pucTIRData: local RAM to hold the current SIR trailer. +* g_pucHDRData: local RAM to hold the current SDR header. +* g_pucTDRData: local RAM to hold the current SDR trailer. +* g_pucIntelBuffer: local RAM to hold the current intelligent buffer. +* g_pucOutDMaskData: local RAM to hold one row of DMASK data. +* +***************************************************************/ + +unsigned char *g_pucOutMaskData = NULL, +*g_pucInData = NULL, +*g_pucOutData = NULL, +*g_pucHIRData = NULL, +*g_pucTIRData = NULL, +*g_pucHDRData = NULL, +*g_pucTDRData = NULL, +*g_pucIntelBuffer = NULL, +*g_pucOutDMaskData = NULL; + +/*************************************************************** +* +* JTAG state machine transition table. +* +***************************************************************/ + +struct { + unsigned char CurState; /* From this state */ + unsigned char NextState; /* Step to this state */ + unsigned char Pattern; /* The tragetory of TMS */ + unsigned char Pulses; /* The number of steps */ +} g_JTAGTransistions[25] = { + { RESET, RESET, 0xFC, 6 }, /* Transitions from RESET */ + { RESET, IDLE, 0x00, 1 }, + { RESET, DRPAUSE, 0x50, 5 }, + { RESET, IRPAUSE, 0x68, 6 }, + { IDLE, RESET, 0xE0, 3 }, /* Transitions from IDLE */ + { IDLE, DRPAUSE, 0xA0, 4 }, + { IDLE, IRPAUSE, 0xD0, 5 }, + { DRPAUSE, RESET, 0xF8, 5 }, /* Transitions from DRPAUSE */ + { DRPAUSE, IDLE, 0xC0, 3 }, + { DRPAUSE, IRPAUSE, 0xF4, 7 }, + { DRPAUSE, DRPAUSE, 0xE8, 6 }, /* 06/14/06 Support POLING STATUS LOOP*/ + { IRPAUSE, RESET, 0xF8, 5 }, /* Transitions from IRPAUSE */ + { IRPAUSE, IDLE, 0xC0, 3 }, + { IRPAUSE, DRPAUSE, 0xE8, 6 }, + { DRPAUSE, SHIFTDR, 0x80, 2 }, /* Extra transitions using SHIFTDR */ + { IRPAUSE, SHIFTDR, 0xE0, 5 }, + { SHIFTDR, DRPAUSE, 0x80, 2 }, + { SHIFTDR, IDLE, 0xC0, 3 }, + { IRPAUSE, SHIFTIR, 0x80, 2 }, /* Extra transitions using SHIFTIR */ + { SHIFTIR, IRPAUSE, 0x80, 2 }, + { SHIFTIR, IDLE, 0xC0, 3 }, + { DRPAUSE, DRCAPTURE, 0xE0, 4 }, /* 11/15/05 Support DRCAPTURE*/ + { DRCAPTURE, DRPAUSE, 0x80, 2 }, + { IDLE, DRCAPTURE, 0x80, 2 }, + { IRPAUSE, DRCAPTURE, 0xE0, 4 } +}; + +/*************************************************************** +* +* List to hold all LVDS pairs. +* +***************************************************************/ + +LVDSPair *g_pLVDSList = NULL; +unsigned short g_usLVDSPairCount = 0; + +/*************************************************************** +* +* Function prototypes. +* +***************************************************************/ + +signed char ispVMCode(); +signed char ispVMDataCode(); +long int ispVMDataSize(); +void ispVMData(unsigned char *Data); +signed char ispVMShift(signed char Code); +signed char ispVMAmble(signed char Code); +signed char ispVMLoop(unsigned short a_usLoopCount); +signed char ispVMBitShift(signed char mode, unsigned short bits); +void ispVMComment(unsigned short a_usCommentSize); +void ispVMHeader(unsigned short a_usHeaderSize); +signed char ispVMLCOUNT(unsigned short a_usCountSize); +void ispVMClocks(unsigned short Clocks); +void ispVMBypass(signed char ScanType, unsigned short Bits); +void ispVMStateMachine(signed char NextState); +void ispVMStart(); +void ispVMEnd(); +signed char ispVMSend(unsigned short int); +signed char ispVMRead(unsigned short int); +signed char ispVMReadandSave(unsigned short int); +signed char ispVMProcessLVDS(unsigned short a_usLVDSCount); + +/*************************************************************** +* +* External variables and functions in ispvm_ui.c module +* +***************************************************************/ +extern void vme_out_char(unsigned char charOut); +extern void vme_out_hex(unsigned char hexOut); +extern void vme_out_string(char *stringOut); +extern unsigned char GetByte(); +extern void ispVMMemManager(signed char types, unsigned short size); + +/*************************************************************** +* +* External variables and functions in hardware.c module +* +***************************************************************/ +extern void ispVMDelay(unsigned short int a_usMicroSecondDelay); +extern unsigned char readPort(); +extern void writePort(unsigned char pins, unsigned char value); +extern void sclock(); +extern signed char g_cCurrentJTAGState; +#ifdef VME_DEBUG + +/*************************************************************** +* +* GetState +* +* Returns the state as a string based on the opcode. Only used +* for debugging purposes. +* +***************************************************************/ + +const char* GetState(unsigned char a_ucState) +{ + switch (a_ucState) { + case RESET: + return ("RESET"); + case IDLE: + return ("IDLE"); + case IRPAUSE: + return ("IRPAUSE"); + case DRPAUSE: + return ("DRPAUSE"); + case SHIFTIR: + return ("SHIFTIR"); + case SHIFTDR: + return ("SHIFTDR"); + case DRCAPTURE: /* 11/15/05 support DRCAPTURE*/ + return ("DRCAPTURE"); + default: + break; + } + + return 0; +} + +/*************************************************************** +* +* PrintData +* +* Prints the data. Only used for debugging purposes. +* +***************************************************************/ + +void PrintData(unsigned short a_iDataSize, unsigned char *a_pucData) +{ + //09/11/07 NN added local variables initialization + unsigned short usByteSize = 0; + unsigned short usBitIndex = 0; + signed short usByteIndex = 0; + unsigned char ucByte = 0; + unsigned char ucFlipByte = 0; + + if (a_iDataSize % 8) { + //09/11/07 NN Type cast mismatch variables + usByteSize = (unsigned short)(a_iDataSize / 8 + 1); + } else { + //09/11/07 NN Type cast mismatch variables + usByteSize = (unsigned short)(a_iDataSize / 8);// 4 + } + printf("("); + //09/11/07 NN Type cast mismatch variables + for (usByteIndex = (signed short)(usByteSize - 1); usByteIndex >= 0; usByteIndex--) { + ucByte = a_pucData[usByteIndex]; + ucFlipByte = 0x00; + + /*************************************************************** + * + * Flip each byte. + * + ***************************************************************/ + + for (usBitIndex = 0; usBitIndex < 8; usBitIndex++) { + ucFlipByte <<= 1; + if (ucByte & 0x1) { + ucFlipByte |= 0x1; + } + + ucByte >>= 1; + } + + /*************************************************************** + * + * Print the flipped byte. + * + ***************************************************************/ + + printf("%.02X", ucFlipByte); + if ((usByteSize - usByteIndex) % 40 == 39) { + printf("\n\t\t"); + } + if (usByteIndex < 0) + break; + } + printf(")"); +} +#endif //VME_DEBUG + +/*************************************************************** +* +* ispVMDataSize +* +* Returns a VME-encoded number, usually used to indicate the +* bit length of an SIR/SDR command. +* +***************************************************************/ + +long int ispVMDataSize() +{ + //09/11/07 NN added local variables initialization + long int iSize = 0; + signed char cCurrentByte = 0; + signed char cIndex = 0; + cIndex = 0; + + while ((cCurrentByte = GetByte()) & 0x80) { + iSize |= ((long int)(cCurrentByte & 0x7F)) << cIndex; + cIndex += 7; + } + iSize |= ((long int)(cCurrentByte & 0x7F)) << cIndex; + + return iSize; +} + +/*************************************************************** +* +* ispVMCode +* +* This is the heart of the embedded engine. All the high-level opcodes +* are extracted here. Once they have been identified, then it +* will call other functions to handle the processing. +* +***************************************************************/ + +signed char ispVMCode() +{ + //09/11/07 NN added local variables initialization + unsigned short iRepeatSize = 0; + signed char cOpcode = 0; + signed char cRetCode = 0; + unsigned char ucState = 0; + unsigned short usDelay = 0; + unsigned short usToggle = 0; + unsigned char usByte = 0; + + /*************************************************************** + * + * Check the compression flag only if this is the first time + * this function is entered. Do not check the compression flag if + * it is being called recursively from other functions within + * the embedded engine. + * + ***************************************************************/ + + if (!(g_usDataType & LHEAP_IN) && !(g_usDataType & HEAP_IN)) { + usByte = GetByte(); + if (usByte == 0xf1) { + g_usDataType |= COMPRESS; + } else if (usByte == 0xf2) { + g_usDataType &= ~COMPRESS; + } else { + return VME_INVALID_FILE; + } + } + + /*************************************************************** + * + * Begin looping through all the VME opcodes. + * + ***************************************************************/ + while ((cOpcode = GetByte()) >= 0) { + switch (cOpcode) { + case STATE: + + /*************************************************************** + * + * Step the JTAG state machine. + * + ***************************************************************/ + + ucState = GetByte(); + /*************************************************************** + * + * Step the JTAG state machine to DRCAPTURE to support Looping. + * + ***************************************************************/ + + if ((g_usDataType & LHEAP_IN) && + (ucState == DRPAUSE) && + (g_cCurrentJTAGState == ucState)) { + ispVMStateMachine(DRCAPTURE); + } + + ispVMStateMachine(ucState); + +#ifdef VME_DEBUG + if (g_usDataType & LHEAP_IN) { + printf("LDELAY %s ", GetState(ucState)); + } else { + printf("STATE %s;\n", GetState(ucState)); + } +#endif //VME_DEBUG + break; + case SIR: + case SDR: + case XSDR: + +#ifdef VME_DEBUG + switch (cOpcode) { + case SIR: + printf("SIR "); + break; + case SDR: + case XSDR: + if (g_usDataType & LHEAP_IN) { + printf("LSDR "); + } else { + printf("SDR "); + } + break; + } +#endif //VME_DEBUG + /*************************************************************** + * + * Shift in data into the device. + * + ***************************************************************/ + cRetCode = ispVMShift(cOpcode); + if (cRetCode != 0) { + return (cRetCode); + } + break; + case WAIT: + + /*************************************************************** + * + * Observe delay. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + usDelay = (unsigned short)ispVMDataSize(); + ispVMDelay(usDelay); + +#ifdef VME_DEBUG + if (usDelay & 0x8000) { + + /*************************************************************** + * + * Since MSB is set, the delay time must be decoded to + * millisecond. The SVF2VME encodes the MSB to represent + * millisecond. + * + ***************************************************************/ + + usDelay &= ~0x8000; + if (g_usDataType & LHEAP_IN) { + printf("%.2E SEC;\n", (float)usDelay / 1000); + } else { + printf("RUNTEST %.2E SEC;\n", (float)usDelay / 1000); + } + } else { + + /*************************************************************** + * + * Since MSB is not set, the delay time is given as microseconds. + * + ***************************************************************/ + + if (g_usDataType & LHEAP_IN) { + printf("%.2E SEC;\n", (float)usDelay / 1000000); + } else { + printf("RUNTEST %.2E SEC;\n", (float)usDelay / 1000000); + } + } +#endif //VME_DEBUG + break; + case TCK: + + /*************************************************************** + * + * Issue clock toggles. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + usToggle = (unsigned short)ispVMDataSize(); + ispVMClocks(usToggle); + +#ifdef VME_DEBUG + printf("RUNTEST %d TCK;\n", usToggle); +#endif //VME_DEBUG + break; + case ENDDR: + + /*************************************************************** + * + * Set the ENDDR. + * + ***************************************************************/ + + g_ucEndDR = GetByte(); + +#ifdef VME_DEBUG + printf("ENDDR %s;\n", GetState(g_ucEndDR)); +#endif //VME_DEBUG + break; + case ENDIR: + + /*************************************************************** + * + * Set the ENDIR. + * + ***************************************************************/ + + g_ucEndIR = GetByte(); + +#ifdef VME_DEBUG + printf("ENDIR %s;\n", GetState(g_ucEndIR)); +#endif //VME_DEBUG + break; + case HIR: + case TIR: + case HDR: + case TDR: + +#ifdef VME_DEBUG + switch (cOpcode) { + case HIR: + printf("HIR "); + break; + case TIR: + printf("TIR "); + break; + case HDR: + printf("HDR "); + break; + case TDR: + printf("TDR "); + break; + } +#endif //VME_DEBUG + + /*************************************************************** + * + * Set the header/trailer of the device in order to bypass + * successfully. + * + ***************************************************************/ + + cRetCode = ispVMAmble(cOpcode); + if (cRetCode != 0) { + return (cRetCode); + } + +#ifdef VME_DEBUG + printf(";\n"); +#endif //VME_DEBUG + break; + case MEM: + + /*************************************************************** + * + * The maximum RAM required to support processing one row of the + * VME file. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_usMaxSize = (unsigned short)ispVMDataSize(); + +#ifdef VME_DEBUG + printf("// MEMSIZE %d\n", g_usMaxSize); +#endif //VME_DEBUG + break; + case VENDOR: + + /*************************************************************** + * + * Set the VENDOR type. + * + ***************************************************************/ + + cOpcode = GetByte(); + switch (cOpcode) { + case LATTICE: +#ifdef VME_DEBUG + printf("// VENDOR LATTICE\n"); +#endif //VME_DEBUG + g_cVendor = LATTICE; + break; + case ALTERA: +#ifdef VME_DEBUG + printf("// VENDOR ALTERA\n"); +#endif //VME_DEBUG + g_cVendor = ALTERA; + break; + case XILINX: +#ifdef VME_DEBUG + printf("// VENDOR XILINX\n"); +#endif //VME_DEBUG + g_cVendor = XILINX; + break; + default: + break; + } + break; + case SETFLOW: + + /*************************************************************** + * + * Set the flow control. Flow control determines the personality + * of the embedded engine. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_usFlowControl |= (unsigned short)ispVMDataSize(); + break; + case RESETFLOW: + + /*************************************************************** + * + * Unset the flow control. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_usFlowControl &= (unsigned short)~(ispVMDataSize()); + break; + case HEAP: + + /*************************************************************** + * + * Allocate heap size to store loops. + * + ***************************************************************/ + + cRetCode = GetByte(); + if (cRetCode != SECUREHEAP) { + return VME_INVALID_FILE; + } + //09/11/07 NN Type cast mismatch variables + g_iHEAPSize = (unsigned short)ispVMDataSize(); + + /**************************************************************************** + * + * Store the maximum size of the HEAP buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_iHEAPSize > g_usHeapSize) { + g_usHeapSize = g_iHEAPSize; + } + + ispVMMemManager(HEAP, (unsigned short)g_iHEAPSize); + break; + case REPEAT: + + /*************************************************************** + * + * Execute loops. + * + ***************************************************************/ + + g_usRepeatLoops = 0; + + //09/11/07 NN Type cast mismatch variables + iRepeatSize = (unsigned short)ispVMDataSize(); + + cRetCode = ispVMLoop((unsigned short)iRepeatSize); + if (cRetCode != 0) { + return (cRetCode); + } + break; + case ENDLOOP: + + /*************************************************************** + * + * Exit point from processing loops. + * + ***************************************************************/ + + return (cRetCode); + case ENDVME: + + /*************************************************************** + * + * The only valid exit point that indicates end of programming. + * + ***************************************************************/ + + return (cRetCode); + case SHR: + + /*************************************************************** + * + * Right-shift address. + * + ***************************************************************/ + + g_usFlowControl |= SHIFTRIGHT; + + //09/11/07 NN Type cast mismatch variables + g_usShiftValue = (unsigned short)(g_usRepeatLoops * (unsigned short)GetByte()); + break; + case SHL: + + /*************************************************************** + * + * Left-shift address. + * + ***************************************************************/ + + g_usFlowControl |= SHIFTLEFT; + + //09/11/07 NN Type cast mismatch variables + g_usShiftValue = (unsigned short)(g_usRepeatLoops * (unsigned short)GetByte()); + break; + case FREQUENCY: + + /*************************************************************** + * + * Set the frequency. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_iFrequency = (int)(ispVMDataSize()); + //10/23/08 NN changed to check if the frequency smaller than 1000 + if (g_iFrequency >= 1000) { + g_iFrequency = g_iFrequency / 1000; + if (g_iFrequency == 1) + g_iFrequency = 1000; +#ifdef VME_DEBUG + printf("FREQUENCY %.2E HZ;\n", (float)g_iFrequency * 1000); +#endif //VME_DEBUG + } else { + if (g_iFrequency == 0) + g_iFrequency = 1000; +#ifdef VME_DEBUG + printf("FREQUENCY %.2E HZ;\n", (float)g_iFrequency); +#endif //VME_DEBUG + } + break; + case LCOUNT: + + /*************************************************************** + * + * Process LCOUNT command. + * + ***************************************************************/ + + cRetCode = ispVMLCOUNT((unsigned short)ispVMDataSize()); + if (cRetCode != 0) { + return (cRetCode); + } + break; + case VUES: + + /*************************************************************** + * + * Set the flow control to verify USERCODE. + * + ***************************************************************/ + + g_usFlowControl |= VERIFYUES; + break; + case COMMENT: + + /*************************************************************** + * + * Display comment. + * + ***************************************************************/ + + ispVMComment((unsigned short)ispVMDataSize()); + break; + case LVDS: + + /*************************************************************** + * + * Process LVDS command. + * + ***************************************************************/ + + ispVMProcessLVDS((unsigned short)ispVMDataSize()); + break; + case HEADER: + + /*************************************************************** + * + * Discard header. + * + ***************************************************************/ + + ispVMHeader((unsigned short)ispVMDataSize()); + break; + /* 03/14/06 Support Toggle ispENABLE signal*/ + case ispEN: + ucState = GetByte(); + if ((ucState == ON) || (ucState == 0x01)) + writePort(JTAG_ENABLE, 0x01); + else + writePort(JTAG_ENABLE, 0x00); + ispVMDelay(1); + break; + /* 05/24/06 support Toggle TRST pin*/ + case TRST: + ucState = GetByte(); + if (ucState == 0x01) + writePort(JTAG_TRST, 0x01); + else + writePort(JTAG_TRST, 0x00); + ispVMDelay(1); + break; + default: + + /*************************************************************** + * + * Invalid opcode encountered. + * + ***************************************************************/ + +#ifdef VME_DEBUG + printf("\nINVALID OPCODE: 0x%.2X\n", cOpcode); +#endif //VME_DEBUG + + return VME_INVALID_FILE; + } + } + + /*************************************************************** + * + * Invalid exit point. Processing the token 'ENDVME' is the only + * valid way to exit the embedded engine. + * + ***************************************************************/ + + return (VME_INVALID_FILE); +} + +/*************************************************************** +* +* ispVMDataCode +* +* Processes the TDI/TDO/MASK/DMASK etc of an SIR/SDR command. +* +***************************************************************/ + +signed char ispVMDataCode() +{ + //09/11/07 NN added local variables initialization + signed char cDataByte = 0; + signed char siDataSource = 0; /*source of data from file by default*/ + + if (g_usDataType & HEAP_IN) { + siDataSource = 1; /*the source of data from memory*/ + } + + /**************************************************************************** + * + * Clear the data type register. + * + *****************************************************************************/ + + g_usDataType &= ~(MASK_DATA + TDI_DATA + TDO_DATA + DMASK_DATA + CMASK_DATA); + + /**************************************************************************** + * + * Iterate through SIR/SDR command and look for TDI, TDO, MASK, etc. + * + *****************************************************************************/ + + while ((cDataByte = GetByte()) >= 0) { + + ispVMMemManager(cDataByte, g_usMaxSize); + switch (cDataByte) { + case TDI: + + /**************************************************************************** + * + * Store the maximum size of the TDI buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDISize) { + g_usTDISize = g_usiDataSize; + } + /**************************************************************************** + * + * Updated data type register to indicate that TDI data is currently being + * used. Process the data in the VME file into the TDI buffer. + * + *****************************************************************************/ + + g_usDataType |= TDI_DATA; + ispVMData(g_pucInData); + break; + case XTDO: + + /**************************************************************************** + * + * Store the maximum size of the TDO buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDOSize) { + g_usTDOSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that TDO data is currently being + * used. + * + *****************************************************************************/ + + g_usDataType |= TDO_DATA; + break; + case TDO: + + /**************************************************************************** + * + * Store the maximum size of the TDO buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDOSize) { + g_usTDOSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that TDO data is currently being + * used. Process the data in the VME file into the TDO buffer. + * + *****************************************************************************/ + + g_usDataType |= TDO_DATA; + ispVMData(g_pucOutData); + break; + case MASK: + + /**************************************************************************** + * + * Store the maximum size of the MASK buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usMASKSize) { + g_usMASKSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that MASK data is currently being + * used. Process the data in the VME file into the MASK buffer. + * + *****************************************************************************/ + + g_usDataType |= MASK_DATA; + ispVMData(g_pucOutMaskData); + break; + case DMASK: + + /**************************************************************************** + * + * Store the maximum size of the DMASK buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usDMASKSize) { + g_usDMASKSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Updated data type register to indicate that DMASK data is currently being + * used. Process the data in the VME file into the DMASK buffer. + * + *****************************************************************************/ + + g_usDataType |= DMASK_DATA; + ispVMData(g_pucOutDMaskData); + break; + case CMASK: + + /**************************************************************************** + * + * Updated data type register to indicate that CMASK data is currently being + * used. Process the data in the VME file into the CMASK buffer. + * + *****************************************************************************/ + + g_usDataType |= CMASK_DATA; + ispVMData(g_pucOutMaskData); + break; + case CONTINUE: + return (0); + default: + + /**************************************************************************** + * + * Encountered invalid opcode. + * + *****************************************************************************/ + + return (VME_INVALID_FILE); + } + + switch (cDataByte) { + case TDI: + + /**************************************************************************** + * + * Left bit shift. Used when performing algorithm looping. + * + *****************************************************************************/ + + if (g_usFlowControl & SHIFTLEFT) { + ispVMBitShift(SHL, g_usShiftValue); + g_usFlowControl &= ~SHIFTLEFT; + } + + /**************************************************************************** + * + * Right bit shift. Used when performing algorithm looping. + * + *****************************************************************************/ + + if (g_usFlowControl & SHIFTRIGHT) { + ispVMBitShift(SHR, g_usShiftValue); + g_usFlowControl &= ~SHIFTRIGHT; + } + default: + break; + } + + if (siDataSource) { + g_usDataType |= HEAP_IN; /*restore data from memory*/ + } + } + + if (siDataSource) { /*fetch data from heap memory upon return*/ + g_usDataType |= HEAP_IN; + } + + if (cDataByte < 0) { + + /**************************************************************************** + * + * Encountered invalid opcode. + * + *****************************************************************************/ + + return (VME_INVALID_FILE); + } else { + return (0); + } +} + +/*************************************************************** +* +* ispVMData +* Extract one row of data operand from the current data type opcode. Perform +* the decompression if necessary. Extra RAM is not required for the +* decompression process. The decompression scheme employed in this module +* is on row by row basis. The format of the data stream: +* [compression code][compressed data stream] +* 0x00 --No compression +* 0x01 --Compress by 0x00. +* Example: +* Original stream: 0x000000000000000000000001 +* Compressed stream: 0x01000901 +* Detail: 0x01 is the code, 0x00 is the key, +* 0x09 is the count of 0x00 bytes, +* 0x01 is the uncompressed byte. +* 0x02 --Compress by 0xFF. +* Example: +* Original stream: 0xFFFFFFFFFFFFFFFFFFFFFF01 +* Compressed stream: 0x02FF0901 +* Detail: 0x02 is the code, 0xFF is the key, +* 0x09 is the count of 0xFF bytes, +* 0x01 is the uncompressed byte. +* 0x03 +* : : +* 0xFE -- Compress by nibble blocks. +* Example: +* Original stream: 0x84210842108421084210 +* Compressed stream: 0x0584210 +* Detail: 0x05 is the code, means 5 nibbles block. +* 0x84210 is the 5 nibble blocks. +* The whole row is 80 bits given by g_usiDataSize. +* The number of times the block repeat itself +* is found by g_usiDataSize/(4*0x05) which is 4. +* 0xFF -- Compress by the most frequently happen byte. +* Example: +* Original stream: 0x04020401030904040404 +* Compressed stream: 0xFF04(0,1,0x02,0,1,0x01,1,0x03,1,0x09,0,0,0) +* or: 0xFF044090181C240 +* Detail: 0xFF is the code, 0x04 is the key. +* a bit of 0 represent the key shall be put into +* the current bit position and a bit of 1 +* represent copying the next of 8 bits of data +* in. +* +***************************************************************/ + +void ispVMData(unsigned char *ByteData) +{ + //09/11/07 NN added local variables initialization + unsigned short size = 0; + unsigned short i, j, m, getData = 0; + unsigned char cDataByte = 0; + unsigned char compress = 0; + unsigned short FFcount = 0; + unsigned char compr_char = 0xFF; + unsigned short index = 0; + signed char compression = 0; + + /*convert number in bits to bytes*/ + if (g_usiDataSize % 8 > 0) { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8 + 1); + } else { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8); + } + + /* If there is compression, then check if compress by key of 0x00 or 0xFF + or by other keys or by nibble blocks*/ + + if (g_usDataType & COMPRESS) { + compression = 1; + if (((compress = GetByte()) == VAR) && (g_usDataType & HEAP_IN)) { + getData = 1; + g_usDataType &= ~(HEAP_IN); + compress = GetByte(); + } + + switch (compress) { + case 0x00: + /* No compression */ + compression = 0; + break; + case 0x01: + /* Compress by byte 0x00 */ + compr_char = 0x00; + break; + case 0x02: + /* Compress by byte 0xFF */ + compr_char = 0xFF; + break; + case 0xFF: + /* Huffman encoding */ + compr_char = GetByte(); + i = 8; + for (index = 0; index < size; index++) { + ByteData[index] = 0x00; + if (i > 7) { + cDataByte = GetByte(); + i = 0; + } + if ((cDataByte << i++) & 0x80) + m = 8; + else { + ByteData[index] = compr_char; + m = 0; + } + + for (j = 0; j < m; j++) { + if (i > 7) { + cDataByte = GetByte(); + i = 0; + } + ByteData[index] |= ((cDataByte << i++) & 0x80) >> j; + } + } + size = 0; + break; + default: + for (index = 0; index < size; index++) + ByteData[index] = 0x00; + for (index = 0; index < compress; index++) { + if (index % 2 == 0) + cDataByte = GetByte(); + for (i = 0; i < size * 2 / compress; i++) { + //09/11/07 NN Type cast mismatch variables + j = (unsigned short)(index + (i * (unsigned short)compress)); + /*clear the nibble to zero first*/ + if (j % 2) { + if (index % 2) + ByteData[j / 2] |= cDataByte & 0x0F; + else + ByteData[j / 2] |= cDataByte >> 4; + } else { + if (index % 2) + ByteData[j / 2] |= cDataByte << 4; + else + ByteData[j / 2] |= cDataByte & 0xF0; + } + } + } + size = 0; + break; + } + } + + FFcount = 0; + + /* Decompress by byte 0x00 or 0xFF */ + for (index = 0; index < size; index++) { + if (FFcount <= 0) { + cDataByte = GetByte(); + if ((cDataByte == VAR) && (g_usDataType & HEAP_IN) && !getData && !(g_usDataType & COMPRESS)) { + getData = 1; + g_usDataType &= ~(HEAP_IN); + cDataByte = GetByte(); + } + ByteData[index] = cDataByte; + if ((compression) && (cDataByte == compr_char)) /*decompression is on*/ + //09/11/07 NN Type cast mismatch variables + FFcount = (unsigned short)ispVMDataSize(); /*The number of 0xFF or 0x00 bytes*/ + } else { + FFcount--; /*Use up the 0xFF chain first*/ + ByteData[index] = compr_char; + } + } + + if (getData) { + g_usDataType |= HEAP_IN; + getData = 0; + } +} + +/*************************************************************** +* +* ispVMShift +* +* Processes the SDR/XSDR/SIR commands. +* +***************************************************************/ + +signed char ispVMShift(signed char a_cCode) +{ + //09/11/07 NN added local variables initialization + unsigned short iDataIndex = 0; + unsigned short iReadLoop = 0; + signed char cRetCode = 0; + + cRetCode = 0; + //09/11/07 NN Type cast mismatch variables + g_usiDataSize = (unsigned short)ispVMDataSize(); + + g_usDataType &= ~(SIR_DATA + EXPRESS + SDR_DATA); /*clear the flags first*/ + + switch (a_cCode) { + case SIR: + g_usDataType |= SIR_DATA; + /* 1/15/04 If performing cascading, then go directly to SHIFTIR. Else, + go to IRPAUSE before going to SHIFTIR */ + if (g_usFlowControl & CASCADE) { + ispVMStateMachine(SHIFTIR); + } else { + ispVMStateMachine(IRPAUSE); + ispVMStateMachine(SHIFTIR); + if (g_usHeadIR > 0) { + ispVMBypass(HIR, g_usHeadIR); + sclock(); + } + } + break; + case XSDR: + g_usDataType |= EXPRESS; /*mark simultaneous in and out*/ + case SDR: + g_usDataType |= SDR_DATA; + /* 1/15/04 If already in SHIFTDR, then do not move state or shift in header. + This would imply that the previously shifted frame was a cascaded frame. */ + if (g_cCurrentJTAGState != SHIFTDR) { + /* 1/15/04 If performing cascading, then go directly to SHIFTDR. Else, + go to DRPAUSE before going to SHIFTDR */ + if (g_usFlowControl & CASCADE) { + if (g_cCurrentJTAGState == DRPAUSE) { + ispVMStateMachine(SHIFTDR); + /* 1/15/04 If cascade flag has been set and the current state is + DRPAUSE, this implies that the first cascaded frame is about to + be shifted in. The header must be shifted prior to shifting + the first cascaded frame. */ + if (g_usHeadDR > 0) { + ispVMBypass(HDR, g_usHeadDR); + sclock(); + } + } else { + ispVMStateMachine(SHIFTDR); + } + } else { + ispVMStateMachine(DRPAUSE); + ispVMStateMachine(SHIFTDR); + if (g_usHeadDR > 0) { + ispVMBypass(HDR, g_usHeadDR); + sclock(); + } + } + } + break; + default: + return (VME_INVALID_FILE); + } + + cRetCode = ispVMDataCode(); + if (cRetCode != 0) { + return (VME_INVALID_FILE); + } + +#ifdef VME_DEBUG + if (g_usDataType & TDI_DATA) { + printf("\n\t\tTDI "); + PrintData(g_usiDataSize, g_pucInData); + } + + if (g_usDataType & TDO_DATA) { + printf("\n\t\tTDO "); + PrintData(g_usiDataSize, g_pucOutData); + } + + if (g_usDataType & MASK_DATA) { + printf("\n\t\tMASK "); + PrintData(g_usiDataSize, g_pucOutMaskData); + } + + if (g_usDataType & DMASK_DATA) { + printf("\n\t\tDMASK "); + PrintData(g_usiDataSize, g_pucOutDMaskData); + } + + printf(";\n"); +#endif //VME_DEBUG + if (g_usDataType & TDO_DATA || g_usDataType & DMASK_DATA) { + if (g_usDataType & DMASK_DATA) { + + cRetCode = ispVMReadandSave(g_usiDataSize); + + if (!cRetCode) { + if (g_usTailDR > 0) { + sclock(); + ispVMBypass(TDR, g_usTailDR); + } + ispVMStateMachine(DRPAUSE); + ispVMStateMachine(SHIFTDR); + if (g_usHeadDR > 0) { + ispVMBypass(HDR, g_usHeadDR); + sclock(); + } + for (iDataIndex = 0; iDataIndex < g_usiDataSize / 8 + 1; iDataIndex++) + g_pucInData[iDataIndex] = g_pucOutData[iDataIndex]; + g_usDataType &= ~(TDO_DATA + DMASK_DATA); + cRetCode = ispVMSend(g_usiDataSize); + } + } else { + + cRetCode = ispVMRead(g_usiDataSize); + if (cRetCode == -1 && g_cVendor == XILINX) { + for (iReadLoop = 0; iReadLoop < 30; iReadLoop++) { + cRetCode = ispVMRead(g_usiDataSize); + if (!cRetCode) { + break; + } else { + ispVMStateMachine(DRPAUSE); /*Always DRPAUSE*/ + /*Bypass other devices when appropriate*/ + ispVMBypass(TDR, g_usTailDR); + ispVMStateMachine(g_ucEndDR); + ispVMStateMachine(IDLE); + ispVMDelay(1000); + } + } + } + } + } else { /*TDI only*/ + cRetCode = ispVMSend(g_usiDataSize); + + } + + /*transfer the input data to the output buffer for the next verify*/ + if ((g_usDataType & EXPRESS) || (a_cCode == SDR)) { + if (g_pucOutData) { + for (iDataIndex = 0; iDataIndex < g_usiDataSize / 8 + 1; iDataIndex++) + g_pucOutData[iDataIndex] = g_pucInData[iDataIndex]; + } + } + + switch (a_cCode) { + case SIR: + /* 1/15/04 If not performing cascading, then shift ENDIR */ + if (!(g_usFlowControl & CASCADE)) { + if (g_usTailIR > 0) { + sclock(); + ispVMBypass(TIR, g_usTailIR); + } + ispVMStateMachine(g_ucEndIR); + } + break; + case XSDR: + case SDR: + /* 1/15/04 If not performing cascading, then shift ENDDR */ + if (!(g_usFlowControl & CASCADE)) { + if (g_usTailDR > 0) { + sclock(); + ispVMBypass(TDR, g_usTailDR); + } + ispVMStateMachine(g_ucEndDR); + } + break; + default: + break; + } + + return (cRetCode); +} + +/*************************************************************** +* +* ispVMAmble +* +* This routine is to extract Header and Trailer parameter for SIR and +* SDR operations. +* +* The Header and Trailer parameter are the pre-amble and post-amble bit +* stream need to be shifted into TDI or out of TDO of the devices. Mostly +* is for the purpose of bypassing the leading or trailing devices. ispVM +* supports only shifting data into TDI to bypass the devices. +* +* For a single device, the header and trailer parameters are all set to 0 +* as default by ispVM. If it is for multiple devices, the header and trailer +* value will change as specified by the VME file. +* +***************************************************************/ + +signed char ispVMAmble(signed char Code) +{ + signed char compress = 0; + //09/11/07 NN Type cast mismatch variables + g_usiDataSize = (unsigned short)ispVMDataSize(); + +#ifdef VME_DEBUG + printf("%d", g_usiDataSize); +#endif //VME_DEBUG + + if (g_usiDataSize) { + + /**************************************************************************** + * + * Discard the TDI byte and set the compression bit in the data type register + * to false if compression is set because TDI data after HIR/HDR/TIR/TDR is not + * compressed. + * + *****************************************************************************/ + + GetByte(); + if (g_usDataType & COMPRESS) { + g_usDataType &= ~(COMPRESS); + compress = 1; + } + } + + switch (Code) { + case HIR: + + /**************************************************************************** + * + * Store the maximum size of the HIR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usHIRSize) { + g_usHIRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the HIR value and allocate memory. + * + *****************************************************************************/ + + g_usHeadIR = g_usiDataSize; + if (g_usHeadIR) { + ispVMMemManager(HIR, g_usHeadIR); + ispVMData(g_pucHIRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usHeadIR, g_pucHIRData); +#endif //VME_DEBUG + } + break; + case TIR: + + /**************************************************************************** + * + * Store the maximum size of the TIR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTIRSize) { + g_usTIRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the TIR value and allocate memory. + * + *****************************************************************************/ + + g_usTailIR = g_usiDataSize; + if (g_usTailIR) { + ispVMMemManager(TIR, g_usTailIR); + ispVMData(g_pucTIRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usTailIR, g_pucTIRData); +#endif //VME_DEBUG + } + break; + case HDR: + + /**************************************************************************** + * + * Store the maximum size of the HDR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usHDRSize) { + g_usHDRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the HDR value and allocate memory. + * + *****************************************************************************/ + + g_usHeadDR = g_usiDataSize; + if (g_usHeadDR) { + ispVMMemManager(HDR, g_usHeadDR); + ispVMData(g_pucHDRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usHeadDR, g_pucHDRData); +#endif //VME_DEBUG + } + break; + case TDR: + + /**************************************************************************** + * + * Store the maximum size of the TDR buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usiDataSize > g_usTDRSize) { + g_usTDRSize = g_usiDataSize; + } + + /**************************************************************************** + * + * Assign the TDR value and allocate memory. + * + *****************************************************************************/ + + g_usTailDR = g_usiDataSize; + if (g_usTailDR) { + ispVMMemManager(TDR, g_usTailDR); + ispVMData(g_pucTDRData); + +#ifdef VME_DEBUG + printf(" TDI "); + PrintData(g_usTailDR, g_pucTDRData); +#endif //VME_DEBUG + } + break; + default: + break; + } + + /**************************************************************************** + * + * Re-enable compression if it was previously set. + * + *****************************************************************************/ + + if (compress) { + g_usDataType |= COMPRESS; + } + + if (g_usiDataSize) { + Code = GetByte(); + if (Code == CONTINUE) { + return 0; + } else { + + /**************************************************************************** + * + * Encountered invalid opcode. + * + *****************************************************************************/ + + return VME_INVALID_FILE; + } + } + + return 0; +} + +/*************************************************************** +* +* ispVMLoop +* +* Perform the function call upon by the REPEAT opcode. +* Memory is to be allocated to store the entire loop from REPEAT to ENDLOOP. +* After the loop is stored then execution begin. The REPEATLOOP flag is set +* on the g_usFlowControl register to indicate the repeat loop is in session +* and therefore fetch opcode from the memory instead of from the file. +* +***************************************************************/ + +signed char ispVMLoop(unsigned short a_usLoopCount) +{ + //09/11/07 NN added local variables initialization + signed char cRetCode = 0; + unsigned short iHeapIndex = 0; + unsigned short iLoopIndex = 0; + + g_usShiftValue = 0; + for (iHeapIndex = 0; iHeapIndex < g_iHEAPSize; iHeapIndex++) { + g_pucHeapMemory[iHeapIndex] = GetByte(); + } + + if (g_pucHeapMemory[iHeapIndex - 1] != ENDLOOP) { + return (VME_INVALID_FILE); + } + + g_usFlowControl |= REPEATLOOP; + g_usDataType |= HEAP_IN; + + for (iLoopIndex = 0; iLoopIndex < a_usLoopCount; iLoopIndex++) { + g_iHeapCounter = 0; + cRetCode = ispVMCode(); + g_usRepeatLoops++; + if (cRetCode < 0) { + break; + } + } + + g_usDataType &= ~(HEAP_IN); + g_usFlowControl &= ~(REPEATLOOP); + return (cRetCode); +} + +/*************************************************************** +* +* ispVMBitShift +* +* Shift the TDI stream left or right by the number of bits. The data in +* *g_pucInData is of the VME format, so the actual shifting is the reverse of +* IEEE 1532 or SVF format. +* +***************************************************************/ + +signed char ispVMBitShift(signed char mode, unsigned short bits) +{ + //09/11/07 NN added local variables initialization + unsigned short i = 0; + unsigned short size = 0; + unsigned short tmpbits = 0; + + if (g_usiDataSize % 8 > 0) { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8 + 1); + } else { + //09/11/07 NN Type cast mismatch variables + size = (unsigned short)(g_usiDataSize / 8); + } + + switch (mode) { + case SHR: + for (i = 0; i < size; i++) { + if (g_pucInData[i] != 0) { + tmpbits = bits; + while (tmpbits > 0) { + g_pucInData[i] <<= 1; + if (g_pucInData[i] == 0) { + i--; + g_pucInData[i] = 1; + } + tmpbits--; + } + } + } + break; + case SHL: + for (i = 0; i < size; i++) { + if (g_pucInData[i] != 0) { + tmpbits = bits; + while (tmpbits > 0) { + g_pucInData[i] >>= 1; + if (g_pucInData[i] == 0) { + i--; + g_pucInData[i] = 8; + } + tmpbits--; + } + } + } + break; + default: + return (VME_INVALID_FILE); + } + + return (0); +} + +/*************************************************************** +* +* ispVMComment +* +* Displays the SVF comments. +* +***************************************************************/ + +void ispVMComment(unsigned short a_usCommentSize) +{ + char cCurByte = 0; + for (; a_usCommentSize > 0; a_usCommentSize--) { + /**************************************************************************** + * + * Print character to the terminal. + * + *****************************************************************************/ + cCurByte = GetByte(); + vme_out_char(cCurByte); + } + cCurByte = '\n'; + vme_out_char(cCurByte); +} + +/*************************************************************** +* +* ispVMHeader +* +* Iterate the length of the header and discard it. +* +***************************************************************/ + +void ispVMHeader(unsigned short a_usHeaderSize) +{ + for (; a_usHeaderSize > 0; a_usHeaderSize--) { + GetByte(); + } +} + +/*************************************************************** +* +* ispVMCalculateCRC32 +* +* Calculate the 32-bit CRC. +* +***************************************************************/ + +void ispVMCalculateCRC32(unsigned char a_ucData) +{ + //09/11/07 NN added local variables initialization + unsigned char ucIndex = 0; + unsigned char ucFlipData = 0; + unsigned short usCRCTableEntry = 0; + unsigned int crc_table[16] = { + 0x0000, 0xCC01, 0xD801, + 0x1400, 0xF001, 0x3C00, + 0x2800, 0xE401, 0xA001, + 0x6C00, 0x7800, 0xB401, + 0x5000, 0x9C01, 0x8801, + 0x4400 + }; + + for (ucIndex = 0; ucIndex < 8; ucIndex++) { + ucFlipData <<= 1; + if (a_ucData & 0x01) { + ucFlipData |= 0x01; + } + a_ucData >>= 1; + } + + //09/11/07 NN Type cast mismatch variables + usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]); + g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF); + g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^ usCRCTableEntry ^ crc_table[ucFlipData & 0xF]); + usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]); + g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF); + g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^ usCRCTableEntry ^ crc_table[(ucFlipData >> 4) & 0xF]); +} + +/*************************************************************** +* +* ispVMLCOUNT +* +* Process the intelligent programming loops. +* +***************************************************************/ + +signed char ispVMLCOUNT(unsigned short a_usCountSize) +{ + unsigned short usContinue = 1; + unsigned short usIntelBufferIndex = 0; + unsigned short usCountIndex = 0; + signed char cRetCode = 0; + signed char cRepeatHeap = 0; + signed char cOpcode = 0; + unsigned char ucState = 0; + unsigned short usDelay = 0; + unsigned short usToggle = 0; + + g_usIntelBufferSize = (unsigned short)ispVMDataSize(); + + /**************************************************************************** + * + * Allocate memory for intel buffer. + * + *****************************************************************************/ + + ispVMMemManager(LHEAP, g_usIntelBufferSize); + + /**************************************************************************** + * + * Store the maximum size of the intelligent buffer. Used to convert VME to HEX. + * + *****************************************************************************/ + + if (g_usIntelBufferSize > g_usLCOUNTSize) { + g_usLCOUNTSize = g_usIntelBufferSize; + } + + /**************************************************************************** + * + * Copy intel data to the buffer. + * + *****************************************************************************/ + + for (usIntelBufferIndex = 0; usIntelBufferIndex < g_usIntelBufferSize; usIntelBufferIndex++) { + g_pucIntelBuffer[usIntelBufferIndex] = GetByte(); + } + + /**************************************************************************** + * + * Set the data type register to get data from the intelligent data buffer. + * + *****************************************************************************/ + + g_usDataType |= LHEAP_IN; + + /**************************************************************************** + * + * If the HEAP_IN flag is set, temporarily unset the flag so data will be + * retrieved from the status buffer. + * + *****************************************************************************/ + + if (g_usDataType & HEAP_IN) { + g_usDataType &= ~HEAP_IN; + cRepeatHeap = 1; + } + +#ifdef VME_DEBUG + printf("LCOUNT %d;\n", a_usCountSize); +#endif //VME_DEBUG + + /**************************************************************************** + * + * Iterate through the intelligent programming command. + * + *****************************************************************************/ + + for (usCountIndex = 0; usCountIndex < a_usCountSize; usCountIndex++) { + + /**************************************************************************** + * + * Initialize the intel data index to 0 before each iteration. + * + *****************************************************************************/ + + g_usIntelDataIndex = 0; + cOpcode = 0; + ucState = 0; + usDelay = 0; + usToggle = 0; + usContinue = 1; + + /*************************************************************** + * + * Begin looping through all the VME opcodes. + * + ***************************************************************/ + /*************************************************************** + * 4/1/09 Nguyen replaced the recursive function call codes on + * the ispVMLCOUNT function + * + ***************************************************************/ + while (usContinue) { + cOpcode = GetByte(); + switch (cOpcode) { + case HIR: + case TIR: + case HDR: + case TDR: + /*************************************************************** + * + * Set the header/trailer of the device in order to bypass + * successfully. + * + ***************************************************************/ + + ispVMAmble(cOpcode); + break; + case STATE: + + /*************************************************************** + * + * Step the JTAG state machine. + * + ***************************************************************/ + + ucState = GetByte(); + /*************************************************************** + * + * Step the JTAG state machine to DRCAPTURE to support Looping. + * + ***************************************************************/ + + if ((g_usDataType & LHEAP_IN) && + (ucState == DRPAUSE) && + (g_cCurrentJTAGState == ucState)) { + ispVMStateMachine(DRCAPTURE); + } + ispVMStateMachine(ucState); +#ifdef VME_DEBUG + printf("LDELAY %s ", GetState(ucState)); +#endif //VME_DEBUG + break; + case SIR: +#ifdef VME_DEBUG + printf("SIR "); +#endif //VME_DEBUG + /*************************************************************** + * + * Shift in data into the device. + * + ***************************************************************/ + + cRetCode = ispVMShift(cOpcode); + break; + case SDR: + +#ifdef VME_DEBUG + printf("LSDR "); +#endif //VME_DEBUG + /*************************************************************** + * + * Shift in data into the device. + * + ***************************************************************/ + + cRetCode = ispVMShift(cOpcode); + break; + case WAIT: + + /*************************************************************** + * + * Observe delay. + * + ***************************************************************/ + + usDelay = (unsigned short)ispVMDataSize(); + ispVMDelay(usDelay); + +#ifdef VME_DEBUG + if (usDelay & 0x8000) { + + /*************************************************************** + * + * Since MSB is set, the delay time must be decoded to + * millisecond. The SVF2VME encodes the MSB to represent + * millisecond. + * + ***************************************************************/ + + usDelay &= ~0x8000; + printf("%.2E SEC;\n", (float)usDelay / 1000); + } else { + + /*************************************************************** + * + * Since MSB is not set, the delay time is given as microseconds. + * + ***************************************************************/ + + printf("%.2E SEC;\n", (float)usDelay / 1000000); + } +#endif //VME_DEBUG + break; + case TCK: + + /*************************************************************** + * + * Issue clock toggles. + * + ***************************************************************/ + + usToggle = (unsigned short)ispVMDataSize(); + ispVMClocks(usToggle); + +#ifdef VME_DEBUG + printf("RUNTEST %d TCK;\n", usToggle); +#endif //VME_DEBUG + break; + case ENDLOOP: + + /*************************************************************** + * + * Exit point from processing loops. + * + ***************************************************************/ + usContinue = 0; + break; + + case COMMENT: + + /*************************************************************** + * + * Display comment. + * + ***************************************************************/ + + ispVMComment((unsigned short)ispVMDataSize()); + break; + case ispEN: + ucState = GetByte(); + if ((ucState == ON) || (ucState == 0x01)) + writePort(JTAG_ENABLE, 0x01); + else + writePort(JTAG_ENABLE, 0x00); + ispVMDelay(1); + break; + case TRST: + if (GetByte() == 0x01) + writePort(JTAG_TRST, 0x01); + else + writePort(JTAG_TRST, 0x00); + ispVMDelay(1); + break; + default: + + /*************************************************************** + * + * Invalid opcode encountered. + * + ***************************************************************/ + +#ifdef VME_DEBUG + printf("\nINVALID OPCODE: 0x%.2X\n", cOpcode); +#endif //VME_DEBUG + + return VME_INVALID_FILE; + } + } + if (cRetCode >= 0) { + /**************************************************************************** + * + * Break if intelligent programming is successful. + * + *****************************************************************************/ + + break; + } + + } + /**************************************************************************** + * + * If HEAP_IN flag was temporarily disabled, re-enable it before exiting. + * + *****************************************************************************/ + + if (cRepeatHeap) { + g_usDataType |= HEAP_IN; + } + + /**************************************************************************** + * + * Set the data type register to not get data from the intelligent data buffer. + * + *****************************************************************************/ + + g_usDataType &= ~LHEAP_IN; + return cRetCode; +} + +/*************************************************************** +* +* ispVMClocks +* +* Applies the specified number of pulses to TCK. +* +***************************************************************/ + +void ispVMClocks(unsigned short Clocks) +{ + unsigned short iClockIndex = 0; + for (iClockIndex = 0; iClockIndex < Clocks; iClockIndex++) { + sclock(); + } +} + +/*************************************************************** +* +* ispVMBypass +* +* This procedure takes care of the HIR, HDR, TIR, TDR for the +* purpose of putting the other devices into Bypass mode. The +* current state is checked to find out if it is at DRPAUSE or +* IRPAUSE. If it is at DRPAUSE, perform bypass register scan. +* If it is at IRPAUSE, scan into instruction registers the bypass +* instruction. +* +***************************************************************/ + +void ispVMBypass(signed char ScanType, unsigned short Bits) +{ + //09/11/07 NN added local variables initialization + unsigned short iIndex = 0; + unsigned short iSourceIndex = 0; + unsigned char cBitState = 0; + unsigned char cCurByte = 0; + unsigned char *pcSource = NULL; + + if (Bits <= 0) { + return; + } + + switch (ScanType) { + case HIR: + pcSource = g_pucHIRData; + break; + case TIR: + pcSource = g_pucTIRData; + break; + case HDR: + pcSource = g_pucHDRData; + break; + case TDR: + pcSource = g_pucTDRData; + break; + default: + break; + } + if (pcSource) { + iSourceIndex = 0; + cBitState = 0; + for (iIndex = 0; iIndex < Bits - 1; iIndex++) { + /* Scan instruction or bypass register */ + if (iIndex % 8 == 0) { + cCurByte = pcSource[iSourceIndex++]; + } + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + writePort(JTAG_TDI, cBitState); + sclock(); + } + + if (iIndex % 8 == 0) { + cCurByte = pcSource[iSourceIndex++]; + } + + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + writePort(JTAG_TDI, cBitState); + } +} + +/*************************************************************** +* +* ispVMStateMachine +* +* This procedure steps all devices in the daisy chain from a given +* JTAG state to the next desirable state. If the next state is TLR, +* the JTAG state machine is brute forced into TLR by driving TMS +* high and pulse TCK 6 times. +* +***************************************************************/ + +void ispVMStateMachine(signed char cNextJTAGState) +{ + //09/11/07 NN added local variables initialization + signed char cPathIndex = 0; + signed char cStateIndex = 0; + short int found = 0; + + if ((g_cCurrentJTAGState == cNextJTAGState) && (cNextJTAGState != RESET)) { + return; + } + + for (cStateIndex = 0; cStateIndex < 25; cStateIndex++) { + if ((g_cCurrentJTAGState == g_JTAGTransistions[cStateIndex].CurState) && (cNextJTAGState == g_JTAGTransistions[cStateIndex].NextState)) { + found = 1; + break; + } + } + if (found) { + g_cCurrentJTAGState = cNextJTAGState; + for (cPathIndex = 0; cPathIndex < g_JTAGTransistions[cStateIndex].Pulses; cPathIndex++) { + if ((g_JTAGTransistions[cStateIndex].Pattern << cPathIndex) & 0x80) { + writePort(JTAG_TMS, (unsigned char)0x01); + } else { + writePort(JTAG_TMS, (unsigned char)0x00); + } + sclock(); + } + + writePort(JTAG_TDI, 0x00); + writePort(JTAG_TMS, 0x00); + } +} + +/*************************************************************** +* +* ispVMStart +* +* Enable the port to the device and set the state to RESET (TLR). +* +***************************************************************/ + +void ispVMStart() +{ +#ifdef VME_DEBUG + printf("// ISPVM EMBEDDED ADDED\n"); + printf("STATE RESET;\n"); +#endif + + ispVMStateMachine(RESET); /*step devices to RESET state*/ + +} + +/*************************************************************** +* +* ispVMEnd +* +* Set the state of devices to RESET to enable the devices and disable +* the port. +* +***************************************************************/ + +void ispVMEnd() +{ +#ifdef VME_DEBUG + printf("// ISPVM EMBEDDED ADDED\n"); + printf("STATE RESET;\n"); + printf("RUNTEST 1.00E-001 SEC;\n"); +#endif + + ispVMStateMachine(RESET); /*step devices to RESET state */ + ispVMDelay(1000); /*wake up devices*/ +} + +/*************************************************************** +* +* ispVMSend +* +* Send the TDI data stream to devices. The data stream can be +* instructions or data. +* +***************************************************************/ + +signed char ispVMSend(unsigned short a_usiDataSize) +{ + //09/11/07 NN added local variables initialization + unsigned short iIndex = 0; + unsigned short iInDataIndex = 0; + unsigned char cCurByte = 0; + unsigned char cBitState = 0; + + for (iIndex = 0; iIndex < a_usiDataSize - 1; iIndex++) { + if (iIndex % 8 == 0) { + cCurByte = g_pucInData[iInDataIndex++]; + } + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + writePort(JTAG_TDI, cBitState); + sclock(); + } + + if (iIndex % 8 == 0) { + /* Take care of the last bit */ + cCurByte = g_pucInData[iInDataIndex]; + } + + cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80) ? 0x01 : 0x00); + + writePort(JTAG_TDI, cBitState); + if (g_usFlowControl & CASCADE) { + /* 1/15/04 Clock in last bit for the first n-1 cascaded frames */ + sclock(); + } + + return 0; +} + +/*************************************************************** +* +* ispVMRead +* +* Read the data stream from devices and verify. +* +***************************************************************/ + +signed char ispVMRead(unsigned short a_usiDataSize) //32 +{ + //09/11/07 NN added local variables initialization + unsigned short usDataSizeIndex = 0; + unsigned short usErrorCount = 0; + unsigned short usLastBitIndex = 0; + unsigned char cDataByte = 0; + unsigned char cMaskByte = 0; + unsigned char cInDataByte = 0; + unsigned char cCurBit = 0; + unsigned char cByteIndex = 0; + unsigned short usBufferIndex = 0; + unsigned char ucDisplayByte = 0x00; + unsigned char ucDisplayFlag = 0x01; + char StrChecksum[256] = { 0 }; + unsigned char g_usCalculateChecksum = 0x00; + + //09/11/07 NN Type cast mismatch variables + usLastBitIndex = (unsigned short)(a_usiDataSize - 1); + + /**************************************************************************** + * + * If mask is not all zeros, then set the display flag to 0x00, otherwise + * it shall be set to 0x01 to indicate that data read from the device shall + * be displayed. If VME_DEBUG is defined, always display data. + * + *****************************************************************************/ + + for (usDataSizeIndex = 0; usDataSizeIndex < (a_usiDataSize + 7) / 8; usDataSizeIndex++) { + + if (g_usDataType & MASK_DATA) { + if (g_pucOutMaskData[usDataSizeIndex] != 0x00) { + ucDisplayFlag = 0x00; + break; + } + } else if (g_usDataType & CMASK_DATA) { + g_usCalculateChecksum = 0x01; + ucDisplayFlag = 0x00; + break; + } else { + ucDisplayFlag = 0x00; + break; + } + } + + /**************************************************************************** + * + * Begin shifting data in and out of the device. + * + *****************************************************************************/ + for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize; usDataSizeIndex++) { + if (cByteIndex == 0) { + + /*************************************************************** + * + * Grab byte from TDO buffer. + * + ***************************************************************/ + + if (g_usDataType & TDO_DATA) { + cDataByte = g_pucOutData[usBufferIndex]; + } + + /*************************************************************** + * + * Grab byte from MASK buffer. + * + ***************************************************************/ + + if (g_usDataType & MASK_DATA) { + cMaskByte = g_pucOutMaskData[usBufferIndex]; + } else { + cMaskByte = 0xFF; + } + + /*************************************************************** + * + * Grab byte from CMASK buffer. + * + ***************************************************************/ + + if (g_usDataType & CMASK_DATA) { + cMaskByte = 0x00; + g_usCalculateChecksum = 0x01; + } + + /*************************************************************** + * + * Grab byte from TDI buffer. + * + ***************************************************************/ + + if (g_usDataType & TDI_DATA) { + cInDataByte = g_pucInData[usBufferIndex]; + } + + usBufferIndex++; + } + + cCurBit = readPort(); + + if (ucDisplayFlag) { + ucDisplayByte <<= 1; + ucDisplayByte |= cCurBit; + } + + /**************************************************************************** + * + * Check if data read from port matches with expected TDO. + * + *****************************************************************************/ + + if (g_usDataType & TDO_DATA) { + //08/28/08 NN Added Calculate checksum support. + if (g_usCalculateChecksum) { + if (cCurBit == 0x01) + g_usChecksum += (1 << (g_uiChecksumIndex % 8)); + g_uiChecksumIndex++; + } else { + if ((((cMaskByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) { + if (cCurBit != (unsigned char)(((cDataByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) { + usErrorCount++; + } + } + } + } + + /**************************************************************************** + * + * Write TDI data to the port. + * + *****************************************************************************/ + + writePort(JTAG_TDI, (unsigned char)(((cInDataByte << cByteIndex) & 0x80) ? 0x01 : 0x00)); + + if (usDataSizeIndex < usLastBitIndex) { + + /**************************************************************************** + * + * Clock data out from the data shift register. + * + *****************************************************************************/ + + sclock(); + } else if (g_usFlowControl & CASCADE) { + + /**************************************************************************** + * + * Clock in last bit for the first N - 1 cascaded frames. + * + *****************************************************************************/ + + sclock(); + } + + /*************************************************************** + * + * Increment the byte index. If it exceeds 7, then reset it back + * to zero. + * + ***************************************************************/ + + cByteIndex++; + if (cByteIndex >= 8) { + if (ucDisplayFlag) { + + /*************************************************************** + * + * Store displayed data in the TDO buffer. By reusing the TDO + * buffer to store displayed data, there is no need to allocate + * a buffer simply to hold display data. This will not cause any + * false verification errors because the true TDO byte has already + * been consumed. + * + ***************************************************************/ + + g_pucOutData[usBufferIndex - 1] = ucDisplayByte; + ucDisplayByte = 0; + } + + cByteIndex = 0; + } + //09/12/07 Nguyen changed to display the 1 bit expected data + else if (a_usiDataSize == 1) { + if (ucDisplayFlag) { + + /*************************************************************** + * + * Store displayed data in the TDO buffer. By reusing the TDO + * buffer to store displayed data, there is no need to allocate + * a buffer simply to hold display data. This will not cause any + * false verification errors because the true TDO byte has already + * been consumed. + * + ***************************************************************/ + + /**************************************************************************** + * + * Flip ucDisplayByte and store it in cDataByte. + * + *****************************************************************************/ + cDataByte = 0x00; + for (usBufferIndex = 0; usBufferIndex < 8; usBufferIndex++) { + cDataByte <<= 1; + if (ucDisplayByte & 0x01) { + cDataByte |= 0x01; + } + ucDisplayByte >>= 1; + } + g_pucOutData[0] = cDataByte; + ucDisplayByte = 0; + } + + cByteIndex = 0; + } + } + if (ucDisplayFlag) { + + /**************************************************************************** + * + * Display data read from the device. + * + *****************************************************************************/ + +#ifdef VME_DEBUG + printf("RECIEVED TDO ("); +#else + vme_out_string("Display Data: 0x"); +#endif //VME_DEBUG + + //09/11/07 NN Type cast mismatch variables + for (usDataSizeIndex = (unsigned short)((a_usiDataSize + 7) / 8); usDataSizeIndex > 0; usDataSizeIndex--) { + cMaskByte = g_pucOutData[usDataSizeIndex - 1]; + cDataByte = 0x00; + + /**************************************************************************** + * + * Flip cMaskByte and store it in cDataByte. + * + *****************************************************************************/ + + for (usBufferIndex = 0; usBufferIndex < 8; usBufferIndex++) { + cDataByte <<= 1; + if (cMaskByte & 0x01) { + cDataByte |= 0x01; + } + cMaskByte >>= 1; + } +#ifdef VME_DEBUG + printf("%.2X", cDataByte); + if ((((a_usiDataSize + 7) / 8) - usDataSizeIndex) % 40 == 39) { + printf("\n\t\t"); + } +#else + vme_out_hex(cDataByte); +#endif //VME_DEBUG + } + +#ifdef VME_DEBUG + printf(")\n\n"); +#else + vme_out_string("\n\n"); +#endif //VME_DEBUG + //09/02/08 Nguyen changed to display the data Checksum + vme_out_string("g_usChecksum:"); + sprintf(StrChecksum, "%.4X\n\n", (unsigned int)g_usChecksum); + vme_out_string(StrChecksum); + vme_out_string("\n\n"); + if (g_usChecksum != 0) { + g_usChecksum &= 0xFFFF; + sprintf(StrChecksum, "Data Checksum: %.4X\n\n", (unsigned int)g_usChecksum); + vme_out_string(StrChecksum); + g_usChecksum = 0; + } + } + + if (usErrorCount > 0) { + + if (g_usFlowControl & VERIFYUES) { + vme_out_string("USERCODE verification failed. Continue programming......\n\n"); + g_usFlowControl &= ~(VERIFYUES); + return 0; + } else { + +#ifdef VME_DEBUG + printf("TOTAL ERRORS: %d\n", usErrorCount); +#endif //VME_DEBUG + + return VME_VERIFICATION_FAILURE; + } + } else { + if (g_usFlowControl & VERIFYUES) { + vme_out_string("USERCODE verification passed. Programming aborted. \n\n"); + g_usFlowControl &= ~(VERIFYUES); + return 1; + } else { + return 0; + } + } +} + +/*************************************************************** +* +* ispVMReadandSave +* +* Support dynamic I/O. +* +***************************************************************/ + +signed char ispVMReadandSave(unsigned short int a_usiDataSize) +{ + //09/11/07 NN added local variables initialization + unsigned short int usDataSizeIndex = 0; + unsigned short int usLastBitIndex = 0; + unsigned short int usBufferIndex = 0; + unsigned short int usOutBitIndex = 0; + unsigned short int usLVDSIndex = 0; + unsigned char cDataByte = 0; + unsigned char cDMASKByte = 0; + unsigned char cInDataByte = 0; + unsigned char cCurBit = 0; + unsigned char cByteIndex = 0; + signed char cLVDSByteIndex = 0; + + //09/11/07 NN Type cast mismatch variables + usLastBitIndex = (unsigned short)(a_usiDataSize - 1); + + /*************************************************************** + * + * Iterate through the data bits. + * + ***************************************************************/ + + for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize; usDataSizeIndex++) { + if (cByteIndex == 0) { + + /*************************************************************** + * + * Grab byte from DMASK buffer. + * + ***************************************************************/ + + if (g_usDataType & DMASK_DATA) { + cDMASKByte = g_pucOutDMaskData[usBufferIndex]; + } else { + cDMASKByte = 0x00; + } + + /*************************************************************** + * + * Grab byte from TDI buffer. + * + ***************************************************************/ + + if (g_usDataType & TDI_DATA) { + cInDataByte = g_pucInData[usBufferIndex]; + } + + usBufferIndex++; + } + + cCurBit = readPort(); + cDataByte = (unsigned char)(((cInDataByte << cByteIndex) & 0x80) ? 0x01 : 0x00); + + /*************************************************************** + * + * Initialize the byte to be zero. + * + ***************************************************************/ + + if (usOutBitIndex % 8 == 0) { + g_pucOutData[usOutBitIndex / 8] = 0x00; + } + + /*************************************************************** + * + * Use TDI, DMASK, and device TDO to create new TDI (actually + * stored in g_pucOutData). + * + ***************************************************************/ + + if ((((cDMASKByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) { + + if (g_pLVDSList) { + for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) { + if (g_pLVDSList[usLVDSIndex].usNegativeIndex == usDataSizeIndex) { + g_pLVDSList[usLVDSIndex].ucUpdate = 0x01; + break; + } + } + } + + /*************************************************************** + * + * DMASK bit is 1, use TDI. + * + ***************************************************************/ + + g_pucOutData[usOutBitIndex / 8] |= (unsigned char)(((cDataByte & 0x1) ? 0x01 : 0x00) << (7 - usOutBitIndex % 8)); + } else { + + /*************************************************************** + * + * DMASK bit is 0, use device TDO. + * + ***************************************************************/ + + g_pucOutData[usOutBitIndex / 8] |= (unsigned char)(((cCurBit & 0x1) ? 0x01 : 0x00) << (7 - usOutBitIndex % 8)); + } + + /*************************************************************** + * + * Shift in TDI in order to get TDO out. + * + ***************************************************************/ + + usOutBitIndex++; + writePort(JTAG_TDI, cDataByte); + if (usDataSizeIndex < usLastBitIndex) { + sclock(); + } + + /*************************************************************** + * + * Increment the byte index. If it exceeds 7, then reset it back + * to zero. + * + ***************************************************************/ + + cByteIndex++; + if (cByteIndex >= 8) { + cByteIndex = 0; + } + } + + /*************************************************************** + * + * If g_pLVDSList exists and pairs need updating, then update + * the negative-pair to receive the flipped positive-pair value. + * + ***************************************************************/ + + if (g_pLVDSList) { + for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) { + if (g_pLVDSList[usLVDSIndex].ucUpdate) { + + /*************************************************************** + * + * Read the positive value and flip it. + * + ***************************************************************/ + + cDataByte = (unsigned char)(((g_pucOutData[g_pLVDSList[usLVDSIndex].usPositiveIndex / 8] << (g_pLVDSList[usLVDSIndex].usPositiveIndex % 8)) & 0x80) ? 0x01 : 0x00); + //09/11/07 NN Type cast mismatch variables + cDataByte = (unsigned char)(!cDataByte); + + /*************************************************************** + * + * Get the byte that needs modification. + * + ***************************************************************/ + + cInDataByte = g_pucOutData[g_pLVDSList[usLVDSIndex].usNegativeIndex / 8]; + + if (cDataByte) { + + /*************************************************************** + * + * Copy over the current byte and set the negative bit to 1. + * + ***************************************************************/ + + cDataByte = 0x00; + for (cLVDSByteIndex = 7; cLVDSByteIndex >= 0; cLVDSByteIndex--) { + cDataByte <<= 1; + if (7 - (g_pLVDSList[usLVDSIndex].usNegativeIndex % 8) == cLVDSByteIndex) { + + /*************************************************************** + * + * Set negative bit to 1. + * + ***************************************************************/ + + cDataByte |= 0x01; + } else if (cInDataByte & 0x80) { + cDataByte |= 0x01; + } + + cInDataByte <<= 1; + } + + /*************************************************************** + * + * Store the modified byte. + * + ***************************************************************/ + + g_pucOutData[g_pLVDSList[usLVDSIndex].usNegativeIndex / 8] = cDataByte; + } else { + + /*************************************************************** + * + * Copy over the current byte and set the negative bit to 0. + * + ***************************************************************/ + + cDataByte = 0x00; + for (cLVDSByteIndex = 7; cLVDSByteIndex >= 0; cLVDSByteIndex--) { + cDataByte <<= 1; + if (7 - (g_pLVDSList[usLVDSIndex].usNegativeIndex % 8) == cLVDSByteIndex) { + + /*************************************************************** + * + * Set negative bit to 0. + * + ***************************************************************/ + + cDataByte |= 0x00; + } else if (cInDataByte & 0x80) { + cDataByte |= 0x01; + } + + cInDataByte <<= 1; + } + + /*************************************************************** + * + * Store the modified byte. + * + ***************************************************************/ + + g_pucOutData[g_pLVDSList[usLVDSIndex].usNegativeIndex / 8] = cDataByte; + } + + break; + } + } + } + + return (0); +} + +signed char ispVMProcessLVDS(unsigned short a_usLVDSCount) +{ + unsigned short usLVDSIndex = 0; + + /*************************************************************** + * + * Allocate memory to hold LVDS pairs. + * + ***************************************************************/ + + ispVMMemManager(LVDS, a_usLVDSCount); + g_usLVDSPairCount = a_usLVDSCount; + +#ifdef VME_DEBUG + printf("LVDS %d (", a_usLVDSCount); +#endif //VME_DEBUG + + /*************************************************************** + * + * Iterate through each given LVDS pair. + * + ***************************************************************/ + + for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) { + + /*************************************************************** + * + * Assign the positive and negative indices of the LVDS pair. + * + ***************************************************************/ + + //09/11/07 NN Type cast mismatch variables + g_pLVDSList[usLVDSIndex].usPositiveIndex = (unsigned short)ispVMDataSize(); + //09/11/07 NN Type cast mismatch variables + g_pLVDSList[usLVDSIndex].usNegativeIndex = (unsigned short)ispVMDataSize(); + +#ifdef VME_DEBUG + if (usLVDSIndex < g_usLVDSPairCount - 1) { + printf("%d:%d, ", g_pLVDSList[usLVDSIndex].usPositiveIndex, g_pLVDSList[usLVDSIndex].usNegativeIndex); + } else { + printf("%d:%d", g_pLVDSList[usLVDSIndex].usPositiveIndex, g_pLVDSList[usLVDSIndex].usNegativeIndex); + } +#endif //VME_DEBUG + + } + +#ifdef VME_DEBUG + printf(") -- %d;\n", a_usLVDSCount); +#endif //VME_DEBUG + + return (0); +} + +/*************************************************************** +* +* ivm_core_reinit +* +* Reinit ivm_core variables. +* +***************************************************************/ +void ivm_core_reinit() +{ + g_usFlowControl = 0x0000; + g_usDataType = 0x0000; + + g_ucEndDR = DRPAUSE; + g_ucEndIR = IRPAUSE; + + g_usHeadDR = 0; + g_usHeadIR = 0; + g_usTailDR = 0; + g_usTailIR = 0; + + g_usiDataSize = 0; + + g_iFrequency = 1000; + + g_usMaxSize = 0; + + g_usShiftValue = 0; + + g_usRepeatLoops = 0; + + g_cVendor = LATTICE; + + g_usCalculatedCRC = 0; + + g_usChecksum = 0; + g_uiChecksumIndex = 0; + + g_cCurrentJTAGState = 0; + + g_pucHeapMemory = NULL; + g_iHeapCounter = 0; + g_iHEAPSize = 0; + + g_usIntelDataIndex = 0; + g_usIntelBufferSize = 0; + + g_usTDOSize = 0; + g_usMASKSize = 0; + g_usTDISize = 0; + g_usDMASKSize = 0; + g_usLCOUNTSize = 0; + g_usHDRSize = 0; + g_usTDRSize = 0; + g_usHIRSize = 0; + g_usTIRSize = 0; + g_usHeapSize = 0; + + g_pucOutMaskData = NULL; + g_pucInData = NULL; + g_pucOutData = NULL; + g_pucHIRData = NULL; + g_pucTIRData = NULL; + g_pucHDRData = NULL; + g_pucTDRData = NULL; + g_pucIntelBuffer = NULL; + g_pucOutDMaskData = NULL; + + g_pLVDSList = NULL; + g_usLVDSPairCount = 0; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c new file mode 100644 index 0000000000..c252dfde7c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_isc/firmware_upgrade_isc.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * firmware_upgrade_jtag + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_jtag(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret; + cmd_info_t cmd_info; + + cmd_info.size = size; + cmd_info.data = buf; + ret = 0; + + if (info->type == FIRMWARE_CPLD) { + /* 0x4A,0x41,0x4D,0x01 is JBI file */ + if (buf[0] == 0x4A && buf[1] == 0x41 && buf[2] == 0x4D && buf[3] == 0x01) { + dbg_print(is_debug_on, "Use jbi file.\n"); + ret = ioctl(fd, FIRMWARE_PROGRAM_JBI, &cmd_info); + } else { + dbg_print(is_debug_on, "Use isc file.\n"); + ret = ioctl(fd, FIRMWARE_PROGRAM, &cmd_info); + } + } + + if (info->type == FIRMWARE_FPGA) { + ret = ioctl(fd, FIRMWARE_PROGRAM, &cmd_info); + } + + if (ret < 0) { + return FIRMWARE_FAILED; + } + + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_jtag_test + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_jtag_test(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + return FIRMWARE_SUCCESS; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c new file mode 100644 index 0000000000..0a7659f0e4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.c @@ -0,0 +1,446 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "firmware_upgrade_mtd.h" +#include "mtd-abi.h" + +static int get_mtdnum_from_name(char *name, int *mtdnum) +{ + FILE *fp; + int ret; + char buf[PATH_LEN]; + char *start; + char *end; + char *key_w = "mtd"; + + if (name == NULL || mtdnum == NULL) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return -EINVAL; + } + ret = 0; + *mtdnum = -1; + fp = fopen("/proc/mtd", "r"); + if (fp == NULL) { + dbg_print(is_debug_on, "Not find mtd device.\n"); + return -FIRWMARE_MTD_PART_INFO_ERR; + } + + mem_clear(buf, sizeof(buf)); + while(fgets(buf, sizeof(buf), fp)) { + if (strstr(buf, name) != NULL) { + start = strstr(buf, key_w); + if (start == NULL) { + dbg_print(is_debug_on, "/proc/mtd don't find %s.\n", key_w); + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } + start += strlen(key_w); + end = strchr(start, ':'); + if (end == NULL) { + dbg_print(is_debug_on, "/proc/mtd don't find %c.\n", ':'); + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } + + *end = '\0'; + *mtdnum = atoi(start); + if (*mtdnum < 0) { + dbg_print(is_debug_on, "Not get mtd num.\n"); + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } + } + } + + if (*mtdnum == -1) { + ret = -FIRWMARE_MTD_PART_INFO_ERR; + goto exit; + } +exit: + if (fp != NULL) { + fclose(fp); + } + + return ret; +} + +static int firmware_sysfs_get_dev_info(int fd, firmware_mtd_info_t *dev_info) +{ + int ret; + + ret = ioctl(fd, FIRMWARE_SYSFS_MTD_INFO, dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to get upg device file info.\n"); + return ret; + } + + dbg_print(is_debug_on, "mtd_name=%s flash_base=0x%x test_base=0x%x test_size=%d.\n", + dev_info->mtd_name, dev_info->flash_base, dev_info->test_base, dev_info->test_size); + return 0; +} + +/* + * MEMGETINFO + */ +static int getmeminfo(int fd, struct mtd_info_user *mtd) +{ + return ioctl(fd, MEMGETINFO, mtd); +} + +/* + * MEMERASE + */ +static int memerase(int fd, struct erase_info_user *erase) +{ + return ioctl(fd, MEMERASE, erase); +} + +static int erase_flash(int fd, uint32_t offset, uint32_t bytes) +{ + int err; + struct erase_info_user erase; + erase.start = offset; + erase.length = bytes; + err = memerase(fd, &erase); + if (err < 0) { + dbg_print(is_debug_on, "Error: memerase failed, err=%d\n", err); + return -FIRWMARE_MTD_MEMERASE; + } + dbg_print(is_debug_on, "Erased %d bytes from address 0x%.8x in flash\n", bytes, offset); + return 0; +} + +/* + * firmware_upgrade_mtd_block + * function: upgrade mtd device block + * @dev_info: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_upgrade_mtd_block(int mtd_fd, uint32_t offset, + uint8_t *buf, uint32_t size, uint32_t erasesize) +{ + int ret; + int i; + uint8_t *reread_buf; + uint32_t cmp_retry, reread_len, write_len; + + /* Read back data */ + reread_buf = (uint8_t *) malloc(size); + if (reread_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for read back data buf, size=%d.\n", size); + return FIRMWARE_FAILED; + } + + for (cmp_retry = 0; cmp_retry < FW_SYSFS_RETRY_TIME; cmp_retry++) { + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + if (offset != lseek(mtd_fd, offset, SEEK_SET)) { + dbg_print(is_debug_on, "Error:lseek mtd offset=%x retrytimes=%d failed.\n", offset, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + + dbg_print(is_debug_on, "erase mtd offset=0x%x erasesize=%d retrytimes=%d.\n", + offset, erasesize, i); + ret = erase_flash(mtd_fd, offset, erasesize); + if (ret < 0) { + dbg_print(is_debug_on, "Error:erase mtd offset=%x size=%d retrytimes=%d failed, ret=%d\n", + offset, size, i, ret); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + + dbg_print(is_debug_on, "write mtd offset=0x%x size=%d retrytimes=%d.\n", + offset, size, i); + write_len = write(mtd_fd, buf, size); + if (write_len != size) { + dbg_print(is_debug_on, "Error:write mtd offset=0x%x size=%d write_len=%d retrytimes=%d.\n", + offset, size, write_len, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "Error: upgrade mtd fail, offset = 0x%x, size = %d\n", offset, size); + free(reread_buf); + return FIRMWARE_FAILED; + } + + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + dbg_print(is_debug_on, "Reread mtd offset=0x%x size=%d\n", offset, size); + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + if (offset != lseek(mtd_fd, offset, SEEK_SET)) { + dbg_print(is_debug_on, "Error:lseek mtd offset=%x retrytimes=%d failed.\n", offset, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + + reread_len = read(mtd_fd, reread_buf, size); + if (reread_len != size) { + dbg_print(is_debug_on, "Error:reread mtd offset=0x%x size=%d reread_len=%d retrytimes=%d.\n", + offset, size, reread_len, i); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "Error: reread mtd fail, offset = 0x%x size = %d\n", offset, size); + free(reread_buf); + return FIRMWARE_FAILED; + } + + /* Check data */ + if (memcmp(reread_buf, buf, size) != 0) { + dbg_print(is_debug_on, "memcmp mtd fail,offset = 0x%x retrytimes = %d\n", offset, cmp_retry); + } else { + break; + } + } + if (cmp_retry >= FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "upgrade mtd fail, offset = 0x%x.\n", offset); + dbg_print(is_debug_on, "want to write buf :\n"); + for (i = 0; i < size; i++) { + dbg_print(is_debug_on, "0x%x ", buf[i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + dbg_print(is_debug_on, "actually reread buf :\n"); + for (i = 0; i < size; i++) { + dbg_print(is_debug_on, "0x%x ", reread_buf[i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + free(reread_buf); + return FIRMWARE_FAILED; + } + + free(reread_buf); + dbg_print(is_debug_on, "firmware upgrade mtd block offset[0x%.8x] success.\n", offset); + return FIRMWARE_SUCCESS; +} + +/* + * firmware_upgrade_mtd_program + * function: upgrade mtd device + * @dev_info: param[in] Device file descriptor + * @flash_base: param[in] Upgrade the flash start address + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +static int firmware_upgrade_mtd_program(firmware_mtd_info_t *dev_info, + int flash_base, uint8_t *buf, uint32_t size) +{ + int ret; + int mtdnum; + char dev_mtd[PATH_LEN]; + int mtd_fd; + uint32_t offset, len, block_size; + struct mtd_info_user mtd_info; + uint8_t *data_point; + + ret = get_mtdnum_from_name(dev_info->mtd_name, &mtdnum); + if (ret < 0) { + dbg_print(is_debug_on, "Error:not find %s mtd num.\n", dev_info->mtd_name); + return FIRMWARE_FAILED; + } + + mem_clear(dev_mtd, sizeof(dev_mtd)); + snprintf(dev_mtd, sizeof(dev_mtd) - 1, "/dev/mtd%d", mtdnum); + + mtd_fd = open(dev_mtd, O_SYNC | O_RDWR); + if (mtd_fd < 0) { + dbg_print(is_debug_on, "Error:open %s failed.\n", dev_mtd); + goto err; + } + + ret = getmeminfo(mtd_fd, &mtd_info); + if (ret < 0) { + dbg_print(is_debug_on, "Error:get mtd info failed, ret=%d.\n", ret); + goto failed; + } + + offset = flash_base; + if (offset >= mtd_info.size) { + dbg_print(is_debug_on, "Error: offset[0x%.8x] over size[0x%.8x]\n", offset, size); + goto failed; + } + + len = size; + data_point = buf; + while ((offset < mtd_info.size) && (len > 0)) { + if (len > mtd_info.erasesize) { + block_size = mtd_info.erasesize; + } else { + block_size = len; + } + dbg_print(is_debug_on, "upgrade mtd[%s] block offset[0x%.8x] size[%d] relen[%d].\n", dev_mtd, offset, size, len); + ret = firmware_upgrade_mtd_block(mtd_fd, offset, data_point, block_size, mtd_info.erasesize); + if (ret < 0) { + dbg_print(is_debug_on, "Error: mt block offset[0x%.8x] size[0x%.8x] failed.\n", offset, block_size); + goto failed; + } + len -= block_size; + data_point += block_size; + offset += block_size; + usleep(FW_MTD_BLOCK_SLEEP_TIME); + } + + if (close(mtd_fd) < 0) { + dbg_print(is_debug_on, "Error:close %s failed.\n", dev_mtd); + } + dbg_print(is_debug_on, "firmware upgrade mtd device success.\n"); + return FIRMWARE_SUCCESS; + +failed: + if (close(mtd_fd) < 0) { + dbg_print(is_debug_on, "Error:close %s failed.\n", dev_mtd); + } + +err: + dbg_print(is_debug_on, "firmware upgrade mtd device fail.\n"); + return FIRMWARE_FAILED; +} + +/* + * firmware_upgrade_mtd + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @buf: param[in] Upgrade the file content + * @size: param[in] Upgrade file size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_mtd(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret; + firmware_mtd_info_t dev_info; + + if ((buf == NULL) || (info == NULL)) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return FIRMWARE_FAILED; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + return FIRMWARE_FAILED; + } + + ret = firmware_upgrade_mtd_program(&dev_info, dev_info.flash_base, buf, size); + if (ret < 0) { + dbg_print(is_debug_on, "Error:mtd device program failed, ret=%d.\n", ret); + goto failed; + } + + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + + return FIRMWARE_SUCCESS; + +failed: + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH,NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + + return FIRMWARE_FAILED; +} + +/* + * firmware_upgrade_mtd_test + * function: Determine whether to upgrade ISC or JBI + * @fd: param[in] Device file descriptor + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_mtd_test(int fd, name_info_t *info) +{ + int ret, rv; + firmware_mtd_info_t dev_info; + uint8_t *data_buf; + uint8_t num; + int j; + + if (info == NULL) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return FIRMWARE_FAILED; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + if (dev_info.test_size == 0) { + dbg_print(is_debug_on, "Error: get flash size:%d, not support.\n", dev_info.test_size); + return FIRMWARE_NOT_SUPPORT; + } + + data_buf = (uint8_t *) malloc(dev_info.test_size); + if (data_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for test data buf, size=%d.\n", dev_info.test_size); + return FIRMWARE_FAILED; + } + + /* Get random data */ + for (j = 0; j < dev_info.test_size; j++) { + num = (uint8_t) rand() % 256; + data_buf[j] = num & 0xff; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + free(data_buf); + return FIRMWARE_FAILED; + } + + ret = firmware_upgrade_mtd_program(&dev_info, dev_info.test_base, data_buf, dev_info.test_size); + /* disable upgrade access */ + rv = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (rv < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + free(data_buf); + if (ret < 0) { + dbg_print(is_debug_on, "Error:mtd device program failed, ret=%d.\n", ret); + return FIRMWARE_FAILED; + } + return FIRMWARE_SUCCESS; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h new file mode 100644 index 0000000000..06e36b3149 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/firmware_upgrade_mtd.h @@ -0,0 +1,32 @@ +#ifndef __FIRMWARE_UPGRADE_MTD_H__ +#define __FIRMWARE_UPGRADE_MTD_H__ + +#include + +#define FIRMWARE_DEV_NAME_LEN 64 /* the macro definition needs to same as FIRMWARE_DEV_NAME_LEN in firmware_sysfs_upgrade.h */ +#define PATH_LEN (256) +#define FW_MTD_BLOCK_SLEEP_TIME (10000) /* 10ms */ +#define FW_SYSFS_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define FW_SYSFS_RETRY_TIME (5) /* retry 5 times, 50ms = FW_SYSFS_RETRY_TIME *FW_SYSFS_RETRY_SLEEP_TIME; */ + +/* Debug switch level */ +typedef enum { + FIRWMARE_MTD_SUCCESS = 0, + FIRWMARE_MTD_PART_INFO_ERR, + FIRWMARE_MTD_MEMERASE, + FIRWMARE_MTD_MEMGETINFO, + FIRWMARE_END, +} firmware_debug_level_t; + +#define debug(fmt, argv...) do { \ + dbg_print(is_debug_on, ""fmt , ##argv);\ + } while(0) + +typedef struct firmware_mtd_info_s { + char mtd_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_mtd_info_t; + +#endif /* End of __FIRMWARE_UPGRADE_MTD_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h new file mode 100644 index 0000000000..f326d23e73 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_mtd/mtd-abi.h @@ -0,0 +1,259 @@ + +#ifndef __MTD_ABI_H__ +#define __MTD_ABI_H__ + +#include + +struct erase_info_user { + __u32 start; + __u32 length; +}; + +struct erase_info_user64 { + __u64 start; + __u64 length; +}; + +struct mtd_oob_buf { + __u32 start; + __u32 length; + unsigned char *ptr; +}; + +struct mtd_oob_buf64 { + __u64 start; + __u32 pad; + __u32 length; + __u64 usr_ptr; +}; + +/** + * MTD operation modes + * + * @MTD_OPS_PLACE_OOB: OOB data are placed at the given offset (default) + * @MTD_OPS_AUTO_OOB: OOB data are automatically placed at the free areas + * which are defined by the internal ecclayout + * @MTD_OPS_RAW: data are transferred as-is, with no error correction; + * this mode implies %MTD_OPS_PLACE_OOB + * + * These modes can be passed to ioctl(MEMWRITE) and are also used internally. + * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs. + * %MTD_FILE_MODE_RAW. + */ +enum { + MTD_OPS_PLACE_OOB = 0, + MTD_OPS_AUTO_OOB = 1, + MTD_OPS_RAW = 2, +}; + +/** + * struct mtd_write_req - data structure for requesting a write operation + * + * @start: start address + * @len: length of data buffer + * @ooblen: length of OOB buffer + * @usr_data: user-provided data buffer + * @usr_oob: user-provided OOB buffer + * @mode: MTD mode (see "MTD operation modes") + * @padding: reserved, must be set to 0 + * + * This structure supports ioctl(MEMWRITE) operations, allowing data and/or OOB + * writes in various modes. To write to OOB-only, set @usr_data == NULL, and to + * write data-only, set @usr_oob == NULL. However, setting both @usr_data and + * @usr_oob to NULL is not allowed. + */ +struct mtd_write_req { + __u64 start; + __u64 len; + __u64 ooblen; + __u64 usr_data; + __u64 usr_oob; + __u8 mode; + __u8 padding[7]; +}; + +#define MTD_ABSENT 0 +#define MTD_RAM 1 +#define MTD_ROM 2 +#define MTD_NORFLASH 3 +#define MTD_NANDFLASH 4 +#define MTD_DATAFLASH 6 +#define MTD_UBIVOLUME 7 +#define MTD_MLCNANDFLASH 8 + +#define MTD_WRITEABLE 0x400 /* Device is writeable */ +#define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */ +#define MTD_NO_ERASE 0x1000 /* No erase necessary */ +#define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */ + +/* Some common devices / combinations of capabilities */ +#define MTD_CAP_ROM 0 +#define MTD_CAP_RAM (MTD_WRITEABLE | MTD_BIT_WRITEABLE | MTD_NO_ERASE) +#define MTD_CAP_NORFLASH (MTD_WRITEABLE | MTD_BIT_WRITEABLE) +#define MTD_CAP_NANDFLASH (MTD_WRITEABLE) + +/* Obsolete ECC byte placement modes (used with obsolete MEMGETOOBSEL) */ +#define MTD_NANDECC_OFF 0 // Switch off ECC (Not recommended) +#define MTD_NANDECC_PLACE 1 // Use the given placement in the structure (YAFFS1 legacy mode) +#define MTD_NANDECC_AUTOPLACE 2 // Use the default placement scheme +#define MTD_NANDECC_PLACEONLY 3 // Use the given placement in the structure (Do not store ecc result on read) +#define MTD_NANDECC_AUTOPL_USR 4 // Use the given autoplacement scheme rather than using the default + +/* OTP mode selection */ +#define MTD_OTP_OFF 0 +#define MTD_OTP_FACTORY 1 +#define MTD_OTP_USER 2 + +typedef struct mtd_info_user { + __u8 type; + __u32 flags; + __u32 size; /* Total size of the MTD */ + __u32 erasesize; + __u32 writesize; + __u32 oobsize; /* Amount of OOB data per block (e.g. 16) */ + __u64 padding; /* Old obsolete field; do not use */ +} mtd_info_user_t; + +struct region_info_user { + __u32 offset; /* At which this region starts, + * from the beginning of the MTD */ + __u32 erasesize; /* For this region */ + __u32 numblocks; /* Number of blocks in this region */ + __u32 regionindex; +}; + +struct otp_info { + __u32 start; + __u32 length; + __u32 locked; +}; + +/* + * Note, the following ioctl existed in the past and was removed: + * #define MEMSETOOBSEL _IOW('M', 9, struct nand_oobinfo) + * Try to avoid adding a new ioctl with the same ioctl number. + */ + +/* Get basic MTD characteristics info (better to use sysfs) */ +#define MEMGETINFO _IOR('M', 1, struct mtd_info_user) +/* Erase segment of MTD */ +#define MEMERASE _IOW('M', 2, struct erase_info_user) +/* Write out-of-band data from MTD */ +#define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf) +/* Read out-of-band data from MTD */ +#define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf) +/* Lock a chip (for MTD that supports it) */ +#define MEMLOCK _IOW('M', 5, struct erase_info_user) +/* Unlock a chip (for MTD that supports it) */ +#define MEMUNLOCK _IOW('M', 6, struct erase_info_user) +/* Get the number of different erase regions */ +#define MEMGETREGIONCOUNT _IOR('M', 7, int) +/* Get information about the erase region for a specific index */ +#define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user) +/* Get info about OOB modes (e.g., RAW, PLACE, AUTO) - legacy interface */ +#define MEMGETOOBSEL _IOR('M', 10, struct nand_oobinfo) +/* Check if an eraseblock is bad */ +#define MEMGETBADBLOCK _IOW('M', 11, __kernel_loff_t) +/* Mark an eraseblock as bad */ +#define MEMSETBADBLOCK _IOW('M', 12, __kernel_loff_t) +/* Set OTP (One-Time Programmable) mode (factory vs. user) */ +#define OTPSELECT _IOR('M', 13, int) +/* Get number of OTP (One-Time Programmable) regions */ +#define OTPGETREGIONCOUNT _IOW('M', 14, int) +/* Get all OTP (One-Time Programmable) info about MTD */ +#define OTPGETREGIONINFO _IOW('M', 15, struct otp_info) +/* Lock a given range of user data (must be in mode %MTD_FILE_MODE_OTP_USER) */ +#define OTPLOCK _IOR('M', 16, struct otp_info) +/* Get ECC layout (deprecated) */ +#define ECCGETLAYOUT _IOR('M', 17, struct nand_ecclayout_user) +/* Get statistics about corrected/uncorrected errors */ +#define ECCGETSTATS _IOR('M', 18, struct mtd_ecc_stats) +/* Set MTD mode on a per-file-descriptor basis (see "MTD file modes") */ +#define MTDFILEMODE _IO('M', 19) +/* Erase segment of MTD (supports 64-bit address) */ +#define MEMERASE64 _IOW('M', 20, struct erase_info_user64) +/* Write data to OOB (64-bit version) */ +#define MEMWRITEOOB64 _IOWR('M', 21, struct mtd_oob_buf64) +/* Read data from OOB (64-bit version) */ +#define MEMREADOOB64 _IOWR('M', 22, struct mtd_oob_buf64) +/* Check if chip is locked (for MTD that supports it) */ +#define MEMISLOCKED _IOR('M', 23, struct erase_info_user) +/* + * Most generic write interface; can write in-band and/or out-of-band in various + * modes (see "struct mtd_write_req") + */ +#define MEMWRITE _IOWR('M', 24, struct mtd_write_req) + +/* + * Obsolete legacy interface. Keep it in order not to break userspace + * interfaces + */ +struct nand_oobinfo { + __u32 useecc; + __u32 eccbytes; + __u32 oobfree[8][2]; + __u32 eccpos[32]; +}; + +struct nand_oobfree { + __u32 offset; + __u32 length; +}; + +#define MTD_MAX_OOBFREE_ENTRIES 8 +#define MTD_MAX_ECCPOS_ENTRIES 64 +/* + * OBSOLETE: ECC layout control structure. Exported to user-space via ioctl + * ECCGETLAYOUT for backwards compatbility and should not be mistaken as a + * complete set of ECC information. The ioctl truncates the larger internal + * structure to retain binary compatibility with the static declaration of the + * ioctl. Note that the "MTD_MAX_..._ENTRIES" macros represent the max size of + * the user struct, not the MAX size of the internal struct nand_ecclayout. + */ +struct nand_ecclayout_user { + __u32 eccbytes; + __u32 eccpos[MTD_MAX_ECCPOS_ENTRIES]; + __u32 oobavail; + struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES]; +}; + +/** + * struct mtd_ecc_stats - error correction stats + * + * @corrected: number of corrected bits + * @failed: number of uncorrectable errors + * @badblocks: number of bad blocks in this partition + * @bbtblocks: number of blocks reserved for bad block tables + */ +struct mtd_ecc_stats { + __u32 corrected; + __u32 failed; + __u32 badblocks; + __u32 bbtblocks; +}; + +/* + * MTD file modes - for read/write access to MTD + * + * @MTD_FILE_MODE_NORMAL: OTP disabled, ECC enabled + * @MTD_FILE_MODE_OTP_FACTORY: OTP enabled in factory mode + * @MTD_FILE_MODE_OTP_USER: OTP enabled in user mode + * @MTD_FILE_MODE_RAW: OTP disabled, ECC disabled + * + * These modes can be set via ioctl(MTDFILEMODE). The mode mode will be retained + * separately for each open file descriptor. + * + * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW - + * raw access to the flash, without error correction or autoplacement schemes. + * Wherever possible, the MTD_OPS_* mode will override the MTD_FILE_MODE_* mode + * (e.g., when using ioctl(MEMWRITE)), but in some cases, the MTD_FILE_MODE is + * used out of necessity (e.g., `write()', ioctl(MEMWRITEOOB64)). + */ +enum mtd_file_modes { + MTD_FILE_MODE_NORMAL = MTD_OTP_OFF, + MTD_FILE_MODE_OTP_FACTORY = MTD_OTP_FACTORY, + MTD_FILE_MODE_OTP_USER = MTD_OTP_USER, + MTD_FILE_MODE_RAW, +}; + +#endif /* __MTD_ABI_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c new file mode 100644 index 0000000000..10a429d93b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.c @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "firmware_upgrade_sysfs.h" + +static int firmware_sysfs_get_dev_info(int fd, firmware_dev_file_info_t *dev_info) +{ + int ret; + + ret = ioctl(fd, FIRMWARE_SYSFS_DEV_FILE_INFO, dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to get upg flash dev info.\n"); + return ret; + } + + dbg_print(is_debug_on, "sysfs_name=%s per_len=%u.\n", dev_info->sysfs_name, dev_info->per_len); + return 0; +} + +/* sysfs upgrade program function */ +int firmware_upgrade_sysfs_program(firmware_dev_file_info_t *dev_info, uint32_t dev_base, + uint8_t *buf, uint32_t size) +{ + int ret = 0; + uint32_t offset_addr, buf_offset, len; + uint32_t write_len, cmp_retry, reread_len; + int sysfs_fd; + uint8_t *reread_buf; + int i; + + if (dev_info->per_len > 0) { + if (size % dev_info->per_len) { + dbg_print(is_debug_on, "firmware sysfs upgrade size[%u] is width[%u] mismatch, ret %d.\n", + size, dev_info->per_len, ret); + return FIRMWARE_FAILED; + } + len = dev_info->per_len; + } else { + /* Write to the maximum buffer if the length of each write is not configured */ + len = size; + } + + /* Read back data */ + reread_buf = (uint8_t *) malloc(len); + if (reread_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for read back data buf, len=%u.\n", len); + return FIRMWARE_FAILED; + } + + sysfs_fd = open(dev_info->sysfs_name, O_RDWR | O_SYNC); + if (sysfs_fd < 0) { + dbg_print(is_debug_on, "open file[%s] fail.\n", dev_info->sysfs_name); + free(reread_buf); + return FIRMWARE_FAILED; + } + + offset_addr = dev_base; + buf_offset = 0; + cmp_retry = 0; + while (buf_offset < size) { + /* Calibrate upgrade data length */ + if (buf_offset + len > size) { + len = size - buf_offset; + } + + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + ret = lseek(sysfs_fd, offset_addr, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "lseek file[%s offset=%u] fail.\n", dev_info->sysfs_name, offset_addr); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + write_len = write(sysfs_fd, buf + buf_offset, len); + if (write_len != len) { + dbg_print(is_debug_on, "write file[%s] fail,offset = 0x%x retrytimes = %u len = %u, write_len =%u\n", + dev_info->sysfs_name, offset_addr, i ,len, write_len); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "write file[%s] fail, offset = 0x%x, len = %u, write_len =%u\n", + dev_info->sysfs_name, offset_addr, len, write_len); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + + mem_clear(reread_buf, len); + ret = lseek(sysfs_fd, offset_addr, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "reread lseek file[%s offset=%u] fail.\n", dev_info->sysfs_name, offset_addr); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + + for (i = 0; i < FW_SYSFS_RETRY_TIME; i++) { + reread_len = read(sysfs_fd, reread_buf, len); + if (reread_len != len) { + dbg_print(is_debug_on, "reread file[%s] fail,offset = 0x%x retrytimes = %u reread_len = %u, len =%u\n", + dev_info->sysfs_name, offset_addr, i ,reread_len, len); + usleep(FW_SYSFS_RETRY_SLEEP_TIME); + continue; + } + break; + } + if (i == FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "reread file[%s] fail, offset = 0x%x, reread_len = %u, len = %u\n", + dev_info->sysfs_name, offset_addr, reread_len, len); + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + + /* Check data */ + if (memcmp(reread_buf, buf + buf_offset, len) != 0) { + if (cmp_retry < FW_SYSFS_RETRY_TIME) { + dbg_print(is_debug_on, "memcmp file[%s] fail,offset = 0x%x retrytimes = %u\n", + dev_info->sysfs_name, offset_addr, cmp_retry); + cmp_retry++; + continue; + } + + dbg_print(is_debug_on, "upgrade file[%s] fail, offset = 0x%x.\n", dev_info->sysfs_name, offset_addr); + dbg_print(is_debug_on, "want to write buf :\n"); + for (i = 0; i < len; i++) { + dbg_print(is_debug_on, "0x%x ", buf[buf_offset + i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + dbg_print(is_debug_on, "actually reread buf :\n"); + for (i = 0; i < len; i++) { + dbg_print(is_debug_on, "0x%x ", reread_buf[i]); + if (((i + 1) % 16) == 0) { + dbg_print(is_debug_on, "\n"); + } + } + dbg_print(is_debug_on, "\n"); + + close(sysfs_fd); + free(reread_buf); + return FIRMWARE_FAILED; + } + offset_addr += len; + buf_offset += len; + usleep(5000); + } + free(reread_buf); + + dbg_print(is_debug_on, "firmware upgrade sysfs success.\n"); + close(sysfs_fd); + return FIRMWARE_SUCCESS; +} + +/* sysfs upgrade function */ +int firmware_upgrade_sysfs(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret = 0; + firmware_dev_file_info_t dev_info; + + if ((buf == NULL) || (info == NULL)) { + dbg_print(is_debug_on, "Input invalid error.\n"); + goto exit; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + goto exit; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + goto exit; + } + + ret = firmware_upgrade_sysfs_program(&dev_info, dev_info.dev_base, buf, size); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + goto fail; + } + + dbg_print(is_debug_on, "firmware upgrade sysfs success.\n"); + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH,NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + return FIRMWARE_SUCCESS; + +fail: + /* disable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } +exit: + dbg_print(is_debug_on, "firmware upgrade sysfs fail.\n"); + return FIRMWARE_FAILED; +} + +/* sysfs upgrade test function */ +int firmware_upgrade_sysfs_test(int fd, name_info_t *info) +{ + int ret, rv; + firmware_dev_file_info_t dev_info; + uint8_t *data_buf; + uint8_t num; + int j; + + if (info == NULL) { + dbg_print(is_debug_on, "Input invalid error.\n"); + return FIRMWARE_FAILED; + } + + /* get sysfs information*/ + ret = firmware_sysfs_get_dev_info(fd, &dev_info); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_sysfs_get_dev_info failed, ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + if (dev_info.test_size == 0) { + dbg_print(is_debug_on, "Error: get sysfs test size:%d, not support.\n", dev_info.test_size); + return FIRMWARE_NOT_SUPPORT; + } + + data_buf = (uint8_t *) malloc(dev_info.test_size); + if (data_buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for test data buf, size=%d.\n", dev_info.test_size); + return FIRMWARE_FAILED; + } + + /* Get random data */ + for (j = 0; j < dev_info.test_size; j++) { + num = (uint8_t) rand() % 256; + data_buf[j] = num & 0xff; + } + + /* enable upgrade access */ + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + free(data_buf); + return FIRMWARE_FAILED; + } + + ret = firmware_upgrade_sysfs_program(&dev_info, dev_info.test_base, data_buf, dev_info.test_size); + /* disable upgrade access */ + rv = ioctl(fd, FIRMWARE_SYSFS_FINISH,NULL); + if (rv < 0) { + dbg_print(is_debug_on, "close dev logic en failed.\n"); + } + free(data_buf); + + if (ret < 0) { + dbg_print(is_debug_on, "init dev logic faile\n"); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "firmware upgrade sysfs success.\n"); + return FIRMWARE_SUCCESS; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h new file mode 100644 index 0000000000..b69080ea64 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/firmware_upgrade_sysfs.h @@ -0,0 +1,16 @@ +#ifndef __FIRMWARE_UPGRADE_SYSFS_H__ +#define __FIRMWARE_UPGRADE_SYSFS_H__ + +#define FIRMWARE_DEV_NAME_LEN (64) /* the macro definition needs to same as FIRMWARE_DEV_NAME_LEN in firmware_sysfs_upgrade.h */ +#define FW_SYSFS_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define FW_SYSFS_RETRY_TIME (5) /* retry 5 times, 50ms = FW_SYSFS_RETRY_TIME *FW_SYSFS_RETRY_SLEEP_TIME; */ + +typedef struct firmware_dev_file_info_s { + char sysfs_name[FIRMWARE_DEV_NAME_LEN]; /* sysfs name */ + uint32_t dev_base; /* device upgrade base address */ + uint32_t per_len; /* The length of bytes per operation */ + uint32_t test_base; /* Test device address */ + uint32_t test_size; /* Test flash size */ +} firmware_dev_file_info_t; + +#endif /* End of __FIRMWARE_UPGRADE_SYSFS_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c new file mode 100644 index 0000000000..7db3c1b7b6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.c @@ -0,0 +1,1181 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fw_upg_spi_logic_dev.h" + +#define be32_to_cpus(p) __be32_to_cpus(p) +#define le32_to_cpus(p) __le32_to_cpus(p) +#define cpu_to_be32s(p) __cpu_to_be32s(p) +#define cpu_to_le32s(p) __cpu_to_le32s(p) + +static void firmware_upgrade_printf_reg(uint8_t *buf, int buf_len, uint32_t offset_addr) +{ + int i, j, tmp; + + j = offset_addr % 16; + tmp = j; + offset_addr -= j; + printf("\n "); + + for (i = 0; i < 16; i++) { + printf("%2x ", i); + } + + for (i = 0; i < buf_len + j; i++) { + if ((i % 16) == 0) { + printf("\n0x%08x ", offset_addr); + offset_addr = offset_addr + 16; + } + if (tmp) { + printf(" "); + tmp--; + } else { + printf("%02x ", buf[i-j]); + } + } + + printf("\n"); + return; +} + +static int firmware_upgrade_get_spi_logic_info(int fd, firmware_spi_logic_upg_t *current_upg_priv) +{ + int ret; + firmware_spi_logic_info_t syfs_info; + + if (fd < 0) { + dbg_print(is_debug_on, "Error: get spi logic info fd %d.\n", fd); + return fd; + } + + ret = 0; + ret = ioctl(fd, FIRMWARE_SYSFS_SPI_INFO, &syfs_info); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to get upg flash dev info, ret=%d\n", ret); + return -FW_SPI_FLASH_GET_INFO_ERR; + } + + current_upg_priv->flash_base = syfs_info.flash_base; + current_upg_priv->ctrl_base = syfs_info.ctrl_base; + memcpy(current_upg_priv->dev_path, syfs_info.logic_dev_name, FIRMWARE_LOGIC_DEV_NAME_LEN - 1); + current_upg_priv->status_reg = syfs_info.ctrl_base + FPGA_UPG_STATUS_REG; + current_upg_priv->spi_ctrl_reg = syfs_info.ctrl_base + FPGA_UPG_SPI_CTRL_REG; + current_upg_priv->wr_flash_status_reg = syfs_info.ctrl_base + FPGA_UPG_WR_FLASH_STATUS_REG; + current_upg_priv->rd_flash_status_reg = syfs_info.ctrl_base + FPGA_UPG_RD_FLASH_STATUS_REG; + current_upg_priv->instruction_reg = syfs_info.ctrl_base + FPGA_UPG_INSTRUCTION_REG; + current_upg_priv->addr_reg = syfs_info.ctrl_base + FPGA_UPG_ADDR_REG; + current_upg_priv->length_reg = syfs_info.ctrl_base + FPGA_UPG_LENGTH_REG; + current_upg_priv->device_id_reg = syfs_info.ctrl_base + FPGA_UPG_DEVICE_ID_REG; + current_upg_priv->drop_reg_num_reg = syfs_info.ctrl_base + FPGA_UPG_DROP_REQ_NUM_REG; + current_upg_priv->test_base = syfs_info.test_base; + current_upg_priv->test_size = syfs_info.test_size; + + return 0; +} + +static int firmware_upgrade_spi_logic_init(int fd) +{ + int ret; + + ret = 0; + ret = ioctl(fd, FIRMWARE_SYSFS_INIT, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to init spi logic, ret=%d\n", ret); + return -1; + } + + return 0; +} + +static int firmware_upgrade_spi_logic_finish(int fd) +{ + int ret; + + if (fd < 0) { + dbg_print(is_debug_on, "Error: get spi logic info fd %d.\n", fd); + return -1; + } + + ret = 0; + ret = ioctl(fd, FIRMWARE_SYSFS_FINISH, NULL); + if (ret < 0) { + dbg_print(is_debug_on, "Failed to release spi logic, ret=%d\n", ret); + return -1; + } + + return 0; +} + +/** + * firmware_fpga_file_read - + * function:Provide FPGA read-register interface (address must be 4-byte aligned) + * @dev_name: Device file descriptor + * @offset: device offset + * @buf: Read Data Buffer + * @rd_len: Read Data Length + * return: 0--success; other--fail + */ +int firmware_fpga_file_read(char *dev_name, uint32_t offset, uint8_t *buf, uint32_t rd_len) +{ + int ret, fd; + + if ((dev_name == NULL) || (buf == NULL)) { + dbg_print(is_debug_on, "upg_priv or read buf is null.\n"); + return -1; + } + + if ((fd = open(dev_name, O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO)) < 0) { + dbg_print(is_debug_on, "Error: Could not open file %s. Errno=%d\n", dev_name, errno); + return -1; + } + + ret = lseek(fd, offset, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "read llseek failed, errno: %s\n", strerror(errno)); + close(fd); + return -1; + } + + ret = read(fd, buf, rd_len); + if (ret < 0) { + dbg_print(is_debug_on, "read failed, err: %s\n", strerror(errno)); + close(fd); + return -1; + } + + close(fd); + return 0; +} + +static int firmware_fpga_read_word(char *dev_name, uint32_t addr, uint32_t *val) +{ + int ret; + uint32_t retry; + + if (sizeof(int) < FIRMWARE_FPGA_WORD_LEN) { + dbg_print(is_debug_on, "Error:dfd_fpga_read_word buf len %ld support len %d.\n", + sizeof(int), FIRMWARE_FPGA_WORD_LEN); + return -1; + } + + retry = 0; + *val = 0; + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_read(dev_name, addr, (uint8_t *)val, FIRMWARE_FPGA_WORD_LEN); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_read addr 0x%x retry %u failed ret %d.\n", + addr, retry, ret); + continue; + } else { + le32_to_cpus(val); + return 0; + } + } + + dbg_print(is_debug_on, "dfd_fpga_read_word addr 0x%x retry %u failed ret %d.\n", addr, retry, ret); + return -1; +} + +static int firmware_fpga_read_buf(char *dev_name, uint32_t addr, uint8_t *buf, uint32_t rd_len) +{ + int ret; + uint32_t retry; + + retry = 0; + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_read(dev_name, addr, buf, rd_len); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_read addr 0x%x rd_len %u i %d failed ret %d.\n", + addr, rd_len, retry, ret); + continue; + } else { + return 0; + } + } + + dbg_print(is_debug_on, "firmware_fpga_file_read addr 0x%x rd_len %u retry %u failed ret %d.\n", + addr, rd_len, retry, ret); + return -1; +} + +/** + * firmware_fpga_file_write - + * function:Provide FPGA write-register interface (address must be 4-byte aligned) + * @dev_name: Device file descriptor + * @offset: device offset + * @buf: Write Data Buffer + * @wr_len: Write Data Length + * return: 0--success; other--fail + */ +int firmware_fpga_file_write(char *dev_name, uint32_t offset, uint8_t *buf, uint32_t wr_len) +{ + int ret, fd; + + if ((dev_name == NULL) || (buf == NULL)) { + dbg_print(is_debug_on, "dev_name or write buf is null.\n"); + return -1; + } + + if ((fd = open(dev_name, O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO)) < 0) { + dbg_print(is_debug_on, "Error: Could not open file %s. Errno=%d\n", dev_name, errno); + return -1; + } + + ret = lseek(fd, offset, SEEK_SET); + if (ret < 0) { + dbg_print(is_debug_on, "write llseek failed, err: %s\n", strerror(errno)); + close(fd); + return -1; + } + + ret = write(fd, buf, wr_len); + if (ret < 0 ) { + dbg_print(is_debug_on, "write failed, err: %s\n", strerror(errno)); + close(fd); + return -1; + } + + close(fd); + return 0; +} + +static int firmware_fpga_write_word(char *dev_name, uint32_t addr, uint32_t val) +{ + int ret; + uint32_t retry, tmp; + + retry = 0; + tmp = val; + cpu_to_le32s(&tmp); + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_write(dev_name, addr, (uint8_t *)&tmp, FIRMWARE_FPGA_WORD_LEN); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_write addr 0x%x val 0x%x retry %u failed ret %d.\n", + addr, val, retry, ret); + continue; + } else { + return 0; + } + } + + dbg_print(is_debug_on, "firmware_fpga_file_write addr 0x%x val 0x%x retry %u failed ret %d.\n", + addr, val, retry, ret); + return -1; +} + +static int firmware_fpga_write_buf(char *dev_name, uint32_t addr, uint8_t *buf, uint32_t wr_len) +{ + int ret; + uint32_t retry; + + retry = 0; + while(retry < FIRMWARE_FPGA_UPG_RETRY_CNT) { + ret = firmware_fpga_file_write(dev_name, addr, buf, wr_len); + if (ret) { + retry++; + dbg_print(is_debug_on, "firmware_fpga_file_write addr 0x%x wr_len 0x%x retry %u failed ret %d.\n", + addr, wr_len, retry, ret); + continue; + } else { + return 0; + } + } + + dbg_print(is_debug_on, "dfd_fpga_buf_write addr 0x%x wr_len 0x%x retry %u failed ret %d.\n", + addr, wr_len, retry, ret); + + return -1; +} + +/* Whether the SPI port is idle, 0--idle, 1--busy */ +static int firmware_fpga_get_status(firmware_spi_logic_upg_t *upg_priv, char *status) +{ + int ret; + uint32_t addr, val; + + addr = upg_priv->status_reg; + ret = firmware_fpga_read_word(upg_priv->dev_path, addr, &val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_get_status addr 0x%x failed ret %d.\n", addr, ret); + return -1; + } + + *status = val & FPGA_UPG_STATUS_MASK; + + return 0; +} + +/* Wait for the SPI port to become free again */ +static int firmware_fpga_wait_ready(firmware_spi_logic_upg_t *upg_priv) +{ + int timeout; + char status; + int ret; + + timeout = FIRMWARE_UPG_RETRY_TIME_CNT; + while (timeout--) { + usleep(FIRMWARE_UPG_RETRY_SLEEP_TIME); + ret = firmware_fpga_get_status(upg_priv, &status); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_get_status failed ret %d.\n", ret); + continue; + } + + /* Determine if it's idle */ + if (!status) { + return 0; + } + } + + return -1; +} + +/* Configure access */ +static int firmware_fpga_set_access(firmware_spi_logic_upg_t *upg_priv, uint32_t cmd) +{ + int ret; + uint32_t addr, val; + + addr = upg_priv->instruction_reg; + val = cmd; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", addr, val, ret); + return -1; + } + + addr = upg_priv->spi_ctrl_reg; + val = FPGA_UPG_ACCESS_ENABLE; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", addr, val, ret); + return -1; + } + + /* Wait for the SPI port on the FPGA to become free again*/ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + return 0; +} + +/* Get SPI STATUS register */ +static int firmware_fpga_get_spi_status(firmware_spi_logic_upg_t *upg_priv, char *status) +{ + int ret; + uint32_t val, addr, cmd; + + cmd = FPGA_UPG_INSTRUTION_RDSR; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd 0x%x failed ret %d.\n", cmd, ret); + return -1; + } + + addr = upg_priv->rd_flash_status_reg; + ret = firmware_fpga_read_word(upg_priv->dev_path, addr, &val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_read_word addr 0x%x failed ret %d.\n", addr, ret); + return -1; + } + + *status = val & FPGA_UPG_SPI_STATUS_MASK; + + return 0; +} + +/* Wait for the SPI chip operation to complete */ +static int firmware_fpga_wait_spi_ready(firmware_spi_logic_upg_t *upg_priv, + uint32_t timeout, uint32_t usleep_time) +{ + char status; + int ret; + + while (timeout--) { + usleep(usleep_time); + ret = firmware_fpga_get_spi_status(upg_priv, &status); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_get_spi_status failed ret %d.\n", ret); + continue; + } + /* Determine if it's idle */ + if (!status) { + return 0; + } + } + + return -FW_SPI_FLASH_SPI_BUSY; +} + +/* Configure FPGA upgrade write enable */ +static int firmware_fpga_set_wr_enable(firmware_spi_logic_upg_t *upg_priv) +{ + int ret; + uint32_t cmd; + + cmd = FPGA_UPG_INSTRUTION_WREN; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -1; + } + + return 0; +} + +#if 0 +/* erase all flash */ +static int firmware_fpga_upg_set_erase_all(firmware_spi_logic_upg_t *upg_priv) +{ + int ret; + int cmd; + + /* Wait for the SPI port on the FPGA to become free */ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_wait_ready failed ret %d.\n", ret); + return -1; + } + + /* Configure FPGA upgrade write enable */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -1; + } + + cmd = FPGA_UPG_INSTRUTION_BE; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -1; + } + + /* Hardware requirements, delay of 1s */ + sleep(1); + + /* Wait for the SPI chip operation to complete, 1s check status once, max delay 300s */ + ret = firmware_fpga_wait_spi_ready(upg_priv, 300, (1 * 1000 * 1000)); + if (ret) { + dbg_print(is_debug_on, "dfd_fpga_wait_spi_ready failed ret %d.\n", ret); + return -1; + } + + dbg_print(is_debug_on, "Success.\n"); + return 0; +} +#endif + +/* Erase sectors (256 pages, 64K total) */ +static int firmware_fpga_erase_sector(firmware_spi_logic_upg_t *upg_priv, uint32_t spi_addr) +{ + int ret; + uint32_t val, addr, cmd; + + /* Wait for the SPI port on the FPGA to become free again */ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + /* Enable write */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -FW_SPI_FLASH_WR_ENABLE_ERR; + } + + /* Write erase address */ + val = spi_addr; + addr = upg_priv->addr_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", addr, val, ret); + return -FW_SPI_FLASH_ERASE_ADDR_ERR; + } + + /* Enable sector erasure */ + cmd = FPGA_UPG_INSTRUTION_SE; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -FW_SPI_FLASH_ERASE_SECTOR_ERR; + } + + /* Hardware requirements, delay of 0.25s */ + usleep(250 * 1000); + + /* Wait for the SPI chip operation to complete, 1s check status once, max delay 10s */ + ret = firmware_fpga_wait_spi_ready(upg_priv, FPGA_UPG_WAIT_SPI_RETRY_CNT, (100 * 1000)); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_wait_spi_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_SPI_BUSY; + } + + return 0; +} + +#if 0 +int firmware_fpga_erase64_sector(firmware_spi_logic_upg_t *upg_priv, int offset) +{ + int ret; + ret = -1; + + if ((offset % FIRMWARE_SPI_LOGIC_SECTOR_SIZE) == 0) { + dbg_print(is_debug_on, "erase 64k area, offset 0x%x.\n", offset); + ret = firmware_fpga_erase_sector(upg_priv, offset); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_erase_sector offset 0x%x failed ret %d.\n", offset, ret); + return ret; + } + } else { + dbg_print(is_debug_on, "Input para invalid, offset 0x%x.\n", offset); + } + + return ret; +} +#endif + +static int firmware_fpga_upg_program(firmware_spi_logic_upg_t *upg_priv, + uint32_t spi_addr, uint8_t *buf, uint32_t len) +{ + int ret; + uint32_t addr, val, cmd, wr_len; + + /* Write data to the Upgrade Content Register */ + addr = upg_priv->ctrl_base; + wr_len = len; + ret = firmware_fpga_write_buf(upg_priv->dev_path, addr, (uint8_t*)buf, wr_len); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_write_buf addr 0x%x wr_len %d failed ret %d.\n", + addr, len, ret); + return -FW_SPI_FLASH_WR_ERR; + } + + /* Write length register, FPGA is fixed 256 lengths */ + val = FFPGA_UPG_DATA_SIZE; + addr = upg_priv->length_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_LENGTH_ERR; + } + + /* Write address register */ + val = spi_addr; + addr = upg_priv->addr_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_ADDR_ERR; + } + + /* Start writing upgrade data to SPI */ + cmd = FPGA_UPG_INSTRUTION_PP; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -FW_SPI_FLASH_SET_ACCESS_ERR; + } + + /* min write wait 0.33ms */ + usleep(330); + + /* Wait for the SPI chip operation to complete, 100us check status once, max delay 10ms */ + ret = firmware_fpga_wait_spi_ready(upg_priv, FPGA_UPG_WAIT_SPI_RETRY_CNT, (100)); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_wait_spi_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + return 0; +} + +/** + * firmware_fpga_upg_write + * function: write interface provided to the upgrade module + * @upg_priv: Device information + * @addr: upgrade addr + * @buf: Write Data Buffer + * @len: Write Data Length + * return: 0--success; other--fail + */ +static int firmware_fpga_upg_write(firmware_spi_logic_upg_t *upg_priv, + uint32_t addr, uint8_t *buf, uint32_t len) +{ + int ret; + + /* address must be 256 bytes aligned */ + if ((upg_priv == NULL) || (buf == NULL) || (addr & 0xff) || (len > 256)) { + dbg_print(is_debug_on,"Input para invalid upg_priv %p buf %p addr 0x%x len %u.\n", + upg_priv, buf, addr, len); + return -FW_SPI_FLASH_PARAM_ERR; + } + + /* Wait for the SPI port on the FPGA to become free again*/ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + /* Configure write enable */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret) { + dbg_print(is_debug_on,"firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -FW_SPI_FLASH_WR_ENABLE_ERR; + } + + /* Write upgrade data */ + ret = firmware_fpga_upg_program(upg_priv, addr, buf, len); + if (ret) { + dbg_print(is_debug_on,"dfd_fpga_upg_program addr 0x%x len %u failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_UPG_ERR; + } + + return 0; +} + +static int firmware_fpga_fast_read(firmware_spi_logic_upg_t *upg_priv, + uint32_t spi_addr, uint8_t *buf, uint32_t len) +{ + int ret; + uint32_t val, addr, cmd; + + /* Clear register value */ + addr = upg_priv->ctrl_base; + ret = firmware_fpga_write_buf(upg_priv->dev_path, addr, buf, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_buf addr 0x%x len %d failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_WR_ERR; + } + /* Write length register */ + val = FFPGA_UPG_DATA_SIZE; + addr = upg_priv->length_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_LENGTH_ERR; + } + + /* Write address register */ + val = spi_addr; + addr = upg_priv->addr_reg; + ret = firmware_fpga_write_word(upg_priv->dev_path, addr, val); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_write_word addr 0x%x val 0x%x failed ret %d.\n", + addr, val, ret); + return -FW_SPI_FLASH_WR_ADDR_ERR; + } + + /* Start reading SPI data */ + cmd = FPGA_UPG_INSTRUTION_FR; + ret = firmware_fpga_set_access(upg_priv, cmd); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_access cmd %d failed ret %d.\n", cmd, ret); + return -FW_SPI_FLASH_SET_ACCESS_ERR; + } + + /* Read the upgraded content register to the buffer, + * FPGA only supports 4 bytes of read and write */ + addr = upg_priv->ctrl_base; + ret = firmware_fpga_read_buf(upg_priv->dev_path, addr, (uint8_t*)buf, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_read_buf addr 0x%x len %d failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_RD_ERR; + } + + return 0; +} + +/** + * firmware_fpga_upg_read + * function: read interface provided to the upgrade module + * @upg_priv: Device information + * @addr: upgrade addr + * @buf: Read Data Buffer + * @len: Read Data Length + * return: 0--success; other--fail + */ +static int firmware_fpga_upg_read(firmware_spi_logic_upg_t *upg_priv, + uint32_t addr, uint8_t *buf, uint32_t len) +{ + int ret; + + /* address must be 256 bytes aligned */ + if ((upg_priv == NULL) || (buf == NULL) || (addr & 0xff) || (len > 256)) { + dbg_print(is_debug_on, "Input para invalid upg_priv %p buf %p addr 0x%x len %u.\n", + upg_priv, buf, addr, len); + return -FW_SPI_FLASH_PARAM_ERR; + } + + /* Wait for the SPI port on the FPGA to become free again */ + ret = firmware_fpga_wait_ready(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_wait_ready failed ret %d.\n", ret); + return -FW_SPI_FLASH_BUSY; + } + + /* Configure write enable */ + ret = firmware_fpga_set_wr_enable(upg_priv); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_set_wr_enable failed ret %d.\n", ret); + return -FW_SPI_FLASH_WR_ENABLE_ERR; + } + + /* Read upgrade data */ + ret = firmware_fpga_fast_read(upg_priv, addr, buf, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_fast_read addr 0x%x len %u failed ret %d.\n", addr, len, ret); + return -FW_SPI_FLASH_RD_ERR; + } + + return 0; + +} + +static int firmware_upgreade_fpga_onetime(firmware_spi_logic_upg_t *upg_priv, + uint32_t flash_base, uint8_t *buf, uint32_t size) +{ + uint32_t offset, len, flash_addr, retry; + int ret, res; + uint8_t rbuf[FFPGA_UPG_DATA_SIZE]; + + offset = 0; + while(offset < size) { + flash_addr = flash_base + offset; + /* Erases a sector */ + if ((flash_addr % FIRMWARE_SPI_LOGIC_SECTOR_SIZE) == 0) { + ret = firmware_fpga_erase_sector(upg_priv, flash_addr); + if (ret < 0) { + dbg_print(is_debug_on, "firmware_fpga_erase_sector flash_addr 0x%x failed ret %d.\n", + flash_addr, ret); + goto exit; + } + } + + if (size > FFPGA_UPG_DATA_SIZE) { + len = FFPGA_UPG_DATA_SIZE; + } else { + len = size; + } + + /* first, Write data */ + ret = firmware_fpga_upg_write(upg_priv, flash_addr, buf + offset, len); + if (ret) { + dbg_print(is_debug_on, "firmware_fpga_upg_write addr 0x%x len 0x%x failed ret %d.\n", + flash_addr, len, ret); + ret = -FW_SPI_FLASH_UPG_ERR; + goto exit; + } + + /* Read back the data and compare the correctness of the data */ + for (retry = 0; retry < FPGA_UPG_RETRY_TIMES; retry++) { /*retry 3 times*/ + mem_clear(rbuf, len); + ret = firmware_fpga_upg_read(upg_priv, flash_addr, rbuf, len); + res = memcmp(rbuf, buf + offset, len); + if (ret || res) { + usleep(1000); + continue; + } + break; + } + + if (ret) { + dbg_print(is_debug_on, "firmware fpga read offset 0x%x len 0x%x failed ret %d.\n", flash_addr, len, ret); + ret = -FW_SPI_FLASH_RD_ERR; + goto exit; + } + + if (res) { + dbg_print(is_debug_on, "firmware fpga rbuf wbuf not equal, len 0x%x, check failed.\n", len); + ret = -FW_SPI_FLASH_DATA_CMP_ERR; + goto exit; + } + offset += len; + } + + dbg_print(is_debug_on, "Update success.\n"); + return FIRMWARE_SUCCESS; +exit: + dbg_print(is_debug_on, "Update failed.\n"); + return FIRMWARE_FAILED; +} + +static int firmware_upgrade_do_spi_logic(firmware_spi_logic_upg_t *current_upg_priv, + unsigned char *buf, uint32_t size) +{ + int i, ret; + uint32_t retry; + + i = 0; + retry = FIRMWARE_SPI_LOGIC_UPG_RETRY_CNT; + + ret = 0; + while(i < retry) { + ret = firmware_upgreade_fpga_onetime(current_upg_priv, current_upg_priv->flash_base, buf, size); + if (ret) { + i++; + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime size 0x%x failed ret %d.\n", size, ret); + continue; + } else { + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime success.\n"); + return 0; + } + } + + return ret; +} + +/* + * firmware_upgrade_spi_logic_dev + * function: FPGA SPI FLASH Firmware upgrade handler function + * @fd: param[in] sysfs device descriptor + * @buf: param[in] Update data + * @size: param[in] Update data size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_spi_logic_dev(int fd, uint8_t *buf, uint32_t size, name_info_t *info) +{ + int ret; + firmware_spi_logic_upg_t current_upg_priv; + + if ((fd < 0) || (buf == NULL) || (info == NULL)) { + dbg_print(is_debug_on, "Error:firmware upgrade spi logic dev parameters failed.\n"); + return FIRMWARE_FAILED; + } + + /* Gets the current logical device information */ + mem_clear(¤t_upg_priv, sizeof(firmware_spi_logic_upg_t)); + ret = firmware_upgrade_get_spi_logic_info(fd, ¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_get_spi_logic_info failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "current_upg_priv dev_path[%s] flash_base[0x%0x] ctrl_base[0x%0x]\n", + current_upg_priv.dev_path, current_upg_priv.flash_base, + current_upg_priv.ctrl_base); + + /* Enable upgrade access */ + ret = firmware_upgrade_spi_logic_init(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_init failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Upgrade logic device */ + ret = firmware_upgrade_do_spi_logic(¤t_upg_priv, buf, size); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_do_spi_logic failed ret %d.\n", ret); + goto fail; + } + + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_SUCCESS; +fail: + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_FAILED; +} + +int firmware_fpga_upgrade_test(firmware_spi_logic_upg_t *current_upg_priv) +{ + int ret, i, j, num; + uint8_t *wbuf; + uint32_t retry; + + ret = FW_SPI_FLASH_RV_OK; + wbuf = (uint8_t *) malloc(current_upg_priv->test_size); + if (wbuf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory for test data buf, size=0x%x.\n", current_upg_priv->test_size); + ret = -FW_SPI_FLASH_NOT_SUPPORT_TEST; + goto exit; + } + mem_clear(wbuf, current_upg_priv->test_size); + /* Get random data */ + for (j = 0; j < current_upg_priv->test_size; j++) { + num = rand() % 256; + wbuf[j] = num & 0xff; + } + + i = 0; + retry = FIRMWARE_SPI_LOGIC_UPG_RETRY_CNT; + + ret = 0; + while(i < retry) { + ret = firmware_upgreade_fpga_onetime(current_upg_priv, current_upg_priv->test_base, wbuf, current_upg_priv->test_size); + if (ret) { + i++; + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime test size 0x%x failed ret %d.\n", + current_upg_priv->test_size, ret); + continue; + } else { + dbg_print(is_debug_on, "firmware_upgreade_fpga_onetime test success.\n"); + break; + } + } + free(wbuf); +exit: + return ret; +} + +/* + * firmware_upgrade_spi_logic_dev_test + * function: FPGA SPI FLASH Firmware upgrade test handler function + * @fd: param[in] sysfs device descriptor + * @buf: param[in] Update data + * @size: param[in] Update data size + * @info: param[in] Upgrade file information + * return value : success--FIRMWARE_SUCCESS; fail--FIRMWARE_FAILED + */ +int firmware_upgrade_spi_logic_dev_test(int fd, name_info_t *info) +{ + int ret; + firmware_spi_logic_upg_t current_upg_priv; + + if ((fd < 0) || (info == NULL)) { + dbg_print(is_debug_on, "Error:firmware upgrade spi logic dev parameters failed.\n"); + return FIRMWARE_FAILED; + } + + /* Gets the current logical device information */ + mem_clear(¤t_upg_priv, sizeof(firmware_spi_logic_upg_t)); + ret = firmware_upgrade_get_spi_logic_info(fd, ¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_get_spi_logic_info failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "current_upg_priv dev_path[%s] test_base[0x%0x] test_size[0x%x]\n", + current_upg_priv.dev_path, current_upg_priv.test_base, current_upg_priv.test_size); + if (current_upg_priv.test_size <= 0) { + dbg_print(is_debug_on, "Error: don't support flast test.\n"); + return FIRMWARE_NOT_SUPPORT; + } + + /* Enable upgrade access */ + ret = firmware_upgrade_spi_logic_init(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_init failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* Upgrade logic device */ + ret = firmware_fpga_upgrade_test(¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_do_spi_logic failed ret %d.\n", ret); + goto fail; + } + + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_SUCCESS; +fail: + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_FAILED; +} + +static int firmware_upgreade_spi_logic_dump(firmware_spi_logic_upg_t *upg_priv, + uint32_t offset, uint8_t *buf, uint32_t size) +{ + int ret, i; + uint32_t addr, buf_page, retry, cnt, rd_len; + + buf_page = FFPGA_UPG_DATA_SIZE; /* read data by BUF SIZE each time */ + + cnt = size / FFPGA_UPG_DATA_SIZE; + if (size % FFPGA_UPG_DATA_SIZE) { + cnt++; + } + dbg_print(is_debug_on, "need read number of times:%d.\n", cnt); + + for (i = 0; i < cnt; i++) { + addr = offset + i * FFPGA_UPG_DATA_SIZE; + if (i == (cnt - 1)) { + /* last time read remain size */ + rd_len = size - buf_page * i; + } else { + /* each time read buf page size */ + rd_len = buf_page; + } + + for (retry = 0; retry < FPGA_UPG_RETRY_TIMES; retry++) { + ret = firmware_fpga_upg_read(upg_priv, addr, buf, rd_len); + if (ret < 0) { + dbg_print(is_debug_on, "addr:0x%x read %d time failed. ret %d\n", addr, retry, ret); + continue; + } + break; + } + + if (ret < 0) { + dbg_print(is_debug_on, "finally addr:0x%x read failed ret %d\n", addr, ret); + return FIRMWARE_FAILED; + } + + buf += rd_len; /* buf pointer offset rd_len */ + } + + return FIRMWARE_SUCCESS; +} + +static int firmware_fpga_dump_read(int fd, uint32_t offset, uint8_t *buf, uint32_t len) +{ + int ret; + firmware_spi_logic_upg_t current_upg_priv; + + if ((fd < 0) || (buf == NULL)) { + dbg_print(is_debug_on, "Error:firmware upgrade spi logic dev parameters failed.\n"); + return FIRMWARE_FAILED; + } + + /* Gets the current logical device information */ + mem_clear(¤t_upg_priv, sizeof(firmware_spi_logic_upg_t)); + ret = firmware_upgrade_get_spi_logic_info(fd, ¤t_upg_priv); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_get_spi_logic_info failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "current_upg_priv dev_path[%s] flash_base[0x%0x] ctrl_base[0x%0x]\n", + current_upg_priv.dev_path, current_upg_priv.flash_base, + current_upg_priv.ctrl_base); + + /* Enable upgrade access */ + ret = firmware_upgrade_spi_logic_init(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_init failed ret %d.\n", ret); + return FIRMWARE_FAILED; + } + + /* read logic device */ + ret = firmware_upgreade_spi_logic_dump(¤t_upg_priv, offset, buf, len); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_do_spi_logic failed ret %d.\n", ret); + goto fail; + } + + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_SUCCESS; + +fail: + /* disable upgrade access */ + ret = firmware_upgrade_spi_logic_finish(fd); + if (ret < 0) { + dbg_print(is_debug_on, "Error:firmware_upgrade_spi_logic_finish failed ret %d.\n", ret); + } + + return FIRMWARE_FAILED; +} + +int firmware_upgrade_spi_logic_dev_dump(char *dev_name, uint32_t offset, + uint32_t len, char *record_file) +{ + int ret, dev_fd, file_fd; + char save_file[FIRMWARE_LOGIC_DEV_NAME_LEN]; + uint8_t *buf; + + dev_fd = open(dev_name, O_RDWR); + if (dev_fd < 0) { + dbg_print(is_debug_on, "Error: Failed to open %s, errno:%d.\n", dev_name, errno); + return FIRMWARE_FAILED; + } + + dbg_print(is_debug_on, "open dev file %s succeeded.\n", dev_name); + + buf = (uint8_t *) malloc(len); + if (buf == NULL) { + dbg_print(is_debug_on, "Error: Failed to malloc memory read %s data.\n", dev_name); + ret = FIRMWARE_FAILED; + goto free_dev_fd; + } + + mem_clear(buf, len); + ret = firmware_fpga_dump_read(dev_fd, offset, buf, len); + if (ret < 0) { + dbg_print(is_debug_on, "addr 0x%x read 0x%x failed ret:%d\n", offset, len, ret); + goto free_data; + } + + dbg_print(is_debug_on, "dump data succeeded. offset:0x%x, len:0x%x\n", offset, len); + + if (strcmp(record_file, "print") != 0) { /* record dump data on 'record_file' */ + mem_clear(save_file, FIRMWARE_LOGIC_DEV_NAME_LEN); + strncpy(save_file, record_file, FIRMWARE_LOGIC_DEV_NAME_LEN - 1); + file_fd = open(save_file, O_RDWR|O_CREAT|O_TRUNC, S_IRWXG|S_IRWXU|S_IRWXO); + if (file_fd < 0) { + dbg_print(is_debug_on, "open file %s fail, errno:%d.\n", save_file, errno); + ret = -ENOENT; + goto free_data; + } + + dbg_print(is_debug_on, "open save file %s succeeded.\n", save_file); + + ret = write(file_fd, buf, len); + if (ret < 0) { + dbg_print(is_debug_on, "write failed (errno: %d).\n", errno); + goto free_file_fd; + } + dbg_print(is_debug_on, "write save file %s succeeded.\n", save_file); + ret = FIRMWARE_SUCCESS; + } else { /* print reg on terminal by format */ + firmware_upgrade_printf_reg((uint8_t*)buf, len, offset); + ret = FIRMWARE_SUCCESS; + goto free_data; + } + +free_file_fd: + close(file_fd); +free_data: + free(buf); +free_dev_fd: + close(dev_fd); + + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h new file mode 100644 index 0000000000..32f820161e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/fw_upg_sysfs/fw_upg_spi_logic_dev.h @@ -0,0 +1,90 @@ +#ifndef __FW_UPG_SPI_LOGIC_DEV_H__ +#define __FW_UPG_SPI_LOGIC_DEV_H__ + +#define FIRMWARE_FPGA_WORD_LEN (4) + +#define FIRMWARE_LOGIC_DEV_NAME_LEN (64) /* the macro definition needs to same as FIRMWARE_DEV_NAME_LEN in firmware_sysfs_upgrade.h */ +#define FIRMWARE_SPI_LOGIC_UPG_RETRY_CNT (10) +#define FIRMWARE_SPI_LOGIC_UPG_BUFF_SIZE (256) +#define FIRMWARE_SPI_LOGIC_SECTOR_SIZE (0x10000) /* One sector is 64Kk */ + +#define FIRMWARE_UPG_RETRY_SLEEP_TIME (10) /* 10us */ +#define FIRMWARE_UPG_RETRY_TIME_CNT (1000) +#define FPGA_UPG_WAIT_SPI_RETRY_CNT (100) +#define FPGA_UPG_WAIT_SPI_RETRY_SLEEP_TIME (1000 * 10) /* 10ms */ + +#define FIRMWARE_FPGA_UPG_RETRY_CNT (100) + +/* FPGA upgrades related instruction definitions */ +#define FPGA_UPG_INSTRUTION_SE (0xD8) +#define FPGA_UPG_INSTRUTION_RDSR (0x05) +#define FPGA_UPG_INSTRUTION_WREN (0x06) +#define FPGA_UPG_INSTRUTION_PP (0x02) +#define FPGA_UPG_INSTRUTION_FR (0x0B) +#define FPGA_UPG_INSTRUTION_BE (0xC7) +#define FPGA_UPG_STATUS_MASK (0x1) +#define FPGA_UPG_ACCESS_ENABLE (0x3) +#define FPGA_UPG_SPI_STATUS_MASK (0x1) +#define FFPGA_UPG_DATA_SIZE (256) + +#define FPGA_UPG_RETRY_TIMES (3) + +/* FPGA upgrades the offset of the associated register */ +#define FPGA_UPG_STATUS_REG (0x180) +#define FPGA_UPG_SPI_CTRL_REG (0x184) +#define FPGA_UPG_WR_FLASH_STATUS_REG (0x188) +#define FPGA_UPG_RD_FLASH_STATUS_REG (0x18C) +#define FPGA_UPG_INSTRUCTION_REG (0x190) +#define FPGA_UPG_ADDR_REG (0x194) +#define FPGA_UPG_LENGTH_REG (0x198) +#define FPGA_UPG_DEVICE_ID_REG (0x19C) +#define FPGA_UPG_DROP_REQ_NUM_REG (0x1A8) + +typedef struct firmware_spi_logic_info_s { + char logic_dev_name[FIRMWARE_LOGIC_DEV_NAME_LEN]; /* Logical device name */ + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t ctrl_base; /* SPI upgrade control register base address */ + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +} firmware_spi_logic_info_t; + +typedef struct firmware_spi_logic_upg_s { + char dev_path[FIRMWARE_LOGIC_DEV_NAME_LEN]; + uint32_t flash_base; /* Flash Upgrade Address */ + uint32_t ctrl_base; /* SPI upgrade control register base address */ + uint32_t status_reg; + uint32_t spi_ctrl_reg; + uint32_t wr_flash_status_reg; + uint32_t rd_flash_status_reg; + uint32_t instruction_reg; + uint32_t addr_reg; + uint32_t length_reg; + uint32_t device_id_reg; + uint32_t drop_reg_num_reg; + uint32_t test_base; /* Test flash address */ + uint32_t test_size; /* Test flash size */ +}firmware_spi_logic_upg_t; + +typedef enum firmware_spi_flash_rv_s { + FW_SPI_FLASH_RV_OK = 0, + FW_SPI_FLASH_STATUS_ERR, + FW_SPI_FLASH_BUSY, + FW_SPI_FLASH_SPI_BUSY, + FW_SPI_FLASH_WR_ENABLE_ERR, + FW_SPI_FLASH_ERASE_ADDR_ERR, + FW_SPI_FLASH_ERASE_SECTOR_ERR, + FW_SPI_FLASH_WR_ERR, + FW_SPI_FLASH_RD_ERR, + FW_SPI_FLASH_PARAM_ERR, + FW_SPI_FLASH_UPG_ERR, + FW_SPI_FLASH_WR_LENGTH_ERR, + FW_SPI_FLASH_WR_ADDR_ERR, + FW_SPI_FLASH_SET_ACCESS_ERR, + FW_SPI_FLASH_DATA_CMP_ERR, + FW_SPI_FLASH_GET_INFO_ERR, + FW_SPI_FLASH_NOT_SUPPORT_TEST, +} firmware_spi_flash_rv_t; + +int fpga_test_spi_logic_flash(int argc, char *argv[]); + +#endif /* End of __FW_UPG_SPI_LOGIC_DEV_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h new file mode 100644 index 0000000000..17dd42c3ef --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/debug.h @@ -0,0 +1,34 @@ +/* + * + * debug.h + * firmware upgrade debug switch control + */ + +#ifndef __FIRMWARE_UPGRADE_DEBUG_H__ +#define __FIRMWARE_UPGRADE_DEBUG_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define DEBUG_INFO_LEN 20 +#define DEBUG_FILE "/tmp/.firmware_upgrade_debug" +#define DEBUG_ON_ALL "3" +#define DEBUG_ON_INFO "1" +#define DEBUG_OFF_INFO "0" + +enum debug_s { + DEBUG_OFF = 0, /* off debug */ + DEBUG_APP_ON, /* open app debug */ + DEBUG_ALL_ON, /* open all debug */ + DEBUG_IGNORE, /* ignore debug */ +}; + +#define dbg_print(debug, fmt, arg...) \ + if (debug == DEBUG_APP_ON || debug == DEBUG_ALL_ON) \ + { do{printf(fmt,##arg);} while(0); } + +/* firmware upgrade debug switch */ +extern int firmware_upgrade_debug(void); +extern int is_debug_on; + +#endif /* End of __FIRMWARE_UPGRADE_DEBUG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h new file mode 100644 index 0000000000..581b2e969e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/firmware_app.h @@ -0,0 +1,172 @@ +#ifndef __FIRMWARE_APP_H__ +#define __FIRMWARE_APP_H__ + +#include +#include +#include +#include +#include +#include + +#define ERR_FW_CHECK_CPLD_UPGRADE (-601) /* File validation error */ +#define ERR_FW_CHECK_FPGA_UPGRADE (-602) +#define ERR_FW_MATCH_CPLD_UPGRADE (-603) /* No matching upgrade file found */ +#define ERR_FW_MATCH_FPGA_UPGRADE (-604) +#define ERR_FW_SAMEVER_CPLD_UPGRADE (-605) /* the same version */ +#define ERR_FW_SAMEVER_FPGA_UPGRADE (-606) +#define ERR_FW_DO_CPLD_UPGRADE (-607) /* upgrade fail */ +#define ERR_FW_DO_FPGA_UPGRADE (-608) +#define ERR_FW_UPGRADE (-609) /* other fail */ +#define ERR_FW_CHECK_UPGRADE (-610) /* File validation error */ +#define ERR_FW_MATCH_UPGRADE (-611) /* No matching upgrade file found */ +#define ERR_FW_SAMEVER_UPGRADE (-612) /* the same version */ +#define ERR_FW_DO_UPGRADE (-613) /* upgrade fail */ +#define ERR_FW_DO_UPGRADE_NOT_SUPPORT (-614) /* upgrade fail */ + +#define FIRMWARE_NOT_SUPPORT (-2) +#define FIRMWARE_FAILED (-1) +#define FIRMWARE_SUCCESS (0) + +#define FIRMWARE_ACTION_CHECK 0 +#define FIRMWARE_ACTION_MATCH 1 +#define FIRMWARE_ACTION_VERCHECK 2 +#define FIRMWARE_ACTION_UPGRADE 3 +#define FIRMWARE_ACTION_SUPPORT 4 + +#define FIRMWARE_UPGRADE_RETRY_CNT (10) +#define FIRMWARE_NAME_LEN (48) +#define FIRMWARE_SLOT_MAX_NUM (16) /* Maximum number of links supported by board cards */ + +/* Upgrade file headers */ +#define MAX_DEV_NUM 10 /* Maximum number of devices to which the upgrade file is applicable */ +#define INSMOD_DRIVER 1 /* insmod driver */ +#define RMMOD_DRIVER 0 /* rmmod driver */ +#define MAX_HEADER_SIZE 1000 /* Upgrade the maximum length of file header information */ +#define MAX_HEADER_KV_SIZE 64 /* Upgrade the maximum length of the file header key value */ + +/* Upgrade file header key values */ +#define FILEHEADER_DEVTYPE "DEVTYPE" +#define FILEHEADER_SUBTYPE "SUBTYPE" +#define FILEHEADER_TYPE "TYPE" +#define FILEHEADER_CHAIN "CHAIN" +#define FILEHEADER_CHIPNAME "CHIPNAME" +#define FILEHEADER_VERSION "VERSION" +#define FILEHEADER_FILETYPE "FILETYPE" +#define FILEHEADER_CRC "CRC" + +#define FIRMWARE_CPLD_NAME "cpld" +#define FIRMWARE_FPGA_NAME "fpga" + +/* ioctl publi command, the same as driver */ +#define FIRMWARE_COMMON_TYPE 'C' +#define FIRMWARE_GET_CHIPNAME _IOR(FIRMWARE_COMMON_TYPE, 0, char) /* get the chip name */ +#define FIRMWARE_GET_VERSION _IOR(FIRMWARE_COMMON_TYPE, 2, int) /* get version */ +#define FIRMWARE_SET_DEBUG_ON _IOW(FIRMWARE_COMMON_TYPE, 3, int) /* debug on */ +#define FIRMWARE_SET_DEBUG_OFF _IOW(FIRMWARE_COMMON_TYPE, 4, int) /* debug off */ + +/* firmware cpld driver ioctl command, the same as "firmware_driver\firmware_driver\include\firmware.h" */ +#define FIRMWARE_TYPE 'J' +#define FIRMWARE_PROGRAM _IOW(FIRMWARE_TYPE, 1, char) /* firmware upgrade ISC */ +#define FIRMWARE_READ_CHIP _IOR(FIRMWARE_TYPE, 5, int) /* read the contents of the chip */ +#define FIRMWARE_PROGRAM_JBI _IOW(FIRMWARE_TYPE, 6, char) /* firmware upgrade JBI */ + +/* firmware cpld ispvme driver ioctl command, the same as "firmware_driver\firmware_driver_ispvme\include\firmware_ispvme.h" */ +#define FIRMWARE_VME_TYPE 'V' +#define FIRMWARE_JTAG_TDI _IOR(FIRMWARE_VME_TYPE, 0, char) +#define FIRMWARE_JTAG_TDO _IOR(FIRMWARE_VME_TYPE, 1, char) +#define FIRMWARE_JTAG_TCK _IOR(FIRMWARE_VME_TYPE, 2, char) +#define FIRMWARE_JTAG_TMS _IOR(FIRMWARE_VME_TYPE, 3, char) +#define FIRMWARE_JTAG_EN _IOR(FIRMWARE_VME_TYPE, 4, char) +#define FIRMWARE_JTAG_INIT _IOR(FIRMWARE_VME_TYPE, 7, char) /* enable upgrade access */ +#define FIRMWARE_JTAG_FINISH _IOR(FIRMWARE_VME_TYPE, 8, char) /* disable upgrade access */ + +/* firmware sysfs driver ioctl command, the same as "firmware_driver\firmware_driver_sysfs\include\firmware_sysfs.h" */ +#define FIRMWARE_SYSFS_TYPE 'S' +#define FIRMWARE_SYSFS_INIT _IOR(FIRMWARE_SYSFS_TYPE, 0, char) /* enable upgrade access */ +#define FIRMWARE_SYSFS_FINISH _IOR(FIRMWARE_SYSFS_TYPE, 1, char) /* disable upgrade access */ +#define FIRMWARE_SYSFS_SPI_INFO _IOR(FIRMWARE_SYSFS_TYPE, 2, char) /* spi flash upgrade */ +#define FIRMWARE_SYSFS_DEV_FILE_INFO _IOR(FIRMWARE_SYSFS_TYPE, 3, char) /* sysfs upgrade */ +#define FIRMWARE_SYSFS_MTD_INFO _IOR(FIRMWARE_SYSFS_TYPE, 4, char) /* sysfs mtd upgrade */ + +/* VME file, used to distinguish the JTAG signal that needs to operate */ +#define JTAG_TDO 1 +#define JTAG_TCK 2 +#define JTAG_TDI 3 +#define JTAG_TMS 4 +#define JTAG_ENABLE 5 +#define JTAG_TRST 6 + +typedef struct name_info_s { + int card_type[MAX_DEV_NUM]; /* main board type */ + int sub_type[MAX_DEV_NUM]; /* sub board type */ + int type; /* device type */ + int chain; /* chain num */ + char chip_name[FIRMWARE_NAME_LEN]; /* chip name */ + char version[FIRMWARE_NAME_LEN]; /* version */ + int file_type; /* file type */ + unsigned int crc32; /* 4 byte CRC values */ +} name_info_t; + +typedef struct cmd_info_s { + uint32_t size; + void *data; +} cmd_info_t; + +enum firmware_type_s { + FIRMWARE_UNDEF_TYPE = 0, + FIRMWARE_CPLD, + FIRMWARE_FPGA, + FIRMWARE_SYSFS, + FIRMWARE_OTHER, +}; + +typedef enum firmware_file_type_s { + FIRMWARE_UNDEF_FILE_TYPE = 0, + FIRMWARE_VME, /* ispvme cpld, GPIO simulates JTAG */ + FIRMWARE_ISC, /* cpld, GPIO simulates JTAG */ + FIRMWARE_JBI, + FIRMWARE_SPI_LOGIC_DEV, /* FPGA SPI upgrde register upgrade flash */ + FIRMWARE_SYSFS_DEV, /* write file upgrade eeprom */ + FIRMWARE_MTD, /* upgrade mtd device */ + FIRMWARE_NONE, +} firmware_file_type_t; + +typedef struct firmware_file_name_s { + char firmware_file_name_str[MAX_HEADER_KV_SIZE]; + int firmware_file_type; +} firmware_file_name_t; + +extern int header_offset; + +/* CRC32 calculation */ +extern unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len); +/* VME file upgrade */ +extern int firmware_upgrade_ispvme(int file_fd, char *upgrade_file_name, name_info_t *info); +extern void writePort(unsigned char a_ucPins, unsigned char a_ucValue); +extern unsigned char readPort(); +extern void sclock(); +extern void ispVMStateMachine(signed char NextState); + +/* spi flash upgrade */ +extern int firmware_upgrade_spi_logic_dev(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* spi flash upgrade test*/ +extern int firmware_upgrade_spi_logic_dev_test(int fd, name_info_t *info); +/* spi flash data print*/ +extern int firmware_upgrade_spi_logic_dev_dump(char *dev_name, uint32_t offset, uint32_t size, char *record_file); + +/* sysfs upgrade */ +extern int firmware_upgrade_sysfs(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* sysfs upgrade test*/ +extern int firmware_upgrade_sysfs_test(int fd, name_info_t *info); + +/* isc upgrade */ +extern int firmware_upgrade_jtag(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* isc upgrade test */ +extern int firmware_upgrade_jtag_test(int fd, uint8_t *buf, uint32_t size, name_info_t *info); + +/* mtd upgrade */ +extern int firmware_upgrade_mtd(int fd, uint8_t *buf, uint32_t size, name_info_t *info); +/* mtd upgrade test */ +extern int firmware_upgrade_mtd_test(int fd, name_info_t *info); + +#endif /* End of __FIRMWARE_APP_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h new file mode 100644 index 0000000000..ae9d713ff8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/firmware_upgrade/firmware_upgrade/include/vmopcode.h @@ -0,0 +1,192 @@ +/*************************************************************** +* +* This is the include file for Lattice Semiconductor's ispVM +* Embedded software application. +* +***************************************************************/ + +/*************************************************************** +* +* VME version. +* +* History: +* +***************************************************************/ + +#define VME_VERSION_NUMBER "12.2" + +/*************************************************************** +* +* Maximum declarations. +* +***************************************************************/ + +#define VMEHEXMAX 60000L /* The hex file is split 60K per file. */ +#define SCANMAX 64000L /* The maximum SDR/SIR burst. */ + +/*************************************************************** +* +* Supported JTAG state transitions. +* +***************************************************************/ + +#define RESET 0x00 +#define IDLE 0x01 +#define IRPAUSE 0x02 +#define DRPAUSE 0x03 +#define SHIFTIR 0x04 +#define SHIFTDR 0x05 +#define DRCAPTURE 0x06 + +/*************************************************************** +* +* Flow control register bit definitions. A set bit indicates +* that the register currently exhibits the corresponding mode. +* +***************************************************************/ + +#define INTEL_PRGM 0x0001 /* Intelligent programming is in effect. */ +#define CASCADE 0x0002 /* Currently splitting large SDR. */ +#define REPEATLOOP 0x0008 /* Currently executing a repeat loop. */ +#define SHIFTRIGHT 0x0080 /* The next data stream needs a right shift. */ +#define SHIFTLEFT 0x0100 /* The next data stream needs a left shift. */ +#define VERIFYUES 0x0200 /* Continue if fail is in effect. */ + +/*************************************************************** +* +* DataType register bit definitions. A set bit indicates +* that the register currently holds the corresponding type of data. +* +***************************************************************/ + +#define EXPRESS 0x0001 /* Simultaneous program and verify. */ +#define SIR_DATA 0x0002 /* SIR is the active SVF command. */ +#define SDR_DATA 0x0004 /* SDR is the active SVF command. */ +#define COMPRESS 0x0008 /* Data is compressed. */ +#define TDI_DATA 0x0010 /* TDI data is present. */ +#define TDO_DATA 0x0020 /* TDO data is present. */ +#define MASK_DATA 0x0040 /* MASK data is present. */ +#define HEAP_IN 0x0080 /* Data is from the heap. */ +#define LHEAP_IN 0x0200 /* Data is from intel data buffer. */ +#define VARIABLE 0x0400 /* Data is from a declared variable. */ +#define CRC_DATA 0x0800 /* CRC data is pressent. */ +#define CMASK_DATA 0x1000 /* CMASK data is pressent. */ +#define RMASK_DATA 0x2000 /* RMASK data is pressent. */ +#define READ_DATA 0x4000 /* READ data is pressent. */ +#define DMASK_DATA 0x8000 /* DMASK data is pressent. */ + +/*************************************************************** +* +* Pin opcodes. +* +***************************************************************/ + +#define signalENABLE 0x1C /* ispENABLE pin. */ +#define signalTMS 0x1D /* TMS pin. */ +#define signalTCK 0x1E /* TCK pin. */ +#define signalTDI 0x1F /* TDI pin. */ +#define signalTRST 0x20 /* TRST pin. */ + +/*************************************************************** +* +* Supported vendors. +* +***************************************************************/ + +#define VENDOR 0x56 +#define LATTICE 0x01 +#define ALTERA 0x02 +#define XILINX 0x03 + +/*************************************************************** +* +* Opcode definitions. +* +* Note: opcodes must be unique. +* +***************************************************************/ + +#define ENDDATA 0x00 /* The end of the current SDR data stream. */ +#define RUNTEST 0x01 /* The duration to stay at the stable state. */ +#define ENDDR 0x02 /* The stable state after SDR. */ +#define ENDIR 0x03 /* The stable state after SIR. */ +#define ENDSTATE 0x04 /* The stable state after RUNTEST. */ +#define TRST 0x05 /* Assert the TRST pin. */ +#define HIR 0x06 /* The sum of the IR bits of the leading devices. */ +#define TIR 0x07 /* The sum of the IR bits of the trailing devices. */ +#define HDR 0x08 /* The number of leading devices. */ +#define TDR 0x09 /* The number of trailing devices. */ +#define ispEN 0x0A /* Assert the ispEN pin. */ +#define FREQUENCY 0x0B /* The maximum clock rate to run the JTAG state machine. */ +#define STATE 0x10 /* Move to the next stable state. */ +#define SIR 0x11 /* The instruction stream follows. */ +#define SDR 0x12 /* The data stream follows. */ +#define TDI 0x13 /* The following data stream feeds into the device. */ +#define TDO 0x14 /* The following data stream is compared against the device. */ +#define MASK 0x15 /* The following data stream is used as mask. */ +#define XSDR 0x16 /* The following data stream is for simultaneous program and verify. */ +#define XTDI 0x17 /* The following data stream is for shift in only. It must be stored for the next XSDR. */ +#define XTDO 0x18 /* There is not data stream. The data stream was stored from the previous XTDI. */ +#define MEM 0x19 /* The maximum memory needed to allocate in order hold one row of data. */ +#define WAIT 0x1A /* The duration of delay to observe. */ +#define TCK 0x1B /* The number of TCK pulses. */ +#define SHR 0x23 /* Set the flow control register for right shift. */ +#define SHL 0x24 /* Set the flow control register for left shift. */ +#define HEAP 0x32 /* The memory size needed to hold one loop. */ +#define REPEAT 0x33 /* The beginning of the loop. */ +#define LEFTPAREN 0x35 /* The beginning of data following the loop. */ +#define VAR 0x55 /* Plac holder for loop data. */ +#define SEC 0x1C /* The delay time in seconds that must be observed. */ +#define SMASK 0x1D /* The mask for TDI data. */ +#define MAX 0x1E /* The absolute maximum wait time. */ +#define ON 0x1F /* Assert the targeted pin. */ +#define OFF 0x20 /* Dis-assert the targeted pin. */ +#define SETFLOW 0x30 /* Change the flow control register. */ +#define RESETFLOW 0x31 /* Clear the flow control register. */ +#define CRC 0x47 /* The following data stream is used for CRC calculation. */ +#define CMASK 0x48 /* The following data stream is used as mask for CRC calculation. */ +#define RMASK 0x49 /* The following data stream is used as mask for read and save. */ +#define READ 0x50 /* The following data stream is used for read and save. */ +#define ENDLOOP 0x59 /* The end of the repeat loop. */ +#define SECUREHEAP 0x60 /* Used to secure the HEAP opcode. */ +#define VUES 0x61 /* Support continue if fail. */ +#define DMASK 0x62 /* The following data stream is used for dynamic I/O. */ +#define COMMENT 0x63 /* Support SVF comments in the VME file. */ +#define HEADER 0x64 /* Support header in VME file. */ +#define FILE_CRC 0x65 /* Support crc-protected VME file. */ +#define LCOUNT 0x66 /* Support intelligent programming. */ +#define LDELAY 0x67 /* Support intelligent programming. */ +#define LSDR 0x68 /* Support intelligent programming. */ +#define LHEAP 0x69 /* Memory needed to hold intelligent data buffer */ +#define CONTINUE 0x70 /* Allow continuation. */ +#define LVDS 0x71 /* Support LVDS. */ +#define ENDVME 0x7F /* End of the VME file. */ +#define HIGH 0x80 /* Assert the targeted pin. */ +#define LOW 0x81 /* Dis-assert the targeted pin. */ +#define ENDFILE 0xFF /* End of file. */ + +/*************************************************************** +* +* ispVM Embedded Return Codes. +* +***************************************************************/ + +#define VME_VERIFICATION_FAILURE -1 +#define VME_FILE_READ_FAILURE -2 +#define VME_VERSION_FAILURE -3 +#define VME_INVALID_FILE -4 +#define VME_ARGUMENT_FAILURE -5 +#define VME_CRC_FAILURE -6 + +/*************************************************************** +* +* Type definitions. +* +***************************************************************/ + +/* Support LVDS */ +typedef struct { + unsigned short usPositiveIndex; + unsigned short usNegativeIndex; + unsigned char ucUpdate; +} LVDSPair; diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile new file mode 100644 index 0000000000..1701b5f621 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Makefile @@ -0,0 +1,18 @@ +top_srcdir:=$(shell pwd) +include $(top_srcdir)/Rules.mk + +firmware-y:= +firmware-y += fw_upgrade + +.PHONY: all +all: build + +.PHONY: build +build: $(firmware-y) +$(foreach dir,$(firmware-y),$(eval $(call compile_dirs,$(dir)))) + +.PHONY: rpmpkg +rpmpkg: +ifeq ("$(CONFIG_CPLD_UPGRADE_ISPVME)", "y") + #$(RPMPKG) $(install_cpld_dir) firmware-cpld-ispvme.spec git +endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk new file mode 100644 index 0000000000..5fb5a09d34 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/Rules.mk @@ -0,0 +1,42 @@ +CC ?= $(CROSS)gcc +AR ?= $(CROSS)ar +AS ?= $(CROSS)as +LD ?= $(CROSS)ld +STRIP ?= $(CROSS)strip + +install_root:=${top_srcdir}/images + +install_header_dir:=${install_root}/header +install_adir:=$(install_root)/lib +install_symbol_dir:=$(install_root)/symbol +symbol_files:=$(shell find $(EXPORT_SYMBOL) -name 'Module.symvers') +# +# symbol_files += $(shell find $(install_symbol_dir) -name 'Module.symvers') +# KBUILD_EXTRA_SYMBOLS += $(symbol_files) +# export KBUILD_EXTRA_SYMBOLS + +# top root: install_rootfs_dir +install_rootfs_dir:=$(install_root)/rootfs + +install_sodir:=$(install_rootfs_dir)/$(INSTALL_SODIR) + +install_usr_bin_dir:=$(install_rootfs_dir)/usr/bin +install_sbin_dir:=$(install_rootfs_dir)/sbin +install_etc_dir:=$(install_rootfs_dir)/etc + +export INSTALL_MOD_PATH:=$(ROOT) + +BUILD_CFLAGS:=$(CFLAGS) -I$(install_header_dir) +BUILD_LDFLAGS:=$(LDFLAGS) -L/$(install_sodir) -L/$(install_adir) + +define compile_dirs +.PHONY: $(1) +$(1): + @echo;echo "building $(1)..." + @$(MAKE) -C ${1} +endef + +compile.c = $(CC) $(BUILD_CFLAGS) -d -c -o $@ $< +%.o: %.c + $(compile.c) + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile new file mode 100644 index 0000000000..8b4bca7390 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/Makefile @@ -0,0 +1,39 @@ +include ../Rules.mk + +OBJ = fw_upgrade.o fw_upgrade_debug.o + +LIB += $(BUILD_CFALGS) $(BUILD_LDFLAGS) -lpthread +ifdef ENABLE_GCOV +ifeq ($(ENABLE_GCOV), y) +LIB += -fprofile-arcs +endif +endif # ENABLE_GCOV + +APP = fw_upgrade +BUILD_DIR = tmp +ELF_FILE = $(BUILD_DIR)/$(APP) +MAP_FILE = $(BUILD_DIR)/$(APP).map.sym +INCLUDE = -Iinclude +CFLAGS+=-Wall -W -g + +.PHONY: build +build:make-dir $(addprefix $(BUILD_DIR)/,$(OBJ)) + $(CC) -o $(ELF_FILE) $(addprefix $(BUILD_DIR)/,$(OBJ)) $(LINKFLAGS) $(LIB) + + cp -p $(ELF_FILE) $(common_out_put_dir) + +.PHONY: make-dir +make-dir: + @mkdir -p $(BUILD_DIR) + +$(BUILD_DIR)/%.o:%.c + $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ + +.PHONY: install +install: + echo "fw_upgrade install success." + cp -p $(ELF_FILE) $(common_out_put_dir) + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c new file mode 100644 index 0000000000..2045608d5c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade.c @@ -0,0 +1,1632 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fw_upgrade.h" + +static flash_info_t flash_info[] = { + { + .flash_name = "M25L6433F", + .flash_size = M32, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25L6433F, + .block_size = STEP_64, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "S25FL512S", + .flash_size = M64, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = S25FL512S, + .block_size = STEP_256, + .full_erase = 0, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX25l512", + .flash_size = M64, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25l512, + .block_size = STEP_64, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "STM25P64", + .flash_size = M12, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = STM25P64, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "STM25P128", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = STM25P128, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "N25Q256", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = N25Q256, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "N25Q512", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = N25Q512, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25X16", + .flash_size = M3, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25X16, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25X64", + .flash_size = M12, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25X64, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25Q64BV", + .flash_size = M12, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25Q64BV, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25Q128BV", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25Q128BV, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "W25Q256FV", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = W25Q256FV, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX25L1605D", + .flash_size = M32, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25L1605D, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX25L12805D", + .flash_size = M32, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX25L12805D, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "MX66L1G45G", + .flash_size = M128, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = MX66L1G45G, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, + { + .flash_name = "GD25Q256", + .flash_size = M16, + .flash_type = SPI, + .page_size = BYTE_256, + .flash_id = GD25Q256, + .block_size = STEP_256, + .full_erase = 1, + .erase_block_command = BLOCK_ERASE_64, + .page_program = COMMON_PAGE_PROGRAM, + }, +}; + +static int debug_on; + +static void help(void) +{ + printf("------------------------------BMC Upgrade Tool--------------------------------\n"); + printf("Program Flash:\n"); + printf("\tfw_upgrade upgrade [file name] [chip select: 0 | 1 | 2] "); + printf("[erase type: full | block]\n"); + printf("\t[file name] if file is not located at /home/admin, path should be added\n"); + printf("\t[chip select] 0:master, 1:slave, 2:both\n"); + printf("\t[erase type] choose a way to erase chip, full erase would be faster\n"); + printf("Read BMC Reg:\n"); + printf("\tfw_upgrade rd [address] [length]\n"); + printf("\t[address(Hexadecimal)] register address of BMC\n"); + printf("\t[length(decimal)] length of read data, should be times of 4\n"); + + return; +} + +static int set_ioport_rw_access(void) +{ + + if ( iopl(3) < 0) { + printf("Can't get access to /dev/port \n"); + return -1; + } + + return 0; +} + +static int get_file_size(char *file_name) +{ + FILE * pFile; + int size; + + pFile = fopen(file_name,"rb"); + if (pFile == NULL) { + printf("Error opening file\n"); + return -1; + } + fseek (pFile, 0, SEEK_END); + size = ftell(pFile); + fclose (pFile); + return size; +} + +static uint8_t _read(uint16_t addr) +{ + return inb(addr); +} + +static void _write(uint16_t addr, uint8_t val) +{ + outb(val, addr); + + return; +} + +static void write_addr_port(uint8_t addr_val, uint16_t addr_port) +{ + _write(addr_port, addr_val); + + return; +} + +static void write_data_port(uint8_t val, uint16_t data_port) +{ + _write(data_port, val); + + return; +} + +static uint8_t read_data_port(uint16_t data_port) +{ + return _read(data_port); +} + +static void write_ilpc2ahb_addr(uint32_t addr) +{ + int i; + + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG0 + i, LPC_ADDR_PORT); + write_data_port((addr >> (8 * (3 - i))) & MASK, LPC_DATA_PORT); + } + + return; +} + +static void write_ilpc2ahb_data(uint32_t data) +{ + int i; + + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG4 + i, LPC_ADDR_PORT); + write_data_port((data >> (8 * (3 - i))) & MASK, LPC_DATA_PORT); + } + + return; +} + +static uint32_t read_ilpc2ahb_data(void) +{ + int i, tmp; + uint32_t res; + + res = 0; + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG4 + i, LPC_ADDR_PORT); + tmp = read_data_port(LPC_DATA_PORT); + res |= (tmp << (8 * (3 - i))); + } + + return res; +} + +static void trigger_ilpc2ahb_read(void) +{ + write_addr_port(SUPERIO_FE, LPC_ADDR_PORT); + read_data_port(LPC_DATA_PORT); + + return; +} + +static void trigger_ilpc2ahb_write(void) +{ + write_addr_port(SUPERIO_FE, LPC_ADDR_PORT); + write_data_port(TOGGLE_WRITE, LPC_DATA_PORT); + + return; +} + +static uint32_t read_bmc_reg(uint32_t addr) +{ + uint32_t res; + + write_ilpc2ahb_addr(addr); + trigger_ilpc2ahb_read(); + res = read_ilpc2ahb_data(); + + return res; +} + +static void write_bmc_reg(uint32_t addr, uint32_t val) +{ + write_ilpc2ahb_addr(addr); + write_ilpc2ahb_data(val); + trigger_ilpc2ahb_write(); + + return; +} + +static uint32_t read_bmc_flash_data(void) +{ + uint32_t res; + + trigger_ilpc2ahb_read(); + res = read_ilpc2ahb_data(); + + return res; +} + +static void write_bmc_flash_data(uint32_t data) +{ + write_ilpc2ahb_data(data); + trigger_ilpc2ahb_write(); + + return; +} + +static void write_bmc_flash_addr(uint32_t addr) +{ + int i; + + for (i = 0; i < 4; i++) { + write_addr_port(SUPERIO_REG4 + i, LPC_ADDR_PORT); + write_data_port((addr >> (8 * i)) & MASK, LPC_DATA_PORT); + } + + trigger_ilpc2ahb_write(); + + return; +} + +static void enable_bytes(int byte) +{ + write_addr_port(SUPERIO_REG8, LPC_ADDR_PORT); + switch (byte) { + case BYTE1: + write_data_port(SUPERIO_A0 + BYTE1_VAL, LPC_DATA_PORT); + break; + case BYTE2: + write_data_port(SUPERIO_A0 + BYTE2_VAL, LPC_DATA_PORT); + break; + case BYTE4: + write_data_port(SUPERIO_A0 + BYTE4_VAL, LPC_DATA_PORT); + break; + default: + write_data_port(SUPERIO_A0 + BYTE_RESERVED, LPC_DATA_PORT); + break; + } + + return; +} + +static void pull_ce_down(flash_info_t* info) +{ + write_bmc_reg(info->ce_control_reg, USER_MODE_PULL_CE_DOWN); + + return; +} + +static void pull_ce_up(flash_info_t* info) +{ + write_bmc_reg(info->ce_control_reg, USER_MODE_PULL_CE_UP); + + return; +} + +static void send_cmd(uint32_t flash_base_addr, int cmd) +{ + write_ilpc2ahb_addr(flash_base_addr); + enable_bytes(1); + write_addr_port(SUPERIO_REG7, LPC_ADDR_PORT); + write_data_port(cmd & MASK, LPC_DATA_PORT); + trigger_ilpc2ahb_write(); + enable_bytes(4); + + return; +} + +static void send_cmd_to_flash(flash_info_t* info, int cmd) +{ + pull_ce_down(info); + send_cmd(info->flash_base_addr, cmd); + pull_ce_up(info); + + return; +} + +static void check_data_length(void) +{ + uint8_t tmp; + /* Data length check, 4 bytes */ + write_addr_port(SUPERIO_REG8, LPC_ADDR_PORT); + tmp = read_data_port(LPC_DATA_PORT); + if (tmp != SUPERIO_A2) { + write_data_port(SUPERIO_A2, LPC_DATA_PORT); + } + + return; +} + +static void enable_ilpc2ahb(void) +{ + /* Write 0xAA then write 0xA5 twice to enable super IO*/ + write_addr_port(DISABLE_LPC, LPC_ADDR_PORT); + write_addr_port(ENABLE_LPC, LPC_ADDR_PORT); + write_addr_port(ENABLE_LPC, LPC_ADDR_PORT); + + /* Enable iLPC2AHB */ + write_addr_port(SUPERIO_07, LPC_ADDR_PORT); + write_data_port(LPC_TO_AHB, LPC_DATA_PORT); + write_addr_port(SUPERIO_30, LPC_ADDR_PORT); + write_data_port(ENABLE_LPC_TO_AHB, LPC_DATA_PORT); + + /* Data length */ + check_data_length(); + + return; +} + +static void disable_ilpc2ahb(void) +{ + /* disable ilpc2ahb */ + write_addr_port(SUPERIO_30, LPC_ADDR_PORT); + write_data_port(DISABLE_LPC_TO_AHB, LPC_DATA_PORT); + /* disable super IO */ + write_addr_port(DISABLE_LPC, LPC_ADDR_PORT); + + return; +} + +/* Enable CPU */ +static void enable_cpu(void) +{ + /* unlock SCU register */ + write_bmc_reg(SCU_ADDR, UNLOCK_SCU_KEY); + /* enable ARM */ + write_bmc_reg(REBOOT_CPU_REGISTER, SET_BMC_CPU_BOOT); + /* lock SCU register */ + write_bmc_reg(SCU_ADDR, LOCK_SCU_KEY); + + return; +} + +/* diasble CPU */ +static void disable_cpu(void) +{ + uint32_t scu_hw_strap_val; + + /* unlock SCU register */ + write_bmc_reg(SCU_ADDR, UNLOCK_SCU_KEY); + /* disable ARM */ + scu_hw_strap_val = read_bmc_reg(HARDWARE_STRAP_REGISTER); + write_bmc_reg(HARDWARE_STRAP_REGISTER, scu_hw_strap_val |0x01); + /* lock SCU register */ + write_bmc_reg(SCU_ADDR, LOCK_SCU_KEY); + + return; +} + +static void enable_upgrade(void) +{ + + enable_ilpc2ahb(); + /* diasble CPU */ + disable_cpu(); + /* init CE control register */ + write_bmc_reg(CE0_CONTROL_REGISTER, 0); + write_bmc_reg(CE1_CONTROL_REGISTER, 0); + /* disable WDT2 */ + write_bmc_reg(WATCHDOG2_CONTROL, DISABLE_WATCHDOG); + + return; +} + +static void disable_upgrade(void) +{ + enable_cpu(); + dbg_print(debug_on, "DEBUG 0x%x\n", read_bmc_reg(HARDWARE_STRAP_REGISTER)); + disable_ilpc2ahb(); + + return; +} + +static void watchdog_status_debug(void) +{ + uint32_t watchdog_reg; + + /* Watchdog Control Register */ + watchdog_reg = read_bmc_reg(WATCHDOG2_CONTROL); + dbg_print(debug_on,"Watchdog Control Register: 0x%x\n", watchdog_reg); + dbg_print(debug_on,"Watchdog Enable Signal: 0x%x\n", watchdog_reg & BIT1); + dbg_print(debug_on,"Watchdog Reset SyS En: 0x%x\n", (watchdog_reg & BIT2) >> 1); + dbg_print(debug_on,"Watchdog Reset Mode: 0x%x\n", (watchdog_reg & (BIT6 | BIT7)) >> 5); + switch (watchdog_reg & (BIT6 | BIT7)) { + case SOC_SYS: + dbg_print(debug_on,"\tReset Mode En: SoC System\n"); + break; + case FULL_CHIP: + dbg_print(debug_on,"\tReset Mode En: Full Chip\n"); + break; + case ARM_CPU: + dbg_print(debug_on,"\tReset Mode En: ARM Cpu\n"); + break; + default: + break; + } + + /* Watchdog Timeout Status Register */ + watchdog_reg = read_bmc_reg(WATCHDOG2_TSR); + dbg_print(debug_on,"Watchdog Timeout Occur: 0x%x\n", watchdog_reg & BIT1); + dbg_print(debug_on,"Watchdog Boot from: CD%d\n", watchdog_reg & BIT2); + dbg_print(debug_on,"Watchdog Interrupt Occur: 0x%x\n", watchdog_reg & BIT3); + + return; +} + +/* CE Type Setting Register */ +static void ce_type_setting_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(FMC_CE_TYPE_SETTING_REG); + if ((fmc_reg & CE0_SPI_TYPE) == SPI) { + dbg_print(debug_on,"CE0 Type Seeting: 0x%x, Type: SPI\n", fmc_reg & CE0_SPI_TYPE); + } else { + dbg_print(debug_on,"CE0 Type Seeting: 0x%x, Type: Unknown\n", fmc_reg & CE0_SPI_TYPE); + } + if (((fmc_reg & CE1_SPI_TYPE) >> BIT2) == SPI) { + dbg_print(debug_on,"CE1 Type Seeting: 0x%x, Type: SPI\n", (fmc_reg & CE1_SPI_TYPE) >> BIT2); + } else { + dbg_print(debug_on,"CE1 Type Seeting: 0x%x, Type: Unknown\n", (fmc_reg & CE1_SPI_TYPE) >> BIT2); + } + + return; +} +/* CE Control Register */ +static void ce_control_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(CE_CONTROL_REGISTER); + dbg_print(debug_on,"CE0 Address Mode: 0x%x, Mode: %d Bytes\n", + fmc_reg & BIT1, (fmc_reg & BIT1) + 3); + dbg_print(debug_on,"CE1 Address Mode: 0x%x, Mode: %d Bytes\n", + (fmc_reg & BIT2) >> 1, ((fmc_reg & BIT2) >> 1) + 3); + + return; +} + +/* Interrupt Control & Status Register */ +static void irq_control_status_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(INR_STATUS_CONTROL_REGISTER); + dbg_print(debug_on,"SPI Write Address Protected Interrupt EN: 0x%x\n", fmc_reg & BIT2); + dbg_print(debug_on,"SPI Command Abort Interrupt EN: 0x%x\n", fmc_reg & BIT3); + dbg_print(debug_on,"SPI Write Address Protected Status: 0x%x, Status: %s\n", + RIGHT_SHIFT_8(fmc_reg) & BIT2, (RIGHT_SHIFT_8(fmc_reg) & BIT2) == BIT2 ? "Occur" : "Normal"); + dbg_print(debug_on,"SPI Command Abort Status: 0x%x, Status: %s\n", + RIGHT_SHIFT_8(fmc_reg) & BIT3, (RIGHT_SHIFT_8(fmc_reg) & BIT3) == BIT3 ? "Occur" : "Normal"); + /*Clear Abnormal Status*/ + if ((RIGHT_SHIFT_8(fmc_reg) & BIT3) || (RIGHT_SHIFT_8(fmc_reg) & BIT2)) { + write_bmc_reg(INR_STATUS_CONTROL_REGISTER, CLEAR_INR_STATUS_CONTROL); + } + + return; +} + +/* Command Control Register */ +static void command_control_debug(void) +{ + uint32_t fmc_reg; + + fmc_reg = read_bmc_reg(COMMAND_CONTROL_REGISTER); + dbg_print(debug_on,"Data Byte Line 0: %s\n", ((fmc_reg & BIT4) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Data Byte Line 1: %s\n", ((fmc_reg & BIT3) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Data Byte Line 2: %s\n", ((fmc_reg & BIT2) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Data Byte Line 3: %s\n", ((fmc_reg & BIT1) != 0) ? "Disable" : "Enable"); + + dbg_print(debug_on,"Address Byte Line 0: %s\n", ((fmc_reg & BIT8) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Address Byte Line 1: %s\n", ((fmc_reg & BIT7) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Address Byte Line 2: %s\n", ((fmc_reg & BIT6) != 0) ? "Disable" : "Enable"); + dbg_print(debug_on,"Address Byte Line 3: %s\n", ((fmc_reg & BIT5) != 0) ? "Disable" : "Enable"); + + return; +} + +static void ce_control_reg_debug(void) +{ + uint32_t fmc_reg; + + /* CE0 Control Register */ + fmc_reg = read_bmc_reg(CE0_CONTROL_REGISTER); + switch (fmc_reg & (BIT1 | BIT2)){ + case NORMAL_READ: + dbg_print(debug_on,"CE0 Command Mode: Normal Read\n"); + break; + case READ_MODE: + dbg_print(debug_on,"CE0 Command Mode: Read Command\n"); + break; + case WRITE_MODE: + dbg_print(debug_on,"CE0 Command Mode: Write Command\n"); + break; + case USER_MODE: + dbg_print(debug_on,"CE0 Command Mode: User Mode\n"); + break; + default: + break; + } + switch((RIGHT_SHIFT_24(fmc_reg) & (BIT5 | BIT6 | BIT7))){ + case 0: + dbg_print(debug_on,"CE0 IO Mode: Single Mode\n"); + break; + case 2: + case 3: + dbg_print(debug_on,"CE0 IO Mode: Dual Mode\n"); + break; + default: + break; + } + + dbg_print(debug_on,"CE0 Inactive Pulse Width: %d HCLK\n", + DEFAULT_WIDTH - (RIGHT_SHIFT_24(fmc_reg) & (BIT1 | BIT2 | BIT3 | BIT4))); + dbg_print(debug_on,"CE0 Data Input Mode: %s Mode\n", (fmc_reg & BIT4) == 0 ? "Single" : "Dual"); + dbg_print(debug_on,"CE0 MSB | LSB: %s First\n", (fmc_reg & BIT6) == 0 ? "MSB" : "LSB"); + + /* CE1 Control Register */ + fmc_reg = read_bmc_reg(CE1_CONTROL_REGISTER); + switch (fmc_reg & (BIT1 | BIT2)){ + case NORMAL_READ: + dbg_print(debug_on,"CE1 Command Mode: Normal Read\n"); + break; + case READ_MODE: + dbg_print(debug_on,"CE1 Command Mode: Read Command\n"); + break; + case WRITE_MODE: + dbg_print(debug_on,"CE1 Command Mode: Write Command\n"); + break; + case USER_MODE: + dbg_print(debug_on,"CE1 Command Mode: User Mode\n"); + break; + default: + break; + } + switch((RIGHT_SHIFT_24(fmc_reg) & (BIT5 | BIT6 | BIT7))){ + case 0: + dbg_print(debug_on,"CE1 IO Mode: Single Mode\n"); + break; + case 2: + case 3: + dbg_print(debug_on,"CE1 IO Mode: Dual Mode\n"); + break; + default: + break; + } + + dbg_print(debug_on,"CE1 Inactive Pulse Width: %d HCLK\n", + DEFAULT_WIDTH - (RIGHT_SHIFT_24(fmc_reg) & (BIT1 | BIT2 | BIT3 | BIT4))); + dbg_print(debug_on,"CE1 Data Input Mode: %s Mode\n", (fmc_reg & BIT4) == 0 ? "Single" : "Dual"); + dbg_print(debug_on,"CE1 MSB | LSB: %s First\n", (fmc_reg & BIT6) == 0 ? "MSB" : "LSB"); + + return; +} + +static void fmc_debug(void) +{ + ce_type_setting_debug(); + ce_control_debug(); + irq_control_status_debug(); + command_control_debug(); + ce_control_reg_debug(); + + return; +} + +/* Enable WatchDog to reset BMC*/ +static void enable_watchdog(int cs) +{ + uint32_t enable_watch_cmd; + + enable_watch_cmd = (cs == CE0) ? ENABLE_WATCHDOG : ENABLE_WATCHDOG | BOOT_DEFAULT_MASK; + write_bmc_reg(WATCHDOG2_CLEAR_STATUS, CLEAR_WATCHDOG_STATUS); + write_bmc_reg(WATCHDOG2_RESET_FUN_MASK, WATCHDOG_GATEMASK); + write_bmc_reg(WATCHDOG2_RELOAD_VALUE, WATCHDOG_NEW_COUNT); + write_bmc_reg(WATCHDOG2_COUNTER_RST, WATCHDOG_RELOAD_COUNTER); + write_bmc_reg(WATCHDOG2_CONTROL, enable_watch_cmd); + + return; +} + +static void bmc_reboot(int cs) +{ + enable_watchdog(cs); + watchdog_status_debug(); + disable_upgrade(); + printf("Upgrade-Complete, BMC rebooting...\n"); + + return; +} + +static int get_current_bmc(void) +{ + return (read_bmc_reg(WATCHDOG2_TSR) & 0x02) >> 1; +} + +static void get_flash_base_and_ce_ctrl(int current_bmc, int cs, uint32_t *flash_base_addr, uint32_t *ce_ctrl_addr) +{ + uint32_t ce0_addr_range_reg_val, ce0_decode_addr; + uint32_t ce1_addr_range_reg_val, ce1_decode_addr; + + ce0_addr_range_reg_val = read_bmc_reg(CE0_ADDRESS_RANGE_REGISTER); + ce0_decode_addr = SEGMENT_ADDR_START(ce0_addr_range_reg_val); + ce1_addr_range_reg_val = read_bmc_reg(CE1_ADDRESS_RANGE_REGISTER); + ce1_decode_addr = SEGMENT_ADDR_START(ce1_addr_range_reg_val); + dbg_print(debug_on,"CE0 addr decode range reg value:0x%08x, decode addr:0x%08x.\n", + ce0_addr_range_reg_val, ce0_decode_addr); + dbg_print(debug_on,"CE1 addr decode range reg value:0x%08x, decode addr:0x%08x.\n", + ce1_addr_range_reg_val, ce1_decode_addr); + + if (((current_bmc == CURRENT_MASTER) && (cs ==CE0)) || ((current_bmc == CURRENT_SLAVE) && (cs ==CE1))) { + *ce_ctrl_addr = CE0_CONTROL_REGISTER; + *flash_base_addr = ce0_decode_addr; + } else { + *ce_ctrl_addr = CE1_CONTROL_REGISTER; + *flash_base_addr = ce1_decode_addr; + } + + return; +} + +static int get_flash_id(uint32_t flash_base_addr, uint32_t ce_ctrl_addr) +{ + uint32_t origin_flash_id, flash_id; + + write_bmc_reg(ce_ctrl_addr, USER_MODE_PULL_CE_DOWN); + send_cmd(flash_base_addr, READID); + origin_flash_id = read_bmc_flash_data(); + write_bmc_reg(ce_ctrl_addr, USER_MODE_PULL_CE_UP); + flash_id = origin_flash_id & 0xFFFFFF; + dbg_print(debug_on,"origin flash id:0x%x, flash id:0x%x\n", origin_flash_id, flash_id); + + return flash_id; +} + +static uint8_t get_flash_status(flash_info_t* info) +{ + uint8_t flash_status; + + pull_ce_down(info); + + send_cmd(info->flash_base_addr, READ_FLASH_STATUS); + + flash_status = read_bmc_flash_data() & MASK; + pull_ce_up(info); + + dbg_print(debug_on,"get_flash_status:0x%x\n", flash_status); + return flash_status; +} + +static int check_flash_write_enable(flash_info_t* info) +{ + uint8_t flash_status; + int i, count; + + count = FLASH_WEL_TIMEOUT / FLASH_WEL_SLEEP_TIME; + for (i = 0; i <= count; i++) { + flash_status = get_flash_status(info); + if ((flash_status & FLASH_WRITE_ENABLE_MASK) != FLASH_WRITE_ENABLE_MASK) { + usleep(FLASH_WEL_SLEEP_TIME); + } else { + dbg_print(debug_on,"Check flash WEL success, RDSR:0x%x\n", flash_status); + return 0; + } + } + printf("Check flash WEL timeout, RDSR:0x%x\n", flash_status); + return -1; +} + +static int check_flash_write_process(flash_info_t* info, int timeout, int sleep_time) +{ + int i, count; + uint8_t flash_status; + + count = timeout / sleep_time; + for (i = 0; i <= count; i++) { + flash_status = get_flash_status(info); + if ((flash_status & FLASH_WIP_MASK) != 0) { + usleep(sleep_time); + } else { + dbg_print(debug_on,"Check flash WIP success, RDSR:0x%x\n", flash_status); + return 0; + } + } + printf("Check flash WIP timeout, RDSR:0x%x.\n", flash_status); + return -1; +} + +static int flash_write_enable(flash_info_t* info) +{ + int ret; + + send_cmd_to_flash(info, WRITE_ENABLE_FLASH); + ret = check_flash_write_enable(info); + if (ret < 0) { + return -1; + } + return 0; +} + +static void send_block_erase_cmd(flash_info_t* info, uint32_t block_addr) +{ + pull_ce_down(info); + send_cmd(info->flash_base_addr, info->erase_block_command); + write_bmc_flash_addr(block_addr); /* Erase Block addr */ + pull_ce_up(info); + + return; +} + +static void send_chip_erase_cmd(flash_info_t* info) +{ + send_cmd_to_flash(info, CHIP_ERASE_FLASH); + + return; +} + +static int write_bmc_flash_page(flash_info_t* info, uint32_t page_addr, uint8_t *p, int len) +{ + int pos; + + if (len % 4) { + printf("Page size %d invalid.\n", len); + return -1; + } + + pos = 0; + pull_ce_down(info); + send_cmd(info->flash_base_addr, info->page_program); + write_bmc_flash_addr(page_addr); /* page address */ + while (len) { + write_bmc_flash_data((*(uint32_t *)(p + pos))); + pos += 4; + len -= 4; + } + pull_ce_up(info); + + return 0; +} + +static int erase_chip_full(flash_info_t* info) +{ + time_t timep; + int ret; + + if (info->full_erase == 0) { + printf("Flash not support full erase function.\n"); + return -1; + } + + ret = flash_write_enable(info); + if(ret < 0) { + printf("Chip erase, enable flash write error.\n"); + return -1; + } + + time(&timep); + printf("Full chip erasing, please wait...\n"); + dbg_print(debug_on,"Erase Start-%s\n",asctime(gmtime(&timep))); + send_chip_erase_cmd(info); + ret = check_flash_write_process(info, CHIP_ERASE_TIMEOUT, CHIP_ERASE_SLEEP_TIME); + if (ret < 0) { + printf("Chip erase timeout.\n"); + return -1; + } + time(&timep); + dbg_print(debug_on,"Erase Finish-%s\n",asctime(gmtime(&timep))); + printf("Erase Finish\n"); + printf("=========================================\n"); + return 0; +} + +static int erase_chip_block(flash_info_t* info) +{ + uint32_t block_addr, end_addr; + time_t timep; + int ret; + + printf("Block erasing...\n"); + time (&timep); + dbg_print(debug_on,"Erase-Start-%s\n", asctime(gmtime(&timep))); + end_addr = info->flash_base_addr + info->flash_size; + block_addr = info->flash_base_addr; + while (1) { + /* Enable write */ + ret = flash_write_enable(info); + if(ret < 0) { + printf("Block erase, enable flash write error, block addr:0x%x\n", block_addr); + return -1; + } + + send_block_erase_cmd(info, block_addr); + /* Erase Block(64KB) MAX time 650ms*/ + ret = check_flash_write_process(info, BLOCK_ERASE_TIMEOUT, BLOCK_ERASE_SLEEP_TIME); + if (ret < 0) { + printf("Block erase, check write status error, block addr:0x%x\n", block_addr); + return -1; + } + printf("\r0x%x", block_addr); + fflush(stdout); + if (block_addr >= end_addr) { + time(&timep); + printf("\r\nErase Finish\n"); + printf("=========================================\n"); + dbg_print(debug_on,"\nEnd-Earse-%s\n",asctime(gmtime(&timep))); + break; + } + block_addr += info->block_size; + } + return 0; +} + +static int program_chip(uint32_t file_size, uint8_t *p, flash_info_t* info) +{ + time_t timep; + uint32_t page_addr, end_addr; + int ret, page_size; + + page_addr = info->flash_base_addr; + page_size = info->page_size; + end_addr = file_size + info->flash_base_addr; + time (&timep); + printf("Programming...\n"); + dbg_print(debug_on,"Program Start-%s\n",asctime(gmtime(&timep))); + /* Debug info */ + fmc_debug(); + while (1) { + /* Write enable */ + ret = flash_write_enable(info); + if(ret < 0) { + printf("Page program, enable flash write error, page addr:0x%x\n", page_addr); + return -1; + } + ret = write_bmc_flash_page(info, page_addr, p, page_size); + if (ret < 0) { + printf("Page program, write bmc flash page error, page addr:0x%x\n", page_addr); + return -1; + } + /* page program MAX time 1.5ms */ + ret = check_flash_write_process(info, PAGE_PROGRAM_TIMEOUT, PAGE_PROGRAM_SLEEP_TIME); + if (ret < 0) { + printf("Page program, check write status error, page addr:0x%x\n", page_addr); + return -1; + } + page_addr += page_size; + p += page_size; + if ((page_addr % 0x10000) == 0) { + printf("\r0x%x", page_addr); + fflush(stdout); + } + + if (page_addr >= end_addr) { + printf("\nProgram Finish\n"); + printf("=========================================\n"); + time(&timep); + dbg_print(debug_on,"\nProgram-End-%s\n",asctime(gmtime(&timep))); + break; + } + } /* End of while (1) */ + return 0; +} + +static int check_chip(uint32_t file_size, uint8_t *p, flash_info_t* info) +{ + time_t timep; + uint32_t offset_addr, rd_val, end_addr; + int pos; + + offset_addr = info->flash_base_addr; + end_addr = file_size + info->flash_base_addr; + pos=0; + /* Checking */ + time(&timep); + printf("Checking...\n"); + dbg_print(debug_on,"Checking-Start-%s\n",asctime(gmtime(&timep))); + + pull_ce_down(info); + send_cmd(info->flash_base_addr, COMMON_FLASH_READ); + write_bmc_flash_addr(info->flash_base_addr); + while (1) { + if (offset_addr >= end_addr) { + break; + } + rd_val = read_bmc_flash_data(); + if (rd_val != (*(uint32_t *)(p + pos))) { + printf("Check Error at 0x%08x\n", offset_addr); + printf("READ:0x%08x VALUE:0x%08x\n", rd_val, (*(uint32_t *)(p + pos))); + pull_ce_up(info); + return -1; + } + if ((offset_addr % 0x10000) == 0) { + printf("\r0x%x ", offset_addr); + fflush(stdout); + } + offset_addr += 4; + pos += 4; + } + pull_ce_up(info); + printf("\r\nFlash Checked\n"); + printf("=========================================\n"); + time(&timep); + dbg_print(debug_on,"Checking-End-%s\n",asctime(gmtime(&timep))); + return 0; +} + +flash_info_t* get_flash_info(int current_bmc, int cs) +{ + int i, size; + uint32_t flash_base_addr, ce_ctrl_addr, flash_id; + + get_flash_base_and_ce_ctrl(current_bmc, cs, &flash_base_addr, &ce_ctrl_addr); + + size = (sizeof(flash_info) / sizeof((flash_info)[0])); + + flash_id = get_flash_id(flash_base_addr, ce_ctrl_addr); + for (i = 0; i < size; i++) { + if (flash_info[i].flash_id == flash_id) { + flash_info[i].flash_base_addr = flash_base_addr; + flash_info[i].ce_control_reg = ce_ctrl_addr; + flash_info[i].cs = cs; + return &flash_info[i]; + } + } + printf("Cannot get flash info, cs:%d, flash base addr:0x%x, ce control addr:0x%x, flash_id:0x%x.\n", + cs, flash_base_addr, ce_ctrl_addr, flash_id); + return NULL; +} + +static void init_flash(flash_info_t* info) +{ + send_cmd_to_flash(info, RSTEN); + send_cmd_to_flash(info, RST); + send_cmd_to_flash(info, EXIT_OTP); + send_cmd_to_flash(info, ENABLE_BYTE4); + + return; +} + +static int upgrade_bmc_core(char *file_name, int erase_type, flash_info_t* info) +{ + int file_size, fp, ret; + uint8_t *p; + + file_size = get_file_size(file_name); + if (file_size < 0) { + printf("file size %d Error\n", file_size); + return -1; + } + + fp = open(file_name, O_RDWR); + if (fp < 0) { + printf("Cannot open %s.\n", file_name); + return -1; + } + + p = mmap(NULL, file_size, PROT_READ, MAP_SHARED, fp, 0); + if (p == MAP_FAILED) { + printf("Could not mmap %s, error(%s).\n", file_name, strerror(errno)); + close(fp); + return -1; + } + + printf("* CE%d FLASH TYPE: SPI FLASH\n", info->cs); + printf("* FLASH NAME: %s\n", info->flash_name); + printf("* File Size:%d, 0x%x\n", file_size, file_size); + printf("=========================================\n"); + + /* Select erase type */ + switch (erase_type) { + case FULL_ERASE: + ret = erase_chip_full(info); + break; + case BLOCK_ERASE: + ret = erase_chip_block(info); + break; + default: + printf("Unsupport earse type:%d\n", erase_type); + goto exit; + break; + } + + if (ret < 0) { + printf("Erase Chip Error\n"); + goto exit; + } + + /* Program the flash */ + ret = program_chip(file_size, p, info); + if(ret < 0) { + printf("Program Chip Error\n"); + goto exit; + } + /* Check */ + ret = check_chip(file_size, p, info); + if(ret < 0) { + printf("Check Chip Error\n"); + goto exit; + } + + munmap(p, file_size); + close(fp); + return 0; +exit: + munmap(p, file_size); + close(fp); + return -1; +} + +static int upgrade_bmc_flash(char *filename, int current_bmc, int cs, int erase_type) +{ + int ret; + flash_info_t* info; + + info = get_flash_info(current_bmc, cs); + if(info == NULL) { + return -1; + } + + init_flash(info); + + ret = upgrade_bmc_core(filename, erase_type, info); + + return ret; +} + +static int upgrade_both_flash(char *filename, int erase_type) +{ + int ret, current_bmc; + + enable_upgrade(); + + current_bmc = get_current_bmc(); + if (current_bmc == CURRENT_MASTER) { + printf("* Current Bmc Default Boot: CE0\n"); + } else { + printf("* Current Bmc Default Boot: CE1\n"); + } + + ret = upgrade_bmc_flash(filename, current_bmc, CE0, erase_type); + if (ret < 0) { + printf("Upgrade master bmc flash failed, stop upgrade.\n"); + goto err; + } + printf("Upgrade master bmc flash success.\n"); + + ret = upgrade_bmc_flash(filename, current_bmc, CE1, erase_type); + if (ret < 0) { + printf("Upgrade slave bmc flash failed.\n"); + goto err; + } + printf("Upgrade slave bmc flash success.\n"); + + bmc_reboot(CE0); + return 0; +err: + disable_upgrade(); + return -1; +} + +static int upgrade_single_flash(char *filename, int cs, int erase_type) +{ + int ret, current_bmc; + + enable_upgrade(); + + current_bmc = get_current_bmc(); + if (current_bmc == CURRENT_MASTER) { + printf("* Current Bmc Default Boot: CE0\n"); + } else { + printf("* Current Bmc Default Boot: CE1\n"); + } + + ret = upgrade_bmc_flash(filename, current_bmc, cs, erase_type); + if (ret < 0) { + printf("Upgrade %s bmc flash failed.\n", cs == 0 ? "master":"slave"); + goto err; + } + printf("Upgrade %s bmc flash success.\n", cs == 0 ? "master":"slave"); + + bmc_reboot(cs); + return 0; +err: + disable_upgrade(); + return -1; +} + +static int upgrade_bmc(char *filename, int cs, int erase_type) +{ + int ret; + + if (access(filename, F_OK) < 0) { + printf("Can't find file\n"); + help(); + return -1; + } + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + switch(cs) { + /* Single */ + case CE0: + case CE1: + ret = upgrade_single_flash(filename, cs, erase_type); + break; + /* Both */ + case BOTHFLASH: + ret = upgrade_both_flash(filename, erase_type); + break; + default: + ret = -1; + printf("Unsupport cs:%d\n", cs); + break; + } + + return ret; +} + +static int read_single_bmc_flash(flash_info_t* info, uint32_t start_addr, int read_size, int is_print) +{ + uint32_t res, flash_start_addr, flash_end_addr; + char filename[MAX_FILENAME_LENGTH]; + int fd, ret; + + flash_start_addr = info->flash_base_addr + start_addr; + flash_end_addr = flash_start_addr + read_size; + ret = 0; + fd = 0; + if (!is_print) { + mem_clear(filename, MAX_FILENAME_LENGTH); + snprintf(filename, MAX_FILENAME_LENGTH, "/tmp/image-bmc%d", info->cs); + fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXG|S_IRWXU|S_IRWXO); + if (fd < 0) { + printf("open file %s fail(err:%d)!\r\n", filename, errno); + return -1; + } + } + + printf("* CE%d FLASH TYPE: SPI FLASH\n", info->cs); + printf("* FLASH NAME: %s\n", info->flash_name); + printf("* Read flash addr:0x%x, size:0x%x\n", flash_start_addr, read_size); + printf("=========================================\n"); + printf("Reading...\n"); + + pull_ce_down(info); + send_cmd(info->flash_base_addr, COMMON_FLASH_READ); + write_bmc_flash_addr(flash_start_addr); + while (1) { + if (flash_start_addr >= flash_end_addr) { + break; + } + res = read_bmc_flash_data(); + if (is_print) { + printf("addr:0x%08x, val:0x%08x\n", flash_start_addr, res); + } else { + ret = write(fd, &res, sizeof(res)); + if (ret < 0) { + printf("write failed (errno: %d).\n", errno); + ret = -1; + goto exit; + } + } + if (((flash_start_addr % 0x10000) == 0) && (!is_print)) { + printf("\r0x%x ", flash_start_addr); + fflush(stdout); + } + flash_start_addr += 4; + } + printf("\r\nRead Finish\n"); + printf("=========================================\n"); +exit: + pull_ce_up(info); + if (fd > 0) { + close(fd); + } + return ret; +} + +static int read_bmc_flash(int cs, uint32_t start_addr, int read_size, int is_print) +{ + int ret, current_bmc; + flash_info_t* info; + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + enable_upgrade(); + + current_bmc = get_current_bmc(); + if (current_bmc == CURRENT_MASTER) { + printf("* Current Bmc Default Boot: CE0\n"); + } else { + printf("* Current Bmc Default Boot: CE1\n"); + } + + info = get_flash_info(current_bmc, cs); + if(info == NULL) { + goto err; + } + + if (start_addr >= info->flash_size) { + printf("start_addr 0x%x out of range.\n", start_addr); + goto err; + } + + if ((start_addr + read_size) > info->flash_size) { + printf("read size %d exceed flash size.\n", read_size); + read_size = info->flash_size - start_addr; + } + + init_flash(info); + + ret = read_single_bmc_flash(info, start_addr, read_size, is_print); + if (ret < 0) { + printf("Read %s bmc flash failed.\n", cs == 0 ? "master" : "slave"); + goto err; + } + disable_upgrade(); + return 0; +err: + disable_upgrade(); + return -1; +} + +static int read_bmc_reg_main(int argc, char* argv[]) +{ + uint32_t start_addr, read_val; + int read_size, ret; + char *stopstring; + + if (argc != 4) { + printf("Input invalid.\n"); + help(); + return -1; + } + + start_addr = strtoul(argv[2], &stopstring, 16); + read_size = strtol(argv[3], &stopstring, 10); + + if (read_size <= 0) { + printf("read length %d invalid\n", read_size); + return -1; + } + + if (((start_addr % 4) != 0) || ((read_size % 4) != 0)) { + printf("Params invalid, start_addr:0x%08x, read_size:%d\n", start_addr, read_size); + printf("Please input address/length times of 4\n"); + return -1; + } + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + enable_ilpc2ahb(); + + printf("read bcm reg, start_addr:0x%08x, read length:%d\n", start_addr, read_size); + printf("===Addr=== | ===Cont===\n"); + while (read_size) { + read_val = read_bmc_reg(start_addr); + printf("0x%08x | 0x%08x\n", start_addr, read_val); + start_addr += 4; + read_size -= 4; + } + + disable_ilpc2ahb(); + return 0; +} + +static int write_bmc_reg_main(int argc, char* argv[]) +{ + uint32_t addr, wr_val; + int ret; + char *stopstring; + + if (argc != 4) { + printf("Input invalid.\n"); + help(); + return -1; + } + + addr = strtoul(argv[2], &stopstring, 16); + wr_val = strtoul(argv[3], &stopstring, 16); + + if (((addr & MASK_BYTE) != REGISTER_HEAD) || ((addr % 4) != 0)) { + printf("Address[0x%08x] invalid, address should be register address and times of 4.\n", addr); + return -1; + } + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + printf("write bcm reg, addr:0x%08x, val:0x%08x\n", addr, wr_val); + + enable_ilpc2ahb(); + write_bmc_reg(addr, wr_val); + disable_ilpc2ahb(); + + return 0; +} + +static int get_fmc_info_main(void) +{ + int ret; + + ret = set_ioport_rw_access(); + if (ret < 0) { + printf("IO ERROR\n"); + return -1; + } + + enable_ilpc2ahb(); + + debug_on = 3; + fmc_debug(); + debug_on = 0; + + disable_ilpc2ahb(); + return 0; +} + +static int program_flash_main(int argc, char* argv[]) +{ + int cs, erase_way, ret; + char *stopstring; + char tmp[128]; + + if (argc != 5) { + printf("Input invalid.\n"); + help(); + return -1; + } + + cs = strtol(argv[3], &stopstring, 10); + if ((strlen(stopstring) != 0) || cs < 0 || cs > 2) { + snprintf(tmp, sizeof(tmp), "%s", argv[3]); + printf("Incorrect chip select %s\n", tmp); + help(); + return -1; + } + + if (strcmp(argv[4], "full") == 0) { + erase_way = FULL_ERASE; + } else if (strcmp(argv[4], "block") == 0) { + erase_way = BLOCK_ERASE; + } else { + snprintf(tmp, sizeof(tmp), "%s", argv[4]); + printf("Incorrect erase type %s\n", tmp); + help(); + return -1; + } + + printf("============BMC Upgrade Tool=============\n"); + ret = upgrade_bmc(argv[2], cs, erase_way); + return ret; +} + +static int read_bmc_flash_main(int argc, char* argv[]) +{ + int cs, ret, read_size, is_print; + uint32_t start_addr; + char *stopstring; + char tmp[128]; + + if (argc != 6) { + printf("Input invalid.\n"); + help(); + return -1; + } + + cs = strtol(argv[2], &stopstring, 10); + if ((strlen(stopstring) != 0) || cs < 0 || cs > 1) { + snprintf(tmp, sizeof(tmp), "%s", argv[2]); + printf("Incorrect chip select %s\n", tmp); + help(); + return -1; + } + + start_addr = strtoul(argv[3], &stopstring, 16); + read_size = strtol(argv[4], &stopstring, 10); + + if (read_size <= 0) { + printf("read length %d invalid\n", read_size); + return -1; + } + + if (((start_addr % 4) != 0) || ((read_size % 4) != 0)) { + printf("Params invalid, start_addr:0x%08x, read_size:%d\n", start_addr, read_size); + printf("Please input address/length times of 4\n"); + return -1; + } + + if (strcmp(argv[5], "print") == 0) { + is_print = 1; + } else { + is_print = 0; + } + + printf("============READ BMC FLASH=============\n"); + ret = read_bmc_flash(cs, start_addr, read_size, is_print); + return ret; +} + +int main(int argc, char *argv[]) +{ + int ret; + + debug_on = fw_upgrade_debug(); + + if (argc < 2) { + help(); + return -1; + } + + if (argc == 2) { + if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) { + help(); + return 0; + } + } + + if (strcmp(argv[1], "rd") == 0) { + ret = read_bmc_reg_main(argc, argv); + if (ret < 0) { + printf("Read Failed\n"); + } + return ret; + } + + if (strcmp(argv[1], "wr") == 0 && debug_on == 3) { + ret = write_bmc_reg_main(argc, argv); + if (ret < 0) { + printf("Write Failed\n"); + } + return ret; + } + + if (strcmp(argv[1], "info") == 0) { + ret = get_fmc_info_main(); + if (ret < 0) { + printf("Get fmc info Failed\n"); + } + return ret; + } + + if (strcmp(argv[1], "upgrade") == 0) { + ret = program_flash_main(argc, argv); + if (ret < 0) { + printf("Upgrade BMC failed.\n"); + } + return ret; + } + + if (strcmp(argv[1], "read_bmc_flash") == 0) { + ret = read_bmc_flash_main(argc, argv); + if (ret < 0) { + printf("Read BMC flash failed.\n"); + } + return ret; + } + + printf("Input invalid.\n"); + help(); + + return -1; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c new file mode 100644 index 0000000000..a7a78d0110 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/fw_upgrade_debug.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "fw_upgrade_debug.h" + +int fw_upgrade_debug(void) +{ + int size; + FILE *fp; + char debug_info[DEBUG_INFO_LEN]; + + fp = fopen(DEBUG_FILE, "r"); + if (fp == NULL) { + return DEBUG_IGNORE; + } + + mem_clear(debug_info, DEBUG_INFO_LEN); + size = fread(debug_info, DEBUG_INFO_LEN - 1, 1, fp); + if (size < 0) { + fclose(fp); + return DEBUG_IGNORE; + } + + if (strncmp(debug_info, DEBUG_ON_INFO, 1) == 0) { + fclose(fp); + return DEBUG_APP_ON; + } + + if (strncmp(debug_info, DEBUG_ON_KERN, 1) == 0) { + fclose(fp); + return DEBUG_KERN_ON; + } + + if (strncmp(debug_info, DEBUG_ON_ALL, 1) == 0) { + fclose(fp); + return DEBUG_ALL_ON; + } + + if (strncmp(debug_info, DEBUG_OFF_INFO, 1) == 0) { + fclose(fp); + return DEBUG_OFF; + } + + fclose(fp); + return DEBUG_IGNORE; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h new file mode 100644 index 0000000000..bd806a94b1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade.h @@ -0,0 +1,230 @@ +#ifndef _FW_UPGRADE_H_ +#define _FW_UPGRADE_H_ + +#include "fw_upgrade_debug.h" + +#define dbg_print(debug, fmt, arg...) \ + if (debug == DEBUG_APP_ON || debug == DEBUG_ALL_ON) \ + { do{printf(fmt,##arg);} while(0); } + +/* LPC Interface */ +#define LPC_ADDR_PORT (0x4E) +#define LPC_DATA_PORT (0x4F) + +/* FMC REGISTER ADDR */ +#define FMC_BASE_ADDR (0x1E620000) +#define FMC_CE_TYPE_SETTING_REG (FMC_BASE_ADDR + 0x00) +#define CE_CONTROL_REGISTER (FMC_BASE_ADDR + 0x04) +#define INR_STATUS_CONTROL_REGISTER (FMC_BASE_ADDR + 0x08) +#define COMMAND_CONTROL_REGISTER (FMC_BASE_ADDR + 0x0C) +#define CE0_CONTROL_REGISTER (FMC_BASE_ADDR + 0x10) +#define CE1_CONTROL_REGISTER (FMC_BASE_ADDR + 0x14) +#define CE0_ADDRESS_RANGE_REGISTER (FMC_BASE_ADDR + 0x30) +#define CE1_ADDRESS_RANGE_REGISTER (FMC_BASE_ADDR + 0x34) + +/* SCU REGISTER ADDR */ +#define SCU_ADDR (0x1E6E2000) +#define HARDWARE_STRAP_REGISTER (SCU_ADDR + 0x70) +#define REBOOT_CPU_REGISTER (SCU_ADDR + 0x7C) + +/* SCU KEY */ +#define UNLOCK_SCU_KEY (0x1688A8A8) +#define LOCK_SCU_KEY (0x11111111) + +/* WATCHDOG REGISTER ADDR */ +#define WATCHDOG_ADDR (0x1E785000) +#define WATCHDOG1_RELOAD_VALUE (WATCHDOG_ADDR + 0x04) +#define WATCHDOG1_COUNTER_RST (WATCHDOG_ADDR + 0x08) +#define WATCHDOG1_CONTROL (WATCHDOG_ADDR + 0x0C) +#define WATCHDOG1_TSR (WATCHDOG_ADDR + 0x10) +#define WATCHDOG1_CLEAR_STATUS (WATCHDOG_ADDR + 0x14) +#define WATCHDOG1_RESET_FUN_MASK (WATCHDOG_ADDR + 0x1C) + +#define WATCHDOG2_RELOAD_VALUE (WATCHDOG_ADDR + 0x24) +#define WATCHDOG2_COUNTER_RST (WATCHDOG_ADDR + 0x28) +#define WATCHDOG2_CONTROL (WATCHDOG_ADDR + 0x2C) +#define WATCHDOG2_TSR (WATCHDOG_ADDR + 0x30) +#define WATCHDOG2_CLEAR_STATUS (WATCHDOG_ADDR + 0x34) +#define WATCHDOG2_RESET_FUN_MASK (WATCHDOG_ADDR + 0x3C) + +/* User Mode Command */ +#define WRITE_STATUS (0x01) +#define COMMON_PAGE_PROGRAM (0x02) +#define COMMON_FLASH_READ (0x03) +#define WRITE_DISABLE_FLASH (0x04) +#define READ_FLASH_STATUS (0x05) +#define WRITE_ENABLE_FLASH (0x06) +#define PAGE_PROGRAM_FLASH (0x12) +#define SECTOR_ERASE (0x20) +#define CLEAR_FLAG (0x50) +#define SUBBLOCK_ERASE (0x52) +#define CHIP_ERASE_FLASH (0x60) +#define BLOCK_ERASE_64 (0xD8) +#define READID (0x9F) +#define ENABLE_BYTE4 (0xB7) +#define EXIT_OTP (0xC1) +#define RSTEN (0x66) +#define RST (0x99) + +#define BIT1 (0x01) +#define BIT2 (0x02) +#define BIT3 (0x04) +#define BIT4 (0x08) +#define BIT5 (0x10) +#define BIT6 (0x20) +#define BIT7 (0x40) +#define BIT8 (0x80) +#define RIGHT_SHIFT_8(reg) (reg >> 8) +#define RIGHT_SHIFT_16(reg) (reg >> 16) +#define RIGHT_SHIFT_24(reg) (reg >> 24) +#define MASK (0xFF) +#define FLASH_TYPE_MASK (BIT1 | BIT2) +#define BOOT_DEFAULT_MASK (BIT8) +#define HEAD_MASK (0x00FFFF00) +#define MASK_BYTE (0xFF000000) +#define BYTE1 (1) +#define BYTE2 (2) +#define BYTE4 (4) +#define BYTE1_VAL (0) +#define BYTE2_VAL (1) +#define BYTE4_VAL (2) +#define BYTE_RESERVED (3) + +/* SuperIO */ +#define SUPERIO_07 (0x07) +#define SUPERIO_30 (0x30) +#define SUPERIO_A0 (0xA0) +#define SUPERIO_A2 (0xA2) +#define SUPERIO_REG0 (0xF0) +#define SUPERIO_REG1 (0xF1) +#define SUPERIO_REG2 (0xF2) +#define SUPERIO_REG3 (0xF3) +#define SUPERIO_REG4 (0xF4) +#define SUPERIO_REG5 (0xF5) +#define SUPERIO_REG6 (0xF6) +#define SUPERIO_REG7 (0xF7) +#define SUPERIO_REG8 (0xF8) +#define SUPERIO_FE (0xFE) + +/* SPI Command */ +#define HIGH_CLOCK (0x00000000) +#define NORMAL_READ (0x00000000) +#define READ_MODE (0x00000001) +#define WRITE_MODE (0x00000002) +#define USER_MODE (0x00000003) +#define PULL_DOWN (0x00000000) +#define PULL_UP (0x00000004) + +#define CHIP_ERASE_TIME (60) +#define CHIP_ERASE_TIMEOUT (300 * 1000 * 1000) +#define CHIP_ERASE_SLEEP_TIME (5 * 1000 * 1000) +#define BLOCK_ERASE_TIMEOUT (10 * 1000 * 1000) +#define BLOCK_ERASE_SLEEP_TIME (100 * 1000) +#define PAGE_PROGRAM_TIMEOUT (100 * 1000) +#define PAGE_PROGRAM_SLEEP_TIME (1000) +#define FLASH_WEL_TIMEOUT (100 * 1000) +#define FLASH_WEL_SLEEP_TIME (1000) +#define FLASH_WIP_MASK (0x00000001) +#define FLASH_WRITE_ENABLE_MASK (0x00000002) + +#define DATA_LENGTH_MASK (0xA2) +#define TOGGLE_WRITE (0xCF) +#define DISABLE_LPC (0xAA) +#define ENABLE_LPC (0xA5) +#define LPC_TO_AHB (0x0D) +#define ENABLE_LPC_TO_AHB (0x01) +#define DISABLE_LPC_TO_AHB (0x00) +#define ENABLE_BMC_CPU_BOOT (0xF10BD286) +#define DISABLE_BMC_CPU_BOOT (0xF10BD287) +#define SET_BMC_CPU_BOOT (0x01) +#define CLEAR_WATCHDOG_STATUS (0x01) +#define DISABLE_WATCHDOG (0x00000030) +#define ENABLE_WATCHDOG (0x00000033) +#define WATCHDOG_GATEMASK (0x033FFFF3) +#define WATCHDOG_NEW_COUNT (0x00050000) +#define WATCHDOG_RELOAD_COUNTER (0x4755) + +#define CE0_SPI_TYPE (0x00000002) +#define CE1_SPI_TYPE (0x00000008) +#define ERROR_COMMAND (0x00000400) +#define ADDRESS_PROTECT (0x00000200) +#define CLEAR_INR_STATUS_CONTROL (ERROR_COMMAND | ADDRESS_PROTECT) +#define USER_MODE_PULL_CE_DOWN (HIGH_CLOCK | USER_MODE | PULL_DOWN) +#define USER_MODE_PULL_CE_UP (HIGH_CLOCK | USER_MODE | PULL_UP) + +#define STEP_64 (64 * 1024) +#define STEP_256 (256 * 1024) +#define BYTE_256 (256) + +#define CE0 (0) +#define CE1 (1) +#define BOTHFLASH (2) +#define SOC_SYS (0) +#define FULL_CHIP (1) +#define ARM_CPU (2) +#define FULL_ERASE (0) +#define BLOCK_ERASE (1) +#define READ_ALL (2) +#define CURRENT_SLAVE (1) +#define CURRENT_MASTER (0) +#define REGISTER_HEAD (0x1e000000) +#define DEFAULT_WIDTH (16) +#define MAX_FILENAME_LENGTH (64) +#define SEGMENT_ADDR_START(_r) ((((_r) >> 16) & 0xFF) << 23) + +typedef struct flash_info { + uint32_t flash_size; + int cs; + int flash_type; + uint32_t flash_id; + int page_size; + char flash_name[64]; + int erase_block_command; + int page_program; + int block_size; + int full_erase; + uint32_t ce_control_reg; + uint32_t flash_base_addr; +} flash_info_t; + +typedef enum flash_id { + MX25L6433F = 0x1920c2, + S25FL512S = 0x200201, + MX25l512 = 0x1a20c2, + STM25P64 = 0x172020, + STM25P128 = 0x182020, + N25Q256 = 0x19ba20, + N25Q512 = 0x20ba20, + W25X16 = 0x1530ef, + W25X64 = 0x1730ef, + W25Q64BV = 0x1740ef, + W25Q128BV = 0x1840ef, + W25Q256FV = 0x1940ef, + MX25L1605D = 0x1520C2, + MX25L12805D = 0x1820C2, + MX66L1G45G = 0x1B20C2, + SST25VF016B = 0x4125bf, + SST25VF064C = 0x4b25bf, + SST25VF040B = 0x8d25bf, + AT25DF161 = 0x02461F, + AT25DF321 = 0x01471F, + GD25Q256 = 0X1940c8, +} flash_id_t; + +typedef enum flash_type { + NOR = 0, + SPI = 2, +} flash_type_t; + +typedef enum flash_size { + M1 = 0x00080000, + M3 = 0x00200000, /* 3M */ + M6 = 0x00400000, /* 6M */ + M12 = 0x00800000, /* 12M */ + M16 = 0x01000000, /* 16M */ + M32 = 0x02000000, /* 32M */ + M64 = 0x04000000, /* 64M */ + M128 = 0x08000000, /* 128M */ +} flash_size_t; + +#endif /*_FW_UPGRADE_H_*/ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h new file mode 100644 index 0000000000..05911da62a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/app/fw_upgrade/fw_upgrade/include/fw_upgrade_debug.h @@ -0,0 +1,25 @@ +#ifndef __FW_UPGRADE_DEBUG_H__ +#define __FW_UPGRADE_DEBUG_H__ + +#include + +#define DEBUG_INFO_LEN 20 +#define DEBUG_FILE "/tmp/.fw_upgrade_debug" +#define DEBUG_ON_ALL "3" +#define DEBUG_ON_KERN "2" +#define DEBUG_ON_INFO "1" +#define DEBUG_OFF_INFO "0" + +#define mem_clear(data, size) memset((data), 0, (size)) + +enum debug_s { + DEBUG_OFF = 0, + DEBUG_APP_ON, + DEBUG_KERN_ON, + DEBUG_ALL_ON, + DEBUG_IGNORE, +}; + +extern int fw_upgrade_debug(void); + +#endif /* End of __FW_UPGRADE_DEBUG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf b/platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf deleted file mode 100644 index ad60b2eb6f..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/depmod_conf/distsearch.conf +++ /dev/null @@ -1,4 +0,0 @@ -# depmod.conf -# -# override default search ordering for kmod packaging -search updates extra external built-in weak-updates diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/__init__.py rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/__init__.py diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py new file mode 100644 index 0000000000..81fd596e7f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/hysteresis.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +import os +import syslog +import copy + +from plat_hal.baseutil import baseutil + +HYST_DEBUG_FILE = "/etc/.hysteresis_debug_flag" + +HYSTERROR = 1 +HYSTDEBUG = 2 + +debuglevel = 0 + + +def hyst_debug(s): + if HYSTDEBUG & debuglevel: + syslog.openlog("FANCONTROL-HYST", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def hyst_error(s): + if HYSTERROR & debuglevel: + syslog.openlog("FANCONTROL-HYST", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class hysteresis(object): + __config = None + __hyst_config = None + + def __init__(self): + self.__config = baseutil.get_monitor_config() + self.__hyst_config = copy.deepcopy(self.__config.get("hyst", {})) + # init check + errcnt = 0 + errmsg = "" + self.debug_init() + for temp_hyst_conf in self.__hyst_config.values(): + if temp_hyst_conf["flag"] == 0: + continue + for i in range(temp_hyst_conf["temp_min"], temp_hyst_conf["temp_max"] + 1): + if i not in temp_hyst_conf["rising"]: + errcnt -= 1 + msg = "%s hyst config error, temp value %d not in rising curve;" % (temp_hyst_conf["name"], i) + hyst_error(msg) + errmsg += msg + if i not in temp_hyst_conf["descending"]: + errcnt -= 1 + msg = "%s hyst config error, temp value %d not in descending curve;" % (temp_hyst_conf["name"], i) + hyst_error(msg) + errmsg += msg + if errcnt < 0: + raise KeyError(errmsg) + + def debug_init(self): + global debuglevel + if os.path.exists(HYST_DEBUG_FILE): + debuglevel = debuglevel | HYSTDEBUG | HYSTERROR + else: + debuglevel = debuglevel & ~(HYSTDEBUG | HYSTERROR) + + def get_temp_hyst_conf(self, temp_name): + temp_hyst_conf = self.__hyst_config.get(temp_name) + return temp_hyst_conf + + def get_temp_update(self, hyst_para, current_temp): + temp = hyst_para["value"] + if temp is None: + return None + temp.append(current_temp) + del temp[0] + return temp + + def duty_to_pwm(self, duty): + pwm = int(round(float(duty) * 255 / 100)) + return pwm + + def pwm_to_duty(self, pwm): + duty = int(round(float(pwm) * 100 / 255)) + return duty + + def calc_hyst_val(self, temp_name, temp_list): + + temp_hyst_conf = self.get_temp_hyst_conf(temp_name) + hyst_min = temp_hyst_conf["hyst_min"] + hyst_max = temp_hyst_conf["hyst_max"] + temp_min = temp_hyst_conf["temp_min"] + temp_max = temp_hyst_conf["temp_max"] + rising = temp_hyst_conf["rising"] + descending = temp_hyst_conf["descending"] + last_hyst_value = temp_hyst_conf["last_hyst_value"] + current_temp = temp_list[1] + last_temp = temp_list[0] + + hyst_debug("calc_hyst_val, temp_name: %s, current_temp: %s, last_temp: %s, last_hyst_value: %s" % + (temp_name, current_temp, last_temp, last_hyst_value)) + + if current_temp < temp_min: + hyst_debug("%s current_temp %s less than temp_min %s, set min hyst value: %s" % + (temp_name, current_temp, temp_min, hyst_min)) + return hyst_min + + if current_temp > temp_max: + hyst_debug("%s current_temp %s more than temp_max %s, set max hyst value: %s" % + (temp_name, current_temp, temp_max, hyst_max)) + return hyst_max + + if last_temp is None: # first time + hyst_value = rising[current_temp] + hyst_debug("last_temp is None, it's first hysteresis, using rising hyst value: %s" % hyst_value) + return hyst_value + + if current_temp == last_temp: # temp unchanging + hyst_debug("current_temp equal last_temp, keep last hyst value: %s" % last_hyst_value) + return last_hyst_value + + if current_temp > last_temp: + calc_hyst_value = rising[current_temp] + if calc_hyst_value < last_hyst_value: + hyst_value = last_hyst_value + else: + hyst_value = calc_hyst_value + hyst_debug("temp rising, last_hyst_value: %s, calc_hyst_value: %s, set hyst value: %s" % + (last_hyst_value, calc_hyst_value, hyst_value)) + return hyst_value + + calc_hyst_value = descending[current_temp] + if calc_hyst_value > last_hyst_value: + hyst_value = last_hyst_value + else: + hyst_value = calc_hyst_value + hyst_debug("temp descending, last_hyst_value: %s, calc_hyst_value: %s, set hyst value: %s" % + (last_hyst_value, calc_hyst_value, hyst_value)) + return hyst_value + + def cacl(self, temp_name, current_temp): + self.debug_init() + try: + temp_hyst_conf = self.get_temp_hyst_conf(temp_name) + if temp_hyst_conf is None: + hyst_debug("get %s hysteresis config failed" % temp_name) + return None + + flag = temp_hyst_conf["flag"] + if flag != 1: + hyst_debug("%s hysteresis flag == 0, skip" % temp_name) + return None + + temp = self.get_temp_update(temp_hyst_conf, current_temp) + if temp is None: + hyst_debug("get %s update failed" % temp_name) + return None + + value = self.calc_hyst_val(temp_name, temp) + + temp_hyst_conf["last_hyst_value"] = value + + speed_type = temp_hyst_conf["type"] + if speed_type == "duty": + pwm = self.duty_to_pwm(value) + else: + pwm = value + + hyst_debug("temp_name: %s, current_temp: %s, set pwm 0x%x" % (temp_name, current_temp, pwm)) + return pwm + except Exception as e: + hyst_error("temp_name: %s calc hysteresis pwm error, msg: %s" % (temp_name, str(e))) + return None diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py new file mode 100644 index 0000000000..6ff731fa7e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/openloop.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +import os +import syslog + +from plat_hal.baseutil import baseutil + +OPENLOOP_DEBUG_FILE = "/etc/.openloop_debug_flag" + +OPENLOOPERROR = 1 +OPENLOOPDEBUG = 2 + +debuglevel = 0 + + +def openloop_debug(s): + if OPENLOOPDEBUG & debuglevel: + syslog.openlog("FANCONTROL-OPENLOOP", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def openloop_error(s): + if OPENLOOPERROR & debuglevel: + syslog.openlog("FANCONTROL-OPENLOOP", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class openloop(object): + __config = None + __openloop_config = None + + def __init__(self): + self.__config = baseutil.get_monitor_config() + self.__openloop_config = self.__config["openloop"] + + def debug_init(self): + global debuglevel + if os.path.exists(OPENLOOP_DEBUG_FILE): + debuglevel = debuglevel | OPENLOOPDEBUG | OPENLOOPERROR + else: + debuglevel = debuglevel & ~(OPENLOOPDEBUG | OPENLOOPERROR) + + def get_para(self, t): + para = self.__openloop_config.get(t) + return para + + def linear_cacl(self, temp): + self.debug_init() + openloop_para = self.get_para("linear") + if openloop_para is None: + openloop_debug("linear openloop: get para failed") + return None + + K = openloop_para["K"] + tin_min = openloop_para["tin_min"] + pwm_min = openloop_para["pwm_min"] + pwm_max = openloop_para["pwm_max"] + flag = openloop_para["flag"] + + if flag != 1: + openloop_debug("linear openloop: flag == 0") + return None + + if temp <= tin_min: + openloop_debug("linear openloop: temp = %d less than tin_min[%d]" % (temp, tin_min)) + return pwm_min + + pwm = int(pwm_min + (temp - tin_min) * K) + openloop_debug("linear openloop: cacl_pwm = 0x%x" % pwm) + + pwm = min(pwm, pwm_max) + pwm = max(pwm, pwm_min) + openloop_debug("linear openloop: temp = %d, pwm = 0x%x" % (temp, pwm)) + return pwm + + def curve_cacl(self, temp): + self.debug_init() + openloop_para = self.get_para("curve") + if openloop_para is None: + openloop_debug("curve openloop: get para failed") + return None + + a = openloop_para["a"] + b = openloop_para["b"] + c = openloop_para["c"] + tin_min = openloop_para["tin_min"] + pwm_min = openloop_para["pwm_min"] + pwm_max = openloop_para["pwm_max"] + flag = openloop_para["flag"] + + if flag != 1: + openloop_debug("curve openloop: flag == 0") + return None + + if temp <= tin_min: + openloop_debug("curve openloop: temp = %d less than tin_min[%d]" % (temp, tin_min)) + return pwm_min + + pwm = int(a * temp * temp + b * temp + c) + openloop_debug("curve openloop: cacl_pwm = 0x%x" % pwm) + + pwm = min(pwm, pwm_max) + pwm = max(pwm, pwm_min) + openloop_debug("curve openloop: temp = %d, pwm = 0x%x" % (temp, pwm)) + return pwm diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py new file mode 100644 index 0000000000..c33c1df33b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/algorithm/pid.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +import os +import syslog +import copy + +from plat_hal.baseutil import baseutil + +PID_DEBUG_FILE = "/etc/.pid_debug_flag" + +PIDERROR = 1 +PIDDEBUG = 2 + +debuglevel = 0 + + +def pid_debug(s): + if PIDDEBUG & debuglevel: + syslog.openlog("FANCONTROL-PID", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def pid_error(s): + if PIDERROR & debuglevel: + syslog.openlog("FANCONTROL-PID", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class pid(object): + __config = None + __pid_config = None + + def __init__(self): + self.__config = baseutil.get_monitor_config() + self.__pid_config = copy.deepcopy(self.__config["pid"]) + + def debug_init(self): + global debuglevel + if os.path.exists(PID_DEBUG_FILE): + debuglevel = debuglevel | PIDDEBUG | PIDERROR + else: + debuglevel = debuglevel & ~(PIDDEBUG | PIDERROR) + + def get_para(self, name): + para = self.__pid_config.get(name) + return para + + def get_temp_update(self, pid_para, current_temp): + temp = pid_para["value"] + if temp is None: + return None + temp.append(current_temp) + del temp[0] + return temp + + def cacl(self, last_pwm, name, current_temp): + delta_pwm = 0 + self.debug_init() + pid_debug("last_pwm = %d" % last_pwm) + + pid_para = self.get_para(name) + if pid_para is None: + pid_debug("get %s pid para failed" % name) + return None + + temp = self.get_temp_update(pid_para, current_temp) + if temp is None: + pid_debug("get %s update failed" % name) + return None + + speed_type = pid_para["type"] + Kp = pid_para["Kp"] + Ki = pid_para["Ki"] + Kd = pid_para["Kd"] + target = pid_para["target"] + pwm_min = pid_para["pwm_min"] + pwm_max = pid_para["pwm_max"] + flag = pid_para["flag"] + + if flag != 1: + pid_debug("%s pid flag == 0" % name) + return None + + if speed_type == "duty": + current_pwm = round(last_pwm * 100 / 255) + else: + current_pwm = last_pwm + + if temp[2] is None: + tmp_pwm = current_pwm + elif ((temp[0] is None) or (temp[1] is None)): + delta_pwm = Ki * (temp[2] - target) + tmp_pwm = current_pwm + delta_pwm + else: + delta_pwm = Kp * (temp[2] - temp[1]) + Ki * (temp[2] - target) + Kd * (temp[2] - 2 * temp[1] + temp[0]) + tmp_pwm = current_pwm + delta_pwm + + pid_debug("delta_pwm = %d" % delta_pwm) + if speed_type == "duty": + pwm = round(tmp_pwm * 255 / 100) + else: + pwm = int(tmp_pwm) + + pwm = min(pwm, pwm_max) + pwm = max(pwm, pwm_min) + pid_debug("last_pwm = 0x%x, pwm = 0x%x" % (last_pwm, pwm)) + return pwm diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py index 38beb068f4..4be78e7fdc 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fantlv.py @@ -1,19 +1,21 @@ #!/usr/bin/python3 # -*- coding: utf-8 -*- + class FantlvException(Exception): - def __init__(self, message='fantlverror', code=-100): + def __init__(self, message='fantlverror', code=-100): err = 'errcode: {0} message:{1}'.format(code, message) Exception.__init__(self, err) self.code = code self.message = message -class fan_tlv(object): + +class fan_tlv(): HEAD_INFO = "\x01\x7e\x01\xf1" - VERSION = 0x01 # E2PROM file init version is 0x01 - FLAG = 0x7E #new version E2PROM mark as 0x7E - HW_VER = 0X01 # consists of master version and revised version - TYPE = 0xf1 # hardware type define - TLV_LEN = 00 # vaild data length(16bit) + VERSION = 0x01 + FLAG = 0x7E + HW_VER = 0X01 + TYPE = 0xf1 + TLV_LEN = 00 _FAN_TLV_HDR_LEN = 6 _FAN_TLV_CRC_LEN = 2 @@ -22,8 +24,6 @@ class fan_tlv(object): _FAN_TLV_TYPE_HW_INFO = 0x05 _FAN_TLV_TYPE_DEV_TYPE = 0x06 - _fandecodetime = 0 - @property def dstatus(self): return self._dstatus @@ -44,18 +44,6 @@ class fan_tlv(object): def typedevtype(self): return self._typedevtype - @property - def fanbus(self): - return self._fanbus - - @property - def fanloc(self): - return self._fanloc - - @property - def fandecodetime(self): - return self._fandecodetime - def __init__(self): self._typename = "" self._typesn = "" @@ -63,25 +51,20 @@ class fan_tlv(object): self._typedevtype = "" self._dstatus = 0 - def strtoarr(self, str): + def strtoarr(self, val): s = [] - if str is not None: - for index in range(len(str)): - s.append(str[index]) + if not isinstance(val, str): + return s + for index in val: + s.append(index) return s - def str_to_hex(self,rest_v): - value = 0 - for index in range(len(rest_v)): - value |= ord(rest_v[index]) << ((len(rest_v) - index - 1) * 8) - return value - - def hex_to_str(self,s): + def hex_to_str(self, s): len_t = len(s) if len_t % 2 != 0: return 0 ret = "" - for t in range(0, int(len_t / 2)): + for t in range(0, len_t / 2): ret += chr(int(s[2 * t:2 * t + 2], 16)) return ret @@ -92,7 +75,7 @@ class fan_tlv(object): bin_buffer[2] = chr(self.HW_VER) bin_buffer[3] = chr(self.TYPE) - temp_t = "%08x" % self.typedevtype # handle devtype first + temp_t = "%08x" % self.typedevtype typedevtype_t = self.hex_to_str(temp_t) total_len = len(self.typename) + len(self.typesn) + \ len(self.typehwinfo) + len(typedevtype_t) + 8 @@ -125,10 +108,9 @@ class fan_tlv(object): len(typedevtype_t)] = self.strtoarr(typedevtype_t) index_start = index_start + 2 + len(typedevtype_t) - crcs = fan_tlv.fancrc(''.join(bin_buffer[0:index_start])) # 2bytes checking + crcs = fan_tlv.fancrc(''.join(bin_buffer[0:index_start])) bin_buffer[index_start] = chr(crcs >> 8) bin_buffer[index_start + 1] = chr(crcs & 0x00ff) - # printvalue(bin_buffer) return bin_buffer def decode(self, e2): @@ -144,7 +126,6 @@ class fan_tlv(object): tlv_index = self._FAN_TLV_HDR_LEN tlv_end = self._FAN_TLV_HDR_LEN + self.TLV_LEN - # check sum if len(e2) < self._FAN_TLV_HDR_LEN + self.TLV_LEN + 2: raise FantlvException("Fan tlv eeprom len error!", -2) sumcrc = fan_tlv.fancrc(e2[0:self._FAN_TLV_HDR_LEN + self.TLV_LEN]) @@ -152,8 +133,7 @@ class fan_tlv(object): ) << 8 | ord(e2[self._FAN_TLV_HDR_LEN + self.TLV_LEN + 1]) if sumcrc != readcrc: raise FantlvException("Fan tlv eeprom checksum error!", -1) - else: - self._dstatus = 0 + self._dstatus = 0 while (tlv_index + 2) < len(e2) and tlv_index < tlv_end: s = self.decoder( e2[tlv_index:tlv_index + 2 + ord(e2[tlv_index + 1])]) @@ -164,15 +144,16 @@ class fan_tlv(object): @staticmethod def fancrc(t): - sum = 0 - for index in range(len(t)): - sum += ord(t[index]) - return sum + crc = 0 + for item in t: + crc += ord(item) + return crc def decoder(self, t): try: name = "" value = "" + _len = 0 if ord(t[0]) == self._FAN_TLV_TYPE_NAME: name = "Product Name" _len = ord(t[1]) @@ -194,10 +175,10 @@ class fan_tlv(object): value = "0x" for c in t[2:2 + ord(t[1])]: value += "%02X" % (ord(c),) - self._typedevtype = int(value,16) + self._typedevtype = int(value, 16) except Exception as e: print(e) - return {"name": name, "code": ord(t[0]), "value": value,"lens": _len} + return {"name": name, "code": ord(t[0]), "value": value, "lens": _len} def __str__(self): formatstr = "VERSION : 0x%02x \n" \ @@ -207,6 +188,5 @@ class fan_tlv(object): "typename : %s \n" \ "typesn : %s \n" \ "typehwinfo : %s \n" - return formatstr % (self.VERSION, self.FLAG, self.HW_VER, self.TYPE, self.typename, self.typesn, self.typehwinfo) - - + return formatstr % (self.VERSION, self.FLAG, self.HW_VER, self.TYPE, + self.typename, self.typesn, self.typehwinfo) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py index 90a690a19e..f95164e036 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/fru.py @@ -1,18 +1,14 @@ #!/usr/bin/python3 -# -*- coding: utf-8 -*- import collections -from bitarray import bitarray from datetime import datetime, timedelta -import sys +from bitarray import bitarray -__all__ = ["FruException", "FruUtil", "BaseArea", "BoardInfoArea", "ProductInfoArea", - "MultiRecordArea", "Field", "ipmifru"] __DEBUG__ = "N" class FruException(Exception): - def __init__(self, message='fruerror', code=-100): + def __init__(self, message='fruerror', code=-100): err = 'errcode: {0} message:{1}'.format(code, message) Exception.__init__(self, err) self.code = code @@ -24,7 +20,7 @@ def e_print(err): def d_print(debug_info): - if(__DEBUG__ == "Y"): + if __DEBUG__ == "Y": print(debug_info) @@ -43,7 +39,7 @@ class FruUtil(): starttime = datetime(1996, 1, 1, 0, 0, 0) endtime = datetime.now() seconds = (endtime - starttime).total_seconds() - mins = seconds / 60 + mins = seconds // 60 m = int(round(mins)) return m @@ -53,7 +49,7 @@ class FruUtil(): @staticmethod def getTypeLength(value): - if value is None: + if value is None or len(value) == 0: return 0 a = bitarray(8) a.setall(False) @@ -65,8 +61,8 @@ class FruUtil(): @staticmethod def checksum(b): result = 0 - for i in range(len(b)): - result += ord(b[i]) + for item in b: + result += ord(item) return (0x100 - (result & 0xff)) & 0xff @@ -89,7 +85,6 @@ class BaseArea(object): self._size = size self._isPresent = False self._data = b'\x00' * size - self.__dataoffset = 0 @property def childList(self): @@ -144,6 +139,9 @@ class BoardInfoArea(BaseArea): _boardTime = None _fields = None _mfg_date = None + areaversion = None + _boardversion = None + _language = None def __str__(self): formatstr = "version : %x\n" \ @@ -229,8 +227,7 @@ class BoardInfoArea(BaseArea): self.fruFileId = self.data[index + 1: index + templen + 1] index += templen + 1 d_print("decode fruFileId:%s" % self.fruFileId) - - + for i in range(1, 11): valtmp = "boardextra%d" % i if self.data[index] != chr(0xc1): @@ -242,6 +239,11 @@ class BoardInfoArea(BaseArea): else: break + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + def recalcute(self): d_print("boardInfoArea version:%x" % ord(self.boardversion)) d_print("boardInfoArea length:%d" % self.size) @@ -250,7 +252,7 @@ class BoardInfoArea(BaseArea): d_print("boardInfoArea mfg_date:%x" % self.mfg_date) self.data = chr(ord(self.boardversion)) + \ - chr(self.size / 8) + chr(self.language) + chr(self.size // 8) + chr(self.language) self.data += chr(self.mfg_date & 0xFF) self.data += chr((self.mfg_date >> 8) & 0xFF) @@ -283,9 +285,7 @@ class BoardInfoArea(BaseArea): valtmpval = getattr(self, valtmp) d_print("boardInfoArea boardextra%d:%s" % (i, valtmpval)) self.data += chr(FruUtil.getTypeLength(valtmpval)) - if valtmpval is None: - pass - else: + if valtmpval is not None: self.data += valtmpval else: break @@ -293,14 +293,14 @@ class BoardInfoArea(BaseArea): self.data += chr(0xc1) if len(self.data) > (self.size - 1): - incr = (len(self.data) - self.size) / 8 + 1 + incr = (len(self.data) - self.size) // 8 + 1 self.size += incr * 8 - self.data = self.data[0:1] + chr(self.size / 8) + self.data[2:] + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] d_print("self data:%d" % len(self.data)) d_print("self size:%d" % self.size) d_print("adjust size:%d" % (self.size - len(self.data) - 1)) - self.data = self.data.ljust((self.size - 1), self.INITVALUE) + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) # checksum checksum = FruUtil.checksum(self.data) @@ -391,6 +391,7 @@ class ProductInfoArea(BaseArea): _productManufacturer = None _productAssetTag = None _FRUFileID = None + _language = None def __str__(self): formatstr = "version : %x\n" \ @@ -483,7 +484,7 @@ class ProductInfoArea(BaseArea): self.fruFileId = self.data[index + 1: index + templen + 1] index += templen + 1 d_print("decode fruFileId:%s" % self.fruFileId) - + for i in range(1, 11): valtmp = "productextra%d" % i if self.data[index] != chr(0xc1) and index < self.size - 1: @@ -567,12 +568,17 @@ class ProductInfoArea(BaseArea): def fruFileId(self, name): self._FRUFileID = name + def fruSetValue(self, field, value): + tmp_field = getattr(self, field, None) + if tmp_field is not None: + setattr(self, field, value) + def recalcute(self): d_print("product version:%x" % ord(self.areaversion)) d_print("product length:%d" % self.size) d_print("product language:%x" % self.language) self.data = chr(ord(self.areaversion)) + \ - chr(self.size / 8) + chr(self.language) + chr(self.size // 8) + chr(self.language) typelength = FruUtil.getTypeLength(self.productManufacturer) self.data += chr(typelength) @@ -597,29 +603,26 @@ class ProductInfoArea(BaseArea): self.data += chr(FruUtil.getTypeLength(self.fruFileId)) self.data += self.fruFileId - # whether the extended field exists or not for i in range(1, 11): valtmp = "productextra%d" % i if hasattr(self, valtmp): valtmpval = getattr(self, valtmp) d_print("boardInfoArea productextra%d:%s" % (i, valtmpval)) self.data += chr(FruUtil.getTypeLength(valtmpval)) - if valtmpval is None: - pass - else: + if valtmpval is not None: self.data += valtmpval else: break self.data += chr(0xc1) if len(self.data) > (self.size - 1): - incr = (len(self.data) - self.size) / 8 + 1 + incr = (len(self.data) - self.size) // 8 + 1 self.size += incr * 8 d_print("self.data:%d" % len(self.data)) d_print("self.size:%d" % self.size) - self.data = self.data[0:1] + chr(self.size / 8) + self.data[2:] - self.data = self.data.ljust((self.size - 1), self.INITVALUE) + self.data = self.data[0:1] + chr(self.size // 8) + self.data[2:] + self.data = self.data.ljust((self.size - 1), chr(self.INITVALUE[0])) checksum = FruUtil.checksum(self.data) d_print("board info checksum:%x" % checksum) self.data += chr(checksum) @@ -635,17 +638,13 @@ class Field(object): self.fieldData = fieldData self.fieldType = fieldType - @property - def data(self): - return self._data - @property def fieldType(self): - return self._fieldType + return self.fieldType @property def fieldData(self): - return self._fieldData + return self.fieldData class ipmifru(BaseArea): @@ -663,6 +662,7 @@ class ipmifru(BaseArea): _bodybin = None _version = BaseArea.COMMON_HEAD_VERSION _zeroCheckSum = None + _frusize = 256 def __str__(self): tmpstr = "" @@ -677,13 +677,13 @@ class ipmifru(BaseArea): def decodeBin(self, eeprom): commonHead = eeprom[0:8] d_print("decode version %x" % ord(commonHead[0])) - if self.COMMON_HEAD_VERSION != commonHead[0]: + if ord(self.COMMON_HEAD_VERSION) != ord(commonHead[0]): raise FruException("HEAD VERSION error,not Fru format!", -10) if FruUtil.checksum(commonHead[0:7]) != ord(commonHead[7]): strtemp = "check header checksum error [cal:%02x data:%02x]" % ( FruUtil.checksum(commonHead[0:7]), ord(commonHead[7])) raise FruException(strtemp, -3) - if commonHead[1] != self.INITVALUE: + if ord(commonHead[1]) != ord(self.INITVALUE): d_print("Internal Use Area is present") self.internalUseArea = InternalUseArea( name="Internal Use Area", size=self.SUGGESTED_SIZE_INTERNAL_USE_AREA) @@ -691,7 +691,7 @@ class ipmifru(BaseArea): self.internalUserAreaOffset = ord(commonHead[1]) self.internalUseArea.data = eeprom[self.internalUserAreaOffset * 8: ( self.internalUserAreaOffset * 8 + self.internalUseArea.size)] - if commonHead[2] != self.INITVALUE: + if ord(commonHead[2]) != ord(self.INITVALUE): d_print("Chassis Info Area is present") self.chassisInfoArea = ChassisInfoArea( name="Chassis Info Area", size=self.SUGGESTED_SIZE_CHASSIS_INFO_AREA) @@ -699,7 +699,7 @@ class ipmifru(BaseArea): self.chassicInfoAreaOffset = ord(commonHead[2]) self.chassisInfoArea.data = eeprom[self.chassicInfoAreaOffset * 8: ( self.chassicInfoAreaOffset * 8 + self.chassisInfoArea.size)] - if commonHead[3] != self.INITVALUE: + if ord(commonHead[3]) != ord(self.INITVALUE): self.boardInfoArea = BoardInfoArea( name="Board Info Area", size=self.SUGGESTED_SIZE_BOARD_INFO_AREA) self.boardInfoArea.isPresent = True @@ -711,12 +711,12 @@ class ipmifru(BaseArea): self.boardInfoArea.data = eeprom[self.boardInfoAreaOffset * 8: ( self.boardInfoAreaOffset * 8 + self.boardInfoArea.size)] if FruUtil.checksum(self.boardInfoArea.data[:-1]) != ord(self.boardInfoArea.data[-1:]): - print("check boardInfoArea checksum error[cal:%02x data:%02x]" % \ + strtmp = "check boardInfoArea checksum error[cal:%02x data:%02x]" % \ (FruUtil.checksum( - self.boardInfoArea.data[:-1]), ord(self.boardInfoArea.data[-1:]))) - sys.exit(-1) + self.boardInfoArea.data[:-1]), ord(self.boardInfoArea.data[-1:])) + raise FruException(strtmp, -3) self.boardInfoArea.decodedata() - if commonHead[4] != self.INITVALUE: + if ord(commonHead[4]) != ord(self.INITVALUE): d_print("Product Info Area is present") self.productInfoArea = ProductInfoArea( name="Product Info Area ", size=self.SUGGESTED_SIZE_PRODUCT_INFO_AREA) @@ -736,7 +736,7 @@ class ipmifru(BaseArea): FruUtil.checksum(self.productInfoArea.data[:-1]), ord(self.productInfoArea.data[-1:])) raise FruException(strtmp, -3) self.productInfoArea.decodedata() - if commonHead[5] != self.INITVALUE: + if ord(commonHead[5]) != ord(self.INITVALUE): self.multiRecordArea = MultiRecordArea( name="MultiRecord record Area ") d_print("MultiRecord record present") @@ -752,7 +752,6 @@ class ipmifru(BaseArea): self.boardInfoAreaOffset = self.INITVALUE self.productinfoAreaOffset = self.INITVALUE self.multiRecordAreaOffset = self.INITVALUE - self.PAD = self.INITVALUE self.zeroCheckSum = self.INITVALUE self.offset = self.SUGGESTED_SIZE_COMMON_HEADER self.productInfoArea = None @@ -878,30 +877,31 @@ class ipmifru(BaseArea): self.bindata = "" self.offset = self.SUGGESTED_SIZE_COMMON_HEADER d_print("common Header %d" % self.offset) + d_print("fru eeprom size %d" % self._frusize) if self.internalUseArea is not None and self.internalUseArea.isPresent: - self.internalUserAreaOffset = self.offset / 8 + self.internalUserAreaOffset = self.offset // 8 self.offset += self.internalUseArea.size d_print("internalUseArea is present offset:%d" % self.offset) if self.chassisInfoArea is not None and self.chassisInfoArea.isPresent: - self.chassicInfoAreaOffset = self.offset / 8 + self.chassicInfoAreaOffset = self.offset // 8 self.offset += self.chassisInfoArea.size d_print("chassisInfoArea is present offset:%d" % self.offset) if self.boardInfoArea is not None and self.boardInfoArea.isPresent: - self.boardInfoAreaOffset = self.offset / 8 + self.boardInfoAreaOffset = self.offset // 8 self.offset += self.boardInfoArea.size d_print("boardInfoArea is present offset:%d" % self.offset) d_print("boardInfoArea is present size:%d" % self.boardInfoArea.size) if self.productInfoArea is not None and self.productInfoArea.isPresent: - self.productinfoAreaOffset = self.offset / 8 + self.productinfoAreaOffset = self.offset // 8 self.offset += self.productInfoArea.size d_print("productInfoArea is present offset:%d" % self.offset) if self.multiRecordArea is not None and self.multiRecordArea.isPresent: - self.multiRecordAreaOffset = self.offset / 8 + self.multiRecordAreaOffset = self.offset // 8 d_print("multiRecordArea is present offset:%d" % self.offset) if self.internalUserAreaOffset == self.INITVALUE: @@ -918,16 +918,17 @@ class ipmifru(BaseArea): self.zeroCheckSum = (0x100 - ord(self.version) - self.internalUserAreaOffset - self.chassicInfoAreaOffset - self.productinfoAreaOffset - self.boardInfoAreaOffset - self.multiRecordAreaOffset) & 0xff d_print("zerochecksum:%x" % self.zeroCheckSum) - self.data = self.version + chr(self.internalUserAreaOffset) + chr(self.chassicInfoAreaOffset) + chr( - self.boardInfoAreaOffset) + chr(self.productinfoAreaOffset) + chr(self.multiRecordAreaOffset) + self.INITVALUE + chr(self.zeroCheckSum) + self.data = "" + self.data += chr(self.version[0]) + chr(self.internalUserAreaOffset) + chr(self.chassicInfoAreaOffset) + chr( + self.boardInfoAreaOffset) + chr(self.productinfoAreaOffset) + chr(self.multiRecordAreaOffset) + chr(self.INITVALUE[0]) + chr(self.zeroCheckSum) self.bindata = self.data + self.bodybin totallen = len(self.bindata) d_print("totallen %d" % totallen) - if (totallen < 256): - self.bindata = self.bindata.ljust(256, self.INITVALUE) + if totallen < self._frusize: + self.bindata = self.bindata.ljust(self._frusize, chr(self.INITVALUE[0])) else: - raise FruException('bin data more than 256', -2) + raise FruException('bin data more than %d' % self._frusize, -2) def recalcutebin(self): self.bodybin = "" @@ -949,6 +950,12 @@ class ipmifru(BaseArea): d_print("multiRecordArea present") self.bodybin += self.productInfoArea.data - def recalcute(self): + def recalcute(self, fru_eeprom_size=256): + self._frusize = fru_eeprom_size self.recalcutebin() self.recalcuteCommonHead() + + def setValue(self, area, field, value): + tmp_area = getattr(self, area, None) + if tmp_area is not None: + tmp_area.fruSetValue(field, value) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py new file mode 100644 index 0000000000..a90f8f8453 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/eepromutil/onietlv.py @@ -0,0 +1,441 @@ +#!/usr/bin/python3 +import binascii + + +class OnietlvException(Exception): + def __init__(self, message='onietlverror', code=-100): + err = 'errcode: {0} message:{1}'.format(code, message) + Exception.__init__(self, err) + self.code = code + self.message = message + + +class onie_tlv(object): + TLV_INFO_ID_STRING = "TlvInfo\x00" + TLV_INFO_INIA_ID = "\x00\x00\x13\x11" + TLV_INFO_VERSION = 0x01 + TLV_INFO_LENGTH = 0x00 + TLV_INFO_LENGTH_VALUE = 0xba + + TLV_CODE_PRODUCT_NAME = 0x21 + TLV_CODE_PART_NUMBER = 0x22 + TLV_CODE_SERIAL_NUMBER = 0x23 + TLV_CODE_MAC_BASE = 0x24 + TLV_CODE_MANUF_DATE = 0x25 + TLV_CODE_DEVICE_VERSION = 0x26 + TLV_CODE_LABEL_REVISION = 0x27 + TLV_CODE_PLATFORM_NAME = 0x28 + TLV_CODE_ONIE_VERSION = 0x29 + TLV_CODE_MAC_SIZE = 0x2A + TLV_CODE_MANUF_NAME = 0x2B + TLV_CODE_MANUF_COUNTRY = 0x2C + TLV_CODE_VENDOR_NAME = 0x2D + TLV_CODE_DIAG_VERSION = 0x2E + TLV_CODE_SERVICE_TAG = 0x2F + TLV_CODE_VENDOR_EXT = 0xFD + TLV_CODE_CRC_32 = 0xFE + _TLV_DISPLAY_VENDOR_EXT = 1 + TLV_CODE_WB_CARID = 0x01 + _TLV_INFO_HDR_LEN = 11 + TLV_CODE_PRODUCT_ID = 0x40 + TLV_CODE_HW_VERSION = 0x41 + TLV_CODE_MAIN_FILENAME = 0x42 + TLV_CODE_DTS_FINENAME = 0x43 + TLV_CODE_SY_SERIAL0 = 0x44 + TLV_CODE_SY_SERIAL1 = 0x45 + TLV_CODE_SY_SERIAL2 = 0x46 + TLV_CODE_SY_SERIAL3 = 0x47 + TLV_CODE_PROJECT_ID = 0x48 + TLV_CODE_SETMAC_VERSION = 0x49 + TLV_CODE_EEPROM_TYPE = 0x4A + + @property + def dstatus(self): + return self._dstatus + + @property + def cardid(self): + return self._cardid + + @property + def productname(self): + return self._productname + + @property + def partnum(self): + return self._partnum + + @property + def serialnum(self): + return self._serialnum + + @property + def macbase(self): + return self._macbase + + @property + def manufdate(self): + return self._manufdate + + @property + def deviceversion(self): + return self._deviceversion + + @property + def labelrevision(self): + return self._labelrevision + + @property + def platformname(self): + return self._platformname + + @property + def onieversion(self): + return self._onieversion + + @property + def macsize(self): + return self._macsize + + @property + def manufname(self): + return self._manufname + + @property + def manufcountry(self): + return self._manufcountry + + @property + def vendorname(self): + return self._vendorname + + @property + def diagname(self): + return self._diagname + + @property + def servicetag(self): + return self._servicetag + + @property + def vendorext(self): + return self._vendorext + + def __init__(self): + self._cardid = "" + self._productname = "" + self._partnum = "" + self._serialnum = "" + self._macbase = "" + self._manufdate = "" + self._deviceversion = "" + self._labelrevision = "" + self._platformname = "" + self._onieversion = "" + self._macsize = "" + self._manufname = "" + self._manufcountry = "" + self._vendorname = "" + self._diagname = "" + self._servicetag = "" + self._vendorext = "" + self._productid = "" + self._hwversion = "" + self._mainfilename = "" + self._dtsfilename = "" + self._syserial0 = "" + self._syserial1 = "" + self._syserial2 = "" + self._syserial3 = "" + self._projectid = "" + self._setmacversion = "" + self._eepromtype = "" + self._crc32 = "" + self._dstatus = 0 + + def oniecrc32(self, v): + data_array = bytearray() + for x in v: + data_array.append(ord(x)) + return '0x%08x' % (binascii.crc32(bytes(data_array)) & 0xffffffff) + + def getTLV_BODY(self, tlv_type, value): + x = [] + temp_t = "" + if tlv_type == self.TLV_CODE_MAC_BASE: + arr = value.split(':') + for tt in arr: + temp_t += chr(int(tt, 16)) + elif tlv_type == self.TLV_CODE_DEVICE_VERSION: + temp_t = chr(value) + elif tlv_type == self.TLV_CODE_MAC_SIZE: + temp_t = chr(value >> 8) + chr(value & 0x00ff) + else: + temp_t = value + x.append(chr(tlv_type)) + x.append(chr(len(temp_t))) + for i in temp_t: + x.append(i) + return x + + def generate_ext(self, cardid): + s = "%08x" % cardid + ret = "" + for t in range(0, 4): + ret += chr(int(s[2 * t:2 * t + 2], 16)) + ret = chr(0x01) + chr(len(ret)) + ret + return ret + + def generate_value(self, _t): + ret = [] + for i in self.TLV_INFO_ID_STRING: + ret.append(i) + ret.append(chr(self.TLV_INFO_VERSION)) + ret.append(chr(self.TLV_INFO_LENGTH)) + ret.append(chr(self.TLV_INFO_LENGTH_VALUE)) + + total_len = 0 + for key in _t: + x = self.getTLV_BODY(key, _t[key]) + ret += x + total_len += len(x) + ret[10] = chr(total_len + 6) + + ret.append(chr(0xFE)) + ret.append(chr(0x04)) + s = self.oniecrc32(''.join(ret)) + for t in range(0, 4): + ret.append(chr(int(s[2 * t + 2:2 * t + 4], 16))) + totallen = len(ret) + if totallen < 256: + for left_t in range(0, 256 - totallen): + ret.append(chr(0x00)) + return (ret, True) + + def decode_tlv(self, e): + tlv_index = 0 + tlv_end = len(e) + ret = [] + while tlv_index < tlv_end and (tlv_index + 2 + ord(e[tlv_index + 1])) <= len(e): + rt = self.decoder(e[tlv_index:tlv_index + 2 + ord(e[tlv_index + 1])]) + ret.append(rt) + if ord(e[tlv_index]) == self.TLV_CODE_CRC_32: + break + tlv_index += ord(e[tlv_index + 1]) + 2 + return ret + + def decode(self, e): + if e[0:8] != self.TLV_INFO_ID_STRING: + raise OnietlvException("ONIE tlv head info error,not onie tlv type", -1) + total_len = (ord(e[9]) << 8) | ord(e[10]) + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_len + if tlv_end > len(e): + raise OnietlvException("ONIE tlv length error", -2) + ret = [] + ret = self.decode_tlv(e[tlv_index:tlv_end]) + for item in ret: + if item['code'] == self.TLV_CODE_VENDOR_EXT: + if item["value"][0:4] == self.TLV_INFO_INIA_ID: + rt = self.decode_tlv(item["value"][4:]) + else: + rt = self.decode_tlv(item["value"][0:]) + ret.extend(rt) + return ret + + def decoder(self, t): + if ord(t[0]) == self.TLV_CODE_PRODUCT_NAME: + name = "Product Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._productname = value + elif ord(t[0]) == self.TLV_CODE_PART_NUMBER: + name = "Part Number" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._partnum = value + elif ord(t[0]) == self.TLV_CODE_SERIAL_NUMBER: + name = "Serial Number" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._serialnum = value + elif ord(t[0]) == self.TLV_CODE_MAC_BASE: + name = "Base MAC Address" + _len = ord(t[1]) + value = ":".join(['%02X' % ord(T) for T in t[2:8]]).upper() + self._macbase = value + elif ord(t[0]) == self.TLV_CODE_MANUF_DATE: + name = "Manufacture Date" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._manufdate = value + elif ord(t[0]) == self.TLV_CODE_DEVICE_VERSION: + name = "Device Version" + _len = ord(t[1]) + value = ord(t[2]) + self._deviceversion = value + elif ord(t[0]) == self.TLV_CODE_LABEL_REVISION: + name = "Label Revision" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._labelrevision = value + elif ord(t[0]) == self.TLV_CODE_PLATFORM_NAME: + name = "Platform Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._platformname = value + elif ord(t[0]) == self.TLV_CODE_ONIE_VERSION: + name = "ONIE Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._onieversion = value + elif ord(t[0]) == self.TLV_CODE_MAC_SIZE: + name = "MAC Addresses" + _len = ord(t[1]) + value = str((ord(t[2]) << 8) | ord(t[3])) + self._macsize = value + elif ord(t[0]) == self.TLV_CODE_MANUF_NAME: + name = "Manufacturer" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._manufname = value + elif ord(t[0]) == self.TLV_CODE_MANUF_COUNTRY: + name = "Manufacture Country" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._manufcountry = value + elif ord(t[0]) == self.TLV_CODE_VENDOR_NAME: + name = "Vendor Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._vendorname = value + elif ord(t[0]) == self.TLV_CODE_DIAG_VERSION: + name = "Diag Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._diagname = value + elif ord(t[0]) == self.TLV_CODE_SERVICE_TAG: + name = "Service Tag" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._servicetag = value + elif ord(t[0]) == self.TLV_CODE_VENDOR_EXT: + name = "Vendor Extension" + _len = ord(t[1]) + value = "" + if self._TLV_DISPLAY_VENDOR_EXT: + value = t[2:2 + ord(t[1])] + self._vendorext = value + elif ord(t[0]) == self.TLV_CODE_CRC_32 and len(t) == 6: + name = "CRC-32" + _len = ord(t[1]) + value = "0x%08X" % (((ord(t[2]) << 24) | ( + ord(t[3]) << 16) | (ord(t[4]) << 8) | ord(t[5])),) + self._crc32 = value + elif ord(t[0]) == self.TLV_CODE_WB_CARID: + name = "Card id" + _len = ord(t[1]) + value = "" + for c in t[2:2 + ord(t[1])]: + value += "%02X" % (ord(c),) + self._cardid = value + elif ord(t[0]) == self.TLV_CODE_PRODUCT_ID: + name = "Product id" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._productid = value + elif ord(t[0]) == self.TLV_CODE_HW_VERSION: + name = "Hardware Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._hwversion = value + elif ord(t[0]) == self.TLV_CODE_MAIN_FILENAME: + name = "Main File Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._mainfilename = value + elif ord(t[0]) == self.TLV_CODE_DTS_FINENAME: + name = "DTS File Name" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._dtsfilename = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL0: + name = "SY Serial 0" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial0 = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL1: + name = "SY Serial 1" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial1 = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL2: + name = "SY Serial 2" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial2 = value + elif ord(t[0]) == self.TLV_CODE_SY_SERIAL3: + name = "SY Serial 3" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._syserial3 = value + elif ord(t[0]) == self.TLV_CODE_PROJECT_ID: + name = "Project id" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._projectid = value + elif ord(t[0]) == self.TLV_CODE_SETMAC_VERSION: + name = "Setmac Version" + _len = ord(t[1]) + value = t[2:2 + ord(t[1])] + self._setmacversion = value + elif ord(t[0]) == self.TLV_CODE_EEPROM_TYPE: + name = "EEPROM Type" + _len = ord(t[1]) + value = "" + for c in t[2:2 + ord(t[1])]: + value += "%02X" % (ord(c),) + self._eepromtype = value + else: + name = "Unknown" + _len = ord(t[1]) + value = "" + for c in t[2:2 + ord(t[1])]: + value += "0x%02X " % (ord(c),) + return {"name": name, "code": ord(t[0]), "value": value, "lens": _len} + + def __str__(self): + formatstr = "Card id : %s \n" \ + "Product Name : %s \n" \ + "Part Number : %s \n" \ + "Serial Number : %s \n" \ + "Base MAC Address : %s \n" \ + "Manufacture Date : %s \n" \ + "Device Version : %s \n" \ + "Label Revision : %s \n" \ + "Platform Name : %s \n" \ + "ONIE Version : %s \n" \ + "MAC Addresses : %s \n" \ + "Manufacturer : %s \n" \ + "Manufacture Country : %s \n" \ + "Vendor Name : %s \n" \ + "Diag Version : %s \n" \ + "Service Tag : %s \n" \ + "CRC-32 : %s \n" + return formatstr % (self._cardid, + self._productname, + self._partnum, + self._serialnum, + self._macbase, + self._manufdate, + self._deviceversion, + self._labelrevision, + self._platformname, + self._onieversion, + self._macsize, + self._manufname, + self._manufcountry, + self._vendorname, + self._diagname, + self._servicetag, + self._crc32) diff --git a/device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_env.conf b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/__init__.py similarity index 100% rename from device/ragile/x86_64-ragile_ra-b6510-48v8c-r0/platform_env.conf rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/__init__.py diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py new file mode 100644 index 0000000000..ffe271a424 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/baseutil.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +####################################################### +# +# baseutil.py +# Python implementation of the Class baseutil +# +####################################################### +import importlib.machinery +import os +import syslog +import json +from plat_hal.osutil import osutil + +SYSLOG_IDENTIFIER = "HAL" + +CONFIG_DB_PATH = "/etc/sonic/config_db.json" +BOARD_ID_PATH = "/sys/module/platform_common/parameters/dfd_my_type" +BOARD_AIRFLOW_PATH = "/etc/sonic/.airflow" + + +def getonieplatform(path): + if not os.path.isfile(path): + return "" + machine_vars = {} + with open(path) as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars.get("onie_platform") + + +def getboardid(): + if not os.path.exists(BOARD_ID_PATH): + return "NA" + with open(BOARD_ID_PATH) as fd: + id_str = fd.read().strip() + return "0x%x" % (int(id_str, 10)) + + +def getboardairflow(): + if not os.path.exists(BOARD_AIRFLOW_PATH): + return "NA" + with open(BOARD_AIRFLOW_PATH) as fd: + airflow_str = fd.read().strip() + data = json.loads(airflow_str) + airflow = data.get("board", "NA") + return airflow + + +def getplatform_config_db(): + if not os.path.isfile(CONFIG_DB_PATH): + return "" + val = os.popen("sonic-cfggen -j %s -v DEVICE_METADATA.localhost.platform" % CONFIG_DB_PATH).read().strip() + if len(val) <= 0: + return "" + return val + + +def getplatform_name(): + if os.path.isfile('/host/machine.conf'): + return getonieplatform('/host/machine.conf') + if os.path.isfile('/usr/share/sonic/hwsku/machine.conf'): + return getonieplatform('/usr/share/sonic/hwsku/machine.conf') + return getplatform_config_db() + + +platform = (getplatform_name()).replace("-", "_") +boardid = getboardid() +boardairflow = getboardairflow() + + +CONFIG_FILE_PATH_LIST = [ + "/usr/local/bin/", + "/usr/lib/python3/dist-packages/", + "/usr/local/lib/python3.7/dist-packages/hal-config/", + "/usr/local/lib/python3.9/dist-packages/hal-config/" +] + + +DEVICE_CONFIG_FILE_LIST = [ + platform + "_" + boardid + "_" + boardairflow + "_device.py", + platform + "_" + boardid + "_device.py", + platform + "_" + boardairflow + "_device.py", + platform + "_device.py" +] + + +MONITOR_CONFIG_FILE_LIST = [ + platform + "_" + boardid + "_" + boardairflow + "_monitor.py", + platform + "_" + boardid + "_monitor.py", + platform + "_" + boardairflow + "_monitor.py", + platform + "_monitor.py" +] + + +class baseutil: + + CONFIG_NAME = 'devices' + MONITOR_CONFIG_NAME = 'monitor' + UBOOT_ENV_URL = '/etc/device/uboot_env' + + @staticmethod + def get_config(): + real_path = None + for configfile_path in CONFIG_FILE_PATH_LIST: + for config_file in DEVICE_CONFIG_FILE_LIST: + file = configfile_path + config_file + if os.path.exists(file): + real_path = file + break + if real_path is not None: + break + + if real_path is None: + raise Exception("get hal device config error") + devices = importlib.machinery.SourceFileLoader(baseutil.CONFIG_NAME, real_path).load_module() + return devices.devices + + @staticmethod + def get_monitor_config(): + real_path = None + for configfile_path in CONFIG_FILE_PATH_LIST: + for config_file in MONITOR_CONFIG_FILE_LIST: + file = configfile_path + config_file + if os.path.exists(file): + real_path = file + break + if real_path is not None: + break + + if real_path is None: + raise Exception("get hal monitor config error") + monitor = importlib.machinery.SourceFileLoader(baseutil.MONITOR_CONFIG_NAME, real_path).load_module() + return monitor.monitor + + @staticmethod + def get_productname(): + ret, val = osutil.command("cat %s |grep productname | awk -F\"=\" '{print $2;}'" % baseutil.UBOOT_ENV_URL) + tmp = val.lower().replace('-', '_') + if ret != 0 or len(val) <= 0: + raise Exception("get productname error") + return tmp + + @staticmethod + def get_platform(): + ret, val = osutil.command("cat %s |grep conffitname | awk -F\"=\" '{print $2;}'" % baseutil.UBOOT_ENV_URL) + if ret != 0 or len(val) <= 0: + raise Exception("get platform error") + return val + + @staticmethod + def get_product_fullname(): + ret, val = osutil.command("cat %s |grep productname | awk -F\"=\" '{print $2;}'" % baseutil.UBOOT_ENV_URL) + if ret != 0 or len(val) <= 0: + raise Exception("get productname error") + return val + + @staticmethod + def logger_debug(msg): + syslog.openlog(SYSLOG_IDENTIFIER) + syslog.syslog(syslog.LOG_DEBUG, msg) + syslog.closelog() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py new file mode 100644 index 0000000000..767d6da34b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/chassisbase.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python3 +####################################################### +# +# chassisbase.py +# Python implementation of the Class chassisbase +# +####################################################### +from plat_hal.dcdc import dcdc +from plat_hal.onie_e2 import onie_e2 +from plat_hal.psu import psu +from plat_hal.led import led +from plat_hal.temp import temp +from plat_hal.fan import fan +from plat_hal.cpld import cpld +from plat_hal.component import component +from plat_hal.cpu import cpu +from plat_hal.baseutil import baseutil + + +class chassisbase(object): + __onie_e2_list = [] + __psu_list = [] + __led_list = [] + __temp_list = [] + __fan_list = [] + __card_list = [] + __sensor_list = [] + __dcdc_list = [] + __cpld_list = [] + __comp_list = [] + __bios_list = [] + __bmc_list = [] + __cpu = None + + def __init__(self, conftype=0, conf=None): + # type: (object, object, object) -> object + """ + init chassisbase as order + + type = 0 use default conf, maybe auto find by platform + type = 1 use given conf, conf is not None + + BITMAP + bit 16 + bit 0 PSU + bit 1 LED + bit 2 TEMP + bit 3 fan + bit 4 card + bit 5 sensor + """ + __confTemp = None + + if conftype == 0: + # user + __confTemp = baseutil.get_config() + elif conftype == 1: + __confTemp = conf + + # onie_e2 + onie_e2temp = [] + onie_e2config = __confTemp.get('onie_e2', []) + for item in onie_e2config: + onie_e2_1 = onie_e2(item) + onie_e2temp.append(onie_e2_1) + self.onie_e2_list = onie_e2temp + + # psu + psutemp = [] + psuconfig = __confTemp.get('psus', []) + for item in psuconfig: + psu1 = psu(item) + psutemp.append(psu1) + self.psu_list = psutemp + + # led + ledtemp = [] + ledconfig = __confTemp.get('leds', []) + for item in ledconfig: + led1 = led(item) + ledtemp.append(led1) + self.led_list = ledtemp + + # temp + temptemp = [] + tempconfig = __confTemp.get('temps', []) + for item in tempconfig: + temp1 = temp(item) + temptemp.append(temp1) + self.temp_list = temptemp + + # fan + fantemp = [] + fanconfig = __confTemp.get('fans', []) + for item in fanconfig: + fan1 = fan(item) + fantemp.append(fan1) + self.fan_list = fantemp + + # dcdc + dcdctemp = [] + dcdcconfig = __confTemp.get('dcdc', []) + for item in dcdcconfig: + dcdc1 = dcdc(item) + dcdctemp.append(dcdc1) + self.dcdc_list = dcdctemp + + # cpld + cpldtemp = [] + cpldconfig = __confTemp.get('cplds', []) + for item in cpldconfig: + cpld1 = cpld(item) + cpldtemp.append(cpld1) + self.cpld_list = cpldtemp + + # compoment: cpld/fpga/bios + comptemp = [] + compconfig = __confTemp.get('comp_cpld', []) + for item in compconfig: + comp1 = component(item) + comptemp.append(comp1) + self.comp_list = comptemp + + compconfig = __confTemp.get('comp_fpga', []) + for item in compconfig: + comp1 = component(item) + self.comp_list.append(comp1) + + compconfig = __confTemp.get('comp_bios', []) + for item in compconfig: + comp1 = component(item) + self.comp_list.append(comp1) + + # cpu + cpuconfig = __confTemp.get('cpu', []) + if len(cpuconfig): + self.cpu = cpu(cpuconfig[0]) + + # dcdc + @property + def dcdc_list(self): + return self.__dcdc_list + + @dcdc_list.setter + def dcdc_list(self, val): + self.__dcdc_list = val + + # sensor + @property + def sensor_list(self): + return self.__sensor_list + + @sensor_list.setter + def sensor_list(self, val): + self.__sensor_list = val + + def get_sensor_byname(self, name): + tmp = self.sensor_list + for item in tmp: + if name == item.name: + return item + return None + + # onie_e2 + @property + def onie_e2_list(self): + return self.__onie_e2_list + + @onie_e2_list.setter + def onie_e2_list(self, val): + self.__onie_e2_list = val + + def get_onie_e2_byname(self, name): + tmp = self.onie_e2_list + for item in tmp: + if name == item.name: + return item + return None + + # psu + @property + def psu_list(self): + return self.__psu_list + + @psu_list.setter + def psu_list(self, val): + self.__psu_list = val + + def get_psu_byname(self, name): + tmp = self.psu_list + for item in tmp: + if name == item.name: + return item + return None + + # fan + @property + def fan_list(self): + return self.__fan_list + + @fan_list.setter + def fan_list(self, val): + self.__fan_list = val + + def get_fan_byname(self, name): + tmp = self.fan_list + for item in tmp: + if name == item.name: + return item + return None + + # led + + @property + def led_list(self): + return self.__led_list + + @led_list.setter + def led_list(self, val): + self.__led_list = val + + def get_led_byname(self, name): + tmp = self.led_list + for item in tmp: + if name == item.name: + return item + return None + + # temp + @property + def temp_list(self): + return self.__temp_list + + @temp_list.setter + def temp_list(self, val): + self.__temp_list = val + + def get_temp_byname(self, name): + tmp = self.temp_list + for item in tmp: + if name == item.name: + return item + return None + + # cpld + @property + def cpld_list(self): + return self.__cpld_list + + @cpld_list.setter + def cpld_list(self, val): + self.__cpld_list = val + + def get_cpld_byname(self, name): + tmp = self.cpld_list + for item in tmp: + if name == item.name: + return item + return None + + @property + def comp_list(self): + return self.__comp_list + + @comp_list.setter + def comp_list(self, val): + self.__comp_list = val + + def get_comp_byname(self, name): + tmp = self.comp_list + for item in tmp: + if name == item.name: + return item + return None + + # bios + @property + def bios_list(self): + return self.__bios_list + + @bios_list.setter + def bios_list(self, val): + self.__bios_list = val + + def get_bios_byname(self, name): + tmp = self.bios_list + for item in tmp: + if name == item.name: + return item + return None + + # bmc + @property + def bmc_list(self): + return self.__bmc_list + + @bmc_list.setter + def bmc_list(self, val): + self.__bmc_list = val + + def get_bmc_byname(self, name): + tmp = self.bmc_list + for item in tmp: + if name == item.name: + return item + return None + + # cpu + @property + def cpu(self): + return self.__cpu + + @cpu.setter + def cpu(self, val): + self.__cpu = val + + def get_cpu_byname(self, name): + return self.cpu diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py new file mode 100644 index 0000000000..0f2ad21674 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/component.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +####################################################### +# +# component.py +# Python implementation of the Class fan +# +####################################################### +from plat_hal.devicebase import devicebase +from plat_hal.osutil import osutil + + +class component(devicebase): + __user_reg = None + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.version_file = conf.get('VersionFile', None) + self.comp_id = conf.get("comp_id", None) + self.desc = conf.get("desc", None) + self.slot = conf.get("slot", None) + + def get_version(self): + version = "NA" + try: + ret, version = self.get_value(self.version_file) + if ret is False: + return version + pattern = self.version_file.get('pattern', None) + version = osutil.std_match(version, pattern) + except Exception: + return version + return version diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py new file mode 100644 index 0000000000..09eed5f975 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpld.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +####################################################### +# +# fan.py +# Python implementation of the Class fan +# +####################################################### +from plat_hal.devicebase import devicebase + + +class cpld(devicebase): + __user_reg = None + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.user_reg = conf.get('UserReg', None) + self.console_reg = conf.get('ConsoleReg', None) + self.console_reg_attrs = conf.get('ConsoleRegAttrs', None) + self.version_file = conf.get('VersionFile', None) + self.cpld_id = conf.get("cpld_id", None) + self.desc = conf.get("desc", None) + self.slot = conf.get("slot", None) + self.format = conf.get("format", "big_endian") + self.warm = conf.get("warm", None) + self.type = conf.get("type", None) + + def get_user_reg(self): + if self.user_reg is None: + return False + ret, val = self.get_value(self.user_reg) + return val + + def set_user_reg(self, value): + if self.user_reg is None: + return False + byte = value & 0xFF + ret, val = self.set_value(self.user_reg, byte) + return ret + + def set_console_owner(self, owner): + ret = False + + if self.console_reg is None: + return False + tmpattr = self.console_reg_attrs.get(owner, None) + if tmpattr is not None: + ret, val = self.set_value(self.console_reg, tmpattr) + return ret + + def get_version(self): + ret, val = self.get_value(self.version_file) + if ret is False: + val = "N/A" + return val + if self.type == "str": + return val.strip('\n') + val = val.strip('\n').split(" ") + if len(val) < 4: + val = "N/A" + return val + if self.format == "little_endian": + cpld_version = "%s%s%s%s" % (val[3], val[2], val[1], val[0]) + else: + cpld_version = "%s%s%s%s" % (val[0], val[1], val[2], val[3]) + return cpld_version diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py new file mode 100644 index 0000000000..c6bec1abd1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/cpu.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +############################################################################### +# +# Hardware Abstraction Layer APIs -- CPU APIs. +# +############################################################################### +from plat_hal.devicebase import devicebase + + +class cpu(devicebase): + + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.cpu_reset_cnt_reg = conf.get('CpuResetCntReg', None) + self.reboot_cause_path = conf.get('reboot_cause_path', "/etc/sonic/.reboot/.previous-reboot-cause.txt") + + def get_cpu_reset_num(self): + """ + get cpu reset num. + @return cpu reset number, -1 for failure + """ + ret = -1 + if self.cpu_reset_cnt_reg is None: + self.logger_debug("ERR: no support get cpu reset num") + return ret + ret, reset_num = self.get_value(self.cpu_reset_cnt_reg) + if ret is False or reset_num is None: + self.logger_debug("ERR: i2c read cpu_reset_cnt_reg,result:%s" % reset_num) + else: + if isinstance(reset_num, str): + ret = int(reset_num, 16) + else: + ret = reset_num + return ret + + def get_cpu_reboot_cause(self): + """ + get_cpu_reboot_cause + @return cpu reset number, -1 for failure + """ + try: + with open(self.reboot_cause_path) as fd: + reboot_cause = fd.read().strip() + return reboot_cause + except Exception: + return "Unknown reboot cause" + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py new file mode 100644 index 0000000000..ba60499504 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/dcdc.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +from plat_hal.devicebase import devicebase +from plat_hal.sensor import sensor + + +class dcdc(devicebase): + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.dcdc_id = conf.get("dcdc_id", None) + self.sensor = sensor(conf) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py new file mode 100644 index 0000000000..e66ae0143f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/devicebase.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python3 +####################################################### +# +# devicebase.py +# Python implementation of the Class devicebase +# +####################################################### +import subprocess +import shlex +import ast +from plat_hal.osutil import osutil +from plat_hal.baseutil import baseutil + +class CodeVisitor(ast.NodeVisitor): + + def __init__(self): + self.value = None + + def get_value(self): + return self.value + + def get_op_value(self, node): + if isinstance(node, ast.Call): # node is func call + value = self.visit_Call(node) + elif isinstance(node, ast.BinOp): # node is BinOp + value = self.visit_BinOp(node) + elif isinstance(node, ast.UnaryOp): # node is UnaryOp + value = self.visit_UnaryOp(node) + elif isinstance(node, ast.Num): # node is Num Constant + value = node.n + elif isinstance(node, ast.Str): # node is Str Constant + value = node.s + else: + raise NotImplementedError("Unsupport operand type: %s" % type(node)) + return value + + def visit_UnaryOp(self, node): + ''' + node.op: operand type, only support ast.UAdd/ast.USub + node.operand: only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.UnaryOp + ''' + + operand_value = self.get_op_value(node.operand) + if isinstance(node.op, ast.UAdd): + self.value = operand_value + elif isinstance(node.op, ast.USub): + self.value = 0 - operand_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_BinOp(self, node): + ''' + node.left: left operand, only support ast.Call/ast.Constant(ast.Num)/ast.BinOp + node.op: operand type, only support ast.Add/ast.Sub/ast.Mult/ast.Div + node.right: right operan, only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + left_value = self.get_op_value(node.left) + right_value = self.get_op_value(node.right) + + if isinstance(node.op, ast.Add): + self.value = left_value + right_value + elif isinstance(node.op, ast.Sub): + self.value = left_value - right_value + elif isinstance(node.op, ast.Mult): + self.value = left_value * right_value + elif isinstance(node.op, ast.Div): + self.value = left_value / right_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_Call(self, node): + ''' + node.func.id: func name, only support 'float', 'int', 'str' + node.args: func args list,only support ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.Call + str/float only support one parameter, eg: float(XXX), str(xxx) + int support one or two parameters, eg: int(xxx) or int(xxx, 16) + xxx can be ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + calc_tuple = ("float", "int", "str") + + if node.func.id not in calc_tuple: + raise NotImplementedError("Unsupport function call type: %s" % node.func.id) + + args_val_list = [] + for item in node.args: + ret = self.get_op_value(item) + args_val_list.append(ret) + + if node.func.id == "str": + if len(args_val_list) != 1: + raise TypeError("str() takes 1 positional argument but %s were given" % len(args_val_list)) + value = str(args_val_list[0]) + self.value = value + return value + + if node.func.id == "float": + if len(args_val_list) != 1: + raise TypeError("float() takes 1 positional argument but %s were given" % len(args_val_list)) + value = float(args_val_list[0]) + self.value = value + return value + # int + if len(args_val_list) == 1: + value = int(args_val_list[0]) + self.value = value + return value + if len(args_val_list) == 2: + value = int(args_val_list[0], args_val_list[1]) + self.value = value + return value + raise TypeError("int() takes 1 or 2 arguments (%s given)" % len(args_val_list)) + + +class devicebase(object): + _name = None + __error_ret = -99999 + + @property + def name(self): + return self._name + + @name.setter + def name(self, val): + self._name = val + + def dumpValueByI2c(self, bus, loc): + value = "" + for i in range(256): + ret, val = self.get_i2c(bus, loc, i) + value += chr(val) + return value + + def byteTostr(self, val): + strtmp = '' + for value in val: + strtmp += chr(value) + return strtmp + + def get_eeprom_info(self, conf): + eeprom = "" + if conf.get('way') == 'sysfs': + ret, eeprom = self.get_value(conf) + if ret is False: + return None + elif conf.get('way') == 'devfile': + ret, eeprom_list = self.get_value(conf) + if ret is False: + return None + for item in eeprom_list: + eeprom += chr(item) + else: + eeprom = self.dumpValueByI2c(conf.get('bus'), conf.get('addr')) + return eeprom + + def exec_os_cmd(self, cmd): + cmds = cmd.split('|') + procs = [] + for i, c in enumerate(cmds): + stdin = None if i == 0 else procs[i-1].stdout + p = subprocess.Popen(shlex.split(c), stdin=stdin, stdout=subprocess.PIPE, shell=False, stderr=subprocess.STDOUT) + procs.append(p) + for proc in procs: + proc.wait() + return procs[-1].returncode, self.byteTostr(procs[-1].communicate()[0]) + + def get_value(self, config): + ''' + get value by config way + way i2c/sysfs/lpc + ''' + way = config.get("way") + if way == 'sysfs': + return self.get_sysfs(config.get("loc"), config.get("flock_path")) + if way == "i2c": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.get_i2c(bus, addr, offset) + if way == "io": + io_addr = config.get('io_addr') + read_len = config.get('read_len', 1) + return self.get_io(io_addr, read_len) + if way == "i2cword": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.get_i2cword(bus, addr, offset) + if way == "devmem": + addr = config.get("addr") + digit = config.get("digit") + mask = config.get("mask", None) + return self.get_devmem(addr, digit, mask) + if way == "sdk": + get_type = config.get("type") + if get_type == "bcm_temp": + return self.getbcmtemp() + if get_type == "bcm_reg": + reg = config.get("reg") + return self.getbcmreg(reg) + raise Exception("cannot found sdk type deal") + if way == "devfile": + loc = config.get("loc") + offset = config.get("offset") + length = config.get("len") + ret, val_list = self.devfile_read(loc, offset, length) + if ret is True: + if length == 1: + val = val_list[0] + return True, val + return True, val_list + return False, ("devfile read failed. path:%s, offset:0x%x, read_len:%d" % (loc, offset, length)) + if way == "devfile_ascii": + loc = config.get("loc") + offset = config.get("offset") + length = config.get("len") + return self.devfile_read_ascii(loc, offset, length) + if way == 'cmd': + cmd = config.get("cmd") + ret, log = self.exec_os_cmd(cmd) + if ret: + return False, ("cmd write exec %s failed, log: %s" % (cmd, log)) + return True, log + raise Exception("cannot found way deal") + + def devfile_read(self, loc, offset, length): + return osutil.readdevfile(loc, offset, length) + + def devfile_read_ascii(self, loc, offset, length): + return osutil.readdevfile_ascii(loc, offset, length) + + def get_sysfs(self, loc, flock_path=None): + return self.getsysfs(loc, flock_path) + + def getsysfs(self, loc, flock_path=None): + ret, val = osutil.readsysfs(loc, flock_path) + return ret, val + + def get_devmem(self, addr, digit, mask): + return osutil.getdevmem(addr, digit, mask) + + def get_i2cword(self, bus, addr, offset): + return self.geti2cword(bus, addr, offset) + + def geti2cword(self, bus, addr, offset): + ret, val = osutil.geti2cword(bus, addr, offset) + return ret, val + + def get_io(self, reg_addr, read_len): + return self.getio(reg_addr, read_len) + + def getio(self, reg_addr, read_len): + ret, val = osutil.io_rd(reg_addr, read_len) + return ret, val + + def get_i2c(self, bus, addr, offset): + return self.geti2c(bus, addr, offset) + + def geti2c(self, bus, addr, offset): + ret, val = osutil.wbi2cget(bus, addr, offset) + return ret, val + + def set_value(self, config, val): + ''' + get value by config way + way i2c/sysfs/lpc + ''' + way = config.get("way") + if way == 'sysfs': + return self.set_sysfs(config.get("loc"), "0x%02x" % val) + if way == "i2c": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.set_i2c(bus, addr, offset, val) + if way == "i2cpec": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.seti2c_byte_pec(bus, addr, offset, val) + if way == 'i2cword': + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.set_i2cword(bus, addr, offset, val) + if way == "i2cwordpec": + bus = config.get("bus") + addr = config.get("addr") + offset = config.get("offset") + return self.set_i2cwordpec(bus, addr, offset, val) + if way == "devfile": + loc = config.get("loc") + offset = config.get("offset") + return self.devfile_write(loc, offset, val) + return False, "unsupport way: %s" % way + + def set_sysfs(self, loc, value): + return self.setsysfs(loc, value) + + def setsysfs(self, loc, value): + return osutil.writesysfs(loc, value) + + def set_i2cword(self, bus, addr, offset, byte): + return self.seti2cword(bus, addr, offset, byte) + + def seti2cword(self, bus, addr, offset, byte): + return osutil.seti2cword(bus, addr, offset, byte) + + def set_i2cwordpec(self, bus, addr, offset, val): + return osutil.seti2cwordpec(bus, addr, offset, val) + + def seti2c_byte_pec(self, bus, addr, offset, val): + return osutil.seti2c_byte_pec(bus, addr, offset, val) + + def set_i2c(self, bus, addr, offset, byte): + return self.seti2c(bus, addr, offset, byte) + + def seti2c(self, bus, addr, offset, byte): + ret, val = osutil.wbi2cset(bus, addr, offset, byte) + return ret, val + + def devfile_write(self, loc, offset, val): + ret, val = osutil.writedevfile(loc, offset, val) + return ret, val + + def getbcmtemp(self): + try: + sta, ret = osutil.getmactemp() + if sta is True: + mac_aver = float(ret.get("average", self.__error_ret)) + mac_aver = mac_aver * 1000 + else: + return False, ret + except AttributeError as e: + return False, str(e) + return True, mac_aver + + def getbcmreg(self, reg): + ret, val = osutil.getsdkreg(reg) + return ret, val + + def logger_debug(self, msg): + baseutil.logger_debug(msg) + + def command(self, cmd): + ret, output = osutil.command(cmd) + return ret, output + + def get_format_value(self, format_str): + ast_obj = ast.parse(format_str, mode='eval') + visitor = CodeVisitor() + visitor.visit(ast_obj) + ret = visitor.get_value() + return ret diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py new file mode 100644 index 0000000000..8b503bf641 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/fan.py @@ -0,0 +1,413 @@ +#!/usr/bin/env python3 +####################################################### +# +# fan.py +# Python implementation of the Class fan +# +####################################################### +from eepromutil.fru import ipmifru +from eepromutil.fantlv import fan_tlv +from plat_hal.devicebase import devicebase +from plat_hal.rotor import rotor + + +class fan(devicebase): + __rotor_list = [] + __pn = None + __raweeprom = None + __sn = None + __hw_version = None + __e2loc = None + __rotors = None + __AirFlow = None + __SpeedMin = None + __SpeedMax = None + __PowerMax = 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.PowerMax = conf.get('PowerMax', 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 value in self.Rotor_config.values(): + 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 PowerMax(self): + return self.__PowerMax + + @PowerMax.setter + def PowerMax(self, val): + self.__PowerMax = 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 is 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_item = self.get_rotor_index(rotor_index) + if rotor_item is None: + return None + speed = rotor_item.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_item = self.get_rotor_index(rotor_index) + if rotor_item is None: + return False + ret, val = self.set_value(rotor_item.Speedconfig, int(level)) + return ret + + def get_rotor_index(self, rotor_index): + if rotor_index > len(self.rotor_list): + return None + rotor_item = self.rotor_list[rotor_index - 1] + return rotor_item + + def get_rotor_byname(self, rotor_index): + for rotor_item in self.rotor_list: + if rotor_item.name == rotor_index: + return rotor_item + 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 + return False + + def get_speed_pwm(self, rotor_index): + rotor_item = self.get_rotor_index(rotor_index) + if rotor_item is None: + return False + if rotor_item.i2c_speed is None: + return False + val = round(rotor_item.i2c_speed * 100 / 255) + return val + + def feed_watchdog(self): + ret = False + for rotor_item in self.rotor_list: + ret, val = rotor_item.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: + self.productName = None + self.productSerialNumber = None + self.hw_version = None + return False + return True + + def get_tlv_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) + tlv = fan_tlv() + rets = tlv.decode(eeprom) + for item in rets: + if item["name"] == "Product Name": + self.productName = item["value"].replace("\x00", "").strip() + elif item["name"] == "serial Number": + self.productSerialNumber = item["value"].replace("\x00", "").strip() + elif item["name"] == "hardware info": + self.hw_version = item["value"].replace("\x00", "").strip() + except Exception: + 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''' + ret = self.get_tlv_info() + if ret is True: + return ret + 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 + 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): + ret = False + if enable is True: + byte = self.EnableWatchdogConf.get("enable_byte", None) + ret, val = self.set_value(self.EnableWatchdogConf, byte) + elif enable is 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 + 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 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py new file mode 100644 index 0000000000..19c78d6400 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/interface.py @@ -0,0 +1,1324 @@ +#!/usr/bin/env python3 +####################################################### +# +# interface.py +# Python implementation of the Class interface +# +####################################################### +import collections +from plat_hal.chassisbase import chassisbase +from plat_hal.baseutil import baseutil +from plat_hal.osutil import osutil + + +def Singleton(cls): + _instance = {} + + def _singleton(*args, **kargs): + if cls not in _instance: + _instance[cls] = cls(*args, **kargs) + return _instance[cls] + + return _singleton + + +@Singleton +class interface(object): + __chas = None + __error_ret = None + + def __init__(self): + self.chas = chassisbase() + self.__error_ret = -99999 + self.__na_ret = 'N/A' + + @property + def na_ret(self): + return self.__na_ret + + @na_ret.setter + def na_ret(self, val): + self.__na_ret = val + + @property + def error_ret(self): + return self.__error_ret + + @error_ret.setter + def error_ret(self, val): + self.__error_ret = val + + @property + def chas(self): + return self.__chas + + @chas.setter + def chas(self, val): + self.__chas = val + + # onie_e2 + def get_onie_e2(self): + onie_e2_list = self.chas.onie_e2_list + return onie_e2_list + + def get_onie_e2_path(self, name): + onie_e2 = self.chas.get_onie_e2_byname(name) + if onie_e2 is None: + return None + return onie_e2.e2_path + + def get_device_airflow(self, name): + onie_e2 = self.chas.get_onie_e2_byname(name) + if onie_e2 is None: + return None + return onie_e2.airflow + + def get_onie_e2_obj(self, name): + onie_e2 = self.chas.get_onie_e2_byname(name) + if onie_e2 is None: + return None + onie_e2.get_onie_e2_info() + return onie_e2 + + # temp + def get_temps(self): + templist = self.chas.temp_list + return templist + + def get_temp_total_number(self): + templist = self.chas.temp_list + return len(templist) + + def check_temp_id_exist(self, temp_id): + templist = self.chas.temp_list + for temp in templist: + if temp.temp_id == temp_id: + return True + return False + + def get_temp_id_number(self): + templist = self.chas.temp_list + temp_num = 0 + for i in range(len(templist)): + temp_id = "TEMP" + str(i + 1) + ret = self.check_temp_id_exist(temp_id) + if ret is True: + temp_num = temp_num + 1 + else: + return temp_num + return temp_num + + def get_temp_location(self, temp_name): + temp = self.chas.get_temp_byname(temp_name) + return temp.get_location() + + def set_temp_location(self, temp_name, location): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_location(location) + + def set_temp_name(self, temp_name, name): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_name(name) + + def get_appoint_temp(self, temp_name): + temp = self.chas.get_led_byname(temp_name) + return temp.get_temp() + + def set_appoint_temp(self, temp_name, val): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_temp(val) + + def get_temp_mintemp(self, temp_name): + temp = self.chas.get_temp_byname(temp_name) + return temp.get_mintemp() + + def set_temp_mintemp(self, temp_name, val): + temp = self.chas.get_temp_byname(temp_name) + return temp.set_mintemp(val) + + # led + def get_leds(self): + ledlist = self.chas.led_list + return ledlist + + def get_led_total_number(self): + ledlist = self.chas.led_list + return len(ledlist) + + def get_led_color(self, led_name): + led = self.chas.get_led_byname(led_name) + if led is None: + return -1 + return led.get_color() + + def get_led_color_by_type(self, led_type): + ledlist = self.chas.led_list + ledtmp = None + for temp in ledlist: + if temp.led_type == led_type: + ledtmp = temp + break + if ledtmp is None: + return -1 + return ledtmp.get_color() + + def set_led_color(self, led_name, color): + led = self.chas.get_led_byname(led_name) + if led is None: + return -1 + return led.set_color(color) + + # psu + def get_psu_total_number(self): + psulist = self.chas.psu_list + if psulist is None: + return -1 + return len(psulist) + + def get_psus(self): + psulist = self.chas.psu_list + return psulist + + def get_psu_presence(self, psu_name): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + return psu.present + + def get_psu_fru_info(self, psu_name): + ''' + { + "Name": "PSU1", + "SN": "serial_number_example", # 'N/A' + "PN": "part_number_example", # 'N/A' + "AirFlow": "B2F" # 'N/A' + } + ''' + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + psu.get_fru_info() + psu.get_AirFlow() + psu.get_psu_display_name() + + dic = collections.OrderedDict() + dic["Name"] = psu.name + dic["SN"] = psu.productSerialNumber if (psu.productSerialNumber is not None) else self.na_ret + dic["PN"] = psu.productPartModelName if (psu.productPartModelName is not None) else self.na_ret + dic["DisplayName"] = psu.psu_display_name if (psu.psu_display_name is not None) else self.na_ret + dic["VENDOR"] = psu.productManufacturer if (psu.productManufacturer is not None) else self.na_ret + dic["HW"] = psu.productVersion if (psu.productVersion is not None) else self.na_ret + dic["AirFlow"] = psu.AirFlow if (psu.AirFlow is not None) else self.na_ret + return dic + + def get_psu_input_output_status(self, psu_name): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + psu.InputsCurrent.Value # just for clear faults + if (psu.InputStatus is True) and (psu.OutputStatus is True): + return True + return False + + def get_psu_status(self, psu_name): + """ + Get status of a specific PSU + @return dict of the specific PSU's status, None for failure + Example return value(all keys are mandatory) + { + "Name": "PSU1", + "InputType": "DC", # "AC" or 'N/A' + "InputStatus": True, # H/W status bit + "OutputStatus": True # H/W status bit + "FanSpeed": { + "Value": 4000, # -99999 + "Min": 2000, # -99999 + "Max": 10000 # -99999 + }, + "Temperature": { + "Value": 40.0, # -99999.0 + "Min": -30.0, # -99999.0 + "Max": 50.0 # -99999.0 + } + } + """ + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + + dic = collections.OrderedDict() + # psu.get_Temperature() + temp_dict = collections.OrderedDict() + temp_dict['Min'] = psu.Temperature.Min + temp_dict['Max'] = psu.Temperature.Max + temp_dict['Value'] = psu.Temperature.Value + temp_dict['Unit'] = psu.Temperature.Unit + dic["Temperature"] = temp_dict + + # psu.get_FanSpeed() + fan_speed_dict = collections.OrderedDict() + fan_speed_dict['Min'] = psu.FanSpeed.Min + fan_speed_dict['Max'] = psu.FanSpeed.Max + fan_speed_dict['Tolerance'] = psu.FanSpeedTolerance + fan_speed_dict['Value'] = psu.FanSpeed.Value + fan_speed_dict['Unit'] = psu.FanSpeed.Unit + dic["FanSpeed"] = fan_speed_dict + + dic["Name"] = psu.name + dic["InputType"] = psu.InputsType + dic["InputStatus"] = psu.InputStatus + dic["OutputStatus"] = psu.OutputStatus + dic["TempStatus"] = psu.TempStatus + dic["FanStatus"] = psu.FanStatus + return dic + + def get_psu_power_status(self, psu_name): + """ + Get power status of a specific PSU + @return dict of the specific PSU's power status, None for failure + Example return value + { + "Name": "PSU1", + "Inputs": { + "Status": True, # H/W status bit + "Type": "DC", # or "AC" or "N/A" + "Voltage": { + "Value": 220, # -1 + "LowAlarm": 200, # -1 + "HighAlarm": 240, # -1 + "Unit": "V" + }, + "Current": { + "Value": 6.0, # -99999.0 + "LowAlarm": 0.2, # -99999.0 + "HighAlarm": 7.0, # -99999.0 + "Unit": "A" + }, + "Power": { + "Value": 1000, # -99999 + "LowAlarm": -1, # -99999 + "HighAlarm": 1400, # -99999 + "Unit": "W" + } + }, + "Outputs": { + "Status": True, + "Voltage": { + "Value": 220, + "LowAlarm": 200, + "HighAlarm": 240, + "Unit": "V" + }, + "Current": { + "Value": 6.0, + "LowAlarm": 0.2, + "HighAlarm": 7.0, + "Unit": "A" + }, + "Power": { + "Value": 1000, + "LowAlarm": -1, # Don't care + "HighAlarm": 1400, + "Unit": "W" + } + } + } + """ + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + + dic = collections.OrderedDict() + inputdic = collections.OrderedDict() + Outputsdic = collections.OrderedDict() + dic["Name"] = psu.name + inputdic["Status"] = psu.InputStatus + inputdic["Type"] = psu.InputsType + + # psu.get_InputsVoltage() + inputdic_voltage = collections.OrderedDict() + + inputdic_voltage["Value"] = psu.InputsVoltage.Value + inputdic_voltage["LowAlarm"] = psu.InputsVoltage.Min + inputdic_voltage["HighAlarm"] = psu.InputsVoltage.Max + inputdic_voltage["Unit"] = psu.InputsVoltage.Unit + + inputdic["Voltage"] = inputdic_voltage + inputdic_current = collections.OrderedDict() + inputdic_current["Value"] = psu.InputsCurrent.Value + inputdic_current["LowAlarm"] = psu.InputsCurrent.Min + inputdic_current["HighAlarm"] = psu.InputsCurrent.Max + inputdic_current["Unit"] = psu.InputsCurrent.Unit + inputdic["Current"] = inputdic_current + + inputdic_power = collections.OrderedDict() + inputdic_power["Value"] = psu.InputsPower.Value + inputdic_power["LowAlarm"] = psu.InputsPower.Min + inputdic_power["HighAlarm"] = psu.InputsPower.Max + inputdic_power["Unit"] = psu.InputsPower.Unit + inputdic["Power"] = inputdic_power + Outputsdic["Status"] = psu.InputStatus + + outputdic_voltage = collections.OrderedDict() + outputdic_current = collections.OrderedDict() + outputdic_power = collections.OrderedDict() + + outputdic_voltage["Value"] = psu.OutputsVoltage.Value + outputdic_voltage["LowAlarm"] = psu.OutputsVoltage.Min + outputdic_voltage["HighAlarm"] = psu.OutputsVoltage.Max + outputdic_voltage["Unit"] = psu.OutputsVoltage.Unit + + outputdic_current["Value"] = psu.OutputsCurrent.Value + outputdic_current["LowAlarm"] = psu.OutputsCurrent.Min + outputdic_current["HighAlarm"] = psu.OutputsCurrent.Max + outputdic_current["Unit"] = psu.OutputsCurrent.Unit + + outputdic_power["Value"] = psu.OutputsPower.Value + outputdic_power["LowAlarm"] = psu.OutputsPower.Min + outputdic_power["HighAlarm"] = psu.OutputsPower.Max + outputdic_power["Unit"] = psu.OutputsPower.Unit + + Outputsdic["Voltage"] = outputdic_voltage + Outputsdic["Current"] = outputdic_current + Outputsdic["Power"] = outputdic_power + + dic["Inputs"] = inputdic + dic["Outputs"] = Outputsdic + + return dic + + def set_psu_fan_speed_pwm(self, psu_name, pwm): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + return psu.set_fan_speed_pwm(pwm) + + def get_psu_fan_speed_pwm(self, psu_name): + psu = self.chas.get_psu_byname(psu_name) + if psu is None: + return -1 + return psu.get_fan_speed_pwm() + + def get_psu_info_all(self): + """ + { + "Number": 2, + "PSU1": { + "SN": "serial_number_example", # 'N/A' + "PN": "part_number_example", # 'N/A' + "AirFlow": "intake", # 'N/A' + + "FanSpeed": { + "Value": 4000, + "Min": 2000, + "Max": 30000 + }, + "Temperature": { + "Value": 35.0, + "Min": -20.0, + "Max": 45.0 + }, + "Inputs": { + "Status": True, # H/W status bit + "Type": "DC", # or "AC" + "Voltage": { + "Value": 220, + "LowAlarm": 200, + "HighAlarm": 240, + "Unit": "V" + }, + "Current": { + "Value": 6.0, + "LowAlarm": 0.2, + "HighAlarm": 7.0, + "Unit": "A" + }, + "Power": { + "Value": 1000, + "LowAlarm": -1, + "HighAlarm": 1400, + "Unit": "W" + } + }, + "Outputs": { + "Status": True, + "Voltage": { + "Value": 220, + "LowAlarm": 200, + "HighAlarm": 240, + "Unit": "V" + }, + "Current": { + "Value": 6.0, + "LowAlarm": 0.2, + "HighAlarm": 7.0, + "Unit": "A" + }, + "Power": { + "Value": 1000, + "LowAlarm": -1, # Don't care + "HighAlarm": 1400, + "Unit": "W" + } + } + } + } + """ + + psus = self.get_psus() + psu_dict = collections.OrderedDict() + psu_dict['Number'] = len(psus) + for psu in psus: + dicttmp = self.get_psu_fru_info(psu.name) + dicttmp.update(self.get_psu_status(psu.name)) + dicttmp.update(self.get_psu_power_status(psu.name)) + if self.get_psu_presence(psu.name) is True: + dicttmp['Present'] = 'yes' + else: + dicttmp['Present'] = 'no' + psu_dict[psu.name] = dicttmp + return psu_dict + + def get_fans(self): + fanlist = self.chas.fan_list + return fanlist + + # fan + def get_fan_total_number(self): + fanlist = self.chas.fan_list + if fanlist is None: + return -1 + return len(fanlist) + + def get_fan_rotor_number(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.rotors + if ret is None: + return -1 + return ret + + def get_fan_speed(self, fan_name, rotor_index): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.get_speed(rotor_index) + if ret is None: + return -1 + return ret + + def fan_speed_set_level(self, fan_name, rotor_index, level): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.set_speed(rotor_index, level) + if ret is True: + return 0 + return -1 + + def get_fan_speed_pwm(self, fan_name, rotor_index): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + val = fan.get_speed_pwm(rotor_index) + if val is False: + return -1 + return val + + def set_fan_speed_pwm(self, fan_name, rotor_index, pwm): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + if isinstance(pwm, str): + rate = float(pwm.strip('%s')) + speed = round(rate * 255 / 100) + elif isinstance(pwm, int): + speed = round(pwm * 255 / 100) + elif isinstance(pwm, float): + speed = round(pwm * 255 / 100) + else: + return -1 + ret = self.fan_speed_set_level(fan.name, rotor_index, speed) + if ret == 0: + return 0 + return -1 + + def get_fan_watchdog_status(self): + fan = self.chas.fan_list[0] + dic = fan.get_watchdog_status() + if dic is None or dic["support"] is False: + return self.na_ret + if dic["open"] is False or dic["work_allow_set"] is True: + return "Normal" + if dic["work_full"] is True: + return "Abnormal" + return "Abnormal" + + def enable_fan_watchdog(self, enable=True): + fan = self.chas.fan_list[0] + ret = fan.enable_watchdog(enable) + if ret is True: + return 0 + return -1 + + def feed_fan_watchdog(self): + fan_list = self.chas.fan_list + if fan_list is None: + return -1 + for fan in fan_list: + ret = fan.feed_watchdog() + if ret is False: + return -1 + return 0 + + def set_fan_led(self, fan_name, color): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + ret = fan.set_led(color) + if ret is True: + return 0 + return -1 + + def get_fan_led(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return False, 'N/A' + return fan.get_led() + + def get_fan_presence(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + return fan.get_presence() + + def get_fan_fru_info(self, fan_name): + """ + Get specific fan's information + # Properties + "Name": "FAN1", + "SN": "serial_number_example", # 'N/A' + "PN": "part_number_exampple", # 'N/A' + "Rotors": 2, # -1 + "AirFlow": "intake", # 'N/A' + "SpeedMin": 2000, # -1 + "SpeedMax": 30000 # -1 + """ + fan = self.chas.get_fan_byname(fan_name) + fan.get_fru_info() + fan.get_AirFlow() + fan.get_fan_display_name() + + dic = collections.OrderedDict() + dic["Name"] = fan.name + dic["SN"] = fan.productSerialNumber + if dic["SN"] is None: + dic["SN"] = self.na_ret + dic["PN"] = fan.productName + if dic["PN"] is None: + dic["PN"] = self.na_ret + dic["DisplayName"] = fan.fan_display_name + if dic["DisplayName"] is None: + dic["DisplayName"] = self.na_ret + + dic["Rotors"] = fan.rotors + dic["AirFlow"] = fan.AirFlow + if dic["AirFlow"] is None: + dic["AirFlow"] = self.na_ret + dic["SpeedMin"] = fan.SpeedMin + dic["SpeedMax"] = fan.SpeedMax + return dic + + def get_fan_eeprom_info(self, fan_name): + """ + Get specific fan's information + # Properties + "Name": "M6510-FAN-F", # 'N/A' + "SN": "serial_number_example", # 'N/A' + "HW": "hw_version_exampple", # 'N/A' + """ + fan = self.chas.get_fan_byname(fan_name) + fan.decode_eeprom_info() + dic = collections.OrderedDict() + dic["NAME"] = fan.productName + if dic["NAME"] is None: + dic["NAME"] = self.na_ret + dic["SN"] = fan.productSerialNumber + if dic["SN"] is None: + dic["SN"] = self.na_ret + dic["HW"] = fan.hw_version + if dic["HW"] is None: + dic["HW"] = self.na_ret + + return dic + + def get_product_fullname(self): + return baseutil.get_product_fullname() + + def get_fan_status(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotorlist = fan.rotor_list + dic = collections.OrderedDict() + for rotor in rotorlist: + dic_val = collections.OrderedDict() + if rotor.rotor_Running is True: + dic_val['Running'] = 'yes' + else: + dic_val['Running'] = 'no' + if rotor.rotor_HwAlarm is True: + dic_val['HwAlarm'] = 'yes' + else: + dic_val['HwAlarm'] = 'no' + dic_val['Speed'] = int(rotor.rotor_Speed.Value) + dic[rotor.name] = dic_val + return dic + + def get_fan_rotor_status(self, fan_name, rotor_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotorlist = fan.rotor_list + for rotor in rotorlist: + if rotor_name == rotor.name: + if rotor.rotor_Running is True: + return True + return False + return -1 + + def get_fan_roll_status(self, fan_name, rotor_index): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotor = fan.get_rotor_index(rotor_index) + if rotor is None: + return -1 + if rotor.rotor_Running is True: + return True + return False + + def get_fan_info_fru(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + fan.get_fru_info() + fan.get_AirFlow() + dic = collections.OrderedDict() + dic["Name"] = fan.name + dic["SN"] = fan.productSerialNumber + if dic["SN"] is None: + dic["SN"] = self.na_ret + dic["PN"] = fan.productPartModelName + if dic["PN"] is None: + dic["PN"] = self.na_ret + flag = self.get_fan_presence(fan_name) + if flag is True: + dic["Present"] = "yes" + elif flag is False: + dic["Present"] = "no" + else: + dic["Present"] = self.na_ret + dic["Rotors"] = fan.rotors + dic["AirFlow"] = fan.AirFlow + if dic["AirFlow"] is None: + dic["AirFlow"] = self.na_ret + return dic + + # support TLV and FRU FAN E2 + def get_fan_info(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return None + fan.get_AirFlow() + dic = self.get_fan_eeprom_info(fan_name) + flag = self.get_fan_presence(fan_name) + if flag is True: + dic["Present"] = "yes" + elif flag is False: + dic["Present"] = "no" + else: + dic["Present"] = self.na_ret + dic["Rotors"] = fan.rotors + dic["AirFlow"] = fan.AirFlow + if dic["AirFlow"] is None: + dic["AirFlow"] = self.na_ret + dic["PowerMax"] = fan.PowerMax + if dic["PowerMax"] is None: + dic["PowerMax"] = self.na_ret + return dic + + def get_fan_info_rotor(self, fan_name): + fan = self.chas.get_fan_byname(fan_name) + if fan is None: + return -1 + rotorlist = fan.rotor_list + dic = collections.OrderedDict() + for rotor in rotorlist: + dic_val = collections.OrderedDict() + if rotor.rotor_Running is True: + dic_val['Running'] = 'yes' + else: + dic_val['Running'] = 'no' + if rotor.rotor_HwAlarm is True: + dic_val['HwAlarm'] = 'yes' + else: + dic_val['HwAlarm'] = 'no' + speed_value = rotor.rotor_Speed.Value + if speed_value is None: + dic_val['Speed'] = self.error_ret + else: + dic_val['Speed'] = int(speed_value) + if rotor.SpeedMin is None: + dic_val['SpeedMin'] = self.error_ret + else: + dic_val['SpeedMin'] = rotor.SpeedMin + if rotor.SpeedMax is None: + dic_val['SpeedMax'] = self.error_ret + else: + dic_val['SpeedMax'] = rotor.SpeedMax + if rotor.Tolerance is None: + dic_val['Tolerance'] = self.error_ret + else: + dic_val['Tolerance'] = rotor.Tolerance + + dic[rotor.name] = dic_val + return dic + + def get_fan_info_all(self): + fanlist = self.chas.fan_list + dic = collections.OrderedDict() + dic['Number'] = len(fanlist) + dic['WatchdogStatus'] = self.get_fan_watchdog_status() + for fan in fanlist: + dic[fan.name] = self.get_fan_info(fan.name) + dic[fan.name].update(self.get_fan_info_rotor(fan.name)) + return dic + + def temp_test(self): + templist = self.chas.temp_list + dicret = collections.OrderedDict() + + for temp in templist: + dic = collections.OrderedDict() + temp_value = temp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["LowAlarm"] = temp.Min + dic["HighAlarm"] = temp.Max + dicret[temp.name] = dic + return dicret + + # dcdc + def get_dcdc_total_number(self): + dcdclist = self.chas.dcdc_list + if dcdclist is None: + return -1 + return len(dcdclist) + + def get_dcdc_by_id(self, dcdc_id): + dcdclist = self.chas.dcdc_list + dcdctmp = None + for dcdc in dcdclist: + if dcdc.dcdc_id == dcdc_id: + dcdctmp = dcdc + dic = collections.OrderedDict() + if dcdctmp is None: + dic["Name"] = self.error_ret + dic["Min"] = self.error_ret + dic["Max"] = self.error_ret + dic["Low"] = self.error_ret + dic["High"] = self.error_ret + dic["Value"] = self.error_ret + dic["Unit"] = self.error_ret + else: + dic["Name"] = dcdctmp.name + dic["Min"] = dcdctmp.sensor.Min + dic["Max"] = dcdctmp.sensor.Max + dic["Low"] = dcdctmp.sensor.Low + dic["High"] = dcdctmp.sensor.High + tmp = dcdctmp.sensor.Value + if tmp is not None: + dic['Value'] = tmp + else: + dic['Value'] = self.error_ret + dic["Unit"] = dcdctmp.sensor.Unit + return dic + + def get_dcdc_all_info(self): + val_list = collections.OrderedDict() + dcdclist = self.chas.dcdc_list + for dcdc in dcdclist: + dicttmp = {} + sensorname = "%s" % (dcdc.name) + dicttmp['Min'] = dcdc.sensor.Min + dicttmp['Max'] = dcdc.sensor.Max + tmp = dcdc.sensor.Value + if tmp is not None: + dicttmp['Value'] = tmp + else: + dicttmp['Value'] = self.error_ret + dicttmp['Unit'] = dcdc.sensor.Unit + val_list[sensorname] = dicttmp + return val_list + + # sensors + def get_monitor_temp(self, name): + templist = self.chas.temp_list + temptmp = None + for temp in templist: + if temp.name == name: + temptmp = temp + + dic = collections.OrderedDict() + if temptmp is None: + dic["Min"] = self.error_ret + dic["Max"] = self.error_ret + dic["Value"] = self.error_ret + dic["Unit"] = self.error_ret + else: + dic["Min"] = temptmp.Min + dic["Max"] = temptmp.Max + temp_value = temptmp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temptmp.Unit + return dic + + def get_monitor_temp_by_id(self, temp_id): + templist = self.chas.temp_list + temptmp = None + for temp in templist: + if temp.temp_id == temp_id: + temptmp = temp + + dic = collections.OrderedDict() + if temptmp is None: + dic["Name"] = self.error_ret + dic["Api_name"] = self.error_ret + dic["Min"] = self.error_ret + dic["Max"] = self.error_ret + dic["Low"] = self.error_ret + dic["High"] = self.error_ret + dic["Value"] = self.error_ret + dic["Unit"] = self.error_ret + else: + dic["Name"] = temptmp.name + dic["Api_name"] = temptmp.api_name + dic["Min"] = temptmp.Min + dic["Max"] = temptmp.Max + dic["Low"] = temptmp.Low + dic["High"] = temptmp.High + temp_value = temptmp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temptmp.Unit + return dic + + def get_temp_info(self): + val_list = collections.OrderedDict() + # temp + templist = self.chas.temp_list + for temp in templist: + dic = collections.OrderedDict() + dic["Min"] = temp.Min + dic["Max"] = temp.Max + dic["Low"] = temp.Low + dic["High"] = temp.High + temp_value = temp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temp.Unit + val_list[temp.name] = dic + return val_list + + def get_sensor_info(self): + val_list = collections.OrderedDict() + # temp + templist = self.chas.temp_list + for temp in templist: + dic = collections.OrderedDict() + dic["Min"] = temp.Min + dic["Max"] = temp.Max + dic["Low"] = temp.Low + dic["High"] = temp.High + temp_value = temp.Value + dic["Value"] = temp_value if (temp_value is not None) else self.error_ret + dic["Unit"] = temp.Unit + val_list[temp.name] = dic + # fan + fanlist = self.chas.fan_list + for fan in fanlist: + for rotor in fan.rotor_list: + sensorname = "%s%s" % (fan.name, rotor.name) + speed = collections.OrderedDict() + speed['Min'] = rotor.rotor_Speed.Min + speed['Max'] = rotor.rotor_Speed.Max + rotor_speed_Value = rotor.rotor_Speed.Value + speed['Value'] = rotor_speed_Value if (rotor_speed_Value is not None) else self.error_ret + speed['Unit'] = rotor.rotor_Speed.Unit + val_list[sensorname] = speed + + val_list.update(self.get_dcdc_all_info()) + + # psu + psulist = self.chas.psu_list + for psu in psulist: + inputdic_voltage = collections.OrderedDict() + inputdic_current = collections.OrderedDict() + inputdic_power = collections.OrderedDict() + outputdic_voltage = collections.OrderedDict() + outputdic_current = collections.OrderedDict() + outputdic_power = collections.OrderedDict() + temperature = collections.OrderedDict() + fanspeed = collections.OrderedDict() + + psu_temp_value = psu.Temperature.Value + temperature["Value"] = psu_temp_value if (psu_temp_value is not None) else self.error_ret + temperature["Min"] = psu.Temperature.Min + temperature["Max"] = psu.Temperature.Max + temperature["Unit"] = psu.Temperature.Unit + + fanspeed["Value"] = psu.FanSpeed.Value + fanspeed["Min"] = psu.FanSpeed.Min + fanspeed["Max"] = psu.FanSpeed.Max + fanspeed["Unit"] = psu.FanSpeed.Unit + + psu_inputvoltage_value = psu.InputsVoltage.Value + inputdic_voltage["Value"] = psu_inputvoltage_value if ( + psu_inputvoltage_value is not None) else self.error_ret + inputdic_voltage["Min"] = psu.InputsVoltage.Min + inputdic_voltage["Max"] = psu.InputsVoltage.Max + inputdic_voltage["Unit"] = psu.InputsVoltage.Unit + + psu_inputcurrent_value = psu.InputsCurrent.Value + inputdic_current["Value"] = psu_inputcurrent_value if ( + psu_inputcurrent_value is not None) else self.error_ret + inputdic_current["Min"] = psu.InputsCurrent.Min + inputdic_current["Max"] = psu.InputsCurrent.Max + inputdic_current["Unit"] = psu.InputsCurrent.Unit + + psu_inputpower_value = psu.InputsPower.Value + inputdic_power["Value"] = psu_inputpower_value if (psu_inputpower_value is not None) else self.error_ret + inputdic_power["Min"] = psu.InputsPower.Min + inputdic_power["Max"] = psu.InputsPower.Max + inputdic_power["Unit"] = psu.InputsPower.Unit + + psu_outputvoltage_value = psu.OutputsVoltage.Value + outputdic_voltage["Value"] = psu_outputvoltage_value if ( + psu_outputvoltage_value is not None) else self.error_ret + outputdic_voltage["Min"] = psu.OutputsVoltage.Min + outputdic_voltage["Max"] = psu.OutputsVoltage.Max + outputdic_voltage["Unit"] = psu.OutputsVoltage.Unit + + psu_outputcurrent_value = psu.OutputsCurrent.Value + outputdic_current["Value"] = psu_outputcurrent_value if ( + psu_outputcurrent_value is not None) else self.error_ret + outputdic_current["Min"] = psu.OutputsCurrent.Min + outputdic_current["Max"] = psu.OutputsCurrent.Max + outputdic_current["Unit"] = psu.OutputsCurrent.Unit + + psu_outputpower_value = psu.OutputsPower.Value + outputdic_power["Value"] = psu_outputpower_value if ( + psu_outputpower_value is not None) else self.error_ret + outputdic_power["Min"] = psu.OutputsPower.Min + outputdic_power["Max"] = psu.OutputsPower.Max + outputdic_power["Unit"] = psu.OutputsPower.Unit + + val_list["%s%s" % (psu.name, "Vol_I")] = inputdic_voltage + val_list["%s%s" % (psu.name, "Curr_I")] = inputdic_current + val_list["%s%s" % (psu.name, "Power_I")] = inputdic_power + val_list["%s%s" % (psu.name, "Vol_O")] = outputdic_voltage + val_list["%s%s" % (psu.name, "Curr_O")] = outputdic_current + val_list["%s%s" % (psu.name, "Power_O")] = outputdic_power + val_list["%s%s" % (psu.name, "Fan")] = fanspeed + val_list["%s%s" % (psu.name, "Temp")] = temperature + + return val_list + + # cpld + def get_cpld_total_number(self): + cpldlist = self.chas.cpld_list + return len(cpldlist) + + def get_cpld_user_reg(self): + cpld = self.chas.get_cpld_byname("BASE_CPLD") + if cpld is None: + return None + return cpld.get_user_reg() + + def set_cpld_user_reg(self, value): + if isinstance(value, int) is False: + baseutil.logger_debug("value must int %s" % type(value)) + return -1 + if (int(value) < 0 or int(value) > 255): + baseutil.logger_debug("value must [0 - 255]") + return -1 + cpld = self.chas.get_cpld_byname("BASE_CPLD") + if cpld is None: + baseutil.logger_debug("name BASE_CPLD not find") + return -1 + if cpld.set_user_reg(value) is True: + return 0 + return -1 + + def set_cpld_console_owner(self, owner): + """ + Set console I/O owner + + @param owner I/O owner of the console, either "cpu" or "bmc" + + @return 0 for success, -1 for failure + """ + if owner is None: + baseutil.logger_debug("owner is None") + return -1 + owner_tuple = ("cpu", "bmc") + if owner not in owner_tuple: + baseutil.logger_debug("owner is %s, must cpu or bmc" % owner) + return -1 + cpld = self.chas.get_cpld_byname("BASE_CPLD") + if cpld is None: + baseutil.logger_debug("name BASE_CPLD not find") + return -1 + if cpld.set_console_owner(owner) is True: + return 0 + return -1 + + def get_cpld_version_by_id(self, cpld_id): + cpldlist = self.chas.cpld_list + cpldtmp = None + for cpld in cpldlist: + if cpld.cpld_id == cpld_id: + cpldtmp = cpld + + dic = collections.OrderedDict() + if cpldtmp is None: + dic["Name"] = self.na_ret + dic["Version"] = self.na_ret + dic["Desc"] = self.na_ret + dic["Slot"] = None + dic["Warm"] = None + else: + dic["Name"] = cpldtmp.name + dic["Version"] = cpldtmp.get_version() + dic["Desc"] = cpldtmp.desc + dic["Slot"] = cpldtmp.slot + dic["Warm"] = cpldtmp.warm + return dic + + def get_cpld_all_version(self): + """ + Get version of all CPLDs' that can be read from BMC + + @return dict of CPLDs' version or None for failure. + example outputs: + { + "BASE_CPLD": "0.1", # or "N/A" for read failure + "FAN_CPLD": "0.2" + } + """ + cpld_version = { + "BASE_CPLD": "N/A", + "FAN_CPLD": "N/A" + } + for cpld_name in cpld_version: + cpld = self.chas.get_cpld_byname(cpld_name) + if cpld is None: + baseutil.logger_debug("name %s not find" % cpld_name) + continue + cpld_version[cpld_name] = cpld.get_version() + return cpld_version + + # comp + def get_comp_total_number(self): + complist = self.chas.comp_list + return len(complist) + + def get_comp_list(self): + return self.chas.comp_list + + def get_comp_id(self, comp): + return comp.comp_id + + def get_comp_version_by_id(self, comp_id): + comp_list = self.chas.comp_list + comptmp = None + for comp in comp_list: + if comp.comp_id == comp_id: + comptmp = comp + break + + dic = collections.OrderedDict() + if comptmp is None: + dic["Name"] = self.na_ret + dic["Version"] = self.na_ret + dic["Desc"] = self.na_ret + dic["Slot"] = None + else: + dic["Name"] = comptmp.name + dic["Version"] = comptmp.get_version() + dic["Desc"] = comptmp.desc + dic["Slot"] = comptmp.slot + return dic + + def get_bmc_productname(self): + """ + Get product name + + @return product name string, e.g. $(device name)-F-$(VENDOR_NAME), if error return "N/A" + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name bmc(master) not find") + return self.na_ret + return bmc.get_productname() + + def call_bmc_diagcmd(self, cmdstr): + """ + Call BMC diag comman func + + @return ret: 0 sucess , -1 fail + outmsg: if success is out msg, or fail is err msg + """ + if (cmdstr is None or cmdstr == ""): + outmsg = "cmdstr is empty" + baseutil.logger_debug(outmsg) + return -1, outmsg + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + outmsg = "name bmc(master) not find" + baseutil.logger_debug(outmsg) + return -1, outmsg + baseutil.logger_debug("call cmdstr %s" % cmdstr) + return bmc.call_diagcmd(cmdstr) + + def write_bios_version(self, flash, version): + bios = self.chas.get_bios_byname("master") + if bios is None: + baseutil.logger_debug("name bios(master) not find") + return -1 + return bios.set_bios_version(flash, version) + + def get_bios_version(self): + bios = self.chas.get_bios_byname("master") + if bios is None: + baseutil.logger_debug("name bios(master) not find") + return -1 + return bios.get_bios_version() + + def get_bios_status(self): + bios = self.chas.get_bios_byname("master") + if bios is None: + baseutil.logger_debug("name bios(master) not find") + return -1 + return bios.get_bios_boot_status() + + def get_bmc_mac_rov(self): + """ + Get BMC mac rov + + @return ret: 0 sucess , -1 fail + outmsg: if success is out msg, or fail is err msg + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + msg = "name master not find" + baseutil.logger_debug(msg) + return -1, msg + return bmc.get_mac_rov() + + def get_bmc_next_boot(self): + """ + Get next booting flash of BMC + + @return 'master'/'slave' on success, "N/A" for failure + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return self.na_ret + return bmc.get_next_boot() + + def set_bmc_next_boot(self, flash): + """ + Set flash from which next BMC boot + + @param flash Booting flash of BMC, "master" or "slave" + + @return 0 on success, -1 for failure + """ + flash_status = ("master", "slave") + if flash is None or flash not in flash_status: + baseutil.logger_debug("parameter flash illegal, should be [master|slave]") + return -1 + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return -1 + return bmc.set_next_boot(flash) + + def reboot_bmc(self): + """ + Reboot running BMC + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return -1 + return bmc.reboot() + + def get_bmc_info(self): + """ + Get BMC info + + @return dict of BMC info or None for failure + "Version": "1.1.1", # "N/A" + "Flash": "master", # "N/A" + "Next": "master" # "N/A" + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return self.na_ret + return bmc.get_info() + + def get_bmc_version_all(self): + """ + @return dict of BMCs + { + "MasterVersion": "1.1.1", # "N/A" + "SlaveVersion": "1.1.1" # "N/A" + } + """ + bmc = self.chas.get_bmc_byname("master") + if bmc is None: + baseutil.logger_debug("name master not find") + return self.na_ret + return bmc.get_version_all() + + def bmc_execute_command(self, cmd_str): + ret, output = osutil.command(cmd_str) + if ret: + baseutil.logger_debug("execute %s command failed" % (cmd_str)) + return ret, output + + def get_cpu_reset_num(self): + """ + Get CPU reset num + @return CPU reset num on success, -1 for failure + """ + cpu = self.chas.get_cpu_byname("cpu") + if cpu is None: + msg = "name cpu not find" + baseutil.logger_debug(msg) + return -1 + return cpu.get_cpu_reset_num() + + def get_cpu_reboot_cause(self): + """ + Get CPU reboot cause + @return string of cpu reboot reason + """ + cpu = self.chas.get_cpu_byname("cpu") + if cpu is None: + msg = "name cpu not find" + baseutil.logger_debug(msg) + return "Unknown reboot cause" + return cpu.get_cpu_reboot_cause() + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py new file mode 100644 index 0000000000..7fb869c74d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/led.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +####################################################### +# +# led.py +# Python implementation of the Class led +# +####################################################### +from plat_hal.devicebase import devicebase + + +class led(devicebase): + def __init__(self, conf=None): + if conf is not None: + self.name = conf.get('name', None) + self.led_type = conf.get('led_type', None) + self.led_attrs_config = conf.get('led_attrs', None) + self.led_config = conf.get('led', None) + + def set_color(self, color): + status = self.led_attrs_config.get(color, None) + if status is None: + return False + + mask = self.led_attrs_config.get('mask', 0xff) + + if isinstance(self.led_config, list): + for led_config_index in self.led_config: + ret, value = self.get_value(led_config_index) + if (ret is False) or (value is None): + return False + setval = (int(value) & ~mask) | (status) + ret, val = self.set_value(led_config_index, setval) + if ret is False: + return ret + else: + 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_color(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' diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py new file mode 100644 index 0000000000..9ac32cace2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/onie_e2.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +####################################################### +# +# onie_e2.py +# Python implementation of the Class onie_e2 +# +####################################################### +from plat_hal.devicebase import devicebase +from eepromutil.onietlv import onie_tlv + + +class onie_e2(devicebase): + + def __init__(self, conf=None): + self._cardid = "" + self._productname = "" + self._partnum = "" + self._serialnum = "" + self._macbase = "" + self._manufdate = "" + self._deviceversion = "" + self._labelrevision = "" + self._platformname = "" + self._onieversion = "" + self._macsize = "" + self._manufname = "" + self._manufcountry = "" + self._vendorname = "" + self._diagname = "" + self._servicetag = "" + + if conf is not None: + self.name = conf.get('name', None) + self.e2loc = conf.get('e2loc', None) + self.e2_path = self.e2loc.get('loc', None) + self.airflow = conf.get('airflow', "intake") + + @property + def cardid(self): + return self._cardid + + @property + def productname(self): + return self._productname + + @property + def partnum(self): + return self._partnum + + @property + def serialnum(self): + return self._serialnum + + @property + def macbase(self): + return self._macbase + + @property + def manufdate(self): + return self._manufdate + + @property + def deviceversion(self): + return self._deviceversion + + @property + def labelrevision(self): + return self._labelrevision + + @property + def platformname(self): + return self._platformname + + @property + def onieversion(self): + return self._onieversion + + @property + def macsize(self): + return self._macsize + + @property + def manufname(self): + return self._manufname + + @property + def manufcountry(self): + return self._manufcountry + + @property + def vendorname(self): + return self._vendorname + + @property + def diagname(self): + return self._diagname + + @property + def servicetag(self): + return self._servicetag + + def get_onie_e2_info(self): + try: + eeprom = self.get_eeprom_info(self.e2loc) + if eeprom is None: + raise Exception("%s: value is none" % self.name) + onietlv = onie_tlv() + onietlv.decode(eeprom) + self._cardid = onietlv.cardid + self._productname = onietlv.productname + self._partnum = onietlv.partnum + self._serialnum = onietlv.serialnum + self._macbase = onietlv.macbase + self._manufdate = onietlv.manufdate + self._deviceversion = onietlv.deviceversion + self._labelrevision = onietlv.labelrevision + self._platformname = onietlv.platformname + self._onieversion = onietlv.onieversion + self._macsize = onietlv.macsize + self._manufname = onietlv.manufname + self._manufcountry = onietlv.manufcountry + self._vendorname = onietlv.vendorname + self._diagname = onietlv.diagname + self._servicetag = onietlv.servicetag + except Exception: + return False + return True diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py new file mode 100644 index 0000000000..684e26bb9e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/osutil.py @@ -0,0 +1,440 @@ +#!/usr/bin/env python3 +####################################################### +# +# osutil.py +# Python implementation of the Class osutil +# +####################################################### + +import os +import glob +import re +import time +import subprocess +import fcntl +import syslog +from functools import wraps +from wbutil.smbus import SMBus + + +PLATFORM_HAL_DEBUG_FILE = "/etc/.platform_hal_debug_flag" + + +def platform_hal_debug(s): + if os.path.exists(PLATFORM_HAL_DEBUG_FILE): + syslog.openlog("PLATFORM_HAL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def retry(maxretry=6, delay=0.01): + ''' + maxretry: max retry times + delay : interval after last retry + ''' + def decorator(f): + @wraps(f) + def wrapper(*args, **kwargs): + time_retry = maxretry + time_delay = delay + result_msg = "" + while time_retry: + try: + val, result_msg = f(*args, **kwargs) + if val is True: + return val, result_msg + time_retry -= 1 + time.sleep(time_delay) + except Exception as e: + time_retry -= 1 + result_msg = str(e) + time.sleep(time_delay) + return False, "max time retry last errmsg is {}".format(result_msg) + return wrapper + return decorator + + +pidfile = None + + +def file_rw_lock(file_path): + global pidfile + pidfile = open(file_path, "r") + try: + fcntl.flock(pidfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + platform_hal_debug("file_rw_lock success") + return True + except Exception: + if pidfile is not None: + pidfile.close() + pidfile = None + return False + + +def file_rw_unlock(): + try: + global pidfile + + if pidfile is not None: + fcntl.flock(pidfile, fcntl.LOCK_UN) + pidfile.close() + pidfile = None + platform_hal_debug("file_rw_unlock success") + else: + platform_hal_debug("pidfile is invalid, do nothing") + return True + except Exception as e: + platform_hal_debug("file_rw_unlock err, msg: %s" % (str(e))) + return False + + +def take_file_rw_lock(file_path): + loop = 1000 + ret = False + for i in range(0, loop): + ret = file_rw_lock(file_path) + if ret is True: + break + time.sleep(0.001) + return ret + + +class osutil(object): + """ + osutil + """ + + @staticmethod + @retry(maxretry=6) + def wbi2cget_python(bus, addr, reg): + with SMBus(bus) as y: + val, ind = y.read_byte_data(addr, reg, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2cset_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_byte_data(addr, reg, value, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2cgetword_python(bus, addr, reg): + with SMBus(bus) as y: + val, ind = y.read_word_data(addr, reg, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2csetword_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_word_data(addr, reg, value, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2csetwordpec_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_word_data_pec(addr, reg, value, True) + return val, ind + + @staticmethod + @retry(maxretry=6) + def wbi2cset_byte_pec_python(bus, addr, reg, value): + with SMBus(bus) as y: + val, ind = y.write_byte_data_pec(addr, reg, value, True) + return val, ind + + @staticmethod + def command(cmdstr): + retcode, output = subprocess.getstatusoutput(cmdstr) + return retcode, output + + @staticmethod + def geti2cword_i2ctool(bus, addr, offset): + command_line = "i2cget -f -y %d 0x%02x 0x%02x wp" % (bus, addr, offset) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, int(ret_t, 16) + time.sleep(0.1) + return False, ret_t + + @staticmethod + def seti2cword_i2ctool(bus, addr, offset, val): + command_line = "i2cset -f -y %d 0x%02x 0x%0x 0x%04x wp" % (bus, addr, offset, val) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, ret_t + time.sleep(0.1) + return False, ret_t + + @staticmethod + def wbi2cget_i2ctool(bus, devno, address): + command_line = "i2cget -f -y %d 0x%02x 0x%02x " % (bus, devno, address) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, int(ret_t, 16) + time.sleep(0.1) + return False, ret_t + + @staticmethod + def wbi2cset_i2ctool(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + @staticmethod + def geti2cword(bus, addr, offset): + return osutil.wbi2cgetword_python(bus, addr, offset) + + @staticmethod + def seti2cword(bus, addr, offset, val): + return osutil.wbi2csetword_python(bus, addr, offset, val) + + @staticmethod + def seti2cwordpec(bus, addr, offset, val): + return osutil.wbi2csetwordpec_python(bus, addr, offset, val) + + @staticmethod + def seti2c_byte_pec(bus, addr, offset, val): + return osutil.wbi2cset_byte_pec_python(bus, addr, offset, val) + + @staticmethod + def wbi2cget(bus, devno, address): + return osutil.wbi2cget_python(bus, devno, address) + + @staticmethod + def wbi2cset(bus, devno, address, byte): + return osutil.wbi2cset_python(bus, devno, address, byte) + + @staticmethod + def byteTostr(val): + strtmp = '' + for value in val: + strtmp += chr(value) + return strtmp + + @staticmethod + def io_rd(reg_addr, read_len=1): + try: + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + val = os.read(fd, read_len) + return True, "".join(["%02x" % item for item in val]) + except ValueError as e: + return False, str(e) + except Exception as e: + return False, str(e) + finally: + os.close(fd) + + @staticmethod + def readsysfs(location, flock_path=None): + flock_path_tmp = None + platform_hal_debug("readsysfs, location:%s, flock_path:%s" % (location, flock_path)) + try: + if flock_path is not None: + flock_paths = glob.glob(flock_path) + if len(flock_paths) != 0: + flock_path_tmp = flock_paths[0] + platform_hal_debug("try to get file lock, path:%s" % flock_path_tmp) + ret = take_file_rw_lock(flock_path_tmp) + if ret is False: + platform_hal_debug("take file lock timeout, path:%s" % flock_path_tmp) + return False, ("take file rw lock timeout, path:%s" % flock_path_tmp) + else: + platform_hal_debug("config error, can't find flock_path:%s" % flock_path) + + locations = glob.glob(location) + with open(locations[0], 'rb') as fd1: + retval = fd1.read() + retval = osutil.byteTostr(retval) + if flock_path_tmp is not None: + file_rw_unlock() + + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + except Exception as e: + if flock_path_tmp is not None: + file_rw_unlock() + platform_hal_debug("readsysfs error, msg:%s" % str(e)) + return False, (str(e) + " location[%s]" % location) + return True, retval + + @staticmethod + def writesysfs(location, value): + try: + if not os.path.isfile(location): + print(location, 'not found !') + return False, ("location[%s] not found !" % location) + with open(location, 'w') as fd1: + fd1.write(value) + except Exception as e: + return False, (str(e) + " location[%s]" % location) + return True, ("set location[%s] %s success !" % (location, value)) + + @staticmethod + def getdevmem(addr, digit, mask): + command_line = "devmem 0x%02x %d" % (addr, digit) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = osutil.command(command_line) + if ret == 0: + if mask is not None: + ret_t = str(int(ret_t, 16) & mask) + return True, ret_t + return False, ret_t + + @staticmethod + def readdevfile_ascii(path, offset, length): + msg = "" + ret = "" + joinstr = '' + fd = -1 + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, length) + for item in ret: + joinstr += '%02x ' % item # like sysfs, display in hex + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + return True, joinstr + + @staticmethod + def readdevfile(path, offset, length): + msg = "" + ret = "" + fd = -1 + val_list = [] + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, length) + for item in ret: + val_list.append(item) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + return True, val_list + + @staticmethod + def writedevfile(path, offset, buf): + msg = "" + fd = -1 + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + if isinstance(buf, list): + if len(buf) == 0: + msg = "buf:%s is NONE !" % buf + return False, msg + elif isinstance(buf, int): + buf = [buf] + else: + msg = "buf:%s is not list type or not int type !" % buf + return False, msg + + try: + fd = os.open(path, os.O_WRONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.write(fd, bytes(buf)) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + + return True, ret + + @staticmethod + def wb_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + return status, output + + @staticmethod + def getsdkreg(reg): + try: + cmd = "bcmcmd -t 1 'getr %s ' < /dev/null" % reg + ret, result = osutil.wb_os_system(cmd) + result_t = result.strip().replace("\r", "").replace("\n", "") + if ret != 0 or "Error:" in result_t: + return False, result + patt = r"%s.(.*):(.*)>drivshell" % reg + rt = re.findall(patt, result_t, re.S) + test = re.findall("=(.*)", rt[0][0])[0] + except Exception as e: + return False, 'get sdk register error, msg: %s' % str(e) + return True, test + + @staticmethod + def getmactemp(): + try: + result = {} + # need to exec twice + osutil.wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + ret, log = osutil.wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + if ret: + return False, result + logs = log.splitlines() + for line in logs: + if "average" in line: + b = re.findall(r'\d+.\d+', line) + result["average"] = b[0] + elif "maximum" in line: + b = re.findall(r'\d+.\d+', line) + result["maximum"] = b[0] + except Exception as e: + return False, str(e) + return True, result + + @staticmethod + def std_match(stdout, pattern): + if pattern is None: + return stdout.strip() + for line in stdout.splitlines(): + if re.match(pattern, line): + return line.strip() + return None diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py new file mode 100644 index 0000000000..e7db0cdcca --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/psu.py @@ -0,0 +1,607 @@ +#!/usr/bin/env python3 +####################################################### +# +# psu.py +# Python implementation of the Class psu +# +####################################################### +from eepromutil.fru import ipmifru +from plat_hal.devicebase import devicebase +from plat_hal.sensor import sensor + + +class psu(devicebase): + __pmbus = None + __e2loc = None + __productManufacturer = None # : ARTESYN + __productName = None # : CRPS550W + __productPartModelName = None # : CSU550AP-3-300 + __productVersion = None # : AB + __productSerialNumber = None # : M623UZ00JYABL + __AirFlow = None # 'N/A' + __AirFlowconifg = None + __psu_display_name = None # 'N/A' + __psu_display_name_conifg = None + __psu_not_present_pwm = None + __InputStatus_config = None + __OutputStatus_config = None + __FanSpeed_config = None + __Temperature_config = None + __InputStatus = None + __OutputStatus = None + __FanSpeed = None + __Temperature = None + __FanSpeedMin = None + __FanSpeedMax = None + __FanSpeedTolerance = None + __InputsVoltage_config = None + __InputsCurrent_config = None + __InputsPower_config = None + __OutputsVoltage_config = None + __OutputsCurrent_config = None + __OutputsPower_config = None + __InputsVoltage = {} + __InputsCurrent = None + __InputsPower = None + __OutputsVoltage = None + __OutputsCurrent = None + __OutputsPower = None + __InputsType_config = None + __InputsType = None + __psu_sn_config = None + __psu_hw_config = None + __psu_pn_config = None + __psu_vendor_config = None + __TempStatus_config = None + __FanStatus_config = None + __TempStatus = None + __FanStatus = None + + def __init__(self, conf=None): + self.pmbus = conf.get("pmbusloc", None) + self.e2loc = conf.get("e2loc", None) + self.__presentconfig = conf.get("present", None) + self.name = conf.get("name", None) + self.AirFlowconifg = conf.get("airflow", None) + self.psu_display_name_conifg = conf.get("psu_display_name", None) + self.psu_not_present_pwm = conf.get("psu_not_present_pwm", 100) + self.Temperature_config = conf.get("Temperature", None) + self.Temperature = sensor(self.Temperature_config) + + self.FanSpeedTolerance = conf.get('psu_fan_tolerance', 30) + self.FanSpeed_config = conf.get("FanSpeed", None) + self.FanSpeed = sensor(self.FanSpeed_config) + + self.__InputsVoltage_config = conf.get("InputsVoltage", None) + self.generate_psu_input_vol(self.__InputsVoltage_config) + self.__InputsCurrent_config = conf.get("InputsCurrent", None) + self.InputsCurrent = sensor(self.__InputsCurrent_config) + self.__InputsPower_config = conf.get("InputsPower", None) + self.InputsPower = sensor(self.__InputsPower_config) + self.__OutputsVoltage_config = conf.get("OutputsVoltage", None) + self.OutputsVoltage = sensor(self.__OutputsVoltage_config) + self.__OutputsCurrent_config = conf.get("OutputsCurrent", None) + self.OutputsCurrent = sensor(self.__OutputsCurrent_config) + self.__OutputsPower_config = conf.get("OutputsPower", None) + self.OutputsPower = sensor(self.__OutputsPower_config) + + self.__InputStatus_config = conf.get("InputsStatus", None) + self.__OutputStatus_config = conf.get("OutputsStatus", None) + self.__InputsType_config = conf.get('InputsType', None) + self.__psu_sn_config = conf.get('psu_sn', None) + self.__psu_hw_config = conf.get('psu_hw', None) + self.__psu_pn_config = conf.get('psu_pn', None) + self.__psu_vendor_config = conf.get('psu_vendor', None) + self.__TempStatus_config = conf.get("TempStatus", None) + self.__FanStatus_config = conf.get("FanStatus", None) + + def generate_psu_input_vol(self, config): + tmp = {} + for (key, item) in config.items(): + tmp.setdefault(key, sensor(item)) + self.__InputsVoltage = tmp + + def get_psu_sensor_by_name(self, psutype): + return self.__InputsVoltage.get(psutype) or self.__InputsVoltage.get('other') + + @property + def InputsVoltage(self): + psutype = self.InputsType + input_sensor = self.get_psu_sensor_by_name(psutype) + if input_sensor is None: + return None + return input_sensor + + @InputsVoltage.setter + def InputsVoltage(self, val): + self.__InputsVoltage = val + + @property + def InputsCurrent(self): + return self.__InputsCurrent + + @InputsCurrent.setter + def InputsCurrent(self, val): + self.__InputsCurrent = val + + @property + def InputsPower(self): + return self.__InputsPower + + @InputsPower.setter + def InputsPower(self, val): + self.__InputsPower = val + + @property + def OutputsVoltage(self): + return self.__OutputsVoltage + + @OutputsVoltage.setter + def OutputsVoltage(self, val): + self.__OutputsVoltage = val + + @property + def OutputsCurrent(self): + return self.__OutputsCurrent + + @OutputsCurrent.setter + def OutputsCurrent(self, val): + self.__OutputsCurrent = val + + @property + def OutputsPower(self): + return self.__OutputsPower + + @OutputsPower.setter + def OutputsPower(self, val): + self.__OutputsPower = val + + @property + def InputStatus(self): + if self.present is False: + self.__InputStatus = False + else: + ret, val = self.get_value(self.__InputStatus_config) + mask = self.__InputStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__InputStatus = True + else: + self.__InputStatus = False + else: + self.__InputStatus = False + return self.__InputStatus + + @InputStatus.setter + def InputStatus(self, val): + self.__InputStatus = val + + @property + def TempStatus(self): + if self.__TempStatus_config is None: + return None + if self.present is False: + self.__TempStatus = False + else: + ret, val = self.get_value(self.__TempStatus_config) + mask = self.__TempStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__TempStatus = True + else: + self.__TempStatus = False + else: + self.__TempStatus = False + return self.__TempStatus + + @TempStatus.setter + def TempStatus(self, val): + self.__TempStatus = val + + @property + def FanStatus(self): + if self.__FanStatus_config is None: + return None + if self.present is False: + self.__FanStatus = False + else: + ret, val = self.get_value(self.__FanStatus_config) + mask = self.__FanStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__FanStatus = True + else: + self.__FanStatus = False + else: + self.__FanStatus = False + return self.__FanStatus + + @FanStatus.setter + def FanStatus(self, val): + self.__FanStatus = val + + @property + def InputsType(self): + psutypedecode = self.__InputsType_config.get('psutypedecode', None) + if self.present is False: + self.__InputsType = psutypedecode.get(0x00) + else: + ret, val = self.get_value(self.__InputsType_config) + self.__InputsType = self.__InputsType_config.get(val, None) + if self.__InputsType is not None: + return self.__InputsType + if ret is True and val in psutypedecode: + self.__InputsType = psutypedecode.get(val) + else: + self.__InputsType = psutypedecode.get(0x00) + return self.__InputsType + + @InputsType.setter + def InputsType(self, val): + self.__InputsType = val + + @property + def FanSpeedMin(self): + return self.__FanSpeedMin + + @FanSpeedMin.setter + def FanSpeedMin(self, val): + self.__FanSpeedMin = val + + @property + def FanSpeedMax(self): + return self.__FanSpeedMax + + @FanSpeedMax.setter + def FanSpeedMax(self, val): + self.__FanSpeedMax = val + + @property + def FanSpeedTolerance(self): + return self.__FanSpeedTolerance + + @FanSpeedTolerance.setter + def FanSpeedTolerance(self, val): + self.__FanSpeedTolerance = val + + @property + def OutputStatus(self): + if self.present is False: + self.__OutputStatus = False + else: + ret, val = self.get_value(self.__OutputStatus_config) + mask = self.__OutputStatus_config.get("mask") + if ret is True: + ttt = val & mask + if ttt == 0: + self.__OutputStatus = True + else: + self.__OutputStatus = False + else: + self.__OutputStatus = False + return self.__OutputStatus + + @OutputStatus.setter + def OutputStatus(self, val): + self.__OutputStatus = val + + @property + def FanSpeed(self): + return self.__FanSpeed + + @FanSpeed.setter + def FanSpeed(self, val): + self.__FanSpeed = val + + @property + def Temperature(self): + return self.__Temperature + + @Temperature.setter + def Temperature(self, val): + self.__Temperature = val + + @property + def Temperature_config(self): + return self.__Temperature_config + + @Temperature_config.setter + def Temperature_config(self, val): + self.__Temperature_config = val + + @property + def AirFlowconifg(self): + return self.__AirFlowconifg + + @AirFlowconifg.setter + def AirFlowconifg(self, val): + self.__AirFlowconifg = val + + @property + def psu_display_name_conifg(self): + return self.__psu_display_name_conifg + + @psu_display_name_conifg.setter + def psu_display_name_conifg(self, val): + self.__psu_display_name_conifg = val + + @property + def pmbus(self): + return self.__pmbus + + @pmbus.setter + def pmbus(self, val): + self.__pmbus = val + + @property + def e2loc(self): + return self.__e2loc + + @e2loc.setter + def e2loc(self, val): + self.__e2loc = val + + @property + def AirFlow(self): + return self.__AirFlow + + @AirFlow.setter + def AirFlow(self, val): + self.__AirFlow = val + + @property + def psu_display_name(self): + return self.__psu_display_name + + @psu_display_name.setter + def psu_display_name(self, val): + self.__psu_display_name = val + + @property + def psu_not_present_pwm(self): + return self.__psu_not_present_pwm + + @psu_not_present_pwm.setter + def psu_not_present_pwm(self, val): + self.__psu_not_present_pwm = val + + @property + def present(self): + ret, val = self.get_value(self.__presentconfig) + if ret is False or val is None: + return False + mask = self.__presentconfig.get("mask") + if isinstance(val, str): + value = int(val, 16) + else: + value = val + ttt = value & mask + okval = self.__presentconfig.get("okval", 0) + if ttt == okval: + return True + return False + + @property + def productManufacturer(self): + return self.__productManufacturer + + @productManufacturer.setter + def productManufacturer(self, val): + self.__productManufacturer = val + + @property + def productName(self): + return self.__productName + + @productName.setter + def productName(self, val): + self.__productName = val + + @property + def productPartModelName(self): + return self.__productPartModelName + + @productPartModelName.setter + def productPartModelName(self, val): + self.__productPartModelName = val + + @property + def productVersion(self): + return self.__productVersion + + @productVersion.setter + def productVersion(self, val): + self.__productVersion = val + + @property + def productSerialNumber(self): + return self.__productSerialNumber + + @productSerialNumber.setter + def productSerialNumber(self, val): + self.__productSerialNumber = val + + @property + def psu_sn_sysfs(self): + if self.__psu_sn_config is None: + return None + ret, val = self.get_value(self.__psu_sn_config) + if ret is False or val is None: + return None + return val + + @property + def psu_hw_sysfs(self): + if self.__psu_hw_config is None: + return None + ret, val = self.get_value(self.__psu_hw_config) + if ret is False or val is None: + return None + return val + + @property + def psu_pn_sysfs(self): + if self.__psu_pn_config is None: + return None + ret, val = self.get_value(self.__psu_pn_config) + if ret is False or val is None: + return None + return val + + @property + def psu_vendor_sysfs(self): + if self.__psu_vendor_config is None: + return None + ret, val = self.get_value(self.__psu_vendor_config) + if ret is False or val is None: + return None + return val + + def __str__(self): + formatstr = \ + "name : %s \n" \ + "productManufacturer : %s \n" \ + "productName : %s \n" \ + "productPartModelName: %s \n" \ + "productVersion : %s \n" \ + "productSerialNumber : %s \n" \ + "AirFlow : %s \n" \ + + tmpstr = formatstr % (self.name, self.productManufacturer, + self.productName, self.productPartModelName, + self.productVersion, self.productSerialNumber, self.AirFlow) + return tmpstr + + def get_fan_speed_pwm(self): + if self.present is False: + return self.psu_not_present_pwm + selfconfig = {} + selfconfig['bus'] = self.pmbus['bus'] + selfconfig['addr'] = self.pmbus['addr'] + selfconfig['way'] = 'i2cword' + selfconfig['offset'] = 0x3b + ret, val = self.get_value(selfconfig) + if ret is True: + return val + return None + + def set_fan_speed_pwm(self, pwm): + ''' + pmbus + if duty: + i2cset -f -y 0x3b 0x0064 wp + ''' + if self.present is False: + return None + if 0 <= pwm <= 100: + # enable duty first + selfconfig = {} + + selfconfig['bus'] = self.pmbus['bus'] + selfconfig['addr'] = self.pmbus['addr'] + selfconfig['way'] = 'i2cpec' + selfconfig['offset'] = 0x3a + self.set_value(selfconfig, 0x80) + + selfconfig['way'] = 'i2cwordpec' + selfconfig['offset'] = 0x3b + bytetmp = pwm + ret, val = self.set_value(selfconfig, int(bytetmp)) + if ret is True: + return True + return None + raise Exception("pwm not in range [0,100]") + + def get_fru_info_by_sysfs(self): + try: + psu_sn = self.psu_sn_sysfs + psu_hw = self.psu_hw_sysfs + psu_pn = self.psu_pn_sysfs + psu_vendor = self.psu_vendor_sysfs + if psu_sn is None or psu_hw is None or psu_pn is None or psu_vendor is None: + return False + self.productSerialNumber = psu_sn.strip().replace(chr(0), "") + self.productVersion = psu_hw.strip() + self.productPartModelName = psu_pn.strip() + self.productManufacturer = psu_vendor.strip().replace(chr(0), "") + except Exception: + self.productSerialNumber = None + self.productVersion = None + self.productPartModelName = None + self.productManufacturer = None + return False + return True + + def get_fru_info_by_decode(self): + try: + 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) + if fru.productInfoArea is not None: + self.productManufacturer = fru.productInfoArea.productManufacturer.strip() + self.productName = fru.productInfoArea.productName.strip() + self.productPartModelName = fru.productInfoArea.productPartModelName.strip() + self.productVersion = fru.productInfoArea.productVersion.strip() + self.productSerialNumber = fru.productInfoArea.productSerialNumber.strip().replace(chr(0), "") + except Exception: + self.productManufacturer = None + self.productName = None + self.productPartModelName = None + self.productVersion = None + self.productSerialNumber = None + return False + return True + + def get_fru_info(self): + try: + if self.present is not True: + raise Exception("%s: not present" % self.name) + if self.get_fru_info_by_sysfs() is True: + return True + return self.get_fru_info_by_decode() + except Exception: + self.productManufacturer = None + self.productName = None + self.productPartModelName = None + self.productVersion = None + self.productSerialNumber = None + return False + + def get_AirFlow(self): + if self.productPartModelName is None: + ret = self.get_fru_info() + if ret is False: + self.AirFlow = None + return False + if self.AirFlowconifg is None: + self.AirFlow = None + return False + for i in self.AirFlowconifg: + if self.productPartModelName in self.AirFlowconifg[i]: + self.AirFlow = i + return True + self.AirFlow = None + return False + + def get_psu_display_name(self): + if self.productPartModelName is None: + ret = self.get_fru_info() + if ret is False: + self.psu_display_name = None + return False + if self.psu_display_name_conifg is None: + self.psu_display_name = self.productPartModelName + return False + for i in self.psu_display_name_conifg: + if self.productPartModelName in self.psu_display_name_conifg[i]: + self.psu_display_name = i + return True + self.psu_display_name = self.productPartModelName + return False diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py new file mode 100644 index 0000000000..2b4e4ffd5f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/rotor.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +####################################################### +# +# rotor.py +# Python implementation of the Class rotor +# +####################################################### +from plat_hal.devicebase import devicebase +from plat_hal.sensor import sensor + + +class rotor(devicebase): + __rotor_Running = None + __rotor_HwAlarm_conf = None + __rotor_Speed = None + __rotor_run_conf = None + __Speedconfig = None + __i2c_speed = None + __SpeedMin = None + __SpeedMax = None + __SpeedTolerance = None + + def __init__(self, conf=None): + self.name = conf.get('name', None) + self.rotor_HwAlarm_conf = conf.get('HwAlarm', None) + self.rotor_run_conf = conf.get('Running', None) + self.SpeedMin = conf.get('SpeedMin', None) + self.SpeedMax = conf.get('SpeedMax', None) + self.Tolerance = conf.get('tolerance', 30) + self.rotor_Speed = sensor(conf.get('Speed', None)) + self.Speedconfig = conf.get('Set_speed', None) + + def getRunning(self): + ret, val = self.get_value(self.rotor_run_conf) + if ret is False or val is None: + return False + if isinstance(val, str): + value = int(val, 16) + else: + value = val + mask = self.rotor_run_conf.get("mask") + is_runing_value = self.rotor_run_conf.get("is_runing") + flag = value & mask + if flag == is_runing_value: + return True + return False + + @property + def SpeedMin(self): + return self.__SpeedMin + + @SpeedMin.setter + def SpeedMin(self, val): + self.__SpeedMin = val + + @property + def SpeedMax(self): + return self.__SpeedMax + + @SpeedMax.setter + def SpeedMax(self, val): + self.__SpeedMax = val + + @property + def Tolerance(self): + return self.__SpeedTolerance + + @Tolerance.setter + def Tolerance(self, val): + self.__SpeedTolerance = val + + @property + def i2c_speed(self): + ret, val = self.get_value(self.Speedconfig) + if ret is False: + return None + if val is not None: + self.__i2c_speed = val + return self.__i2c_speed + + def feed_watchdog(self): + ret, val = self.get_value(self.Speedconfig) + if ret is False: + return False, None + if val is not None: + ret, val = self.set_value(self.Speedconfig, val) + return ret, val + return False, None + + @i2c_speed.setter + def i2c_speed(self, val): + self.__i2c_speed = val + + @property + def Speedconfig(self): + return self.__Speedconfig + + @Speedconfig.setter + def Speedconfig(self, val): + self.__Speedconfig = val + + @property + def rotor_run_conf(self): + return self.__rotor_run_conf + + @rotor_run_conf.setter + def rotor_run_conf(self, val): + self.__rotor_run_conf = val + + @property + def rotor_Speed(self): + return self.__rotor_Speed + + @rotor_Speed.setter + def rotor_Speed(self, val): + self.__rotor_Speed = val + + @property + def rotor_HwAlarm(self): + ret, val = self.get_value(self.rotor_HwAlarm_conf) + mask = self.rotor_HwAlarm_conf.get("mask") + no_alarm_value = self.rotor_HwAlarm_conf.get("no_alarm") + if ret is False or val is None: + return False + if isinstance(val, str): + value = int(val, 16) + else: + value = val + flag = value & mask + if flag == no_alarm_value: + return False + return True + + @property + def rotor_HwAlarm_conf(self): + return self.__rotor_HwAlarm_conf + + @rotor_HwAlarm_conf.setter + def rotor_HwAlarm_conf(self, val): + self.__rotor_HwAlarm_conf = val + + @property + def rotor_Running(self): + self.__rotor_Running = self.getRunning() + return self.__rotor_Running + + @rotor_Running.setter + def rotor_Running(self, val): + self.__rotor_Running = val diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py new file mode 100644 index 0000000000..2b4e05e00e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/sensor.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python3 +####################################################### +# +# sensor.py +# Python implementation of the Class sensor +# +####################################################### +import time +from plat_hal.devicebase import devicebase + + +class sensor(devicebase): + + __Value = None + __Min = None + __Max = None + __Low = None + __High = None + __ValueConfig = None + __Flag = None + __Unit = None + __format = None + __read_times = None + + __Min_config = None + __Max_config = None + __Low_config = None + __High_config = None + + @property + def Min_config(self): + return self.__Min_config + + @Min_config.setter + def Min_config(self, val): + self.__Min_config = val + + @property + def Max_config(self): + return self.__Max_config + + @Max_config.setter + def Max_config(self, val): + self.__Max_config = val + + @property + def Low_config(self): + return self.__Low_config + + @Low_config.setter + def Low_config(self, val): + self.__Low_config = val + + @property + def High_config(self): + return self.__High_config + + @High_config.setter + def High_config(self, val): + self.__High_config = val + + @property + def Unit(self): + return self.__Unit + + @Unit.setter + def Unit(self, val): + self.__Unit = val + + @property + def format(self): + return self.__format + + @format.setter + def format(self, val): + self.__format = val + + @property + def read_times(self): + return self.__read_times + + @read_times.setter + def read_times(self, val): + self.__read_times = val + + @property + def ValueConfig(self): + return self.__ValueConfig + + @ValueConfig.setter + def ValueConfig(self, val): + self.__ValueConfig = val + + @property + def Flag(self): + return self.__Flag + + @Flag.setter + def Flag(self, val): + self.__Flag = val + + def get_median(self, value_config, read_times): + val_list = [] + for i in range(0, read_times): + ret, real_value = self.get_value(value_config) + if i != (read_times - 1): + time.sleep(0.01) + if ret is False or real_value is None: + continue + val_list.append(real_value) + val_list.sort() + if val_list: + return True, val_list[int((len(val_list) - 1) / 2)] + return False, None + + @property + def Value(self): + try: + ret, val = self.get_median(self.ValueConfig, self.read_times) + if ret is False or val is None: + return None + if self.format is None: + self.__Value = int(val) + else: + self.__Value = self.get_format_value(self.format % val) + self.__Value = round(float(self.__Value), 3) + except Exception: + return None + return self.__Value + + @Value.setter + def Value(self, val): + self.__Value = val + + @property + def Min(self): + try: + if self.format is None: + self.__Min = self.Min_config + else: + self.__Min = self.get_format_value(self.format % self.Min_config) + self.__Min = round(float(self.__Min), 3) + except Exception: + return None + return self.__Min + + @Min.setter + def Min(self, val): + self.__Min = val + + @property + def Max(self): + try: + if self.format is None: + self.__Max = self.Max_config + else: + self.__Max = self.get_format_value(self.format % self.Max_config) + self.__Max = round(float(self.__Max), 3) + except Exception: + return None + return self.__Max + + @Max.setter + def Max(self, val): + self.__Max = val + + @property + def Low(self): + try: + if self.format is None: + self.__Low = self.Low_config + else: + self.__Low = self.get_format_value(self.format % self.Low_config) + except Exception: + return None + return self.__Low + + @Low.setter + def Low(self, val): + self.__Low = val + + @property + def High(self): + try: + if self.format is None: + self.__High = self.High_config + else: + self.__High = self.get_format_value(self.format % self.High_config) + except Exception: + return None + return self.__High + + @High.setter + def High(self, val): + self.__High = val + + def __init__(self, conf=None): + self.ValueConfig = conf.get("value", None) + self.Flag = conf.get("flag", None) + self.Min_config = conf.get("Min", None) + self.Max_config = conf.get("Max", None) + self.Low_config = conf.get("Low", None) + self.High_config = conf.get("High", None) + self.Unit = conf.get('Unit', None) + self.format = conf.get('format', None) + self.read_times = conf.get('read_times', 1) + + def __str__(self): + formatstr = \ + "ValueConfig: : %s \n" \ + "Min : %s \n" \ + "Max : %s \n" \ + "Unit : %s \n" \ + "format: : %s \n" + + tmpstr = formatstr % (self.ValueConfig, self.Min, + self.Max, self.Unit, + self.format) + return tmpstr diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py new file mode 100644 index 0000000000..a202c20339 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/plat_hal/temp.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +####################################################### +# +# temp.py +# Python implementation of the Class temp +# +####################################################### +import os +import syslog +from plat_hal.sensor import sensor + + +PLATFORM_HAL_TEMP_DEBUG_FILE = "/etc/.platform_hal_temp_debug_flag" + + +def platform_hal_temp_debug(s): + if os.path.exists(PLATFORM_HAL_TEMP_DEBUG_FILE): + syslog.openlog("PLATFORM_HAL_TEPM", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class temp(sensor): + def __init__(self, conf=None): + super(temp, self).__init__(conf.get('Temperature', None)) + self.name = conf.get("name", None) + self.temp_id = conf.get("temp_id", None) + self.api_name = conf.get("api_name", self.name) + self.fix_value = conf.get("fix_value", None) + self.temp_invalid = conf.get("invalid", None) + self.temp_error = conf.get("error", None) + + def temp_cali_by_fan_pwm(self, param, origin_value): + fan_pwm_conf = param.get("fan_pwm") + temp_fix_list = param.get("temp_fix_list") + + ret, val = self.get_value(fan_pwm_conf) + if ret is False or val is None: + platform_hal_temp_debug("temp calibration get fan pwm failed, msg: %s, return None" % (val)) + return None + + fan_pwm = int(val) + for item in temp_fix_list: + if item["min"] <= fan_pwm <= item["max"]: + fix_value = origin_value + item["fix"] + platform_hal_temp_debug("temp calibration by fan pwm, origin_value: %s, pwm: %s, fix_value: %s" % + (origin_value, fan_pwm, fix_value)) + return fix_value + platform_hal_temp_debug("temp calibration by fan pwm, origin_value: %s, pwm: %s, not match return None" % + (origin_value, fan_pwm)) + return None + + def fix_temp_value(self, origin_value): + try: + fix_type = self.fix_value.get("fix_type") + + if fix_type == "func": + func_name = self.fix_value.get("func_name") + func_param = self.fix_value.get("func_param") + func = getattr(self, func_name) + if func is None: + platform_hal_temp_debug("function %s, not defined" % func_name) + return None + value = func(func_param, origin_value) + return value + + if fix_type == "config": + coefficient = self.fix_value.get("coefficient", 1) + addend = self.fix_value.get("addend", 0) + value = (origin_value + addend) * coefficient + platform_hal_temp_debug("temp calibration by config, coefficient: %s, addend: %s, origin_value: %s, fix_value: %s" % + (coefficient, addend, origin_value, value)) + return value + + platform_hal_temp_debug("unsupport fix type: %s, return origin value: %s" % (fix_type, origin_value)) + return origin_value + except Exception as e: + platform_hal_temp_debug("fix_temp_value raise exception, msg: %s" % (str(e))) + return None + + def get_max_value(self, conf): + try: + ret, val = self.get_value(conf) + if ret is False or val is None: + return None + return val + except Exception: + return None + + def check_flag(self): + try: + okbit = self.Flag.get('okbit') + okval = self.Flag.get('okval') + ret, val = self.get_value(self.Flag) + if (ret is False) or (val is None): + return False + val_t = (int(val) & (1 << okbit)) >> okbit + if val_t != okval: + return False + except Exception: + return False + return True + + @property + def Value(self): + try: + if self.Flag is not None: + if self.check_flag() is False: + return None + if isinstance(self.ValueConfig, list): + max_val = None + for i in self.ValueConfig: + tmp = self.get_max_value(i) + if tmp is None: + continue + if max_val is None or max_val < tmp: + max_val = tmp + if max_val is None: + return None + if self.format is None: + self.__Value = int(max_val) + else: + self.__Value = self.get_format_value(self.format % max_val) + else: + ret, val = self.get_value(self.ValueConfig) + if ret is False or val is None: + return None + if self.format is None: + self.__Value = int(val) + else: + self.__Value = self.get_format_value(self.format % val) + except Exception: + return None + if self.fix_value is not None and self.__Value != self.temp_invalid and self.__Value != self.temp_error: + self.__Value = self.fix_temp_value(self.__Value) + return self.__Value + + @Value.setter + def Value(self, val): + self.__Value = val diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py deleted file mode 100644 index 2b001f21d7..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/logutil.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: UTF-8 -*- - -import logging -from syslog import ( - syslog, - openlog, - LOG_WARNING, - LOG_CRIT, - LOG_DEBUG, - LOG_ERR, - LOG_PID, - LOG_INFO, -) - -class Logger(): - def __init__(self, prefix, filepath=None, syslog=False, dbg_mask=0x0): - self.logger = None - if syslog is False: - if filepath is None: - raise AttributeError("filepath needed") - - # init logging - formatter = logging.Formatter( "%(asctime)s %(levelname)s %(filename)s[%(funcName)s][%(lineno)s]: %(message)s") - handler = logging.FileHandler(self.filepath) - handler.setFormatter(formatter) - self.logger = logging.getLogger(__name__) - self.logger.setLevel(logging.DEBUG) - self.logger.addHandler(handler) - - self.prefix = prefix - self.use_syslog = syslog - self.dbg_mask = dbg_mask - - def info(self, s): - if self.use_syslog: - self._syslog(s, LOG_INFO) - else: - self.logger.info(s) - - def debug(self, dbg_lvl, s): - if dbg_lvl & self.dbg_mask: - if self.use_syslog: - self._syslog(s, LOG_DEBUG) - else: - self.logger.debug(s) - - def warn(self, s): - if self.use_syslog: - self._syslog(s, LOG_WARNING) - else: - self.logger.warning(s) - - def error(self, s): - if self.use_syslog: - self._syslog(s, LOG_ERR) - else: - self.logger.error(s) - - def crit(self, s): - if self.use_syslog: - self._syslog(s, LOG_CRIT) - else: - self.logger.critical(s) - - def _syslog(self, s, t): - openlog(self.prefix, LOG_PID) - syslog(t, s) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/baseutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/baseutil.py similarity index 51% rename from platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/baseutil.py rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/baseutil.py index 1cf74d32d2..340a1f7a73 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/baseutil.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/baseutil.py @@ -1,6 +1,7 @@ -# -*- coding: UTF-8 -*- +#!/usr/bin/env python3 import os + def get_machine_info(): if not os.path.isfile('/host/machine.conf'): return None @@ -13,11 +14,25 @@ def get_machine_info(): machine_vars[tokens[0]] = tokens[1].strip() return machine_vars + def get_platform_info(machine_info): - if machine_info != None: + if machine_info is not None: if 'onie_platform' in machine_info: - return machine_info['onie_platform'] - elif 'aboot_platform' in machine_info: + return machine_info['onie_platform'] + if 'aboot_platform' in machine_info: return machine_info['aboot_platform'] return None + +def get_board_id(machine_info): + if machine_info is not None: + if 'onie_board_id' in machine_info: + return machine_info['onie_board_id'].lower() + return "NA" + + +def get_onie_machine(machine_info): + if machine_info is not None: + if 'onie_machine' in machine_info: + return machine_info['onie_machine'] + return None diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/smbus.py b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/smbus.py similarity index 89% rename from platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/smbus.py rename to platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/smbus.py index f3651fe59a..5f1659b3bb 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/common/lib/rgutil/smbus.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/lib/wbutil/smbus.py @@ -1,4 +1,5 @@ -"""smbus2 - A drop-in replacement for smbus-cffi/smbus-python""" +#!/usr/bin/env python3 +# smbus2 - A drop-in replacement for smbus-cffi/smbus-python # The MIT License (MIT) # Copyright (c) 2017 Karl-Petter Lindegaard # @@ -32,6 +33,7 @@ I2C_SLAVE_FORCE = 0x0706 # Use this slave address, even if it is already in use I2C_FUNCS = 0x0705 # Get the adapter functionality mask I2C_RDWR = 0x0707 # Combined R/W transfer (one STOP only) I2C_SMBUS = 0x0720 # SMBus transfer. Takes pointer to i2c_smbus_ioctl_data +I2C_PEC = 0x0708 # SMBus transfer read or write markers from uapi/linux/i2c.h I2C_SMBUS_WRITE = 0 @@ -43,7 +45,8 @@ I2C_SMBUS_BYTE = 1 I2C_SMBUS_BYTE_DATA = 2 I2C_SMBUS_WORD_DATA = 3 I2C_SMBUS_PROC_CALL = 4 -I2C_SMBUS_BLOCK_DATA = 5 # This isn't supported by Pure-I2C drivers with SMBUS emulation, like those in RaspberryPi, OrangePi, etc :( +# This isn't supported by Pure-I2C drivers with SMBUS emulation, like those in RaspberryPi, OrangePi, etc :( +I2C_SMBUS_BLOCK_DATA = 5 I2C_SMBUS_BLOCK_PROC_CALL = 7 # Like I2C_SMBUS_BLOCK_DATA, it isn't supported by Pure-I2C drivers either. I2C_SMBUS_I2C_BLOCK_DATA = 8 I2C_SMBUS_BLOCK_MAX = 32 @@ -216,12 +219,12 @@ class i2c_msg(Structure): :rtype: :py:class:`i2c_msg` """ if sys.version_info.major >= 3: - if type(buf) is str: + if isinstance(buf, str): buf = bytes(map(ord, buf)) else: buf = bytes(buf) else: - if type(buf) is not str: + if not isinstance(buf, str): buf = ''.join([chr(x) for x in buf]) arr = create_string_buffer(buf, len(buf)) return i2c_msg( @@ -406,7 +409,7 @@ class SMBus(object): :rtype: int """ val_t = -1 - returnmsg="" + returnmsg = "" try: self._set_address(i2c_addr, force=force) msg = i2c_smbus_ioctl_data.create( @@ -418,8 +421,7 @@ class SMBus(object): returnmsg = str(e) if val_t < 0: return False, returnmsg - else: - return True, msg.data.contents.byte + return True, msg.data.contents.byte def write_byte_data(self, i2c_addr, register, value, force=None): """ @@ -449,8 +451,40 @@ class SMBus(object): self.close() if val_t < 0: return False, returnmsg or "" - else: - return True, "" + return True, "" + + def write_byte_data_pec(self, i2c_addr, register, value, force=None): + """ + Write a byte to a given register. + + :param i2c_addr: i2c address + :type i2c_addr: int + :param register: Register to write to + :type register: int + :param value: Byte value to transmit + :type value: int + :param force: + :type force: Boolean + :rtype: None + """ + val_t = -1 + returnmsg = "" + try: + val_t = ioctl(self.fd, I2C_PEC, 1) + if val_t < 0: + raise Exception("set pec mod error") + self._set_address(i2c_addr, force=force) + msg = i2c_smbus_ioctl_data.create( + read_write=I2C_SMBUS_WRITE, command=register, size=I2C_SMBUS_BYTE_DATA + ) + msg.data.contents.byte = value + val_t = ioctl(self.fd, I2C_SMBUS, msg) + except Exception as e: + returnmsg = str(e) + self.close() + if val_t < 0: + return False, returnmsg or "" + return True, "" def read_word_data(self, i2c_addr, register, force=None): """ @@ -478,8 +512,40 @@ class SMBus(object): self.close() if val_t < 0: return False, returnmsg or "" - else: - return True, msg.data.contents.word + return True, msg.data.contents.word + + def write_word_data_pec(self, i2c_addr, register, value, force=None): + """ + Write a byte to a given register. + + :param i2c_addr: i2c address + :type i2c_addr: int + :param register: Register to write to + :type register: int + :param value: Word value to transmit + :type value: int + :param force: + :type force: Boolean + :rtype: None + """ + val_t = -1 + returnmsg = "" + try: + val_t = ioctl(self.fd, I2C_PEC, 1) + if val_t < 0: + raise Exception("set pec mod error") + self._set_address(i2c_addr, force=force) + msg = i2c_smbus_ioctl_data.create( + read_write=I2C_SMBUS_WRITE, command=register, size=I2C_SMBUS_WORD_DATA + ) + msg.data.contents.word = value + val_t = ioctl(self.fd, I2C_SMBUS, msg) + except Exception as e: + returnmsg = str(e) + self.close() + if val_t < 0: + return False, returnmsg or "" + return True, "" def write_word_data(self, i2c_addr, register, value, force=None): """ @@ -509,8 +575,7 @@ class SMBus(object): self.close() if val_t < 0: return False, returnmsg or "" - else: - return True, "" + return True, "" def process_call(self, i2c_addr, register, value, force=None): """ @@ -685,6 +750,7 @@ class SMBusWrapper: :py:class:`SMBus` handle will be automatically closed upon exit of the ``with`` block. """ + def __init__(self, bus_number=0, auto_cleanup=True, force=False): """ :param auto_cleanup: Close bus when leaving scope. @@ -695,6 +761,7 @@ class SMBusWrapper: self.bus_number = bus_number self.auto_cleanup = auto_cleanup self.force = force + self.bus = None def __enter__(self): self.bus = SMBus(bus=self.bus_number, force=self.force) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf b/platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf new file mode 100644 index 0000000000..5e861802d9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modprobe_conf/kernel_drivers_blacklist.conf @@ -0,0 +1,5 @@ +blacklist wb_fpga_pcie +blacklist wb_i2c_i801 +blacklist wb_spi_gpio +blacklist intel_spi +blacklist intel_spi_platform diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile old mode 100755 new mode 100644 index f7204c8684..8727f1f508 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/Makefile @@ -1,15 +1,55 @@ -obj-m := rg-gpio-xeon.o -obj-m += rg_fan.o -obj-m += rg_psu.o -obj-m += ragile_platform.o -obj-m += i2c-mux-pca9641.o -obj-m += i2c-mux-pca954x.o -obj-m += csu550.o -ragile_common-objs := ragile_common_module.o -obj-m += ragile_common.o -obj-m += fpga_pcie_i2c.o -obj-m += fpga_i2c_ocores.o -obj-m += lpc_dbg.o -obj-m += lpc_cpld_i2c_ocores.o -obj-m += rg-i2c-algo-bit.o -obj-m += rg-i2c-gpio.o +PWD = $(shell pwd) +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +KVERSION ?= $(shell uname -r) +KERNEL_SRC ?= /lib/modules/$(KVERSION) + +module_out_put_dir := $(PWD)/build +export module_out_put_dir + +KERNEL_MODULES_SRC = $(PWD)/linux-5.10 + +PLAT_SYSFS_DIR = $(PWD)/plat_sysfs +INTEL_SPI = $(PWD)/intel_spi + +export PLAT_SYSFS_DIR + +platform_common-objs := platform_common_module.o dfd_tlveeprom.o +obj-m += platform_common.o +obj-m += wb_mac_bsc.o +obj-m += wb_fpga_pcie.o +obj-m += wb_pcie_dev.o +obj-m += wb_fpga_i2c_bus_drv.o +obj-m += wb_fpga_pca954x_drv.o +obj-m += wb_lpc_drv.o +obj-m += wb_i2c_dev.o +obj-m += wb_platform_i2c_dev.o +obj-m += wb_io_dev.o +obj-m += wb_eeprom_93xx46.o +obj-m += wb_spi_93xx46.o +obj-m += wb_gpio_d1500.o +obj-m += wb_gpio_device.o +obj-m += wb_i2c_ocores.o +obj-m += wb_spi_ocores.o +obj-m += wb_spi_dev.o +obj-m += wb_wdt.o +obj-m += wb_optoe.o +obj-m += wb_spi_gpio.o +obj-m += wb_spi_gpio_device.o +obj-m += wb_spi_nor_device.o +obj-m += wb_xdpe132g5c.o +obj-m += wb_uio_irq.o + +all : + $(MAKE) -C $(KERNEL_MODULES_SRC) + $(MAKE) -C $(PLAT_SYSFS_DIR) + $(MAKE) -C $(INTEL_SPI) + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) + +clean : + rm -rf $(module_out_put_dir) + rm -f ${PWD}/*.o ${PWD}/*.ko ${PWD}/*.mod.c ${PWD}/.*.cmd ${PWD}/.*.o.d ${PWD}/*.mod + rm -f ${PWD}/Module.markers ${PWD}/Module.symvers ${PWD}/modules.order + rm -rf ${PWD}/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c deleted file mode 100755 index b1d1a98472..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/csu550.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * csu550.c - A driver for pmbus - * - * Copyright (c) 2010, 2011 Ericsson AB. - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "pmbus.h" - -struct pmbus_device_info { - int pages; - u32 flags; -}; - -static const struct i2c_device_id pmbus_id[]; - -/* - * Find sensor groups and status registers on each page. - */ -static void pmbus_find_sensor_groups(struct i2c_client *client, - struct pmbus_driver_info *info) -{ - int page; - - /* Sensors detected on page 0 only */ - if (pmbus_check_word_register(client, 0, PMBUS_READ_VIN)) - info->func[0] |= PMBUS_HAVE_VIN; - if (pmbus_check_word_register(client, 0, PMBUS_READ_IIN)) - info->func[0] |= PMBUS_HAVE_IIN; - if (pmbus_check_word_register(client, 0, PMBUS_READ_PIN)) - info->func[0] |= PMBUS_HAVE_PIN; - if (info->func[0] && pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT)) - info->func[0] |= PMBUS_HAVE_STATUS_INPUT; - if (pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_12) && - pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) { - info->func[0] |= PMBUS_HAVE_FAN12; - if (pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12)) - info->func[0] |= PMBUS_HAVE_STATUS_FAN12; - } - if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1)) - info->func[0] |= PMBUS_HAVE_TEMP; - if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2)) - info->func[0] |= PMBUS_HAVE_TEMP2; - if (pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3)) - info->func[0] |= PMBUS_HAVE_TEMP3; - if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3) - && pmbus_check_byte_register(client, 0, PMBUS_STATUS_TEMPERATURE)) - info->func[0] |= PMBUS_HAVE_STATUS_TEMP; - - /* Sensors detected on all pages */ - for (page = 0; page < info->pages; page++) { - if (pmbus_check_word_register(client, page, PMBUS_READ_VOUT)) { - info->func[page] |= PMBUS_HAVE_VOUT; - if (pmbus_check_byte_register(client, page, - PMBUS_STATUS_VOUT)) - info->func[page] |= PMBUS_HAVE_STATUS_VOUT; - } - if (pmbus_check_word_register(client, page, PMBUS_READ_IOUT)) { - info->func[page] |= PMBUS_HAVE_IOUT; - if (pmbus_check_byte_register(client, 0, - PMBUS_STATUS_IOUT)) - info->func[page] |= PMBUS_HAVE_STATUS_IOUT; - } - if (pmbus_check_word_register(client, page, PMBUS_READ_POUT)) - info->func[page] |= PMBUS_HAVE_POUT; - } -} - -/* - * Identify chip parameters. - */ -static int pmbus_identify(struct i2c_client *client, - struct pmbus_driver_info *info) -{ - int ret = 0; - - if (!info->pages) { - /* - * Check if the PAGE command is supported. If it is, - * keep setting the page number until it fails or until the - * maximum number of pages has been reached. Assume that - * this is the number of pages supported by the chip. - */ - if (pmbus_check_byte_register(client, 0, PMBUS_PAGE)) { - int page; - - for (page = 1; page < PMBUS_PAGES; page++) { - if (pmbus_set_page(client, page) < 0) - break; - } - pmbus_set_page(client, 0); - info->pages = page; - } else { - info->pages = 1; - } - } - - if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { - int vout_mode, i; - - vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); - if (vout_mode >= 0 && vout_mode != 0xff) { - switch (vout_mode >> 5) { - case 0: - break; - case 1: - info->format[PSC_VOLTAGE_OUT] = vid; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - for (i = 0; i < info->pages; i++) { - info->vrm_version[i] = vr11; - } -#endif - break; - case 2: - info->format[PSC_VOLTAGE_OUT] = direct; - break; - default: - ret = -ENODEV; - goto abort; - } - } - } - - /* - * We should check if the COEFFICIENTS register is supported. - * If it is, and the chip is configured for direct mode, we can read - * the coefficients from the chip, one set per group of sensor - * registers. - * - * To do this, we will need access to a chip which actually supports the - * COEFFICIENTS command, since the command is too complex to implement - * without testing it. Until then, abort if a chip configured for direct - * mode was detected. - */ - if (info->format[PSC_VOLTAGE_OUT] == direct) { - ret = -ENODEV; - goto abort; - } - - /* Try to find sensor groups */ - pmbus_find_sensor_groups(client, info); -abort: - return ret; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) -static int pmbus_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct pmbus_driver_info *info; - struct pmbus_platform_data *pdata = NULL; - struct device *dev = &client->dev; - - info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - if (!strncmp(id->name, "dps460", sizeof("dps460")) || - !strncmp(id->name, "fsp1200", sizeof("fsp1200")) || !strncmp(id->name, "dps550", sizeof("dps550"))) { - pdata = kzalloc(sizeof(struct pmbus_platform_data), GFP_KERNEL); - if (!pdata) { - kfree(info); - return -ENOMEM; - } - pdata->flags = PMBUS_SKIP_STATUS_CHECK; - } - - info->pages = id->driver_data; - info->identify = pmbus_identify; - dev->platform_data = pdata; - - return pmbus_do_probe(client, id, info); -} -#else -static int pmbus_probe(struct i2c_client *client) -{ - struct pmbus_driver_info *info; - struct pmbus_platform_data *pdata = NULL; - struct device *dev = &client->dev; - struct pmbus_device_info *device_info; - - info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - device_info = (struct pmbus_device_info *)i2c_match_id(pmbus_id, client)->driver_data; - if (device_info->flags & PMBUS_SKIP_STATUS_CHECK) { - pdata = devm_kzalloc(dev, sizeof(struct pmbus_platform_data), GFP_KERNEL); - if (!pdata) { - return -ENOMEM; - } - pdata->flags = PMBUS_SKIP_STATUS_CHECK; - } - - info->pages = device_info->pages; - info->identify = pmbus_identify; - dev->platform_data = pdata; - - return pmbus_do_probe(client, info); -} -#endif -static const struct i2c_device_id pmbus_id[] = { - {"csu550", 0}, - {"csu800", 1}, - {"fsp1200", 1}, - {"dps550", 1}, - {} -}; -MODULE_DEVICE_TABLE(i2c, pmbus_id); - -/* This is the driver that will be inserted */ -static struct i2c_driver pmbus_driver = { -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - .probe = pmbus_probe, -#else - .probe_new = pmbus_probe, -#endif - .id_table = pmbus_id, - .driver = { - .name = "pmbus", - }, -}; - -module_i2c_driver(pmbus_driver); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile psupmbus driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c new file mode 100644 index 0000000000..0d6f38ecc5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.c @@ -0,0 +1,516 @@ +/* + * Copyright (C) 2003-2014 FreeIPMI Core Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/*****************************************************************************\ + * Copyright (C) 2007-2014 Lawrence Livermore National Security, LLC. + * Copyright (C) 2007 The Regents of the University of California. + * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). + * Written by Albert Chu + * UCRL-CODE-232183 + * + * This file is part of Ipmi-fru, a tool used for retrieving + * motherboard field replaceable unit (FRU) information. For details, + * see http://www.llnl.gov/linux/. + * + * Ipmi-fru is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * Ipmi-fru is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with Ipmi-fru. If not, see . +\*****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "platform_common.h" +#include "dfd_tlveeprom.h" + +/* using in is_valid_tlvinfo_header */ +static u_int32_t eeprom_size; + +/* + * List of TLV codes and names. + */ +static const struct tlv_code_desc tlv_code_list[] = { + { TLV_CODE_PRODUCT_NAME , "Product Name"}, + { TLV_CODE_PART_NUMBER , "Part Number"}, + { TLV_CODE_SERIAL_NUMBER , "Serial Number"}, + { TLV_CODE_MAC_BASE , "Base MAC Address"}, + { TLV_CODE_MANUF_DATE , "Manufacture Date"}, + { TLV_CODE_DEVICE_VERSION , "Device Version"}, + { TLV_CODE_LABEL_REVISION , "Label Revision"}, + { TLV_CODE_PLATFORM_NAME , "Platform Name"}, + { TLV_CODE_ONIE_VERSION , "ONIE Version"}, + { TLV_CODE_MAC_SIZE , "MAC Addresses"}, + { TLV_CODE_MANUF_NAME , "Manufacturer"}, + { TLV_CODE_MANUF_COUNTRY , "Country Code"}, + { TLV_CODE_VENDOR_NAME , "Vendor Name"}, + { TLV_CODE_DIAG_VERSION , "Diag Version"}, + { TLV_CODE_SERVICE_TAG , "Service Tag"}, + { TLV_CODE_VENDOR_EXT , "Vendor Extension"}, + { TLV_CODE_CRC_32 , "CRC-32"}, +}; + +#if 0 +#define OPENBMC_VPD_KEY_INVAIL_VAL 0 + +static const tlv_code_map_t tlv_code_map[] = { + { TLV_CODE_PRODUCT_NAME , OPENBMC_VPD_KEY_PRODUCT_NAME}, + { TLV_CODE_PART_NUMBER , OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM}, + { TLV_CODE_SERIAL_NUMBER , OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM}, + { TLV_CODE_MAC_BASE , OPENBMC_VPD_KEY_INVAIL_VAL}, + { TLV_CODE_MANUF_DATE , OPENBMC_VPD_KEY_BOARD_MFG_DATE}, + { TLV_CODE_DEVICE_VERSION , OPENBMC_VPD_KEY_PRODUCT_VER}, + { TLV_CODE_LABEL_REVISION , OPENBMC_VPD_KEY_PRODUCT_CUSTOM7}, + { TLV_CODE_PLATFORM_NAME , OPENBMC_VPD_KEY_PRODUCT_CUSTOM1}, + { TLV_CODE_ONIE_VERSION , OPENBMC_VPD_KEY_PRODUCT_CUSTOM2}, + { TLV_CODE_MAC_SIZE , OPENBMC_VPD_KEY_INVAIL_VAL}, + { TLV_CODE_MANUF_NAME , OPENBMC_VPD_KEY_PRODUCT_MFR}, + { TLV_CODE_MANUF_COUNTRY , OPENBMC_VPD_KEY_PRODUCT_CUSTOM3}, + { TLV_CODE_VENDOR_NAME , OPENBMC_VPD_KEY_PRODUCT_CUSTOM4}, + { TLV_CODE_DIAG_VERSION , OPENBMC_VPD_KEY_PRODUCT_CUSTOM8}, + { TLV_CODE_SERVICE_TAG , OPENBMC_VPD_KEY_PRODUCT_CUSTOM5}, + { TLV_CODE_VENDOR_EXT , OPENBMC_VPD_KEY_PRODUCT_CUSTOM6}, + { TLV_CODE_CRC_32 , OPENBMC_VPD_KEY_INVAIL_VAL}, +}; +#endif + +#define TLV_CODE_NUM (sizeof(tlv_code_list) / sizeof(tlv_code_list[0])) + +#if 0 +#define TLV_CODE_MAP_NUM (sizeof(tlv_code_map) / sizeof(tlv_code_map[0])) +#endif + +const unsigned long crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, +}; + +static unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned len) +{ + unsigned i; + if (len < 1) + return 0xffffffff; + + for (i = 0; i != len; ++i) + { + crc = crc_table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8); + } + + crc = crc ^ 0xffffffff; + + return crc; +} + +/* + * is_valid_tlv + * + * Perform basic sanity checks on a TLV field. The TLV is pointed to + * by the parameter provided. + * 1. The type code is not reserved (0x00 or 0xFF) + */ +static inline bool is_valid_tlv(tlvinfo_tlv_t *tlv) +{ + return ((tlv->type != 0x00) && (tlv->type != 0xFF)); +} + +/* + * is_valid_tlvinfo_header + * + * Perform sanity checks on the first 11 bytes of the TlvInfo EEPROM + * data pointed to by the parameter: + * 1. First 8 bytes contain null-terminated ASCII string "TlvInfo" + * 2. Version byte is 1 + * 3. Total length bytes contain value which is less than or equal + * to the allowed maximum (2048-11) + * + */ +static inline bool is_valid_tlvinfo_header(tlvinfo_header_t *hdr) +{ + int max_size = eeprom_size; + return((strcmp(hdr->signature, TLV_INFO_ID_STRING) == 0) && + (hdr->version == TLV_INFO_VERSION) && + (be16_to_cpu(hdr->totallen) <= max_size) ); +} + +/* + * decode_tlv_value + * + * Decode a single TLV value into a string. + + * The validity of EEPROM contents and the TLV field have been verified + * prior to calling this function. + */ +static void decode_tlv_value(tlvinfo_tlv_t *tlv, tlv_decode_value_t *decode_value) +{ + int i; + char *value; + u_int32_t length; + + value = (char *)decode_value->value; + + switch (tlv->type) { + case TLV_CODE_PRODUCT_NAME: + case TLV_CODE_PART_NUMBER: + case TLV_CODE_SERIAL_NUMBER: + case TLV_CODE_MANUF_DATE: + case TLV_CODE_LABEL_REVISION: + case TLV_CODE_PLATFORM_NAME: + case TLV_CODE_ONIE_VERSION: + case TLV_CODE_MANUF_NAME: + case TLV_CODE_MANUF_COUNTRY: + case TLV_CODE_VENDOR_NAME: + case TLV_CODE_DIAG_VERSION: + case TLV_CODE_SERVICE_TAG: + case TLV_CODE_VENDOR_EXT: + memcpy(value, tlv->value, tlv->length); + value[tlv->length] = 0; + length = tlv->length; + break; + case TLV_CODE_MAC_BASE: + length = sprintf(value, "%02X:%02X:%02X:%02X:%02X:%02X", + tlv->value[0], tlv->value[1], tlv->value[2], + tlv->value[3], tlv->value[4], tlv->value[5]); + break; + case TLV_CODE_DEVICE_VERSION: + length = sprintf(value, "%u", tlv->value[0]); + break; + case TLV_CODE_MAC_SIZE: + length = sprintf(value, "%u", (tlv->value[0] << 8) | tlv->value[1]); + break; + #if 0 + case TLV_CODE_VENDOR_EXT: + value[0] = 0; + length = 0; + for (i = 0; (i < (TLV_DECODE_VALUE_MAX_LEN/5)) && (i < tlv->length); i++) { + length += sprintf(value, "%s 0x%02X", value, tlv->value[i]); + } + break; + #endif + case TLV_CODE_CRC_32: + length = sprintf(value, "0x%02X%02X%02X%02X", tlv->value[0], + tlv->value[1], tlv->value[2], tlv->value[3]); + break; + default: + value[0] = 0; + length = 0; + for (i = 0; (i < (TLV_DECODE_VALUE_MAX_LEN/5)) && (i < tlv->length); i++) { + length += sprintf(value, "%s 0x%02X", value, tlv->value[i]); + } + break; + } + + decode_value->length = length; +} + +/* + * is_checksum_valid + * + * Validate the checksum in the provided TlvInfo EEPROM data. First, + * verify that the TlvInfo header is valid, then make sure the last + * TLV is a CRC-32 TLV. Then calculate the CRC over the EEPROM data + * and compare it to the value stored in the EEPROM CRC-32 TLV. + */ +static bool is_checksum_valid(u_int8_t *eeprom) +{ + tlvinfo_header_t *eeprom_hdr; + tlvinfo_tlv_t *eeprom_crc; + unsigned int calc_crc; + unsigned int stored_crc; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + + // Is the eeprom header valid? + if (!is_valid_tlvinfo_header(eeprom_hdr)) { + return false; + } + + // Is the last TLV a CRC? + eeprom_crc = (tlvinfo_tlv_t *) &eeprom[sizeof(tlvinfo_header_t) + + be16_to_cpu(eeprom_hdr->totallen) - (sizeof(tlvinfo_tlv_t) + 4)]; + if ((eeprom_crc->type != TLV_CODE_CRC_32) || (eeprom_crc->length != 4)) { + return false; + } + + // Calculate the checksum + calc_crc = crc32(0xffffffffL, (const unsigned char *)eeprom, sizeof(tlvinfo_header_t) + + be16_to_cpu(eeprom_hdr->totallen) - 4); + stored_crc = ((eeprom_crc->value[0] << 24) | (eeprom_crc->value[1] << 16) | + (eeprom_crc->value[2] << 8) | eeprom_crc->value[3]); + + return (calc_crc == stored_crc); +} + +/* + * tlvinfo_find_tlv + * + * This function finds the TLV with the supplied code in the EERPOM. + * An offset from the beginning of the EEPROM is returned in the + * eeprom_index parameter if the TLV is found. + */ +static bool tlvinfo_find_tlv(u_int8_t *eeprom, u_int8_t tcode, int *eeprom_index) +{ + tlvinfo_header_t *eeprom_hdr; + tlvinfo_tlv_t *eeprom_tlv; + int eeprom_end; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + + // Search through the TLVs, looking for the first one which matches the + // supplied type code. + *eeprom_index = sizeof(tlvinfo_header_t); + eeprom_end = sizeof(tlvinfo_header_t) + be16_to_cpu(eeprom_hdr->totallen); + while (*eeprom_index < eeprom_end) { + eeprom_tlv = (tlvinfo_tlv_t *) &eeprom[*eeprom_index]; + if (!is_valid_tlv(eeprom_tlv)) { + return false; + } + + if (eeprom_tlv->type == tcode) { + return true; + } + + *eeprom_index += sizeof(tlvinfo_tlv_t) + eeprom_tlv->length; + } + + return false; +} + +/* + * tlvinfo_decode_tlv + * + * This function finds the TLV with the supplied code in the EERPOM + * and decodes the value into the buffer provided. + */ +static bool tlvinfo_decode_tlv(u_int8_t *eeprom, u_int8_t tcode, tlv_decode_value_t *decode_value) +{ + int eeprom_index; + tlvinfo_tlv_t *eeprom_tlv; + + // Find the TLV and then decode it + if (tlvinfo_find_tlv(eeprom, tcode, &eeprom_index)) { + eeprom_tlv = (tlvinfo_tlv_t *) &eeprom[eeprom_index]; + decode_tlv_value(eeprom_tlv, decode_value); + return true; + } + + return false; +} + +/* + * parse_tlv_eeprom + * + * parse the EEPROM into memory, if it hasn't already been read. + */ +int parse_tlv_eeprom(u_int8_t *eeprom, u_int32_t size) +{ + unsigned int i; + bool ret; + tlvinfo_header_t *eeprom_hdr; + //tlv_info_vec_t tlv_info; + tlv_decode_value_t decode_value; + int j; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + eeprom_size = size; /* eeprom real size */ + + if (!is_valid_tlvinfo_header(eeprom_hdr)) { + DBG_ERROR("Failed to check tlv header.\n"); + return -1; + } + + if (!is_checksum_valid(eeprom)) { + DBG_ERROR("Failed to check tlv crc.\n"); + return -1; + } + + for (i = 0; i < TLV_CODE_NUM; i++) { + mem_clear((void *)&decode_value, sizeof(tlv_decode_value_t)); + ret = tlvinfo_decode_tlv(eeprom, tlv_code_list[i].m_code, &decode_value); + if (!ret) { + DBG_ERROR("No found type: %s\n", tlv_code_list[i].m_name); + continue; + } + + DBG_DEBUG("i: %d,Found type: %s tlv[%d]:%s\n", i, tlv_code_list[i].m_name, tlv_code_list[i].m_code, + decode_value.value); + for (j = 0; j < decode_value.length; j++) { + if ((j % 16) == 0) { + DBG_DEBUG("\n"); + } + DBG_DEBUG("%02x ", decode_value.value[j]); + } + DBG_DEBUG("\n\n"); + } + return 0; +} +static int dfd_parse_tlv_eeprom(u_int8_t *eeprom, u_int32_t size, u_int8_t main_type, tlv_decode_value_t *decode_value) +{ + bool ret; + tlvinfo_header_t *eeprom_hdr; + //tlv_info_vec_t tlv_info; + int j; + + eeprom_hdr = (tlvinfo_header_t *) eeprom; + eeprom_size = size; /* eeprom real size */ + + if (!is_valid_tlvinfo_header(eeprom_hdr)) { + DBG_ERROR("Failed to check tlv header.\n"); + return -1; + } + + if (!is_checksum_valid(eeprom)) { + DBG_ERROR("Failed to check tlv crc.\n"); + return -1; + } + + ret = tlvinfo_decode_tlv(eeprom, main_type, decode_value); + if (!ret) { + DBG_ERROR("No found type: %d\n", main_type); + return -1; + } + + DBG_DEBUG("Found type: %d, value: %s\n", main_type,decode_value->value); + for (j = 0; j < decode_value->length; j++) { + if ((j % 16) == 0) { + DBG_DEBUG("\n"); + } + DBG_DEBUG("%02x ", decode_value->value[j]); + } + DBG_DEBUG("\n\n"); + + return 0; +} + +static int tlvinfo_find_wb_ext_tlv(tlv_decode_value_t *ext_tlv_value, u_int8_t ext_type, + u_int8_t *buf, u_int8_t *buf_len) +{ + tlvinfo_tlv_t *eeprom_tlv; + int eeprom_end, eeprom_index; + + // Search through the TLVs, looking for the first one which matches the + // supplied type code. + DBG_DEBUG("ext_tlv_value->length: %d.\n", ext_tlv_value->length); + for (eeprom_index = 0; eeprom_index < ext_tlv_value->length; eeprom_index++) { + if ((eeprom_index % 16) == 0) { + DBG_DEBUG("\n"); + } + DBG_DEBUG("%02x ", ext_tlv_value->value[eeprom_index]); + } + + DBG_DEBUG("\n"); + + eeprom_index = 0; + eeprom_end = ext_tlv_value->length; + while (eeprom_index < eeprom_end) { + eeprom_tlv = (tlvinfo_tlv_t *) &(ext_tlv_value->value[eeprom_index]); + if (!is_valid_tlv(eeprom_tlv)) { + DBG_ERROR("tlv is not valid, eeprom_tlv->type 0x%x.\n", eeprom_tlv->type); + return -1; + } + + DBG_DEBUG("eeprom_tlv->length %d.\n", eeprom_tlv->length); + if (eeprom_tlv->type == ext_type) { + if (*buf_len >= eeprom_tlv->length) { + memcpy(buf, eeprom_tlv->value, eeprom_tlv->length); + DBG_DEBUG("eeprom_tlv->length %d.\n", eeprom_tlv->length); + *buf_len = eeprom_tlv->length; + return 0; + } + DBG_ERROR("buf_len %d small than info_len %d.\n", *buf_len, eeprom_tlv->length); + return -1; + } + + eeprom_index += sizeof(tlvinfo_tlv_t) + eeprom_tlv->length; + } + + DBG_ERROR("ext_type %d: tlv is not found.\n", ext_type); + return -1; +} + +int dfd_tlvinfo_get_e2prom_info(u_int8_t *eeprom, u_int32_t size, dfd_tlv_type_t *tlv_type, u_int8_t* buf, u_int8_t *buf_len) +{ + tlv_decode_value_t decode_value; + int ret; + + if (eeprom == NULL || tlv_type == NULL || buf == NULL) { + DBG_ERROR("Input para invalid.\n"); + return -1; + } + + mem_clear((void *)&decode_value, sizeof(tlv_decode_value_t)); + ret = dfd_parse_tlv_eeprom(eeprom, size, tlv_type->main_type, &decode_value); + if (ret) { + DBG_ERROR("dfd_parse_tlv_eeprom failed ret %d.\n", ret); + return ret; + } + + if (tlv_type->main_type != TLV_CODE_VENDOR_EXT) { + if (*buf_len >= decode_value.length) { + memcpy(buf, decode_value.value, decode_value.length); + *buf_len = decode_value.length; + return 0; + } + DBG_ERROR("buf_len %d small than info_len %d.\n", *buf_len, decode_value.length); + return -1; + } + DBG_DEBUG("info_len %d.\n", decode_value.length); + + return tlvinfo_find_wb_ext_tlv(&decode_value, tlv_type->ext_type, buf, buf_len); +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h new file mode 100644 index 0000000000..6eaac58482 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/dfd_tlveeprom.h @@ -0,0 +1,121 @@ +#ifndef DFD_OPENBMC_TLVEEPROM_H +#define DFD_OPENBMC_TLVEEPROM_H + +#ifndef u_int8_t +#define u_int8_t unsigned char +#endif + +#ifndef u_int16_t +#define u_int16_t unsigned short +#endif + +#ifndef u_int32_t +#define u_int32_t unsigned int +#endif + +#ifndef be16_to_cpu +#define be16_to_cpu(x) ntohs(x) +#endif + +#ifndef cpu_to_be16 +#define cpu_to_be16(x) htons(x) +#endif + +/** + * The TLV Types. + * + * Keep these in sync with tlv_code_list in cmd_sys_eeprom.c + */ +#define TLV_CODE_PRODUCT_NAME 0x21 +#define TLV_CODE_PART_NUMBER 0x22 +#define TLV_CODE_SERIAL_NUMBER 0x23 +#define TLV_CODE_MAC_BASE 0x24 +#define TLV_CODE_MANUF_DATE 0x25 +#define TLV_CODE_DEVICE_VERSION 0x26 +#define TLV_CODE_LABEL_REVISION 0x27 +#define TLV_CODE_PLATFORM_NAME 0x28 +#define TLV_CODE_ONIE_VERSION 0x29 +#define TLV_CODE_MAC_SIZE 0x2A +#define TLV_CODE_MANUF_NAME 0x2B +#define TLV_CODE_MANUF_COUNTRY 0x2C +#define TLV_CODE_VENDOR_NAME 0x2D +#define TLV_CODE_DIAG_VERSION 0x2E +#define TLV_CODE_SERVICE_TAG 0x2F +#define TLV_CODE_VENDOR_EXT 0xFD +#define TLV_CODE_CRC_32 0xFE + +#define TLV_CODE_NAME_LEN 64 +/* + * Struct for displaying the TLV codes and names. + */ +struct tlv_code_desc { + u_int8_t m_code; + char m_name[TLV_CODE_NAME_LEN]; +}; + +typedef struct dfd_tlv_type_s { + u_int8_t main_type; + u_int8_t ext_type; +} dfd_tlv_type_t; + +// Header Field Constants +#define TLV_INFO_ID_STRING "TlvInfo" +#define TLV_INFO_VERSION 0x01 +/*#define TLV_TOTAL_LEN_MAX (XXXXXXXX - sizeof(tlvinfo_header_t))*/ + +struct __attribute__ ((__packed__)) tlvinfo_header_s { + char signature[8]; /* 0x00 - 0x07 EEPROM Tag "TlvInfo" */ + u_int8_t version; /* 0x08 Structure version */ + u_int16_t totallen; /* 0x09 - 0x0A Length of all data which follows */ +}; +typedef struct tlvinfo_header_s tlvinfo_header_t; + +/* + * TlvInfo TLV: Layout of a TLV field + */ +struct __attribute__ ((__packed__)) tlvinfo_tlv_s { + u_int8_t type; + u_int8_t length; + u_int8_t value[0]; +}; +typedef struct tlvinfo_tlv_s tlvinfo_tlv_t; + +#define TLV_VALUE_MAX_LEN 255 +/* + * The max decode value is currently for the 'raw' type or the 'vendor + * extension' type, both of which have the same decode format. The + * max decode string size is computed as follows: + * + * strlen(" 0xFF") * TLV_VALUE_MAX_LEN + 1 + * + */ +#define TLV_DECODE_VALUE_MAX_LEN ((5 * TLV_VALUE_MAX_LEN) + 1) + +typedef struct tlv_decode_value_s { + u_int8_t value[TLV_DECODE_VALUE_MAX_LEN]; + u_int32_t length; +} tlv_decode_value_t; + +typedef enum dfd_tlvinfo_ext_tlv_type_e { + DFD_TLVINFO_EXT_TLV_TYPE_DEV_TYPE = 1, +} dfd_tlvinfo_ext_tlv_type_t; + +#if 0 +#define TLV_TIME_LEN 64 + +int ipmi_tlv_validate_fru_area(const uint8_t fruid, const char *fru_file_name, + sd_bus *bus_type, const bool bmc_fru); + +extern const char *get_vpd_key_names(int key_id); +extern std::string getService(sdbusplus::bus::bus& bus, + const std::string& intf, + const std::string& path); +extern std::string getFRUValue(const std::string& section, + const std::string& key, + const std::string& delimiter, + IPMIFruInfo& fruData); +#endif + +int dfd_tlvinfo_get_e2prom_info(u_int8_t *eeprom, u_int32_t size, dfd_tlv_type_t *tlv_type, u_int8_t* buf, u_int8_t *buf_len); + +#endif /* endif DFD_OPENBMC_TLVEEPROM_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h new file mode 100644 index 0000000000..649a8452de --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c.h @@ -0,0 +1,133 @@ +#ifndef _FPGA_I2C_H +#define _FPGA_I2C_H + +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#if 0 + +#define FPGA_I2C_EXT_9548_ADDR (0x00) +#define FPGA_I2C_EXT_9548_CHAN (0x04) +#define FPGA_I2C_DEV_SLAVE_ADDR (0x08) +#define FPGA_I2C_DEV_REG_ADDR (0x0C) +#define FPGA_I2C_DEV_RDWR_LEN (0x10) +#define FPGA_I2C_CTRL_REG (0x14) +#define FPGA_I2C_STATUS_REG (0x18) +#define FPGA_I2C_SCALE_REG (0x1C) +#define FPGA_I2C_FILTER_REG (0x20) +#define FPGA_I2C_STRETCH_REG (0x24) +#define FPGA_I2C_EXT_9548_EXITS_FLAG (0x28) +#define FPGA_I2C_INTERNAL_9548_CHAN (0x2C) +#define FPGA_I2C_RDWR_DATA_BUF (0x80) +#endif +#define FPGA_I2C_RDWR_MAX_LEN_DEFAULT (128) +#define I2C_REG_MAX_WIDTH (16) + +#define DEV_NAME_MAX_LEN (64) + +#define FPGA_I2C_MAX_TIMES (10) +#define FPGA_I2C_XFER_TIME_OUT (100000) +#define FPGA_I2C_SLEEP_TIME (40) + +typedef struct fpga_i2c_reg_s { + uint32_t i2c_scale; + uint32_t i2c_filter; + uint32_t i2c_stretch; + uint32_t i2c_ext_9548_exits_flag; + uint32_t i2c_ext_9548_addr; + uint32_t i2c_ext_9548_chan; + uint32_t i2c_in_9548_chan; + uint32_t i2c_slave; + uint32_t i2c_reg; + uint32_t i2c_reg_len; + uint32_t i2c_data_len; + uint32_t i2c_ctrl; + uint32_t i2c_status; + uint32_t i2c_err_vec; + uint32_t i2c_data_buf; + uint32_t i2c_data_buf_len; +} fpga_i2c_reg_t; + +typedef struct fpga_i2c_reset_cfg_s { + uint32_t i2c_adap_reset_flag; + uint32_t reset_addr; + uint32_t reset_on; + uint32_t reset_off; + uint32_t reset_delay_b; + uint32_t reset_delay; + uint32_t reset_delay_a; +} fpga_i2c_reset_cfg_t; + +typedef struct fpga_i2c_reg_addr_s { + uint8_t reg_addr_len; + uint8_t read_reg_addr[I2C_REG_MAX_WIDTH]; +} fpga_i2c_reg_addr_t; + +typedef struct fpga_i2c_dev_s { + fpga_i2c_reg_t reg; + fpga_i2c_reset_cfg_t reset_cfg; + fpga_i2c_reg_addr_t i2c_addr_desc; + const char *dev_name; + uint32_t i2c_scale_value; + uint32_t i2c_filter_value; + uint32_t i2c_stretch_value; + uint32_t i2c_timeout; + uint32_t i2c_func_mode; + wait_queue_head_t queue; + struct i2c_adapter adap; + int adap_nr; + struct device *dev; + bool i2c_params_check; +} fpga_i2c_dev_t; + +typedef struct fpga_i2c_bus_device_s { + int i2c_timeout; + int i2c_scale; + int i2c_filter; + int i2c_stretch; + int i2c_ext_9548_exits_flag; + int i2c_ext_9548_addr; + int i2c_ext_9548_chan; + int i2c_in_9548_chan; + int i2c_slave; + int i2c_reg; + int i2c_reg_len; + int i2c_data_len; + int i2c_ctrl; + int i2c_status; + int i2c_err_vec; + int i2c_data_buf; + int i2c_data_buf_len; + char dev_name[DEV_NAME_MAX_LEN]; + int adap_nr; + int i2c_scale_value; + int i2c_filter_value; + int i2c_stretch_value; + int i2c_func_mode; + int i2c_adap_reset_flag; + int i2c_reset_addr; + int i2c_reset_on; + int i2c_reset_off; + int i2c_rst_delay_b; /* delay time before reset(us) */ + int i2c_rst_delay; /* reset time(us) */ + int i2c_rst_delay_a; /* delay time after reset(us) */ + int device_flag; + bool i2c_params_check; + int i2c_data_buf_len_reg; + int i2c_offset_reg; +} fpga_i2c_bus_device_t; + +typedef struct fpga_pca954x_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t fpga_9548_flag; + uint32_t fpga_9548_reset_flag; + uint32_t pca9548_base_nr; +} fpga_pca954x_device_t; + +#endif /* _FPGA_I2C_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c deleted file mode 100755 index 7857f854d6..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.c +++ /dev/null @@ -1,911 +0,0 @@ -/* - * i2c-ocores.c: I2C bus driver for OpenCores I2C controller - * (http://www.opencores.org/projects.cgi/web/i2c/overview). - * - * Peter Korsgaard - * - * Support for the GRLIB port of the controller by - * Andreas Larsson - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "fpga_i2c_ocores.h" -#include -#include -#include - -struct ocores_i2c { - void __iomem *base; - u32 reg_shift; - u32 reg_io_width; - wait_queue_head_t wait; - struct i2c_adapter adap; - struct i2c_msg *msg; - int pos; - int nmsgs; - int state; /* see STATE_ */ - spinlock_t process_lock; - struct mutex xfer_lock; - int clock_khz; - void (*setreg)(struct ocores_i2c *i2c, int reg, u8 value); - u8 (*getreg)(struct ocores_i2c *i2c, int reg); -}; - -/* registers */ -#define OCI2C_PRELOW 0x0 -#define OCI2C_PREHIGH 0x4 -#define OCI2C_CONTROL 0x8 -#define OCI2C_DATA 0xc -#define OCI2C_CMD 0x10 /* write only */ -#define OCI2C_STATUS 0x10 /* read only, same address as OCI2C_CMD */ - -#define OCI2C_TRAN_REV 0x14 -#define OCI2C_CMD_REV 0x18 - - -#define OCI2C_CTRL_IEN 0x40 -#define OCI2C_CTRL_EN 0x80 - -#define OCI2C_CMD_START 0x91 -#define OCI2C_CMD_STOP 0x41 -#define OCI2C_CMD_READ 0x21 -#define OCI2C_CMD_WRITE 0x11 -#define OCI2C_CMD_READ_ACK 0x21 -#define OCI2C_CMD_READ_NACK 0x29 -#define OCI2C_CMD_IACK 0x01 - -#define OCI2C_STAT_IF 0x01 -#define OCI2C_STAT_TIP 0x02 -#define OCI2C_STAT_ARBLOST 0x20 -#define OCI2C_STAT_BUSY 0x40 -#define OCI2C_STAT_NACK 0x80 - -#define STATE_DONE 0 -#define STATE_START 1 -#define STATE_WRITE 2 -#define STATE_READ 3 -#define STATE_ERROR 4 - -#define TYPE_OCORES 0 -#define TYPE_GRLIB 1 - -#define BUF_SIZE 256 -#define DEFAULT_I2C_SCL 100 -#define DEFAULT_I2C_PRE 0xF9 - -int g_fpga_i2c_debug = 0; -int g_fpga_i2c_irq = 0; -int g_fpga_i2c_error = 0; -int g_irq_dump_debug = 0; -int g_irq_invalid_cnt = 0; -int g_fpga_debug = 0; - -module_param(g_fpga_i2c_debug, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_i2c_error, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_i2c_irq, int, S_IRUGO | S_IWUSR); -module_param(g_irq_dump_debug, int, S_IRUGO | S_IWUSR); -module_param(g_irq_invalid_cnt, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_debug, int, S_IRUGO | S_IWUSR); - -#define FPGA_I2C_DEBUG(fmt, args...) do { \ - if (g_fpga_debug) { \ - printk(KERN_DEBUG ""fmt, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_DUMP(fmt, args...) do { \ - if (g_irq_dump_debug) { \ - printk(KERN_ERR ""fmt, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_XFER(fmt, args...) do { \ - if (g_fpga_i2c_irq) { \ - printk(KERN_ERR "[FPGA_I2C][XFER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_fpga_i2c_debug) { \ - printk(KERN_ERR "[FPGA_I2C][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_I2C_DEBUG_ERROR(fmt, args...) do { \ - if (g_fpga_i2c_error) { \ - printk(KERN_ERR "[FPGA_I2C][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -static int check_ocores_i2c(struct i2c_msg *msgs, int num); -static void oc_debug_dump_reg(struct ocores_i2c *i2c); -static void oc_debug_dump_reg_dump(struct ocores_i2c *i2c); -static int oc_set_scl_clk(struct ocores_i2c *i2c, int val); - -static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u8 value) -{ - iowrite8(value, i2c->base + (reg << i2c->reg_shift)); -} - -static void oc_setreg_16(struct ocores_i2c *i2c, int reg, u8 value) -{ - iowrite16(value, i2c->base + (reg << i2c->reg_shift)); -} - -static void oc_setreg_32(struct ocores_i2c *i2c, int reg, u8 value) -{ - iowrite32(value, i2c->base + (reg << i2c->reg_shift)); -} - -static inline u8 oc_getreg_8(struct ocores_i2c *i2c, int reg) -{ - return ioread8(i2c->base + (reg << i2c->reg_shift)); -} - -static inline u8 oc_getreg_16(struct ocores_i2c *i2c, int reg) -{ - return ioread16(i2c->base + (reg << i2c->reg_shift)); -} - -static inline u8 oc_getreg_32(struct ocores_i2c *i2c, int reg) -{ - return ioread32(i2c->base + (reg << i2c->reg_shift)); -} - -static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) -{ - i2c->setreg(i2c, reg, value); -} - -static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) -{ - return i2c->getreg(i2c, reg); -} - -#define FPGA_I2C_SPIN_LOCK(lock, flags) spin_lock_irqsave(&(lock), (flags)) -#define FPGA_I2C_SPIN_UNLOCK(lock, flags) spin_unlock_irqrestore(&(lock), (flags)) -#define FPGA_I2C_MUTEX_LOCK(lock) mutex_lock(&(lock)) -#define FPGA_I2C_MUTEX_UNLOCK(lock) mutex_unlock(&(lock)) - -static void ocores_process(struct ocores_i2c *i2c, u8 stat) -{ - struct i2c_msg *msg = i2c->msg; - - FPGA_I2C_DEBUG_XFER("Enter nr %d.\n", i2c->adap.nr); - if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) { - /* stop has been sent */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - wake_up(&i2c->wait); - FPGA_I2C_DEBUG_XFER("stop has been sent, exit.\n"); - goto out; - } - - FPGA_I2C_DEBUG_XFER("Enter 111.\n"); - - /* error */ - if (stat & OCI2C_STAT_ARBLOST) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - FPGA_I2C_DEBUG_XFER("error, exit.\n"); - goto out; - } - - FPGA_I2C_DEBUG_XFER("Enter 222.\n"); - - if (check_ocores_i2c(i2c->msg, i2c->nmsgs) != 0) { - FPGA_I2C_DEBUG("i2c->msg->buf is null, i2c->state:%d exit.\n", i2c->state); - oc_debug_dump_reg_dump(i2c); - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - goto out; - } - - if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { - i2c->state = - (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; - - if (stat & OCI2C_STAT_NACK) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - FPGA_I2C_DEBUG_XFER("OCI2C_STAT_NACK, exit.\n"); - goto out; - } - } else { - msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA); - } - FPGA_I2C_DEBUG_XFER("Enter 333.\n"); - - /* end of msg? */ - if (i2c->pos == msg->len) { - FPGA_I2C_DEBUG_XFER("Enter end of msg.\n"); - i2c->nmsgs--; - i2c->msg++; - i2c->pos = 0; - msg = i2c->msg; - - if (i2c->nmsgs) { /* end? */ - /* send start? */ - if (!(msg->flags & I2C_M_NOSTART)) { - u8 addr = (msg->addr << 1); - - if (msg->flags & I2C_M_RD) - addr |= 1; - - i2c->state = STATE_START; - - oc_setreg(i2c, OCI2C_DATA, addr); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - FPGA_I2C_DEBUG_XFER("send start, exit.\n"); - goto out; - } - - i2c->state = (msg->flags & I2C_M_RD) - ? STATE_READ : STATE_WRITE; - } else { - i2c->state = STATE_DONE; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - FPGA_I2C_DEBUG_XFER("send OCI2C_CMD_STOP, exit.\n"); - goto out; - } - } - - if (i2c->state == STATE_READ) { - oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ? - OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK); - } else { - oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE); - } - -out: - FPGA_I2C_DEBUG_XFER("normal, exit nr %d.\n", i2c->adap.nr); -} - -static irqreturn_t ocores_isr(int irq, void *dev_id) -{ - struct ocores_i2c *i2c = dev_id; - unsigned long flags; - u8 stat; - - if (!i2c) { - return IRQ_NONE; - } - /* - * If we spin here is because we are in timeout, so we are going - * to be in STATE_ERROR. See ocores_process_timeout() - */ - FPGA_I2C_SPIN_LOCK(i2c->process_lock, flags); - stat = oc_getreg(i2c, OCI2C_STATUS); - if (!(stat & OCI2C_STAT_IF)) { - g_irq_invalid_cnt++; - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - return IRQ_NONE; - } - - FPGA_I2C_DEBUG_XFER("Enter, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)?0:i2c->msg->addr); - ocores_process(i2c, stat); - FPGA_I2C_DEBUG_XFER("Leave, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)?0:i2c->msg->addr); - - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - return IRQ_HANDLED; -} - -/** - * Process timeout event - * @i2c: ocores I2C device instance - */ -static void ocores_process_timeout(struct ocores_i2c *i2c) -{ - unsigned long flags; - - FPGA_I2C_SPIN_LOCK(i2c->process_lock, flags); - FPGA_I2C_DEBUG_ERROR("wait_event_timeout i2c->state %d.\n", i2c->state); - oc_debug_dump_reg(i2c); - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - mdelay(1); - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); -} - -static int check_ocores_i2c(struct i2c_msg *msgs, int num) -{ - int i; - if (!msgs) { - return -1; - } - for (i = 0; i < num; ++i) { - if (!msgs[i].buf) { - return -1; - } - } - return 0; -} - -static int ocores_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) -{ - struct ocores_i2c *i2c; - int ret; - unsigned long flags; - int xfer_ret; - - if (!adap || check_ocores_i2c(msgs, num) != 0) { - FPGA_I2C_DEBUG("msgs: %p , num:%d exit.\n", msgs, num); - return -EINVAL; - } - i2c = i2c_get_adapdata(adap); - - FPGA_I2C_MUTEX_LOCK(i2c->xfer_lock); - FPGA_I2C_SPIN_LOCK(i2c->process_lock, flags); - i2c->msg = msgs; - i2c->pos = 0; - i2c->nmsgs = num; - i2c->state = STATE_START; - FPGA_I2C_DEBUG_XFER("Enter, nr %d addr 0x%x num %d.\n", adap->nr, i2c->msg->addr, num); - - oc_setreg(i2c, OCI2C_DATA, - (i2c->msg->addr << 1) | - ((i2c->msg->flags & I2C_M_RD) ? 1:0)); - - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - FPGA_I2C_DEBUG_XFER("After, oc_setreg OCI2C_CMD.\n"); - FPGA_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - - ret = wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) || - (i2c->state == STATE_DONE), HZ); - - if (ret == 0) { - ocores_process_timeout(i2c); - FPGA_I2C_MUTEX_UNLOCK(i2c->xfer_lock); - return -ETIMEDOUT; - } - xfer_ret = i2c->state; - FPGA_I2C_MUTEX_UNLOCK(i2c->xfer_lock); - return (xfer_ret == STATE_DONE) ? num : -EIO; -} - -static void ocores_init(struct ocores_i2c *i2c) -{ - int prescale; - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - mutex_init(&i2c->xfer_lock); - spin_lock_init(&i2c->process_lock); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - prescale = oc_set_scl_clk(i2c, DEFAULT_I2C_SCL); - FPGA_I2C_DEBUG_VERBOSE("i2c->base 0x%p, i2c->clock_khz %d, prescale 0x%x.\n", i2c->base, i2c->clock_khz, prescale); - - /* Init the device */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN | OCI2C_CTRL_EN); -} - - -static u32 ocores_func(struct i2c_adapter *adap) -{ - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; -} - -static const struct i2c_algorithm ocores_algorithm = { - .master_xfer = ocores_xfer, - .functionality = ocores_func, -}; - -static struct i2c_adapter ocores_adapter = { - .owner = THIS_MODULE, - .name = "rg-i2c-ocores", - .class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED, - .algo = &ocores_algorithm, -}; - -static const struct of_device_id ocores_i2c_match[] = { - { - .compatible = "opencores,rg-i2c-ocores", - .data = (void *)TYPE_OCORES, - }, - { - .compatible = "aeroflexgaisler,i2cmst", - .data = (void *)TYPE_GRLIB, - }, - {}, -}; -MODULE_DEVICE_TABLE(of, ocores_i2c_match); - -#ifdef CONFIG_OF -/* Read and write functions for the GRLIB port of the controller. Registers are - * 32-bit big endian and the PRELOW and PREHIGH registers are merged into one - * register. The subsequent registers has their offset decreased accordingly. */ -static u8 oc_getreg_grlib(struct ocores_i2c *i2c, int reg) -{ - u32 rd; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - rd = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PREHIGH) - return (u8)(rd >> 8); - else - return (u8)rd; -} - -static void oc_setreg_grlib(struct ocores_i2c *i2c, int reg, u8 value) -{ - u32 curr, wr; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - if (reg == OCI2C_PRELOW || reg == OCI2C_PREHIGH) { - curr = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PRELOW) - wr = (curr & 0xff00) | value; - else - wr = (((u32)value) << 8) | (curr & 0xff); - } else { - wr = value; - } - iowrite32be(wr, i2c->base + (rreg << i2c->reg_shift)); -} - -static int ocores_i2c_of_probe(struct platform_device *pdev, - struct ocores_i2c *i2c) -{ - struct device_node *np = pdev->dev.of_node; - const struct of_device_id *match; - u32 val; - - if (of_property_read_u32(np, "reg-shift", &i2c->reg_shift)) { - /* no 'reg-shift', check for deprecated 'regstep' */ - if (!of_property_read_u32(np, "regstep", &val)) { - if (!is_power_of_2(val)) { - dev_err(&pdev->dev, "invalid regstep %d\n", - val); - return -EINVAL; - } - i2c->reg_shift = ilog2(val); - dev_warn(&pdev->dev, - "regstep property deprecated, use reg-shift\n"); - } - } - - if (of_property_read_u32(np, "clock-frequency", &val)) { - dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'\n"); - return -ENODEV; - } - i2c->clock_khz = val / 1000; - - of_property_read_u32(pdev->dev.of_node, "reg-io-width", - &i2c->reg_io_width); - - match = of_match_node(ocores_i2c_match, pdev->dev.of_node); - if (match && (long)match->data == TYPE_GRLIB) { - dev_dbg(&pdev->dev, "GRLIB variant of i2c-ocores\n"); - i2c->setreg = oc_setreg_grlib; - i2c->getreg = oc_getreg_grlib; - } - - return 0; -} -#else -#define ocores_i2c_of_probe(pdev,i2c) -ENODEV -#endif - - -static void oc_debug_dump_reg_dump(struct ocores_i2c *i2c) -{ - if (i2c) { - FPGA_I2C_DEBUG("base: %p.\n", i2c->base); - FPGA_I2C_DEBUG("reg_shift: %d.\n", i2c->reg_shift); - FPGA_I2C_DEBUG("reg_io_width: %d.\n", i2c->reg_io_width); - FPGA_I2C_DEBUG("adap.nr: %d.\n", i2c->adap.nr); - FPGA_I2C_DEBUG("msg: %p.\n", i2c->msg); - if (i2c->msg) { - FPGA_I2C_DEBUG("msg->buf: %p.\n", i2c->msg->buf); - FPGA_I2C_DEBUG("msg->addr: 0x%x.\n", i2c->msg->addr); - FPGA_I2C_DEBUG("msg->flags: 0x%x.\n", i2c->msg->flags); - FPGA_I2C_DEBUG("msg->len: %d.\n", i2c->msg->len); - } else { - FPGA_I2C_DEBUG("msg: %p is null.\n", i2c->msg); - } - - FPGA_I2C_DEBUG("pos: %d.\n", i2c->pos); - FPGA_I2C_DEBUG("nmsgs: %d.\n", i2c->nmsgs); - FPGA_I2C_DEBUG("state: %d.\n", i2c->state); - FPGA_I2C_DEBUG("clock_khz: %d.\n", i2c->clock_khz); - FPGA_I2C_DEBUG("setreg: %p.\n", i2c->setreg); - FPGA_I2C_DEBUG("getreg: %p.\n", i2c->getreg); - if (i2c->getreg) { - FPGA_I2C_DEBUG("OCI2C_PRELOW: 0x%02x.\n", oc_getreg(i2c, OCI2C_PRELOW)); - FPGA_I2C_DEBUG("OCI2C_PREHIGH: 0x%02x.\n", oc_getreg(i2c, OCI2C_PREHIGH)); - FPGA_I2C_DEBUG("OCI2C_CONTROL: 0x%02x.\n", oc_getreg(i2c, OCI2C_CONTROL)); - FPGA_I2C_DEBUG("OCI2C_DATA: 0x%02x.\n", oc_getreg(i2c, OCI2C_DATA)); - FPGA_I2C_DEBUG("OCI2C_CMD: 0x%02x.\n", oc_getreg(i2c, OCI2C_CMD)); - FPGA_I2C_DEBUG("OCI2C_STATUS: 0x%02x.\n", oc_getreg(i2c, OCI2C_STATUS)); - } else { - FPGA_I2C_DEBUG("getreg: %p is null.\n", i2c->getreg); - } - } else { - FPGA_I2C_DEBUG("i2c %p is null.\n", i2c); - } -} - - -static void oc_debug_dump_reg(struct ocores_i2c *i2c) -{ - if (i2c) { - FPGA_I2C_DEBUG_DUMP("base: %p.\n", i2c->base); - FPGA_I2C_DEBUG_DUMP("reg_shift: %d.\n", i2c->reg_shift); - FPGA_I2C_DEBUG_DUMP("reg_io_width: %d.\n", i2c->reg_io_width); - FPGA_I2C_DEBUG_DUMP("adap.nr: %d.\n", i2c->adap.nr); - FPGA_I2C_DEBUG_DUMP("msg: %p.\n", i2c->msg); - if (i2c->msg) { - FPGA_I2C_DEBUG_DUMP("msg->buf: %p.\n", i2c->msg->buf); - FPGA_I2C_DEBUG_DUMP("msg->addr: 0x%x.\n", i2c->msg->addr); - FPGA_I2C_DEBUG_DUMP("msg->flags: 0x%x.\n", i2c->msg->flags); - FPGA_I2C_DEBUG_DUMP("msg->len: %d.\n", i2c->msg->len); - } else { - FPGA_I2C_DEBUG_DUMP("msg: %p is null.\n", i2c->msg); - } - - FPGA_I2C_DEBUG_DUMP("pos: %d.\n", i2c->pos); - FPGA_I2C_DEBUG_DUMP("nmsgs: %d.\n", i2c->nmsgs); - FPGA_I2C_DEBUG_DUMP("state: %d.\n", i2c->state); - FPGA_I2C_DEBUG_DUMP("clock_khz: %d.\n", i2c->clock_khz); - FPGA_I2C_DEBUG_DUMP("setreg: %p.\n", i2c->setreg); - FPGA_I2C_DEBUG_DUMP("getreg: %p.\n", i2c->getreg); - if (i2c->getreg) { - FPGA_I2C_DEBUG_DUMP("OCI2C_PRELOW: 0x%02x.\n", oc_getreg(i2c, OCI2C_PRELOW)); - FPGA_I2C_DEBUG_DUMP("OCI2C_PREHIGH: 0x%02x.\n", oc_getreg(i2c, OCI2C_PREHIGH)); - FPGA_I2C_DEBUG_DUMP("OCI2C_CONTROL: 0x%02x.\n", oc_getreg(i2c, OCI2C_CONTROL)); - FPGA_I2C_DEBUG_DUMP("OCI2C_DATA: 0x%02x.\n", oc_getreg(i2c, OCI2C_DATA)); - FPGA_I2C_DEBUG_DUMP("OCI2C_CMD: 0x%02x.\n", oc_getreg(i2c, OCI2C_CMD)); - FPGA_I2C_DEBUG_DUMP("OCI2C_STATUS: 0x%02x.\n", oc_getreg(i2c, OCI2C_STATUS)); - } else { - FPGA_I2C_DEBUG_DUMP("getreg: %p is null.\n", i2c->getreg); - } - } else { - FPGA_I2C_DEBUG_DUMP("i2c %p is null.\n", i2c); - } -} - -void oc_debug_dump_reg_exception(void) -{ - int bus_beg, bus_end, bus; - struct i2c_adapter *adap; - struct ocores_i2c *adap_data; - - bus_beg = 1; - bus_end = 14; - for (bus = bus_beg; bus <= bus_end; bus++) { - adap = i2c_get_adapter(bus); - if (adap) { - adap_data = (struct ocores_i2c *)i2c_get_adapdata(adap); - if (adap_data) { - FPGA_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg begin.\n", bus); - oc_debug_dump_reg(adap_data); - FPGA_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg end.\n", bus); - } else { - FPGA_I2C_DEBUG_DUMP("bus %d i2c_get_adapdata null.\n", bus); - } - i2c_put_adapter(adap); - } else { - FPGA_I2C_DEBUG_DUMP("bus %d i2c_get_adapter null.\n", bus); - } - } -} - -static int oc_calculate_prescale(struct ocores_i2c *i2c, int val) { - if (val <= 0) { - FPGA_I2C_DEBUG_ERROR("input scl clock error, set to default clock: %d.\n", val); - val = DEFAULT_I2C_SCL; - } - return (i2c->clock_khz / (5 * val)) - 1; -} - -static int oc_calculate_scl_clk(struct ocores_i2c *i2c, int prescale) { - if (prescale <= -1) { - FPGA_I2C_DEBUG_ERROR("input prescale error, set to default prescale: %d.\n", prescale); - prescale = DEFAULT_I2C_PRE; - } - return (i2c->clock_khz / (prescale + 1)) / 5; -} - -static int oc_set_scl_clk(struct ocores_i2c *i2c, int val) { - int prescale; - - prescale = oc_calculate_prescale(i2c, val); - oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff); - oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8); - return prescale; -} - -static int oc_get_scl_clk(struct ocores_i2c *i2c) { - int prescale, prescale_high, prescale_low; - - prescale_low = oc_getreg(i2c, OCI2C_PRELOW); - prescale_high = oc_getreg(i2c, OCI2C_PREHIGH); - prescale = (prescale_high << 8) + (prescale_low & 0xff); - - return oc_calculate_scl_clk(i2c, prescale); -} - -static ssize_t oc_sysfs_show_scl_clk(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct i2c_adapter *adapter; - struct ocores_i2c *i2c; - int scl_clk; - - adapter = to_i2c_adapter(dev); - i2c = (struct ocores_i2c *)i2c_get_adapdata(adapter); - scl_clk = oc_get_scl_clk(i2c); - return snprintf(buf, BUF_SIZE, "%d\n", scl_clk); -} - -static ssize_t oc_sysfs_set_scl_clk(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) -{ - struct i2c_adapter *adapter; - struct ocores_i2c *i2c; - int val; - int ret; - int prescale; - - adapter = to_i2c_adapter(dev); - i2c = (struct ocores_i2c *)i2c_get_adapdata(adapter); - ret = kstrtoint(buf, 0, &val); - if (ret) { - return ret; - } - FPGA_I2C_MUTEX_LOCK(i2c->xfer_lock); - prescale = oc_set_scl_clk(i2c, val); - FPGA_I2C_DEBUG_VERBOSE("i2c->base 0x%p, i2c->clock_khz %d, scl clk 0x%x.\n", i2c->base, i2c->clock_khz, prescale); - FPGA_I2C_MUTEX_UNLOCK(i2c->xfer_lock); - return count; -} -static ssize_t show_oc_debug_value(struct device *dev, struct device_attribute *da, char *buf) -{ - oc_debug_dump_reg_exception(); - return 0; -} - -static SENSOR_DEVICE_ATTR(oc_debug, S_IRUGO | S_IWUSR, show_oc_debug_value, NULL, 0x15); -static SENSOR_DEVICE_ATTR(oc_scl_clk, S_IRUGO | S_IWUSR, oc_sysfs_show_scl_clk, oc_sysfs_set_scl_clk, 0); - -static struct attribute *oc_debug_sysfs_attrs[] = { - &sensor_dev_attr_oc_debug.dev_attr.attr, - NULL -}; - -static struct attribute *oc_scl_clk_sysfs_attrs[] = { - &sensor_dev_attr_oc_scl_clk.dev_attr.attr, - NULL -}; - -static const struct attribute_group oc_debug_sysfs_group = { - .attrs = oc_debug_sysfs_attrs, -}; - -static const struct attribute_group oc_scl_clk_sysfs_group = { - .attrs = oc_scl_clk_sysfs_attrs, -}; - -static void oc_scl_clk_sysfs_init(struct i2c_adapter *adap) -{ - int ret; - - ret = sysfs_create_group(&adap->dev.kobj, &oc_scl_clk_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_create_group ret %d.\n", ret); - return; -} - -static void oc_scl_clk_sysfs_exit(struct i2c_adapter *adap) -{ - sysfs_remove_group(&adap->dev.kobj, (const struct attribute_group *)&oc_scl_clk_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_remove_group.\n"); - return; -} - -static void oc_debug_sysfs_init(struct platform_device *pdev) -{ - int ret; - - ret = sysfs_create_group(&pdev->dev.kobj, &oc_debug_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_create_group ret %d.\n", ret); - return; -} - -static void oc_debug_sysfs_exit(struct platform_device *pdev) -{ - sysfs_remove_group(&pdev->dev.kobj, (const struct attribute_group *)&oc_debug_sysfs_group); - FPGA_I2C_DEBUG_VERBOSE("sysfs_remove_group.\n"); - return; -} - -static int rg_ocores_i2c_probe(struct platform_device *pdev) -{ - struct ocores_i2c *i2c; - struct rg_ocores_i2c_platform_data *pdata; - struct resource *res; - int irq; - int ret; - int i; - - FPGA_I2C_DEBUG_VERBOSE("Enter.\n"); - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - FPGA_I2C_DEBUG_ERROR("platform_get_irq failed irq %d.\n", irq); - return irq; - } - - i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); - if (!i2c) { - FPGA_I2C_DEBUG_ERROR("devm_kzalloc failed.\n"); - return -ENOMEM; - } - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - i2c->base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(i2c->base)) { - FPGA_I2C_DEBUG_ERROR("devm_ioremap_resource failed.\n"); - return PTR_ERR(i2c->base); - } - - pdata = dev_get_platdata(&pdev->dev); - if (pdata) { - i2c->reg_shift = pdata->reg_shift; - i2c->reg_io_width = pdata->reg_io_width; - i2c->clock_khz = pdata->clock_khz; - } else { - ret = ocores_i2c_of_probe(pdev, i2c); - if (ret) - return ret; - } - - if (i2c->reg_io_width == 0) - i2c->reg_io_width = 1; /* Set to default value */ - - - if (!i2c->setreg || !i2c->getreg) { - switch (i2c->reg_io_width) { - case 1: - i2c->setreg = oc_setreg_8; - i2c->getreg = oc_getreg_8; - break; - - case 2: - i2c->setreg = oc_setreg_16; - i2c->getreg = oc_getreg_16; - break; - - case 4: - i2c->setreg = oc_setreg_32; - i2c->getreg = oc_getreg_32; - break; - - default: - dev_err(&pdev->dev, "Unsupported I/O width (%d)\n", - i2c->reg_io_width); - return -EINVAL; - } - } - - ocores_init(i2c); - - init_waitqueue_head(&i2c->wait); - ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, - pdev->name, i2c); - if (ret) { - dev_err(&pdev->dev, "Cannot claim IRQ\n"); - return ret; - } - - /* hook up driver to tree */ - platform_set_drvdata(pdev, i2c); - i2c->adap = ocores_adapter; - if (pdata->nr) { - i2c->adap.nr = pdata->nr; - dev_info(&pdev->dev, "fpga ocores nr is (%d), irq %d \n", i2c->adap.nr, irq); - } - i2c_set_adapdata(&i2c->adap, i2c); - i2c->adap.dev.parent = &pdev->dev; - i2c->adap.dev.of_node = pdev->dev.of_node; - - /* add i2c adapter to i2c tree */ - ret = i2c_add_numbered_adapter(&i2c->adap); - if (ret) { - dev_err(&pdev->dev, "Failed to add adapter\n"); - return ret; - } - - /* add in known devices to the bus */ - if (pdata) { - for (i = 0; i < pdata->num_devices; i++) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - i2c_new_client_device(&i2c->adap, pdata->devices + i); -#else - i2c_new_device(&i2c->adap, pdata->devices + i); -#endif - } - } - - oc_debug_sysfs_init(pdev); - oc_scl_clk_sysfs_init(&i2c->adap); - return 0; -} - -static int rg_ocores_i2c_remove(struct platform_device *pdev) -{ - struct ocores_i2c *i2c = platform_get_drvdata(pdev); - - /* disable i2c logic */ - oc_setreg(i2c, OCI2C_CONTROL, oc_getreg(i2c, OCI2C_CONTROL) - & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - /* remove adapter & data */ - oc_scl_clk_sysfs_exit(&i2c->adap); - i2c_del_adapter(&i2c->adap); - oc_debug_sysfs_exit(pdev); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ocores_i2c_suspend(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - return 0; -} - -static int ocores_i2c_resume(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - - ocores_init(i2c); - - return 0; -} - -static SIMPLE_DEV_PM_OPS(ocores_i2c_pm, ocores_i2c_suspend, ocores_i2c_resume); -#define OCORES_I2C_PM (&ocores_i2c_pm) -#else -#define OCORES_I2C_PM NULL -#endif - -static struct platform_driver ocores_i2c_driver = { - .probe = rg_ocores_i2c_probe, - .remove = rg_ocores_i2c_remove, - .driver = { - .owner = THIS_MODULE, - .name = "rg-i2c-ocores", - .of_match_table = ocores_i2c_match, - .pm = OCORES_I2C_PM, - }, -}; - -module_platform_driver(ocores_i2c_driver); - -MODULE_AUTHOR("Peter Korsgaard "); -MODULE_DESCRIPTION("OpenCores I2C bus driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:ocores-i2c"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h deleted file mode 100755 index 1aedd7793c..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_i2c_ocores.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _FPGA_I2C_OCORES_H -#define _FPGA_I2C_OCORES_H - -struct rg_ocores_i2c_platform_data { - u32 reg_shift; /* register offset shift value */ - u32 reg_io_width; /* register io read/write width */ - u32 clock_khz; /* input clock in kHz */ - u8 num_devices; /* number of devices in the devices list */ - struct i2c_board_info const *devices; /* devices connected to the bus */ - int nr; /* i2c bus num */ -}; - -#endif /* _FPGA_I2C_OCORES_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c deleted file mode 100755 index 669198ca59..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.c +++ /dev/null @@ -1,1144 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "fpga_i2c_ocores.h" -#include "fpga_pcie_i2c.h" -#include "fpga_reg_defs.h" - -#include -#include -#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 15, 0) -#include -#else -#include -#endif -#include -#include -#include - - -#ifdef FPGA_PCIE_I2C_DEBUG -#include -#include -#include -#include -#include - -char *enum_log="/home/pciuio-log"; - -void filewrite(char* filename, char* data) -{ - struct file *filp; - mm_segment_t fs; - filp = filp_open(filename, O_RDWR|O_APPEND|O_CREAT, 0644); - if(IS_ERR(filp)) - { - printk("<0>""open file error...\n"); - return; - } - - fs=get_fs(); - set_fs(KERNEL_DS); - filp->f_op->write(filp, data, strlen(data),&filp->f_pos); - set_fs(fs); - filp_close(filp,NULL); -} - -void enum_time_log(char *log) -{ - struct timex txc; - struct rtc_time tm; - char time_str[64]; - int ret = 0; - - do_gettimeofday(&(txc.time)); - rtc_time_to_tm(txc.time.tv_sec,&tm); - memset(time_str, 0x0, 64); - ret = sprintf(time_str, "UTC time:%d-%d-%d %d:%d:%d ", - tm.tm_year+1900, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); - - filewrite(enum_log, time_str); - filewrite(enum_log, log); -} - -void enum_notime_log(char *log) -{ - filewrite(enum_log, log); -} -#else -void enum_time_log(char *log) -{ - return; -} -void enum_notime_log(char *log) -{ - return; -} -#endif - - -static void __iomem *g_fpga_pcie_mem_base = NULL; - -int g_fpga_pcie_debug = 0; -int g_fpga_pcie_error = 0; -int g_fpga_pcie_reset_en = 0; -int ocore_ctl_startbus = 1; -int ocore_ctl_numbers = 14; -module_param(g_fpga_pcie_reset_en, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_pcie_debug, int, S_IRUGO | S_IWUSR); -module_param(g_fpga_pcie_error, int, S_IRUGO | S_IWUSR); -module_param(ocore_ctl_startbus, int, S_IRUGO | S_IWUSR); -module_param(ocore_ctl_numbers, int, S_IRUGO | S_IWUSR); - - -#define FPGA_PCIE_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_fpga_pcie_debug) { \ - printk(KERN_ERR "[FPGA_PCIE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_PCIE_DEBUG_ERROR(fmt, args...) do { \ - if (g_fpga_pcie_error) { \ - printk(KERN_ERR "[FPGA_PCIE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define FPGA_MSI_IRQ_NUM (ocore_ctl_numbers) -#define FPGA_MSI_IRQ_BEGIN (0) -#define FPGA_MSI_IRQ_END ((FPGA_MSI_IRQ_BEGIN) + (FPGA_MSI_IRQ_NUM)) -#define FPGA_I2C_OCORE_START_BASE (0x800) -#define FPGA_I2C_OCORE_END_BASE (0x81f) -#define FPGA_I2C_OCORE_CTRL_SIZE (0x20) -#define FPGA_I2C_OCORE_CTRL_START(id) ((FPGA_I2C_OCORE_START_BASE) + (id) * (FPGA_I2C_OCORE_CTRL_SIZE)) -#define FPGA_I2C_OCORE_CTRL_END(id) ((FPGA_I2C_OCORE_END_BASE) + (id) * (FPGA_I2C_OCORE_CTRL_SIZE)) -#define FPGA_I2C_OCORE_CTRL_IRQ(id) (id) - - -#define DEFINE_FPGA_PCIE_OCORE_DATA(_id) \ - static struct rg_ocores_i2c_platform_data rg_i2c_ocore_pdata_##_id = { \ - .reg_shift = 0, \ - .reg_io_width = 4, \ - .clock_khz = 125000, \ - .num_devices = 0, \ - }; - -DEFINE_FPGA_PCIE_OCORE_DATA(0); -DEFINE_FPGA_PCIE_OCORE_DATA(1); -DEFINE_FPGA_PCIE_OCORE_DATA(2); -DEFINE_FPGA_PCIE_OCORE_DATA(3); -DEFINE_FPGA_PCIE_OCORE_DATA(4); -DEFINE_FPGA_PCIE_OCORE_DATA(5); -DEFINE_FPGA_PCIE_OCORE_DATA(6); -DEFINE_FPGA_PCIE_OCORE_DATA(7); -DEFINE_FPGA_PCIE_OCORE_DATA(8); -DEFINE_FPGA_PCIE_OCORE_DATA(9); -DEFINE_FPGA_PCIE_OCORE_DATA(10); -DEFINE_FPGA_PCIE_OCORE_DATA(11); -DEFINE_FPGA_PCIE_OCORE_DATA(12); -DEFINE_FPGA_PCIE_OCORE_DATA(13); -DEFINE_FPGA_PCIE_OCORE_DATA(14); -DEFINE_FPGA_PCIE_OCORE_DATA(15); -DEFINE_FPGA_PCIE_OCORE_DATA(16); -DEFINE_FPGA_PCIE_OCORE_DATA(17); -DEFINE_FPGA_PCIE_OCORE_DATA(18); -DEFINE_FPGA_PCIE_OCORE_DATA(19); -DEFINE_FPGA_PCIE_OCORE_DATA(20); -DEFINE_FPGA_PCIE_OCORE_DATA(21); -DEFINE_FPGA_PCIE_OCORE_DATA(22); -DEFINE_FPGA_PCIE_OCORE_DATA(23); -DEFINE_FPGA_PCIE_OCORE_DATA(24); -DEFINE_FPGA_PCIE_OCORE_DATA(25); -DEFINE_FPGA_PCIE_OCORE_DATA(26); -DEFINE_FPGA_PCIE_OCORE_DATA(27); - -#define DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(_id) \ - static const struct resource fpga_pcie_i2c_ocores_resources_##_id[] = { \ - { \ - .start = FPGA_I2C_OCORE_CTRL_START(_id), \ - .end = FPGA_I2C_OCORE_CTRL_END(_id), \ - .flags = IORESOURCE_MEM, \ - }, \ - { \ - .start = FPGA_I2C_OCORE_CTRL_IRQ(_id), \ - .end = FPGA_I2C_OCORE_CTRL_IRQ(_id), \ - .flags = IORESOURCE_IRQ, \ - }, \ - } - -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(0); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(1); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(2); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(3); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(4); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(5); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(6); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(7); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(8); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(9); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(10); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(11); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(12); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(13); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(14); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(15); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(16); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(17); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(18); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(19); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(20); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(21); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(22); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(23); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(24); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(25); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(26); -DEFINE_FPGA_PCIE_I2C_OCORE_RESOURCES(27); - -#define DEFINE_FPGA_PCIE_MFD_CELL_CFG(_id) \ -{ \ - .name = "rg-i2c-ocores", \ - .id = (_id), \ - .num_resources = ARRAY_SIZE(fpga_pcie_i2c_ocores_resources_##_id), \ - .resources = fpga_pcie_i2c_ocores_resources_##_id, \ - .platform_data = &rg_i2c_ocore_pdata_##_id, \ - .pdata_size = sizeof(rg_i2c_ocore_pdata_##_id), \ -} - - -static const struct mfd_cell fpga_pcie_cells_bar0_cfg0[] = { - DEFINE_FPGA_PCIE_MFD_CELL_CFG(0), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(1), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(2), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(3), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(4), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(5), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(6), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(7), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(8), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(9), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(10), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(11), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(12), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(13), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(14), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(15), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(16), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(17), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(18), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(19), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(20), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(21), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(22), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(23), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(24), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(25), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(26), - DEFINE_FPGA_PCIE_MFD_CELL_CFG(27), -}; - -struct rgde_dev { - struct uio_info info; - struct pci_dev *pdev; - struct list_head list; - enum xdk_intr_mode mode; -}; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) -/* XXX taken from uio.c, just for dumping */ -struct uio_device { - struct module *owner; - struct device *dev; - int minor; - atomic_t event; - struct fasync_struct *async_queue; - wait_queue_head_t wait; - struct uio_info *info; - struct kobject *map_dir; - struct kobject *portio_dir; -}; -#else -/* do noting add tjm */ -#endif - - -static char *intr_mode; -static enum xdk_intr_mode intr_mode_preferred = XDK_INTR_MODE_MSIX; - - -static struct list_head rgde_dev_que; - -static int rgde_dev_list_dump(void) -{ - char str[256]; - struct rgde_dev *node, *tmp; - struct uio_device *udev; - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - udev = node->info.uio_dev; - memset(str, 0x0, 256); - sprintf(str, "pciuio device minor:%d\n", udev->minor); - enum_notime_log(str); - } - return 0; -} - -void rgde_dev_que_add(struct rgde_dev *uiodev) -{ - struct rgde_dev *node, *tmp; - - if (uiodev == NULL) { - return; - } - - if (list_empty(&rgde_dev_que)) { - list_add(&uiodev->list, &rgde_dev_que); - return; - } - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor > ((uiodev->info).uio_dev)->minor) { - break; - } - } - list_add_tail(&uiodev->list, &node->list); - - return; -} - - -void rgde_dev_que_del(struct rgde_dev *uiodev) -{ - struct rgde_dev *node, *tmp; - - if (uiodev == NULL) { - return; - } - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == ((uiodev->info).uio_dev)->minor) { - list_del(&node->list); - break; - } - } - - return; -} - - -struct pci_dev *rgde_to_pci_device(int minor) -{ - - struct rgde_dev *node, *tmp; - - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (node->info.uio_dev->minor == minor) { - return node->pdev; - } - - if (node->info.uio_dev->minor < minor) { - return NULL; - } - } - - return NULL; -} -EXPORT_SYMBOL(rgde_to_pci_device); - -int pkt_get_mod(int logic_dev, int *mod) -{ - *mod = 0; - return 0; -} -EXPORT_SYMBOL(pkt_get_mod); - -int pkt_get_port(int logic_dev, int *port) -{ - *port = 1; - return 0; -} -EXPORT_SYMBOL(pkt_get_port); - -static int rgde_intr_mode_config(char *intr_str) -{ -#if 0 - /* default intr mode : msix */ - if (!intr_str) { - return 0; - } - - if (!strcmp(intr_str, INTR_MODE_MSIX_NAME)) { - intr_mode_preferred = XDK_INTR_MODE_MSIX; - return 0; - } - - if (!strcmp(intr_str, INTR_MODE_LEGACY_NAME)) { - intr_mode_preferred = XDK_INTR_MODE_LEGACY; - return 0; - } - - /* For now, msix & legacy mode supported only. */ - printk("<0>""Error: bad parameter - %s\n", intr_str); - return -EINVAL; -#else - intr_mode_preferred = XDK_INTR_MODE_LEGACY; - return 0; -#endif -} - -/* Remap pci resources described by bar #pci_bar in uio resource n. */ -static int rgde_setup_iomem(struct pci_dev *dev, struct uio_info *info, - int n, int pci_bar, const char *name) -{ - unsigned long addr, len; - void *internal_addr; - - if (n >= ARRAY_SIZE(info->mem)) { - return -EINVAL; - } - - addr = pci_resource_start(dev, pci_bar); - FPGA_PCIE_DEBUG_VERBOSE("iomem phys addr:%lx\n", addr); - len = pci_resource_len(dev, pci_bar); - if (addr == 0 || len == 0) { - return -1; - } - - - internal_addr = ioremap(addr, len); - FPGA_PCIE_DEBUG_VERBOSE("iomem phys addr:0x%lx, len 0x%lx, internal_addr %p.\n", addr, len, internal_addr); - - if (internal_addr == NULL) { - return -1; - } - - FPGA_PCIE_DEBUG_VERBOSE("iomem internal_addr:%p\n", internal_addr); - if (pci_bar == 0) { - - g_fpga_pcie_mem_base = internal_addr; - FPGA_PCIE_DEBUG_VERBOSE("pci_bar %d, set g_fpga_pcie_mem_base %p\n", pci_bar, g_fpga_pcie_mem_base); - } - info->mem[n].name = name; - info->mem[n].addr = addr; - info->mem[n].internal_addr = internal_addr; - info->mem[n].size = len; - info->mem[n].memtype = UIO_MEM_PHYS; - - return 0; -} - -/* Unmap previously ioremap'd resources */ -static void rgde_release_iomem(struct uio_info *info) -{ - int i; - - for (i = 0; i < MAX_UIO_MAPS; i++) { - if (info->mem[i].internal_addr) { - iounmap(info->mem[i].internal_addr); - } - } -} - -/* Get pci port io resources described by bar #pci_bar in uio resource n. */ -static int rgde_setup_ioport(struct pci_dev *dev, struct uio_info *info, - int n, int pci_bar, const char *name) -{ - unsigned long addr, len; - - if (n >= ARRAY_SIZE(info->port)) { - return -EINVAL; - } - - addr = pci_resource_start(dev, pci_bar); - len = pci_resource_len(dev, pci_bar); - if (addr == 0 || len == 0) { - return -EINVAL; - } - - info->port[n].name = name; - info->port[n].start = addr; - info->port[n].size = len; - /* skl : FIX me */ - info->port[n].porttype = UIO_PORT_X86; - - return 0; -} - -static int rgde_setup_bars(struct pci_dev *dev, struct uio_info *info) -{ - int i, iom, iop, ret; - unsigned long flags; - static const char *bar_names[PCI_STD_RESOURCE_END + 1] = { - "BAR0", "BAR1", "BAR2", "BAR3", "BAR4", "BAR5", - }; - iom = 0; - iop = 0; - - for (i = 0; i < ARRAY_SIZE(bar_names); i++) { - if (pci_resource_len(dev, i) != 0 && pci_resource_start(dev, i) != 0) { - - flags = pci_resource_flags(dev, i); - FPGA_PCIE_DEBUG_VERBOSE("flags:%lx\n", flags); - if (flags & IORESOURCE_MEM) { - ret = rgde_setup_iomem(dev, info, iom, i, bar_names[i]); - if (ret != 0) { - return ret; - } - iom++; - } else if (flags & IORESOURCE_IO) { - ret = rgde_setup_ioport(dev, info, iop, i, bar_names[i]); - if (ret != 0) { - return ret; - } - iop++; - } - } - } - - return (iom != 0 || iop != 0) ? ret : -ENOENT; -} - -/** - * This is interrupt handler which will check if the interrupt is for the right device. - * If yes, disable it here and will be enable later. - */ -static irqreturn_t rgde_irqhandler(int irq, struct uio_info *info) -{ - struct rgde_dev *udev = info->priv; - - if (udev->mode == XDK_INTR_MODE_LEGACY /*&& !pci_check_and_mask_intx(udev->pdev)*/) { - return IRQ_NONE; - } - - return IRQ_HANDLED; -} - -/* - * It masks the msix on/off of generating MSI-X messages. - */ -static void rgde_msix_mask_irq(struct msi_desc *desc, int32_t state) -{ - u32 mask_bits = desc->masked; - unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_VECTOR_CTRL; - - if (state != 0) { - mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; - } else { - mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; - } - - if (mask_bits != desc->masked) { - writel(mask_bits, desc->mask_base + offset); - readl(desc->mask_base); - desc->masked = mask_bits; - } -} - -/** - * This is the irqcontrol callback to be registered to uio_info. - * It can be used to disable/enable interrupt from user space processes. - * - * @param info - * pointer to uio_info. - * @param irq_state - * state value. 1 to enable interrupt, 0 to disable interrupt. - * - * @return - * - On success, 0. - * - On failure, a negative value. - */ -static int rgde_irqcontrol(struct uio_info *info, s32 irq_state) -{ - struct rgde_dev *udev = info->priv; - struct pci_dev *pdev = udev->pdev; - - /* pci_cfg_access_lock(pdev); */ - - if (udev->mode == XDK_INTR_MODE_LEGACY) { - pci_intx(pdev, !!irq_state); - } else if (udev->mode == XDK_INTR_MODE_MSIX) { - struct msi_desc *desc; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)) - list_for_each_entry(desc, &pdev->msi_list, list) { - rgde_msix_mask_irq(desc, irq_state); - } -#else - list_for_each_entry(desc, &pdev->dev.msi_list, list) { - rgde_msix_mask_irq(desc, irq_state); - } -#endif - } - - //pci_cfg_access_unlock(pdev); - - return 0; -} - -int rgde_reg32_read(int minor, uint64_t offset, uint32_t *data) -{ - struct rgde_dev *node, *tmp; - struct rgde_dev *uiodev; - - FPGA_PCIE_DEBUG_VERBOSE("enter rgde_reg32_read\n"); - uiodev = NULL; - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == minor) { - uiodev = node; - break; - } - } - - if (uiodev == NULL) { - return -1; - } - - if (uiodev->info.mem[0].internal_addr == NULL) { - return -1; - } - -#if 0 - FPGA_PCIE_DEBUG_VERBOSE("internal_addr:%x\n", uiodev->info.mem[0].internal_addr); - - memcpy(ioval, (uint8_t *)uiodev->info.mem[0].internal_addr + offset, sizeof(ioval)); - for (i = 0; i < sizeof(ioval); i++) { - FPGA_PCIE_DEBUG_VERBOSE("mem[%x]:%02x\n", (uint32_t)(offset + i), ioval[i]); - } -#endif - - *data = (*((uint32_t *)((uint8_t *)(uiodev->info.mem[0].internal_addr) + offset))); - return 0; -} -EXPORT_SYMBOL(rgde_reg32_read); - -int rgde_reg32_write(int minor, uint64_t offset, uint32_t data) -{ - struct rgde_dev *node, *tmp; - struct rgde_dev *uiodev; - - uiodev = NULL; - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == minor) { - uiodev = node; - break; - } - } - - if (uiodev == NULL) { - return -1; - } - - if (uiodev->info.mem[0].internal_addr == NULL) { - return -1; - } - - FPGA_PCIE_DEBUG_VERBOSE("enter rgde_reg32_write\n"); - FPGA_PCIE_DEBUG_VERBOSE("internal_addr:%p,offset:%llx,data:%x\n", uiodev->info.mem[0].internal_addr, offset, data); - - *((uint32_t *)((uint8_t *)(uiodev->info.mem[0].internal_addr) + offset)) = (data); - FPGA_PCIE_DEBUG_VERBOSE("rgde_reg32_write ok!\n"); - return 0; -} -EXPORT_SYMBOL(rgde_reg32_write); - -#if 0 -static void rgde_dump_global_regs(int minor) -{ - struct rgde_dev *node, *tmp; - struct rgde_dev *uiodev; - uint8_t ioval[4]; - int i, j; - - - uiodev = NULL; - list_for_each_entry_safe(node, tmp, &rgde_dev_que, list) { - if (((node->info).uio_dev)->minor == minor) { - uiodev = node; - break; - } - } - - if (uiodev == NULL) { - return ; - } - - if (uiodev->info.mem[0].internal_addr == NULL) { - return ; - } - - FPGA_PCIE_DEBUG_VERBOSE("internal_addr:%p\n", uiodev->info.mem[0].internal_addr); - for (j = 0; j < sizeof(uint32_t) * 6; j += sizeof(uint32_t)) { - memcpy(ioval, (uint8_t *)uiodev->info.mem[0].internal_addr + j, sizeof(ioval)); - for (i = 0; i < sizeof(ioval); i++) { - FPGA_PCIE_DEBUG_VERBOSE("mem[%d]:%02x\n", (uint32_t)(j + i), ioval[i]); - } - } - - return; -} -#endif - -#if 1 - -#define FPGA_PCIE_TEST_REG (0x08) -#define FPGA_PCIE_TEST_VAL (0x5A) - -#define FPGA_PCIE_RESET_PCA9548_BASE (0x20) -#define FPGA_PCIE_RESET_PCA9548_NUM (0x4) -#define FPGA_PCIE_RESET_OCORE_BASE (0x100) -#define FPGA_PCIE_RESET_OCORE_NUM (ocore_ctl_numbers) - -#define FPGA_PCIE_RESET_CPLD_I2C_BASE (0x40) -#define FPGA_PCIE_RESET_CPLD_I2C_NUM (0x4) - - -#define FPGA_PCIE_REG_STEP (0x4) - -#define DFD_CPLD_I2C_RETRY_TIMES 3 -#define DFD_CPLD_I2C_RETRY_DELAY 100 /* ms */ - -#define PCA9548_MAX_CPLD_NUM (32) - -typedef struct fpga_pcie_pca9548_cfg_info_s { - int pca9548_bus; - int pca9548_addr; - int cfg_offset; -} fpga_pcie_pca9548_cfg_info_t; - -typedef struct fpga_pcie_card_info_s { - int dev_type; - fpga_pcie_pca9548_cfg_info_t pca9548_cfg_info[PCA9548_MAX_CPLD_NUM]; -} fpga_pcie_card_info_t; - -static fpga_pcie_card_info_t g_fpga_pcie_card_info[] = { - { - /* RA-B6510-32C */ - .dev_type = 0x404b, - .pca9548_cfg_info = { - { - .pca9548_bus = 12, - .pca9548_addr = 0x70, - .cfg_offset = 0x20, - }, - { - .pca9548_bus = 12, - .pca9548_addr = 0x71, - .cfg_offset = 0x20, - }, - { - .pca9548_bus = 12, - .pca9548_addr = 0x72, - .cfg_offset = 0x20, - }, - { - .pca9548_bus = 12, - .pca9548_addr = 0x73, - .cfg_offset = 0x20, - }, - }, - }, -}; - -extern void pca954x_hw_do_reset_func_register(void* func); -extern int dfd_get_my_card_type(void); - -static void fpga_pcie_setreg_32(int offset, u32 data) -{ - if (g_fpga_pcie_mem_base) { - *((uint32_t *)((uint8_t *)(g_fpga_pcie_mem_base) + offset)) = (data); - } else { - FPGA_PCIE_DEBUG_ERROR("g_fpga_pcie_mem_base is null.\n"); - } - return; -} - - -static inline u32 fpga_pcie_getreg_32(int offset) -{ - u32 data = 0; - - if (g_fpga_pcie_mem_base) { - data = (*((uint32_t *)((uint8_t *)(g_fpga_pcie_mem_base) + offset))); - } else { - FPGA_PCIE_DEBUG_ERROR("g_fpga_pcie_mem_base is null.\n"); - } - return data; -} - -static void fpga_do_cpld_i2c_ctrl(int en) -{ -#if 0 - int i; - int offset; - - for (i = 0; i < FPGA_PCIE_RESET_CPLD_I2C_NUM; i++) { - offset = FPGA_PCIE_RESET_CPLD_I2C_BASE + i * FPGA_PCIE_REG_STEP; - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); - } -#endif - return; -} - - -static void fpga_do_ocore_ctrl(int en) -{ - int i; - int offset; - - for (i = 0; i < FPGA_PCIE_RESET_OCORE_NUM; i++) { - offset = FPGA_PCIE_RESET_OCORE_BASE + i * FPGA_PCIE_REG_STEP; - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); - } -} - -static void fpga_do_9548_ctrl(int en) -{ - int i; - int offset; - - for (i = 0; i < FPGA_PCIE_RESET_PCA9548_NUM; i++) { - offset = FPGA_PCIE_RESET_PCA9548_BASE + i * FPGA_PCIE_REG_STEP; - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); - } - -} - -static void fpga_reset_ocore_i2c(void) -{ - u32 data; - - - if (g_fpga_pcie_reset_en == 0) { - FPGA_PCIE_DEBUG_VERBOSE("g_fpga_pcie_reset_en is 0, do nothing.\n"); - return; - } - - data = fpga_pcie_getreg_32(FPGA_PCIE_TEST_REG); - FPGA_PCIE_DEBUG_VERBOSE("BEGIN FPGA_PCIE_TEST_REG=[0x%x], write 0x%x.\n", data, FPGA_PCIE_TEST_VAL); - fpga_pcie_setreg_32(FPGA_PCIE_TEST_REG, FPGA_PCIE_TEST_VAL); - data = fpga_pcie_getreg_32(FPGA_PCIE_TEST_REG); - FPGA_PCIE_DEBUG_VERBOSE("END FPGA_PCIE_TEST_REG=[0x%x].\n", data); - - - - fpga_do_9548_ctrl(0); - fpga_do_ocore_ctrl(0); - fpga_do_cpld_i2c_ctrl(0); - - mdelay(500); - - - fpga_do_9548_ctrl(1); - fpga_do_ocore_ctrl(1); - fpga_do_cpld_i2c_ctrl(1); - - return; -} - -static void fpga_do_pca9548_reset_ctrl(int offset, int en) -{ - FPGA_PCIE_DEBUG_VERBOSE("offset 0x%x, write en 0x%x.\n", offset, en); - fpga_pcie_setreg_32(offset, en); -} - -fpga_pcie_card_info_t* fpga_pcie_get_card_info(int dev_type) -{ - int i; - int size; - - size = ARRAY_SIZE(g_fpga_pcie_card_info); - - FPGA_PCIE_DEBUG_VERBOSE("Enter dev_type 0x%x size %d.\n", dev_type, size); - for (i = 0; i < size; i++) { - if (g_fpga_pcie_card_info[i].dev_type == dev_type) { - FPGA_PCIE_DEBUG_VERBOSE("match dev_type 0x%x.\n", dev_type); - return &g_fpga_pcie_card_info[i]; - } - } - - FPGA_PCIE_DEBUG_VERBOSE("dismatch dev_type 0x%x.\n", dev_type); - return NULL; -} - -fpga_pcie_pca9548_cfg_info_t* fpga_pcie_get_pca9548_cfg_info(int bus, int addr) -{ - int dev_type; - fpga_pcie_card_info_t *info; - fpga_pcie_pca9548_cfg_info_t *pca9548_cfg_info; - int i; - int size; - - dev_type = dfd_get_my_card_type(); - if (dev_type < 0) { - FPGA_PCIE_DEBUG_ERROR("drv_get_my_dev_type failed ret %d.\n", dev_type); - return NULL; - } - - info = fpga_pcie_get_card_info(dev_type); - if (info == NULL) { - FPGA_PCIE_DEBUG_ERROR("fpga_pcie_get_card_info dev_type %d failed.\n", dev_type); - return NULL; - } - - size = PCA9548_MAX_CPLD_NUM; - for (i = 0; i < size; i++) { - pca9548_cfg_info = &(info->pca9548_cfg_info[i]); - if ((pca9548_cfg_info->pca9548_bus == bus) && (pca9548_cfg_info->pca9548_addr == addr)) { - FPGA_PCIE_DEBUG_VERBOSE("match dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return pca9548_cfg_info; - } - } - - FPGA_PCIE_DEBUG_VERBOSE("dismatch dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return NULL; -} - - -void fpga_do_pca954x_reset_func(int bus, int addr) -{ - fpga_pcie_pca9548_cfg_info_t *cfg_info; - - cfg_info = fpga_pcie_get_pca9548_cfg_info(bus, addr); - if (cfg_info == NULL) { - FPGA_PCIE_DEBUG_VERBOSE("fpga_do_pca954x_reset_func do nothing.\n"); - return; - } - - FPGA_PCIE_DEBUG_VERBOSE("bus %d addr 0x%x, cfg_info.offset:0x%x.\n", bus, addr, cfg_info->cfg_offset); - - fpga_do_pca9548_reset_ctrl(cfg_info->cfg_offset, 0); - mdelay(250); - fpga_do_pca9548_reset_ctrl(cfg_info->cfg_offset, 1); -} - -static void fpga_do_pca954x_reset_func_reg(void) -{ - pca954x_hw_do_reset_func_register(fpga_do_pca954x_reset_func); -} - -#endif - - -static int fpga_i2c_ocore_device_init(struct pci_dev *pdev, const struct pci_device_id *id) -{ - int ret, index; - struct rg_ocores_i2c_platform_data *init_nr_ocores; - - for (index = 0 ; index < ARRAY_SIZE(fpga_pcie_cells_bar0_cfg0); index++) { - init_nr_ocores = fpga_pcie_cells_bar0_cfg0[index].platform_data; - init_nr_ocores->nr = ocore_ctl_startbus + index; - } - FPGA_PCIE_DEBUG_VERBOSE("Enter.\n"); - FPGA_PCIE_DEBUG_VERBOSE("Begin mfd_add_devices.\n"); - ret = mfd_add_devices(&pdev->dev, 0, - fpga_pcie_cells_bar0_cfg0, - ocore_ctl_numbers > ARRAY_SIZE(fpga_pcie_cells_bar0_cfg0) ? ARRAY_SIZE(fpga_pcie_cells_bar0_cfg0) : ocore_ctl_numbers , - &pdev->resource[0], pdev->irq, NULL); - FPGA_PCIE_DEBUG_VERBOSE("End mfd_add_devices ret %d.\n", ret); - if (ret) { - dev_err(&pdev->dev, "mfd_add_devices failed: %d\n", ret); - return -1; - } - - fpga_do_pca954x_reset_func_reg(); - FPGA_PCIE_DEBUG_VERBOSE("Call fpga_do_pca954x_reset_func_reg.\n"); - return 0; -} - -static void fpga_pcie_recover(struct pci_dev *pdev, const struct pci_device_id *id) -{ - struct resource *mem_base; - u32 bar0_val; - int ret; - - mem_base = &pdev->resource[0]; - ret = pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &bar0_val); - if (ret) { - FPGA_PCIE_DEBUG_ERROR("pci_read_config_dword failed ret %d.\n", ret); - return; - } - FPGA_PCIE_DEBUG_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], ret %d.\n", - mem_base->start, bar0_val, ret); - - if (bar0_val != mem_base->start) { - ret = pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, mem_base->start); - if (ret) { - FPGA_PCIE_DEBUG_ERROR("pci_write_config_dword mem_base->start[0x%llx], failed ret %d.\n", mem_base->start, ret); - return; - } - FPGA_PCIE_DEBUG_VERBOSE("pci_write_config_dword mem_base->start[0x%llx] success.\n", mem_base->start); - } else { - FPGA_PCIE_DEBUG_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], do nothing.\n", - mem_base->start, bar0_val); - } -} - -static int fpga_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) -{ - int err; - struct rgde_dev *rdev = NULL; - - FPGA_PCIE_DEBUG_VERBOSE("Enter vendor 0x%x, subsystem_vendor 0x%x.\n", pdev->vendor, pdev->subsystem_vendor); - - /* skl : FIX me */ - /* - if ((pdev->vendor != ) || (pdev->subsystem_vendor != )) { - err = -ENODEV; - goto dev_suppport_err:; - }*/ - - - fpga_pcie_recover(pdev, id); - - /* enable device: ask low-level code to enable I/O and memory */ - FPGA_PCIE_DEBUG_VERBOSE("start pci_enable_device!\n"); - err = pci_enable_device(pdev); - if (err) { - FPGA_PCIE_DEBUG_ERROR("pci_enable_device failed: %d\n", err); - goto dev_ebable_err; - } - - FPGA_PCIE_DEBUG_VERBOSE("start pci_set_master!\n"); - pci_set_master(pdev); - - rdev = kzalloc(sizeof(struct rgde_dev), GFP_KERNEL); - if (!rdev) { - err = -ENOMEM; - goto kzalloc_err; - } - - - FPGA_PCIE_DEBUG_VERBOSE("start rgde_setup_bars!\n"); - err = rgde_setup_bars(pdev, &rdev->info); - if (err != 0) { - goto setup_bars_err; - } - - rdev->info.name = "fpga_pcie"; - rdev->info.version = "0.1"; - rdev->info.handler = rgde_irqhandler; - rdev->info.irqcontrol = rgde_irqcontrol; - rdev->info.priv = rdev; - rdev->pdev = pdev; - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) - err = pci_alloc_irq_vectors(pdev,FPGA_MSI_IRQ_BEGIN + 1, ocore_ctl_numbers, PCI_IRQ_MSI); -#else - err = pci_enable_msi_range(pdev, FPGA_MSI_IRQ_BEGIN + 1, ocore_ctl_numbers); -#endif - if (err != ocore_ctl_numbers) { - FPGA_PCIE_DEBUG_ERROR("pci_enable_msi_block err %d FPGA_MSI_IRQ_NUM %d.\n", err, - ocore_ctl_numbers); - goto uio_register_err; - } - - FPGA_PCIE_DEBUG_VERBOSE("before pci_set_drvdata.\n"); - - pci_set_drvdata(pdev, rdev); - FPGA_PCIE_DEBUG_VERBOSE("after pci_set_drvdata.\n"); - enum_time_log("rgde_dev_que_add\n"); - - mdelay(100); - - fpga_reset_ocore_i2c(); - - fpga_i2c_ocore_device_init(pdev, id); - return 0; - -uio_register_err: - /* udev_irq_err: */ -setup_bars_err: - rgde_release_iomem(&rdev->info); - pci_disable_msi(rdev->pdev); - pci_release_regions(pdev); - kfree(rdev); -kzalloc_err: - /* request_region_err: */ - pci_disable_device(pdev); -dev_ebable_err: - /* dev_suppport_err: */ - return err; -} - -static void fpga_pcie_remove(struct pci_dev *pdev) -{ - struct rgde_dev *rdev = pci_get_drvdata(pdev); - - FPGA_PCIE_DEBUG_VERBOSE("fpga_pcie_remove.\n"); -#if 0 - enum_time_log("rgde_dev_que_del\n"); - printk("<0>""uio device %d del.\n", rdev->info.uio_dev->minor); -#endif - rgde_dev_que_del(rdev); - rgde_dev_list_dump(); -#if 0 - uio_unregister_device(&rdev->info); -#endif - mfd_remove_devices(&pdev->dev); - rgde_release_iomem(&rdev->info); - pci_disable_msi(rdev->pdev); - //pci_release_regions(pdev); - pci_disable_device(pdev); - kfree(rdev); -} - -/* static DEFINE_PCI_DEVICE_TABLE(fpga_pci_ids) = { */ - -static const struct pci_device_id fpga_pci_ids[] = { - { PCI_DEVICE(0x10ee, 0x7022)}, - {0} -}; -MODULE_DEVICE_TABLE(pci, fpga_pci_ids); - - -static struct pci_driver fpga_pcie_driver = { - .name = "fpga_pcie", - .id_table = fpga_pci_ids,/* only dynamic id's */ - .probe = fpga_pcie_probe, - .remove = fpga_pcie_remove, -}; - -static int __init fpga_pcie_init(void) -{ - int ret; - - FPGA_PCIE_DEBUG_VERBOSE("fpga_pcie_init enter!\n"); - ret = rgde_intr_mode_config(intr_mode); - if (ret < 0) { - return ret; - } - - INIT_LIST_HEAD(&rgde_dev_que); - - return pci_register_driver(&fpga_pcie_driver); -} - -static void __exit fpga_pcie_exit(void) -{ - FPGA_PCIE_DEBUG_VERBOSE("fpga_pcie_exit enter!\n"); - pci_unregister_driver(&fpga_pcie_driver); -} - -module_init(fpga_pcie_init); -module_exit(fpga_pcie_exit); -module_param(intr_mode, charp, S_IRUGO); -MODULE_PARM_DESC(intr_mode, - "pci_uio interrupt mode (default=msix):\n" - " " INTR_MODE_MSIX_NAME " Use MSIX interrupt\n" - " " INTR_MODE_LEGACY_NAME " Use Legacy interrupt\n" - "\n"); -MODULE_DESCRIPTION("UIO Driver for PCI Devices"); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("support "); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h deleted file mode 100755 index 1ea970cc22..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_pcie_i2c.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef _FPGA_PCIE_I2C_H_ -#define _FPGA_PCIE_I2C_H_ - -#ifdef __KERNEL__ -#include -#else -#include -#endif - -#define ENUM_MAX_DEVS (255) - -typedef enum { - CHIP_NONE, - CHIP_PC, -} chiptype_t; - -/* bitmap for ports, 256 ports for now. */ -typedef struct portbitmap_s { - uint8_t bit[32]; -} portbitmap_t; - -typedef struct pc_info_s { - uint8_t ntables; /* number of flow tables */ - uint8_t ncores; /* number of cores */ - uint8_t npipelines; /* number of pipelines */ - uint8_t nports; /* number of ports */ - portbitmap_t pbm_caui; /* bitmap for CAUI ports */ - portbitmap_t pbm_ge; /* bitmap for GE ports */ -} pc_info_t; - -/** - * A structure describing a PCI resource. - */ -struct pci_resource { - uint64_t phys_addr; /**< Physical address, 0 if no resource. */ - uint64_t len; /**< Length of the resource. */ - void *addr; /**< Virtual address, NULL when not mapped. */ -}; - -/** Maximum number of PCI resources. */ -#define PCI_MAX_RESOURCE 6 - -/** Nb. of values in PCI resource format. */ -#define PCI_RESOURCE_FMT_NVAL 3 - -#if 0 -/** IO resource type: memory address space */ -#define IORESOURCE_MEM 0x00000200 -#endif - -typedef struct chipinfo_s { - /* PCI ID */ - uint16_t vendor; - uint16_t dev; - uint8_t rev; - - /* chip properties */ - chiptype_t type; - pc_info_t pc_info; /* if type == CHIP_PC */ -} chipinfo_t; - -typedef struct devinfo_s { - /* static info */ - chipinfo_t chipinfo; - - /* running states */ - uint32_t uiono; /* the "X" in /dev/uioX */ - char *pci_conf_file; /* /sys/devices/ */ - char *dev_file; /* /dev/uioX */ - - struct pci_resource mem_resource[PCI_MAX_RESOURCE]; /**< PCI Memory Resource */ - - uint32_t n_mems; /* no of mem-mapped regions, MUST BE 1 for now */ - uint32_t n_ports;/* no of port-maped regions, MUST BE 0 for now */ -} devinfo_t; - - -#ifdef __KERNEL__ -#include - -struct pci_dev *rgde_to_pci_device(int index); - -int rgde_reg32_read(int minor, uint64_t offset, uint32_t *data); - -int rgde_reg32_write(int minor, uint64_t offset, uint32_t data); - -int pkt_get_mod(int logic_dev, int *mod); - -int pkt_get_port(int logic_dev, int *port); - -/* interrupt mode */ -enum xdk_intr_mode { - XDK_INTR_MODE_NONE = 0, - XDK_INTR_MODE_LEGACY, - XDK_INTR_MODE_MSI, - XDK_INTR_MODE_MSIX -}; - -#define INTR_MODE_NONE_NAME "none" -#define INTR_MODE_LEGACY_NAME "legacy" -#define INTR_MODE_MSI_NAME "msi" -#define INTR_MODE_MSIX_NAME "msix" - -#endif /*__KERNEL__ */ - - -#endif /* _FPGA_PCIE_I2C_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h deleted file mode 100755 index f80c631856..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/fpga_reg_defs.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef _FPGA_REG_DEFS_H_ -#define _FPGA_REG_DEFS_H_ - -/** Define Registers */ -/* Global Registers */ -#define RGDE_REG_GLOBAL_BASE 0x00000000 -#define RGDE_REG_VERSION (RGDE_REG_GLOBAL_BASE + 0x00) -#define RGDE_REG_DATE (RGDE_REG_GLOBAL_BASE + 0x04) -#define RGDE_REG_TEST (RGDE_REG_GLOBAL_BASE + 0x08) -#define RGDE_REG_INT_ENABLE (RGDE_REG_GLOBAL_BASE + 0x10) -#define RGDE_REG_INT_STATUS (RGDE_REG_GLOBAL_BASE + 0x14) - -/* MDIO Registers */ -#define RGDE_REG_MDIO_BASE 0x00000100 -#define RGDE_REG_MDIO_CFG_DT (RGDE_REG_MDIO_BASE + 0x00) -#define RGDE_REG_MDIO_CFG_SPEED (RGDE_REG_MDIO_BASE + 0x04) -#define RGDE_REG_MDIO_CFG_START (RGDE_REG_MDIO_BASE + 0x08) -#define RGDE_REG_MDIO_RDAT (RGDE_REG_MDIO_BASE + 0x10) -#define RGDE_REG_MDIO_STATUS (RGDE_REG_MDIO_BASE + 0x14) - -/* GE0 PORT Registers */ -#define RGDE_REG_GE0_PORT_BASE 0x00001000 -#define RGDE_REG_GE0_PORT_CTL (RGDE_REG_GE0_PORT_BASE + 0x00) -#define RGDE_REG_GE0_PORT_STA (RGDE_REG_GE0_PORT_BASE + 0x04) -#define RGDE_REG_GE0_PORT_MTU (RGDE_REG_GE0_PORT_BASE + 0x08) -#define RGDE_REG_GE0_PORT_RXPKTS (RGDE_REG_GE0_PORT_BASE + 0x10) -#define RGDE_REG_GE0_PORT_RXBYTE (RGDE_REG_GE0_PORT_BASE + 0x18) -#define RGDE_REG_GE0_PORT_RXERR (RGDE_REG_GE0_PORT_BASE + 0x20) -#define RGDE_REG_GE0_PORT_RXDROP (RGDE_REG_GE0_PORT_BASE + 0x28) -#define RGDE_REG_GE0_PORT_RXMULTI (RGDE_REG_GE0_PORT_BASE + 0x30) -#define RGDE_REG_GE0_PORT_RXBRO (RGDE_REG_GE0_PORT_BASE + 0x38) -#define RGDE_REG_GE0_PORT_TXPKTS (RGDE_REG_GE0_PORT_BASE + 0x40) -#define RGDE_REG_GE0_PORT_TXBYTE (RGDE_REG_GE0_PORT_BASE + 0x48) -#define RGDE_REG_GE0_PORT_TXERR (RGDE_REG_GE0_PORT_BASE + 0x50) -#define RGDE_REG_GE0_PORT_TXDROP (RGDE_REG_GE0_PORT_BASE + 0x58) -#define RGDE_REG_GE0_PORT_TXMULT (RGDE_REG_GE0_PORT_BASE + 0x60) -#define RGDE_REG_GE0_PORT_TXBRO (RGDE_REG_GE0_PORT_BASE + 0x68) - -/* GE1 PORT Registers */ -#define RGDE_REG_GE1_PORT_BASE 0x00001100 -#define RGDE_REG_GE1_PORT_CTL (RGDE_REG_GE1_PORT_BASE + 0x00) -#define RGDE_REG_GE1_PORT_STA (RGDE_REG_GE1_PORT_BASE + 0x04) -#define RGDE_REG_GE1_PORT_MTU (RGDE_REG_GE1_PORT_BASE + 0x08) -#define RGDE_REG_GE1_PORT_RXPKTS (RGDE_REG_GE1_PORT_BASE + 0x10) -#define RGDE_REG_GE1_PORT_RXBYTE (RGDE_REG_GE1_PORT_BASE + 0x18) -#define RGDE_REG_GE1_PORT_RXERR (RGDE_REG_GE1_PORT_BASE + 0x20) -#define RGDE_REG_GE1_PORT_RXDROP (RGDE_REG_GE1_PORT_BASE + 0x28) -#define RGDE_REG_GE1_PORT_RXMULTI (RGDE_REG_GE1_PORT_BASE + 0x30) -#define RGDE_REG_GE1_PORT_RXBRO (RGDE_REG_GE1_PORT_BASE + 0x38) -#define RGDE_REG_GE1_PORT_TXPKTS (RGDE_REG_GE1_PORT_BASE + 0x40) -#define RGDE_REG_GE1_PORT_TXBYTE (RGDE_REG_GE1_PORT_BASE + 0x48) -#define RGDE_REG_GE1_PORT_TXERR (RGDE_REG_GE1_PORT_BASE + 0x50) -#define RGDE_REG_GE1_PORT_TXDROP (RGDE_REG_GE1_PORT_BASE + 0x58) -#define RGDE_REG_GE1_PORT_TXMULT (RGDE_REG_GE1_PORT_BASE + 0x60) -#define RGDE_REG_GE1_PORT_TXBRO (RGDE_REG_GE1_PORT_BASE + 0x68) - -/* GE2 PORT Registers */ -#define RGDE_REG_GE2_PORT_BASE 0x00001200 -#define RGDE_REG_GE2_PORT_CTL (RGDE_REG_GE2_PORT_BASE + 0x00) -#define RGDE_REG_GE2_PORT_STA (RGDE_REG_GE2_PORT_BASE + 0x04) -#define RGDE_REG_GE2_PORT_MTU (RGDE_REG_GE2_PORT_BASE + 0x08) -#define RGDE_REG_GE2_PORT_RXPKTS (RGDE_REG_GE2_PORT_BASE + 0x10) -#define RGDE_REG_GE2_PORT_RXBYTE (RGDE_REG_GE2_PORT_BASE + 0x18) -#define RGDE_REG_GE2_PORT_RXERR (RGDE_REG_GE2_PORT_BASE + 0x20) -#define RGDE_REG_GE2_PORT_RXDROP (RGDE_REG_GE2_PORT_BASE + 0x28) -#define RGDE_REG_GE2_PORT_RXMULTI (RGDE_REG_GE2_PORT_BASE + 0x30) -#define RGDE_REG_GE2_PORT_RXBRO (RGDE_REG_GE2_PORT_BASE + 0x38) -#define RGDE_REG_GE2_PORT_TXPKTS (RGDE_REG_GE2_PORT_BASE + 0x40) -#define RGDE_REG_GE2_PORT_TXBYTE (RGDE_REG_GE2_PORT_BASE + 0x48) -#define RGDE_REG_GE2_PORT_TXERR (RGDE_REG_GE2_PORT_BASE + 0x50) -#define RGDE_REG_GE2_PORT_TXDROP (RGDE_REG_GE2_PORT_BASE + 0x58) -#define RGDE_REG_GE2_PORT_TXMULT (RGDE_REG_GE2_PORT_BASE + 0x60) -#define RGDE_REG_GE2_PORT_TXBRO (RGDE_REG_GE2_PORT_BASE + 0x68) - -/* GE3 PORT Registers */ -#define RGDE_REG_GE3_PORT_BASE 0x00001300 -#define RGDE_REG_GE3_PORT_CTL (RGDE_REG_GE3_PORT_BASE + 0x00) -#define RGDE_REG_GE3_PORT_STA (RGDE_REG_GE3_PORT_BASE + 0x04) -#define RGDE_REG_GE3_PORT_MTU (RGDE_REG_GE3_PORT_BASE + 0x08) -#define RGDE_REG_GE3_PORT_RXPKTS (RGDE_REG_GE3_PORT_BASE + 0x10) -#define RGDE_REG_GE3_PORT_RXBYTE (RGDE_REG_GE3_PORT_BASE + 0x18) -#define RGDE_REG_GE3_PORT_RXERR (RGDE_REG_GE3_PORT_BASE + 0x20) -#define RGDE_REG_GE3_PORT_RXDROP (RGDE_REG_GE3_PORT_BASE + 0x28) -#define RGDE_REG_GE3_PORT_RXMULTI (RGDE_REG_GE3_PORT_BASE + 0x30) -#define RGDE_REG_GE3_PORT_RXBRO (RGDE_REG_GE3_PORT_BASE + 0x38) -#define RGDE_REG_GE3_PORT_TXPKTS (RGDE_REG_GE3_PORT_BASE + 0x40) -#define RGDE_REG_GE3_PORT_TXBYTE (RGDE_REG_GE3_PORT_BASE + 0x48) -#define RGDE_REG_GE3_PORT_TXERR (RGDE_REG_GE3_PORT_BASE + 0x50) -#define RGDE_REG_GE3_PORT_TXDROP (RGDE_REG_GE3_PORT_BASE + 0x58) -#define RGDE_REG_GE3_PORT_TXMULT (RGDE_REG_GE3_PORT_BASE + 0x60) -#define RGDE_REG_GE3_PORT_TXBRO (RGDE_REG_GE3_PORT_BASE + 0x68) - -/* GE4 PORT Registers */ -#define RGDE_REG_XGE0_PORT_BASE 0x00001400 -#define RGDE_REG_XGE0_PORT_CTL (RGDE_REG_XGE0_PORT_BASE + 0x00) -#define RGDE_REG_XGE0_PORT_STA (RGDE_REG_XGE0_PORT_BASE + 0x04) -#define RGDE_REG_XGE0_PORT_MTU (RGDE_REG_XGE0_PORT_BASE + 0x08) -#define RGDE_REG_XGE0_PORT_RXPKTS (RGDE_REG_XGE0_PORT_BASE + 0x10) -#define RGDE_REG_XGE0_PORT_RXBYTE (RGDE_REG_XGE0_PORT_BASE + 0x18) -#define RGDE_REG_XGE0_PORT_RXERR (RGDE_REG_XGE0_PORT_BASE + 0x20) -#define RGDE_REG_XGE0_PORT_RXDROP (RGDE_REG_XGE0_PORT_BASE + 0x28) -#define RGDE_REG_XGE0_PORT_RXMULTI (RGDE_REG_XGE0_PORT_BASE + 0x30) -#define RGDE_REG_XGE0_PORT_RXBRO (RGDE_REG_XGE0_PORT_BASE + 0x38) -#define RGDE_REG_XGE0_PORT_TXPKTS (RGDE_REG_XGE0_PORT_BASE + 0x40) -#define RGDE_REG_XGE0_PORT_TXBYTE (RGDE_REG_XGE0_PORT_BASE + 0x48) -#define RGDE_REG_XGE0_PORT_TXERR (RGDE_REG_XGE0_PORT_BASE + 0x50) -#define RGDE_REG_XGE0_PORT_TXDROP (RGDE_REG_XGE0_PORT_BASE + 0x58) -#define RGDE_REG_XGE0_PORT_TXMULT (RGDE_REG_XGE0_PORT_BASE + 0x60) -#define RGDE_REG_XGE0_PORT_TXBRO (RGDE_REG_XGE0_PORT_BASE + 0x68) - -/* GE5 PORT Registers */ -#define RGDE_REG_XGE1_PORT_BASE 0x00001500 -#define RGDE_REG_XGE1_PORT_CTL (RGDE_REG_XGE1_PORT_BASE + 0x00) -#define RGDE_REG_XGE1_PORT_STA (RGDE_REG_XGE1_PORT_BASE + 0x04) -#define RGDE_REG_XGE1_PORT_MTU (RGDE_REG_XGE1_PORT_BASE + 0x08) -#define RGDE_REG_XGE1_PORT_RXPKTS (RGDE_REG_XGE1_PORT_BASE + 0x10) -#define RGDE_REG_XGE1_PORT_RXBYTE (RGDE_REG_XGE1_PORT_BASE + 0x18) -#define RGDE_REG_XGE1_PORT_RXERR (RGDE_REG_XGE1_PORT_BASE + 0x20) -#define RGDE_REG_XGE1_PORT_RXDROP (RGDE_REG_XGE1_PORT_BASE + 0x28) -#define RGDE_REG_XGE1_PORT_RXMULTI (RGDE_REG_XGE1_PORT_BASE + 0x30) -#define RGDE_REG_XGE1_PORT_RXBRO (RGDE_REG_XGE1_PORT_BASE + 0x38) -#define RGDE_REG_XGE1_PORT_TXPKTS (RGDE_REG_XGE1_PORT_BASE + 0x40) -#define RGDE_REG_XGE1_PORT_TXBYTE (RGDE_REG_XGE1_PORT_BASE + 0x48) -#define RGDE_REG_XGE1_PORT_TXERR (RGDE_REG_XGE1_PORT_BASE + 0x50) -#define RGDE_REG_XGE1_PORT_TXDROP (RGDE_REG_XGE1_PORT_BASE + 0x58) -#define RGDE_REG_XGE1_PORT_TXMULT (RGDE_REG_XGE1_PORT_BASE + 0x60) -#define RGDE_REG_XGE1_PORT_TXBRO (RGDE_REG_XGE1_PORT_BASE + 0x68) - -#define RGDE_REG_CPU_BASE 0x00002100 -#define RGDE_REG_PCIE_ENDIAN_CNTR (RGDE_REG_CPU_BASE + 0x08) - -/* DMA Registers */ -#define RGDE_REG_DMA_BASE 0x00004000 -#define RGDE_REG_BD_WR_OVERTIME (RGDE_REG_DMA_BASE + 0x00) -#define RGDE_REG_BD_DEEP (RGDE_REG_DMA_BASE + 0x04) - -/* TX0 Registers */ -#define RGDE_REG_TX0_BASE 0x00005000 -#define RGDE_REG_TX0_CHN_EN (RGDE_REG_TX0_BASE + 0x00) -#define RGDE_REG_TX0_BD_BASE (RGDE_REG_TX0_BASE + 0x04) -#define RGDE_REG_TX0_BD_TAIL (RGDE_REG_TX0_BASE + 0x08) -#define RGDE_REG_TX0_BD_READY_NUM (RGDE_REG_TX0_BASE + 0x0c) -#define RGDE_REG_TX0_CPU2FPGA_BD_NUM (RGDE_REG_TX0_BASE + 0x30) -#define RGDE_REG_TX0_FPGA2CPU_BD_NUM (RGDE_REG_TX0_BASE + 0x34) - -/* TX1 Registers */ -#define RGDE_REG_TX1_BASE 0x00005100 -#define RGDE_REG_TX1_CHN_EN (RGDE_REG_TX1_BASE + 0x00) -#define RGDE_REG_TX1_BD_BASE (RGDE_REG_TX1_BASE + 0x04) -#define RGDE_REG_TX1_BD_TAIL (RGDE_REG_TX1_BASE + 0x08) -#define RGDE_REG_TX1_BD_READY_NUM (RGDE_REG_TX1_BASE + 0x0c) -#define RGDE_REG_TX1_CPU2FPGA_BD_NUM (RGDE_REG_TX1_BASE + 0x30) -#define RGDE_REG_TX1_FPGA2CPU_BD_NUM (RGDE_REG_TX1_BASE + 0x34) - -/* RX0 Registers */ -#define RGDE_REG_RX0_BASE 0x00006400 -#define RGDE_REG_RX0_CHN_EN (RGDE_REG_RX0_BASE + 0x00) -#define RGDE_REG_RX0_BD_BASE (RGDE_REG_RX0_BASE + 0x04) -#define RGDE_REG_RX0_BD_TAIL (RGDE_REG_RX0_BASE + 0x08) -#define RGDE_REG_RX0_BD_READY_NUM (RGDE_REG_RX0_BASE + 0x0c) -#define RGDE_REG_RX0_CPU2FPGA_BD_NUM (RGDE_REG_RX0_BASE + 0x30) -#define RGDE_REG_RX0_FPGA2CPU_BD_NUM (RGDE_REG_RX0_BASE + 0x34) - -/* RX1 Registers */ -#define RGDE_REG_RX1_BASE 0x00006500 -#define RGDE_REG_RX1_CHN_EN (RGDE_REG_RX1_BASE + 0x00) -#define RGDE_REG_RX1_BD_BASE (RGDE_REG_RX1_BASE + 0x04) -#define RGDE_REG_RX1_BD_TAIL (RGDE_REG_RX1_BASE + 0x08) -#define RGDE_REG_RX1_BD_READY_NUM (RGDE_REG_RX1_BASE + 0x0c) -#define RGDE_REG_RX1_CPU2FPGA_BD_NUM (RGDE_REG_RX1_BASE + 0x30) -#define RGDE_REG_RX1_FPGA2CPU_BD_NUM (RGDE_REG_RX1_BASE + 0x34) - - -#endif /* _FPGA_REG_DEFS_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c deleted file mode 100755 index 76270a94ec..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca954x.c +++ /dev/null @@ -1,1676 +0,0 @@ -/* - * Copyright (c) 2008-2009 Rodolfo Giometti - * Copyright (c) 2008-2009 Eurotech S.p.A. - * Copyright (c) 2019 - * - * I2C multiplexer - * - * This module supports the PCA954x series of I2C multiplexer/switch chips - * made by Philips Semiconductors. - * This includes the: - * PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547 - * and PCA9548. - * - * These chips are all controlled via the I2C bus itself, and all have a - * single 8-bit register. The upstream "parent" bus fans out to two, - * four, or eight downstream busses or channels; which of these - * are selected is determined by the chip type and register contents. A - * mux can select only one sub-bus at a time; a switch can select any - * combination simultaneously. - * - * Based on: - * pca954x.c from Kumar Gala - * Copyright (C) 2006 - * - * Based on: - * pca954x.c from Ken Harrenstien - * Copyright (C) 2004 Google, Inc. (Ken Harrenstien) - * - * Based on: - * i2c-virtual_cb.c from Brian Kuschak - * and - * pca9540.c from Jean Delvare . - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -#include -#include -#else -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define PCA954X_MAX_NCHANS 8 - -#define PCA954X_IRQ_OFFSET 4 - -extern int pca9641_setmuxflag(int nr, int flag); - -int force_create_bus = 0; -static int close_chan_force_reset = 0; -static int select_chan_check = 0; - -module_param(force_create_bus, int, S_IRUGO | S_IWUSR); -module_param(close_chan_force_reset, int, S_IRUGO | S_IWUSR); -module_param(select_chan_check, int, S_IRUGO | S_IWUSR); - -enum pca_type { - pca_9540, - pca_9542, - pca_9543, - pca_9544, - pca_9545, - pca_9546, - pca_9547, - pca_9548, -}; - -struct chip_desc { - u8 nchans; - u8 enable; /* used for muxes only */ - u8 has_irq; - enum muxtype { - pca954x_ismux = 0, - pca954x_isswi - } muxtype; -}; - -struct pca954x { - const struct chip_desc *chip; - - u8 last_chan; /* last register value */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - s32 idle_state; -#else - u8 deselect; -#endif - struct i2c_client *client; - - struct irq_domain *irq; - unsigned int irq_mask; - raw_spinlock_t lock; -}; - -/* Provide specs for the PCA954x types we know about */ -static const struct chip_desc chips[] = { - [pca_9540] = { - .nchans = 2, - .enable = 0x4, - .muxtype = pca954x_ismux, - }, - [pca_9542] = { - .nchans = 2, - .enable = 0x4, - .has_irq = 1, - .muxtype = pca954x_ismux, - }, - [pca_9543] = { - .nchans = 2, - .has_irq = 1, - .muxtype = pca954x_isswi, - }, - [pca_9544] = { - .nchans = 4, - .enable = 0x4, - .has_irq = 1, - .muxtype = pca954x_ismux, - }, - [pca_9545] = { - .nchans = 4, - .has_irq = 1, - .muxtype = pca954x_isswi, - }, - [pca_9546] = { - .nchans = 4, - .muxtype = pca954x_isswi, - }, - [pca_9547] = { - .nchans = 8, - .enable = 0x8, - .muxtype = pca954x_ismux, - }, - [pca_9548] = { - .nchans = 8, - .muxtype = pca954x_isswi, - }, -}; - -static const struct i2c_device_id pca954x_id[] = { - { "pca9540", pca_9540 }, - { "pca9542", pca_9542 }, - { "pca9543", pca_9543 }, - { "pca9544", pca_9544 }, - { "pca9545", pca_9545 }, - { "pca9546", pca_9546 }, - { "pca9547", pca_9547 }, - { "pca9548", pca_9548 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, pca954x_id); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -static const struct of_device_id pca954x_of_match[] = { - { .compatible = "nxp,pca9540", .data = &chips[pca_9540] }, - { .compatible = "nxp,pca9542", .data = &chips[pca_9542] }, - { .compatible = "nxp,pca9543", .data = &chips[pca_9543] }, - { .compatible = "nxp,pca9544", .data = &chips[pca_9544] }, - { .compatible = "nxp,pca9545", .data = &chips[pca_9545] }, - { .compatible = "nxp,pca9546", .data = &chips[pca_9546] }, - { .compatible = "nxp,pca9547", .data = &chips[pca_9547] }, - { .compatible = "nxp,pca9548", .data = &chips[pca_9548] }, - {} -}; -MODULE_DEVICE_TABLE(of, pca954x_of_match); -#else -#ifdef CONFIG_OF -static const struct of_device_id pca954x_of_match[] = { - { .compatible = "nxp,pca9540", .data = &chips[pca_9540] }, - { .compatible = "nxp,pca9542", .data = &chips[pca_9542] }, - { .compatible = "nxp,pca9543", .data = &chips[pca_9543] }, - { .compatible = "nxp,pca9544", .data = &chips[pca_9544] }, - { .compatible = "nxp,pca9545", .data = &chips[pca_9545] }, - { .compatible = "nxp,pca9546", .data = &chips[pca_9546] }, - { .compatible = "nxp,pca9547", .data = &chips[pca_9547] }, - { .compatible = "nxp,pca9548", .data = &chips[pca_9548] }, - {} -}; -MODULE_DEVICE_TABLE(of, pca954x_of_match); -#endif -#endif - -/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer() - for this as they will try to lock adapter a second time */ -static int pca954x_reg_write(struct i2c_adapter *adap, - struct i2c_client *client, u8 val) -{ - int ret = -ENODEV; - - if (adap->algo->master_xfer) { - struct i2c_msg msg; - char buf[1]; - - msg.addr = client->addr; - msg.flags = 0; - msg.len = 1; - buf[0] = val; - msg.buf = buf; - ret = __i2c_transfer(adap, &msg, 1); - - if (ret >= 0 && ret != 1) - ret = -EREMOTEIO; - } else { - union i2c_smbus_data data; - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_WRITE, - val, I2C_SMBUS_BYTE, &data); - } - - return ret; -} - -static int pca954x_reg_read(struct i2c_adapter *adap, - struct i2c_client *client, u8 *val) -{ - int ret = -ENODEV; - u8 tmp_val; - - if (adap->algo->master_xfer) { - struct i2c_msg msg; - - msg.addr = client->addr; - msg.flags = I2C_M_RD; - msg.len = 1; - msg.buf = &tmp_val; - ret = __i2c_transfer(adap, &msg, 1); - - if (ret >= 0 && ret != 1) { - ret = -EREMOTEIO; - } else { - *val = tmp_val; - } - } else { - union i2c_smbus_data data; - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_READ, - 0, I2C_SMBUS_BYTE, &data); - - if (!ret) { - tmp_val = data.byte; - *val = tmp_val; - } - } - - return ret; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -static u8 pca954x_regval(struct pca954x *data, u8 chan) -{ - /* We make switches look like muxes, not sure how to be smarter. */ - if (data->chip->muxtype == pca954x_ismux) - return chan | data->chip->enable; - else - return 1 << chan; -} -#endif - -static int pca954x_setmuxflag(struct i2c_client *client, int flag) -{ - struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); - pca9641_setmuxflag(adap->nr, flag); - return 0; -} - -typedef void (*pca954x_hw_do_reset_func_t)(int busid, int addr); -pca954x_hw_do_reset_func_t g_notify_to_do_reset = NULL; - -void pca954x_hw_do_reset_func_register(void* func) -{ - if (func == NULL) { - return ; - } - g_notify_to_do_reset = func; - return; -} -EXPORT_SYMBOL(pca954x_hw_do_reset_func_register); - -static int pca954x_hw_do_reset(int busid, int addr) -{ - if (g_notify_to_do_reset != NULL) { - (*g_notify_to_do_reset)(busid, addr); - return 0; - } - - return 0; -} -/***************************************9548 reset*****************************************/ -#define DEV_TYPE 0x404a -#define PCA9548_MAX_CPLD_NUM (32) /* PCA9548 max number */ -#define PCA9548_MAX_CPLD_LAYER (8) /* PCA9548 max layer */ -#define DFD_PID_BUF_LEN (32) -#define DFD_PRODUCT_ID_LENGTH (8) -#define CPLD_PCA9548_RESET 0x023500b0 /* bus:2, addr:0x35, offset:0xb0 */ -#define B6510_32CQ_CPLD_PCA9548_RESET 0x060d0060 /* bus:6, addr:0x0d, offset:0x60 */ - -#define DFD_PUB_CARDTYPE_FILE "/sys/module/ragile_common/parameters/dfd_my_type" -#define DFD_MAX_PRODUCT_NUM (32) - - -#define I2C_RETRY_TIMES 5 -#define I2C_RETRY_WAIT_TIMES 10 /*delay 10ms*/ - -#define PCA9548_I2C_GET_BUS(addr) (((addr) >> 24) & 0x00ff) -#define PCA9548_I2C_GET_CLIENT(addr) (((addr) >> 16) & 0x00ff) -#define PCA9548_I2C_GET_OFFSET(addr) (addr & 0xffff) - -typedef enum pca9548_reset_type { - PCA9548_RESET_FUNC = 0, - PCA9548_RESET_GPIO = 1, -} pca9548_reset_type_t; - -typedef void (*pca954x_hw_do_reset_func_t_new)(int io_port, u8 value); -typedef u8 (*pca954x_get_umask_func_t)(int io_port); - -void pca954x_hw_do_reset_by_i2c(int addr, u8 value); -u8 pca954x_get_umask_by_i2c(int addr); -void pca954x_hw_do_reset_by_lpc(int io_port, u8 value); -u8 pca954x_get_umask_by_lpc(int io_port); - - -typedef struct func_attr_s { - int cfg_offset[PCA9548_MAX_CPLD_LAYER]; - int umask[PCA9548_MAX_CPLD_LAYER]; - pca954x_hw_do_reset_func_t_new reset_func; /* 9548 reset function */ - pca954x_get_umask_func_t get_umask_func; /* get reset mask */ -} func_attr_t; - -typedef struct gpio_attr_s { - int gpio; - int gpio_init; - u8 reset_on; - u8 reset_off; -} gpio_attr_t; - -typedef struct pca9548_cfg_info_s { - int pca9548_reset_type; - int pca9548_bus; - int pca9548_addr; - int rst_delay_b; /* delay time before reset(us) */ - int rst_delay; /* reset time(us) */ - int rst_delay_a; /* delay time after reset(us) */ - union { - func_attr_t func_attr; - gpio_attr_t gpio_attr; - } attr; -} pca9548_cfg_info_t; - -typedef struct fpga_pcie_card_info_s { - int dev_type[DFD_MAX_PRODUCT_NUM]; /* dev type */ - pca9548_cfg_info_t pca9548_cfg_info[PCA9548_MAX_CPLD_NUM]; -} pca9548_card_info_t; - -static pca9548_card_info_t g_pca9548_card_info[] = { - { - .dev_type = {0x404a}, /* RA-B6510-48V8C */ - .pca9548_cfg_info = { - /* psu fan */ - { - .pca9548_reset_type = PCA9548_RESET_GPIO, - .pca9548_bus = 2, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .gpio_attr.gpio = 7, - .gpio_attr.gpio_init = 0, - .gpio_attr.reset_on = 1, - .gpio_attr.reset_off = 0, - }, - }, - /* sff1 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(0), -1}, - }, - }, - /* sff2 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x71, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(1), -1}, - }, - }, - /* sff3 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x72, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(2), -1}, - }, - }, - /* sff4 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x73, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(3), -1}, - }, - }, - /* sff5 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x74, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(4), -1}, - }, - }, - /* sff6 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x75, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(5), -1}, - }, - }, - /* sff7 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x76, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(6), -1}, - }, - }, - }, - }, - { - /*RA-B6910-64C*/ - .dev_type = {0x404c}, - .pca9548_cfg_info = { - /* psu fan */ - { - .pca9548_reset_type = PCA9548_RESET_GPIO, - .pca9548_bus = 2, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .gpio_attr.gpio = 7, - .gpio_attr.gpio_init = 0, - .gpio_attr.reset_on = 1, - .gpio_attr.reset_off = 0, - }, - }, - /* sff1 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x70, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(0), -1}, - }, - }, - /* sff2 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x71, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(1), -1}, - }, - }, - /* sff3 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x72, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(2), -1}, - }, - }, - /* sff4 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x73, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(3), -1}, - }, - }, - /* sff5 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x74, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(4), -1}, - }, - }, - /* sff6 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x75, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(5), -1}, - }, - }, - /* sff7 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x76, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(6), -1}, - }, - }, - /* sff8 */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 1, - .pca9548_addr = 0x77, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_i2c, - .func_attr.get_umask_func = pca954x_get_umask_by_i2c, - .func_attr.cfg_offset = {CPLD_PCA9548_RESET, -1}, - .func_attr.umask = {BIT(7), -1}, - }, - }, - }, - }, - { - /* RA-B6510-32C */ - .dev_type = {0x404b}, - .pca9548_cfg_info = { - /* psu */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 4, - .pca9548_addr = 0x77, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_lpc, - .func_attr.get_umask_func = pca954x_get_umask_by_lpc, - .func_attr.cfg_offset = {0x960, -1}, - .func_attr.umask = {BIT(0), -1}, - }, - }, - /* fan */ - { - .pca9548_reset_type = PCA9548_RESET_FUNC, - .pca9548_bus = 2, - .pca9548_addr = 0x77, - .rst_delay_b = 0, - .rst_delay = 1000, - .rst_delay_a = 1000, - .attr = { - .func_attr.reset_func = pca954x_hw_do_reset_by_lpc, - .func_attr.get_umask_func = pca954x_get_umask_by_lpc, - .func_attr.cfg_offset = {0x960, -1}, - .func_attr.umask = {BIT(1), -1}, - }, - }, - }, - }, -}; -int g_pca954x_debug = 0; -module_param(g_pca954x_debug, int, S_IRUGO | S_IWUSR); - -#define PCA954X_DEBUG(fmt, args...) do { \ - if (g_pca954x_debug) { \ - printk(KERN_ERR "[PCA95x][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - - -static int dfd_get_my_dev_type_by_file(void) -{ - struct file *fp; - /* mm_segment_t fs;*/ - loff_t pos; - static int card_type; - char buf[DFD_PID_BUF_LEN]; - - if (card_type != 0) { - return card_type; - } - - fp= filp_open(DFD_PUB_CARDTYPE_FILE, O_RDONLY, 0); - if (IS_ERR(fp)) { - PCA954X_DEBUG("open file fail!\r\n"); - return -1; - } - /* fs = get_fs(); */ - /* set_fs(KERNEL_DS); */ - memset(buf, 0, DFD_PID_BUF_LEN); - pos = 0; - kernel_read(fp, buf, DFD_PRODUCT_ID_LENGTH + 1, &pos); - // kernel_read(fp, pos, buf, DFD_PRODUCT_ID_LENGTH + 1 ); - if (pos < 0) { - PCA954X_DEBUG("read file fail!\r\n"); - goto exit; - } - - card_type = simple_strtoul(buf, NULL, 10); - PCA954X_DEBUG("card_type 0x%x.\n", card_type); - -exit: - /* set_fs(fs); */ - filp_close(fp, NULL); - return card_type; -} - -static int drv_get_my_dev_type(void) -{ - static int type = -1; - - if (type > 0) { - return type; - } - type = dfd_get_my_dev_type_by_file(); - PCA954X_DEBUG("ko board type %d\r\n", type); - - return type; -} - -pca9548_card_info_t* pca9548_get_card_info(int dev_type) -{ - int i, j; - int size; - - size = ARRAY_SIZE(g_pca9548_card_info); - - PCA954X_DEBUG("Enter dev_type 0x%x size %d.\n", dev_type, size); - for (i = 0; i < size; i++) { - for(j = 0; j < DFD_MAX_PRODUCT_NUM; j++) { - if (g_pca9548_card_info[i].dev_type[j] == dev_type) { - PCA954X_DEBUG("match dev_type 0x%x.\n", dev_type); - return &g_pca9548_card_info[i]; - } - } - } - - PCA954X_DEBUG("dismatch dev_type 0x%x.\n", dev_type); - return NULL; -} - -pca9548_cfg_info_t* get_pca9548_cfg_info(int bus, int addr) -{ - int dev_type; - pca9548_card_info_t *info; - pca9548_cfg_info_t *pca9548_cfg_info; - int i; - int size; - - dev_type = drv_get_my_dev_type(); - if (dev_type < 0) { - PCA954X_DEBUG("drv_get_my_dev_type failed ret %d.\n", dev_type); - return NULL; - } - - info = pca9548_get_card_info(dev_type); - if (info == NULL) { - PCA954X_DEBUG("fpga_pcie_get_card_info dev_type %d failed.\n", dev_type); - return NULL; - } - - size = PCA9548_MAX_CPLD_NUM; - for (i = 0; i < size; i++) { - pca9548_cfg_info = &(info->pca9548_cfg_info[i]); - if ((pca9548_cfg_info->pca9548_bus == bus) && (pca9548_cfg_info->pca9548_addr == addr)) { - PCA954X_DEBUG("match dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return pca9548_cfg_info; - } - } - - PCA954X_DEBUG("dismatch dev_type 0x%x bus %d addr 0x%x.\n", dev_type, bus, addr); - return NULL; -} - -static void pca9548_gpio_init(gpio_attr_t *gpio_attr) -{ - if (gpio_attr->gpio_init == 0) { - PCA954X_DEBUG("gpio%d init.\n", gpio_attr->gpio); - gpio_request(gpio_attr->gpio, "pca9548_reset"); - gpio_direction_output(gpio_attr->gpio, gpio_attr->reset_off); - gpio_attr->gpio_init = 1; - } -} - -static void pca9548_gpio_free(gpio_attr_t *gpio_attr) -{ - if (gpio_attr == NULL) { - PCA954X_DEBUG("pca9548_gpio_free,params error\n"); - return ; - } - if (gpio_attr->gpio_init == 1) { - PCA954X_DEBUG("gpio%d release.\n", gpio_attr->gpio); - gpio_free(gpio_attr->gpio); - gpio_attr->gpio_init = 0; - } -} - -static int pca954x_do_gpio_reset(pca9548_cfg_info_t *cfg_info, struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int ret = -1; - gpio_attr_t *tmp_gpio_attr; - int timeout; - int val; - struct i2c_adapter *adapter; - int adapter_timeout; - - if (cfg_info == NULL) { - PCA954X_DEBUG("pca9548 cfg info is null.\n"); - return ret; - } - - if (cfg_info->pca9548_reset_type == PCA9548_RESET_GPIO) { - tmp_gpio_attr = &(cfg_info->attr.gpio_attr); - timeout = cfg_info->rst_delay_a; - - pca9548_gpio_init(tmp_gpio_attr); - udelay(cfg_info->rst_delay_b); - /* reset on */ - PCA954X_DEBUG("set gpio%d %d.\n", tmp_gpio_attr->gpio, tmp_gpio_attr->reset_on); - __gpio_set_value(tmp_gpio_attr->gpio, tmp_gpio_attr->reset_on); - udelay(cfg_info->rst_delay); - /* reset off */ - PCA954X_DEBUG("set gpio%d %d.\n", tmp_gpio_attr->gpio, tmp_gpio_attr->reset_off); - __gpio_set_value(tmp_gpio_attr->gpio, tmp_gpio_attr->reset_off); - - while (timeout > 0) { - udelay(1); - val = __gpio_get_value(tmp_gpio_attr->gpio); - if (val == tmp_gpio_attr->reset_off) { - adapter = adap; - /* get bus info */ - while(i2c_parent_is_i2c_adapter(adapter)){ - adapter = to_i2c_adapter(adapter->dev.parent); - } - - adapter_timeout = adapter->timeout; - adapter->timeout = msecs_to_jiffies(50); - pca954x_reg_write(adap, client, data->last_chan); - adapter->timeout = adapter_timeout; - ret = 0; - PCA954X_DEBUG("pca954x_do_gpio_reset success.\n"); - break; - } - - if (timeout >= 1000 && (timeout % 1000 == 0)) { - /* 1MS schedule*/ - schedule(); - } - timeout--; - } - - if (ret) { - PCA954X_DEBUG("pca954x_do_gpio_reset failed.\n"); - } - pca9548_gpio_free(&(cfg_info->attr.gpio_attr)); - } else { - PCA954X_DEBUG("pca9548_reset_type invalid, pca954x_do_gpio_reset failed.\n"); - } - - return ret; -} - -static int pca954x_do_func_reset(pca9548_cfg_info_t *cfg_info, struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int ret = -1; - func_attr_t *tmp_func_attr; - int timeout; - int val; - struct i2c_adapter *adapter; - int adapter_timeout; - int i; - u8 old_value; - - if (cfg_info == NULL) { - PCA954X_DEBUG("pca9548 cfg info is null.\n"); - return ret; - } - - if (cfg_info->pca9548_reset_type == PCA9548_RESET_FUNC) { - tmp_func_attr = &(cfg_info->attr.func_attr); - timeout = cfg_info->rst_delay_a; - - if ((tmp_func_attr->reset_func == NULL) || (tmp_func_attr->get_umask_func == NULL)) { - PCA954X_DEBUG("pca954x hw do reset func or get umask func is null.\n"); - return ret; - } - - for(i = 0; (i < PCA9548_MAX_CPLD_LAYER) && (tmp_func_attr->cfg_offset[i] != -1) - && (tmp_func_attr->umask[i] != -1); i++) { - old_value = (*tmp_func_attr->get_umask_func)(tmp_func_attr->cfg_offset[i]); - PCA954X_DEBUG("cfg info: offset:0x%x umask:0x%x, old_value:0x%x\n", - tmp_func_attr->cfg_offset[i], tmp_func_attr->umask[i],old_value); - (*tmp_func_attr->reset_func)(tmp_func_attr->cfg_offset[i], old_value & ~tmp_func_attr->umask[i]); - udelay(cfg_info->rst_delay); - (*tmp_func_attr->reset_func)(tmp_func_attr->cfg_offset[i], old_value | tmp_func_attr->umask[i]); - } - - while (timeout > 0) { - udelay(1); - val = (*tmp_func_attr->get_umask_func)(tmp_func_attr->cfg_offset[i - 1]); - val &= (tmp_func_attr->umask[i - 1]); - if (val == tmp_func_attr->umask[i - 1]) { - adapter = adap; - /* get bus info */ - while(i2c_parent_is_i2c_adapter(adapter)){ - adapter = to_i2c_adapter(adapter->dev.parent); - } - - adapter_timeout = adapter->timeout; - adapter->timeout = msecs_to_jiffies(50); - pca954x_reg_write(adap, client, data->last_chan); - adapter->timeout = adapter_timeout; - ret = 0; - PCA954X_DEBUG("pca954x_do_func_reset success.\n"); - break; - } - - if (timeout >= 1000 && (timeout % 1000 == 0)) { - /* 1MS schedule*/ - schedule(); - } - timeout--; - } - - if (ret) { - PCA954X_DEBUG("pca954x_do_func_reset failed.\n"); - } - } else { - PCA954X_DEBUG("pca9548_reset_type invalid, pca954x_do_func_reset failed.\n"); - } - - return ret; -} - -static int pca9548_reset_ctrl(pca9548_cfg_info_t *cfg_info, struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - int ret = -1; - - if (cfg_info == NULL) { - PCA954X_DEBUG("pca9548 cfg info is null.\n"); - return ret; - } - - if (cfg_info->pca9548_reset_type == PCA9548_RESET_FUNC) { - ret = pca954x_do_func_reset(cfg_info, adap, client, chan); - } else if (cfg_info->pca9548_reset_type == PCA9548_RESET_GPIO) { - ret = pca954x_do_gpio_reset(cfg_info, adap, client, chan); - } - - if (ret < 0) { - PCA954X_DEBUG("pca9548_reset_ctrl failed.\n"); - } - return ret; -} - -static int pca954x_reset_i2c_read(uint32_t bus, uint32_t addr, uint32_t offset_addr, - unsigned char *buf, uint32_t size) -{ - struct file *fp; - /* mm_segment_t fs; */ - struct i2c_client client; - char i2c_path[32]; - int i ,j ; - int rv; - - rv = 0; - memset(i2c_path, 0, 32); - snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); - fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); - if (IS_ERR(fp)) { - PCA954X_DEBUG("i2c open fail.\n"); - return -1; - } - memcpy(&client, fp->private_data, sizeof(struct i2c_client)); - client.addr = addr; - /* fs = get_fs(); */ - /* set_fs(KERNEL_DS); */ - for (j = 0 ;j < size ;j++){ - for (i = 0; i < I2C_RETRY_TIMES; i++) { - rv = i2c_smbus_read_byte_data(&client, (offset_addr + j)); - if (rv < 0) { - PCA954X_DEBUG("i2c read failed, try again.\n"); - msleep(I2C_RETRY_WAIT_TIMES); - if (i >= (I2C_RETRY_TIMES - 1)) { - goto out; - } - continue; - } - *(buf + j) = (unsigned char)rv; - break; - } - } -out: - filp_close(fp, NULL); - /* set_fs(fs); */ - return rv; -} - -static int pca954x_reset_i2c_write(uint32_t bus, uint32_t dev_addr, uint32_t offset_addr, - uint8_t write_buf) -{ - struct file *fp; - /* mm_segment_t fs; */ - struct i2c_client client; - char i2c_path[32]; - int i; - int rv; - - rv = 0; - memset(i2c_path, 0, 32); - snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); - fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); - if (IS_ERR(fp)) { - PCA954X_DEBUG("i2c open fail.\n"); - return -1; - } - memcpy(&client, fp->private_data, sizeof(struct i2c_client)); - client.addr = dev_addr; - /* fs = get_fs(); */ - /* set_fs(KERNEL_DS); */ - for (i = 0; i < I2C_RETRY_TIMES; i++) { - rv = i2c_smbus_write_byte_data(&client, offset_addr, write_buf); - if (rv < 0) { - PCA954X_DEBUG("i2c write failed, try again.\n"); - msleep(I2C_RETRY_WAIT_TIMES); - if (i >= (I2C_RETRY_TIMES - 1)) { - goto out; - } - continue; - } - break; - } -out: - filp_close(fp, NULL); - /* set_fs(fs); */ - return rv; -} - -int pca954x_reset_reg_i2c_read_byte(int addr, u8 *value) -{ - int bus; - int client_addr; - int offset; - int ret; - - bus = PCA9548_I2C_GET_BUS(addr); - client_addr = PCA9548_I2C_GET_CLIENT(addr); - offset = PCA9548_I2C_GET_OFFSET(addr); - - ret = pca954x_reset_i2c_read(bus, client_addr, offset, value, 1); - if (ret < 0) { - PCA954X_DEBUG(" 0x%x read fail\r\n", addr); - goto end; - } -end: - return ret; -} - -int pca954x_reset_reg_i2c_write_byte(int addr, u8 value) -{ - int bus; - int client_addr; - int offset; - int ret; - - bus = PCA9548_I2C_GET_BUS(addr); - client_addr = PCA9548_I2C_GET_CLIENT(addr); - offset = PCA9548_I2C_GET_OFFSET(addr); - - ret = pca954x_reset_i2c_write(bus, client_addr, offset, value); - if (ret < 0) { - PCA954X_DEBUG(" 0x%x write fail\r\n", addr); - goto end; - } -end: - return ret; -} - -void pca954x_hw_do_reset_by_i2c(int addr, u8 value) -{ - int ret; - - PCA954X_DEBUG("write i2c cpld[0x%x], value[%d]\n", addr, value); - ret = pca954x_reset_reg_i2c_write_byte(addr, value); - if (ret < 0) { - PCA954X_DEBUG("write cpld pca9548 reset reg failed, ret = %d \n", ret); - } -} - -u8 pca954x_get_umask_by_i2c(int addr) -{ - u8 value = 0xFF; - int ret; - - ret = pca954x_reset_reg_i2c_read_byte(addr, &value); - PCA954X_DEBUG("read i2c cpld[0x%x], value[%d], ret = %d\n", addr, value, ret); - - return value; -} - -void pca954x_hw_do_reset_by_lpc(int io_port, u8 value) -{ - PCA954X_DEBUG("write lpc offset[0x%x], value[%d]\n", (u16)io_port, value); - outb(value, (u16)io_port); -} - -u8 pca954x_get_umask_by_lpc(int io_port) -{ - u8 value; - - value = inb(io_port); - PCA954X_DEBUG("read lpc offset[0x%x], value[%d]\n", (u16)io_port, value); - - return value; -} - -int pca954x_hw_do_reset_new(struct i2c_adapter *adap, - struct i2c_client *client, u32 chan) -{ - pca9548_cfg_info_t *cfg_info; - int ret = -1; - - cfg_info = get_pca9548_cfg_info(adap->nr, client->addr); - if (cfg_info == NULL && g_notify_to_do_reset == NULL) { - PCA954X_DEBUG("fpga_do_pca954x_reset_func do nothing.\n"); - return ret; - } - if(cfg_info != NULL) { - ret = pca9548_reset_ctrl(cfg_info, adap, client, chan); - } else { - ret = pca954x_hw_do_reset(adap->nr, client->addr); - } - if (ret < 0) { - PCA954X_DEBUG("pca954x_hw_do_reset failed.\n"); - } - return ret; -} -/******************************end 9548 reset***********************************/ - -static int pca954x_do_reset(struct i2c_adapter *adap, - void *client, u32 chan) -{ - struct i2c_client *new_client; - int ret = -1; - - PCA954X_DEBUG("do pca954x reset x86\n"); - new_client =(struct i2c_client *) client; - ret = pca954x_hw_do_reset_new(adap, new_client, chan); - if (ret < 0) { - PCA954X_DEBUG("pca954x_do_reset failed.\n"); - return ret; - } - - PCA954X_DEBUG("pca954x_do_reset success.\n"); - ret = 0; - return ret; -} - -static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - const struct chip_desc *chip = data->chip; - u8 regval; - int ret = 0; - u8 read_val; - int rv; - - read_val = 0; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - regval = pca954x_regval(data, chan); -#else - /* we make switches look like muxes, not sure how to be smarter */ - if (chip->muxtype == pca954x_ismux) - regval = chan | chip->enable; - else - regval = 1 << chan; -#endif - - /* Only select the channel if its different from the last channel */ - if (data->last_chan != regval) { - pca954x_setmuxflag(client, 0); - ret = pca954x_reg_write(muxc->parent, client, regval); - data->last_chan = ret < 0 ? 0 : regval; - } - - if (select_chan_check) { /* check chan */ - ret = pca954x_reg_read(muxc->parent, client, &read_val); - /* read failed or chan not open, reset pca9548 */ - if ((ret < 0) || (read_val != data->last_chan)) { - dev_warn(&client->dev, "pca954x open channle %u failed, do reset.\n", chan); - PCA954X_DEBUG("ret = %d, read_val = %d, last_chan = %d.\n", ret, read_val, data->last_chan); - rv = pca954x_do_reset(client->adapter, client, chan); - if (rv >= 0) { - PCA954X_DEBUG("pca954x_do_reset success, rv = %d.\n", rv); - } else { - PCA954X_DEBUG("pca954x_do_reset failed, rv = %d.\n", rv); - } - if (ret >= 0) { - ret = -EIO; /* chan not match, return IO error */ - } - } - } - - return ret; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - s32 idle_state; - int ret, rv; - struct i2c_client * new_client; - - if (close_chan_force_reset) { - data->last_chan = 0; - ret = pca954x_do_reset(client->adapter, client, chan); - if (ret < 0) { - dev_warn(&client->dev, "pca954x do reset failed %d.\n", ret); - } - return ret; - } else { - idle_state = READ_ONCE(data->idle_state); - if (idle_state >= 0) - /* Set the mux back to a predetermined channel */ - return pca954x_select_chan(muxc, idle_state); - if (idle_state == MUX_IDLE_DISCONNECT) { - /* Deselect active channel */ - data->last_chan = 0; - ret = pca954x_reg_write(muxc->parent, client, - data->last_chan); - if (ret < 0) { - new_client =(struct i2c_client *) client; - dev_warn(&new_client->dev, "pca954x close chn failed, do reset.\n"); - rv = pca954x_do_reset(client->adapter, client, chan); - if (rv == 0) { - ret = 0; - } - } - return ret; - } - } - - /* otherwise leave as-is */ - - return 0; -} - -static ssize_t idle_state_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - - return sprintf(buf, "%d\n", READ_ONCE(data->idle_state)); -} - -static ssize_t idle_state_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct i2c_client *client = to_i2c_client(dev); - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int val; - int ret; - - ret = kstrtoint(buf, 0, &val); - if (ret < 0) - return ret; - - if (val != MUX_IDLE_AS_IS && val != MUX_IDLE_DISCONNECT && - (val < 0 || val >= data->chip->nchans)) - return -EINVAL; - - i2c_lock_bus(muxc->parent, I2C_LOCK_SEGMENT); - - WRITE_ONCE(data->idle_state, val); - /* - * Set the mux into a state consistent with the new - * idle_state. - */ - if (data->last_chan || val != MUX_IDLE_DISCONNECT) - ret = pca954x_deselect_mux(muxc, 0); - - i2c_unlock_bus(muxc->parent, I2C_LOCK_SEGMENT); - - return ret < 0 ? ret : count; -} - -static DEVICE_ATTR_RW(idle_state); - -static irqreturn_t pca954x_irq_handler(int irq, void *dev_id) -{ - struct pca954x *data = dev_id; - unsigned long pending; - int ret, i; - - ret = i2c_smbus_read_byte(data->client); - if (ret < 0) - return IRQ_NONE; - - pending = (ret >> PCA954X_IRQ_OFFSET) & (BIT(data->chip->nchans) - 1); - for_each_set_bit(i, &pending, data->chip->nchans) - handle_nested_irq(irq_linear_revmap(data->irq, i)); - - return IRQ_RETVAL(pending); -} - -static int pca954x_init(struct i2c_client *client, struct pca954x *data) -{ - int ret; - - if (data->idle_state >= 0) - data->last_chan = pca954x_regval(data, data->idle_state); - else - data->last_chan = 0; /* Disconnect multiplexer */ - - ret = i2c_smbus_write_byte(client, data->last_chan); - if (ret < 0) - data->last_chan = 0; - - return ret; -} - -#else -static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int ret, rv; - struct i2c_client * new_client; - - /* Deselect active channel */ - data->last_chan = 0; - - ret = pca954x_reg_write(muxc->parent, client, data->last_chan); - if (ret < 0) { - new_client =(struct i2c_client *) client; - dev_warn(&new_client->dev, "pca954x close chn failed, do reset.\n"); - rv = pca954x_do_reset(client->adapter, client, chan); - if (rv == 0) { - ret = 0; - } - - } - pca954x_setmuxflag(client, 1); - (void)pca954x_reg_write(muxc->parent, client, data->last_chan); - - return ret; - -} - -static irqreturn_t pca954x_irq_handler(int irq, void *dev_id) -{ - struct pca954x *data = dev_id; - unsigned int child_irq; - int ret, i, handled = 0; - - ret = i2c_smbus_read_byte(data->client); - if (ret < 0) - return IRQ_NONE; - - for (i = 0; i < data->chip->nchans; i++) { - if (ret & BIT(PCA954X_IRQ_OFFSET + i)) { - child_irq = irq_linear_revmap(data->irq, i); - handle_nested_irq(child_irq); - handled++; - } - } - return handled ? IRQ_HANDLED : IRQ_NONE; -} -#endif - -static void pca954x_irq_mask(struct irq_data *idata) -{ - struct pca954x *data = irq_data_get_irq_chip_data(idata); - unsigned int pos = idata->hwirq; - unsigned long flags; - - raw_spin_lock_irqsave(&data->lock, flags); - - data->irq_mask &= ~BIT(pos); - if (!data->irq_mask) - disable_irq(data->client->irq); - - raw_spin_unlock_irqrestore(&data->lock, flags); -} - -static void pca954x_irq_unmask(struct irq_data *idata) -{ - struct pca954x *data = irq_data_get_irq_chip_data(idata); - unsigned int pos = idata->hwirq; - unsigned long flags; - - raw_spin_lock_irqsave(&data->lock, flags); - - if (!data->irq_mask) - enable_irq(data->client->irq); - data->irq_mask |= BIT(pos); - - raw_spin_unlock_irqrestore(&data->lock, flags); -} - -static int pca954x_irq_set_type(struct irq_data *idata, unsigned int type) -{ - if ((type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_LOW) - return -EINVAL; - return 0; -} - -static struct irq_chip pca954x_irq_chip = { - .name = "i2c-mux-pca954x", - .irq_mask = pca954x_irq_mask, - .irq_unmask = pca954x_irq_unmask, - .irq_set_type = pca954x_irq_set_type, -}; - -static int pca954x_irq_setup(struct i2c_mux_core *muxc) -{ - struct pca954x *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int c, err, irq; - - if (!data->chip->has_irq || client->irq <= 0) - return 0; - - raw_spin_lock_init(&data->lock); - - data->irq = irq_domain_add_linear(client->dev.of_node, - data->chip->nchans, - &irq_domain_simple_ops, data); - if (!data->irq) - return -ENODEV; - - for (c = 0; c < data->chip->nchans; c++) { - irq = irq_create_mapping(data->irq, c); - irq_set_chip_data(irq, data); - irq_set_chip_and_handler(irq, &pca954x_irq_chip, - handle_simple_irq); - } - - err = devm_request_threaded_irq(&client->dev, data->client->irq, NULL, - pca954x_irq_handler, - IRQF_ONESHOT | IRQF_SHARED, - "pca954x", data); - if (err) - goto err_req_irq; - - disable_irq(data->client->irq); - - return 0; -err_req_irq: - for (c = 0; c < data->chip->nchans; c++) { - irq = irq_find_mapping(data->irq, c); - irq_dispose_mapping(irq); - } - irq_domain_remove(data->irq); - - return err; -} - -/* - * I2C init/probing/exit functions - */ -static int pca954x_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); -#endif - struct device_node *of_node = client->dev.of_node; - bool idle_disconnect_dt; - struct gpio_desc *gpio; - int num, force, class; - struct i2c_mux_core *muxc; - struct pca954x *data; - const struct of_device_id *match; - int ret; - - - if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) - return -ENODEV; - - muxc = i2c_mux_alloc(adap, &client->dev, - PCA954X_MAX_NCHANS, sizeof(*data), 0, - pca954x_select_chan, pca954x_deselect_mux); - if (!muxc) - return -ENOMEM; - data = i2c_mux_priv(muxc); - - i2c_set_clientdata(client, muxc); - data->client = client; - - /* Get the mux out of reset if a reset GPIO is specified. */ - gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW); - if (IS_ERR(gpio)) - return PTR_ERR(gpio); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - data->idle_state = MUX_IDLE_AS_IS; - if (device_property_read_u32(&client->dev, "idle-state", &data->idle_state)) { - if (device_property_read_bool(&client->dev, "i2c-mux-idle-disconnect")) - data->idle_state = MUX_IDLE_DISCONNECT; - } - - /* - * Write the mux register at addr to verify - * that the mux is in fact present. This also - * initializes the mux to a channel - * or disconnected state. - */ - ret = pca954x_init(client, data); - if (ret < 0) { - dev_warn(&client->dev, "probe failed\n"); - return -ENODEV; - } -#else - /* Write the mux register at addr to verify - * that the mux is in fact present. This also - * initializes the mux to disconnected state. - */ - if ((i2c_smbus_write_byte(client, 0) < 0) && (force_create_bus == 0)) { - dev_warn(&client->dev, "probe failed\n"); - return -ENODEV; - } -#endif - match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev); - if (match) - data->chip = of_device_get_match_data(&client->dev); - else - data->chip = &chips[id->driver_data]; - - data->last_chan = 0; /* force the first selection */ - - idle_disconnect_dt = of_node && - of_property_read_bool(of_node, "i2c-mux-idle-disconnect"); - - ret = pca954x_irq_setup(muxc); - if (ret) - goto fail_del_adapters; - - /* Now create an adapter for each channel */ - for (num = 0; num < data->chip->nchans; num++) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - ret = i2c_mux_add_adapter(muxc, 0, num, 0); -#else - bool idle_disconnect_pd = false; - - force = 0; /* dynamic adap number */ - class = 0; /* no class by default */ - if (pdata) { - if (num < pdata->num_modes) { - /* force static number */ - force = pdata->modes[num].adap_id; - class = pdata->modes[num].class; - } else - /* discard unconfigured channels */ - break; - idle_disconnect_pd = pdata->modes[num].deselect_on_exit; - } - data->deselect |= (idle_disconnect_pd || - idle_disconnect_dt) << num; - - ret = i2c_mux_add_adapter(muxc, force, num, class); -#endif - if (ret) - goto fail_del_adapters; - } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - /* - * The attr probably isn't going to be needed in most cases, - * so don't fail completely on error. - */ - device_create_file(&client->dev, &dev_attr_idle_state); -#endif - dev_info(&client->dev, - "registered %d multiplexed busses for I2C %s %s\n", - num, data->chip->muxtype == pca954x_ismux - ? "mux" : "switch", client->name); - - return 0; - -fail_del_adapters: - i2c_mux_del_adapters(muxc); - return ret; -} - -static int pca954x_remove(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); - int c, irq; - - if (data->irq) { - for (c = 0; c < data->chip->nchans; c++) { - irq = irq_find_mapping(data->irq, c); - irq_dispose_mapping(irq); - } - irq_domain_remove(data->irq); - } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - device_remove_file(&client->dev, &dev_attr_idle_state); -#endif - i2c_mux_del_adapters(muxc); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int pca954x_resume(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca954x *data = i2c_mux_priv(muxc); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - int ret; - - ret = pca954x_init(client, data); - if (ret < 0) - dev_err(&client->dev, "failed to verify mux presence\n"); - - return ret; -#else - data->last_chan = 0; - return i2c_smbus_write_byte(client, 0); -#endif -} -#endif - -static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume); - -static struct i2c_driver pca954x_driver = { - .driver = { - .name = "pca954x", - .pm = &pca954x_pm, - .of_match_table = of_match_ptr(pca954x_of_match), - }, - .probe = pca954x_probe, - .remove = pca954x_remove, - .id_table = pca954x_id, -}; - -module_i2c_driver(pca954x_driver); - -MODULE_AUTHOR("support support@ragile.com"); -MODULE_DESCRIPTION("PCA954x I2C mux/switch driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c deleted file mode 100755 index 4988fcc7f2..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/i2c-mux-pca9641.c +++ /dev/null @@ -1,653 +0,0 @@ -/* - * I2C multiplexer driver for PCA9541 bus master selector - * - * Copyright (c) 2010 Ericsson AB. - * Copyright (c) 2019 - * Author: Guenter Roeck - * - * Derived from: - * pca954x.c - * - * Copyright (c) 2008-2009 Rodolfo Giometti - * Copyright (c) 2008-2009 Eurotech S.p.A. - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -#include -#else -#include -#endif - -/* - * The PCA9541 is a bus master selector. It supports two I2C masters connected - * to a single slave bus. - * - * Before each bus transaction, a master has to acquire bus ownership. After the - * transaction is complete, bus ownership has to be released. This fits well - * into the I2C multiplexer framework, which provides select and release - * functions for this purpose. For this reason, this driver is modeled as - * single-channel I2C bus multiplexer. - * - * This driver assumes that the two bus masters are controlled by two different - * hosts. If a single host controls both masters, platform code has to ensure - * that only one of the masters is instantiated at any given time. - */ - -#define PCA9541_CONTROL 0x01 -#define PCA9541_ISTAT 0x02 - -#define PCA9541_CTL_MYBUS (1 << 0) -#define PCA9541_CTL_NMYBUS (1 << 1) -#define PCA9541_CTL_BUSON (1 << 2) -#define PCA9541_CTL_NBUSON (1 << 3) -#define PCA9541_CTL_BUSINIT (1 << 4) -#define PCA9541_CTL_TESTON (1 << 6) -#define PCA9541_CTL_NTESTON (1 << 7) -#define PCA9541_ISTAT_INTIN (1 << 0) -#define PCA9541_ISTAT_BUSINIT (1 << 1) -#define PCA9541_ISTAT_BUSOK (1 << 2) -#define PCA9541_ISTAT_BUSLOST (1 << 3) -#define PCA9541_ISTAT_MYTEST (1 << 6) -#define PCA9541_ISTAT_NMYTEST (1 << 7) -#define PCA9641_ID 0x00 -#define PCA9641_ID_MAGIC 0x38 -#define PCA9641_CONTROL 0x01 -#define PCA9641_STATUS 0x02 -#define PCA9641_TIME 0x03 -#define PCA9641_CTL_LOCK_REQ BIT(0) -#define PCA9641_CTL_LOCK_GRANT BIT(1) -#define PCA9641_CTL_BUS_CONNECT BIT(2) -#define PCA9641_CTL_BUS_INIT BIT(3) -#define PCA9641_CTL_SMBUS_SWRST BIT(4) -#define PCA9641_CTL_IDLE_TIMER_DIS BIT(5) -#define PCA9641_CTL_SMBUS_DIS BIT(6) -#define PCA9641_CTL_PRIORITY BIT(7) -#define PCA9641_STS_OTHER_LOCK BIT(0) -#define PCA9641_STS_BUS_INIT_FAIL BIT(1) -#define PCA9641_STS_BUS_HUNG BIT(2) -#define PCA9641_STS_MBOX_EMPTY BIT(3) -#define PCA9641_STS_MBOX_FULL BIT(4) -#define PCA9641_STS_TEST_INT BIT(5) -#define PCA9641_STS_SCL_IO BIT(6) -#define PCA9641_STS_SDA_IO BIT(7) -#define PCA9641_RES_TIME 0x03 -#define BUSON (PCA9541_CTL_BUSON | PCA9541_CTL_NBUSON) -#define MYBUS (PCA9541_CTL_MYBUS | PCA9541_CTL_NMYBUS) -#define mybus(x) (!((x) & MYBUS) || ((x) & MYBUS) == MYBUS) -#define busoff(x) (!((x) & BUSON) || ((x) & BUSON) == BUSON) -#define BUSOFF(x, y) (!((x) & PCA9641_CTL_LOCK_GRANT) && \ - !((y) & PCA9641_STS_OTHER_LOCK)) -#define other_lock(x) ((x) & PCA9641_STS_OTHER_LOCK) -#define lock_grant(x) ((x) & PCA9641_CTL_LOCK_GRANT) - -#define PCA9641_RETRY_TIME 8 - -typedef struct i2c_muxs_struct_flag -{ - int nr; - char name[48]; - struct mutex update_lock; - int flag; -}i2c_mux_flag; - -i2c_mux_flag pca_flag = { - .flag = -1, -}; - -int pca9641_setmuxflag(int nr, int flag) -{ - if (pca_flag.nr == nr) { - pca_flag.flag = flag; - } - return 0; -} -EXPORT_SYMBOL(pca9641_setmuxflag); - -int g_debug = 0; -module_param(g_debug, int, S_IRUGO | S_IWUSR); - -#define PCA_DEBUG(fmt, args...) do { \ - if (g_debug) { \ - printk(KERN_ERR "[pca9641][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - - -/* arbitration timeouts, in jiffies */ -#define ARB_TIMEOUT (HZ / 8) /* 125 ms until forcing bus ownership */ -#define ARB2_TIMEOUT (HZ / 4) /* 250 ms until acquisition failure */ - -/* arbitration retry delays, in us */ -#define SELECT_DELAY_SHORT 50 -#define SELECT_DELAY_LONG 1000 - -struct pca9541 { - struct i2c_client *client; - unsigned long select_timeout; - unsigned long arb_timeout; -}; - -static const struct i2c_device_id pca9541_id[] = { - {"pca9541", 0}, - {"pca9641", 1}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, pca9541_id); - -#ifdef CONFIG_OF -static const struct of_device_id pca9541_of_match[] = { - { .compatible = "nxp,pca9541" }, - { .compatible = "nxp,pca9641" }, - {} -}; -MODULE_DEVICE_TABLE(of, pca9541_of_match); -#endif - - -/* - * Write to chip register. Don't use i2c_transfer()/i2c_smbus_xfer() - * as they will try to lock the adapter a second time. - */ -static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) -{ - struct i2c_adapter *adap = client->adapter; - int ret; - - if (adap->algo->master_xfer) { - struct i2c_msg msg; - char buf[2]; - - msg.addr = client->addr; - msg.flags = 0; - msg.len = 2; - buf[0] = command; - buf[1] = val; - msg.buf = buf; - ret = __i2c_transfer(adap, &msg, 1); - } else { - union i2c_smbus_data data; - - data.byte = val; - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_WRITE, - command, - I2C_SMBUS_BYTE_DATA, &data); - } - - return ret; -} - -/* - * Read from chip register. Don't use i2c_transfer()/i2c_smbus_xfer() - * as they will try to lock adapter a second time. - */ -static int pca9541_reg_read(struct i2c_client *client, u8 command) -{ - struct i2c_adapter *adap = client->adapter; - int ret; - u8 val; - - if (adap->algo->master_xfer) { - struct i2c_msg msg[2] = { - { - .addr = client->addr, - .flags = 0, - .len = 1, - .buf = &command - }, - { - .addr = client->addr, - .flags = I2C_M_RD, - .len = 1, - .buf = &val - } - }; - ret = __i2c_transfer(adap, msg, 2); - if (ret == 2) - ret = val; - else if (ret >= 0) - ret = -EIO; - } else { - union i2c_smbus_data data; - - ret = adap->algo->smbus_xfer(adap, client->addr, - client->flags, - I2C_SMBUS_READ, - command, - I2C_SMBUS_BYTE_DATA, &data); - if (!ret) - ret = data.byte; - } - return ret; -} - -/* - * Arbitration management functions - */ - -/* Release bus. Also reset NTESTON and BUSINIT if it was set. */ -static void pca9541_release_bus(struct i2c_client *client) -{ - int reg; - - reg = pca9541_reg_read(client, PCA9541_CONTROL); - if (reg >= 0 && !busoff(reg) && mybus(reg)) - pca9541_reg_write(client, PCA9541_CONTROL, - (reg & PCA9541_CTL_NBUSON) >> 1); -} - -/* - * Arbitration is defined as a two-step process. A bus master can only activate - * the slave bus if it owns it; otherwise it has to request ownership first. - * This multi-step process ensures that access contention is resolved - * gracefully. - * - * Bus Ownership Other master Action - * state requested access - * ---------------------------------------------------- - * off - yes wait for arbitration timeout or - * for other master to drop request - * off no no take ownership - * off yes no turn on bus - * on yes - done - * on no - wait for arbitration timeout or - * for other master to release bus - * - * The main contention point occurs if the slave bus is off and both masters - * request ownership at the same time. In this case, one master will turn on - * the slave bus, believing that it owns it. The other master will request - * bus ownership. Result is that the bus is turned on, and master which did - * _not_ own the slave bus before ends up owning it. - */ - -/* Control commands per PCA9541 datasheet */ -static const u8 pca9541_control[16] = { - 4, 0, 1, 5, 4, 4, 5, 5, 0, 0, 1, 1, 0, 4, 5, 1 -}; - -/* - * Channel arbitration - * - * Return values: - * <0: error - * 0 : bus not acquired - * 1 : bus acquired - */ -static int pca9541_arbitrate(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca9541 *data = i2c_mux_priv(muxc); - int reg; - - reg = pca9541_reg_read(client, PCA9541_CONTROL); - if (reg < 0) - return reg; - - if (busoff(reg)) { - int istat; - /* - * Bus is off. Request ownership or turn it on unless - * other master requested ownership. - */ - istat = pca9541_reg_read(client, PCA9541_ISTAT); - if (!(istat & PCA9541_ISTAT_NMYTEST) - || time_is_before_eq_jiffies(data->arb_timeout)) { - /* - * Other master did not request ownership, - * or arbitration timeout expired. Take the bus. - */ - pca9541_reg_write(client, - PCA9541_CONTROL, - pca9541_control[reg & 0x0f] - | PCA9541_CTL_NTESTON); - data->select_timeout = SELECT_DELAY_SHORT; - } else { - /* - * Other master requested ownership. - * Set extra long timeout to give it time to acquire it. - */ - data->select_timeout = SELECT_DELAY_LONG * 2; - } - } else if (mybus(reg)) { - /* - * Bus is on, and we own it. We are done with acquisition. - * Reset NTESTON and BUSINIT, then return success. - */ - if (reg & (PCA9541_CTL_NTESTON | PCA9541_CTL_BUSINIT)) - pca9541_reg_write(client, - PCA9541_CONTROL, - reg & ~(PCA9541_CTL_NTESTON - | PCA9541_CTL_BUSINIT)); - return 1; - } else { - /* - * Other master owns the bus. - * If arbitration timeout has expired, force ownership. - * Otherwise request it. - */ - data->select_timeout = SELECT_DELAY_LONG; - if (time_is_before_eq_jiffies(data->arb_timeout)) { - /* Time is up, take the bus and reset it. */ - pca9541_reg_write(client, - PCA9541_CONTROL, - pca9541_control[reg & 0x0f] - | PCA9541_CTL_BUSINIT - | PCA9541_CTL_NTESTON); - } else { - /* Request bus ownership if needed */ - if (!(reg & PCA9541_CTL_NTESTON)) - pca9541_reg_write(client, - PCA9541_CONTROL, - reg | PCA9541_CTL_NTESTON); - } - } - return 0; -} - -static int pca9541_select_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int ret; - unsigned long timeout = jiffies + ARB2_TIMEOUT; - /* give up after this time */ - - data->arb_timeout = jiffies + ARB_TIMEOUT; - /* force bus ownership after this time */ - - do { - ret = pca9541_arbitrate(client); - if (ret) - return ret < 0 ? ret : 0; - - if (data->select_timeout == SELECT_DELAY_SHORT) - udelay(data->select_timeout); - else - msleep(data->select_timeout / 1000); - } while (time_is_after_eq_jiffies(timeout)); - - return -ETIMEDOUT; -} - -static int pca9541_release_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - pca9541_release_bus(client); - return 0; -} - -/* - * Arbitration management functions - */ -static void pca9641_release_bus(struct i2c_client *client) -{ - pca9541_reg_write(client, PCA9641_CONTROL, 0x80); //master 0x80 -} - -/* - * Channel arbitration - * - * Return values: - * <0: error - * 0 : bus not acquired - * 1 : bus acquired - */ -static int pca9641_arbitrate(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - struct pca9541 *data = i2c_mux_priv(muxc); - int reg_ctl, reg_sts; - - reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); - if (reg_ctl < 0) - return reg_ctl; - reg_sts = pca9541_reg_read(client, PCA9641_STATUS); - - if (BUSOFF(reg_ctl, reg_sts)) { - /* - * Bus is off. Request ownership or turn it on unless - * other master requested ownership. - */ - reg_ctl |= PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); - - if (lock_grant(reg_ctl)) { - /* - * Other master did not request ownership, - * or arbitration timeout expired. Take the bus. - */ - reg_ctl |= PCA9641_CTL_BUS_CONNECT - | PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - data->select_timeout = SELECT_DELAY_SHORT; - - return 1; - } else { - /* - * Other master requested ownership. - * Set extra long timeout to give it time to acquire it. - */ - data->select_timeout = SELECT_DELAY_LONG * 2; - } - } else if (lock_grant(reg_ctl)) { - /* - * Bus is on, and we own it. We are done with acquisition. - */ - reg_ctl |= PCA9641_CTL_BUS_CONNECT | PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - - return 1; - } else if (other_lock(reg_sts)) { - /* - * Other master owns the bus. - * If arbitration timeout has expired, force ownership. - * Otherwise request it. - */ - data->select_timeout = SELECT_DELAY_LONG; - reg_ctl |= PCA9641_CTL_LOCK_REQ; - pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); - } - return 0; -} - - -int pca9641_select_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - int ret; - int result; - unsigned long timeout = jiffies + ARB2_TIMEOUT; - /* give up after this time */ - data->arb_timeout = jiffies + ARB_TIMEOUT; - /* force bus ownership after this time */ - for (result = 0 ; result < PCA9641_RETRY_TIME ; result ++) { - do { - ret = pca9641_arbitrate(client); - if (ret == 1) { - return 0; - } - if (data->select_timeout == SELECT_DELAY_SHORT) - udelay(data->select_timeout); - else - msleep(data->select_timeout / 1000); - } while (time_is_after_eq_jiffies(timeout)); - timeout = jiffies + ARB2_TIMEOUT; - } - return -ETIMEDOUT; -} -EXPORT_SYMBOL(pca9641_select_chan); - -static int pca9641_release_chan(struct i2c_mux_core *muxc, u32 chan) -{ - struct pca9541 *data = i2c_mux_priv(muxc); - struct i2c_client *client = data->client; - if (pca_flag.flag) { - pca9641_release_bus(client); - } - return 0; -} - -static int pca9641_detect_id(struct i2c_client *client) -{ - int reg; - - reg = pca9541_reg_read(client, PCA9641_ID); - if (reg == PCA9641_ID_MAGIC) - return 1; - else - return 0; -} - - -static int pca9641_recordflag(struct i2c_adapter *adap) { - if (pca_flag.flag != -1) { - pr_err(" %s %d has init already!!!", __func__, __LINE__); - return -1 ; - } - pca_flag.nr = adap->nr; - PCA_DEBUG(" adap->nr:%d\n", adap->nr); - snprintf(pca_flag.name, sizeof(pca_flag.name),adap->name); - return 0; -} - -static void i2c_lock_adapter(struct i2c_adapter *adapter){ - struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); - if (parent) - i2c_lock_adapter(parent); - else - rt_mutex_lock(&adapter->bus_lock); -} - -void i2c_unlock_adapter(struct i2c_adapter *adapter) -{ - struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); - - if (parent) - i2c_unlock_adapter(parent); - else - rt_mutex_unlock(&adapter->bus_lock); -} -/* - * I2C init/probing/exit functions - */ -static int pca9541_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct i2c_adapter *adap = client->adapter; -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev); -#endif - struct i2c_mux_core *muxc; - struct pca9541 *data; - int force; - int ret = -ENODEV; - int detect_id; - - if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE_DATA)) - return -ENODEV; - - detect_id = pca9641_detect_id(client); - - /* - * I2C accesses are unprotected here. - * We have to lock the adapter before releasing the bus. - */ - if (detect_id == 0) { - i2c_lock_adapter(adap); - pca9541_release_bus(client); - i2c_unlock_adapter(adap); - } else { - i2c_lock_adapter(adap); - pca9641_release_bus(client); - i2c_unlock_adapter(adap); - } - - /* Create mux adapter */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - force = 0; - if (pdata) - force = pdata->modes[0].adap_id; -#endif - if (detect_id == 0) { - muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), - I2C_MUX_ARBITRATOR, - pca9541_select_chan, pca9541_release_chan); - if (!muxc) - return -ENOMEM; - - data = i2c_mux_priv(muxc); - data->client = client; - - i2c_set_clientdata(client, muxc); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - ret = i2c_mux_add_adapter(muxc, 0, 0, 0); -#else - ret = i2c_mux_add_adapter(muxc, force, 0, 0); -#endif - if (ret) - return ret; - } else { - muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), - I2C_MUX_ARBITRATOR, - pca9641_select_chan, pca9641_release_chan); - if (!muxc) - return -ENOMEM; - - data = i2c_mux_priv(muxc); - data->client = client; - - i2c_set_clientdata(client, muxc); - - ret = i2c_mux_add_adapter(muxc, force, 0, 0); - if (ret) - return ret; - } - pca9641_recordflag(muxc->adapter[0]); - - dev_info(&client->dev, "registered master selector for I2C %s\n", - client->name); - - return 0; - -} - -static int pca9541_remove(struct i2c_client *client) -{ - struct i2c_mux_core *muxc = i2c_get_clientdata(client); - - i2c_mux_del_adapters(muxc); - return 0; -} - -static struct i2c_driver pca9641_driver = { - .driver = { - .name = "pca9641", - .of_match_table = of_match_ptr(pca9541_of_match), - }, - .probe = pca9541_probe, - .remove = pca9541_remove, - .id_table = pca9541_id, -}; - -module_i2c_driver(pca9641_driver); - -MODULE_AUTHOR("support support@ragile.com"); -MODULE_DESCRIPTION("PCA9541 I2C master selector driver"); -MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile new file mode 100644 index 0000000000..269e95019c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/Makefile @@ -0,0 +1,21 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +#ifdef ENABLE_GCOV +#ifeq ($(ENABLE_GCOV), y) +#EXTRA_CFLAGS+= -fprofile-arcs -ftest-coverage -lgcov +#endif +#endif # ENABLE_GCOV + +obj-m := intel_spi.o +obj-m += intel_spi_platform.o + +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h new file mode 100644 index 0000000000..d0a570b1f3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/include/intel_spi.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Intel PCH/PCU SPI flash driver. + * + * Copyright (C) 2016, Intel Corporation + * Author: Mika Westerberg + */ + +#ifndef INTEL_SPI_H +#define INTEL_SPI_H + +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +struct intel_spi; +struct resource; + +struct intel_spi *intel_spi_probe(struct device *dev, + struct resource *mem, const struct intel_spi_boardinfo *info); +int intel_spi_remove(struct intel_spi *ispi); + +#endif /* INTEL_SPI_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c new file mode 100644 index 0000000000..98de90f0c0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi.c @@ -0,0 +1,969 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Intel PCH/PCU SPI flash driver. + * + * Copyright (C) 2016, Intel Corporation + * Author: Mika Westerberg + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "intel_spi.h" + +/* Offsets are from @ispi->base */ +#define BFPREG 0x00 + +#define HSFSTS_CTL 0x04 +#define HSFSTS_CTL_FSMIE BIT(31) +#define HSFSTS_CTL_FDBC_SHIFT 24 +#define HSFSTS_CTL_FDBC_MASK (0x3f << HSFSTS_CTL_FDBC_SHIFT) + +#define HSFSTS_CTL_FCYCLE_SHIFT 17 +#define HSFSTS_CTL_FCYCLE_MASK (0x0f << HSFSTS_CTL_FCYCLE_SHIFT) +/* HW sequencer opcodes */ +#define HSFSTS_CTL_FCYCLE_READ (0x00 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_WRITE (0x02 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_ERASE (0x03 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_ERASE_64K (0x04 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_RDID (0x06 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_WRSR (0x07 << HSFSTS_CTL_FCYCLE_SHIFT) +#define HSFSTS_CTL_FCYCLE_RDSR (0x08 << HSFSTS_CTL_FCYCLE_SHIFT) + +#define HSFSTS_CTL_FGO BIT(16) +#define HSFSTS_CTL_FLOCKDN BIT(15) +#define HSFSTS_CTL_FDV BIT(14) +#define HSFSTS_CTL_SCIP BIT(5) +#define HSFSTS_CTL_AEL BIT(2) +#define HSFSTS_CTL_FCERR BIT(1) +#define HSFSTS_CTL_FDONE BIT(0) + +#define FADDR 0x08 +#define DLOCK 0x0c +#define FDATA(n) (0x10 + ((n) * 4)) + +#define FRACC 0x50 + +#define FREG(n) (0x54 + ((n) * 4)) +#define FREG_BASE_MASK 0x3fff +#define FREG_LIMIT_SHIFT 16 +#define FREG_LIMIT_MASK (0x03fff << FREG_LIMIT_SHIFT) + +/* Offset is from @ispi->pregs */ +#define PR(n) ((n) * 4) +#define PR_WPE BIT(31) +#define PR_LIMIT_SHIFT 16 +#define PR_LIMIT_MASK (0x3fff << PR_LIMIT_SHIFT) +#define PR_RPE BIT(15) +#define PR_BASE_MASK 0x3fff + +/* Offsets are from @ispi->sregs */ +#define SSFSTS_CTL 0x00 +#define SSFSTS_CTL_FSMIE BIT(23) +#define SSFSTS_CTL_DS BIT(22) +#define SSFSTS_CTL_DBC_SHIFT 16 +#define SSFSTS_CTL_SPOP BIT(11) +#define SSFSTS_CTL_ACS BIT(10) +#define SSFSTS_CTL_SCGO BIT(9) +#define SSFSTS_CTL_COP_SHIFT 12 +#define SSFSTS_CTL_FRS BIT(7) +#define SSFSTS_CTL_DOFRS BIT(6) +#define SSFSTS_CTL_AEL BIT(4) +#define SSFSTS_CTL_FCERR BIT(3) +#define SSFSTS_CTL_FDONE BIT(2) +#define SSFSTS_CTL_SCIP BIT(0) + +#define PREOP_OPTYPE 0x04 +#define OPMENU0 0x08 +#define OPMENU1 0x0c + +#define OPTYPE_READ_NO_ADDR 0 +#define OPTYPE_WRITE_NO_ADDR 1 +#define OPTYPE_READ_WITH_ADDR 2 +#define OPTYPE_WRITE_WITH_ADDR 3 + +/* CPU specifics */ +#define BYT_PR 0x74 +#define BYT_SSFSTS_CTL 0x90 +#define BYT_BCR 0xfc +#define BYT_BCR_WPD BIT(0) +#define BYT_FREG_NUM 5 +#define BYT_PR_NUM 5 + +#define LPT_PR 0x74 +#define LPT_SSFSTS_CTL 0x90 +#define LPT_FREG_NUM 5 +#define LPT_PR_NUM 5 + +#define BXT_PR 0x84 +#define BXT_SSFSTS_CTL 0xa0 +#define BXT_FREG_NUM 12 +#define BXT_PR_NUM 6 + +#define CNL_PR 0x84 +#define CNL_FREG_NUM 6 +#define CNL_PR_NUM 5 + +#define LVSCC 0xc4 +#define UVSCC 0xc8 +#define ERASE_OPCODE_SHIFT 8 +#define ERASE_OPCODE_MASK (0xff << ERASE_OPCODE_SHIFT) +#define ERASE_64K_OPCODE_SHIFT 16 +#define ERASE_64K_OPCODE_MASK (0xff << ERASE_OPCODE_SHIFT) + +#define INTEL_SPI_TIMEOUT 5000 /* ms */ +#define INTEL_SPI_FIFO_SZ 64 + +/** + * struct intel_spi - Driver private data + * @dev: Device pointer + * @info: Pointer to board specific info + * @nor: SPI NOR layer structure + * @base: Beginning of MMIO space + * @pregs: Start of protection registers + * @sregs: Start of software sequencer registers + * @nregions: Maximum number of regions + * @pr_num: Maximum number of protected range registers + * @writeable: Is the chip writeable + * @locked: Is SPI setting locked + * @swseq_reg: Use SW sequencer in register reads/writes + * @swseq_erase: Use SW sequencer in erase operation + * @erase_64k: 64k erase supported + * @atomic_preopcode: Holds preopcode when atomic sequence is requested + * @opcodes: Opcodes which are supported. This are programmed by BIOS + * before it locks down the controller. + */ +struct intel_spi { + struct device *dev; + const struct intel_spi_boardinfo *info; + struct spi_nor nor; + void __iomem *base; + void __iomem *pregs; + void __iomem *sregs; + size_t nregions; + size_t pr_num; + bool writeable; + bool locked; + bool swseq_reg; + bool swseq_erase; + bool erase_64k; + u8 atomic_preopcode; + u8 opcodes[8]; +}; + +static bool writeable; +module_param(writeable, bool, 0); +MODULE_PARM_DESC(writeable, "Enable write access to SPI flash chip (default=0)"); + +static void intel_spi_dump_regs(struct intel_spi *ispi) +{ + u32 value; + int i; + + dev_dbg(ispi->dev, "BFPREG=0x%08x\n", readl(ispi->base + BFPREG)); + + value = readl(ispi->base + HSFSTS_CTL); + dev_dbg(ispi->dev, "HSFSTS_CTL=0x%08x\n", value); + if (value & HSFSTS_CTL_FLOCKDN) + dev_dbg(ispi->dev, "-> Locked\n"); + + dev_dbg(ispi->dev, "FADDR=0x%08x\n", readl(ispi->base + FADDR)); + dev_dbg(ispi->dev, "DLOCK=0x%08x\n", readl(ispi->base + DLOCK)); + + for (i = 0; i < 16; i++) + dev_dbg(ispi->dev, "FDATA(%d)=0x%08x\n", + i, readl(ispi->base + FDATA(i))); + + dev_dbg(ispi->dev, "FRACC=0x%08x\n", readl(ispi->base + FRACC)); + + for (i = 0; i < ispi->nregions; i++) + dev_dbg(ispi->dev, "FREG(%d)=0x%08x\n", i, + readl(ispi->base + FREG(i))); + for (i = 0; i < ispi->pr_num; i++) + dev_dbg(ispi->dev, "PR(%d)=0x%08x\n", i, + readl(ispi->pregs + PR(i))); + + if (ispi->sregs) { + value = readl(ispi->sregs + SSFSTS_CTL); + dev_dbg(ispi->dev, "SSFSTS_CTL=0x%08x\n", value); + dev_dbg(ispi->dev, "PREOP_OPTYPE=0x%08x\n", + readl(ispi->sregs + PREOP_OPTYPE)); + dev_dbg(ispi->dev, "OPMENU0=0x%08x\n", + readl(ispi->sregs + OPMENU0)); + dev_dbg(ispi->dev, "OPMENU1=0x%08x\n", + readl(ispi->sregs + OPMENU1)); + } + + if (ispi->info->type == INTEL_SPI_BYT) + dev_dbg(ispi->dev, "BCR=0x%08x\n", readl(ispi->base + BYT_BCR)); + + dev_dbg(ispi->dev, "LVSCC=0x%08x\n", readl(ispi->base + LVSCC)); + dev_dbg(ispi->dev, "UVSCC=0x%08x\n", readl(ispi->base + UVSCC)); + + dev_dbg(ispi->dev, "Protected regions:\n"); + for (i = 0; i < ispi->pr_num; i++) { + u32 base, limit; + + value = readl(ispi->pregs + PR(i)); + if (!(value & (PR_WPE | PR_RPE))) + continue; + + limit = (value & PR_LIMIT_MASK) >> PR_LIMIT_SHIFT; + base = value & PR_BASE_MASK; + + dev_dbg(ispi->dev, " %02d base: 0x%08x limit: 0x%08x [%c%c]\n", + i, base << 12, (limit << 12) | 0xfff, + value & PR_WPE ? 'W' : '.', + value & PR_RPE ? 'R' : '.'); + } + + dev_dbg(ispi->dev, "Flash regions:\n"); + for (i = 0; i < ispi->nregions; i++) { + u32 region, base, limit; + + region = readl(ispi->base + FREG(i)); + base = region & FREG_BASE_MASK; + limit = (region & FREG_LIMIT_MASK) >> FREG_LIMIT_SHIFT; + + if (base >= limit || (i > 0 && limit == 0)) + dev_dbg(ispi->dev, " %02d disabled\n", i); + else + dev_dbg(ispi->dev, " %02d base: 0x%08x limit: 0x%08x\n", + i, base << 12, (limit << 12) | 0xfff); + } + + dev_dbg(ispi->dev, "Using %cW sequencer for register access\n", + ispi->swseq_reg ? 'S' : 'H'); + dev_dbg(ispi->dev, "Using %cW sequencer for erase operation\n", + ispi->swseq_erase ? 'S' : 'H'); +} + +/* Reads max INTEL_SPI_FIFO_SZ bytes from the device fifo */ +static int intel_spi_read_block(struct intel_spi *ispi, void *buf, size_t size) +{ + size_t bytes; + int i = 0; + + if (size > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + while (size > 0) { + bytes = min_t(size_t, size, 4); + memcpy_fromio(buf, ispi->base + FDATA(i), bytes); + size -= bytes; + buf += bytes; + i++; + } + + return 0; +} + +/* Writes max INTEL_SPI_FIFO_SZ bytes to the device fifo */ +static int intel_spi_write_block(struct intel_spi *ispi, const void *buf, + size_t size) +{ + size_t bytes; + int i = 0; + + if (size > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + while (size > 0) { + bytes = min_t(size_t, size, 4); + memcpy_toio(ispi->base + FDATA(i), buf, bytes); + size -= bytes; + buf += bytes; + i++; + } + + return 0; +} + +static int intel_spi_wait_hw_busy(struct intel_spi *ispi) +{ + u32 val; + + return readl_poll_timeout(ispi->base + HSFSTS_CTL, val, + !(val & HSFSTS_CTL_SCIP), 0, + INTEL_SPI_TIMEOUT * 1000); +} + +static int intel_spi_wait_sw_busy(struct intel_spi *ispi) +{ + u32 val; + + return readl_poll_timeout(ispi->sregs + SSFSTS_CTL, val, + !(val & SSFSTS_CTL_SCIP), 0, + INTEL_SPI_TIMEOUT * 1000); +} + +static int intel_spi_init(struct intel_spi *ispi) +{ + u32 opmenu0, opmenu1, lvscc, uvscc, val; + int i; + + switch (ispi->info->type) { + case INTEL_SPI_BYT: + ispi->sregs = ispi->base + BYT_SSFSTS_CTL; + ispi->pregs = ispi->base + BYT_PR; + ispi->nregions = BYT_FREG_NUM; + ispi->pr_num = BYT_PR_NUM; + ispi->swseq_reg = true; + + if (writeable) { + /* Disable write protection */ + val = readl(ispi->base + BYT_BCR); + if (!(val & BYT_BCR_WPD)) { + val |= BYT_BCR_WPD; + writel(val, ispi->base + BYT_BCR); + val = readl(ispi->base + BYT_BCR); + } + + ispi->writeable = !!(val & BYT_BCR_WPD); + } + + break; + + case INTEL_SPI_LPT: + ispi->sregs = ispi->base + LPT_SSFSTS_CTL; + ispi->pregs = ispi->base + LPT_PR; + ispi->nregions = LPT_FREG_NUM; + ispi->pr_num = LPT_PR_NUM; + ispi->swseq_reg = true; + break; + + case INTEL_SPI_BXT: + ispi->sregs = ispi->base + BXT_SSFSTS_CTL; + ispi->pregs = ispi->base + BXT_PR; + ispi->nregions = BXT_FREG_NUM; + ispi->pr_num = BXT_PR_NUM; + ispi->erase_64k = true; + break; + + case INTEL_SPI_CNL: + ispi->sregs = NULL; + ispi->pregs = ispi->base + CNL_PR; + ispi->nregions = CNL_FREG_NUM; + ispi->pr_num = CNL_PR_NUM; + break; + + default: + return -EINVAL; + } + + /* Disable #SMI generation from HW sequencer */ + val = readl(ispi->base + HSFSTS_CTL); + val &= ~HSFSTS_CTL_FSMIE; + writel(val, ispi->base + HSFSTS_CTL); + + /* + * Determine whether erase operation should use HW or SW sequencer. + * + * The HW sequencer has a predefined list of opcodes, with only the + * erase opcode being programmable in LVSCC and UVSCC registers. + * If these registers don't contain a valid erase opcode, erase + * cannot be done using HW sequencer. + */ + lvscc = readl(ispi->base + LVSCC); + uvscc = readl(ispi->base + UVSCC); + if (!(lvscc & ERASE_OPCODE_MASK) || !(uvscc & ERASE_OPCODE_MASK)) + ispi->swseq_erase = true; + /* SPI controller on Intel BXT supports 64K erase opcode */ + if (ispi->info->type == INTEL_SPI_BXT && !ispi->swseq_erase) + if (!(lvscc & ERASE_64K_OPCODE_MASK) || + !(uvscc & ERASE_64K_OPCODE_MASK)) + ispi->erase_64k = false; + + if (ispi->sregs == NULL && (ispi->swseq_reg || ispi->swseq_erase)) { + dev_err(ispi->dev, "software sequencer not supported, but required\n"); + return -EINVAL; + } + + /* + * Some controllers can only do basic operations using hardware + * sequencer. All other operations are supposed to be carried out + * using software sequencer. + */ + if (ispi->swseq_reg) { + /* Disable #SMI generation from SW sequencer */ + val = readl(ispi->sregs + SSFSTS_CTL); + val &= ~SSFSTS_CTL_FSMIE; + writel(val, ispi->sregs + SSFSTS_CTL); + } + + /* Check controller's lock status */ + val = readl(ispi->base + HSFSTS_CTL); + ispi->locked = !!(val & HSFSTS_CTL_FLOCKDN); + + if (ispi->locked && ispi->sregs) { + /* + * BIOS programs allowed opcodes and then locks down the + * register. So read back what opcodes it decided to support. + * That's the set we are going to support as well. + */ + opmenu0 = readl(ispi->sregs + OPMENU0); + opmenu1 = readl(ispi->sregs + OPMENU1); + + if (opmenu0 && opmenu1) { + for (i = 0; i < ARRAY_SIZE(ispi->opcodes) / 2; i++) { + ispi->opcodes[i] = opmenu0 >> i * 8; + ispi->opcodes[i + 4] = opmenu1 >> i * 8; + } + } + } + + intel_spi_dump_regs(ispi); + + return 0; +} + +static int intel_spi_opcode_index(struct intel_spi *ispi, u8 opcode, int optype) +{ + int i; + int preop; + + if (ispi->locked) { + for (i = 0; i < ARRAY_SIZE(ispi->opcodes); i++) + if (ispi->opcodes[i] == opcode) + return i; + + return -EINVAL; + } + + /* The lock is off, so just use index 0 */ + writel(opcode, ispi->sregs + OPMENU0); + preop = readw(ispi->sregs + PREOP_OPTYPE); + writel(optype << 16 | preop, ispi->sregs + PREOP_OPTYPE); + + return 0; +} + +static int intel_spi_hw_cycle(struct intel_spi *ispi, u8 opcode, size_t len) +{ + u32 val, status; + int ret; + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FCYCLE_MASK | HSFSTS_CTL_FDBC_MASK); + + switch (opcode) { + case SPINOR_OP_RDID: + val |= HSFSTS_CTL_FCYCLE_RDID; + break; + case SPINOR_OP_WRSR: + val |= HSFSTS_CTL_FCYCLE_WRSR; + break; + case SPINOR_OP_RDSR: + val |= HSFSTS_CTL_FCYCLE_RDSR; + break; + default: + return -EINVAL; + } + + if (len > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + val |= (len - 1) << HSFSTS_CTL_FDBC_SHIFT; + val |= HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + return -EIO; + else if (status & HSFSTS_CTL_AEL) + return -EACCES; + + return 0; +} + +static int intel_spi_sw_cycle(struct intel_spi *ispi, u8 opcode, size_t len, + int optype) +{ + u32 val = 0, status; + u8 atomic_preopcode; + int ret; + + ret = intel_spi_opcode_index(ispi, opcode, optype); + if (ret < 0) + return ret; + + if (len > INTEL_SPI_FIFO_SZ) + return -EINVAL; + + /* + * Always clear it after each SW sequencer operation regardless + * of whether it is successful or not. + */ + atomic_preopcode = ispi->atomic_preopcode; + ispi->atomic_preopcode = 0; + + /* Only mark 'Data Cycle' bit when there is data to be transferred */ + if (len > 0) + val = ((len - 1) << SSFSTS_CTL_DBC_SHIFT) | SSFSTS_CTL_DS; + val |= ret << SSFSTS_CTL_COP_SHIFT; + val |= SSFSTS_CTL_FCERR | SSFSTS_CTL_FDONE; + val |= SSFSTS_CTL_SCGO; + if (atomic_preopcode) { + u16 preop; + + switch (optype) { + case OPTYPE_WRITE_NO_ADDR: + case OPTYPE_WRITE_WITH_ADDR: + /* Pick matching preopcode for the atomic sequence */ + preop = readw(ispi->sregs + PREOP_OPTYPE); + if ((preop & 0xff) == atomic_preopcode) + ; /* Do nothing */ + else if ((preop >> 8) == atomic_preopcode) + val |= SSFSTS_CTL_SPOP; + else + return -EINVAL; + + /* Enable atomic sequence */ + val |= SSFSTS_CTL_ACS; + break; + + default: + return -EINVAL; + } + + } + writel(val, ispi->sregs + SSFSTS_CTL); + + ret = intel_spi_wait_sw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->sregs + SSFSTS_CTL); + if (status & SSFSTS_CTL_FCERR) + return -EIO; + else if (status & SSFSTS_CTL_AEL) + return -EACCES; + + return 0; +} + +static int intel_spi_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, + size_t len) +{ + struct intel_spi *ispi = nor->priv; + int ret; + + /* Address of the first chip */ + writel(0, ispi->base + FADDR); + + if (ispi->swseq_reg) + ret = intel_spi_sw_cycle(ispi, opcode, len, + OPTYPE_READ_NO_ADDR); + else + ret = intel_spi_hw_cycle(ispi, opcode, len); + + if (ret) + return ret; + + return intel_spi_read_block(ispi, buf, len); +} + +static int intel_spi_write_reg(struct spi_nor *nor, u8 opcode, const u8 *buf, + size_t len) +{ + struct intel_spi *ispi = nor->priv; + int ret; + + /* + * This is handled with atomic operation and preop code in Intel + * controller so we only verify that it is available. If the + * controller is not locked, program the opcode to the PREOP + * register for later use. + * + * When hardware sequencer is used there is no need to program + * any opcodes (it handles them automatically as part of a command). + */ + if (opcode == SPINOR_OP_WREN) { + u16 preop; + + if (!ispi->swseq_reg) + return 0; + + preop = readw(ispi->sregs + PREOP_OPTYPE); + if ((preop & 0xff) != opcode && (preop >> 8) != opcode) { + if (ispi->locked) + return -EINVAL; + writel(opcode, ispi->sregs + PREOP_OPTYPE); + } + + /* + * This enables atomic sequence on next SW sycle. Will + * be cleared after next operation. + */ + ispi->atomic_preopcode = opcode; + return 0; + } + + /* + * We hope that HW sequencer will do the right thing automatically and + * with the SW sequencer we cannot use preopcode anyway, so just ignore + * the Write Disable operation and pretend it was completed + * successfully. + */ + if (opcode == SPINOR_OP_WRDI) + return 0; + + writel(0, ispi->base + FADDR); + + /* Write the value beforehand */ + ret = intel_spi_write_block(ispi, buf, len); + if (ret) + return ret; + + if (ispi->swseq_reg) + return intel_spi_sw_cycle(ispi, opcode, len, + OPTYPE_WRITE_NO_ADDR); + return intel_spi_hw_cycle(ispi, opcode, len); +} + +static ssize_t intel_spi_read(struct spi_nor *nor, loff_t from, size_t len, + u_char *read_buf) +{ + struct intel_spi *ispi = nor->priv; + size_t block_size, retlen = 0; + u32 val, status; + ssize_t ret; + + /* + * Atomic sequence is not expected with HW sequencer reads. Make + * sure it is cleared regardless. + */ + if (WARN_ON_ONCE(ispi->atomic_preopcode)) + ispi->atomic_preopcode = 0; + + switch (nor->read_opcode) { + case SPINOR_OP_READ: + case SPINOR_OP_READ_FAST: + case SPINOR_OP_READ_4B: + case SPINOR_OP_READ_FAST_4B: + break; + default: + return -EINVAL; + } + + while (len > 0) { + block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); + + /* Read cannot cross 4K boundary */ + block_size = min_t(loff_t, from + block_size, + round_up(from + 1, SZ_4K)) - from; + + writel(from, ispi->base + FADDR); + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FDBC_MASK | HSFSTS_CTL_FCYCLE_MASK); + val |= HSFSTS_CTL_AEL | HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= (block_size - 1) << HSFSTS_CTL_FDBC_SHIFT; + val |= HSFSTS_CTL_FCYCLE_READ; + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + ret = -EIO; + else if (status & HSFSTS_CTL_AEL) + ret = -EACCES; + + if (ret < 0) { + dev_err(ispi->dev, "read error: %llx: %#x\n", from, + status); + return ret; + } + + ret = intel_spi_read_block(ispi, read_buf, block_size); + if (ret) + return ret; + + len -= block_size; + from += block_size; + retlen += block_size; + read_buf += block_size; + } + + return retlen; +} + +static ssize_t intel_spi_write(struct spi_nor *nor, loff_t to, size_t len, + const u_char *write_buf) +{ + struct intel_spi *ispi = nor->priv; + size_t block_size, retlen = 0; + u32 val, status; + ssize_t ret; + + /* Not needed with HW sequencer write, make sure it is cleared */ + ispi->atomic_preopcode = 0; + + while (len > 0) { + block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); + + /* Write cannot cross 4K boundary */ + block_size = min_t(loff_t, to + block_size, + round_up(to + 1, SZ_4K)) - to; + + writel(to, ispi->base + FADDR); + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FDBC_MASK | HSFSTS_CTL_FCYCLE_MASK); + val |= HSFSTS_CTL_AEL | HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= (block_size - 1) << HSFSTS_CTL_FDBC_SHIFT; + val |= HSFSTS_CTL_FCYCLE_WRITE; + + ret = intel_spi_write_block(ispi, write_buf, block_size); + if (ret) { + dev_err(ispi->dev, "failed to write block\n"); + return ret; + } + + /* Start the write now */ + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) { + dev_err(ispi->dev, "timeout\n"); + return ret; + } + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + ret = -EIO; + else if (status & HSFSTS_CTL_AEL) + ret = -EACCES; + + if (ret < 0) { + dev_err(ispi->dev, "write error: %llx: %#x\n", to, + status); + return ret; + } + + len -= block_size; + to += block_size; + retlen += block_size; + write_buf += block_size; + } + + return retlen; +} + +static int intel_spi_erase(struct spi_nor *nor, loff_t offs) +{ + size_t erase_size, len = nor->mtd.erasesize; + struct intel_spi *ispi = nor->priv; + u32 val, status, cmd; + int ret; + + /* If the hardware can do 64k erase use that when possible */ + if (len >= SZ_64K && ispi->erase_64k) { + cmd = HSFSTS_CTL_FCYCLE_ERASE_64K; + erase_size = SZ_64K; + } else { + cmd = HSFSTS_CTL_FCYCLE_ERASE; + erase_size = SZ_4K; + } + + if (ispi->swseq_erase) { + while (len > 0) { + writel(offs, ispi->base + FADDR); + + ret = intel_spi_sw_cycle(ispi, nor->erase_opcode, + 0, OPTYPE_WRITE_WITH_ADDR); + if (ret) + return ret; + + offs += erase_size; + len -= erase_size; + } + + return 0; + } + + /* Not needed with HW sequencer erase, make sure it is cleared */ + ispi->atomic_preopcode = 0; + + while (len > 0) { + writel(offs, ispi->base + FADDR); + + val = readl(ispi->base + HSFSTS_CTL); + val &= ~(HSFSTS_CTL_FDBC_MASK | HSFSTS_CTL_FCYCLE_MASK); + val |= HSFSTS_CTL_AEL | HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE; + val |= cmd; + val |= HSFSTS_CTL_FGO; + writel(val, ispi->base + HSFSTS_CTL); + + ret = intel_spi_wait_hw_busy(ispi); + if (ret) + return ret; + + status = readl(ispi->base + HSFSTS_CTL); + if (status & HSFSTS_CTL_FCERR) + return -EIO; + else if (status & HSFSTS_CTL_AEL) + return -EACCES; + + offs += erase_size; + len -= erase_size; + } + + return 0; +} + +static bool intel_spi_is_protected(const struct intel_spi *ispi, + unsigned int base, unsigned int limit) +{ + int i; + + for (i = 0; i < ispi->pr_num; i++) { + u32 pr_base, pr_limit, pr_value; + + pr_value = readl(ispi->pregs + PR(i)); + if (!(pr_value & (PR_WPE | PR_RPE))) + continue; + + pr_limit = (pr_value & PR_LIMIT_MASK) >> PR_LIMIT_SHIFT; + pr_base = pr_value & PR_BASE_MASK; + + if (pr_base >= base && pr_limit <= limit) + return true; + } + + return false; +} + +/* + * There will be a single partition holding all enabled flash regions. We + * call this "BIOS". + */ +static void intel_spi_fill_partition(struct intel_spi *ispi, + struct mtd_partition *part) +{ + u64 end; + int i; + + mem_clear(part, sizeof(*part)); + + /* Start from the mandatory descriptor region */ + part->size = 4096; + part->name = "BIOS"; + + /* + * Now try to find where this partition ends based on the flash + * region registers. + */ + for (i = 1; i < ispi->nregions; i++) { + u32 region, base, limit; + + region = readl(ispi->base + FREG(i)); + base = region & FREG_BASE_MASK; + limit = (region & FREG_LIMIT_MASK) >> FREG_LIMIT_SHIFT; + + if (base >= limit || limit == 0) + continue; + + /* + * If any of the regions have protection bits set, make the + * whole partition read-only to be on the safe side. + */ + if (intel_spi_is_protected(ispi, base, limit)) + ispi->writeable = false; + + end = (limit << 12) + 4096; + if (end > part->size) + part->size = end; + } +} + +static const struct spi_nor_controller_ops intel_spi_controller_ops = { + .read_reg = intel_spi_read_reg, + .write_reg = intel_spi_write_reg, + .read = intel_spi_read, + .write = intel_spi_write, + .erase = intel_spi_erase, +}; + +struct intel_spi *intel_spi_probe(struct device *dev, + struct resource *mem, const struct intel_spi_boardinfo *info) +{ + const struct spi_nor_hwcaps hwcaps = { + .mask = SNOR_HWCAPS_READ | + SNOR_HWCAPS_READ_FAST | + SNOR_HWCAPS_PP, + }; + struct mtd_partition part; + struct intel_spi *ispi; + int ret; + + if (!info || !mem) + return ERR_PTR(-EINVAL); + + ispi = devm_kzalloc(dev, sizeof(*ispi), GFP_KERNEL); + if (!ispi) + return ERR_PTR(-ENOMEM); + + ispi->base = devm_ioremap_resource(dev, mem); + if (IS_ERR(ispi->base)) + return ERR_CAST(ispi->base); + + ispi->dev = dev; + ispi->info = info; + ispi->writeable = info->writeable; + + ret = intel_spi_init(ispi); + if (ret) + return ERR_PTR(ret); + + ispi->nor.dev = ispi->dev; + ispi->nor.priv = ispi; + ispi->nor.controller_ops = &intel_spi_controller_ops; + + ret = spi_nor_scan(&ispi->nor, NULL, &hwcaps); + if (ret) { + dev_info(dev, "failed to locate the chip\n"); + return ERR_PTR(ret); + } + + intel_spi_fill_partition(ispi, &part); + + /* Prevent writes if not explicitly enabled */ + if (!ispi->writeable || !writeable) + ispi->nor.mtd.flags &= ~MTD_WRITEABLE; + + ret = mtd_device_register(&ispi->nor.mtd, &part, 1); + if (ret) + return ERR_PTR(ret); + + return ispi; +} +EXPORT_SYMBOL_GPL(intel_spi_probe); + +int intel_spi_remove(struct intel_spi *ispi) +{ + return mtd_device_unregister(&ispi->nor.mtd); +} +EXPORT_SYMBOL_GPL(intel_spi_remove); + +MODULE_DESCRIPTION("Intel PCH/PCU SPI flash core driver"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c new file mode 100644 index 0000000000..b9f294860c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/intel_spi/intel_spi_platform.c @@ -0,0 +1,167 @@ +/* + * Intel PCH/PCU SPI flash platform driver. + * + * Copyright (C) 2016, Intel Corporation + * Author: Mika Westerberg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include + +#include "intel_spi.h" + +#define PCI_VENDOR_ID_D1527_LPC (0x8c54) + +#define BIOS_CNTL (0xdc) +#define BIOS_CNTL_SRC_SHIFT 2 +#define BIOS_CNTL_WN BIT(0) +#define BIOS_CNTL_BLE BIT(1) +#define BIOS_CNTL_SMM_BMP BIT(5) + +#define RCBABASE 0xf0 + +int intel_spi_platform_debug = 0; +module_param(intel_spi_platform_debug, int, S_IRUGO | S_IWUSR); +int intel_spi_platform_error = 0; +module_param(intel_spi_platform_error, int, S_IRUGO | S_IWUSR); + +static bool writeable; +module_param(writeable, bool, 0); +MODULE_PARM_DESC(writeable, "Enable write access to BIOS (default=0)"); + +#define INTEL_SPI_PLATFORM_VERBOSE(fmt, args...) do { \ + if (intel_spi_platform_debug) { \ + printk(KERN_INFO "[INTEL_SPI_PLATFORM][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ + } while (0) + +#define INTEL_SPI_PLATFORM_ERROR(fmt, args...) do { \ + if (intel_spi_platform_error) { \ + printk(KERN_ERR "[INTEL_SPI_PLATFORM][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ + } while (0) + +static void intel_spi_enable_bios_write(struct pci_dev *pci_dev, struct intel_spi_boardinfo *info) +{ + u8 bios_cntl, value, want, new; + + if (writeable) { + pci_read_config_byte(pci_dev, BIOS_CNTL, &bios_cntl); + want = bios_cntl; + value = (bios_cntl >> BIOS_CNTL_SRC_SHIFT) & 0x3 ; + if (value == 0x3) { + INTEL_SPI_PLATFORM_VERBOSE("invalid prefetching/caching settings, "); + } else { + INTEL_SPI_PLATFORM_VERBOSE("prefetching %sabled, caching %sabled, ", + (value & 0x2) ? "en" : "dis", + (value & 0x1) ? "dis" : "en"); + } + + /* writeable regardless */ + want &= ~BIOS_CNTL_SMM_BMP; + /* write enable */ + want |= BIOS_CNTL_WN; + /* BIOS lock disabled */ + want &= ~BIOS_CNTL_BLE; + INTEL_SPI_PLATFORM_VERBOSE("bios cntl is:0x%x, want is:0x%x\n", bios_cntl, want); + pci_write_config_byte(pci_dev, BIOS_CNTL, want); + pci_read_config_byte(pci_dev, BIOS_CNTL, &new); + INTEL_SPI_PLATFORM_VERBOSE("\nBIOS_CNTL = 0x%02x: ", new); + INTEL_SPI_PLATFORM_VERBOSE("BIOS Lock Enable: %sabled, ", (new & BIOS_CNTL_BLE) ? "en" : "dis"); + INTEL_SPI_PLATFORM_VERBOSE("BIOS Write Enable: %sabled\n", (new & BIOS_CNTL_WN) ? "en" : "dis"); + + if (new & BIOS_CNTL_SMM_BMP) { + INTEL_SPI_PLATFORM_VERBOSE("BIOS region SMM protection is enabled!\n"); + } + + if (new != want) { + INTEL_SPI_PLATFORM_VERBOSE("Warning: Setting Bios Control at 0x%x from 0x%02x to 0x%02x failed.\n" + "New value is 0x%02x.\n", BIOS_CNTL, value, want, new); + } else { + info->writeable = !!(new & BIOS_CNTL_WN); + } + INTEL_SPI_PLATFORM_VERBOSE("Bios Control is 0x%x\n", new); + } else { + INTEL_SPI_PLATFORM_VERBOSE("Bios don't write\n"); + } + + return ; +} + +static int intel_spi_platform_probe(struct platform_device *pdev) +{ + struct intel_spi_boardinfo *info; + struct intel_spi *ispi; + struct resource *mem; + struct pci_dev *pci_dev = NULL; + u32 rcba; + + info = dev_get_platdata(&pdev->dev); + if (!info) + return -EINVAL; + + pci_dev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_D1527_LPC, pci_dev); + if (!pci_dev) { + INTEL_SPI_PLATFORM_ERROR("pci_get_device(0x8086, 0x8c54) failed!\n"); + return -1; + } + + switch (info->type) { + case INTEL_SPI_LPT: + pci_read_config_dword(pci_dev, RCBABASE, &rcba); + if (rcba & 1) { + intel_spi_enable_bios_write(pci_dev, info); + } + break; + default: + INTEL_SPI_PLATFORM_ERROR("info type[%d] not need set writeable.\n",info->type); + break; + } + INTEL_SPI_PLATFORM_VERBOSE("intel spi boardinfo writeable is %sabled\n", + info->writeable ? "en" : "dis"); + + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + ispi = intel_spi_probe(&pdev->dev, mem, info); + if (IS_ERR(ispi)) + return PTR_ERR(ispi); + + platform_set_drvdata(pdev, ispi); + return 0; +} + +static int intel_spi_platform_remove(struct platform_device *pdev) +{ + struct intel_spi *ispi = platform_get_drvdata(pdev); + + return intel_spi_remove(ispi); +} + +static struct of_device_id intel_spi_match[] = { + { + .compatible = "spi-c224", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, intel_spi_match); + +static struct platform_driver intel_spi_platform_driver = { + .probe = intel_spi_platform_probe, + .remove = intel_spi_platform_remove, + .driver = { + .name = "intel-spi", + .of_match_table = intel_spi_match, + }, +}; + +module_platform_driver(intel_spi_platform_driver); + +MODULE_DESCRIPTION("Intel PCH/PCU SPI flash platform driver"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:intel-spi"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile new file mode 100644 index 0000000000..4226f27342 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/Makefile @@ -0,0 +1,34 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +#ifdef ENABLE_GCOV +#ifeq ($(ENABLE_GCOV), y) +#EXTRA_CFLAGS+= -fprofile-arcs -ftest-coverage -lgcov +#endif +#endif # ENABLE_GCOV + +obj-m := wb_lm75.o +obj-m += wb_tmp401.o +obj-m += wb_i2c_mux_pca9641.o +obj-m += wb_i2c_mux_pca954x.o +obj-m += wb_i2c_i801.o +obj-m += wb_i2c_algo_bit.o +obj-m += wb_i2c_gpio.o +obj-m += wb_i2c_gpio_device.o +obj-m += wb_at24.o +obj-m += wb_pmbus_core.o +obj-m += wb_csu550.o +obj-m += wb_ina3221.o +obj-m += wb_isl68137.o +obj-m += wb_tps53622.o +obj-m += wb_ucd9000.o + +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd $(PWD)/*.mod + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c new file mode 100644 index 0000000000..1075e6ef18 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_at24.c @@ -0,0 +1,861 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * at24.c - handle most I2C EEPROMs + * + * Copyright (C) 2005-2007 David Brownell + * Copyright (C) 2008 Wolfram Sang, Pengutronix + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Address pointer is 16 bit. */ +#define AT24_FLAG_ADDR16 BIT(7) +/* sysfs-entry will be read-only. */ +#define AT24_FLAG_READONLY BIT(6) +/* sysfs-entry will be world-readable. */ +#define AT24_FLAG_IRUGO BIT(5) +/* Take always 8 addresses (24c00). */ +#define AT24_FLAG_TAKE8ADDR BIT(4) +/* Factory-programmed serial number. */ +#define AT24_FLAG_SERIAL BIT(3) +/* Factory-programmed mac address. */ +#define AT24_FLAG_MAC BIT(2) +/* Does not auto-rollover reads to the next slave address. */ +#define AT24_FLAG_NO_RDROL BIT(1) + +/* + * I2C EEPROMs from most vendors are inexpensive and mostly interchangeable. + * Differences between different vendor product lines (like Atmel AT24C or + * MicroChip 24LC, etc) won't much matter for typical read/write access. + * There are also I2C RAM chips, likewise interchangeable. One example + * would be the PCF8570, which acts like a 24c02 EEPROM (256 bytes). + * + * However, misconfiguration can lose data. "Set 16-bit memory address" + * to a part with 8-bit addressing will overwrite data. Writing with too + * big a page size also loses data. And it's not safe to assume that the + * conventional addresses 0x50..0x57 only hold eeproms; a PCF8563 RTC + * uses 0x51, for just one example. + * + * Accordingly, explicit board-specific configuration data should be used + * in almost all cases. (One partial exception is an SMBus used to access + * "SPD" data for DRAM sticks. Those only use 24c02 EEPROMs.) + * + * So this driver uses "new style" I2C driver binding, expecting to be + * told what devices exist. That may be in arch/X/mach-Y/board-Z.c or + * similar kernel-resident tables; or, configuration data coming from + * a bootloader. + * + * Other than binding model, current differences from "eeprom" driver are + * that this one handles write access and isn't restricted to 24c02 devices. + * It also handles larger devices (32 kbit and up) with two-byte addresses, + * which won't work on pure SMBus systems. + */ + +struct at24_client { + struct i2c_client *client; + struct regmap *regmap; +}; + +struct at24_data { + /* + * Lock protects against activities from other Linux tasks, + * but not from changes by other I2C masters. + */ + struct mutex lock; + + unsigned int write_max; + unsigned int num_addresses; + unsigned int offset_adj; + + u32 byte_len; + u16 page_size; + u8 flags; + + struct nvmem_device *nvmem; + struct regulator *vcc_reg; + void (*read_post)(unsigned int off, char *buf, size_t count); + + /* + * Some chips tie up multiple I2C addresses; dummy devices reserve + * them for us, and we'll use them with SMBus calls. + */ + struct at24_client client[]; +}; + +/* + * This parameter is to help this driver avoid blocking other drivers out + * of I2C for potentially troublesome amounts of time. With a 100 kHz I2C + * clock, one 256 byte read takes about 1/43 second which is excessive; + * but the 1/170 second it takes at 400 kHz may be quite reasonable; and + * at 1 MHz (Fm+) a 1/430 second delay could easily be invisible. + * + * This value is forced to be a power of two so that writes align on pages. + */ +static unsigned int at24_io_limit = 128; +module_param_named(io_limit, at24_io_limit, uint, 0); +MODULE_PARM_DESC(at24_io_limit, "Maximum bytes per I/O (default 128)"); + +/* + * Specs often allow 5 msec for a page write, sometimes 20 msec; + * it's important to recover from write timeouts. + */ +static unsigned int at24_write_timeout = 25; +module_param_named(write_timeout, at24_write_timeout, uint, 0); +MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)"); + +struct at24_chip_data { + u32 byte_len; + u8 flags; + void (*read_post)(unsigned int off, char *buf, size_t count); +}; + +#define AT24_CHIP_DATA(_name, _len, _flags) \ + static const struct at24_chip_data _name = { \ + .byte_len = _len, .flags = _flags, \ + } + +#define AT24_CHIP_DATA_CB(_name, _len, _flags, _read_post) \ + static const struct at24_chip_data _name = { \ + .byte_len = _len, .flags = _flags, \ + .read_post = _read_post, \ + } + +static void at24_read_post_vaio(unsigned int off, char *buf, size_t count) +{ + int i; + + if (capable(CAP_SYS_ADMIN)) + return; + + /* + * Hide VAIO private settings to regular users: + * - BIOS passwords: bytes 0x00 to 0x0f + * - UUID: bytes 0x10 to 0x1f + * - Serial number: 0xc0 to 0xdf + */ + for (i = 0; i < count; i++) { + if ((off + i <= 0x1f) || + (off + i >= 0xc0 && off + i <= 0xdf)) + buf[i] = 0; + } +} + +/* needs 8 addresses as A0-A2 are ignored */ +AT24_CHIP_DATA(at24_data_24c00, 128 / 8, AT24_FLAG_TAKE8ADDR); +/* old variants can't be handled with this generic entry! */ +AT24_CHIP_DATA(at24_data_24c01, 1024 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs01, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c02, 2048 / 8, AT24_FLAG_IRUGO); +AT24_CHIP_DATA(at24_data_24cs02, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24mac402, 48 / 8, + AT24_FLAG_MAC | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24mac602, 64 / 8, + AT24_FLAG_MAC | AT24_FLAG_READONLY); +/* spd is a 24c02 in memory DIMMs */ +AT24_CHIP_DATA(at24_data_spd, 2048 / 8, + AT24_FLAG_READONLY | AT24_FLAG_IRUGO); +/* 24c02_vaio is a 24c02 on some Sony laptops */ +AT24_CHIP_DATA_CB(at24_data_24c02_vaio, 2048 / 8, + AT24_FLAG_READONLY | AT24_FLAG_IRUGO, + at24_read_post_vaio); +AT24_CHIP_DATA(at24_data_24c04, 4096 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs04, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +/* 24rf08 quirk is handled at i2c-core */ +AT24_CHIP_DATA(at24_data_24c08, 8192 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs08, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c16, 16384 / 8, 0); +AT24_CHIP_DATA(at24_data_24cs16, 16, + AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c32, 32768 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24cs32, 16, + AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c64, 65536 / 8, AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO); +AT24_CHIP_DATA(at24_data_24cs64, 16, + AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY); +AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c256, 262144 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c512, 524288 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c1024, 1048576 / 8, AT24_FLAG_ADDR16); +AT24_CHIP_DATA(at24_data_24c2048, 2097152 / 8, AT24_FLAG_ADDR16); +/* identical to 24c08 ? */ +AT24_CHIP_DATA(at24_data_INT3499, 8192 / 8, 0); + +static const struct i2c_device_id at24_ids[] = { + { "wb_24c00", (kernel_ulong_t)&at24_data_24c00 }, + { "wb_24c01", (kernel_ulong_t)&at24_data_24c01 }, + { "wb_24cs01", (kernel_ulong_t)&at24_data_24cs01 }, + { "wb_24c02", (kernel_ulong_t)&at24_data_24c02 }, + { "wb_24cs02", (kernel_ulong_t)&at24_data_24cs02 }, + { "wb_24mac402", (kernel_ulong_t)&at24_data_24mac402 }, + { "wb_24mac602", (kernel_ulong_t)&at24_data_24mac602 }, + { "wb_spd", (kernel_ulong_t)&at24_data_spd }, + { "wb_24c02-vaio", (kernel_ulong_t)&at24_data_24c02_vaio }, + { "wb_24c04", (kernel_ulong_t)&at24_data_24c04 }, + { "wb_24cs04", (kernel_ulong_t)&at24_data_24cs04 }, + { "wb_24c08", (kernel_ulong_t)&at24_data_24c08 }, + { "wb_24cs08", (kernel_ulong_t)&at24_data_24cs08 }, + { "wb_24c16", (kernel_ulong_t)&at24_data_24c16 }, + { "wb_24cs16", (kernel_ulong_t)&at24_data_24cs16 }, + { "wb_24c32", (kernel_ulong_t)&at24_data_24c32 }, + { "wb_24cs32", (kernel_ulong_t)&at24_data_24cs32 }, + { "wb_24c64", (kernel_ulong_t)&at24_data_24c64 }, + { "wb_24cs64", (kernel_ulong_t)&at24_data_24cs64 }, + { "wb_24c128", (kernel_ulong_t)&at24_data_24c128 }, + { "wb_24c256", (kernel_ulong_t)&at24_data_24c256 }, + { "wb_24c512", (kernel_ulong_t)&at24_data_24c512 }, + { "wb_24c1024", (kernel_ulong_t)&at24_data_24c1024 }, + { "wb_24c2048", (kernel_ulong_t)&at24_data_24c2048 }, + { "wb_at24", 0 }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(i2c, at24_ids); + +static const struct of_device_id at24_of_match[] = { + { .compatible = "atmel,24c00", .data = &at24_data_24c00 }, + { .compatible = "atmel,24c01", .data = &at24_data_24c01 }, + { .compatible = "atmel,24cs01", .data = &at24_data_24cs01 }, + { .compatible = "atmel,24c02", .data = &at24_data_24c02 }, + { .compatible = "atmel,24cs02", .data = &at24_data_24cs02 }, + { .compatible = "atmel,24mac402", .data = &at24_data_24mac402 }, + { .compatible = "atmel,24mac602", .data = &at24_data_24mac602 }, + { .compatible = "atmel,spd", .data = &at24_data_spd }, + { .compatible = "atmel,24c04", .data = &at24_data_24c04 }, + { .compatible = "atmel,24cs04", .data = &at24_data_24cs04 }, + { .compatible = "atmel,24c08", .data = &at24_data_24c08 }, + { .compatible = "atmel,24cs08", .data = &at24_data_24cs08 }, + { .compatible = "atmel,24c16", .data = &at24_data_24c16 }, + { .compatible = "atmel,24cs16", .data = &at24_data_24cs16 }, + { .compatible = "atmel,24c32", .data = &at24_data_24c32 }, + { .compatible = "atmel,24cs32", .data = &at24_data_24cs32 }, + { .compatible = "atmel,24c64", .data = &at24_data_24c64 }, + { .compatible = "atmel,24cs64", .data = &at24_data_24cs64 }, + { .compatible = "atmel,24c128", .data = &at24_data_24c128 }, + { .compatible = "atmel,24c256", .data = &at24_data_24c256 }, + { .compatible = "atmel,24c512", .data = &at24_data_24c512 }, + { .compatible = "atmel,24c1024", .data = &at24_data_24c1024 }, + { .compatible = "atmel,24c2048", .data = &at24_data_24c2048 }, + { /* END OF LIST */ }, +}; +MODULE_DEVICE_TABLE(of, at24_of_match); + +static const struct acpi_device_id __maybe_unused at24_acpi_ids[] = { + { "INT3499", (kernel_ulong_t)&at24_data_INT3499 }, + { "TPF0001", (kernel_ulong_t)&at24_data_24c1024 }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(acpi, at24_acpi_ids); + +/* + * This routine supports chips which consume multiple I2C addresses. It + * computes the addressing information to be used for a given r/w request. + * Assumes that sanity checks for offset happened at sysfs-layer. + * + * Slave address and byte offset derive from the offset. Always + * set the byte address; on a multi-master board, another master + * may have changed the chip's "current" address pointer. + */ +static struct at24_client *at24_translate_offset(struct at24_data *at24, + unsigned int *offset) +{ + unsigned int i; + + if (at24->flags & AT24_FLAG_ADDR16) { + i = *offset >> 16; + *offset &= 0xffff; + } else { + i = *offset >> 8; + *offset &= 0xff; + } + + return &at24->client[i]; +} + +static struct device *at24_base_client_dev(struct at24_data *at24) +{ + return &at24->client[0].client->dev; +} + +static size_t at24_adjust_read_count(struct at24_data *at24, + unsigned int offset, size_t count) +{ + unsigned int bits; + size_t remainder; + + /* + * In case of multi-address chips that don't rollover reads to + * the next slave address: truncate the count to the slave boundary, + * so that the read never straddles slaves. + */ + if (at24->flags & AT24_FLAG_NO_RDROL) { + bits = (at24->flags & AT24_FLAG_ADDR16) ? 16 : 8; + remainder = BIT(bits) - offset; + if (count > remainder) + count = remainder; + } + + if (count > at24_io_limit) + count = at24_io_limit; + + return count; +} + +static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, + unsigned int offset, size_t count) +{ + unsigned long timeout, read_time; + struct at24_client *at24_client; + struct i2c_client *client; + struct regmap *regmap; + int ret; + + at24_client = at24_translate_offset(at24, &offset); + regmap = at24_client->regmap; + client = at24_client->client; + count = at24_adjust_read_count(at24, offset, count); + + /* adjust offset for mac and serial read ops */ + offset += at24->offset_adj; + + timeout = jiffies + msecs_to_jiffies(at24_write_timeout); + do { + /* + * The timestamp shall be taken before the actual operation + * to avoid a premature timeout in case of high CPU load. + */ + read_time = jiffies; + + ret = regmap_bulk_read(regmap, offset, buf, count); + dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n", + count, offset, ret, jiffies); + if (!ret) + return count; + + usleep_range(1000, 1500); + } while (time_before(read_time, timeout)); + + return -ETIMEDOUT; +} + +/* + * Note that if the hardware write-protect pin is pulled high, the whole + * chip is normally write protected. But there are plenty of product + * variants here, including OTP fuses and partial chip protect. + * + * We only use page mode writes; the alternative is sloooow. These routines + * write at most one page. + */ + +static size_t at24_adjust_write_count(struct at24_data *at24, + unsigned int offset, size_t count) +{ + unsigned int next_page; + + /* write_max is at most a page */ + if (count > at24->write_max) + count = at24->write_max; + + /* Never roll over backwards, to the start of this page */ + next_page = roundup(offset + 1, at24->page_size); + if (offset + count > next_page) + count = next_page - offset; + + return count; +} + +static ssize_t at24_regmap_write(struct at24_data *at24, const char *buf, + unsigned int offset, size_t count) +{ + unsigned long timeout, write_time; + struct at24_client *at24_client; + struct i2c_client *client; + struct regmap *regmap; + int ret; + + at24_client = at24_translate_offset(at24, &offset); + regmap = at24_client->regmap; + client = at24_client->client; + count = at24_adjust_write_count(at24, offset, count); + timeout = jiffies + msecs_to_jiffies(at24_write_timeout); + + do { + /* + * The timestamp shall be taken before the actual operation + * to avoid a premature timeout in case of high CPU load. + */ + write_time = jiffies; + + ret = regmap_bulk_write(regmap, offset, buf, count); + dev_dbg(&client->dev, "write %zu@%d --> %d (%ld)\n", + count, offset, ret, jiffies); + if (!ret) + return count; + + usleep_range(1000, 1500); + } while (time_before(write_time, timeout)); + + return -ETIMEDOUT; +} + +static int at24_read(void *priv, unsigned int off, void *val, size_t count) +{ + struct at24_data *at24; + struct device *dev; + char *buf = val; + int i, ret; + + at24 = priv; + dev = at24_base_client_dev(at24); + + if (unlikely(!count)) + return count; + + if (off + count > at24->byte_len) + return -EINVAL; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + pm_runtime_put_noidle(dev); + return ret; + } + + /* + * Read data from chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&at24->lock); + + for (i = 0; count; i += ret, count -= ret) { + ret = at24_regmap_read(at24, buf + i, off + i, count); + if (ret < 0) { + mutex_unlock(&at24->lock); + pm_runtime_put(dev); + return ret; + } + } + + mutex_unlock(&at24->lock); + + pm_runtime_put(dev); + + if (unlikely(at24->read_post)) + at24->read_post(off, buf, i); + + return 0; +} + +static int at24_write(void *priv, unsigned int off, void *val, size_t count) +{ + struct at24_data *at24; + struct device *dev; + char *buf = val; + int ret; + + at24 = priv; + dev = at24_base_client_dev(at24); + + if (unlikely(!count)) + return -EINVAL; + + if (off + count > at24->byte_len) + return -EINVAL; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + pm_runtime_put_noidle(dev); + return ret; + } + + /* + * Write data to chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&at24->lock); + + while (count) { + ret = at24_regmap_write(at24, buf, off, count); + if (ret < 0) { + mutex_unlock(&at24->lock); + pm_runtime_put(dev); + return ret; + } + buf += ret; + off += ret; + count -= ret; + } + + mutex_unlock(&at24->lock); + + pm_runtime_put(dev); + + return 0; +} + +static const struct at24_chip_data *at24_get_chip_data(struct device *dev) +{ + struct device_node *of_node = dev->of_node; + const struct at24_chip_data *cdata; + const struct i2c_device_id *id; + + id = i2c_match_id(at24_ids, to_i2c_client(dev)); + + /* + * The I2C core allows OF nodes compatibles to match against the + * I2C device ID table as a fallback, so check not only if an OF + * node is present but also if it matches an OF device ID entry. + */ + if (of_node && of_match_device(at24_of_match, dev)) + cdata = of_device_get_match_data(dev); + else if (id) + cdata = (void *)id->driver_data; + else + cdata = acpi_device_get_match_data(dev); + + if (!cdata) + return ERR_PTR(-ENODEV); + + return cdata; +} + +static int at24_make_dummy_client(struct at24_data *at24, unsigned int index, + struct regmap_config *regmap_config) +{ + struct i2c_client *base_client, *dummy_client; + struct regmap *regmap; + struct device *dev; + + base_client = at24->client[0].client; + dev = &base_client->dev; + + dummy_client = devm_i2c_new_dummy_device(dev, base_client->adapter, + base_client->addr + index); + if (IS_ERR(dummy_client)) + return PTR_ERR(dummy_client); + + regmap = devm_regmap_init_i2c(dummy_client, regmap_config); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + at24->client[index].client = dummy_client; + at24->client[index].regmap = regmap; + + return 0; +} + +static unsigned int at24_get_offset_adj(u8 flags, unsigned int byte_len) +{ + if (flags & AT24_FLAG_MAC) { + /* EUI-48 starts from 0x9a, EUI-64 from 0x98 */ + return 0xa0 - byte_len; + } else if (flags & AT24_FLAG_SERIAL && flags & AT24_FLAG_ADDR16) { + /* + * For 16 bit address pointers, the word address must contain + * a '10' sequence in bits 11 and 10 regardless of the + * intended position of the address pointer. + */ + return 0x0800; + } else if (flags & AT24_FLAG_SERIAL) { + /* + * Otherwise the word address must begin with a '10' sequence, + * regardless of the intended address. + */ + return 0x0080; + } else { + return 0; + } +} + +static int at24_probe(struct i2c_client *client) +{ + struct regmap_config regmap_config = { }; + struct nvmem_config nvmem_config = { }; + u32 byte_len, page_size, flags, addrw; + const struct at24_chip_data *cdata; + struct device *dev = &client->dev; + bool i2c_fn_i2c, i2c_fn_block; + unsigned int i, num_addresses; + struct at24_data *at24; + struct regmap *regmap; + bool writable; + u8 test_byte; + int err; + + i2c_fn_i2c = i2c_check_functionality(client->adapter, I2C_FUNC_I2C); + i2c_fn_block = i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK); + + cdata = at24_get_chip_data(dev); + if (IS_ERR(cdata)) + return PTR_ERR(cdata); + + err = device_property_read_u32(dev, "pagesize", &page_size); + if (err) + /* + * This is slow, but we can't know all eeproms, so we better + * play safe. Specifying custom eeprom-types via device tree + * or properties is recommended anyhow. + */ + page_size = 1; + + flags = cdata->flags; + if (device_property_present(dev, "read-only")) + flags |= AT24_FLAG_READONLY; + if (device_property_present(dev, "no-read-rollover")) + flags |= AT24_FLAG_NO_RDROL; + + err = device_property_read_u32(dev, "address-width", &addrw); + if (!err) { + switch (addrw) { + case 8: + if (flags & AT24_FLAG_ADDR16) + dev_warn(dev, + "Override address width to be 8, while default is 16\n"); + flags &= ~AT24_FLAG_ADDR16; + break; + case 16: + flags |= AT24_FLAG_ADDR16; + break; + default: + dev_warn(dev, "Bad \"address-width\" property: %u\n", + addrw); + } + } + + err = device_property_read_u32(dev, "size", &byte_len); + if (err) + byte_len = cdata->byte_len; + + if (!i2c_fn_i2c && !i2c_fn_block) + page_size = 1; + + if (!page_size) { + dev_err(dev, "page_size must not be 0!\n"); + return -EINVAL; + } + + if (!is_power_of_2(page_size)) + dev_warn(dev, "page_size looks suspicious (no power of 2)!\n"); + + err = device_property_read_u32(dev, "num-addresses", &num_addresses); + if (err) { + if (flags & AT24_FLAG_TAKE8ADDR) + num_addresses = 8; + else + num_addresses = DIV_ROUND_UP(byte_len, + (flags & AT24_FLAG_ADDR16) ? 65536 : 256); + } + + if ((flags & AT24_FLAG_SERIAL) && (flags & AT24_FLAG_MAC)) { + dev_err(dev, + "invalid device data - cannot have both AT24_FLAG_SERIAL & AT24_FLAG_MAC."); + return -EINVAL; + } + + regmap_config.val_bits = 8; + regmap_config.reg_bits = (flags & AT24_FLAG_ADDR16) ? 16 : 8; + regmap_config.disable_locking = true; + + regmap = devm_regmap_init_i2c(client, ®map_config); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + at24 = devm_kzalloc(dev, struct_size(at24, client, num_addresses), + GFP_KERNEL); + if (!at24) + return -ENOMEM; + + mutex_init(&at24->lock); + at24->byte_len = byte_len; + at24->page_size = page_size; + at24->flags = flags; + at24->read_post = cdata->read_post; + at24->num_addresses = num_addresses; + at24->offset_adj = at24_get_offset_adj(flags, byte_len); + at24->client[0].client = client; + at24->client[0].regmap = regmap; + + at24->vcc_reg = devm_regulator_get(dev, "vcc"); + if (IS_ERR(at24->vcc_reg)) + return PTR_ERR(at24->vcc_reg); + + writable = !(flags & AT24_FLAG_READONLY); + if (writable) { + at24->write_max = min_t(unsigned int, + page_size, at24_io_limit); + if (!i2c_fn_i2c && at24->write_max > I2C_SMBUS_BLOCK_MAX) + at24->write_max = I2C_SMBUS_BLOCK_MAX; + } + + /* use dummy devices for multiple-address chips */ + for (i = 1; i < num_addresses; i++) { + err = at24_make_dummy_client(at24, i, ®map_config); + if (err) + return err; + } + + /* + * If the 'label' property is not present for the AT24 EEPROM, + * then nvmem_config.id is initialised to NVMEM_DEVID_AUTO, + * and this will append the 'devid' to the name of the NVMEM + * device. This is purely legacy and the AT24 driver has always + * defaulted to this. However, if the 'label' property is + * present then this means that the name is specified by the + * firmware and this name should be used verbatim and so it is + * not necessary to append the 'devid'. + */ + if (device_property_present(dev, "label")) { + nvmem_config.id = NVMEM_DEVID_NONE; + err = device_property_read_string(dev, "label", + &nvmem_config.name); + if (err) + return err; + } else { + nvmem_config.id = NVMEM_DEVID_AUTO; + nvmem_config.name = dev_name(dev); + } + + nvmem_config.type = NVMEM_TYPE_EEPROM; + nvmem_config.dev = dev; + nvmem_config.read_only = !writable; + nvmem_config.root_only = !(flags & AT24_FLAG_IRUGO); + nvmem_config.owner = THIS_MODULE; + nvmem_config.compat = true; + nvmem_config.base_dev = dev; + nvmem_config.reg_read = at24_read; + nvmem_config.reg_write = at24_write; + nvmem_config.priv = at24; + nvmem_config.stride = 1; + nvmem_config.word_size = 1; + nvmem_config.size = byte_len; + + i2c_set_clientdata(client, at24); + + err = regulator_enable(at24->vcc_reg); + if (err) { + dev_err(dev, "Failed to enable vcc regulator\n"); + return err; + } + + /* enable runtime pm */ + pm_runtime_set_active(dev); + pm_runtime_enable(dev); + + at24->nvmem = devm_nvmem_register(dev, &nvmem_config); + if (IS_ERR(at24->nvmem)) { + pm_runtime_disable(dev); + if (!pm_runtime_status_suspended(dev)) + regulator_disable(at24->vcc_reg); + return PTR_ERR(at24->nvmem); + } + + /* + * Perform a one-byte test read to verify that the + * chip is functional. + */ + err = at24_read(at24, 0, &test_byte, 1); + if (err) { + pm_runtime_disable(dev); + if (!pm_runtime_status_suspended(dev)) + regulator_disable(at24->vcc_reg); + return -ENODEV; + } + + pm_runtime_idle(dev); + + if (writable) + dev_info(dev, "%u byte %s EEPROM, writable, %u bytes/write\n", + byte_len, client->name, at24->write_max); + else + dev_info(dev, "%u byte %s EEPROM, read-only\n", + byte_len, client->name); + + return 0; +} + +static int at24_remove(struct i2c_client *client) +{ + struct at24_data *at24 = i2c_get_clientdata(client); + + pm_runtime_disable(&client->dev); + if (!pm_runtime_status_suspended(&client->dev)) + regulator_disable(at24->vcc_reg); + pm_runtime_set_suspended(&client->dev); + + return 0; +} + +static int __maybe_unused at24_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct at24_data *at24 = i2c_get_clientdata(client); + + return regulator_disable(at24->vcc_reg); +} + +static int __maybe_unused at24_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct at24_data *at24 = i2c_get_clientdata(client); + + return regulator_enable(at24->vcc_reg); +} + +static const struct dev_pm_ops at24_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(at24_suspend, at24_resume, NULL) +}; + +static struct i2c_driver at24_driver = { + .driver = { + .name = "wb_at24", + .pm = &at24_pm_ops, + .of_match_table = at24_of_match, + .acpi_match_table = ACPI_PTR(at24_acpi_ids), + }, + .probe_new = at24_probe, + .remove = at24_remove, + .id_table = at24_ids, +}; + +static int __init at24_init(void) +{ + if (!at24_io_limit) { + pr_err("at24: at24_io_limit must not be 0!\n"); + return -EINVAL; + } + + at24_io_limit = rounddown_pow_of_two(at24_io_limit); + return i2c_add_driver(&at24_driver); +} +module_init(at24_init); + +static void __exit at24_exit(void) +{ + i2c_del_driver(&at24_driver); +} +module_exit(at24_exit); + +MODULE_DESCRIPTION("Driver for most I2C EEPROMs"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c new file mode 100644 index 0000000000..36d07f071a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_csu550.c @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +struct pmbus_device_info { + int pages; + u32 flags; +}; + +static const struct i2c_device_id pmbus_id[]; + +/* + * Find sensor groups and status registers on each page. + */ +static void pmbus_find_sensor_groups(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + int page; + + /* Sensors detected on page 0 only */ + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_VIN)) + info->func[0] |= PMBUS_HAVE_VIN; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_IIN)) + info->func[0] |= PMBUS_HAVE_IIN; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_PIN)) + info->func[0] |= PMBUS_HAVE_PIN; + if (info->func[0] + && wb_pmbus_check_byte_register(client, 0, PMBUS_STATUS_INPUT)) + info->func[0] |= PMBUS_HAVE_STATUS_INPUT; + if (wb_pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_12) && + wb_pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_1)) { + info->func[0] |= PMBUS_HAVE_FAN12; + if (wb_pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_12)) + info->func[0] |= PMBUS_HAVE_STATUS_FAN12; + } + if (wb_pmbus_check_byte_register(client, 0, PMBUS_FAN_CONFIG_34) && + wb_pmbus_check_word_register(client, 0, PMBUS_READ_FAN_SPEED_3)) { + info->func[0] |= PMBUS_HAVE_FAN34; + if (wb_pmbus_check_byte_register(client, 0, PMBUS_STATUS_FAN_34)) + info->func[0] |= PMBUS_HAVE_STATUS_FAN34; + } + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_1)) + info->func[0] |= PMBUS_HAVE_TEMP; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_2)) + info->func[0] |= PMBUS_HAVE_TEMP2; + if (wb_pmbus_check_word_register(client, 0, PMBUS_READ_TEMPERATURE_3)) + info->func[0] |= PMBUS_HAVE_TEMP3; + if (info->func[0] & (PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 + | PMBUS_HAVE_TEMP3) + && wb_pmbus_check_byte_register(client, 0, + PMBUS_STATUS_TEMPERATURE)) + info->func[0] |= PMBUS_HAVE_STATUS_TEMP; + + /* Sensors detected on all pages */ + for (page = 0; page < info->pages; page++) { + if (wb_pmbus_check_word_register(client, page, PMBUS_READ_VOUT)) { + info->func[page] |= PMBUS_HAVE_VOUT; + if (wb_pmbus_check_byte_register(client, page, + PMBUS_STATUS_VOUT)) + info->func[page] |= PMBUS_HAVE_STATUS_VOUT; + } + if (wb_pmbus_check_word_register(client, page, PMBUS_READ_IOUT)) { + info->func[page] |= PMBUS_HAVE_IOUT; + if (wb_pmbus_check_byte_register(client, 0, + PMBUS_STATUS_IOUT)) + info->func[page] |= PMBUS_HAVE_STATUS_IOUT; + } + if (wb_pmbus_check_word_register(client, page, PMBUS_READ_POUT)) + info->func[page] |= PMBUS_HAVE_POUT; + } +} + +/* + * Identify chip parameters. + */ +static int pmbus_identify(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + int ret = 0; + + if (!info->pages) { + /* + * Check if the PAGE command is supported. If it is, + * keep setting the page number until it fails or until the + * maximum number of pages has been reached. Assume that + * this is the number of pages supported by the chip. + */ + if (wb_pmbus_check_byte_register(client, 0, PMBUS_PAGE)) { + int page; + + for (page = 1; page < PMBUS_PAGES; page++) { + if (wb_pmbus_set_page(client, page, 0xff) < 0) + break; + } + wb_pmbus_set_page(client, 0, 0xff); + info->pages = page; + } else { + info->pages = 1; + } + + wb_pmbus_clear_faults(client); + } + + if (wb_pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) { + int vout_mode, i; + + vout_mode = wb_pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE); + if (vout_mode >= 0 && vout_mode != 0xff) { + switch (vout_mode >> 5) { + case 0: + break; + case 1: + info->format[PSC_VOLTAGE_OUT] = vid; + for (i = 0; i < info->pages; i++) + info->vrm_version[i] = vr11; + break; + case 2: + info->format[PSC_VOLTAGE_OUT] = direct; + break; + default: + ret = -ENODEV; + goto abort; + } + } + } + + /* + * We should check if the COEFFICIENTS register is supported. + * If it is, and the chip is configured for direct mode, we can read + * the coefficients from the chip, one set per group of sensor + * registers. + * + * To do this, we will need access to a chip which actually supports the + * COEFFICIENTS command, since the command is too complex to implement + * without testing it. Until then, abort if a chip configured for direct + * mode was detected. + */ + if (info->format[PSC_VOLTAGE_OUT] == direct) { + ret = -ENODEV; + goto abort; + } + + /* Try to find sensor groups */ + pmbus_find_sensor_groups(client, info); +abort: + return ret; +} + +static int pmbus_probe(struct i2c_client *client) +{ + struct pmbus_driver_info *info; + struct pmbus_platform_data *pdata = NULL; + struct device *dev = &client->dev; + struct pmbus_device_info *device_info; + + info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + device_info = (struct pmbus_device_info *)i2c_match_id(pmbus_id, client)->driver_data; + if (device_info->flags & PMBUS_SKIP_STATUS_CHECK) { + pdata = devm_kzalloc(dev, sizeof(struct pmbus_platform_data), + GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + pdata->flags = PMBUS_SKIP_STATUS_CHECK; + } + + info->pages = device_info->pages; + info->identify = pmbus_identify; + dev->platform_data = pdata; + + return wb_pmbus_do_probe(client, info); +} + +static const struct pmbus_device_info pmbus_info_one = { + .pages = 1, + .flags = 0 +}; + +static const struct pmbus_device_info pmbus_info_zero = { + .pages = 0, + .flags = 0 +}; + +static const struct pmbus_device_info pmbus_info_one_skip = { + .pages = 1, + .flags = PMBUS_SKIP_STATUS_CHECK +}; + +static const struct pmbus_device_info pmbus_info_zero_skip = { + .pages = 0, + .flags = PMBUS_SKIP_STATUS_CHECK +}; +/* + * Use driver_data to set the number of pages supported by the chip. + */ +static const struct i2c_device_id pmbus_id[] = { + {"wb_csu550", (kernel_ulong_t)&pmbus_info_zero_skip}, + {"wb_csu800", (kernel_ulong_t)&pmbus_info_one_skip}, + {"wb_fsp1200", (kernel_ulong_t)&pmbus_info_one_skip}, + {"wb_dps550", (kernel_ulong_t)&pmbus_info_one_skip}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, pmbus_id); + +/* This is the driver that will be inserted */ +static struct i2c_driver pmbus_driver = { + .driver = { + .name = "wb_pmbus", + }, + .probe_new = pmbus_probe, + .remove = wb_pmbus_do_remove, + .id_table = pmbus_id, +}; + +module_i2c_driver(pmbus_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Generic PMBus driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c new file mode 100644 index 0000000000..c98ac7a1c5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_algo_bit.c @@ -0,0 +1,725 @@ +/* ------------------------------------------------------------------------- + * i2c-algo-bit.c i2c driver algorithms for bit-shift adapters + * ------------------------------------------------------------------------- + * Copyright (C) 1995-2000 Simon G. Vogl + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + * ------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include + +static int g_i2c_algo_bit_debug = 0; +static int g_i2c_algo_bit_error = 0; + +module_param(g_i2c_algo_bit_debug, int, S_IRUGO | S_IWUSR); +module_param(g_i2c_algo_bit_error, int, S_IRUGO | S_IWUSR); + +#define I2C_ALGO_BIT_DEBUG(fmt, args...) do { \ + if (g_i2c_algo_bit_debug) { \ + printk(KERN_INFO "[I2C_ALGO_BIT][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define I2C_ALGO_BIT_ERROR(fmt, args...) do { \ + if (g_i2c_algo_bit_error) { \ + printk(KERN_ERR "[I2C_ALGO_BIT][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/* ----- global defines ----------------------------------------------- */ + +#ifdef DEBUG +#define bit_dbg(level, dev, format, args...) \ + do { \ + if (i2c_debug >= level) \ + dev_dbg(dev, format, ##args); \ + } while (0) +#else +#define bit_dbg(level, dev, format, args...) \ + do {} while (0) +#endif /* DEBUG */ + +/* ----- global variables --------------------------------------------- */ + +static int bit_test; /* see if the line-setting functions work */ +module_param(bit_test, int, S_IRUGO); +MODULE_PARM_DESC(bit_test, "lines testing - 0 off; 1 report; 2 fail if stuck"); + +#ifdef DEBUG +static int i2c_debug = 1; +module_param(i2c_debug, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(i2c_debug, + "debug level - 0 off; 1 normal; 2 verbose; 3 very verbose"); +#endif + +/* --- setting states on the bus with the right timing: --------------- */ + +#define setsda(adap, val) adap->setsda(adap->data, val) +#define setscl(adap, val) adap->setscl(adap->data, val) +#define getsda(adap) adap->getsda(adap->data) +#define getscl(adap) adap->getscl(adap->data) + +static inline void sdalo(struct i2c_algo_bit_data *adap) +{ + setsda(adap, 0); + udelay((adap->udelay + 1) / 2); +} + +static inline void sdahi(struct i2c_algo_bit_data *adap) +{ + setsda(adap, 1); + udelay((adap->udelay + 1) / 2); +} + +static inline void scllo(struct i2c_algo_bit_data *adap) +{ + setscl(adap, 0); + udelay(adap->udelay / 2); +} + +/* + * Raise scl line, and do checking for delays. This is necessary for slower + * devices. + */ +static int sclhi(struct i2c_algo_bit_data *adap) +{ + unsigned long start; + + setscl(adap, 1); + + /* Not all adapters have scl sense line... */ + if (!adap->getscl) + goto done; + + start = jiffies; + while (!getscl(adap)) { + /* This hw knows how to read the clock line, so we wait + * until it actually gets high. This is safer as some + * chips may hold it low ("clock stretching") while they + * are processing data internally. + */ + if (time_after(jiffies, start + adap->timeout)) { + /* Test one last time, as we may have been preempted + * between last check and timeout test. + */ + if (getscl(adap)) + break; + return -ETIMEDOUT; + } + cpu_relax(); + } +#ifdef DEBUG + if (jiffies != start && i2c_debug >= 3) + pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go " + "high\n", jiffies - start); +#endif + +done: + udelay(adap->udelay); + return 0; +} + +/* --- other auxiliary functions -------------------------------------- */ +static void i2c_start(struct i2c_algo_bit_data *adap) +{ + /* assert: scl, sda are high */ + setsda(adap, 0); + udelay(adap->udelay); + scllo(adap); +} + +static void i2c_repstart(struct i2c_algo_bit_data *adap) +{ + /* assert: scl is low */ + sdahi(adap); + sclhi(adap); + setsda(adap, 0); + udelay(adap->udelay); + scllo(adap); +} + +static void i2c_stop(struct i2c_algo_bit_data *adap) +{ + /* assert: scl is low */ + sdalo(adap); + sclhi(adap); + setsda(adap, 1); + udelay(adap->udelay); +} + +/* send a byte without start cond., look for arbitration, + check ackn. from slave */ +/* returns: + * 1 if the device acknowledged + * 0 if the device did not ack + * -ETIMEDOUT if an error occurred (while raising the scl line) + */ +static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) +{ + int i; + int sb; + int ack; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + /* assert: scl is low */ + for (i = 7; i >= 0; i--) { + sb = (c >> i) & 1; + setsda(adap, sb); + udelay((adap->udelay + 1) / 2); + if (sclhi(adap) < 0) { /* timed out */ + bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " + "timeout at bit #%d\n", (int)c, i); + return -ETIMEDOUT; + } + /* FIXME do arbitration here: + * if (sb && !getsda(adap)) -> ouch! Get out of here. + * + * Report a unique code, so higher level code can retry + * the whole (combined) message and *NOT* issue STOP. + */ + scllo(adap); + } + sdahi(adap); + if (sclhi(adap) < 0) { /* timeout */ + bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, " + "timeout at ack\n", (int)c); + return -ETIMEDOUT; + } + + /* read ack: SDA should be pulled down by slave, or it may + * NAK (usually to report problems with the data we wrote). + */ + ack = !getsda(adap); /* ack: sda is pulled low -> success */ + bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c, + ack ? "A" : "NA"); + + scllo(adap); + return ack; + /* assert: scl is low (sda undef) */ +} + +static int i2c_inb(struct i2c_adapter *i2c_adap) +{ + /* read byte via i2c port, without start/stop sequence */ + /* acknowledge is sent in i2c_read. */ + int i; + unsigned char indata = 0; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + /* assert: scl is low */ + sdahi(adap); + for (i = 0; i < 8; i++) { + if (sclhi(adap) < 0) { /* timeout */ + bit_dbg(1, &i2c_adap->dev, "i2c_inb: timeout at bit " + "#%d\n", 7 - i); + return -ETIMEDOUT; + } + indata *= 2; + if (getsda(adap)) + indata |= 0x01; + setscl(adap, 0); + udelay(i == 7 ? adap->udelay / 2 : adap->udelay); + } + /* assert: scl is low */ + return indata; +} + +/* + * Sanity check for the adapter hardware - check the reaction of + * the bus lines only if it seems to be idle. + */ +static int test_bus(struct i2c_adapter *i2c_adap) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + const char *name = i2c_adap->name; + int scl, sda, ret; + + if (adap->pre_xfer) { + ret = adap->pre_xfer(i2c_adap); + if (ret < 0) + return -ENODEV; + } + + if (adap->getscl == NULL) + pr_info("%s: Testing SDA only, SCL is not readable\n", name); + + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (!scl || !sda) { + printk(KERN_WARNING + "%s: bus seems to be busy (scl=%d, sda=%d)\n", + name, scl, sda); + goto bailout; + } + + sdalo(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (sda) { + printk(KERN_WARNING "%s: SDA stuck high!\n", name); + goto bailout; + } + if (!scl) { + printk(KERN_WARNING "%s: SCL unexpected low " + "while pulling SDA low!\n", name); + goto bailout; + } + + sdahi(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (!sda) { + printk(KERN_WARNING "%s: SDA stuck low!\n", name); + goto bailout; + } + if (!scl) { + printk(KERN_WARNING "%s: SCL unexpected low " + "while pulling SDA high!\n", name); + goto bailout; + } + + scllo(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 0 : getscl(adap); + if (scl) { + printk(KERN_WARNING "%s: SCL stuck high!\n", name); + goto bailout; + } + if (!sda) { + printk(KERN_WARNING "%s: SDA unexpected low " + "while pulling SCL low!\n", name); + goto bailout; + } + + sclhi(adap); + sda = getsda(adap); + scl = (adap->getscl == NULL) ? 1 : getscl(adap); + if (!scl) { + printk(KERN_WARNING "%s: SCL stuck low!\n", name); + goto bailout; + } + if (!sda) { + printk(KERN_WARNING "%s: SDA unexpected low " + "while pulling SCL high!\n", name); + goto bailout; + } + + if (adap->post_xfer) + adap->post_xfer(i2c_adap); + + pr_info("%s: Test OK\n", name); + return 0; +bailout: + sdahi(adap); + sclhi(adap); + + if (adap->post_xfer) + adap->post_xfer(i2c_adap); + + return -ENODEV; +} + +/* ----- Utility functions + */ + +/* try_address tries to contact a chip for a number of + * times before it gives up. + * return values: + * 1 chip answered + * 0 chip did not answer + * -x transmission error + */ +static int try_address(struct i2c_adapter *i2c_adap, + unsigned char addr, int retries) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + int i, ret = 0; + + for (i = 0; i <= retries; i++) { + ret = i2c_outb(i2c_adap, addr); + if (ret == 1 || i == retries) + break; + bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); + i2c_stop(adap); + udelay(adap->udelay); + yield(); + bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); + i2c_start(adap); + } + if (i && ret) + bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at " + "0x%02x: %s\n", i + 1, + addr & 1 ? "read from" : "write to", addr >> 1, + ret == 1 ? "success" : "failed, timeout?"); + return ret; +} + +static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) +{ + const unsigned char *temp = msg->buf; + int count = msg->len; + unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; + int retval; + int wrcount = 0; + + while (count > 0) { + retval = i2c_outb(i2c_adap, *temp); + + /* OK/ACK; or ignored NAK */ + if ((retval > 0) || (nak_ok && (retval == 0))) { + count--; + temp++; + wrcount++; + + /* A slave NAKing the master means the slave didn't like + * something about the data it saw. For example, maybe + * the SMBus PEC was wrong. + */ + } else if (retval == 0) { + dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n"); + return -EIO; + + /* Timeout; or (someday) lost arbitration + * + * FIXME Lost ARB implies retrying the transaction from + * the first message, after the "winning" master issues + * its STOP. As a rule, upper layer code has no reason + * to know or care about this ... it is *NOT* an error. + */ + } else { + dev_err(&i2c_adap->dev, "sendbytes: error %d\n", + retval); + return retval; + } + } + return wrcount; +} + +static int acknak(struct i2c_adapter *i2c_adap, int is_ack) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + /* assert: sda is high */ + if (is_ack) /* send ack */ + setsda(adap, 0); + udelay((adap->udelay + 1) / 2); + if (sclhi(adap) < 0) { /* timeout */ + dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n"); + return -ETIMEDOUT; + } + scllo(adap); + return 0; +} + +static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) +{ + int inval; + int rdcount = 0; /* counts bytes read */ + unsigned char *temp = msg->buf; + int count = msg->len; + const unsigned flags = msg->flags; + + while (count > 0) { + inval = i2c_inb(i2c_adap); + if (inval >= 0) { + *temp = inval; + rdcount++; + } else { /* read timed out */ + break; + } + + temp++; + count--; + + /* Some SMBus transactions require that we receive the + transaction length as the first read byte. */ + if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) { + if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) { + if (!(flags & I2C_M_NO_RD_ACK)) + acknak(i2c_adap, 0); + dev_err(&i2c_adap->dev, "readbytes: invalid " + "block length (%d)\n", inval); + return -EPROTO; + } + /* The original count value accounts for the extra + bytes, that is, either 1 for a regular transaction, + or 2 for a PEC transaction. */ + count += inval; + msg->len += inval; + } + + bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n", + inval, + (flags & I2C_M_NO_RD_ACK) + ? "(no ack/nak)" + : (count ? "A" : "NA")); + + if (!(flags & I2C_M_NO_RD_ACK)) { + inval = acknak(i2c_adap, count); + if (inval < 0) + return inval; + } + } + return rdcount; +} + +/* doAddress initiates the transfer by generating the start condition (in + * try_address) and transmits the address in the necessary format to handle + * reads, writes as well as 10bit-addresses. + * returns: + * 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set + * -x an error occurred (like: -ENXIO if the device did not answer, or + * -ETIMEDOUT, for example if the lines are stuck...) + */ +static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) +{ + unsigned short flags = msg->flags; + unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + unsigned char addr; + int ret, retries; + + retries = nak_ok ? 0 : i2c_adap->retries; + + if (flags & I2C_M_TEN) { + /* a ten bit address */ + addr = 0xf0 | ((msg->addr >> 7) & 0x06); + bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr); + /* try extended address code...*/ + ret = try_address(i2c_adap, addr, retries); + if ((ret != 1) && !nak_ok) { + dev_err(&i2c_adap->dev, + "died at extended address code\n"); + return -ENXIO; + } + /* the remaining 8 bit address */ + ret = i2c_outb(i2c_adap, msg->addr & 0xff); + if ((ret != 1) && !nak_ok) { + /* the chip did not ack / xmission error occurred */ + dev_err(&i2c_adap->dev, "died at 2nd address code\n"); + return -ENXIO; + } + if (flags & I2C_M_RD) { + bit_dbg(3, &i2c_adap->dev, "emitting repeated " + "start condition\n"); + i2c_repstart(adap); + /* okay, now switch into reading mode */ + addr |= 0x01; + ret = try_address(i2c_adap, addr, retries); + if ((ret != 1) && !nak_ok) { + dev_err(&i2c_adap->dev, + "died at repeated address code\n"); + return -EIO; + } + } + } else { /* normal 7bit address */ + addr = msg->addr << 1; + if (flags & I2C_M_RD) + addr |= 1; + if (flags & I2C_M_REV_DIR_ADDR) + addr ^= 1; + ret = try_address(i2c_adap, addr, retries); + if ((ret != 1) && !nak_ok) + return -ENXIO; + } + + return 0; +} + +static void bit_i2c_unblock(struct i2c_adapter *i2c_adap) +{ + int i; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + + for (i = 0; i < 9; i++) { + setscl(adap, 0); + udelay(5); + setscl(adap, 1); + udelay(5); + } + setscl(adap, 0); + setsda(adap, 0); + udelay(5); + setscl(adap, 1); + udelay(5); + setsda(adap, 1); +} + +static int check_bit_i2c_unblock(struct i2c_adapter *i2c_adap) +{ + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + int sda, scl; + + sda = getsda(adap); + scl = getscl(adap); + if ((sda == 0) && scl) { + I2C_ALGO_BIT_ERROR("SCL is high and SDA is low, send 9 clock to device.\n"); + bit_i2c_unblock(i2c_adap); + } + + sda = getsda(adap); + scl = getscl(adap); + if (sda && scl) { + I2C_ALGO_BIT_DEBUG("SCL and SDA are both high, i2c level check ok.\n"); + return 0; + } + dev_warn(&i2c_adap->dev, "Check i2c level failed, SCL %s, SDA %s.\n", scl ? "high" : "low", sda ? "high" : "low"); + return -EIO; +} + +static int bit_xfer(struct i2c_adapter *i2c_adap, + struct i2c_msg msgs[], int num) +{ + struct i2c_msg *pmsg; + struct i2c_algo_bit_data *adap = i2c_adap->algo_data; + int i, ret; + unsigned short nak_ok; + + if (adap->pre_xfer) { + ret = adap->pre_xfer(i2c_adap); + if (ret < 0) + return ret; + } + + if (check_bit_i2c_unblock(i2c_adap) < 0) { + I2C_ALGO_BIT_ERROR("check i2c is block.\n"); + return -EIO; + } + + bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); + i2c_start(adap); + for (i = 0; i < num; i++) { + pmsg = &msgs[i]; + nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; + if (!(pmsg->flags & I2C_M_NOSTART)) { + if (i) { + bit_dbg(3, &i2c_adap->dev, "emitting " + "repeated start condition\n"); + i2c_repstart(adap); + } + ret = bit_doAddress(i2c_adap, pmsg); + if ((ret != 0) && !nak_ok) { + bit_dbg(1, &i2c_adap->dev, "NAK from " + "device addr 0x%02x msg #%d\n", + msgs[i].addr, i); + goto bailout; + } + } + if (pmsg->flags & I2C_M_RD) { + /* read bytes into buffer*/ + ret = readbytes(i2c_adap, pmsg); + if (ret >= 1) + bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n", + ret, ret == 1 ? "" : "s"); + if (ret < pmsg->len) { + if (ret >= 0) + ret = -EIO; + goto bailout; + } + } else { + /* write bytes from buffer */ + ret = sendbytes(i2c_adap, pmsg); + if (ret >= 1) + bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n", + ret, ret == 1 ? "" : "s"); + if (ret < pmsg->len) { + if (ret >= 0) + ret = -EIO; + goto bailout; + } + } + } + ret = i; + +bailout: + bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); + i2c_stop(adap); + + if (adap->post_xfer) + adap->post_xfer(i2c_adap); + return ret; +} + +static u32 bit_func(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_NOSTART | I2C_FUNC_SMBUS_EMUL | + I2C_FUNC_SMBUS_READ_BLOCK_DATA | + I2C_FUNC_SMBUS_BLOCK_PROC_CALL | + I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING; +} + +/* -----exported algorithm data: ------------------------------------- */ + +const struct i2c_algorithm wb_i2c_bit_algo = { + .master_xfer = bit_xfer, + .functionality = bit_func, +}; +EXPORT_SYMBOL(wb_i2c_bit_algo); + +static const struct i2c_adapter_quirks i2c_bit_quirk_no_clk_stretch = { + .flags = I2C_AQ_NO_CLK_STRETCH, +}; + +/* + * registering functions to load algorithms at runtime + */ +static int __i2c_bit_add_bus(struct i2c_adapter *adap, + int (*add_adapter)(struct i2c_adapter *)) +{ + struct i2c_algo_bit_data *bit_adap = adap->algo_data; + int ret; + + if (bit_test) { + ret = test_bus(adap); + if (bit_test >= 2 && ret < 0) + return -ENODEV; + } + + /* register new adapter to i2c module... */ + adap->algo = &wb_i2c_bit_algo; + adap->retries = 3; + if (bit_adap->getscl == NULL) + adap->quirks = &i2c_bit_quirk_no_clk_stretch; + + ret = add_adapter(adap); + if (ret < 0) + return ret; + + /* Complain if SCL can't be read */ + if (bit_adap->getscl == NULL) { + dev_warn(&adap->dev, "Not I2C compliant: can't read SCL\n"); + dev_warn(&adap->dev, "Bus may be unreliable\n"); + } + return 0; +} + +int wb_i2c_bit_add_bus(struct i2c_adapter *adap) +{ + return __i2c_bit_add_bus(adap, i2c_add_adapter); +} +EXPORT_SYMBOL(wb_i2c_bit_add_bus); + +int wb_i2c_bit_add_numbered_bus(struct i2c_adapter *adap) +{ + return __i2c_bit_add_bus(adap, i2c_add_numbered_adapter); +} +EXPORT_SYMBOL(wb_i2c_bit_add_numbered_bus); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c new file mode 100644 index 0000000000..0362e905fd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio.c @@ -0,0 +1,431 @@ +/* + * Bitbanging I2C bus driver using the GPIO API + * + * Copyright (C) 2007 Atmel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern int wb_i2c_bit_add_numbered_bus(struct i2c_adapter *adap); + +struct i2c_gpio_private_data { + struct gpio_desc *sda; + struct gpio_desc *scl; + struct i2c_adapter adap; + struct i2c_algo_bit_data bit_data; + struct i2c_gpio_platform_data pdata; +#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR + struct dentry *debug_dir; +#endif +}; + +/* + * Toggle SDA by changing the output value of the pin. This is only + * valid for pins configured as open drain (i.e. setting the value + * high effectively turns off the output driver.) + */ +static void i2c_gpio_setsda_val(void *data, int state) +{ + struct i2c_gpio_private_data *priv = data; + + gpiod_set_value_cansleep(priv->sda, state); +} + +/* + * Toggle SCL by changing the output value of the pin. This is used + * for pins that are configured as open drain and for output-only + * pins. The latter case will break the i2c protocol, but it will + * often work in practice. + */ +static void i2c_gpio_setscl_val(void *data, int state) +{ + struct i2c_gpio_private_data *priv = data; + + gpiod_set_value_cansleep(priv->scl, state); +} + +static int i2c_gpio_getsda(void *data) +{ + struct i2c_gpio_private_data *priv = data; + + return gpiod_get_value_cansleep(priv->sda); +} + +static int i2c_gpio_getscl(void *data) +{ + struct i2c_gpio_private_data *priv = data; + + return gpiod_get_value_cansleep(priv->scl); +} + +#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR +static struct dentry *i2c_gpio_debug_dir; + +#define setsda(bd, val) ((bd)->setsda((bd)->data, val)) +#define setscl(bd, val) ((bd)->setscl((bd)->data, val)) +#define getsda(bd) ((bd)->getsda((bd)->data)) +#define getscl(bd) ((bd)->getscl((bd)->data)) + +#define WIRE_ATTRIBUTE(wire) \ +static int fops_##wire##_get(void *data, u64 *val) \ +{ \ + struct i2c_gpio_private_data *priv = data; \ + \ + i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + *val = get##wire(&priv->bit_data); \ + i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + return 0; \ +} \ +static int fops_##wire##_set(void *data, u64 val) \ +{ \ + struct i2c_gpio_private_data *priv = data; \ + \ + i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + set##wire(&priv->bit_data, val); \ + i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ + return 0; \ +} \ +DEFINE_DEBUGFS_ATTRIBUTE(fops_##wire, fops_##wire##_get, fops_##wire##_set, "%llu\n") + +WIRE_ATTRIBUTE(scl); +WIRE_ATTRIBUTE(sda); + +static void i2c_gpio_incomplete_transfer(struct i2c_gpio_private_data *priv, + u32 pattern, u8 pattern_size) +{ + struct i2c_algo_bit_data *bit_data = &priv->bit_data; + int i; + + i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); + + /* START condition */ + setsda(bit_data, 0); + udelay(bit_data->udelay); + + /* Send pattern, request ACK, don't send STOP */ + for (i = pattern_size - 1; i >= 0; i--) { + setscl(bit_data, 0); + udelay(bit_data->udelay / 2); + setsda(bit_data, (pattern >> i) & 1); + udelay((bit_data->udelay + 1) / 2); + setscl(bit_data, 1); + udelay(bit_data->udelay); + } + + i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); +} + +static int fops_incomplete_addr_phase_set(void *data, u64 addr) +{ + struct i2c_gpio_private_data *priv = data; + u32 pattern; + + if (addr > 0x7f) + return -EINVAL; + + /* ADDR (7 bit) + RD (1 bit) + Client ACK, keep SDA hi (1 bit) */ + pattern = (addr << 2) | 3; + + i2c_gpio_incomplete_transfer(priv, pattern, 9); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_addr_phase, NULL, fops_incomplete_addr_phase_set, "%llu\n"); + +static int fops_incomplete_write_byte_set(void *data, u64 addr) +{ + struct i2c_gpio_private_data *priv = data; + u32 pattern; + + if (addr > 0x7f) + return -EINVAL; + + /* ADDR (7 bit) + WR (1 bit) + Client ACK (1 bit) */ + pattern = (addr << 2) | 1; + /* 0x00 (8 bit) + Client ACK, keep SDA hi (1 bit) */ + pattern = (pattern << 9) | 1; + + i2c_gpio_incomplete_transfer(priv, pattern, 18); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_write_byte, NULL, fops_incomplete_write_byte_set, "%llu\n"); + +static void i2c_gpio_fault_injector_init(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); + + /* + * If there will be a debugfs-dir per i2c adapter somewhen, put the + * 'fault-injector' dir there. Until then, we have a global dir with + * all adapters as subdirs. + */ + if (!i2c_gpio_debug_dir) { + i2c_gpio_debug_dir = debugfs_create_dir("i2c-fault-injector", NULL); + if (!i2c_gpio_debug_dir) + return; + } + + priv->debug_dir = debugfs_create_dir(pdev->name, i2c_gpio_debug_dir); + if (!priv->debug_dir) + return; + + debugfs_create_file_unsafe("scl", 0600, priv->debug_dir, priv, &fops_scl); + debugfs_create_file_unsafe("sda", 0600, priv->debug_dir, priv, &fops_sda); + debugfs_create_file_unsafe("incomplete_address_phase", 0200, priv->debug_dir, + priv, &fops_incomplete_addr_phase); + debugfs_create_file_unsafe("incomplete_write_byte", 0200, priv->debug_dir, + priv, &fops_incomplete_write_byte); +} + +static void i2c_gpio_fault_injector_exit(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); + + debugfs_remove_recursive(priv->debug_dir); +} +#else +static inline void i2c_gpio_fault_injector_init(struct platform_device *pdev) {} +static inline void i2c_gpio_fault_injector_exit(struct platform_device *pdev) {} +#endif /* CONFIG_I2C_GPIO_FAULT_INJECTOR*/ + +static void of_i2c_gpio_get_props(struct device_node *np, + struct i2c_gpio_platform_data *pdata) +{ + u32 reg; + + of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay); + + if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®)) + pdata->timeout = msecs_to_jiffies(reg); + + pdata->sda_is_open_drain = + of_property_read_bool(np, "i2c-gpio,sda-open-drain"); + pdata->scl_is_open_drain = + of_property_read_bool(np, "i2c-gpio,scl-open-drain"); + pdata->scl_is_output_only = + of_property_read_bool(np, "i2c-gpio,scl-output-only"); +} + +static struct gpio_desc *i2c_gpio_get_desc(struct device *dev, + const char *con_id, + unsigned int index, + enum gpiod_flags gflags) +{ + struct gpio_desc *retdesc; + int ret; + + retdesc = devm_gpiod_get(dev, con_id, gflags); + if (!IS_ERR(retdesc)) { + dev_dbg(dev, "got GPIO from name %s\n", con_id); + return retdesc; + } + + retdesc = devm_gpiod_get_index(dev, NULL, index, gflags); + if (!IS_ERR(retdesc)) { + dev_dbg(dev, "got GPIO from index %u\n", index); + return retdesc; + } + + ret = PTR_ERR(retdesc); + + /* FIXME: hack in the old code, is this really necessary? */ + if (ret == -EINVAL) + retdesc = ERR_PTR(-EPROBE_DEFER); + + /* This happens if the GPIO driver is not yet probed, let's defer */ + if (ret == -ENOENT) + retdesc = ERR_PTR(-EPROBE_DEFER); + + if (PTR_ERR(retdesc) != -EPROBE_DEFER) + dev_err(dev, "error trying to get descriptor: %d\n", ret); + + return retdesc; +} + +static int i2c_gpio_probe(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv; + struct i2c_gpio_platform_data *pdata; + struct i2c_algo_bit_data *bit_data; + struct i2c_adapter *adap; + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node; + enum gpiod_flags gflags; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + adap = &priv->adap; + bit_data = &priv->bit_data; + pdata = &priv->pdata; + + if (np) { + of_i2c_gpio_get_props(np, pdata); + } else { + /* + * If all platform data settings are zero it is OK + * to not provide any platform data from the board. + */ + if (dev_get_platdata(dev)) + memcpy(pdata, dev_get_platdata(dev), sizeof(*pdata)); + } + + /* + * First get the GPIO pins; if it fails, we'll defer the probe. + * If the SDA line is marked from platform data or device tree as + * "open drain" it means something outside of our control is making + * this line being handled as open drain, and we should just handle + * it as any other output. Else we enforce open drain as this is + * required for an I2C bus. + */ + if (pdata->sda_is_open_drain) + gflags = GPIOD_OUT_HIGH; + else + gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; + priv->sda = i2c_gpio_get_desc(dev, "sda", 0, gflags); + if (IS_ERR(priv->sda)) + return PTR_ERR(priv->sda); + + /* + * If the SCL line is marked from platform data or device tree as + * "open drain" it means something outside of our control is making + * this line being handled as open drain, and we should just handle + * it as any other output. Else we enforce open drain as this is + * required for an I2C bus. + */ + if (pdata->scl_is_open_drain) + gflags = GPIOD_OUT_HIGH; + else + gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; + priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags); + if (IS_ERR(priv->scl)) + return PTR_ERR(priv->scl); + + if (gpiod_cansleep(priv->sda) || gpiod_cansleep(priv->scl)) + dev_warn(dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing"); + + bit_data->setsda = i2c_gpio_setsda_val; + bit_data->setscl = i2c_gpio_setscl_val; + + if (!pdata->scl_is_output_only) + bit_data->getscl = i2c_gpio_getscl; + bit_data->getsda = i2c_gpio_getsda; + + if (pdata->udelay) + bit_data->udelay = pdata->udelay; + else if (pdata->scl_is_output_only) + bit_data->udelay = 50; /* 10 kHz */ + else + bit_data->udelay = 5; /* 100 kHz */ + + if (pdata->timeout) + bit_data->timeout = pdata->timeout; + else + bit_data->timeout = HZ / 10; /* 100 ms */ + + bit_data->data = priv; + + adap->owner = THIS_MODULE; + if (np) + strlcpy(adap->name, dev_name(dev), sizeof(adap->name)); + else + snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id); + + adap->algo_data = bit_data; + adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; + adap->dev.parent = dev; + adap->dev.of_node = np; + + adap->nr = pdev->id; + ret = wb_i2c_bit_add_numbered_bus(adap); + if (ret) + return ret; + + platform_set_drvdata(pdev, priv); + + /* + * FIXME: using global GPIO numbers is not helpful. If/when we + * get accessors to get the actual name of the GPIO line, + * from the descriptor, then provide that instead. + */ + dev_info(dev, "using lines %u (SDA) and %u (SCL%s)\n", + desc_to_gpio(priv->sda), desc_to_gpio(priv->scl), + pdata->scl_is_output_only + ? ", no clock stretching" : ""); + + i2c_gpio_fault_injector_init(pdev); + + return 0; +} + +static int i2c_gpio_remove(struct platform_device *pdev) +{ + struct i2c_gpio_private_data *priv; + struct i2c_adapter *adap; + + i2c_gpio_fault_injector_exit(pdev); + + priv = platform_get_drvdata(pdev); + adap = &priv->adap; + + i2c_del_adapter(adap); + + return 0; +} + +#if defined(CONFIG_OF) +static const struct of_device_id i2c_gpio_dt_ids[] = { + { .compatible = "wb-i2c-gpio", }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); +#endif + +static struct platform_driver i2c_gpio_driver = { + .driver = { + .name = "wb-i2c-gpio", + .of_match_table = of_match_ptr(i2c_gpio_dt_ids), + }, + .probe = i2c_gpio_probe, + .remove = i2c_gpio_remove, +}; + +static int __init i2c_gpio_init(void) +{ + int ret; + + ret = platform_driver_register(&i2c_gpio_driver); + if (ret) + printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret); + + return ret; +} +subsys_initcall(i2c_gpio_init); + +static void __exit i2c_gpio_exit(void) +{ + platform_driver_unregister(&i2c_gpio_driver); +} +module_exit(i2c_gpio_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Platform-independent bitbanging I2C driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:i2c-gpio"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c new file mode 100644 index 0000000000..5cf949d70e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_gpio_device.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int gpio_sda = 17; +module_param(gpio_sda, int, S_IRUGO | S_IWUSR); + +static int gpio_scl = 1; +module_param(gpio_scl, int, S_IRUGO | S_IWUSR); + +static int gpio_udelay = 2; +module_param(gpio_udelay, int, S_IRUGO | S_IWUSR); + +static int g_wb_i2c_gpio_device_debug = 0; +static int g_wb_i2c_gpio_device_error = 0; + +module_param(g_wb_i2c_gpio_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_gpio_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_GPIO_DEVICE_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_gpio_device_debug) { \ + printk(KERN_INFO "[WB_I2C_GPIO_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_GPIO_DEVICE_ERROR(fmt, args...) do { \ + if (g_wb_i2c_gpio_device_error) { \ + printk(KERN_ERR "[WB_I2C_GPIO_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/****************** i2c adapter with gpio ***********************/ +static struct i2c_gpio_platform_data i2c_pdata = { + .udelay = 2, + .scl_is_output_only = 0, + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, +}; + +static void i2c_gpio_release(struct device *dev) +{ + return; +} + +static struct platform_device wb_i2c_gpio_device = { + .name = "wb-i2c-gpio", + .id = -1, + .num_resources = 0, + .resource = NULL, + .dev = { + .platform_data = &i2c_pdata, + .release = i2c_gpio_release, + }, +}; + +/* + * i2c + */ +static struct gpiod_lookup_table wb_i2c_gpio_table = { + .dev_id = "wb-i2c-gpio", + .table = { + GPIO_LOOKUP_IDX("wb_gpio_d1500", 17, NULL, 0, + GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), + GPIO_LOOKUP_IDX("wb_gpio_d1500", 1, NULL, 1, + GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN), + }, +}; + +static int __init wb_i2c_gpio_device_init(void) +{ + int err; + + WB_I2C_GPIO_DEVICE_VERBOSE("wb_i2c_gpio_device_init enter!\n"); + wb_i2c_gpio_table.table[0].chip_hwnum = gpio_sda; + wb_i2c_gpio_table.table[1].chip_hwnum = gpio_scl; + i2c_pdata.udelay = gpio_udelay; + gpiod_add_lookup_table(&wb_i2c_gpio_table); + + err = platform_device_register(&wb_i2c_gpio_device); + if (err < 0) { + printk(KERN_ERR "register i2c gpio device fail(%d). \n", err); + gpiod_remove_lookup_table(&wb_i2c_gpio_table); + return -1; + } + return 0; +} + +static void __exit wb_i2c_gpio_device_exit(void) +{ + WB_I2C_GPIO_DEVICE_VERBOSE("wb_i2c_gpio_device_exit enter!\n"); + platform_device_unregister(&wb_i2c_gpio_device); + gpiod_remove_lookup_table(&wb_i2c_gpio_table); +} + +module_init(wb_i2c_gpio_device_init); +module_exit(wb_i2c_gpio_device_exit); +MODULE_DESCRIPTION("I2C GPIO Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c new file mode 100644 index 0000000000..a733c11548 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_i801.c @@ -0,0 +1,2114 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + Copyright (c) 1998 - 2002 Frodo Looijaard , + Philip Edelbrock , and Mark D. Studebaker + + Copyright (C) 2007 - 2014 Jean Delvare + Copyright (C) 2010 Intel Corporation, + David Woodhouse + +*/ + +/* + * Supports the following Intel I/O Controller Hubs (ICH): + * + * I/O Block I2C + * region SMBus Block proc. block + * Chip name PCI ID size PEC buffer call read + * --------------------------------------------------------------------------- + * 82801AA (ICH) 0x2413 16 no no no no + * 82801AB (ICH0) 0x2423 16 no no no no + * 82801BA (ICH2) 0x2443 16 no no no no + * 82801CA (ICH3) 0x2483 32 soft no no no + * 82801DB (ICH4) 0x24c3 32 hard yes no no + * 82801E (ICH5) 0x24d3 32 hard yes yes yes + * 6300ESB 0x25a4 32 hard yes yes yes + * 82801F (ICH6) 0x266a 32 hard yes yes yes + * 6310ESB/6320ESB 0x269b 32 hard yes yes yes + * 82801G (ICH7) 0x27da 32 hard yes yes yes + * 82801H (ICH8) 0x283e 32 hard yes yes yes + * 82801I (ICH9) 0x2930 32 hard yes yes yes + * EP80579 (Tolapai) 0x5032 32 hard yes yes yes + * ICH10 0x3a30 32 hard yes yes yes + * ICH10 0x3a60 32 hard yes yes yes + * 5/3400 Series (PCH) 0x3b30 32 hard yes yes yes + * 6 Series (PCH) 0x1c22 32 hard yes yes yes + * Patsburg (PCH) 0x1d22 32 hard yes yes yes + * Patsburg (PCH) IDF 0x1d70 32 hard yes yes yes + * Patsburg (PCH) IDF 0x1d71 32 hard yes yes yes + * Patsburg (PCH) IDF 0x1d72 32 hard yes yes yes + * DH89xxCC (PCH) 0x2330 32 hard yes yes yes + * Panther Point (PCH) 0x1e22 32 hard yes yes yes + * Lynx Point (PCH) 0x8c22 32 hard yes yes yes + * Lynx Point-LP (PCH) 0x9c22 32 hard yes yes yes + * Avoton (SOC) 0x1f3c 32 hard yes yes yes + * Wellsburg (PCH) 0x8d22 32 hard yes yes yes + * Wellsburg (PCH) MS 0x8d7d 32 hard yes yes yes + * Wellsburg (PCH) MS 0x8d7e 32 hard yes yes yes + * Wellsburg (PCH) MS 0x8d7f 32 hard yes yes yes + * Coleto Creek (PCH) 0x23b0 32 hard yes yes yes + * Wildcat Point (PCH) 0x8ca2 32 hard yes yes yes + * Wildcat Point-LP (PCH) 0x9ca2 32 hard yes yes yes + * BayTrail (SOC) 0x0f12 32 hard yes yes yes + * Braswell (SOC) 0x2292 32 hard yes yes yes + * Sunrise Point-H (PCH) 0xa123 32 hard yes yes yes + * Sunrise Point-LP (PCH) 0x9d23 32 hard yes yes yes + * DNV (SOC) 0x19df 32 hard yes yes yes + * Emmitsburg (PCH) 0x1bc9 32 hard yes yes yes + * Broxton (SOC) 0x5ad4 32 hard yes yes yes + * Lewisburg (PCH) 0xa1a3 32 hard yes yes yes + * Lewisburg Supersku (PCH) 0xa223 32 hard yes yes yes + * Kaby Lake PCH-H (PCH) 0xa2a3 32 hard yes yes yes + * Gemini Lake (SOC) 0x31d4 32 hard yes yes yes + * Cannon Lake-H (PCH) 0xa323 32 hard yes yes yes + * Cannon Lake-LP (PCH) 0x9da3 32 hard yes yes yes + * Cedar Fork (PCH) 0x18df 32 hard yes yes yes + * Ice Lake-LP (PCH) 0x34a3 32 hard yes yes yes + * Comet Lake (PCH) 0x02a3 32 hard yes yes yes + * Comet Lake-H (PCH) 0x06a3 32 hard yes yes yes + * Elkhart Lake (PCH) 0x4b23 32 hard yes yes yes + * Tiger Lake-LP (PCH) 0xa0a3 32 hard yes yes yes + * Tiger Lake-H (PCH) 0x43a3 32 hard yes yes yes + * Jasper Lake (SOC) 0x4da3 32 hard yes yes yes + * Comet Lake-V (PCH) 0xa3a3 32 hard yes yes yes + * Alder Lake-S (PCH) 0x7aa3 32 hard yes yes yes + * + * Features supported by this driver: + * Software PEC no + * Hardware PEC yes + * Block buffer yes + * Block process call transaction yes + * I2C block read transaction yes (doesn't use the block buffer) + * Slave mode no + * SMBus Host Notify yes + * Interrupt processing yes + * + * See the file Documentation/i2c/busses/i2c-i801.rst for details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI +#include +#include +#endif + +#define mem_clear(data, size) memset((data), 0, (size)) + +/* I801 SMBus address offsets */ +#define SMBHSTSTS(p) (0 + (p)->smba) +#define SMBHSTCNT(p) (2 + (p)->smba) +#define SMBHSTCMD(p) (3 + (p)->smba) +#define SMBHSTADD(p) (4 + (p)->smba) +#define SMBHSTDAT0(p) (5 + (p)->smba) +#define SMBHSTDAT1(p) (6 + (p)->smba) +#define SMBBLKDAT(p) (7 + (p)->smba) +#define SMBPEC(p) (8 + (p)->smba) /* ICH3 and later */ +#define SMBAUXSTS(p) (12 + (p)->smba) /* ICH4 and later */ +#define SMBAUXCTL(p) (13 + (p)->smba) /* ICH4 and later */ +#define SMBSLVSTS(p) (16 + (p)->smba) /* ICH3 and later */ +#define SMBSLVCMD(p) (17 + (p)->smba) /* ICH3 and later */ +#define SMBNTFDADD(p) (20 + (p)->smba) /* ICH3 and later */ +#define SMBPINCTL(p) (15 + (p)->smba) /* SMBus Pin Control Register */ + +/* PCI Address Constants */ +#define SMBBAR 4 +#define SMBPCICTL 0x004 +#define SMBPCISTS 0x006 +#define SMBHSTCFG 0x040 +#define TCOBASE 0x050 +#define TCOCTL 0x054 + +#define SBREG_BAR 0x10 +#define SBREG_SMBCTRL 0xc6000c +#define SBREG_SMBCTRL_DNV 0xcf000c + +/* Host status bits for SMBPCISTS */ +#define SMBPCISTS_INTS BIT(3) + +/* Control bits for SMBPCICTL */ +#define SMBPCICTL_INTDIS BIT(10) + +/* Host configuration bits for SMBHSTCFG */ +#define SMBHSTCFG_HST_EN BIT(0) +#define SMBHSTCFG_SMB_SMI_EN BIT(1) +#define SMBHSTCFG_I2C_EN BIT(2) +#define SMBHSTCFG_SSRESET BIT(3) +#define SSRESET_SLEEP_TIME 1 /* 1us */ +#define SSRESET_RETRY_TIME (1000 / SSRESET_SLEEP_TIME) + +/* Pin status for SMBPINCTL */ +#define SMBPINCTL_CLK_STS 1 /* bit0 SMBCLK_CUR_STS*/ +#define SMBPINCTL_SDA_STS 2 /* bit1 SMBDATA_CUR_STS*/ +#define SMBPINCTL_CLK_CTL 4 /* bit2 SMBCLK_CTL */ + +#define SMBHSTCFG_SPD_WD BIT(4) + +/* TCO configuration bits for TCOCTL */ +#define TCOCTL_EN BIT(8) + +/* Auxiliary status register bits, ICH4+ only */ +#define SMBAUXSTS_CRCE BIT(0) +#define SMBAUXSTS_STCO BIT(1) + +/* Auxiliary control register bits, ICH4+ only */ +#define SMBAUXCTL_CRC BIT(0) +#define SMBAUXCTL_E32B BIT(1) + +/* Other settings */ +#define MAX_RETRIES 400 + +/* I801 command constants */ +#define I801_QUICK 0x00 +#define I801_BYTE 0x04 +#define I801_BYTE_DATA 0x08 +#define I801_WORD_DATA 0x0C +#define I801_PROC_CALL 0x10 /* unimplemented */ +#define I801_BLOCK_DATA 0x14 +#define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */ +#define I801_BLOCK_PROC_CALL 0x1C + +/* I801 Host Control register bits */ +#define SMBHSTCNT_INTREN BIT(0) +#define SMBHSTCNT_KILL BIT(1) +#define SMBHSTCNT_LAST_BYTE BIT(5) +#define SMBHSTCNT_START BIT(6) +#define SMBHSTCNT_PEC_EN BIT(7) /* ICH3 and later */ + +/* I801 Hosts Status register bits */ +#define SMBHSTSTS_BYTE_DONE BIT(7) +#define SMBHSTSTS_INUSE_STS BIT(6) +#define SMBHSTSTS_SMBALERT_STS BIT(5) +#define SMBHSTSTS_FAILED BIT(4) +#define SMBHSTSTS_BUS_ERR BIT(3) +#define SMBHSTSTS_DEV_ERR BIT(2) +#define SMBHSTSTS_INTR BIT(1) +#define SMBHSTSTS_HOST_BUSY BIT(0) + +/* Host Notify Status register bits */ +#define SMBSLVSTS_HST_NTFY_STS BIT(0) + +/* Host Notify Command register bits */ +#define SMBSLVCMD_HST_NTFY_INTREN BIT(0) + +#define STATUS_ERROR_FLAGS (SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \ + SMBHSTSTS_DEV_ERR) + +#define STATUS_FLAGS (SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR | \ + STATUS_ERROR_FLAGS) + +/* Older devices have their ID defined in */ +#define PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS 0x02a3 +#define PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS 0x06a3 +#define PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS 0x0f12 +#define PCI_DEVICE_ID_INTEL_CDF_SMBUS 0x18df +#define PCI_DEVICE_ID_INTEL_DNV_SMBUS 0x19df +#define PCI_DEVICE_ID_INTEL_EBG_SMBUS 0x1bc9 +#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 +/* Patsburg also has three 'Integrated Device Function' SMBus controllers */ +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 +#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 +#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22 +#define PCI_DEVICE_ID_INTEL_AVOTON_SMBUS 0x1f3c +#define PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS 0x2292 +#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 +#define PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS 0x23b0 +#define PCI_DEVICE_ID_INTEL_GEMINILAKE_SMBUS 0x31d4 +#define PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS 0x34a3 +#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 +#define PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS 0x43a3 +#define PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS 0x4b23 +#define PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS 0x4da3 +#define PCI_DEVICE_ID_INTEL_BROXTON_SMBUS 0x5ad4 +#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS 0x7aa3 +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS 0x8c22 +#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS 0x8ca2 +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS 0x8d22 +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0 0x8d7d +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1 0x8d7e +#define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2 0x8d7f +#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS 0x9c22 +#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS 0x9ca2 +#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS 0x9d23 +#define PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS 0x9da3 +#define PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS 0xa0a3 +#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS 0xa123 +#define PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS 0xa1a3 +#define PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS 0xa223 +#define PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS 0xa2a3 +#define PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS 0xa323 +#define PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS 0xa3a3 + +struct i801_mux_config { + char *gpio_chip; + unsigned values[3]; + int n_values; + unsigned classes[3]; + unsigned gpios[2]; /* Relative to gpio_chip->base */ + int n_gpios; +}; + +struct i801_priv { + struct i2c_adapter adapter; + unsigned long smba; + unsigned char original_hstcfg; + unsigned char original_slvcmd; + struct pci_dev *pci_dev; + unsigned int features; + + /* isr processing */ + wait_queue_head_t waitq; + u8 status; + + /* Command state used by isr for byte-by-byte block transactions */ + u8 cmd; + bool is_read; + int count; + int len; + u8 *data; + +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI + const struct i801_mux_config *mux_drvdata; + struct platform_device *mux_pdev; + struct gpiod_lookup_table *lookup; +#endif + struct platform_device *tco_pdev; + + /* + * If set to true the host controller registers are reserved for + * ACPI AML use. Protected by acpi_lock. + */ + bool acpi_reserved; + struct mutex acpi_lock; +}; + +#define FEATURE_SMBUS_PEC BIT(0) +#define FEATURE_BLOCK_BUFFER BIT(1) +#define FEATURE_BLOCK_PROC BIT(2) +#define FEATURE_I2C_BLOCK_READ BIT(3) +#define FEATURE_IRQ BIT(4) +#define FEATURE_HOST_NOTIFY BIT(5) +/* Not really a feature, but it's convenient to handle it as such */ +#define FEATURE_IDF BIT(15) +#define FEATURE_TCO_SPT BIT(16) +#define FEATURE_TCO_CNL BIT(17) + +static const char *i801_feature_names[] = { + "SMBus PEC", + "Block buffer", + "Block process call", + "I2C block read", + "Interrupt", + "SMBus Host Notify", +}; + +static unsigned int disable_features; +module_param(disable_features, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n" + "\t\t 0x01 disable SMBus PEC\n" + "\t\t 0x02 disable the block buffer\n" + "\t\t 0x08 disable the I2C block read functionality\n" + "\t\t 0x10 don't use interrupts\n" + "\t\t 0x20 disable SMBus Host Notify "); + +static void i801_setscl(struct i801_priv *priv, unsigned int level) +{ + int pin_status; + pin_status = inb_p(SMBPINCTL(priv)); + if (level == 0) { + pin_status &= (~SMBPINCTL_CLK_CTL); + } + else { + pin_status |= SMBPINCTL_CLK_CTL; + } + outb_p(pin_status, SMBPINCTL(priv)); + return; +} + +static void i801_i2c_unblock(struct i801_priv *priv) +{ + int i; + for (i = 0; i < 10; i++) { + i801_setscl(priv, 0); + udelay(5); + i801_setscl(priv, 1); + udelay(5); + } + return; +} + +static int i801_check_i2c_unblock(struct i801_priv *priv) +{ + int pin_status; + + pin_status = inb_p(SMBPINCTL(priv)); + if ( (!(pin_status & SMBPINCTL_SDA_STS) ) && (pin_status & SMBPINCTL_CLK_STS) ) { + dev_dbg(&priv->pci_dev->dev, "SDA is low, send 9 clock to device!\n"); + i801_i2c_unblock(priv); + } + return 0; +} + +static void i801_do_reset(struct i801_priv *priv) +{ + unsigned char tmp; + unsigned int retry_count = 0; + + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &tmp); + tmp |= SMBHSTCFG_SSRESET; + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, tmp); + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &tmp); + + while( ((tmp & SMBHSTCFG_SSRESET) != 0) && (retry_count < SSRESET_RETRY_TIME)) { + usleep_range(SSRESET_SLEEP_TIME, SSRESET_SLEEP_TIME + 1); + retry_count++; + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &tmp); + } + + return ; +} + +static int i801_check_i2c_scl(struct i801_priv *priv) +{ + int pin_status; + + pin_status = inb_p(SMBPINCTL(priv)); + if ( (pin_status & SMBPINCTL_SDA_STS) && (pin_status & SMBPINCTL_CLK_STS) ) { + return 0; + } + + dev_dbg(&priv->pci_dev->dev, "SDA or SCL is low, begin to reset SMBus adapter, pin_status: 0x%x\n",pin_status); + i801_do_reset(priv); + pin_status = inb_p(SMBPINCTL(priv)); + if ( (pin_status & SMBPINCTL_SDA_STS) && (pin_status & SMBPINCTL_CLK_STS) ) { + return 0; + } + dev_warn(&priv->pci_dev->dev, "SDA or SCL is low.pin_status:0x%x\n",pin_status); + return -1; +} + +/* Make sure the SMBus host is ready to start transmitting. + Return 0 if it is, -EBUSY if it is not. */ +static int i801_check_pre(struct i801_priv *priv) +{ + int status; + + i801_check_i2c_unblock(priv); + + if (i801_check_i2c_scl(priv)) { + return -EIO; + } + + status = inb_p(SMBHSTSTS(priv)); + if (status & SMBHSTSTS_HOST_BUSY) { + dev_dbg(&priv->pci_dev->dev, "SMBus is busy, begin to reset SMBus adapter!\n"); + + i801_do_reset(priv); + + status = inb_p(SMBHSTSTS(priv)); + if (status & SMBHSTSTS_HOST_BUSY) { + dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n"); + return -EBUSY; + } + } + + status &= STATUS_FLAGS; + if (status) { + dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n", + status); + outb_p(status, SMBHSTSTS(priv)); + status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS; + if (status) { + dev_err(&priv->pci_dev->dev, + "Failed clearing status flags (%02x)\n", + status); + return -EBUSY; + } + } + + /* + * Clear CRC status if needed. + * During normal operation, i801_check_post() takes care + * of it after every operation. We do it here only in case + * the hardware was already in this state when the driver + * started. + */ + if (priv->features & FEATURE_SMBUS_PEC) { + status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE; + if (status) { + dev_dbg(&priv->pci_dev->dev, + "Clearing aux status flags (%02x)\n", status); + outb_p(status, SMBAUXSTS(priv)); + status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE; + if (status) { + dev_err(&priv->pci_dev->dev, + "Failed clearing aux status flags (%02x)\n", + status); + return -EBUSY; + } + } + } + + return 0; +} + +/* + * Convert the status register to an error code, and clear it. + * Note that status only contains the bits we want to clear, not the + * actual register value. + */ +static int i801_check_post(struct i801_priv *priv, int status) +{ + int result = 0; + + /* + * If the SMBus is still busy, we give up + * Note: This timeout condition only happens when using polling + * transactions. For interrupt operation, NAK/timeout is indicated by + * DEV_ERR. + */ + if (unlikely(status < 0)) { + dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); + /* try to stop the current command */ + dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); + outb_p(SMBHSTCNT_KILL, SMBHSTCNT(priv)); + usleep_range(1000, 2000); + outb_p(0, SMBHSTCNT(priv)); + + /* Check if it worked */ + status = inb_p(SMBHSTSTS(priv)); + if ((status & SMBHSTSTS_HOST_BUSY) || + !(status & SMBHSTSTS_FAILED)) + dev_err(&priv->pci_dev->dev, + "Failed terminating the transaction\n"); + outb_p(STATUS_FLAGS, SMBHSTSTS(priv)); + return -ETIMEDOUT; + } + + if (status & SMBHSTSTS_FAILED) { + result = -EIO; + dev_err(&priv->pci_dev->dev, "Transaction failed\n"); + } + if (status & SMBHSTSTS_DEV_ERR) { + /* + * This may be a PEC error, check and clear it. + * + * AUXSTS is handled differently from HSTSTS. + * For HSTSTS, i801_isr() or i801_wait_intr() + * has already cleared the error bits in hardware, + * and we are passed a copy of the original value + * in "status". + * For AUXSTS, the hardware register is left + * for us to handle here. + * This is asymmetric, slightly iffy, but safe, + * since all this code is serialized and the CRCE + * bit is harmless as long as it's cleared before + * the next operation. + */ + if ((priv->features & FEATURE_SMBUS_PEC) && + (inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE)) { + outb_p(SMBAUXSTS_CRCE, SMBAUXSTS(priv)); + result = -EBADMSG; + dev_dbg(&priv->pci_dev->dev, "PEC error\n"); + } else { + result = -ENXIO; + dev_dbg(&priv->pci_dev->dev, "No response\n"); + } + } + if (status & SMBHSTSTS_BUS_ERR) { + result = -EAGAIN; + dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n"); + } + + /* Clear status flags except BYTE_DONE, to be cleared by caller */ + outb_p(status, SMBHSTSTS(priv)); + + return result; +} + +/* Wait for BUSY being cleared and either INTR or an error flag being set */ +static int i801_wait_intr(struct i801_priv *priv) +{ + int timeout = 0; + int status; + + /* We will always wait for a fraction of a second! */ + do { + usleep_range(250, 500); + status = inb_p(SMBHSTSTS(priv)); + } while (((status & SMBHSTSTS_HOST_BUSY) || + !(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR))) && + (timeout++ < MAX_RETRIES)); + + if (timeout > MAX_RETRIES) { + dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n"); + return -ETIMEDOUT; + } + return status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR); +} + +/* Wait for either BYTE_DONE or an error flag being set */ +static int i801_wait_byte_done(struct i801_priv *priv) +{ + int timeout = 0; + int status; + + /* We will always wait for a fraction of a second! */ + do { + usleep_range(250, 500); + status = inb_p(SMBHSTSTS(priv)); + } while (!(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_BYTE_DONE)) && + (timeout++ < MAX_RETRIES)); + + if (timeout > MAX_RETRIES) { + dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n"); + return -ETIMEDOUT; + } + return status & STATUS_ERROR_FLAGS; +} + +static int i801_transaction(struct i801_priv *priv, int xact) +{ + int status; + int result; + const struct i2c_adapter *adap = &priv->adapter; + + result = i801_check_pre(priv); + if (result < 0) + return result; + + if (priv->features & FEATURE_IRQ) { + outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START, + SMBHSTCNT(priv)); + result = wait_event_timeout(priv->waitq, + (status = priv->status), + adap->timeout); + if (!result) { + status = -ETIMEDOUT; + dev_warn(&priv->pci_dev->dev, + "Timeout waiting for interrupt!\n"); + } + priv->status = 0; + return i801_check_post(priv, status); + } + + /* the current contents of SMBHSTCNT can be overwritten, since PEC, + * SMBSCMD are passed in xact */ + outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv)); + + status = i801_wait_intr(priv); + return i801_check_post(priv, status); +} + +static int i801_block_transaction_by_block(struct i801_priv *priv, + union i2c_smbus_data *data, + char read_write, int command, + int hwpec) +{ + int i, len; + int status; + int xact = hwpec ? SMBHSTCNT_PEC_EN : 0; + + switch (command) { + case I2C_SMBUS_BLOCK_PROC_CALL: + xact |= I801_BLOCK_PROC_CALL; + break; + case I2C_SMBUS_BLOCK_DATA: + xact |= I801_BLOCK_DATA; + break; + default: + return -EOPNOTSUPP; + } + + inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */ + + /* Use 32-byte buffer to process this transaction */ + if (read_write == I2C_SMBUS_WRITE) { + len = data->block[0]; + outb_p(len, SMBHSTDAT0(priv)); + for (i = 0; i < len; i++) + outb_p(data->block[i+1], SMBBLKDAT(priv)); + } + + status = i801_transaction(priv, xact); + if (status) + return status; + + if (read_write == I2C_SMBUS_READ || + command == I2C_SMBUS_BLOCK_PROC_CALL) { + len = inb_p(SMBHSTDAT0(priv)); + if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) + return -EPROTO; + + data->block[0] = len; + for (i = 0; i < len; i++) + data->block[i + 1] = inb_p(SMBBLKDAT(priv)); + } + return 0; +} + +static void i801_isr_byte_done(struct i801_priv *priv) +{ + if (priv->is_read) { + /* For SMBus block reads, length is received with first byte */ + if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) && + (priv->count == 0)) { + priv->len = inb_p(SMBHSTDAT0(priv)); + if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) { + dev_err(&priv->pci_dev->dev, + "Illegal SMBus block read size %d\n", + priv->len); + /* FIXME: Recover */ + priv->len = I2C_SMBUS_BLOCK_MAX; + } else { + dev_dbg(&priv->pci_dev->dev, + "SMBus block read size is %d\n", + priv->len); + } + priv->data[-1] = priv->len; + } + + /* Read next byte */ + if (priv->count < priv->len) + priv->data[priv->count++] = inb(SMBBLKDAT(priv)); + else + dev_dbg(&priv->pci_dev->dev, + "Discarding extra byte on block read\n"); + + /* Set LAST_BYTE for last byte of read transaction */ + if (priv->count == priv->len - 1) + outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE, + SMBHSTCNT(priv)); + } else if (priv->count < priv->len - 1) { + /* Write next byte, except for IRQ after last byte */ + outb_p(priv->data[++priv->count], SMBBLKDAT(priv)); + } + + /* Clear BYTE_DONE to continue with next byte */ + outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); +} + +static irqreturn_t i801_host_notify_isr(struct i801_priv *priv) +{ + unsigned short addr; + + addr = inb_p(SMBNTFDADD(priv)) >> 1; + + /* + * With the tested platforms, reading SMBNTFDDAT (22 + (p)->smba) + * always returns 0. Our current implementation doesn't provide + * data, so we just ignore it. + */ + i2c_handle_smbus_host_notify(&priv->adapter, addr); + + /* clear Host Notify bit and return */ + outb_p(SMBSLVSTS_HST_NTFY_STS, SMBSLVSTS(priv)); + return IRQ_HANDLED; +} + +/* + * There are three kinds of interrupts: + * + * 1) i801 signals transaction completion with one of these interrupts: + * INTR - Success + * DEV_ERR - Invalid command, NAK or communication timeout + * BUS_ERR - SMI# transaction collision + * FAILED - transaction was canceled due to a KILL request + * When any of these occur, update ->status and wake up the waitq. + * ->status must be cleared before kicking off the next transaction. + * + * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt + * occurs for each byte of a byte-by-byte to prepare the next byte. + * + * 3) Host Notify interrupts + */ +static irqreturn_t i801_isr(int irq, void *dev_id) +{ + struct i801_priv *priv = dev_id; + u16 pcists; + u8 status; + + /* Confirm this is our interrupt */ + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); + if (!(pcists & SMBPCISTS_INTS)) + return IRQ_NONE; + + if (priv->features & FEATURE_HOST_NOTIFY) { + status = inb_p(SMBSLVSTS(priv)); + if (status & SMBSLVSTS_HST_NTFY_STS) + return i801_host_notify_isr(priv); + } + + status = inb_p(SMBHSTSTS(priv)); + if (status & SMBHSTSTS_BYTE_DONE) + i801_isr_byte_done(priv); + + /* + * Clear irq sources and report transaction result. + * ->status must be cleared before the next transaction is started. + */ + status &= SMBHSTSTS_INTR | STATUS_ERROR_FLAGS; + if (status) { + outb_p(status, SMBHSTSTS(priv)); + priv->status = status; + wake_up(&priv->waitq); + } + + return IRQ_HANDLED; +} + +/* + * For "byte-by-byte" block transactions: + * I2C write uses cmd=I801_BLOCK_DATA, I2C_EN=1 + * I2C read uses cmd=I801_I2C_BLOCK_DATA + */ +static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, + union i2c_smbus_data *data, + char read_write, int command, + int hwpec) +{ + int i, len; + int smbcmd; + int status; + int result; + const struct i2c_adapter *adap = &priv->adapter; + + if (command == I2C_SMBUS_BLOCK_PROC_CALL) + return -EOPNOTSUPP; + + result = i801_check_pre(priv); + if (result < 0) + return result; + + len = data->block[0]; + + if (read_write == I2C_SMBUS_WRITE) { + outb_p(len, SMBHSTDAT0(priv)); + outb_p(data->block[1], SMBBLKDAT(priv)); + } + + if (command == I2C_SMBUS_I2C_BLOCK_DATA && + read_write == I2C_SMBUS_READ) + smbcmd = I801_I2C_BLOCK_DATA; + else + smbcmd = I801_BLOCK_DATA; + + if (priv->features & FEATURE_IRQ) { + priv->is_read = (read_write == I2C_SMBUS_READ); + if (len == 1 && priv->is_read) + smbcmd |= SMBHSTCNT_LAST_BYTE; + priv->cmd = smbcmd | SMBHSTCNT_INTREN; + priv->len = len; + priv->count = 0; + priv->data = &data->block[1]; + + outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); + result = wait_event_timeout(priv->waitq, + (status = priv->status), + adap->timeout); + if (!result) { + status = -ETIMEDOUT; + dev_warn(&priv->pci_dev->dev, + "Timeout waiting for interrupt!\n"); + } + priv->status = 0; + return i801_check_post(priv, status); + } + + for (i = 1; i <= len; i++) { + if (i == len && read_write == I2C_SMBUS_READ) + smbcmd |= SMBHSTCNT_LAST_BYTE; + outb_p(smbcmd, SMBHSTCNT(priv)); + + if (i == 1) + outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START, + SMBHSTCNT(priv)); + + status = i801_wait_byte_done(priv); + if (status) + goto exit; + + if (i == 1 && read_write == I2C_SMBUS_READ + && command != I2C_SMBUS_I2C_BLOCK_DATA) { + len = inb_p(SMBHSTDAT0(priv)); + if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) { + dev_err(&priv->pci_dev->dev, + "Illegal SMBus block read size %d\n", + len); + /* Recover */ + while (inb_p(SMBHSTSTS(priv)) & + SMBHSTSTS_HOST_BUSY) + outb_p(SMBHSTSTS_BYTE_DONE, + SMBHSTSTS(priv)); + outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv)); + return -EPROTO; + } + data->block[0] = len; + } + + /* Retrieve/store value in SMBBLKDAT */ + if (read_write == I2C_SMBUS_READ) + data->block[i] = inb_p(SMBBLKDAT(priv)); + if (read_write == I2C_SMBUS_WRITE && i+1 <= len) + outb_p(data->block[i+1], SMBBLKDAT(priv)); + + /* signals SMBBLKDAT ready */ + outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); + } + + status = i801_wait_intr(priv); +exit: + return i801_check_post(priv, status); +} + +static int i801_set_block_buffer_mode(struct i801_priv *priv) +{ + outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv)); + if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0) + return -EIO; + return 0; +} + +/* Block transaction function */ +static int i801_block_transaction(struct i801_priv *priv, + union i2c_smbus_data *data, char read_write, + int command, int hwpec) +{ + int result = 0; + unsigned char hostc; + + if (command == I2C_SMBUS_I2C_BLOCK_DATA) { + if (read_write == I2C_SMBUS_WRITE) { + /* set I2C_EN bit in configuration register */ + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc); + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, + hostc | SMBHSTCFG_I2C_EN); + } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) { + dev_err(&priv->pci_dev->dev, + "I2C block read is unsupported!\n"); + return -EOPNOTSUPP; + } + } + + if (read_write == I2C_SMBUS_WRITE + || command == I2C_SMBUS_I2C_BLOCK_DATA) { + if (data->block[0] < 1) + data->block[0] = 1; + if (data->block[0] > I2C_SMBUS_BLOCK_MAX) + data->block[0] = I2C_SMBUS_BLOCK_MAX; + } else { + data->block[0] = 32; /* max for SMBus block reads */ + } + + /* Experience has shown that the block buffer can only be used for + SMBus (not I2C) block transactions, even though the datasheet + doesn't mention this limitation. */ + if ((priv->features & FEATURE_BLOCK_BUFFER) + && command != I2C_SMBUS_I2C_BLOCK_DATA + && i801_set_block_buffer_mode(priv) == 0) + result = i801_block_transaction_by_block(priv, data, + read_write, + command, hwpec); + else + result = i801_block_transaction_byte_by_byte(priv, data, + read_write, + command, hwpec); + + if (command == I2C_SMBUS_I2C_BLOCK_DATA + && read_write == I2C_SMBUS_WRITE) { + /* restore saved configuration register value */ + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc); + } + return result; +} + +/* Return negative errno on error. */ +static s32 i801_access(struct i2c_adapter *adap, u16 addr, + unsigned short flags, char read_write, u8 command, + int size, union i2c_smbus_data *data) +{ + int hwpec; + int block = 0; + int ret = 0, xact = 0; + struct i801_priv *priv = i2c_get_adapdata(adap); + + mutex_lock(&priv->acpi_lock); + if (priv->acpi_reserved) { + mutex_unlock(&priv->acpi_lock); + return -EBUSY; + } + + pm_runtime_get_sync(&priv->pci_dev->dev); + + hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC) + && size != I2C_SMBUS_QUICK + && size != I2C_SMBUS_I2C_BLOCK_DATA; + + switch (size) { + case I2C_SMBUS_QUICK: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + xact = I801_QUICK; + break; + case I2C_SMBUS_BYTE: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + if (read_write == I2C_SMBUS_WRITE) + outb_p(command, SMBHSTCMD(priv)); + xact = I801_BYTE; + break; + case I2C_SMBUS_BYTE_DATA: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + if (read_write == I2C_SMBUS_WRITE) + outb_p(data->byte, SMBHSTDAT0(priv)); + xact = I801_BYTE_DATA; + break; + case I2C_SMBUS_WORD_DATA: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + if (read_write == I2C_SMBUS_WRITE) { + outb_p(data->word & 0xff, SMBHSTDAT0(priv)); + outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); + } + xact = I801_WORD_DATA; + break; + case I2C_SMBUS_BLOCK_DATA: + outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), + SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + block = 1; + break; + case I2C_SMBUS_I2C_BLOCK_DATA: + /* + * NB: page 240 of ICH5 datasheet shows that the R/#W + * bit should be cleared here, even when reading. + * However if SPD Write Disable is set (Lynx Point and later), + * the read will fail if we don't set the R/#W bit. + */ + outb_p(((addr & 0x7f) << 1) | + ((priv->original_hstcfg & SMBHSTCFG_SPD_WD) ? + (read_write & 0x01) : 0), + SMBHSTADD(priv)); + if (read_write == I2C_SMBUS_READ) { + /* NB: page 240 of ICH5 datasheet also shows + * that DATA1 is the cmd field when reading */ + outb_p(command, SMBHSTDAT1(priv)); + } else + outb_p(command, SMBHSTCMD(priv)); + block = 1; + break; + case I2C_SMBUS_BLOCK_PROC_CALL: + /* + * Bit 0 of the slave address register always indicate a write + * command. + */ + outb_p((addr & 0x7f) << 1, SMBHSTADD(priv)); + outb_p(command, SMBHSTCMD(priv)); + block = 1; + break; + default: + dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n", + size); + ret = -EOPNOTSUPP; + goto out; + } + + if (hwpec) /* enable/disable hardware PEC */ + outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv)); + else + outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC), + SMBAUXCTL(priv)); + + if (block) + ret = i801_block_transaction(priv, data, read_write, size, + hwpec); + else + ret = i801_transaction(priv, xact); + + /* Some BIOSes don't like it when PEC is enabled at reboot or resume + time, so we forcibly disable it after every transaction. Turn off + E32B for the same reason. */ + if (hwpec || block) + outb_p(inb_p(SMBAUXCTL(priv)) & + ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); + + if (block) + goto out; + if (ret) + goto out; + if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK)) + goto out; + + switch (xact & 0x7f) { + case I801_BYTE: /* Result put in SMBHSTDAT0 */ + case I801_BYTE_DATA: + data->byte = inb_p(SMBHSTDAT0(priv)); + break; + case I801_WORD_DATA: + data->word = inb_p(SMBHSTDAT0(priv)) + + (inb_p(SMBHSTDAT1(priv)) << 8); + break; + } + +out: + pm_runtime_mark_last_busy(&priv->pci_dev->dev); + pm_runtime_put_autosuspend(&priv->pci_dev->dev); + mutex_unlock(&priv->acpi_lock); + return ret; +} + +static u32 i801_func(struct i2c_adapter *adapter) +{ + struct i801_priv *priv = i2c_get_adapdata(adapter); + + return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | + I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK | + ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) | + ((priv->features & FEATURE_BLOCK_PROC) ? + I2C_FUNC_SMBUS_BLOCK_PROC_CALL : 0) | + ((priv->features & FEATURE_I2C_BLOCK_READ) ? + I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0) | + ((priv->features & FEATURE_HOST_NOTIFY) ? + I2C_FUNC_SMBUS_HOST_NOTIFY : 0); +} + +static void i801_enable_host_notify(struct i2c_adapter *adapter) +{ + struct i801_priv *priv = i2c_get_adapdata(adapter); + + if (!(priv->features & FEATURE_HOST_NOTIFY)) + return; + + if (!(SMBSLVCMD_HST_NTFY_INTREN & priv->original_slvcmd)) + outb_p(SMBSLVCMD_HST_NTFY_INTREN | priv->original_slvcmd, + SMBSLVCMD(priv)); + + /* clear Host Notify bit to allow a new notification */ + outb_p(SMBSLVSTS_HST_NTFY_STS, SMBSLVSTS(priv)); +} + +static void i801_disable_host_notify(struct i801_priv *priv) +{ + if (!(priv->features & FEATURE_HOST_NOTIFY)) + return; + + outb_p(priv->original_slvcmd, SMBSLVCMD(priv)); +} + +static const struct i2c_algorithm smbus_algorithm = { + .smbus_xfer = i801_access, + .functionality = i801_func, +}; + +static const struct pci_device_id i801_ids[] = { + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GEMINILAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CDF_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DNV_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EBG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BROXTON_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS) }, + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS) }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, i801_ids); + +#if defined CONFIG_X86 && defined CONFIG_DMI +static unsigned char apanel_addr; + +/* Scan the system ROM for the signature "FJKEYINF" */ +static __init const void __iomem *bios_signature(const void __iomem *bios) +{ + ssize_t offset; + const unsigned char signature[] = "FJKEYINF"; + + for (offset = 0; offset < 0x10000; offset += 0x10) { + if (check_signature(bios + offset, signature, + sizeof(signature)-1)) + return bios + offset; + } + return NULL; +} + +static void __init input_apanel_init(void) +{ + void __iomem *bios; + const void __iomem *p; + + bios = ioremap(0xF0000, 0x10000); /* Can't fail */ + p = bios_signature(bios); + if (p) { + /* just use the first address */ + apanel_addr = readb(p + 8 + 3) >> 1; + } + iounmap(bios); +} + +struct dmi_onboard_device_info { + const char *name; + u8 type; + unsigned short i2c_addr; + const char *i2c_type; +}; + +static const struct dmi_onboard_device_info dmi_devices[] = { + { "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" }, + { "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" }, + { "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" }, +}; + +static void dmi_check_onboard_device(u8 type, const char *name, + struct i2c_adapter *adap) +{ + int i; + struct i2c_board_info info; + + for (i = 0; i < ARRAY_SIZE(dmi_devices); i++) { + /* & ~0x80, ignore enabled/disabled bit */ + if ((type & ~0x80) != dmi_devices[i].type) + continue; + if (strcasecmp(name, dmi_devices[i].name)) + continue; + + mem_clear(&info, sizeof(struct i2c_board_info)); + info.addr = dmi_devices[i].i2c_addr; + strlcpy(info.type, dmi_devices[i].i2c_type, I2C_NAME_SIZE); + i2c_new_client_device(adap, &info); + break; + } +} + +/* We use our own function to check for onboard devices instead of + dmi_find_device() as some buggy BIOS's have the devices we are interested + in marked as disabled */ +static void dmi_check_onboard_devices(const struct dmi_header *dm, void *adap) +{ + int i, count; + + if (dm->type != 10) + return; + + count = (dm->length - sizeof(struct dmi_header)) / 2; + for (i = 0; i < count; i++) { + const u8 *d = (char *)(dm + 1) + (i * 2); + const char *name = ((char *) dm) + dm->length; + u8 type = d[0]; + u8 s = d[1]; + + if (!s) + continue; + s--; + while (s > 0 && name[0]) { + name += strlen(name) + 1; + s--; + } + if (name[0] == 0) /* Bogus string reference */ + continue; + + dmi_check_onboard_device(type, name, adap); + } +} + +/* NOTE: Keep this list in sync with drivers/platform/x86/dell-smo8800.c */ +static const char *const acpi_smo8800_ids[] = { + "SMO8800", + "SMO8801", + "SMO8810", + "SMO8811", + "SMO8820", + "SMO8821", + "SMO8830", + "SMO8831", +}; + +static acpi_status check_acpi_smo88xx_device(acpi_handle obj_handle, + u32 nesting_level, + void *context, + void **return_value) +{ + struct acpi_device_info *info; + acpi_status status; + char *hid; + int i; + + status = acpi_get_object_info(obj_handle, &info); + if (ACPI_FAILURE(status)) + return AE_OK; + + if (!(info->valid & ACPI_VALID_HID)) + goto smo88xx_not_found; + + hid = info->hardware_id.string; + if (!hid) + goto smo88xx_not_found; + + i = match_string(acpi_smo8800_ids, ARRAY_SIZE(acpi_smo8800_ids), hid); + if (i < 0) + goto smo88xx_not_found; + + kfree(info); + + *((bool *)return_value) = true; + return AE_CTRL_TERMINATE; + +smo88xx_not_found: + kfree(info); + return AE_OK; +} + +static bool is_dell_system_with_lis3lv02d(void) +{ + bool found; + const char *vendor; + + vendor = dmi_get_system_info(DMI_SYS_VENDOR); + if (!vendor || strcmp(vendor, "Dell Inc.")) + return false; + + /* + * Check that ACPI device SMO88xx is present and is functioning. + * Function acpi_get_devices() already filters all ACPI devices + * which are not present or are not functioning. + * ACPI device SMO88xx represents our ST microelectronics lis3lv02d + * accelerometer but unfortunately ACPI does not provide any other + * information (like I2C address). + */ + found = false; + acpi_get_devices(NULL, check_acpi_smo88xx_device, NULL, + (void **)&found); + + return found; +} + +/* + * Accelerometer's I2C address is not specified in DMI nor ACPI, + * so it is needed to define mapping table based on DMI product names. + */ +static const struct { + const char *dmi_product_name; + unsigned short i2c_addr; +} dell_lis3lv02d_devices[] = { + /* + * Dell platform team told us that these Latitude devices have + * ST microelectronics accelerometer at I2C address 0x29. + */ + { "Latitude E5250", 0x29 }, + { "Latitude E5450", 0x29 }, + { "Latitude E5550", 0x29 }, + { "Latitude E6440", 0x29 }, + { "Latitude E6440 ATG", 0x29 }, + { "Latitude E6540", 0x29 }, + /* + * Additional individual entries were added after verification. + */ + { "Latitude 5480", 0x29 }, + { "Vostro V131", 0x1d }, +}; + +static void register_dell_lis3lv02d_i2c_device(struct i801_priv *priv) +{ + struct i2c_board_info info; + const char *dmi_product_name; + int i; + + dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); + for (i = 0; i < ARRAY_SIZE(dell_lis3lv02d_devices); ++i) { + if (strcmp(dmi_product_name, + dell_lis3lv02d_devices[i].dmi_product_name) == 0) + break; + } + + if (i == ARRAY_SIZE(dell_lis3lv02d_devices)) { + dev_warn(&priv->pci_dev->dev, + "Accelerometer lis3lv02d is present on SMBus but its" + " address is unknown, skipping registration\n"); + return; + } + + mem_clear(&info, sizeof(struct i2c_board_info)); + info.addr = dell_lis3lv02d_devices[i].i2c_addr; + strlcpy(info.type, "lis3lv02d", I2C_NAME_SIZE); + i2c_new_client_device(&priv->adapter, &info); +} + +/* Register optional slaves */ +static void i801_probe_optional_slaves(struct i801_priv *priv) +{ + /* Only register slaves on main SMBus channel */ + if (priv->features & FEATURE_IDF) + return; + + if (apanel_addr) { + struct i2c_board_info info; + + mem_clear(&info, sizeof(struct i2c_board_info)); + info.addr = apanel_addr; + strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE); + i2c_new_client_device(&priv->adapter, &info); + } + + if (dmi_name_in_vendors("FUJITSU")) + dmi_walk(dmi_check_onboard_devices, &priv->adapter); + + if (is_dell_system_with_lis3lv02d()) + register_dell_lis3lv02d_i2c_device(priv); + + /* Instantiate SPD EEPROMs unless the SMBus is multiplexed */ +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) + if (!priv->mux_drvdata) +#endif + i2c_register_spd(&priv->adapter); +} +#else +static void __init input_apanel_init(void) {} +static void i801_probe_optional_slaves(struct i801_priv *priv) {} +#endif /* CONFIG_X86 && CONFIG_DMI */ + +#if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI +static struct i801_mux_config i801_mux_config_asus_z8_d12 = { + .gpio_chip = "gpio_ich", + .values = { 0x02, 0x03 }, + .n_values = 2, + .classes = { I2C_CLASS_SPD, I2C_CLASS_SPD }, + .gpios = { 52, 53 }, + .n_gpios = 2, +}; + +static struct i801_mux_config i801_mux_config_asus_z8_d18 = { + .gpio_chip = "gpio_ich", + .values = { 0x02, 0x03, 0x01 }, + .n_values = 3, + .classes = { I2C_CLASS_SPD, I2C_CLASS_SPD, I2C_CLASS_SPD }, + .gpios = { 52, 53 }, + .n_gpios = 2, +}; + +static const struct dmi_system_id mux_dmi_table[] = { + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"), + }, + .driver_data = &i801_mux_config_asus_z8_d18, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"), + }, + .driver_data = &i801_mux_config_asus_z8_d18, + }, + { + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"), + }, + .driver_data = &i801_mux_config_asus_z8_d12, + }, + { } +}; + +/* Setup multiplexing if needed */ +static int i801_add_mux(struct i801_priv *priv) +{ + struct device *dev = &priv->adapter.dev; + const struct i801_mux_config *mux_config; + struct i2c_mux_gpio_platform_data gpio_data; + struct gpiod_lookup_table *lookup; + int err, i; + + if (!priv->mux_drvdata) + return 0; + mux_config = priv->mux_drvdata; + + /* Prepare the platform data */ + mem_clear(&gpio_data, sizeof(struct i2c_mux_gpio_platform_data)); + gpio_data.parent = priv->adapter.nr; + gpio_data.values = mux_config->values; + gpio_data.n_values = mux_config->n_values; + gpio_data.classes = mux_config->classes; + gpio_data.idle = I2C_MUX_GPIO_NO_IDLE; + + /* Register GPIO descriptor lookup table */ + lookup = devm_kzalloc(dev, + struct_size(lookup, table, mux_config->n_gpios + 1), + GFP_KERNEL); + if (!lookup) + return -ENOMEM; + lookup->dev_id = "i2c-mux-gpio"; + for (i = 0; i < mux_config->n_gpios; i++) { + lookup->table[i] = (struct gpiod_lookup) + GPIO_LOOKUP(mux_config->gpio_chip, + mux_config->gpios[i], "mux", 0); + } + gpiod_add_lookup_table(lookup); + priv->lookup = lookup; + + /* + * Register the mux device, we use PLATFORM_DEVID_NONE here + * because since we are referring to the GPIO chip by name we are + * anyways in deep trouble if there is more than one of these + * devices, and there should likely only be one platform controller + * hub. + */ + priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio", + PLATFORM_DEVID_NONE, &gpio_data, + sizeof(struct i2c_mux_gpio_platform_data)); + if (IS_ERR(priv->mux_pdev)) { + err = PTR_ERR(priv->mux_pdev); + gpiod_remove_lookup_table(lookup); + priv->mux_pdev = NULL; + dev_err(dev, "Failed to register i2c-mux-gpio device\n"); + return err; + } + + return 0; +} + +static void i801_del_mux(struct i801_priv *priv) +{ + if (priv->mux_pdev) + platform_device_unregister(priv->mux_pdev); + if (priv->lookup) + gpiod_remove_lookup_table(priv->lookup); +} + +static unsigned int i801_get_adapter_class(struct i801_priv *priv) +{ + const struct dmi_system_id *id; + const struct i801_mux_config *mux_config; + unsigned int class = I2C_CLASS_HWMON | I2C_CLASS_SPD; + int i; + + id = dmi_first_match(mux_dmi_table); + if (id) { + /* Remove branch classes from trunk */ + mux_config = id->driver_data; + for (i = 0; i < mux_config->n_values; i++) + class &= ~mux_config->classes[i]; + + /* Remember for later */ + priv->mux_drvdata = mux_config; + } + + return class; +} +#else +static inline int i801_add_mux(struct i801_priv *priv) { return 0; } +static inline void i801_del_mux(struct i801_priv *priv) { } + +static inline unsigned int i801_get_adapter_class(struct i801_priv *priv) +{ + return I2C_CLASS_HWMON | I2C_CLASS_SPD; +} +#endif + +static const struct itco_wdt_platform_data spt_tco_platform_data = { + .name = "Intel PCH", + .version = 4, +}; + +static DEFINE_SPINLOCK(p2sb_spinlock); + +static struct platform_device * +i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev, + struct resource *tco_res) +{ + struct resource *res; + unsigned int devfn; + u64 base64_addr; + u32 base_addr; + u8 hidden; + + /* + * We must access the NO_REBOOT bit over the Primary to Sideband + * bridge (P2SB). The BIOS prevents the P2SB device from being + * enumerated by the PCI subsystem, so we need to unhide/hide it + * to lookup the P2SB BAR. + */ + spin_lock(&p2sb_spinlock); + + devfn = PCI_DEVFN(PCI_SLOT(pci_dev->devfn), 1); + + /* Unhide the P2SB device, if it is hidden */ + pci_bus_read_config_byte(pci_dev->bus, devfn, 0xe1, &hidden); + if (hidden) + pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, 0x0); + + pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR, &base_addr); + base64_addr = base_addr & 0xfffffff0; + + pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR + 0x4, &base_addr); + base64_addr |= (u64)base_addr << 32; + + /* Hide the P2SB device, if it was hidden before */ + if (hidden) + pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden); + spin_unlock(&p2sb_spinlock); + + res = &tco_res[1]; + if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) + res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; + else + res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL; + + res->end = res->start + 3; + res->flags = IORESOURCE_MEM; + + return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, + tco_res, 2, &spt_tco_platform_data, + sizeof(spt_tco_platform_data)); +} + +static const struct itco_wdt_platform_data cnl_tco_platform_data = { + .name = "Intel PCH", + .version = 6, +}; + +static struct platform_device * +i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev, + struct resource *tco_res) +{ + return platform_device_register_resndata(&pci_dev->dev, + "iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data, + sizeof(cnl_tco_platform_data)); +} + +static void i801_add_tco(struct i801_priv *priv) +{ + struct pci_dev *pci_dev = priv->pci_dev; + struct resource tco_res[2], *res; + u32 tco_base, tco_ctl; + + /* If we have ACPI based watchdog use that instead */ + if (acpi_has_watchdog()) + return; + + if (!(priv->features & (FEATURE_TCO_SPT | FEATURE_TCO_CNL))) + return; + + pci_read_config_dword(pci_dev, TCOBASE, &tco_base); + pci_read_config_dword(pci_dev, TCOCTL, &tco_ctl); + if (!(tco_ctl & TCOCTL_EN)) + return; + + mem_clear(tco_res, sizeof(tco_res)); + /* + * Always populate the main iTCO IO resource here. The second entry + * for NO_REBOOT MMIO is filled by the SPT specific function. + */ + res = &tco_res[0]; + res->start = tco_base & ~1; + res->end = res->start + 32 - 1; + res->flags = IORESOURCE_IO; + + if (priv->features & FEATURE_TCO_CNL) + priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); + else + priv->tco_pdev = i801_add_tco_spt(priv, pci_dev, tco_res); + + if (IS_ERR(priv->tco_pdev)) + dev_warn(&pci_dev->dev, "failed to create iTCO device\n"); +} + +#ifdef CONFIG_ACPI +static bool i801_acpi_is_smbus_ioport(const struct i801_priv *priv, + acpi_physical_address address) +{ + return address >= priv->smba && + address <= pci_resource_end(priv->pci_dev, SMBBAR); +} + +static acpi_status +i801_acpi_io_handler(u32 function, acpi_physical_address address, u32 bits, + u64 *value, void *handler_context, void *region_context) +{ + struct i801_priv *priv = handler_context; + struct pci_dev *pdev = priv->pci_dev; + acpi_status status; + + /* + * Once BIOS AML code touches the OpRegion we warn and inhibit any + * further access from the driver itself. This device is now owned + * by the system firmware. + */ + mutex_lock(&priv->acpi_lock); + + if (!priv->acpi_reserved && i801_acpi_is_smbus_ioport(priv, address)) { + priv->acpi_reserved = true; + + dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n"); + dev_warn(&pdev->dev, "Driver SMBus register access inhibited\n"); + + /* + * BIOS is accessing the host controller so prevent it from + * suspending automatically from now on. + */ + pm_runtime_get_sync(&pdev->dev); + } + + if ((function & ACPI_IO_MASK) == ACPI_READ) + status = acpi_os_read_port(address, (u32 *)value, bits); + else + status = acpi_os_write_port(address, (u32)*value, bits); + + mutex_unlock(&priv->acpi_lock); + + return status; +} + +static int i801_acpi_probe(struct i801_priv *priv) +{ + struct acpi_device *adev; + acpi_status status; + + adev = ACPI_COMPANION(&priv->pci_dev->dev); + if (adev) { + status = acpi_install_address_space_handler(adev->handle, + ACPI_ADR_SPACE_SYSTEM_IO, i801_acpi_io_handler, + NULL, priv); + if (ACPI_SUCCESS(status)) + return 0; + } + + return acpi_check_resource_conflict(&priv->pci_dev->resource[SMBBAR]); +} + +static void i801_acpi_remove(struct i801_priv *priv) +{ + struct acpi_device *adev; + + adev = ACPI_COMPANION(&priv->pci_dev->dev); + if (!adev) + return; + + acpi_remove_address_space_handler(adev->handle, + ACPI_ADR_SPACE_SYSTEM_IO, i801_acpi_io_handler); + + mutex_lock(&priv->acpi_lock); + if (priv->acpi_reserved) + pm_runtime_put(&priv->pci_dev->dev); + mutex_unlock(&priv->acpi_lock); +} +#else +static inline int i801_acpi_probe(struct i801_priv *priv) { return 0; } +static inline void i801_acpi_remove(struct i801_priv *priv) { } +#endif + +static unsigned char i801_setup_hstcfg(struct i801_priv *priv) +{ + unsigned char hstcfg = priv->original_hstcfg; + + hstcfg &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */ + hstcfg |= SMBHSTCFG_HST_EN; + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hstcfg); + return hstcfg; +} + +static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + unsigned char temp; + int err, i; + struct i801_priv *priv; + + priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + i2c_set_adapdata(&priv->adapter, priv); + priv->adapter.owner = THIS_MODULE; + priv->adapter.class = i801_get_adapter_class(priv); + priv->adapter.algo = &smbus_algorithm; + priv->adapter.dev.parent = &dev->dev; + ACPI_COMPANION_SET(&priv->adapter.dev, ACPI_COMPANION(&dev->dev)); + priv->adapter.retries = 3; + mutex_init(&priv->acpi_lock); + + priv->pci_dev = dev; + switch (dev->device) { + case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS: + case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS: + case PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS: + case PCI_DEVICE_ID_INTEL_DNV_SMBUS: + case PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS: + case PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS: + priv->features |= FEATURE_BLOCK_PROC; + priv->features |= FEATURE_I2C_BLOCK_READ; + priv->features |= FEATURE_IRQ; + priv->features |= FEATURE_SMBUS_PEC; + priv->features |= FEATURE_BLOCK_BUFFER; + priv->features |= FEATURE_TCO_SPT; + priv->features |= FEATURE_HOST_NOTIFY; + break; + + case PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS: + case PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_CDF_SMBUS: + case PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS: + case PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS: + case PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS: + case PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS: + case PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS: + case PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS: + case PCI_DEVICE_ID_INTEL_EBG_SMBUS: + case PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS: + priv->features |= FEATURE_BLOCK_PROC; + priv->features |= FEATURE_I2C_BLOCK_READ; + priv->features |= FEATURE_IRQ; + priv->features |= FEATURE_SMBUS_PEC; + priv->features |= FEATURE_BLOCK_BUFFER; + priv->features |= FEATURE_TCO_CNL; + priv->features |= FEATURE_HOST_NOTIFY; + break; + + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0: + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1: + case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2: + case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0: + case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1: + case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2: + priv->features |= FEATURE_IDF; + fallthrough; + default: + priv->features |= FEATURE_BLOCK_PROC; + priv->features |= FEATURE_I2C_BLOCK_READ; + priv->features |= FEATURE_IRQ; + fallthrough; + case PCI_DEVICE_ID_INTEL_82801DB_3: + priv->features |= FEATURE_SMBUS_PEC; + priv->features |= FEATURE_BLOCK_BUFFER; + fallthrough; + case PCI_DEVICE_ID_INTEL_82801CA_3: + priv->features |= FEATURE_HOST_NOTIFY; + fallthrough; + case PCI_DEVICE_ID_INTEL_82801BA_2: + case PCI_DEVICE_ID_INTEL_82801AB_3: + case PCI_DEVICE_ID_INTEL_82801AA_3: + break; + } + + /* Disable features on user request */ + for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) { + if (priv->features & disable_features & (1 << i)) + dev_notice(&dev->dev, "%s disabled by user\n", + i801_feature_names[i]); + } + priv->features &= ~disable_features; + + err = pcim_enable_device(dev); + if (err) { + dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n", + err); + return err; + } + pcim_pin_device(dev); + + /* Determine the address of the SMBus area */ + priv->smba = pci_resource_start(dev, SMBBAR); + if (!priv->smba) { + dev_err(&dev->dev, + "SMBus base address uninitialized, upgrade BIOS\n"); + return -ENODEV; + } + + if (i801_acpi_probe(priv)) + return -ENODEV; + + err = pcim_iomap_regions(dev, 1 << SMBBAR, + dev_driver_string(&dev->dev)); + if (err) { + dev_err(&dev->dev, + "Failed to request SMBus region 0x%lx-0x%Lx\n", + priv->smba, + (unsigned long long)pci_resource_end(dev, SMBBAR)); + i801_acpi_remove(priv); + return err; + } + + pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &priv->original_hstcfg); + temp = i801_setup_hstcfg(priv); + if (!(priv->original_hstcfg & SMBHSTCFG_HST_EN)) + dev_info(&dev->dev, "Enabling SMBus device\n"); + + if (temp & SMBHSTCFG_SMB_SMI_EN) { + dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n"); + /* Disable SMBus interrupt feature if SMBus using SMI# */ + priv->features &= ~FEATURE_IRQ; + } + if (temp & SMBHSTCFG_SPD_WD) + dev_info(&dev->dev, "SPD Write Disable is set\n"); + + /* Clear special mode bits */ + if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER)) + outb_p(inb_p(SMBAUXCTL(priv)) & + ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); + + /* Remember original Host Notify setting */ + if (priv->features & FEATURE_HOST_NOTIFY) + priv->original_slvcmd = inb_p(SMBSLVCMD(priv)); + + /* Default timeout in interrupt mode: 200 ms */ + priv->adapter.timeout = HZ / 5; + + if (dev->irq == IRQ_NOTCONNECTED) + priv->features &= ~FEATURE_IRQ; + + if (priv->features & FEATURE_IRQ) { + u16 pcictl, pcists; + + /* Complain if an interrupt is already pending */ + pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); + if (pcists & SMBPCISTS_INTS) + dev_warn(&dev->dev, "An interrupt is pending!\n"); + + /* Check if interrupts have been disabled */ + pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); + if (pcictl & SMBPCICTL_INTDIS) { + dev_info(&dev->dev, "Interrupts are disabled\n"); + priv->features &= ~FEATURE_IRQ; + } + } + + if (priv->features & FEATURE_IRQ) { + init_waitqueue_head(&priv->waitq); + + err = devm_request_irq(&dev->dev, dev->irq, i801_isr, + IRQF_SHARED, + dev_driver_string(&dev->dev), priv); + if (err) { + dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", + dev->irq, err); + priv->features &= ~FEATURE_IRQ; + } + } + dev_info(&dev->dev, "SMBus using %s\n", + priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling"); + + i801_add_tco(priv); + + snprintf(priv->adapter.name, sizeof(priv->adapter.name), + "SMBus I801 adapter at %04lx", priv->smba); + err = i2c_add_adapter(&priv->adapter); + if (err) { + i801_acpi_remove(priv); + return err; + } + + i801_enable_host_notify(&priv->adapter); + + i801_probe_optional_slaves(priv); + /* We ignore errors - multiplexing is optional */ + i801_add_mux(priv); + + pci_set_drvdata(dev, priv); + + dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE); + pm_runtime_set_autosuspend_delay(&dev->dev, 1000); + pm_runtime_use_autosuspend(&dev->dev); + pm_runtime_put_autosuspend(&dev->dev); + pm_runtime_allow(&dev->dev); + dev_info(&dev->dev, "wb-i2c-i801 probe ok.\n"); + + return 0; +} + +static void i801_remove(struct pci_dev *dev) +{ + struct i801_priv *priv = pci_get_drvdata(dev); + + pm_runtime_forbid(&dev->dev); + pm_runtime_get_noresume(&dev->dev); + + i801_disable_host_notify(priv); + i801_del_mux(priv); + i2c_del_adapter(&priv->adapter); + i801_acpi_remove(priv); + pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); + + platform_device_unregister(priv->tco_pdev); + + /* + * do not call pci_disable_device(dev) since it can cause hard hangs on + * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010) + */ +} + +static void i801_shutdown(struct pci_dev *dev) +{ + struct i801_priv *priv = pci_get_drvdata(dev); + + /* Restore config registers to avoid hard hang on some systems */ + i801_disable_host_notify(priv); + pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); +} + +#ifdef CONFIG_PM_SLEEP +static int i801_suspend(struct device *dev) +{ + struct i801_priv *priv = dev_get_drvdata(dev); + + pci_write_config_byte(priv->pci_dev, SMBHSTCFG, priv->original_hstcfg); + return 0; +} + +static int i801_resume(struct device *dev) +{ + struct i801_priv *priv = dev_get_drvdata(dev); + + i801_setup_hstcfg(priv); + i801_enable_host_notify(&priv->adapter); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(i801_pm_ops, i801_suspend, i801_resume); + +static struct pci_driver i801_driver = { + .name = "wb_i801_smbus", + .id_table = i801_ids, + .probe = i801_probe, + .remove = i801_remove, + .shutdown = i801_shutdown, + .driver = { + .pm = &i801_pm_ops, + }, +}; + +static int __init i2c_i801_init(void) +{ + if (dmi_name_in_vendors("FUJITSU")) + input_apanel_init(); + return pci_register_driver(&i801_driver); +} + +static void __exit i2c_i801_exit(void) +{ + pci_unregister_driver(&i801_driver); +} + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("I801 SMBus driver"); +MODULE_LICENSE("GPL"); + +module_init(i2c_i801_init); +module_exit(i2c_i801_exit); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c new file mode 100644 index 0000000000..0859cf1653 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.c @@ -0,0 +1,1343 @@ +/* + * I2C multiplexer + * + * Copyright (c) 2008-2009 Rodolfo Giometti + * Copyright (c) 2008-2009 Eurotech S.p.A. + * + * This module supports the PCA954x series of I2C multiplexer/switch chips + * made by Philips Semiconductors. + * This includes the: + * PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547 + * and PCA9548. + * + * These chips are all controlled via the I2C bus itself, and all have a + * single 8-bit register. The upstream "parent" bus fans out to two, + * four, or eight downstream busses or channels; which of these + * are selected is determined by the chip type and register contents. A + * mux can select only one sub-bus at a time; a switch can select any + * combination simultaneously. + * + * Based on: + * pca954x.c from Kumar Gala + * Copyright (C) 2006 + * + * Based on: + * pca954x.c from Ken Harrenstien + * Copyright (C) 2004 Google, Inc. (Ken Harrenstien) + * + * Based on: + * i2c-virtual_cb.c from Brian Kuschak + * and + * pca9540.c from Jean Delvare . + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_mux_pca954x.h" + +#define PCA954X_MAX_NCHANS 8 +#define PCA954X_IRQ_OFFSET 4 + +#define I2C_RETRY_TIMES 5 +#define I2C_RETRY_WAIT_TIMES 10 /*delay 10ms*/ + +typedef struct pca9548_cfg_info_s { + uint32_t pca9548_base_nr; + uint32_t pca9548_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; + bool select_chan_check; + bool close_chan_force_reset; +} pca9548_cfg_info_t; + +int g_pca954x_debug = 0; +int g_pca954x_error = 0; + +module_param(g_pca954x_debug, int, S_IRUGO | S_IWUSR); +module_param(g_pca954x_error, int, S_IRUGO | S_IWUSR); + +#define PCA954X_DEBUG(fmt, args...) do { \ + if (g_pca954x_debug) { \ + printk(KERN_INFO "[PCA95x][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define PCA954X_ERROR(fmt, args...) do { \ + if (g_pca954x_error) { \ + printk(KERN_ERR "[PCA95x][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +extern int pca9641_setmuxflag(int nr, int flag); +enum pca_type { + pca_9540, + pca_9542, + pca_9543, + pca_9544, + pca_9545, + pca_9546, + pca_9547, + pca_9548, +}; + +struct chip_desc { + u8 nchans; + u8 enable; /* used for muxes only */ + u8 has_irq; + enum muxtype { + pca954x_ismux = 0, + pca954x_isswi + } muxtype; +}; + +struct pca954x { + const struct chip_desc *chip; + u8 last_chan; /* last register value */ + u8 deselect; + struct i2c_client *client; + struct irq_domain *irq; + unsigned int irq_mask; + raw_spinlock_t lock; + pca9548_cfg_info_t pca9548_cfg_info; /* pca9548 reset cfg */ +}; + +/* Provide specs for the PCA954x types we know about */ +static const struct chip_desc chips[] = { + [pca_9540] = { + .nchans = 2, + .enable = 0x4, + .muxtype = pca954x_ismux, + }, + [pca_9542] = { + .nchans = 2, + .enable = 0x4, + .has_irq = 1, + .muxtype = pca954x_ismux, + }, + [pca_9543] = { + .nchans = 2, + .has_irq = 1, + .muxtype = pca954x_isswi, + }, + [pca_9544] = { + .nchans = 4, + .enable = 0x4, + .has_irq = 1, + .muxtype = pca954x_ismux, + }, + [pca_9545] = { + .nchans = 4, + .has_irq = 1, + .muxtype = pca954x_isswi, + }, + [pca_9546] = { + .nchans = 4, + .muxtype = pca954x_isswi, + }, + [pca_9547] = { + .nchans = 8, + .enable = 0x8, + .muxtype = pca954x_ismux, + }, + [pca_9548] = { + .nchans = 8, + .muxtype = pca954x_isswi, + }, +}; + +static const struct i2c_device_id pca954x_id[] = { + { "wb_pca9540", pca_9540 }, + { "wb_pca9542", pca_9542 }, + { "wb_pca9543", pca_9543 }, + { "wb_pca9544", pca_9544 }, + { "wb_pca9545", pca_9545 }, + { "wb_pca9546", pca_9546 }, + { "wb_pca9547", pca_9547 }, + { "wb_pca9548", pca_9548 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, pca954x_id); + +#ifdef CONFIG_OF +static const struct of_device_id pca954x_of_match[] = { + { .compatible = "nxp,wb_pca9540", .data = &chips[pca_9540] }, + { .compatible = "nxp,wb_pca9542", .data = &chips[pca_9542] }, + { .compatible = "nxp,wb_pca9543", .data = &chips[pca_9543] }, + { .compatible = "nxp,wb_pca9544", .data = &chips[pca_9544] }, + { .compatible = "nxp,wb_pca9545", .data = &chips[pca_9545] }, + { .compatible = "nxp,wb_pca9546", .data = &chips[pca_9546] }, + { .compatible = "nxp,wb_pca9547", .data = &chips[pca_9547] }, + { .compatible = "nxp,wb_pca9548", .data = &chips[pca_9548] }, + {} +}; +MODULE_DEVICE_TABLE(of, pca954x_of_match); +#endif + +/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer() + for this as they will try to lock adapter a second time */ +static int pca954x_reg_write(struct i2c_adapter *adap, + struct i2c_client *client, u8 val) +{ + int ret = -ENODEV; + + if (adap->algo->master_xfer) { + struct i2c_msg msg; + char buf[1]; + + msg.addr = client->addr; + msg.flags = 0; + msg.len = 1; + buf[0] = val; + msg.buf = buf; + ret = __i2c_transfer(adap, &msg, 1); + + if (ret >= 0 && ret != 1) + ret = -EREMOTEIO; + } else { + union i2c_smbus_data data; + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_WRITE, + val, I2C_SMBUS_BYTE, &data); + } + return ret; +} + + static int pca954x_reg_read(struct i2c_adapter *adap, + struct i2c_client *client, u8 *val) + { + int ret = -ENODEV; + u8 tmp_val; + + if (adap->algo->master_xfer) { + struct i2c_msg msg; + + msg.addr = client->addr; + msg.flags = I2C_M_RD; + msg.len = 1; + msg.buf = &tmp_val; + ret = __i2c_transfer(adap, &msg, 1); + + if (ret >= 0 && ret != 1) + ret = -EREMOTEIO; + } else { + union i2c_smbus_data data; + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_READ, + 0, I2C_SMBUS_BYTE, &data); + + if (!ret) { + tmp_val = data.byte; + } + } + + *val = tmp_val; + return ret; + } + +static int pca954x_setmuxflag(struct i2c_client *client, int flag) +{ + struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); + + pca9641_setmuxflag(adap->nr, flag); + return 0; +} + +static int pca9548_gpio_init(gpio_attr_t *gpio_attr) +{ + int err; + + if (gpio_attr->gpio_init) { + PCA954X_DEBUG("gpio%d already init, do nothing.\n", gpio_attr->gpio); + return 0; + } + + PCA954X_DEBUG("gpio%d init.\n", gpio_attr->gpio); + err = gpio_request(gpio_attr->gpio, "pca9548_reset"); + if (err) { + goto error; + } + err = gpio_direction_output(gpio_attr->gpio, gpio_attr->reset_off); + if (err) { + gpio_free(gpio_attr->gpio); + goto error; + } + gpio_attr->gpio_init = 1; + return 0; +error: + PCA954X_ERROR("pca9548_gpio_init failed, ret:%d.\n", err); + return err; +} + +static void pca9548_gpio_free(gpio_attr_t *gpio_attr) +{ + if (gpio_attr->gpio_init == 1) { + PCA954X_DEBUG("gpio%d release.\n", gpio_attr->gpio); + gpio_free(gpio_attr->gpio); + gpio_attr->gpio_init = 0; + } +} + +static int pca954x_reset_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + PCA954X_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA954X_ERROR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca954x_reset_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + PCA954X_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA954X_ERROR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca954x_reset_i2c_read(uint32_t bus, uint32_t addr, uint32_t offset_addr, + unsigned char *buf, uint32_t size) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i ,j ; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA954X_ERROR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = addr; + for (j = 0 ;j < size ;j++) { + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_read_byte_data(&client, (offset_addr + j)); + if (rv < 0) { + PCA954X_ERROR("i2c read failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + *(buf + j) = (unsigned char)rv; + break; + } + } +out: + filp_close(fp, NULL); + return rv; +} + +static int pca954x_reset_i2c_write(uint32_t bus, uint32_t dev_addr, uint32_t offset_addr, + uint8_t write_buf) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA954X_ERROR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = dev_addr; + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_write_byte_data(&client, offset_addr, write_buf); + if (rv < 0) { + PCA954X_ERROR("i2c write failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + break; + } +out: + filp_close(fp, NULL); + return rv; +} + +static void pca954x_close_chan_finally(struct i2c_mux_core * muxc) +{ + struct pca954x *data; + struct i2c_adapter *adapter; + struct i2c_client *client; + int adapter_timeout; + + data = i2c_mux_priv(muxc); + client = data->client; + adapter = muxc->parent; + /* get bus info */ + while (i2c_parent_is_i2c_adapter(adapter)) { + adapter = to_i2c_adapter(adapter->dev.parent); + } + adapter_timeout = adapter->timeout; + adapter->timeout = msecs_to_jiffies(50); + pca954x_reg_write(muxc->parent, client, data->last_chan); + adapter->timeout = adapter_timeout; + + return; +} + +static int pca954x_do_file_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + file_attr_t *file_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + file_attr = &reset_cfg->attr.file_attr; + ret = -1; + + PCA954X_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA954X_DEBUG("dev_name:%s, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + file_attr->dev_name, file_attr->offset, file_attr->mask, + file_attr->reset_on, file_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca954x_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= ~(file_attr->mask); + val |= file_attr->reset_on; + err = pca954x_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(file_attr->mask); + val |= file_attr->reset_off; + err = pca954x_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca954x_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (file_attr->mask); + if (val == file_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_file_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA954X_ERROR("pca954x_do_file_reset timeout.\n"); + } +out: + if (err < 0) { + PCA954X_ERROR("pca954x_do_file_reset file rd/wr failed, ret:%d.\n", err); + } + + return ret; +} + +static int pca954x_do_io_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + io_attr_t *io_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + io_attr = &reset_cfg->attr.io_attr; + + PCA954X_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA954X_DEBUG("io_addr:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + io_attr->io_addr, io_attr->mask, io_attr->reset_on, io_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + val = inb(io_attr->io_addr); + val &= ~(io_attr->mask); + val |= io_attr->reset_on; + outb(val, io_attr->io_addr); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(io_attr->mask); + val |= io_attr->reset_off; + outb(val, io_attr->io_addr); + + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = inb(io_attr->io_addr); + val &= (io_attr->mask); + if (val == io_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_io_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA954X_ERROR("pca954x_do_io_reset timeout.\n"); + } + + return ret; +} + +static int pca954x_do_gpio_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + gpio_attr_t *gpio_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + gpio_attr = &reset_cfg->attr.gpio_attr; + + ret = pca9548_gpio_init(gpio_attr); + if (ret) { + return -1; + } + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + /* reset on */ + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_on); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + /* reset off */ + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_off); + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = __gpio_get_value(gpio_attr->gpio); + if (val == gpio_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_gpio_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + /* 1MS schedule*/ + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA954X_ERROR("pca954x_do_gpio_reset timeout.\n"); + } + + pca9548_gpio_free(gpio_attr); + return ret; +} + +static int pca954x_do_i2c_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca954x *data; + struct i2c_client *client; + pca9548_cfg_info_t *reset_cfg; + i2c_attr_t *i2c_attr; + u8 val; + + data = i2c_mux_priv(muxc); + client = data->client; + reset_cfg = &data->pca9548_cfg_info; + i2c_attr = &reset_cfg->attr.i2c_attr; + ret = -1; + + PCA954X_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA954X_DEBUG("bus:0x%x, addr:0x%x, reg:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + i2c_attr->i2c_bus, i2c_attr->i2c_addr, i2c_attr->reg_offset, + i2c_attr->mask, i2c_attr->reset_on, i2c_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca954x_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_on; + err = pca954x_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_off; + err = pca954x_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca954x_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (i2c_attr->mask); + if (val == i2c_attr->reset_off) { + ret = 0; + pca954x_close_chan_finally(muxc); + PCA954X_DEBUG("pca954x_do_i2c_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA954X_ERROR("pca954x_do_i2c_reset timeout.\n"); + } +out: + if (err < 0) { + PCA954X_ERROR("pca954x_do_i2c_reset i2c op failed, ret:%d.\n", err); + } + return ret; +} + +static int pca954x_do_reset(struct i2c_mux_core *muxc) +{ + int ret; + struct pca954x *data; + + data = i2c_mux_priv(muxc); + if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_NONE) { + ret = -1; + PCA954X_DEBUG("Don't need to reset.\n"); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_I2C) { + ret = pca954x_do_i2c_reset(muxc); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_GPIO) { + ret = pca954x_do_gpio_reset(muxc); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_IO) { + ret = pca954x_do_io_reset(muxc); + } else if (data->pca9548_cfg_info.pca9548_reset_type == PCA9548_RESET_FILE) { + ret = pca954x_do_file_reset(muxc); + } else { + ret = -1; + PCA954X_ERROR("Unsupport reset type:0x%x.\n", + data->pca9548_cfg_info.pca9548_reset_type); + } + + if (ret < 0) { + PCA954X_ERROR("pca9548_reset_ctrl failed, reset type:%u, ret:%d.\n", + data->pca9548_cfg_info.pca9548_reset_type, ret); + } + return ret; +} + +static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + const struct chip_desc *chip = data->chip; + u8 regval; + int ret = 0; + u8 read_val = 0; + int rv; + + /* we make switches look like muxes, not sure how to be smarter */ + if (chip->muxtype == pca954x_ismux) + regval = chan | chip->enable; + else + regval = 1 << chan; + + /* Only select the channel if its different from the last channel */ + if (data->last_chan != regval) { + pca954x_setmuxflag(client, 0); + ret = pca954x_reg_write(muxc->parent, client, regval); + data->last_chan = ret < 0 ? 0 : regval; + } + + if (data->pca9548_cfg_info.select_chan_check) { /* check chan */ + ret = pca954x_reg_read(muxc->parent, client, &read_val); + /* read failed or chan not open, reset pca9548 */ + if ((ret < 0) || (read_val != data->last_chan)) { + dev_warn(&client->dev, "pca954x open channle %u failed, do reset.\n", chan); + PCA954X_DEBUG("ret = %d, read_val = %d, last_chan = %d.\n", ret, read_val, data->last_chan); + rv = pca954x_do_reset(muxc); + if (rv >= 0) { + PCA954X_DEBUG("pca954x_do_reset success, rv = %d.\n", rv); + } else { + PCA954X_DEBUG("pca954x_do_reset failed, rv = %d.\n", rv); + } + if (ret >= 0) { + ret = -EIO; /* chan not match, return IO error */ + } + } + } + + return ret; +} + +static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int ret, rv; + + /* Deselect active channel */ + data->last_chan = 0; + if (data->pca9548_cfg_info.close_chan_force_reset) { + ret = pca954x_do_reset(muxc); + } else { + ret = pca954x_reg_write(muxc->parent, client, data->last_chan); + if (ret < 0 ) { + + dev_warn(&client->dev, "pca954x close channel %u failed, do reset.\n", chan); + rv = pca954x_do_reset(muxc); + if (rv == 0) { + ret = 0; + } + } + } + + pca954x_setmuxflag(client, 1); + (void)pca954x_reg_write(muxc->parent, client, data->last_chan); + + return ret; + +} + +static irqreturn_t pca954x_irq_handler(int irq, void *dev_id) +{ + struct pca954x *data = dev_id; + unsigned int child_irq; + int ret, i, handled = 0; + + ret = i2c_smbus_read_byte(data->client); + if (ret < 0) + return IRQ_NONE; + + for (i = 0; i < data->chip->nchans; i++) { + if (ret & BIT(PCA954X_IRQ_OFFSET + i)) { + child_irq = irq_linear_revmap(data->irq, i); + handle_nested_irq(child_irq); + handled++; + } + } + return handled ? IRQ_HANDLED : IRQ_NONE; +} + +static void pca954x_irq_mask(struct irq_data *idata) +{ + struct pca954x *data = irq_data_get_irq_chip_data(idata); + unsigned int pos = idata->hwirq; + unsigned long flags; + + raw_spin_lock_irqsave(&data->lock, flags); + + data->irq_mask &= ~BIT(pos); + if (!data->irq_mask) + disable_irq(data->client->irq); + + raw_spin_unlock_irqrestore(&data->lock, flags); +} + +static void pca954x_irq_unmask(struct irq_data *idata) +{ + struct pca954x *data = irq_data_get_irq_chip_data(idata); + unsigned int pos = idata->hwirq; + unsigned long flags; + + raw_spin_lock_irqsave(&data->lock, flags); + + if (!data->irq_mask) + enable_irq(data->client->irq); + data->irq_mask |= BIT(pos); + + raw_spin_unlock_irqrestore(&data->lock, flags); +} + +static int pca954x_irq_set_type(struct irq_data *idata, unsigned int type) +{ + if ((type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_LOW) + return -EINVAL; + return 0; +} + +static struct irq_chip pca954x_irq_chip = { + .name = "i2c-mux-pca954x", + .irq_mask = pca954x_irq_mask, + .irq_unmask = pca954x_irq_unmask, + .irq_set_type = pca954x_irq_set_type, +}; + +static int of_pca954x_irq_setup(struct i2c_mux_core *muxc) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int c, err, irq; + + if (!data->chip->has_irq || client->irq <= 0) + return 0; + + raw_spin_lock_init(&data->lock); + + data->irq = irq_domain_add_linear(client->dev.of_node, + data->chip->nchans, + &irq_domain_simple_ops, data); + if (!data->irq) + return -ENODEV; + + for (c = 0; c < data->chip->nchans; c++) { + irq = irq_create_mapping(data->irq, c); + irq_set_chip_data(irq, data); + irq_set_chip_and_handler(irq, &pca954x_irq_chip, + handle_simple_irq); + } + + err = devm_request_threaded_irq(&client->dev, data->client->irq, NULL, + pca954x_irq_handler, + IRQF_ONESHOT | IRQF_SHARED, + "pca954x", data); + if (err) + goto err_req_irq; + + disable_irq(data->client->irq); + + return 0; +err_req_irq: + for (c = 0; c < data->chip->nchans; c++) { + irq = irq_find_mapping(data->irq, c); + irq_dispose_mapping(irq); + } + irq_domain_remove(data->irq); + + return err; +} + +static int pca954x_irq_setup(struct i2c_mux_core *muxc) +{ + return 0; +} + +static int of_pca954x_reset_data_init(struct pca954x *data) +{ + int err; + struct device *dev = &data->client->dev; + pca9548_cfg_info_t *reset_cfg; + + reset_cfg = &data->pca9548_cfg_info; + if (dev == NULL || dev->of_node == NULL) { + PCA954X_DEBUG("dev or dev->of_node is NUll, no reset.\n"); + reset_cfg->pca9548_reset_type = PCA9548_RESET_NONE; + return 0; + } + + reset_cfg->select_chan_check = of_property_read_bool(dev->of_node, "select_chan_check"); + reset_cfg->close_chan_force_reset = of_property_read_bool(dev->of_node, "close_chan_force_reset"); + PCA954X_DEBUG("select_chan_check:%d, close_chan_force_reset:%d.\n", reset_cfg->select_chan_check, + reset_cfg->close_chan_force_reset); + + if (of_property_read_u32(dev->of_node, "pca9548_reset_type", &reset_cfg->pca9548_reset_type)) { + + PCA954X_DEBUG("pca9548_reset_type not found, no reset.\n"); + reset_cfg->pca9548_reset_type = PCA9548_RESET_NONE; + return 0; + } + err = of_property_read_u32(dev->of_node, "rst_delay_b", &reset_cfg->rst_delay_b); + err |= of_property_read_u32(dev->of_node, "rst_delay", &reset_cfg->rst_delay); + err |= of_property_read_u32(dev->of_node, "rst_delay_a", &reset_cfg->rst_delay_a); + + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9548_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9548_reset_type == PCA9548_RESET_I2C) { + + PCA954X_DEBUG("reset by i2c.\n"); + err = of_property_read_u32(dev->of_node, "i2c_bus", &reset_cfg->attr.i2c_attr.i2c_bus); + err |=of_property_read_u32(dev->of_node, "i2c_addr", &reset_cfg->attr.i2c_attr.i2c_addr); + err |=of_property_read_u32(dev->of_node, "reg_offset", &reset_cfg->attr.i2c_attr.reg_offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.i2c_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.i2c_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.i2c_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_GPIO) { + + PCA954X_DEBUG("reset by gpio.\n"); + err = of_property_read_u32(dev->of_node, "gpio", &reset_cfg->attr.gpio_attr.gpio); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.gpio_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.gpio_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_IO) { + + PCA954X_DEBUG("reset by io.\n"); + err = of_property_read_u32(dev->of_node, "io_addr", &reset_cfg->attr.io_attr.io_addr); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.io_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.io_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.io_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_FILE) { + + PCA954X_DEBUG("reset by file.\n"); + err = of_property_read_string(dev->of_node, "dev_name", &reset_cfg->attr.file_attr.dev_name); + err |=of_property_read_u32(dev->of_node, "offset", &reset_cfg->attr.file_attr.offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.file_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.file_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.file_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA954X_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA954X_ERROR("Unsupport reset type:%d.\n", reset_cfg->pca9548_reset_type); + goto dts_config_err; + } + return 0; +dts_config_err: + PCA954X_ERROR("dts config error, ret:%d.\n", err); + return -EINVAL; +} + +static int pca954x_reset_data_init(struct pca954x *data) +{ + pca9548_cfg_info_t *reset_cfg; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device; + + if (data->client->dev.platform_data == NULL) { + PCA954X_DEBUG("pca954x has no reset platform data config.\n"); + return 0; + } + reset_cfg = &data->pca9548_cfg_info; + i2c_mux_pca954x_device = data->client->dev.platform_data; + reset_cfg->select_chan_check = i2c_mux_pca954x_device->select_chan_check; + reset_cfg->close_chan_force_reset = i2c_mux_pca954x_device->close_chan_force_reset; + PCA954X_DEBUG("select_chan_check:%d, close_chan_force_reset:%d.\n", reset_cfg->select_chan_check, + reset_cfg->close_chan_force_reset); + + reset_cfg->pca9548_reset_type = i2c_mux_pca954x_device->pca9548_reset_type; + if (reset_cfg->pca9548_reset_type == PCA9548_RESET_NONE) { + PCA954X_DEBUG("pca9548_reset_type not found, no reset.\n"); + return 0; + } + + reset_cfg->rst_delay_b = i2c_mux_pca954x_device->rst_delay_b; + reset_cfg->rst_delay = i2c_mux_pca954x_device->rst_delay; + reset_cfg->rst_delay_a = i2c_mux_pca954x_device->rst_delay_a; + PCA954X_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9548_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9548_reset_type == PCA9548_RESET_I2C) { + + PCA954X_DEBUG("reset by i2c.\n"); + reset_cfg->attr.i2c_attr.i2c_bus = i2c_mux_pca954x_device->attr.i2c_attr.i2c_bus; + reset_cfg->attr.i2c_attr.i2c_addr = i2c_mux_pca954x_device->attr.i2c_attr.i2c_addr; + reset_cfg->attr.i2c_attr.reg_offset = i2c_mux_pca954x_device->attr.i2c_attr.reg_offset; + reset_cfg->attr.i2c_attr.mask = i2c_mux_pca954x_device->attr.i2c_attr.mask; + reset_cfg->attr.i2c_attr.reset_on = i2c_mux_pca954x_device->attr.i2c_attr.reset_on; + reset_cfg->attr.i2c_attr.reset_off = i2c_mux_pca954x_device->attr.i2c_attr.reset_off; + PCA954X_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_GPIO) { + + PCA954X_DEBUG("reset by gpio.\n"); + reset_cfg->attr.gpio_attr.gpio = i2c_mux_pca954x_device->attr.gpio_attr.gpio; + reset_cfg->attr.gpio_attr.reset_on = i2c_mux_pca954x_device->attr.gpio_attr.reset_on; + reset_cfg->attr.gpio_attr.reset_off = i2c_mux_pca954x_device->attr.gpio_attr.reset_off; + PCA954X_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_IO) { + + PCA954X_DEBUG("reset by io.\n"); + reset_cfg->attr.io_attr.io_addr = i2c_mux_pca954x_device->attr.io_attr.io_addr; + reset_cfg->attr.io_attr.mask = i2c_mux_pca954x_device->attr.io_attr.mask; + reset_cfg->attr.io_attr.reset_on = i2c_mux_pca954x_device->attr.io_attr.reset_on; + reset_cfg->attr.io_attr.reset_off = i2c_mux_pca954x_device->attr.io_attr.reset_off; + PCA954X_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9548_reset_type == PCA9548_RESET_FILE) { + + reset_cfg->attr.file_attr.dev_name = i2c_mux_pca954x_device->attr.file_attr.dev_name; + reset_cfg->attr.file_attr.offset = i2c_mux_pca954x_device->attr.file_attr.offset; + reset_cfg->attr.file_attr.mask = i2c_mux_pca954x_device->attr.file_attr.mask; + reset_cfg->attr.file_attr.reset_on = i2c_mux_pca954x_device->attr.file_attr.reset_on; + reset_cfg->attr.file_attr.reset_off = i2c_mux_pca954x_device->attr.file_attr.reset_off; + PCA954X_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA954X_ERROR("Unsupport reset type:%d.\n", reset_cfg->pca9548_reset_type); + return -EINVAL; + } + return 0; +} + +/* + * I2C init/probing/exit functions + */ +static int pca954x_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); + struct device_node *of_node = client->dev.of_node; + bool idle_disconnect_dt; + struct gpio_desc *gpio; + int num, force, class; + struct i2c_mux_core *muxc; + struct pca954x *data; + const struct of_device_id *match; + unsigned int probe_disable; + int ret, dynamic_nr; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device; + + PCA954X_DEBUG("pca954x_probe, parent bus: %d, 9548 addr:0x%x.\n", adap->nr, client->addr); + + if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) + return -ENODEV; + + muxc = i2c_mux_alloc(adap, &client->dev, + PCA954X_MAX_NCHANS, sizeof(*data), 0, + pca954x_select_chan, pca954x_deselect_mux); + if (!muxc) + return -ENOMEM; + data = i2c_mux_priv(muxc); + + i2c_set_clientdata(client, muxc); + data->client = client; + + /* Get the mux out of reset if a reset GPIO is specified. */ + gpio = devm_gpiod_get_optional(&client->dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(gpio)) + return PTR_ERR(gpio); + + /* check device connection status */ + + if (client->dev.of_node == NULL) { + if (client->dev.platform_data == NULL) { + probe_disable = 1; + PCA954X_DEBUG("has no platform data config, set probe_disable = 1.\n"); + } else { + i2c_mux_pca954x_device = client->dev.platform_data; + probe_disable = i2c_mux_pca954x_device->probe_disable; + } + } else { + probe_disable = of_property_read_bool(of_node, "probe_disable"); + } + + /* Write the mux register at addr to verify + * that the mux is in fact present. This also + * initializes the mux to disconnected state. + */ + if (!probe_disable && (i2c_smbus_write_byte(client, 0) < 0)) { + dev_warn(&client->dev, "probe failed\n"); + return -ENODEV; + } + + match = of_match_device(of_match_ptr(pca954x_of_match), &client->dev); + if (match) + data->chip = of_device_get_match_data(&client->dev); + else + data->chip = &chips[id->driver_data]; + + data->last_chan = 0; /* force the first selection */ + + if (client->dev.of_node == NULL) { + idle_disconnect_dt = false; + } else { + idle_disconnect_dt = of_node && + of_property_read_bool(of_node, "i2c-mux-idle-disconnect"); + } + + if (client->dev.of_node) { + ret= of_pca954x_reset_data_init(data); + } else { + ret= pca954x_reset_data_init(data); + } + if (ret < 0) { + dev_err(&client->dev, "pca954x reset config err, ret:%d.\n", ret); + return ret; + } + + if (client->dev.of_node) { + ret = of_pca954x_irq_setup(muxc); + } else { + ret = pca954x_irq_setup(muxc); + } + if (ret) { + goto fail_del_adapters; + } + + if (client->dev.of_node == NULL) { + if (client->dev.platform_data == NULL) { + dynamic_nr = 1; + PCA954X_DEBUG("platform data is NULL, use dynamic adap number.\n"); + } else { + i2c_mux_pca954x_device = client->dev.platform_data; + data->pca9548_cfg_info.pca9548_base_nr = i2c_mux_pca954x_device->pca9548_base_nr; + if (data->pca9548_cfg_info.pca9548_base_nr == 0) { + dynamic_nr = 1; + PCA954X_DEBUG("pca9548_base_nr = 0, use dynamic adap number.\n"); + } else { + dynamic_nr = 0; + PCA954X_DEBUG("pca9548_base_nr:%u.\n", data->pca9548_cfg_info.pca9548_base_nr); + } + } + } else { + if (of_property_read_u32(of_node, "pca9548_base_nr", &data->pca9548_cfg_info.pca9548_base_nr)) { + + dynamic_nr = 1; + PCA954X_DEBUG("pca9548_base_nr not found, use dynamic adap number"); + } else { + dynamic_nr = 0; + PCA954X_DEBUG("pca9548_base_nr:%u.\n", data->pca9548_cfg_info.pca9548_base_nr); + } + } + + /* Now create an adapter for each channel */ + for (num = 0; num < data->chip->nchans; num++) { + bool idle_disconnect_pd = false; + if (dynamic_nr == 1) { + force = 0; /* dynamic adap number */ + } else { + force = data->pca9548_cfg_info.pca9548_base_nr + num; + } + + class = 0; /* no class by default */ + data->deselect |= (idle_disconnect_pd || + idle_disconnect_dt) << num; + + ret = i2c_mux_add_adapter(muxc, force, num, class); + if (ret) + goto fail_del_adapters; + } + + dev_info(&client->dev, + "registered %d multiplexed busses for I2C %s %s\n", + num, data->chip->muxtype == pca954x_ismux + ? "mux" : "switch", client->name); + + return 0; + +fail_del_adapters: + i2c_mux_del_adapters(muxc); + return ret; +} + +static int pca954x_remove(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca954x *data = i2c_mux_priv(muxc); + int c, irq; + + if (data->irq) { + for (c = 0; c < data->chip->nchans; c++) { + irq = irq_find_mapping(data->irq, c); + irq_dispose_mapping(irq); + } + irq_domain_remove(data->irq); + } + + i2c_mux_del_adapters(muxc); + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int pca954x_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca954x *data = i2c_mux_priv(muxc); + + data->last_chan = 0; + return i2c_smbus_write_byte(client, 0); +} +#endif + +static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume); + +static struct i2c_driver pca954x_driver = { + .driver = { + .name = "wb_pca954x", + .pm = &pca954x_pm, + .of_match_table = of_match_ptr(pca954x_of_match), + }, + .probe = pca954x_probe, + .remove = pca954x_remove, + .id_table = pca954x_id, +}; + +module_i2c_driver(pca954x_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PCA954x I2C mux/switch driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h new file mode 100644 index 0000000000..9cbe162782 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca954x.h @@ -0,0 +1,67 @@ +#ifndef __WB_I2C_MUX_PCA954X_H__ +#define __WB_I2C_MUX_PCA954X_H__ + +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum pca9548_reset_type_s { + PCA9548_RESET_NONE = 0, + PCA9548_RESET_I2C = 1, + PCA9548_RESET_GPIO = 2, + PCA9548_RESET_IO = 3, + PCA9548_RESET_FILE = 4, +} pca9548_reset_type_t; + +typedef struct i2c_attr_s { + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t reg_offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} i2c_attr_t; + +typedef struct io_attr_s { + uint32_t io_addr; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} io_attr_t; + +typedef struct file_attr_s { + const char *dev_name; + uint32_t offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} file_attr_t; + +typedef struct gpio_attr_s { + int gpio_init; + uint32_t gpio; + uint32_t reset_on; + uint32_t reset_off; +} gpio_attr_t; + +typedef struct i2c_mux_pca954x_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t pca9548_base_nr; + uint32_t pca9548_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + bool probe_disable; + bool select_chan_check; + bool close_chan_force_reset; + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; +} i2c_mux_pca954x_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c new file mode 100644 index 0000000000..9945f6fcad --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.c @@ -0,0 +1,1375 @@ +/* + * I2C multiplexer driver for PCA9541 bus master selector + * + * Copyright (c) 2010 Ericsson AB. + * + * Author: Guenter Roeck + * + * Derived from: + * pca954x.c + * + * Copyright (c) 2008-2009 Rodolfo Giometti + * Copyright (c) 2008-2009 Eurotech S.p.A. + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_mux_pca9641.h" + +/* + * The PCA9541 is a bus master selector. It supports two I2C masters connected + * to a single slave bus. + * + * Before each bus transaction, a master has to acquire bus ownership. After the + * transaction is complete, bus ownership has to be released. This fits well + * into the I2C multiplexer framework, which provides select and release + * functions for this purpose. For this reason, this driver is modeled as + * single-channel I2C bus multiplexer. + * + * This driver assumes that the two bus masters are controlled by two different + * hosts. If a single host controls both masters, platform code has to ensure + * that only one of the masters is instantiated at any given time. + */ + +#define PCA9541_CONTROL 0x01 +#define PCA9541_ISTAT 0x02 + +#define PCA9541_CTL_MYBUS (1 << 0) +#define PCA9541_CTL_NMYBUS (1 << 1) +#define PCA9541_CTL_BUSON (1 << 2) +#define PCA9541_CTL_NBUSON (1 << 3) +#define PCA9541_CTL_BUSINIT (1 << 4) +#define PCA9541_CTL_TESTON (1 << 6) +#define PCA9541_CTL_NTESTON (1 << 7) +#define PCA9541_ISTAT_INTIN (1 << 0) +#define PCA9541_ISTAT_BUSINIT (1 << 1) +#define PCA9541_ISTAT_BUSOK (1 << 2) +#define PCA9541_ISTAT_BUSLOST (1 << 3) +#define PCA9541_ISTAT_MYTEST (1 << 6) +#define PCA9541_ISTAT_NMYTEST (1 << 7) +#define PCA9641_ID 0x00 +#define PCA9641_ID_MAGIC 0x38 +#define PCA9641_CONTROL 0x01 +#define PCA9641_STATUS 0x02 +#define PCA9641_TIME 0x03 +#define PCA9641_CTL_LOCK_REQ BIT(0) +#define PCA9641_CTL_LOCK_GRANT BIT(1) +#define PCA9641_CTL_BUS_CONNECT BIT(2) +#define PCA9641_CTL_BUS_INIT BIT(3) +#define PCA9641_CTL_SMBUS_SWRST BIT(4) +#define PCA9641_CTL_IDLE_TIMER_DIS BIT(5) +#define PCA9641_CTL_SMBUS_DIS BIT(6) +#define PCA9641_CTL_PRIORITY BIT(7) +#define PCA9641_STS_OTHER_LOCK BIT(0) +#define PCA9641_STS_BUS_INIT_FAIL BIT(1) +#define PCA9641_STS_BUS_HUNG BIT(2) +#define PCA9641_STS_MBOX_EMPTY BIT(3) +#define PCA9641_STS_MBOX_FULL BIT(4) +#define PCA9641_STS_TEST_INT BIT(5) +#define PCA9641_STS_SCL_IO BIT(6) +#define PCA9641_STS_SDA_IO BIT(7) +#define PCA9641_RES_TIME 0x03 +#define BUSON (PCA9541_CTL_BUSON | PCA9541_CTL_NBUSON) +#define MYBUS (PCA9541_CTL_MYBUS | PCA9541_CTL_NMYBUS) +#define mybus(x) (!((x) & MYBUS) || ((x) & MYBUS) == MYBUS) +#define busoff(x) (!((x) & BUSON) || ((x) & BUSON) == BUSON) +#define BUSOFF(x, y) (!((x) & PCA9641_CTL_LOCK_GRANT) && \ + !((y) & PCA9641_STS_OTHER_LOCK)) +#define other_lock(x) ((x) & PCA9641_STS_OTHER_LOCK) +#define lock_grant(x) ((x) & PCA9641_CTL_LOCK_GRANT) + +#define PCA9641_RETRY_TIME (8) +#define PCA9641_RESET_DELAY (150) + +typedef struct i2c_muxs_struct_flag +{ + int nr; + char name[48]; + struct mutex update_lock; + int flag; +}i2c_mux_flag; + +i2c_mux_flag pca_flag = { + .flag = -1, +}; + +int pca9641_setmuxflag(int nr, int flag) +{ + if (pca_flag.nr == nr) { + pca_flag.flag = flag; + } + return 0; +} +EXPORT_SYMBOL(pca9641_setmuxflag); + +static int g_debug_info = 0; +static int g_debug_err = 0; + +module_param(g_debug_info, int, S_IRUGO | S_IWUSR); +module_param(g_debug_err, int, S_IRUGO | S_IWUSR); + +#define PCA_DEBUG(fmt, args...) do { \ + if (g_debug_info) { \ + printk(KERN_INFO "[pca9641][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define PCA_DEBUG_ERR(fmt, args...) do { \ + if (g_debug_err) { \ + printk(KERN_ERR "[pca9641][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/* arbitration timeouts, in jiffies */ +#define ARB_TIMEOUT (HZ / 8) /* 125 ms until forcing bus ownership */ +#define ARB2_TIMEOUT (HZ / 4) /* 250 ms until acquisition failure */ + +/* arbitration retry delays, in us */ +#define SELECT_DELAY_SHORT 50 +#define SELECT_DELAY_LONG 1000 +#define I2C_RETRY_TIMES (5) +#define I2C_RETRY_WAIT_TIMES (10) /*delay 10ms*/ + +typedef struct pca9641_cfg_info_s { + uint32_t pca9641_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; +} pca9641_cfg_info_t; + +struct pca9541 { + struct i2c_client *client; + unsigned long select_timeout; + unsigned long arb_timeout; + uint32_t pca9641_nr; + pca9641_cfg_info_t pca9641_cfg_info; /* pca9641 reset cfg */ +}; + +static const struct i2c_device_id pca9541_id[] = { + {"wb_pca9541", 0}, + {"wb_pca9641", 1}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, pca9541_id); + +#ifdef CONFIG_OF +static const struct of_device_id pca9541_of_match[] = { + { .compatible = "nxp,wb_pca9541" }, + { .compatible = "nxp,wb_pca9641" }, + {} +}; +MODULE_DEVICE_TABLE(of, pca9541_of_match); +#endif + +static int pca9641_gpio_init(gpio_attr_t *gpio_attr) +{ + int err; + + if (gpio_attr->gpio_init) { + PCA_DEBUG("gpio%d already init, do nothing.\n", gpio_attr->gpio); + return 0; + } + + PCA_DEBUG("gpio%d init.\n", gpio_attr->gpio); + err = gpio_request(gpio_attr->gpio, "pca9641_reset"); + if (err) { + goto error; + } + err = gpio_direction_output(gpio_attr->gpio, gpio_attr->reset_off); + if (err) { + gpio_free(gpio_attr->gpio); + goto error; + } + gpio_attr->gpio_init = 1; + return 0; +error: + PCA_DEBUG_ERR("pca9641_gpio_init failed, ret:%d.\n", err); + return err; +} + +static void pca9641_gpio_free(gpio_attr_t *gpio_attr) +{ + if (gpio_attr->gpio_init == 1) { + PCA_DEBUG("gpio%d release.\n", gpio_attr->gpio); + gpio_free(gpio_attr->gpio); + gpio_attr->gpio_init = 0; + } + return; +} + +static int pca9641_reset_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + PCA_DEBUG_ERR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA_DEBUG_ERR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca9641_reset_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + PCA_DEBUG_ERR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + PCA_DEBUG_ERR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int pca9641_reset_i2c_read(uint32_t bus, uint32_t addr, uint32_t offset_addr, + unsigned char *buf, uint32_t size) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i, j; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA_DEBUG_ERR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = addr; + for (j = 0; j < size; j++) { + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_read_byte_data(&client, (offset_addr + j)); + if (rv < 0) { + PCA_DEBUG_ERR("i2c read failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + *(buf + j) = (unsigned char)rv; + break; + } + } +out: + filp_close(fp, NULL); + return rv; +} + +static int pca9641_reset_i2c_write(uint32_t bus, uint32_t dev_addr, uint32_t offset_addr, + uint8_t write_buf) +{ + struct file *fp; + struct i2c_client client; + char i2c_path[32]; + int i; + int rv; + + rv = 0; + mem_clear(i2c_path, sizeof(i2c_path)); + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", bus); + fp = filp_open(i2c_path, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + PCA_DEBUG_ERR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = dev_addr; + for (i = 0; i < I2C_RETRY_TIMES; i++) { + rv = i2c_smbus_write_byte_data(&client, offset_addr, write_buf); + if (rv < 0) { + PCA_DEBUG_ERR("i2c write failed, try again.\n"); + msleep(I2C_RETRY_WAIT_TIMES); + if (i >= (I2C_RETRY_TIMES - 1)) { + goto out; + } + continue; + } + break; + } +out: + filp_close(fp, NULL); + return rv; +} + +static int pca9641_do_file_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + file_attr_t *file_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + file_attr = &reset_cfg->attr.file_attr; + ret = -1; + + PCA_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA_DEBUG("dev_name:%s, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + file_attr->dev_name, file_attr->offset, file_attr->mask, + file_attr->reset_on, file_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca9641_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + val &= ~(file_attr->mask); + val |= file_attr->reset_on; + err = pca9641_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(file_attr->mask); + val |= file_attr->reset_off; + err = pca9641_reset_file_write(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca9641_reset_file_read(file_attr->dev_name, file_attr->offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (file_attr->mask); + if (val == file_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_file_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_file_reset timeout.\n"); + } +out: + if (err < 0) { + PCA_DEBUG_ERR("pca9641_do_file_reset file rd/wr failed, ret:%d.\n", err); + } + + return ret; +} + +static int pca9641_do_io_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + io_attr_t *io_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + io_attr = &reset_cfg->attr.io_attr; + + PCA_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA_DEBUG("io_addr:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + io_attr->io_addr, io_attr->mask, io_attr->reset_on, io_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + val = inb(io_attr->io_addr); + val &= ~(io_attr->mask); + val |= io_attr->reset_on; + outb(val, io_attr->io_addr); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(io_attr->mask); + val |= io_attr->reset_off; + outb(val, io_attr->io_addr); + + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = inb(io_attr->io_addr); + val &= (io_attr->mask); + if (val == io_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_io_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_io_reset timeout.\n"); + } + + return ret; +} + +static int pca9641_do_gpio_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + gpio_attr_t *gpio_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + gpio_attr = &reset_cfg->attr.gpio_attr; + + ret = pca9641_gpio_init(gpio_attr); + if (ret) { + return -1; + } + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_on); + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + __gpio_set_value(gpio_attr->gpio, gpio_attr->reset_off); + ret = -1; + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + val = __gpio_get_value(gpio_attr->gpio); + if (val == gpio_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_gpio_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + /* 1MS schedule*/ + schedule(); + } + timeout--; + } + + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_gpio_reset timeout.\n"); + } + + pca9641_gpio_free(gpio_attr); + return ret; +} + +static int pca9641_do_i2c_reset(struct i2c_mux_core *muxc) +{ + int ret, timeout, err; + struct pca9541 *data; + pca9641_cfg_info_t *reset_cfg; + i2c_attr_t *i2c_attr; + u8 val; + + data = i2c_mux_priv(muxc); + reset_cfg = &data->pca9641_cfg_info; + i2c_attr = &reset_cfg->attr.i2c_attr; + ret = -1; + + PCA_DEBUG("rst_delay_b:%u, rst_delay:%u, rst_delay_a:%u.\n", + reset_cfg->rst_delay_b, reset_cfg->rst_delay, reset_cfg->rst_delay_a); + PCA_DEBUG("bus:0x%x, addr:0x%x, reg:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + i2c_attr->i2c_bus, i2c_attr->i2c_addr, i2c_attr->reg_offset, + i2c_attr->mask, i2c_attr->reset_on, i2c_attr->reset_off); + + if (reset_cfg->rst_delay_b) { + udelay(reset_cfg->rst_delay_b); + } + + err = pca9641_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_on; + err = pca9641_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + if (reset_cfg->rst_delay) { + udelay(reset_cfg->rst_delay); + } + + val &= ~(i2c_attr->mask); + val |= i2c_attr->reset_off; + err = pca9641_reset_i2c_write(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, val); + if (err < 0) { + goto out; + } + + timeout = reset_cfg->rst_delay_a; + while (timeout > 0) { + udelay(1); + err = pca9641_reset_i2c_read(i2c_attr->i2c_bus, i2c_attr->i2c_addr, + i2c_attr->reg_offset, &val, sizeof(val)); + if (err < 0) { + goto out; + } + val &= (i2c_attr->mask); + if (val == i2c_attr->reset_off) { + ret = 0; + PCA_DEBUG("pca9641_do_i2c_reset success.\n"); + break; + } + if (timeout >= 1000 && (timeout % 1000 == 0)) { + schedule(); + } + timeout--; + } + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_do_i2c_reset timeout.\n"); + } +out: + if (err < 0) { + PCA_DEBUG_ERR("pca9641_do_i2c_reset i2c op failed, ret:%d.\n", err); + } + return ret; +} + +static int pca9641_do_reset(struct i2c_mux_core *muxc) +{ + int ret; + struct pca9541 *data; + + data = i2c_mux_priv(muxc); + if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_NONE) { + ret = -1; + PCA_DEBUG("Don't need to reset.\n"); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_I2C) { + ret = pca9641_do_i2c_reset(muxc); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_GPIO) { + ret = pca9641_do_gpio_reset(muxc); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_IO) { + ret = pca9641_do_io_reset(muxc); + } else if (data->pca9641_cfg_info.pca9641_reset_type == PCA9641_RESET_FILE) { + ret = pca9641_do_file_reset(muxc); + } else { + ret = -1; + PCA_DEBUG_ERR("Unsupport reset type:0x%x.\n", + data->pca9641_cfg_info.pca9641_reset_type); + } + + if (ret < 0) { + PCA_DEBUG_ERR("pca9641_reset_ctrl failed, reset type:%u, ret:%d.\n", + data->pca9641_cfg_info.pca9641_reset_type, ret); + } else { + udelay(PCA9641_RESET_DELAY); + } + return ret; +} + +/* + * Write to chip register. Don't use i2c_transfer()/i2c_smbus_xfer() + * as they will try to lock the adapter a second time. + */ +static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) +{ + struct i2c_adapter *adap = client->adapter; + int ret; + + if (adap->algo->master_xfer) { + struct i2c_msg msg; + char buf[2]; + + msg.addr = client->addr; + msg.flags = 0; + msg.len = 2; + buf[0] = command; + buf[1] = val; + msg.buf = buf; + ret = __i2c_transfer(adap, &msg, 1); + } else { + union i2c_smbus_data data; + + data.byte = val; + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_WRITE, + command, + I2C_SMBUS_BYTE_DATA, &data); + } + + return ret; +} + +/* + * Read from chip register. Don't use i2c_transfer()/i2c_smbus_xfer() + * as they will try to lock adapter a second time. + */ +static int pca9541_reg_read(struct i2c_client *client, u8 command) +{ + struct i2c_adapter *adap = client->adapter; + int ret; + u8 val; + + if (adap->algo->master_xfer) { + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = &command + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = 1, + .buf = &val + } + }; + ret = __i2c_transfer(adap, msg, 2); + if (ret == 2) + ret = val; + else if (ret >= 0) + ret = -EIO; + } else { + union i2c_smbus_data data; + + ret = adap->algo->smbus_xfer(adap, client->addr, + client->flags, + I2C_SMBUS_READ, + command, + I2C_SMBUS_BYTE_DATA, &data); + if (!ret) + ret = data.byte; + } + return ret; +} + +/* + * Arbitration management functions + */ + +/* Release bus. Also reset NTESTON and BUSINIT if it was set. */ +static void pca9541_release_bus(struct i2c_client *client) +{ + int reg; + + reg = pca9541_reg_read(client, PCA9541_CONTROL); + if (reg >= 0 && !busoff(reg) && mybus(reg)) + pca9541_reg_write(client, PCA9541_CONTROL, + (reg & PCA9541_CTL_NBUSON) >> 1); +} + +/* + * Arbitration is defined as a two-step process. A bus master can only activate + * the slave bus if it owns it; otherwise it has to request ownership first. + * This multi-step process ensures that access contention is resolved + * gracefully. + * + * Bus Ownership Other master Action + * state requested access + * ---------------------------------------------------- + * off - yes wait for arbitration timeout or + * for other master to drop request + * off no no take ownership + * off yes no turn on bus + * on yes - done + * on no - wait for arbitration timeout or + * for other master to release bus + * + * The main contention point occurs if the slave bus is off and both masters + * request ownership at the same time. In this case, one master will turn on + * the slave bus, believing that it owns it. The other master will request + * bus ownership. Result is that the bus is turned on, and master which did + * _not_ own the slave bus before ends up owning it. + */ + +/* Control commands per PCA9541 datasheet */ +static const u8 pca9541_control[16] = { + 4, 0, 1, 5, 4, 4, 5, 5, 0, 0, 1, 1, 0, 4, 5, 1 +}; + +/* + * Channel arbitration + * + * Return values: + * <0: error + * 0 : bus not acquired + * 1 : bus acquired + */ +static int pca9541_arbitrate(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca9541 *data = i2c_mux_priv(muxc); + int reg; + + reg = pca9541_reg_read(client, PCA9541_CONTROL); + if (reg < 0) + return reg; + + if (busoff(reg)) { + int istat; + /* + * Bus is off. Request ownership or turn it on unless + * other master requested ownership. + */ + istat = pca9541_reg_read(client, PCA9541_ISTAT); + if (!(istat & PCA9541_ISTAT_NMYTEST) + || time_is_before_eq_jiffies(data->arb_timeout)) { + /* + * Other master did not request ownership, + * or arbitration timeout expired. Take the bus. + */ + pca9541_reg_write(client, + PCA9541_CONTROL, + pca9541_control[reg & 0x0f] + | PCA9541_CTL_NTESTON); + data->select_timeout = SELECT_DELAY_SHORT; + } else { + /* + * Other master requested ownership. + * Set extra long timeout to give it time to acquire it. + */ + data->select_timeout = SELECT_DELAY_LONG * 2; + } + } else if (mybus(reg)) { + /* + * Bus is on, and we own it. We are done with acquisition. + * Reset NTESTON and BUSINIT, then return success. + */ + if (reg & (PCA9541_CTL_NTESTON | PCA9541_CTL_BUSINIT)) + pca9541_reg_write(client, + PCA9541_CONTROL, + reg & ~(PCA9541_CTL_NTESTON + | PCA9541_CTL_BUSINIT)); + return 1; + } else { + /* + * Other master owns the bus. + * If arbitration timeout has expired, force ownership. + * Otherwise request it. + */ + data->select_timeout = SELECT_DELAY_LONG; + if (time_is_before_eq_jiffies(data->arb_timeout)) { + /* Time is up, take the bus and reset it. */ + pca9541_reg_write(client, + PCA9541_CONTROL, + pca9541_control[reg & 0x0f] + | PCA9541_CTL_BUSINIT + | PCA9541_CTL_NTESTON); + } else { + /* Request bus ownership if needed */ + if (!(reg & PCA9541_CTL_NTESTON)) + pca9541_reg_write(client, + PCA9541_CONTROL, + reg | PCA9541_CTL_NTESTON); + } + } + return 0; +} + +static int pca9541_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int ret; + unsigned long timeout = jiffies + ARB2_TIMEOUT; + /* give up after this time */ + + data->arb_timeout = jiffies + ARB_TIMEOUT; + /* force bus ownership after this time */ + + do { + ret = pca9541_arbitrate(client); + if (ret) + return ret < 0 ? ret : 0; + + if (data->select_timeout == SELECT_DELAY_SHORT) + udelay(data->select_timeout); + else + msleep(data->select_timeout / 1000); + } while (time_is_after_eq_jiffies(timeout)); + + dev_warn(&client->dev, "pca9541 select channel timeout.\n"); + return -ETIMEDOUT; +} + +static int pca9541_release_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + pca9541_release_bus(client); + return 0; +} + +/* +* Arbitration management functions +*/ +static void pca9641_release_bus(struct i2c_client *client) +{ + pca9541_reg_write(client, PCA9641_CONTROL, 0x80); //master 0x80 +} + +/* +* Channel arbitration +* +* Return values: +* <0: error +* 0 : bus not acquired +* 1 : bus acquired +*/ +static int pca9641_arbitrate(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + struct pca9541 *data = i2c_mux_priv(muxc); + int reg_ctl, reg_sts; + + reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); + if (reg_ctl < 0) { + PCA_DEBUG_ERR("pca9641 read control register failed, ret:%d.\n", reg_ctl); + return reg_ctl; + } + + reg_sts = pca9541_reg_read(client, PCA9641_STATUS); + if (reg_sts < 0) { + PCA_DEBUG_ERR("pca9641 read status register failed, ret:%d.\n", reg_sts); + return reg_sts; + } + + if (BUSOFF(reg_ctl, reg_sts)) { + /* + * Bus is off. Request ownership or turn it on unless + * other master requested ownership. + */ + reg_ctl |= PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + reg_ctl = pca9541_reg_read(client, PCA9641_CONTROL); + if (reg_ctl < 0) { + PCA_DEBUG_ERR("Bus is off, but read control register failed, ret:%d.\n", reg_ctl); + return reg_ctl; + } + + if (lock_grant(reg_ctl)) { + /* + * Other master did not request ownership, + * or arbitration timeout expired. Take the bus. + */ + PCA_DEBUG("Bus is off, get pca9641 arbitration success.\n"); + reg_ctl |= PCA9641_CTL_BUS_CONNECT | PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + return 1; + } else { + /* + * Other master requested ownership. + * Set extra long timeout to give it time to acquire it. + */ + PCA_DEBUG("Bus is off, but get pca9641 arbitration failed.\n"); + data->select_timeout = SELECT_DELAY_LONG * 2; + } + } else if (lock_grant(reg_ctl)) { + /* + * Bus is on, and we own it. We are done with acquisition. + */ + PCA_DEBUG("Bus is on, get pca9641 arbitration success.\n"); + reg_ctl |= PCA9641_CTL_BUS_CONNECT | PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + return 1; + } else if (other_lock(reg_sts)) { + /* + * Other master owns the bus. + * If arbitration timeout has expired, force ownership. + * Otherwise request it. + */ + PCA_DEBUG("Other master owns the bus, try to request it.\n"); + data->select_timeout = SELECT_DELAY_LONG; + reg_ctl |= PCA9641_CTL_LOCK_REQ; + pca9541_reg_write(client, PCA9641_CONTROL, reg_ctl); + } + return 0; +} + +int pca9641_select_chan_single(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + int ret; + int result; + unsigned long msleep_time; + unsigned long timeout = jiffies + ARB2_TIMEOUT; + /* give up after this time */ + data->arb_timeout = jiffies + ARB_TIMEOUT; + /* force bus ownership after this time */ + for (result = 0 ; result < PCA9641_RETRY_TIME ; result ++) { + do { + ret = pca9641_arbitrate(client); + if (ret) { + return ret < 0 ? -EIO : 0; + } + msleep_time = data->select_timeout / 1000; + if (msleep_time < 1) { + msleep(1); + } else { + msleep(msleep_time); + } + } while (time_is_after_eq_jiffies(timeout)); + timeout = jiffies + ARB2_TIMEOUT; + } + dev_warn(&client->dev, "pca9641 select channel timeout.\n"); + return -ETIMEDOUT; +} + +static int pca9641_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + int ret, rv; + + ret = pca9641_select_chan_single(muxc, chan); + if (ret < 0) { + PCA_DEBUG_ERR("pca9641 select channel failed, ret:%d, try to reset pca9641.\n", ret); + rv = pca9641_do_reset(muxc); + + if (rv < 0) { + PCA_DEBUG_ERR("pca9641 reset failed, rv:%d.\n", rv); + return ret; + } + + ret = pca9641_select_chan_single(muxc, chan); + if (ret < 0) { + PCA_DEBUG_ERR("after pca9641 reset, select channel still failed, ret:%d.\n", ret); + } + } + return ret; +} + +static int pca9641_release_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca9541 *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + if (pca_flag.flag) { + pca9641_release_bus(client); + } + return 0; +} + +static int pca9641_detect_id(struct i2c_client *client) +{ + int reg; + + reg = pca9541_reg_read(client, PCA9641_ID); + if (reg == PCA9641_ID_MAGIC) + return 1; + else + return 0; +} + +static int pca9641_recordflag(struct i2c_adapter *adap) { + if (pca_flag.flag != -1) { + pr_err(" %s %d has init already!!!", __func__, __LINE__); + return -1 ; + } + pca_flag.nr = adap->nr; + PCA_DEBUG(" adap->nr:%d\n", adap->nr); + snprintf(pca_flag.name, sizeof(pca_flag.name),adap->name); + return 0; +} + +static int of_pca9641_reset_data_init(struct pca9541 *data) +{ + int err; + struct device *dev = &data->client->dev; + pca9641_cfg_info_t *reset_cfg; + + reset_cfg = &data->pca9641_cfg_info; + if (dev == NULL || dev->of_node == NULL) { + PCA_DEBUG("dev or dev->of_node is NUll, no reset.\n"); + reset_cfg->pca9641_reset_type = PCA9641_RESET_NONE; + return 0; + } + + if (of_property_read_u32(dev->of_node, "pca9641_reset_type", &reset_cfg->pca9641_reset_type)) { + + PCA_DEBUG("pca9641_reset_type not found, no reset.\n"); + reset_cfg->pca9641_reset_type = PCA9641_RESET_NONE; + return 0; + } + err = of_property_read_u32(dev->of_node, "rst_delay_b", &reset_cfg->rst_delay_b); + err |= of_property_read_u32(dev->of_node, "rst_delay", &reset_cfg->rst_delay); + err |= of_property_read_u32(dev->of_node, "rst_delay_a", &reset_cfg->rst_delay_a); + + if (err) { + goto dts_config_err; + } + PCA_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9641_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9641_reset_type == PCA9641_RESET_I2C) { + + PCA_DEBUG("reset by i2c.\n"); + err = of_property_read_u32(dev->of_node, "i2c_bus", &reset_cfg->attr.i2c_attr.i2c_bus); + err |=of_property_read_u32(dev->of_node, "i2c_addr", &reset_cfg->attr.i2c_attr.i2c_addr); + err |=of_property_read_u32(dev->of_node, "reg_offset", &reset_cfg->attr.i2c_attr.reg_offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.i2c_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.i2c_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.i2c_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_GPIO) { + + PCA_DEBUG("reset by gpio.\n"); + err = of_property_read_u32(dev->of_node, "gpio", &reset_cfg->attr.gpio_attr.gpio); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.gpio_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.gpio_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_IO) { + + PCA_DEBUG("reset by io.\n"); + err = of_property_read_u32(dev->of_node, "io_addr", &reset_cfg->attr.io_attr.io_addr); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.io_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.io_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.io_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_FILE) { + + PCA_DEBUG("reset by file.\n"); + err = of_property_read_string(dev->of_node, "dev_name", &reset_cfg->attr.file_attr.dev_name); + err |=of_property_read_u32(dev->of_node, "offset", &reset_cfg->attr.file_attr.offset); + err |=of_property_read_u32(dev->of_node, "mask", &reset_cfg->attr.file_attr.mask); + err |=of_property_read_u32(dev->of_node, "reset_on", &reset_cfg->attr.file_attr.reset_on); + err |=of_property_read_u32(dev->of_node, "reset_off", &reset_cfg->attr.file_attr.reset_off); + if (err) { + goto dts_config_err; + } + PCA_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA_DEBUG_ERR("Unsupport reset type:%d.\n", reset_cfg->pca9641_reset_type); + goto dts_config_err; + } + return 0; +dts_config_err: + PCA_DEBUG_ERR("dts config error, ret:%d.\n", err); + return -EINVAL; +} + +static int pca9641_reset_data_init(struct pca9541 *data) +{ + pca9641_cfg_info_t *reset_cfg; + i2c_mux_pca9641_device_t *i2c_mux_pca9641_device; + + if (data->client->dev.platform_data == NULL) { + PCA_DEBUG("pca9641 has no reset platform data config.\n"); + return 0; + } + reset_cfg = &data->pca9641_cfg_info; + i2c_mux_pca9641_device = data->client->dev.platform_data; + reset_cfg->pca9641_reset_type = i2c_mux_pca9641_device->pca9641_reset_type; + if (reset_cfg->pca9641_reset_type == PCA9641_RESET_NONE) { + PCA_DEBUG("pca9641 has no reset function.\n"); + return 0; + } + + reset_cfg->rst_delay_b = i2c_mux_pca9641_device->rst_delay_b; + reset_cfg->rst_delay = i2c_mux_pca9641_device->rst_delay; + reset_cfg->rst_delay_a = i2c_mux_pca9641_device->rst_delay_a; + PCA_DEBUG("reset_type:0x%x, rst_delay_b:0x%x, rst_delay:0x%x, rst_delay_a:0x%x.\n", + reset_cfg->pca9641_reset_type, reset_cfg->rst_delay_b, + reset_cfg->rst_delay, reset_cfg->rst_delay_a); + + if (reset_cfg->pca9641_reset_type == PCA9641_RESET_I2C) { + + PCA_DEBUG("reset by i2c.\n"); + reset_cfg->attr.i2c_attr.i2c_bus = i2c_mux_pca9641_device->attr.i2c_attr.i2c_bus; + reset_cfg->attr.i2c_attr.i2c_addr = i2c_mux_pca9641_device->attr.i2c_attr.i2c_addr; + reset_cfg->attr.i2c_attr.reg_offset = i2c_mux_pca9641_device->attr.i2c_attr.reg_offset; + reset_cfg->attr.i2c_attr.mask = i2c_mux_pca9641_device->attr.i2c_attr.mask; + reset_cfg->attr.i2c_attr.reset_on = i2c_mux_pca9641_device->attr.i2c_attr.reset_on; + reset_cfg->attr.i2c_attr.reset_off = i2c_mux_pca9641_device->attr.i2c_attr.reset_off; + PCA_DEBUG("bus:%u, addr:0x%x, offset:0x%x, mask:0x%x, on:0x%x, off:0x%x.\n", + reset_cfg->attr.i2c_attr.i2c_bus, reset_cfg->attr.i2c_attr.i2c_addr, + reset_cfg->attr.i2c_attr.reg_offset, reset_cfg->attr.i2c_attr.mask, + reset_cfg->attr.i2c_attr.reset_on, reset_cfg->attr.i2c_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_GPIO) { + + PCA_DEBUG("reset by gpio.\n"); + reset_cfg->attr.gpio_attr.gpio = i2c_mux_pca9641_device->attr.gpio_attr.gpio; + reset_cfg->attr.gpio_attr.reset_on = i2c_mux_pca9641_device->attr.gpio_attr.reset_on; + reset_cfg->attr.gpio_attr.reset_off = i2c_mux_pca9641_device->attr.gpio_attr.reset_off; + PCA_DEBUG("gpio number:%u, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.gpio_attr.gpio, reset_cfg->attr.gpio_attr.reset_on, + reset_cfg->attr.gpio_attr.reset_off); + reset_cfg->attr.gpio_attr.gpio_init = 0; + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_IO) { + + PCA_DEBUG("reset by io.\n"); + reset_cfg->attr.io_attr.io_addr = i2c_mux_pca9641_device->attr.io_attr.io_addr; + reset_cfg->attr.io_attr.mask = i2c_mux_pca9641_device->attr.io_attr.mask; + reset_cfg->attr.io_attr.reset_on = i2c_mux_pca9641_device->attr.io_attr.reset_on; + reset_cfg->attr.io_attr.reset_off = i2c_mux_pca9641_device->attr.io_attr.reset_off; + PCA_DEBUG("io_addr:0x%x, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.io_attr.io_addr, reset_cfg->attr.io_attr.mask, + reset_cfg->attr.io_attr.reset_on, reset_cfg->attr.io_attr.reset_off); + } else if (reset_cfg->pca9641_reset_type == PCA9641_RESET_FILE) { + + PCA_DEBUG("reset by file.\n"); + reset_cfg->attr.file_attr.dev_name = i2c_mux_pca9641_device->attr.file_attr.dev_name; + reset_cfg->attr.file_attr.offset = i2c_mux_pca9641_device->attr.file_attr.offset; + reset_cfg->attr.file_attr.mask = i2c_mux_pca9641_device->attr.file_attr.mask; + reset_cfg->attr.file_attr.reset_on = i2c_mux_pca9641_device->attr.file_attr.reset_on; + reset_cfg->attr.file_attr.reset_off = i2c_mux_pca9641_device->attr.file_attr.reset_off; + PCA_DEBUG("dev_name:%s, mask:0x%x, reset_on:0x%x, reset_off:0x%x.\n", + reset_cfg->attr.file_attr.dev_name, reset_cfg->attr.file_attr.mask, + reset_cfg->attr.file_attr.reset_on, reset_cfg->attr.file_attr.reset_off); + } else { + PCA_DEBUG_ERR("Unsupport reset type:%d.\n", reset_cfg->pca9641_reset_type); + return -EINVAL; + } + return 0; +} + +/* + * I2C init/probing/exit functions + */ +static int pca9541_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_adapter *adap = client->adapter; + struct i2c_mux_core *muxc; + struct pca9541 *data; + int force; + int ret = -ENODEV; + int detect_id; + i2c_mux_pca9641_device_t *i2c_mux_pca9641_device; + + if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE_DATA)) + return -ENODEV; + + detect_id = pca9641_detect_id(client); + + /* + * I2C accesses are unprotected here. + * We have to lock the adapter before releasing the bus. + */ + if (detect_id == 0) { + i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + pca9541_release_bus(client); + i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + } else { + i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + pca9641_release_bus(client); + i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); + } + + if (detect_id == 0) { /* pca9541 */ + muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), + I2C_MUX_ARBITRATOR, + pca9541_select_chan, pca9541_release_chan); + if (!muxc) + return -ENOMEM; + + data = i2c_mux_priv(muxc); + data->client = client; + + i2c_set_clientdata(client, muxc); + /* Create mux adapter */ + if (of_property_read_u32(client->dev.of_node, "pca9641_nr", &data->pca9641_nr)) { + + force = 0; + PCA_DEBUG("pca9641_nr not found, use dynamic adap number.\n"); + } else { + force = data->pca9641_nr; + PCA_DEBUG("pca9641_nr: %d.\n", force); + } + + ret = i2c_mux_add_adapter(muxc, force, 0, 0); + if (ret) + return ret; + } else { + muxc = i2c_mux_alloc(adap, &client->dev, 1, sizeof(*data), I2C_MUX_ARBITRATOR, + pca9641_select_chan, pca9641_release_chan); + if (!muxc) { + dev_err(&client->dev, "i2c_mux_alloc failed, out of memory.\n"); + return -ENOMEM; + } + + data = i2c_mux_priv(muxc); + data->client = client; + + i2c_set_clientdata(client, muxc); + + if (client->dev.of_node) { + ret= of_pca9641_reset_data_init(data); + } else { + ret= pca9641_reset_data_init(data); + } + if (ret < 0) { + dev_err(&client->dev, "pca9641 reset config err, ret:%d.\n", ret); + return ret; + } + + if (client->dev.of_node == NULL) { + if (client->dev.platform_data == NULL) { + force = 0; + PCA_DEBUG("platform data is NULL, use dynamic adap number.\n"); + } else { + i2c_mux_pca9641_device = client->dev.platform_data; + data->pca9641_nr = i2c_mux_pca9641_device->pca9641_nr; + if (data->pca9641_nr == 0) { + force = 0; + PCA_DEBUG("pca9641_nr = 0, use dynamic adap number.\n"); + } else { + force = data->pca9641_nr; + PCA_DEBUG("pca9641_nr: %d.\n", force); + } + } + } else { + /* Create mux adapter */ + if (of_property_read_u32(client->dev.of_node, "pca9641_nr", &data->pca9641_nr)) { + + force = 0; + PCA_DEBUG("pca9641_nr not found, use dynamic adap number.\n"); + } else { + force = data->pca9641_nr; + PCA_DEBUG("pca9641_nr: %d.\n", force); + } + } + + ret = i2c_mux_add_adapter(muxc, force, 0, 0); + if (ret) { + dev_err(&client->dev, "Failed to register master selector.\n"); + return ret; + } + } + pca9641_recordflag(muxc->adapter[0]); + + dev_info(&client->dev, "registered master selector for I2C %s\n", client->name); + + return 0; +} + +static int pca9541_remove(struct i2c_client *client) +{ + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + + i2c_mux_del_adapters(muxc); + return 0; +} + +static struct i2c_driver pca9641_driver = { + .driver = { + .name = "wb_pca9641", + .of_match_table = of_match_ptr(pca9541_of_match), + }, + .probe = pca9541_probe, + .remove = pca9541_remove, + .id_table = pca9541_id, +}; + +module_i2c_driver(pca9641_driver); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PCA9541 I2C master selector driver"); +MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h new file mode 100644 index 0000000000..b87f758556 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_i2c_mux_pca9641.h @@ -0,0 +1,64 @@ +#ifndef __WB_I2C_MUX_PCA9641_H__ +#define __WB_I2C_MUX_PCA9641_H__ + +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum pca9641_reset_type_s { + PCA9641_RESET_NONE = 0, + PCA9641_RESET_I2C = 1, + PCA9641_RESET_GPIO = 2, + PCA9641_RESET_IO = 3, + PCA9641_RESET_FILE = 4, +} pca9641_reset_type_t; + +typedef struct i2c_attr_s { + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t reg_offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} i2c_attr_t; + +typedef struct io_attr_s { + uint32_t io_addr; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} io_attr_t; + +typedef struct file_attr_s { + const char *dev_name; + uint32_t offset; + uint32_t mask; + uint32_t reset_on; + uint32_t reset_off; +} file_attr_t; + +typedef struct gpio_attr_s { + int gpio_init; + uint32_t gpio; + uint32_t reset_on; + uint32_t reset_off; +} gpio_attr_t; + +typedef struct i2c_mux_pca9641_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + uint32_t pca9641_nr; + uint32_t pca9641_reset_type; + uint32_t rst_delay_b; /* delay time before reset(us) */ + uint32_t rst_delay; /* reset time(us) */ + uint32_t rst_delay_a; /* delay time after reset(us) */ + union { + i2c_attr_t i2c_attr; + gpio_attr_t gpio_attr; + io_attr_t io_attr; + file_attr_t file_attr; + } attr; +} i2c_mux_pca9641_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c new file mode 100644 index 0000000000..fba2c4e3a6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ina3221.c @@ -0,0 +1,1031 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * INA3221 Triple Current/Voltage Monitor + * + * Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com/ + * Andrew F. Davis + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define INA3221_DRIVER_NAME "wb_ina3221" + +#define INA3221_CONFIG 0x00 +#define INA3221_SHUNT1 0x01 +#define INA3221_BUS1 0x02 +#define INA3221_SHUNT2 0x03 +#define INA3221_BUS2 0x04 +#define INA3221_SHUNT3 0x05 +#define INA3221_BUS3 0x06 +#define INA3221_CRIT1 0x07 +#define INA3221_WARN1 0x08 +#define INA3221_CRIT2 0x09 +#define INA3221_WARN2 0x0a +#define INA3221_CRIT3 0x0b +#define INA3221_WARN3 0x0c +#define INA3221_SHUNT_SUM 0x0d +#define INA3221_CRIT_SUM 0x0e +#define INA3221_MASK_ENABLE 0x0f + +#define INA3221_CONFIG_MODE_MASK GENMASK(2, 0) +#define INA3221_CONFIG_MODE_POWERDOWN 0 +#define INA3221_CONFIG_MODE_SHUNT BIT(0) +#define INA3221_CONFIG_MODE_BUS BIT(1) +#define INA3221_CONFIG_MODE_CONTINUOUS BIT(2) +#define INA3221_CONFIG_VSH_CT_SHIFT 3 +#define INA3221_CONFIG_VSH_CT_MASK GENMASK(5, 3) +#define INA3221_CONFIG_VSH_CT(x) (((x) & GENMASK(5, 3)) >> 3) +#define INA3221_CONFIG_VBUS_CT_SHIFT 6 +#define INA3221_CONFIG_VBUS_CT_MASK GENMASK(8, 6) +#define INA3221_CONFIG_VBUS_CT(x) (((x) & GENMASK(8, 6)) >> 6) +#define INA3221_CONFIG_AVG_SHIFT 9 +#define INA3221_CONFIG_AVG_MASK GENMASK(11, 9) +#define INA3221_CONFIG_AVG(x) (((x) & GENMASK(11, 9)) >> 9) +#define INA3221_CONFIG_CHs_EN_MASK GENMASK(14, 12) +#define INA3221_CONFIG_CHx_EN(x) BIT(14 - (x)) + +#define INA3221_MASK_ENABLE_SCC_MASK GENMASK(14, 12) + +#define INA3221_CONFIG_DEFAULT 0x7127 +#define INA3221_RSHUNT_DEFAULT 10000 + +enum ina3221_fields { + /* Configuration */ + F_RST, + + /* Status Flags */ + F_CVRF, + + /* Warning Flags */ + F_WF3, F_WF2, F_WF1, + + /* Alert Flags: SF is the summation-alert flag */ + F_SF, F_CF3, F_CF2, F_CF1, + + /* sentinel */ + F_MAX_FIELDS +}; + +static const struct reg_field ina3221_reg_fields[] = { + [F_RST] = REG_FIELD(INA3221_CONFIG, 15, 15), + + [F_CVRF] = REG_FIELD(INA3221_MASK_ENABLE, 0, 0), + [F_WF3] = REG_FIELD(INA3221_MASK_ENABLE, 3, 3), + [F_WF2] = REG_FIELD(INA3221_MASK_ENABLE, 4, 4), + [F_WF1] = REG_FIELD(INA3221_MASK_ENABLE, 5, 5), + [F_SF] = REG_FIELD(INA3221_MASK_ENABLE, 6, 6), + [F_CF3] = REG_FIELD(INA3221_MASK_ENABLE, 7, 7), + [F_CF2] = REG_FIELD(INA3221_MASK_ENABLE, 8, 8), + [F_CF1] = REG_FIELD(INA3221_MASK_ENABLE, 9, 9), +}; + +enum ina3221_channels { + INA3221_CHANNEL1, + INA3221_CHANNEL2, + INA3221_CHANNEL3, + INA3221_NUM_CHANNELS +}; + +/** + * struct ina3221_input - channel input source specific information + * @label: label of channel input source + * @shunt_resistor: shunt resistor value of channel input source + * @disconnected: connection status of channel input source + */ +struct ina3221_input { + const char *label; + int shunt_resistor; + bool disconnected; +}; + +/** + * struct ina3221_data - device specific information + * @pm_dev: Device pointer for pm runtime + * @regmap: Register map of the device + * @fields: Register fields of the device + * @inputs: Array of channel input source specific structures + * @lock: mutex lock to serialize sysfs attribute accesses + * @reg_config: Register value of INA3221_CONFIG + * @summation_shunt_resistor: equivalent shunt resistor value for summation + * @single_shot: running in single-shot operating mode + */ +struct ina3221_data { + struct device *pm_dev; + struct regmap *regmap; + struct regmap_field *fields[F_MAX_FIELDS]; + struct ina3221_input inputs[INA3221_NUM_CHANNELS]; + struct mutex lock; + u32 reg_config; + int summation_shunt_resistor; + + bool single_shot; +}; + +static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel) +{ + /* Summation channel checks shunt resistor values */ + if (channel > INA3221_CHANNEL3) + return ina->summation_shunt_resistor != 0; + + return pm_runtime_active(ina->pm_dev) && + (ina->reg_config & INA3221_CONFIG_CHx_EN(channel)); +} + +/** + * Helper function to return the resistor value for current summation. + * + * There is a condition to calculate current summation -- all the shunt + * resistor values should be the same, so as to simply fit the formula: + * current summation = shunt voltage summation / shunt resistor + * + * Returns the equivalent shunt resistor value on success or 0 on failure + */ +static inline int ina3221_summation_shunt_resistor(struct ina3221_data *ina) +{ + struct ina3221_input *input = ina->inputs; + int i, shunt_resistor = 0; + + for (i = 0; i < INA3221_NUM_CHANNELS; i++) { + if (input[i].disconnected || !input[i].shunt_resistor) + continue; + if (!shunt_resistor) { + /* Found the reference shunt resistor value */ + shunt_resistor = input[i].shunt_resistor; + } else { + /* No summation if resistor values are different */ + if (shunt_resistor != input[i].shunt_resistor) + return 0; + } + } + + return shunt_resistor; +} + +/* Lookup table for Bus and Shunt conversion times in usec */ +static const u16 ina3221_conv_time[] = { + 140, 204, 332, 588, 1100, 2116, 4156, 8244, +}; + +/* Lookup table for number of samples using in averaging mode */ +static const int ina3221_avg_samples[] = { + 1, 4, 16, 64, 128, 256, 512, 1024, +}; + +/* Converting update_interval in msec to conversion time in usec */ +static inline u32 ina3221_interval_ms_to_conv_time(u16 config, int interval) +{ + u32 channels = hweight16(config & INA3221_CONFIG_CHs_EN_MASK); + u32 samples_idx = INA3221_CONFIG_AVG(config); + u32 samples = ina3221_avg_samples[samples_idx]; + + /* Bisect the result to Bus and Shunt conversion times */ + return DIV_ROUND_CLOSEST(interval * 1000 / 2, channels * samples); +} + +/* Converting CONFIG register value to update_interval in usec */ +static inline u32 ina3221_reg_to_interval_us(u16 config) +{ + u32 channels = hweight16(config & INA3221_CONFIG_CHs_EN_MASK); + u32 vbus_ct_idx = INA3221_CONFIG_VBUS_CT(config); + u32 vsh_ct_idx = INA3221_CONFIG_VSH_CT(config); + u32 samples_idx = INA3221_CONFIG_AVG(config); + u32 samples = ina3221_avg_samples[samples_idx]; + u32 vbus_ct = ina3221_conv_time[vbus_ct_idx]; + u32 vsh_ct = ina3221_conv_time[vsh_ct_idx]; + + /* Calculate total conversion time */ + return channels * (vbus_ct + vsh_ct) * samples; +} + +static inline int ina3221_wait_for_data(struct ina3221_data *ina) +{ + u32 wait, cvrf; + + wait = ina3221_reg_to_interval_us(ina->reg_config); + + /* Polling the CVRF bit to make sure read data is ready */ + return regmap_field_read_poll_timeout(ina->fields[F_CVRF], + cvrf, cvrf, wait, wait * 2); +} + +static int ina3221_read_value(struct ina3221_data *ina, unsigned int reg, + int *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(ina->regmap, reg, ®val); + if (ret) + return ret; + + /* + * Shunt Voltage Sum register has 14-bit value with 1-bit shift + * Other Shunt Voltage registers have 12 bits with 3-bit shift + */ + if (reg == INA3221_SHUNT_SUM) + *val = sign_extend32(regval >> 1, 14); + else + *val = sign_extend32(regval >> 3, 12); + + return 0; +} + +static const u8 ina3221_in_reg[] = { + INA3221_BUS1, + INA3221_BUS2, + INA3221_BUS3, + INA3221_SHUNT1, + INA3221_SHUNT2, + INA3221_SHUNT3, + INA3221_SHUNT_SUM, +}; + +static int ina3221_read_chip(struct device *dev, u32 attr, long *val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int regval; + + switch (attr) { + case hwmon_chip_samples: + regval = INA3221_CONFIG_AVG(ina->reg_config); + *val = ina3221_avg_samples[regval]; + return 0; + case hwmon_chip_update_interval: + /* Return in msec */ + *val = ina3221_reg_to_interval_us(ina->reg_config); + *val = DIV_ROUND_CLOSEST(*val, 1000); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ina3221_read_in(struct device *dev, u32 attr, int channel, long *val) +{ + const bool is_shunt = channel > INA3221_CHANNEL3; + struct ina3221_data *ina = dev_get_drvdata(dev); + u8 reg = ina3221_in_reg[channel]; + int regval, ret; + + /* + * Translate shunt channel index to sensor channel index except + * the 7th channel (6 since being 0-aligned) is for summation. + */ + if (channel != 6) + channel %= INA3221_NUM_CHANNELS; + + switch (attr) { + case hwmon_in_input: + if (!ina3221_is_enabled(ina, channel)) + return -ENODATA; + + /* Write CONFIG register to trigger a single-shot measurement */ + if (ina->single_shot) + regmap_write(ina->regmap, INA3221_CONFIG, + ina->reg_config); + + ret = ina3221_wait_for_data(ina); + if (ret) + return ret; + + ret = ina3221_read_value(ina, reg, ®val); + if (ret) + return ret; + + /* + * Scale of shunt voltage (uV): LSB is 40uV + * Scale of bus voltage (mV): LSB is 8mV + */ + *val = regval * (is_shunt ? 40 : 8); + return 0; + case hwmon_in_enable: + *val = ina3221_is_enabled(ina, channel); + return 0; + default: + return -EOPNOTSUPP; + } +} + +static const u8 ina3221_curr_reg[][INA3221_NUM_CHANNELS + 1] = { + [hwmon_curr_input] = { INA3221_SHUNT1, INA3221_SHUNT2, + INA3221_SHUNT3, INA3221_SHUNT_SUM }, + [hwmon_curr_max] = { INA3221_WARN1, INA3221_WARN2, INA3221_WARN3, 0 }, + [hwmon_curr_crit] = { INA3221_CRIT1, INA3221_CRIT2, + INA3221_CRIT3, INA3221_CRIT_SUM }, + [hwmon_curr_max_alarm] = { F_WF1, F_WF2, F_WF3, 0 }, + [hwmon_curr_crit_alarm] = { F_CF1, F_CF2, F_CF3, F_SF }, +}; + +static int ina3221_read_curr(struct device *dev, u32 attr, + int channel, long *val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + struct ina3221_input *input = ina->inputs; + u8 reg = ina3221_curr_reg[attr][channel]; + int resistance_uo, voltage_nv; + int regval, ret; + + if (channel > INA3221_CHANNEL3) + resistance_uo = ina->summation_shunt_resistor; + else + resistance_uo = input[channel].shunt_resistor; + + switch (attr) { + case hwmon_curr_input: + if (!ina3221_is_enabled(ina, channel)) + return -ENODATA; + + /* Write CONFIG register to trigger a single-shot measurement */ + if (ina->single_shot) + regmap_write(ina->regmap, INA3221_CONFIG, + ina->reg_config); + + ret = ina3221_wait_for_data(ina); + if (ret) + return ret; + + fallthrough; + case hwmon_curr_crit: + case hwmon_curr_max: + if (!resistance_uo) + return -ENODATA; + + ret = ina3221_read_value(ina, reg, ®val); + if (ret) + return ret; + + /* Scale of shunt voltage: LSB is 40uV (40000nV) */ + voltage_nv = regval * 40000; + /* Return current in mA */ + *val = DIV_ROUND_CLOSEST(voltage_nv, resistance_uo); + return 0; + case hwmon_curr_crit_alarm: + case hwmon_curr_max_alarm: + /* No actual register read if channel is disabled */ + if (!ina3221_is_enabled(ina, channel)) { + /* Return 0 for alert flags */ + *val = 0; + return 0; + } + ret = regmap_field_read(ina->fields[reg], ®val); + if (ret) + return ret; + *val = regval; + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ina3221_write_chip(struct device *dev, u32 attr, long val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret, idx; + u32 tmp; + + switch (attr) { + case hwmon_chip_samples: + idx = find_closest(val, ina3221_avg_samples, + ARRAY_SIZE(ina3221_avg_samples)); + + tmp = (ina->reg_config & ~INA3221_CONFIG_AVG_MASK) | + (idx << INA3221_CONFIG_AVG_SHIFT); + ret = regmap_write(ina->regmap, INA3221_CONFIG, tmp); + if (ret) + return ret; + + /* Update reg_config accordingly */ + ina->reg_config = tmp; + return 0; + case hwmon_chip_update_interval: + tmp = ina3221_interval_ms_to_conv_time(ina->reg_config, val); + idx = find_closest(tmp, ina3221_conv_time, + ARRAY_SIZE(ina3221_conv_time)); + + /* Update Bus and Shunt voltage conversion times */ + tmp = INA3221_CONFIG_VBUS_CT_MASK | INA3221_CONFIG_VSH_CT_MASK; + tmp = (ina->reg_config & ~tmp) | + (idx << INA3221_CONFIG_VBUS_CT_SHIFT) | + (idx << INA3221_CONFIG_VSH_CT_SHIFT); + ret = regmap_write(ina->regmap, INA3221_CONFIG, tmp); + if (ret) + return ret; + + /* Update reg_config accordingly */ + ina->reg_config = tmp; + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ina3221_write_curr(struct device *dev, u32 attr, + int channel, long val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + struct ina3221_input *input = ina->inputs; + u8 reg = ina3221_curr_reg[attr][channel]; + int resistance_uo, current_ma, voltage_uv; + int regval; + + if (channel > INA3221_CHANNEL3) + resistance_uo = ina->summation_shunt_resistor; + else + resistance_uo = input[channel].shunt_resistor; + + if (!resistance_uo) + return -EOPNOTSUPP; + + /* clamp current */ + current_ma = clamp_val(val, + INT_MIN / resistance_uo, + INT_MAX / resistance_uo); + + voltage_uv = DIV_ROUND_CLOSEST(current_ma * resistance_uo, 1000); + + /* clamp voltage */ + voltage_uv = clamp_val(voltage_uv, -163800, 163800); + + /* + * Formula to convert voltage_uv to register value: + * regval = (voltage_uv / scale) << shift + * Note: + * The scale is 40uV for all shunt voltage registers + * Shunt Voltage Sum register left-shifts 1 bit + * All other Shunt Voltage registers shift 3 bits + * Results: + * SHUNT_SUM: (1 / 40uV) << 1 = 1 / 20uV + * SHUNT[1-3]: (1 / 40uV) << 3 = 1 / 5uV + */ + if (reg == INA3221_SHUNT_SUM) + regval = DIV_ROUND_CLOSEST(voltage_uv, 20) & 0xfffe; + else + regval = DIV_ROUND_CLOSEST(voltage_uv, 5) & 0xfff8; + + return regmap_write(ina->regmap, reg, regval); +} + +static int ina3221_write_enable(struct device *dev, int channel, bool enable) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + u16 config, mask = INA3221_CONFIG_CHx_EN(channel); + u16 config_old = ina->reg_config & mask; + u32 tmp; + int ret; + + config = enable ? mask : 0; + + /* Bypass if enable status is not being changed */ + if (config_old == config) + return 0; + + /* For enabling routine, increase refcount and resume() at first */ + if (enable) { + ret = pm_runtime_resume_and_get(ina->pm_dev); + if (ret < 0) { + dev_err(dev, "Failed to get PM runtime\n"); + return ret; + } + } + + /* Enable or disable the channel */ + tmp = (ina->reg_config & ~mask) | (config & mask); + ret = regmap_write(ina->regmap, INA3221_CONFIG, tmp); + if (ret) + goto fail; + + /* Cache the latest config register value */ + ina->reg_config = tmp; + + /* For disabling routine, decrease refcount or suspend() at last */ + if (!enable) + pm_runtime_put_sync(ina->pm_dev); + + return 0; + +fail: + if (enable) { + dev_err(dev, "Failed to enable channel %d: error %d\n", + channel, ret); + pm_runtime_put_sync(ina->pm_dev); + } + + return ret; +} + +static int ina3221_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + mutex_lock(&ina->lock); + + switch (type) { + case hwmon_chip: + ret = ina3221_read_chip(dev, attr, val); + break; + case hwmon_in: + /* 0-align channel ID */ + ret = ina3221_read_in(dev, attr, channel - 1, val); + break; + case hwmon_curr: + ret = ina3221_read_curr(dev, attr, channel, val); + break; + default: + ret = -EOPNOTSUPP; + break; + } + + mutex_unlock(&ina->lock); + + return ret; +} + +static int ina3221_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + mutex_lock(&ina->lock); + + switch (type) { + case hwmon_chip: + ret = ina3221_write_chip(dev, attr, val); + break; + case hwmon_in: + /* 0-align channel ID */ + ret = ina3221_write_enable(dev, channel - 1, val); + break; + case hwmon_curr: + ret = ina3221_write_curr(dev, attr, channel, val); + break; + default: + ret = -EOPNOTSUPP; + break; + } + + mutex_unlock(&ina->lock); + + return ret; +} + +static int ina3221_read_string(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, const char **str) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int index = channel - 1; + + if (channel == 7) + *str = "sum of shunt voltages"; + else + *str = ina->inputs[index].label; + + return 0; +} + +static umode_t ina3221_is_visible(const void *drvdata, + enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct ina3221_data *ina = drvdata; + const struct ina3221_input *input = NULL; + + switch (type) { + case hwmon_chip: + switch (attr) { + case hwmon_chip_samples: + case hwmon_chip_update_interval: + return 0644; + default: + return 0; + } + case hwmon_in: + /* Ignore in0_ */ + if (channel == 0) + return 0; + + switch (attr) { + case hwmon_in_label: + if (channel - 1 <= INA3221_CHANNEL3) + input = &ina->inputs[channel - 1]; + else if (channel == 7) + return 0444; + /* Hide label node if label is not provided */ + return (input && input->label) ? 0444 : 0; + case hwmon_in_input: + return 0444; + case hwmon_in_enable: + return 0644; + default: + return 0; + } + case hwmon_curr: + switch (attr) { + case hwmon_curr_input: + case hwmon_curr_crit_alarm: + case hwmon_curr_max_alarm: + return 0444; + case hwmon_curr_crit: + case hwmon_curr_max: + return 0644; + default: + return 0; + } + default: + return 0; + } +} + +#define INA3221_HWMON_CURR_CONFIG (HWMON_C_INPUT | \ + HWMON_C_CRIT | HWMON_C_CRIT_ALARM | \ + HWMON_C_MAX | HWMON_C_MAX_ALARM) + +static const struct hwmon_channel_info *ina3221_info[] = { + HWMON_CHANNEL_INFO(chip, + HWMON_C_SAMPLES, + HWMON_C_UPDATE_INTERVAL), + HWMON_CHANNEL_INFO(in, + /* 0: dummy, skipped in is_visible */ + HWMON_I_INPUT, + /* 1-3: input voltage Channels */ + HWMON_I_INPUT | HWMON_I_ENABLE | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_ENABLE | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_ENABLE | HWMON_I_LABEL, + /* 4-6: shunt voltage Channels */ + HWMON_I_INPUT, + HWMON_I_INPUT, + HWMON_I_INPUT, + /* 7: summation of shunt voltage channels */ + HWMON_I_INPUT | HWMON_I_LABEL), + HWMON_CHANNEL_INFO(curr, + /* 1-3: current channels*/ + INA3221_HWMON_CURR_CONFIG, + INA3221_HWMON_CURR_CONFIG, + INA3221_HWMON_CURR_CONFIG, + /* 4: summation of current channels */ + HWMON_C_INPUT | HWMON_C_CRIT | HWMON_C_CRIT_ALARM), + NULL +}; + +static const struct hwmon_ops ina3221_hwmon_ops = { + .is_visible = ina3221_is_visible, + .read_string = ina3221_read_string, + .read = ina3221_read, + .write = ina3221_write, +}; + +static const struct hwmon_chip_info ina3221_chip_info = { + .ops = &ina3221_hwmon_ops, + .info = ina3221_info, +}; + +/* Extra attribute groups */ +static ssize_t ina3221_shunt_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct sensor_device_attribute *sd_attr = to_sensor_dev_attr(attr); + struct ina3221_data *ina = dev_get_drvdata(dev); + unsigned int channel = sd_attr->index; + struct ina3221_input *input = &ina->inputs[channel]; + + return snprintf(buf, PAGE_SIZE, "%d\n", input->shunt_resistor); +} + +static ssize_t ina3221_shunt_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *sd_attr = to_sensor_dev_attr(attr); + struct ina3221_data *ina = dev_get_drvdata(dev); + unsigned int channel = sd_attr->index; + struct ina3221_input *input = &ina->inputs[channel]; + int val; + int ret; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + val = clamp_val(val, 1, INT_MAX); + + input->shunt_resistor = val; + + /* Update summation_shunt_resistor for summation channel */ + ina->summation_shunt_resistor = ina3221_summation_shunt_resistor(ina); + + return count; +} + +/* shunt resistance */ +static SENSOR_DEVICE_ATTR_RW(shunt1_resistor, ina3221_shunt, INA3221_CHANNEL1); +static SENSOR_DEVICE_ATTR_RW(shunt2_resistor, ina3221_shunt, INA3221_CHANNEL2); +static SENSOR_DEVICE_ATTR_RW(shunt3_resistor, ina3221_shunt, INA3221_CHANNEL3); + +static struct attribute *ina3221_attrs[] = { + &sensor_dev_attr_shunt1_resistor.dev_attr.attr, + &sensor_dev_attr_shunt2_resistor.dev_attr.attr, + &sensor_dev_attr_shunt3_resistor.dev_attr.attr, + NULL, +}; +ATTRIBUTE_GROUPS(ina3221); + +static const struct regmap_range ina3221_yes_ranges[] = { + regmap_reg_range(INA3221_CONFIG, INA3221_BUS3), + regmap_reg_range(INA3221_SHUNT_SUM, INA3221_SHUNT_SUM), + regmap_reg_range(INA3221_MASK_ENABLE, INA3221_MASK_ENABLE), +}; + +static const struct regmap_access_table ina3221_volatile_table = { + .yes_ranges = ina3221_yes_ranges, + .n_yes_ranges = ARRAY_SIZE(ina3221_yes_ranges), +}; + +static const struct regmap_config ina3221_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + + .cache_type = REGCACHE_RBTREE, + .volatile_table = &ina3221_volatile_table, +}; + +static int ina3221_probe_child_from_dt(struct device *dev, + struct device_node *child, + struct ina3221_data *ina) +{ + struct ina3221_input *input; + u32 val; + int ret; + + ret = of_property_read_u32(child, "reg", &val); + if (ret) { + dev_err(dev, "missing reg property of %pOFn\n", child); + return ret; + } else if (val > INA3221_CHANNEL3) { + dev_err(dev, "invalid reg %d of %pOFn\n", val, child); + return ret; + } + + input = &ina->inputs[val]; + + /* Log the disconnected channel input */ + if (!of_device_is_available(child)) { + input->disconnected = true; + return 0; + } + + /* Save the connected input label if available */ + of_property_read_string(child, "label", &input->label); + + /* Overwrite default shunt resistor value optionally */ + if (!of_property_read_u32(child, "shunt-resistor-micro-ohms", &val)) { + if (val < 1 || val > INT_MAX) { + dev_err(dev, "invalid shunt resistor value %u of %pOFn\n", + val, child); + return -EINVAL; + } + input->shunt_resistor = val; + } + + return 0; +} + +static int ina3221_probe_from_dt(struct device *dev, struct ina3221_data *ina) +{ + const struct device_node *np = dev->of_node; + struct device_node *child; + int ret; + + /* Compatible with non-DT platforms */ + if (!np) + return 0; + + ina->single_shot = of_property_read_bool(np, "ti,single-shot"); + + for_each_child_of_node(np, child) { + ret = ina3221_probe_child_from_dt(dev, child, ina); + if (ret) { + of_node_put(child); + return ret; + } + } + + return 0; +} + +static int ina3221_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct ina3221_data *ina; + struct device *hwmon_dev; + int i, ret; + + ina = devm_kzalloc(dev, sizeof(*ina), GFP_KERNEL); + if (!ina) + return -ENOMEM; + + ina->regmap = devm_regmap_init_i2c(client, &ina3221_regmap_config); + if (IS_ERR(ina->regmap)) { + dev_err(dev, "Unable to allocate register map\n"); + return PTR_ERR(ina->regmap); + } + + for (i = 0; i < F_MAX_FIELDS; i++) { + ina->fields[i] = devm_regmap_field_alloc(dev, + ina->regmap, + ina3221_reg_fields[i]); + if (IS_ERR(ina->fields[i])) { + dev_err(dev, "Unable to allocate regmap fields\n"); + return PTR_ERR(ina->fields[i]); + } + } + + for (i = 0; i < INA3221_NUM_CHANNELS; i++) + ina->inputs[i].shunt_resistor = INA3221_RSHUNT_DEFAULT; + + ret = ina3221_probe_from_dt(dev, ina); + if (ret) { + dev_err(dev, "Unable to probe from device tree\n"); + return ret; + } + + /* The driver will be reset, so use reset value */ + ina->reg_config = INA3221_CONFIG_DEFAULT; + + /* Clear continuous bit to use single-shot mode */ + if (ina->single_shot) + ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS; + + /* Disable channels if their inputs are disconnected */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) { + if (ina->inputs[i].disconnected) + ina->reg_config &= ~INA3221_CONFIG_CHx_EN(i); + } + + /* Initialize summation_shunt_resistor for summation channel control */ + ina->summation_shunt_resistor = ina3221_summation_shunt_resistor(ina); + + ina->pm_dev = dev; + mutex_init(&ina->lock); + dev_set_drvdata(dev, ina); + + /* Enable PM runtime -- status is suspended by default */ + pm_runtime_enable(ina->pm_dev); + + /* Initialize (resume) the device */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) { + if (ina->inputs[i].disconnected) + continue; + /* Match the refcount with number of enabled channels */ + ret = pm_runtime_get_sync(ina->pm_dev); + if (ret < 0) + goto fail; + } + + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, ina, + &ina3221_chip_info, + ina3221_groups); + if (IS_ERR(hwmon_dev)) { + dev_err(dev, "Unable to register hwmon device\n"); + ret = PTR_ERR(hwmon_dev); + goto fail; + } + + return 0; + +fail: + pm_runtime_disable(ina->pm_dev); + pm_runtime_set_suspended(ina->pm_dev); + /* pm_runtime_put_noidle() will decrease the PM refcount until 0 */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) + pm_runtime_put_noidle(ina->pm_dev); + mutex_destroy(&ina->lock); + + return ret; +} + +static int ina3221_remove(struct i2c_client *client) +{ + struct ina3221_data *ina = dev_get_drvdata(&client->dev); + int i; + + pm_runtime_disable(ina->pm_dev); + pm_runtime_set_suspended(ina->pm_dev); + + /* pm_runtime_put_noidle() will decrease the PM refcount until 0 */ + for (i = 0; i < INA3221_NUM_CHANNELS; i++) + pm_runtime_put_noidle(ina->pm_dev); + + mutex_destroy(&ina->lock); + + return 0; +} + +static int __maybe_unused ina3221_suspend(struct device *dev) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + /* Save config register value and enable cache-only */ + ret = regmap_read(ina->regmap, INA3221_CONFIG, &ina->reg_config); + if (ret) + return ret; + + /* Set to power-down mode for power saving */ + ret = regmap_update_bits(ina->regmap, INA3221_CONFIG, + INA3221_CONFIG_MODE_MASK, + INA3221_CONFIG_MODE_POWERDOWN); + if (ret) + return ret; + + regcache_cache_only(ina->regmap, true); + regcache_mark_dirty(ina->regmap); + + return 0; +} + +static int __maybe_unused ina3221_resume(struct device *dev) +{ + struct ina3221_data *ina = dev_get_drvdata(dev); + int ret; + + regcache_cache_only(ina->regmap, false); + + /* Software reset the chip */ + ret = regmap_field_write(ina->fields[F_RST], true); + if (ret) { + dev_err(dev, "Unable to reset device\n"); + return ret; + } + + /* Restore cached register values to hardware */ + ret = regcache_sync(ina->regmap); + if (ret) + return ret; + + /* Restore config register value to hardware */ + ret = regmap_write(ina->regmap, INA3221_CONFIG, ina->reg_config); + if (ret) + return ret; + + /* Initialize summation channel control */ + if (ina->summation_shunt_resistor) { + /* + * Take all three channels into summation by default + * Shunt measurements of disconnected channels should + * be 0, so it does not matter for summation. + */ + ret = regmap_update_bits(ina->regmap, INA3221_MASK_ENABLE, + INA3221_MASK_ENABLE_SCC_MASK, + INA3221_MASK_ENABLE_SCC_MASK); + if (ret) { + dev_err(dev, "Unable to control summation channel\n"); + return ret; + } + } + + return 0; +} + +static const struct dev_pm_ops ina3221_pm = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(ina3221_suspend, ina3221_resume, NULL) +}; + +static const struct of_device_id ina3221_of_match_table[] = { + { .compatible = "ti,wb_ina3221", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ina3221_of_match_table); + +static const struct i2c_device_id ina3221_ids[] = { + { "wb_ina3221", 0 }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(i2c, ina3221_ids); + +static struct i2c_driver ina3221_i2c_driver = { + .probe_new = ina3221_probe, + .remove = ina3221_remove, + .driver = { + .name = INA3221_DRIVER_NAME, + .of_match_table = ina3221_of_match_table, + .pm = &ina3221_pm, + }, + .id_table = ina3221_ids, +}; +module_i2c_driver(ina3221_i2c_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Texas Instruments INA3221 HWMon Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c new file mode 100644 index 0000000000..2797a831bd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_isl68137.c @@ -0,0 +1,572 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Hardware monitoring driver for Renesas Digital Multiphase Voltage Regulators + * + * Copyright (c) 2017 Google Inc + * Copyright (c) 2020 Renesas Electronics America + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_pmbus.h" + +#define ISL68137_VOUT_AVS (0x30) +#define RAA_DMPVR2_READ_VMON (0xc8) +#define WRITE_PROTECT_CLOSE (0x00) +#define WRITE_PROTECT_OPEN (0x40) + +static int g_wb_isl68137_debug = 0; +static int g_wb_isl68137_error = 0; + +module_param(g_wb_isl68137_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_isl68137_error, int, S_IRUGO | S_IWUSR); + +#define WB_ISL68137_VERBOSE(fmt, args...) do { \ + if (g_wb_isl68137_debug) { \ + printk(KERN_INFO "[WB_ISL68137][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_ISL68137_ERROR(fmt, args...) do { \ + if (g_wb_isl68137_error) { \ + printk(KERN_ERR "[WB_ISL68137][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +enum chips { + isl68137, + isl68220, + isl68221, + isl68222, + isl68223, + isl68224, + isl68225, + isl68226, + isl68227, + isl68229, + isl68233, + isl68239, + isl69222, + isl69223, + isl69224, + isl69225, + isl69227, + isl69228, + isl69234, + isl69236, + isl69239, + isl69242, + isl69243, + isl69247, + isl69248, + isl69254, + isl69255, + isl69256, + isl69259, + isl69260, + isl69268, + isl69269, + isl69298, + raa228000, + raa228004, + raa228006, + raa228228, + raa229001, + raa229004, +}; + +enum variants { + raa_dmpvr1_2rail, + raa_dmpvr2_1rail, + raa_dmpvr2_2rail, + raa_dmpvr2_2rail_nontc, + raa_dmpvr2_3rail, + raa_dmpvr2_hv, +}; + +static const struct i2c_device_id raa_dmpvr_id[]; + +static ssize_t isl68137_avs_enable_show_page(struct i2c_client *client, + int page, + char *buf) +{ + int val = wb_pmbus_read_byte_data(client, page, PMBUS_OPERATION); + + return sprintf(buf, "%d\n", + (val & ISL68137_VOUT_AVS) == ISL68137_VOUT_AVS ? 1 : 0); +} + +static ssize_t isl68137_avs_enable_store_page(struct i2c_client *client, + int page, + const char *buf, size_t count) +{ + int rc, op_val; + bool result; + + rc = kstrtobool(buf, &result); + if (rc) + return rc; + + op_val = result ? ISL68137_VOUT_AVS : 0; + + /* + * Writes to VOUT setpoint over AVSBus will persist after the VRM is + * switched to PMBus control. Switching back to AVSBus control + * restores this persisted setpoint rather than re-initializing to + * PMBus VOUT_COMMAND. Writing VOUT_COMMAND first over PMBus before + * enabling AVS control is the workaround. + */ + if (op_val == ISL68137_VOUT_AVS) { + rc = wb_pmbus_read_word_data(client, page, 0xff, + PMBUS_VOUT_COMMAND); + if (rc < 0) + return rc; + + rc = wb_pmbus_write_word_data(client, page, PMBUS_VOUT_COMMAND, + rc); + if (rc < 0) + return rc; + } + + rc = wb_pmbus_update_byte_data(client, page, PMBUS_OPERATION, + ISL68137_VOUT_AVS, op_val); + + return (rc < 0) ? rc : count; +} + +static ssize_t isl68137_avs_enable_show(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + + return isl68137_avs_enable_show_page(client, attr->index, buf); +} + +static ssize_t isl68137_avs_enable_store(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + + return isl68137_avs_enable_store_page(client, attr->index, buf, count); +} + +static ssize_t isl68137_avs_vout_show(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int ret, vout_cmd, vout; + + mutex_lock(&data->update_lock); + vout_cmd = wb_pmbus_read_word_data(client, attr->index, 0xff, PMBUS_VOUT_COMMAND); + if (vout_cmd < 0) { + WB_ISL68137_ERROR("%d-%04x: read page%d vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, attr->index, PMBUS_VOUT_COMMAND, ret); + mutex_unlock(&data->update_lock); + return vout_cmd; + } + vout = vout_cmd * 1000; + WB_ISL68137_VERBOSE("%d-%04x: page%d, vout: %d, vout_cmd: 0x%x\n", client->adapter->nr, + client->addr, attr->index, vout, vout_cmd); + mutex_unlock(&data->update_lock); + return snprintf(buf, PAGE_SIZE, "%d\n", vout); +} + +static ssize_t isl68137_avs_vout_store(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int vout, vout_max, vout_min; + int ret, vout_cmd, vout_cmd_set; + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &vout); + if (ret) { + WB_ISL68137_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + vout_max = data->vout_max[attr->index]; + vout_min = data->vout_min[attr->index]; + if ((vout > vout_max) || (vout < vout_min)) { + WB_ISL68137_ERROR("%d-%04x: vout value: %d, out of range [%d, %d] \n", client->adapter->nr, + client->addr, vout, vout_min, vout_max); + return -EINVAL; + } + + /* calc VOUT_COMMAND set value */ + vout_cmd_set = vout / 1000; + if (vout_cmd_set > 0xffff) { + WB_ISL68137_ERROR("%d-%04x: invalid value, vout %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, vout, vout_cmd_set); + return -EINVAL; + } + + mutex_lock(&data->update_lock); + + /* close write protect */ + ret = wb_pmbus_write_byte_data(client, attr->index, PMBUS_WRITE_PROTECT, WRITE_PROTECT_CLOSE); + if (ret < 0) { + WB_ISL68137_ERROR("%d-%04x: close page%d write protect failed, ret: %d\n", client->adapter->nr, + client->addr, attr->index, ret); + mutex_unlock(&data->update_lock); + return ret; + } + + /* set VOUT_COMMAND */ + ret = wb_pmbus_write_word_data(client, attr->index, PMBUS_VOUT_COMMAND, vout_cmd_set); + if (ret < 0) { + WB_ISL68137_ERROR("%d-%04x: set page%d vout cmd reg: 0x%x, value: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, attr->index, PMBUS_VOUT_COMMAND, vout_cmd_set, ret); + goto error; + } + + /* read back VOUT_COMMAND */ + vout_cmd = wb_pmbus_read_word_data(client, attr->index, 0xff, PMBUS_VOUT_COMMAND); + if (vout_cmd < 0) { + ret = vout_cmd; + WB_ISL68137_ERROR("%d-%04x: read page%d vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, attr->index, PMBUS_VOUT_COMMAND, ret); + goto error; + } + + /* compare vout_cmd and vout_cmd_set */ + if (vout_cmd != vout_cmd_set) { + ret = -EIO; + WB_ISL68137_ERROR("%d-%04x: vout cmd value check error, vout cmd read: 0x%x, vout cmd set: 0x%x\n", + client->adapter->nr, client->addr, vout_cmd, vout_cmd_set); + goto error; + } + + /* open write protect */ + wb_pmbus_write_byte_data(client, attr->index, PMBUS_WRITE_PROTECT, WRITE_PROTECT_OPEN); + mutex_unlock(&data->update_lock); + WB_ISL68137_VERBOSE("%d-%04x: set page%d vout cmd success, vout %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, attr->index, vout, vout_cmd_set); + return count; +error: + wb_pmbus_write_byte_data(client, attr->index, PMBUS_WRITE_PROTECT, WRITE_PROTECT_OPEN); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t isl68137_avs_vout_max_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int ret, vout_threshold; + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &vout_threshold); + if (ret) { + WB_ISL68137_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + WB_ISL68137_VERBOSE("%d-%04x: vout%d max threshold: %d", client->adapter->nr, client->addr, + attr->index, vout_threshold); + + data->vout_max[attr->index] = vout_threshold; + return count; +} + +static ssize_t isl68137_avs_vout_max_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + return snprintf(buf, PAGE_SIZE, "%d\n", data->vout_max[attr->index]); +} + +static ssize_t isl68137_avs_vout_min_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + int ret, vout_threshold; + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + ret = kstrtoint(buf, 0, &vout_threshold); + if (ret) { + WB_ISL68137_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + WB_ISL68137_VERBOSE("%d-%04x: vout%d min threshold: %d", client->adapter->nr, client->addr, + attr->index, vout_threshold); + + data->vout_min[attr->index] = vout_threshold; + return count; +} + +static ssize_t isl68137_avs_vout_min_show(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + if ((attr->index < 0) || (attr->index >= PMBUS_PAGES)) { + WB_ISL68137_ERROR("%d-%04x: invalid index: %d \n", client->adapter->nr, client->addr, + attr->index); + return -EINVAL; + } + + return snprintf(buf, PAGE_SIZE, "%d\n", data->vout_min[attr->index]); +} + +static SENSOR_DEVICE_ATTR_RW(avs0_enable, isl68137_avs_enable, 0); +static SENSOR_DEVICE_ATTR_RW(avs1_enable, isl68137_avs_enable, 1); + +static SENSOR_DEVICE_ATTR_RW(avs0_vout, isl68137_avs_vout, 0); +static SENSOR_DEVICE_ATTR_RW(avs1_vout, isl68137_avs_vout, 1); +static SENSOR_DEVICE_ATTR_RW(avs0_vout_max, isl68137_avs_vout_max, 0); +static SENSOR_DEVICE_ATTR_RW(avs0_vout_min, isl68137_avs_vout_min, 0); +static SENSOR_DEVICE_ATTR_RW(avs1_vout_max, isl68137_avs_vout_max, 1); +static SENSOR_DEVICE_ATTR_RW(avs1_vout_min, isl68137_avs_vout_min, 1); + +static struct attribute *enable_attrs[] = { + &sensor_dev_attr_avs0_enable.dev_attr.attr, + &sensor_dev_attr_avs1_enable.dev_attr.attr, + NULL, +}; + +static struct attribute *avs_ctrl_attrs[] = { + &sensor_dev_attr_avs0_vout.dev_attr.attr, + &sensor_dev_attr_avs1_vout.dev_attr.attr, + &sensor_dev_attr_avs0_vout_max.dev_attr.attr, + &sensor_dev_attr_avs0_vout_min.dev_attr.attr, + &sensor_dev_attr_avs1_vout_max.dev_attr.attr, + &sensor_dev_attr_avs1_vout_min.dev_attr.attr, + NULL, +}; + +static const struct attribute_group enable_group = { + .attrs = enable_attrs, +}; + +static const struct attribute_group avs_ctrl_group = { + .attrs = avs_ctrl_attrs, +}; + +static const struct attribute_group *isl68137_attribute_groups[] = { + &enable_group, + &avs_ctrl_group, + NULL, +}; + +static int raa_dmpvr2_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + int ret; + + switch (reg) { + case PMBUS_VIRT_READ_VMON: + ret = wb_pmbus_read_word_data(client, page, phase, + RAA_DMPVR2_READ_VMON); + break; + default: + ret = -ENODATA; + break; + } + + return ret; +} + +static struct pmbus_driver_info raa_dmpvr_info = { + .pages = 3, + .format[PSC_VOLTAGE_IN] = direct, + .format[PSC_VOLTAGE_OUT] = direct, + .format[PSC_CURRENT_IN] = direct, + .format[PSC_CURRENT_OUT] = direct, + .format[PSC_POWER] = direct, + .format[PSC_TEMPERATURE] = direct, + .m[PSC_VOLTAGE_IN] = 1, + .b[PSC_VOLTAGE_IN] = 0, + .R[PSC_VOLTAGE_IN] = 2, + .m[PSC_VOLTAGE_OUT] = 1, + .b[PSC_VOLTAGE_OUT] = 0, + .R[PSC_VOLTAGE_OUT] = 3, + .m[PSC_CURRENT_IN] = 1, + .b[PSC_CURRENT_IN] = 0, + .R[PSC_CURRENT_IN] = 2, + .m[PSC_CURRENT_OUT] = 1, + .b[PSC_CURRENT_OUT] = 0, + .R[PSC_CURRENT_OUT] = 1, + .m[PSC_POWER] = 1, + .b[PSC_POWER] = 0, + .R[PSC_POWER] = 0, + .m[PSC_TEMPERATURE] = 1, + .b[PSC_TEMPERATURE] = 0, + .R[PSC_TEMPERATURE] = 0, + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN + | PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 + | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP + | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT + | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT + | PMBUS_HAVE_VMON, + .func[1] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT + | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP + | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT + | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT, + .func[2] = PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT + | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP3 | PMBUS_HAVE_STATUS_TEMP + | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_IOUT + | PMBUS_HAVE_STATUS_IOUT | PMBUS_HAVE_POUT, +}; + +static int isl68137_probe(struct i2c_client *client) +{ + struct pmbus_driver_info *info; + + info = devm_kzalloc(&client->dev, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + memcpy(info, &raa_dmpvr_info, sizeof(*info)); + + switch (i2c_match_id(raa_dmpvr_id, client)->driver_data) { + case raa_dmpvr1_2rail: + info->pages = 2; + info->R[PSC_VOLTAGE_IN] = 3; + info->func[0] &= ~PMBUS_HAVE_VMON; + info->func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT + | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT + | PMBUS_HAVE_POUT; + info->groups = isl68137_attribute_groups; + break; + case raa_dmpvr2_1rail: + info->pages = 1; + info->read_word_data = raa_dmpvr2_read_word_data; + break; + case raa_dmpvr2_2rail_nontc: + info->func[0] &= ~PMBUS_HAVE_TEMP3; + info->func[1] &= ~PMBUS_HAVE_TEMP3; + fallthrough; + case raa_dmpvr2_2rail: + info->pages = 2; + info->read_word_data = raa_dmpvr2_read_word_data; + break; + case raa_dmpvr2_3rail: + info->read_word_data = raa_dmpvr2_read_word_data; + break; + case raa_dmpvr2_hv: + info->pages = 1; + info->R[PSC_VOLTAGE_IN] = 1; + info->m[PSC_VOLTAGE_OUT] = 2; + info->R[PSC_VOLTAGE_OUT] = 2; + info->m[PSC_CURRENT_IN] = 2; + info->m[PSC_POWER] = 2; + info->R[PSC_POWER] = -1; + info->read_word_data = raa_dmpvr2_read_word_data; + break; + default: + return -ENODEV; + } + + return wb_pmbus_do_probe(client, info); +} + +static const struct i2c_device_id raa_dmpvr_id[] = { + {"wb_isl68127", raa_dmpvr1_2rail}, + {"wb_isl68137", raa_dmpvr1_2rail}, + {"wb_isl68220", raa_dmpvr2_2rail}, + {"wb_isl68221", raa_dmpvr2_3rail}, + {"wb_isl68222", raa_dmpvr2_2rail}, + {"wb_isl68223", raa_dmpvr2_2rail}, + {"wb_isl68224", raa_dmpvr2_3rail}, + {"wb_isl68225", raa_dmpvr2_2rail}, + {"wb_isl68226", raa_dmpvr2_3rail}, + {"wb_isl68227", raa_dmpvr2_1rail}, + {"wb_isl68229", raa_dmpvr2_3rail}, + {"wb_isl68233", raa_dmpvr2_2rail}, + {"wb_isl68239", raa_dmpvr2_3rail}, + + {"wb_isl69222", raa_dmpvr2_2rail}, + {"wb_isl69223", raa_dmpvr2_3rail}, + {"wb_isl69224", raa_dmpvr2_2rail}, + {"wb_isl69225", raa_dmpvr2_2rail}, + {"wb_isl69227", raa_dmpvr2_3rail}, + {"wb_isl69228", raa_dmpvr2_3rail}, + {"wb_isl69234", raa_dmpvr2_2rail}, + {"wb_isl69236", raa_dmpvr2_2rail}, + {"wb_isl69239", raa_dmpvr2_3rail}, + {"wb_isl69242", raa_dmpvr2_2rail}, + {"wb_isl69243", raa_dmpvr2_1rail}, + {"wb_isl69247", raa_dmpvr2_2rail}, + {"wb_isl69248", raa_dmpvr2_2rail}, + {"wb_isl69254", raa_dmpvr2_2rail}, + {"wb_isl69255", raa_dmpvr2_2rail}, + {"wb_isl69256", raa_dmpvr2_2rail}, + {"wb_isl69259", raa_dmpvr2_2rail}, + {"wb_isl69260", raa_dmpvr2_2rail}, + {"wb_isl69268", raa_dmpvr2_2rail}, + {"wb_isl69269", raa_dmpvr2_3rail}, + {"wb_isl69298", raa_dmpvr2_2rail}, + + {"wb_raa228000", raa_dmpvr2_hv}, + {"wb_raa228004", raa_dmpvr2_hv}, + {"wb_raa228006", raa_dmpvr2_hv}, + {"wb_raa228228", raa_dmpvr2_2rail_nontc}, + {"wb_raa229001", raa_dmpvr2_2rail}, + {"wb_raa229004", raa_dmpvr2_2rail}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, raa_dmpvr_id); + +/* This is the driver that will be inserted */ +static struct i2c_driver isl68137_driver = { + .driver = { + .name = "wb_isl68137", + }, + .probe_new = isl68137_probe, + .remove = wb_pmbus_do_remove, + .id_table = raa_dmpvr_id, +}; + +module_i2c_driver(isl68137_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus driver for Renesas digital multiphase voltage regulators"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c new file mode 100644 index 0000000000..b8291c5536 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.c @@ -0,0 +1,987 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * lm75.c - Part of lm_sensors, Linux kernel modules for hardware + * monitoring + * Copyright (c) 1998, 1999 Frodo Looijaard + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_lm75.h" + +/* + * This driver handles the LM75 and compatible digital temperature sensors. + */ + +enum lm75_type { /* keep sorted in alphabetical order */ + adt75, + ds1775, + ds75, + ds7505, + g751, + lm75, + lm75a, + lm75b, + max6625, + max6626, + max31725, + mcp980x, + pct2075, + stds75, + stlm75, + tcn75, + tmp100, + tmp101, + tmp105, + tmp112, + tmp175, + tmp275, + tmp75, + tmp75b, + tmp75c, +}; + +/** + * struct lm75_params - lm75 configuration parameters. + * @set_mask: Bits to set in configuration register when configuring + * the chip. + * @clr_mask: Bits to clear in configuration register when configuring + * the chip. + * @default_resolution: Default number of bits to represent the temperature + * value. + * @resolution_limits: Limit register resolution. Optional. Should be set if + * the resolution of limit registers does not match the + * resolution of the temperature register. + * @resolutions: List of resolutions associated with sample times. + * Optional. Should be set if num_sample_times is larger + * than 1, and if the resolution changes with sample times. + * If set, number of entries must match num_sample_times. + * @default_sample_time:Sample time to be set by default. + * @num_sample_times: Number of possible sample times to be set. Optional. + * Should be set if the number of sample times is larger + * than one. + * @sample_times: All the possible sample times to be set. Mandatory if + * num_sample_times is larger than 1. If set, number of + * entries must match num_sample_times. + */ + +struct lm75_params { + u8 set_mask; + u8 clr_mask; + u8 default_resolution; + u8 resolution_limits; + const u8 *resolutions; + unsigned int default_sample_time; + u8 num_sample_times; + const unsigned int *sample_times; +}; +#if 0 +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, + 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; +#endif +/* The LM75 registers */ +#define LM75_REG_TEMP 0x00 +#define LM75_REG_CONF 0x01 +#define LM75_REG_HYST 0x02 +#define LM75_REG_MAX 0x03 +#define PCT2075_REG_IDLE 0x04 +#define LM75_TEMP_INVALID_RETRY_TIMES (3) + +/* Each client has this additional data */ +struct lm75_data { + struct i2c_client *client; + struct regmap *regmap; + struct regulator *vs; + u8 orig_conf; + u8 current_conf; + u8 resolution; /* In bits, 9 to 16 */ + unsigned int sample_time; /* In ms */ + enum lm75_type kind; + const struct lm75_params *params; +}; + +/*-----------------------------------------------------------------------*/ + +static const u8 lm75_sample_set_masks[] = { 0 << 5, 1 << 5, 2 << 5, 3 << 5 }; + +#define LM75_SAMPLE_CLEAR_MASK (3 << 5) + +/* The structure below stores the configuration values of the supported devices. + * In case of being supported multiple configurations, the default one must + * always be the first element of the array + */ +static const struct lm75_params device_params[] = { + [adt75] = { + .clr_mask = 1 << 5, /* not one-shot mode */ + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [ds1775] = { + .clr_mask = 3 << 5, + .set_mask = 2 << 5, /* 11-bit mode */ + .default_resolution = 11, + .default_sample_time = 500, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 125, 250, 500, 1000 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [ds75] = { + .clr_mask = 3 << 5, + .set_mask = 2 << 5, /* 11-bit mode */ + .default_resolution = 11, + .default_sample_time = 600, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 150, 300, 600, 1200 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [stds75] = { + .clr_mask = 3 << 5, + .set_mask = 2 << 5, /* 11-bit mode */ + .default_resolution = 11, + .default_sample_time = 600, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 150, 300, 600, 1200 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [stlm75] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 6, + }, + [ds7505] = { + .set_mask = 3 << 5, /* 12-bit mode*/ + .default_resolution = 12, + .default_sample_time = 200, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 25, 50, 100, 200 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [g751] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [lm75] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [lm75a] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [lm75b] = { + .default_resolution = 11, + .default_sample_time = MSEC_PER_SEC / 10, + }, + [max6625] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 7, + }, + [max6626] = { + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 7, + .resolution_limits = 9, + }, + [max31725] = { + .default_resolution = 16, + .default_sample_time = MSEC_PER_SEC / 20, + }, + [tcn75] = { + .default_resolution = 9, + .default_sample_time = MSEC_PER_SEC / 18, + }, + [pct2075] = { + .default_resolution = 11, + .default_sample_time = MSEC_PER_SEC / 10, + .num_sample_times = 31, + .sample_times = (unsigned int []){ 100, 200, 300, 400, 500, 600, + 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, + 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, + 2800, 2900, 3000, 3100 }, + }, + [mcp980x] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode */ + .default_resolution = 12, + .resolution_limits = 9, + .default_sample_time = 240, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 30, 60, 120, 240 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp100] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode */ + .default_resolution = 12, + .default_sample_time = 320, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 40, 80, 160, 320 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp101] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode */ + .default_resolution = 12, + .default_sample_time = 320, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 40, 80, 160, 320 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp105] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp112] = { + .set_mask = 3 << 5, /* 8 samples / second */ + .clr_mask = 1 << 7, /* no one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 125, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 125, 250, 1000, 4000 }, + }, + [tmp175] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp275] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp75] = { + .set_mask = 3 << 5, /* 12-bit mode */ + .clr_mask = 1 << 7, /* not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = 220, + .num_sample_times = 4, + .sample_times = (unsigned int []){ 28, 55, 110, 220 }, + .resolutions = (u8 []) {9, 10, 11, 12 }, + }, + [tmp75b] = { /* not one-shot mode, Conversion rate 37Hz */ + .clr_mask = 1 << 7 | 3 << 5, + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 37, + .sample_times = (unsigned int []){ MSEC_PER_SEC / 37, + MSEC_PER_SEC / 18, + MSEC_PER_SEC / 9, MSEC_PER_SEC / 4 }, + .num_sample_times = 4, + }, + [tmp75c] = { + .clr_mask = 1 << 5, /*not one-shot mode*/ + .default_resolution = 12, + .default_sample_time = MSEC_PER_SEC / 12, + } +}; + +/* input temp threshold check */ +typedef struct lm75_temp_threshold_s { + int chip_type; + int temp_max; + int temp_min; +} lm75_temp_threshold_t; + +static lm75_temp_threshold_t g_lm75_temp_threshold_info[] = { + { + .chip_type = lm75, + .temp_max = 125000, + .temp_min = -55000, + }, +}; + +/*-----------------------------------------------------------------------*/ +static int lm75_input_temp_check(struct lm75_data *data, int input_val) +{ + int i, size; + + size = ARRAY_SIZE(g_lm75_temp_threshold_info); + + for (i = 0; i < size; i++) { + if (g_lm75_temp_threshold_info[i].chip_type == data->kind) { + if ((input_val > g_lm75_temp_threshold_info[i].temp_max) + || (input_val < g_lm75_temp_threshold_info[i].temp_min)) { + dev_dbg(&data->client->dev, "input temp: %d not in range[%d, %d]\n", + input_val, g_lm75_temp_threshold_info[i].temp_min, + g_lm75_temp_threshold_info[i].temp_max); + return -EINVAL; + } + dev_dbg(&data->client->dev, "input temp: %d in range[%d, %d]", input_val, + g_lm75_temp_threshold_info[i].temp_min, g_lm75_temp_threshold_info[i].temp_max); + return 0; + } + } + return 0; +} + +static inline long lm75_reg_to_mc(s16 temp, u8 resolution) +{ + return ((temp >> (16 - resolution)) * 1000) >> (resolution - 8); +} + +static int lm75_write_config(struct lm75_data *data, u8 set_mask, + u8 clr_mask) +{ + u8 value; + + clr_mask |= LM75_SHUTDOWN; + value = data->current_conf & ~clr_mask; + value |= set_mask; + + if (data->current_conf != value) { + s32 err; + + err = i2c_smbus_write_byte_data(data->client, LM75_REG_CONF, + value); + if (err) + return err; + data->current_conf = value; + } + return 0; +} + +static int lm75_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, + long *val) +{ + struct lm75_data *data = dev_get_drvdata(dev); + unsigned int regval; + int err, reg, i, ret; + + switch (type) { + case hwmon_chip: + switch (attr) { + case hwmon_chip_update_interval: + *val = data->sample_time; + break; + default: + return -EINVAL; + } + break; + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + reg = LM75_REG_TEMP; + break; + case hwmon_temp_max: + reg = LM75_REG_MAX; + break; + case hwmon_temp_max_hyst: + reg = LM75_REG_HYST; + break; + default: + return -EINVAL; + } + for (i = 0; i < LM75_TEMP_INVALID_RETRY_TIMES; i++) { + err = regmap_read(data->regmap, reg, ®val); + if (err < 0) { + return err; + } + *val = lm75_reg_to_mc(regval, data->resolution); + if (attr != LM75_REG_TEMP) { + return 0; + } + /* do input_temp_check */ + ret = lm75_input_temp_check(data, *val); + if (ret == 0) { /* input temp check ok */ + return 0; + } + if ((i + 1) < LM75_TEMP_INVALID_RETRY_TIMES) { + msleep(data->sample_time); + } + } + dev_info(&data->client->dev, "temp_input value: %ld invalid\n", *val); + return -EINVAL; + default: + return -EINVAL; + } + return 0; +} + +static int lm75_write_temp(struct device *dev, u32 attr, long temp) +{ + struct lm75_data *data = dev_get_drvdata(dev); + u8 resolution; + int reg; + + switch (attr) { + case hwmon_temp_max: + reg = LM75_REG_MAX; + break; + case hwmon_temp_max_hyst: + reg = LM75_REG_HYST; + break; + default: + return -EINVAL; + } + + /* + * Resolution of limit registers is assumed to be the same as the + * temperature input register resolution unless given explicitly. + */ + if (data->params->resolution_limits) + resolution = data->params->resolution_limits; + else + resolution = data->resolution; + + temp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX); + temp = DIV_ROUND_CLOSEST(temp << (resolution - 8), + 1000) << (16 - resolution); + + return regmap_write(data->regmap, reg, (u16)temp); +} + +static int lm75_update_interval(struct device *dev, long val) +{ + struct lm75_data *data = dev_get_drvdata(dev); + unsigned int reg; + u8 index; + s32 err; + + index = find_closest(val, data->params->sample_times, + (int)data->params->num_sample_times); + + switch (data->kind) { + default: + err = lm75_write_config(data, lm75_sample_set_masks[index], + LM75_SAMPLE_CLEAR_MASK); + if (err) + return err; + + data->sample_time = data->params->sample_times[index]; + if (data->params->resolutions) + data->resolution = data->params->resolutions[index]; + break; + case tmp112: + err = regmap_read(data->regmap, LM75_REG_CONF, ®); + if (err < 0) + return err; + reg &= ~0x00c0; + reg |= (3 - index) << 6; + err = regmap_write(data->regmap, LM75_REG_CONF, reg); + if (err < 0) + return err; + data->sample_time = data->params->sample_times[index]; + break; + case pct2075: + err = i2c_smbus_write_byte_data(data->client, PCT2075_REG_IDLE, + index + 1); + if (err) + return err; + data->sample_time = data->params->sample_times[index]; + break; + } + return 0; +} + +static int lm75_write_chip(struct device *dev, u32 attr, long val) +{ + switch (attr) { + case hwmon_chip_update_interval: + return lm75_update_interval(dev, val); + default: + return -EINVAL; + } + return 0; +} + +static int lm75_write(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long val) +{ + switch (type) { + case hwmon_chip: + return lm75_write_chip(dev, attr, val); + case hwmon_temp: + return lm75_write_temp(dev, attr, val); + default: + return -EINVAL; + } + return 0; +} + +static umode_t lm75_is_visible(const void *data, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct lm75_data *config_data = data; + + switch (type) { + case hwmon_chip: + switch (attr) { + case hwmon_chip_update_interval: + if (config_data->params->num_sample_times > 1) + return 0644; + return 0444; + } + break; + case hwmon_temp: + switch (attr) { + case hwmon_temp_input: + return 0444; + case hwmon_temp_max: + case hwmon_temp_max_hyst: + return 0644; + } + break; + default: + break; + } + return 0; +} + +static const struct hwmon_channel_info *lm75_info[] = { + HWMON_CHANNEL_INFO(chip, + HWMON_C_REGISTER_TZ | HWMON_C_UPDATE_INTERVAL), + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST), + NULL +}; + +static const struct hwmon_ops lm75_hwmon_ops = { + .is_visible = lm75_is_visible, + .read = lm75_read, + .write = lm75_write, +}; + +static const struct hwmon_chip_info lm75_chip_info = { + .ops = &lm75_hwmon_ops, + .info = lm75_info, +}; + +static bool lm75_is_writeable_reg(struct device *dev, unsigned int reg) +{ + return reg != LM75_REG_TEMP; +} + +static bool lm75_is_volatile_reg(struct device *dev, unsigned int reg) +{ + return reg == LM75_REG_TEMP || reg == LM75_REG_CONF; +} + +static const struct regmap_config lm75_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + .max_register = PCT2075_REG_IDLE, + .writeable_reg = lm75_is_writeable_reg, + .volatile_reg = lm75_is_volatile_reg, + .val_format_endian = REGMAP_ENDIAN_BIG, + .cache_type = REGCACHE_RBTREE, + .use_single_read = true, + .use_single_write = true, +}; + +static void lm75_disable_regulator(void *data) +{ + struct lm75_data *lm75 = data; + + regulator_disable(lm75->vs); +} + +static void lm75_remove(void *data) +{ + struct lm75_data *lm75 = data; + struct i2c_client *client = lm75->client; + + i2c_smbus_write_byte_data(client, LM75_REG_CONF, lm75->orig_conf); +} + +static const struct i2c_device_id lm75_ids[]; + +static int lm75_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct device *hwmon_dev; + struct lm75_data *data; + int status, err; + enum lm75_type kind; + + if (client->dev.of_node) + kind = (enum lm75_type)of_device_get_match_data(&client->dev); + else + kind = i2c_match_id(lm75_ids, client)->driver_data; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = devm_kzalloc(dev, sizeof(struct lm75_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->client = client; + data->kind = kind; + + data->vs = devm_regulator_get(dev, "vs"); + if (IS_ERR(data->vs)) + return PTR_ERR(data->vs); + + data->regmap = devm_regmap_init_i2c(client, &lm75_regmap_config); + if (IS_ERR(data->regmap)) + return PTR_ERR(data->regmap); + + /* Set to LM75 resolution (9 bits, 1/2 degree C) and range. + * Then tweak to be more precise when appropriate. + */ + + data->params = &device_params[data->kind]; + + /* Save default sample time and resolution*/ + data->sample_time = data->params->default_sample_time; + data->resolution = data->params->default_resolution; + + /* Enable the power */ + err = regulator_enable(data->vs); + if (err) { + dev_err(dev, "failed to enable regulator: %d\n", err); + return err; + } + + err = devm_add_action_or_reset(dev, lm75_disable_regulator, data); + if (err) + return err; + + /* Cache original configuration */ + status = i2c_smbus_read_byte_data(client, LM75_REG_CONF); + if (status < 0) { + dev_dbg(dev, "Can't read config? %d\n", status); + return status; + } + data->orig_conf = status; + data->current_conf = status; + + err = lm75_write_config(data, data->params->set_mask, + data->params->clr_mask); + if (err) + return err; + + err = devm_add_action_or_reset(dev, lm75_remove, data); + if (err) + return err; + + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, + data, &lm75_chip_info, + NULL); + if (IS_ERR(hwmon_dev)) + return PTR_ERR(hwmon_dev); + + dev_info(dev, "%s: sensor '%s'\n", dev_name(hwmon_dev), client->name); + + return 0; +} + +static const struct i2c_device_id lm75_ids[] = { + { "wb_adt75", adt75, }, + { "wb_ds1775", ds1775, }, + { "wb_ds75", ds75, }, + { "wb_ds7505", ds7505, }, + { "wb_g751", g751, }, + { "wb_lm75", lm75, }, + { "wb_lm75a", lm75a, }, + { "wb_lm75b", lm75b, }, + { "wb_max6625", max6625, }, + { "wb_max6626", max6626, }, + { "wb_max31725", max31725, }, + { "wb_max31726", max31725, }, + { "wb_mcp980x", mcp980x, }, + { "wb_pct2075", pct2075, }, + { "wb_stds75", stds75, }, + { "wb_stlm75", stlm75, }, + { "wb_tcn75", tcn75, }, + { "wb_tmp100", tmp100, }, + { "wb_tmp101", tmp101, }, + { "wb_tmp105", tmp105, }, + { "wb_tmp112", tmp112, }, + { "wb_tmp175", tmp175, }, + { "wb_tmp275", tmp275, }, + { "wb_tmp75", tmp75, }, + { "wb_tmp75b", tmp75b, }, + { "wb_tmp75c", tmp75c, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, lm75_ids); + +static const struct of_device_id __maybe_unused lm75_of_match[] = { + { + .compatible = "adi,adt75", + .data = (void *)adt75 + }, + { + .compatible = "dallas,ds1775", + .data = (void *)ds1775 + }, + { + .compatible = "dallas,ds75", + .data = (void *)ds75 + }, + { + .compatible = "dallas,ds7505", + .data = (void *)ds7505 + }, + { + .compatible = "gmt,g751", + .data = (void *)g751 + }, + { + .compatible = "national,lm75", + .data = (void *)lm75 + }, + { + .compatible = "national,lm75a", + .data = (void *)lm75a + }, + { + .compatible = "national,lm75b", + .data = (void *)lm75b + }, + { + .compatible = "maxim,max6625", + .data = (void *)max6625 + }, + { + .compatible = "maxim,max6626", + .data = (void *)max6626 + }, + { + .compatible = "maxim,max31725", + .data = (void *)max31725 + }, + { + .compatible = "maxim,max31726", + .data = (void *)max31725 + }, + { + .compatible = "maxim,mcp980x", + .data = (void *)mcp980x + }, + { + .compatible = "nxp,pct2075", + .data = (void *)pct2075 + }, + { + .compatible = "st,stds75", + .data = (void *)stds75 + }, + { + .compatible = "st,stlm75", + .data = (void *)stlm75 + }, + { + .compatible = "microchip,tcn75", + .data = (void *)tcn75 + }, + { + .compatible = "ti,tmp100", + .data = (void *)tmp100 + }, + { + .compatible = "ti,tmp101", + .data = (void *)tmp101 + }, + { + .compatible = "ti,tmp105", + .data = (void *)tmp105 + }, + { + .compatible = "ti,tmp112", + .data = (void *)tmp112 + }, + { + .compatible = "ti,tmp175", + .data = (void *)tmp175 + }, + { + .compatible = "ti,tmp275", + .data = (void *)tmp275 + }, + { + .compatible = "ti,tmp75", + .data = (void *)tmp75 + }, + { + .compatible = "ti,tmp75b", + .data = (void *)tmp75b + }, + { + .compatible = "ti,tmp75c", + .data = (void *)tmp75c + }, + { }, +}; +MODULE_DEVICE_TABLE(of, lm75_of_match); + +#define LM75A_ID 0xA1 +#if 0 +/* Return 0 if detection is successful, -ENODEV otherwise */ +static int lm75_detect(struct i2c_client *new_client, + struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = new_client->adapter; + int i; + int conf, hyst, os; + bool is_lm75a = 0; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) + return -ENODEV; + + /* + * Now, we do the remaining detection. There is no identification- + * dedicated register so we have to rely on several tricks: + * unused bits, registers cycling over 8-address boundaries, + * addresses 0x04-0x07 returning the last read value. + * The cycling+unused addresses combination is not tested, + * since it would significantly slow the detection down and would + * hardly add any value. + * + * The National Semiconductor LM75A is different than earlier + * LM75s. It has an ID byte of 0xaX (where X is the chip + * revision, with 1 being the only revision in existence) in + * register 7, and unused registers return 0xff rather than the + * last read value. + * + * Note that this function only detects the original National + * Semiconductor LM75 and the LM75A. Clones from other vendors + * aren't detected, on purpose, because they are typically never + * found on PC hardware. They are found on embedded designs where + * they can be instantiated explicitly so detection is not needed. + * The absence of identification registers on all these clones + * would make their exhaustive detection very difficult and weak, + * and odds are that the driver would bind to unsupported devices. + */ + + /* Unused bits */ + conf = i2c_smbus_read_byte_data(new_client, 1); + if (conf & 0xe0) + return -ENODEV; + + /* First check for LM75A */ + if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) { + /* + * LM75A returns 0xff on unused registers so + * just to be sure we check for that too. + */ + if (i2c_smbus_read_byte_data(new_client, 4) != 0xff + || i2c_smbus_read_byte_data(new_client, 5) != 0xff + || i2c_smbus_read_byte_data(new_client, 6) != 0xff) + return -ENODEV; + is_lm75a = 1; + hyst = i2c_smbus_read_byte_data(new_client, 2); + os = i2c_smbus_read_byte_data(new_client, 3); + } else { /* Traditional style LM75 detection */ + /* Unused addresses */ + hyst = i2c_smbus_read_byte_data(new_client, 2); + if (i2c_smbus_read_byte_data(new_client, 4) != hyst + || i2c_smbus_read_byte_data(new_client, 5) != hyst + || i2c_smbus_read_byte_data(new_client, 6) != hyst + || i2c_smbus_read_byte_data(new_client, 7) != hyst) + return -ENODEV; + os = i2c_smbus_read_byte_data(new_client, 3); + if (i2c_smbus_read_byte_data(new_client, 4) != os + || i2c_smbus_read_byte_data(new_client, 5) != os + || i2c_smbus_read_byte_data(new_client, 6) != os + || i2c_smbus_read_byte_data(new_client, 7) != os) + return -ENODEV; + } + /* + * It is very unlikely that this is a LM75 if both + * hysteresis and temperature limit registers are 0. + */ + if (hyst == 0 && os == 0) + return -ENODEV; + + /* Addresses cycling */ + for (i = 8; i <= 248; i += 40) { + if (i2c_smbus_read_byte_data(new_client, i + 1) != conf + || i2c_smbus_read_byte_data(new_client, i + 2) != hyst + || i2c_smbus_read_byte_data(new_client, i + 3) != os) + return -ENODEV; + if (is_lm75a && i2c_smbus_read_byte_data(new_client, i + 7) + != LM75A_ID) + return -ENODEV; + } + + strlcpy(info->type, is_lm75a ? "lm75a" : "lm75", I2C_NAME_SIZE); + + return 0; +} +#endif + +#ifdef CONFIG_PM +static int lm75_suspend(struct device *dev) +{ + int status; + struct i2c_client *client = to_i2c_client(dev); + + status = i2c_smbus_read_byte_data(client, LM75_REG_CONF); + if (status < 0) { + dev_dbg(&client->dev, "Can't read config? %d\n", status); + return status; + } + status = status | LM75_SHUTDOWN; + i2c_smbus_write_byte_data(client, LM75_REG_CONF, status); + return 0; +} + +static int lm75_resume(struct device *dev) +{ + int status; + struct i2c_client *client = to_i2c_client(dev); + + status = i2c_smbus_read_byte_data(client, LM75_REG_CONF); + if (status < 0) { + dev_dbg(&client->dev, "Can't read config? %d\n", status); + return status; + } + status = status & ~LM75_SHUTDOWN; + i2c_smbus_write_byte_data(client, LM75_REG_CONF, status); + return 0; +} + +static const struct dev_pm_ops lm75_dev_pm_ops = { + .suspend = lm75_suspend, + .resume = lm75_resume, +}; +#define LM75_DEV_PM_OPS (&lm75_dev_pm_ops) +#else +#define LM75_DEV_PM_OPS NULL +#endif /* CONFIG_PM */ + +static struct i2c_driver lm75_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wb_lm75", + .of_match_table = of_match_ptr(lm75_of_match), + .pm = LM75_DEV_PM_OPS, + }, + .probe_new = lm75_probe, + .id_table = lm75_ids, + /* .detect = lm75_detect, */ + /* .address_list = normal_i2c, */ +}; + +module_i2c_driver(lm75_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("LM75 driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h new file mode 100644 index 0000000000..a398171162 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_lm75.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * lm75.h - Part of lm_sensors, Linux kernel modules for hardware monitoring + * Copyright (c) 2003 Mark M. Hoffman + */ + +/* + * This file contains common code for encoding/decoding LM75 type + * temperature readings, which are emulated by many of the chips + * we support. As the user is unlikely to load more than one driver + * which contains this code, we don't worry about the wasted space. + */ + +#include + +/* straight from the datasheet */ +#define LM75_TEMP_MIN (-55000) +#define LM75_TEMP_MAX 125000 +#define LM75_SHUTDOWN 0x01 + +/* + * TEMP: 0.001C/bit (-55C to +125C) + * REG: (0.5C/bit, two's complement) << 7 + */ +static inline u16 LM75_TEMP_TO_REG(long temp) +{ + int ntemp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX); + + ntemp += (ntemp < 0 ? -250 : 250); + return (u16)((ntemp / 500) << 7); +} + +static inline int LM75_TEMP_FROM_REG(u16 reg) +{ + /* + * use integer division instead of equivalent right shift to + * guarantee arithmetic shift and preserve the sign + */ + return ((s16)reg / 128) * 500; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h new file mode 100644 index 0000000000..9fb2c9017a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus.h @@ -0,0 +1,535 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * wb_pmbus.h - Common defines and structures for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + * Copyright (c) 2012 Guenter Roeck + */ + +#ifndef WB_PMBUS_H +#define WB_PMBUS_H + +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +/* + * Registers + */ +enum pmbus_regs { + PMBUS_PAGE = 0x00, + PMBUS_OPERATION = 0x01, + PMBUS_ON_OFF_CONFIG = 0x02, + PMBUS_CLEAR_FAULTS = 0x03, + PMBUS_PHASE = 0x04, + + PMBUS_WRITE_PROTECT = 0x10, + + PMBUS_CAPABILITY = 0x19, + PMBUS_QUERY = 0x1A, + + PMBUS_VOUT_MODE = 0x20, + PMBUS_VOUT_COMMAND = 0x21, + PMBUS_VOUT_TRIM = 0x22, + PMBUS_VOUT_CAL_OFFSET = 0x23, + PMBUS_VOUT_MAX = 0x24, + PMBUS_VOUT_MARGIN_HIGH = 0x25, + PMBUS_VOUT_MARGIN_LOW = 0x26, + PMBUS_VOUT_TRANSITION_RATE = 0x27, + PMBUS_VOUT_DROOP = 0x28, + PMBUS_VOUT_SCALE_LOOP = 0x29, + PMBUS_VOUT_SCALE_MONITOR = 0x2A, + + PMBUS_COEFFICIENTS = 0x30, + PMBUS_POUT_MAX = 0x31, + + PMBUS_FAN_CONFIG_12 = 0x3A, + PMBUS_FAN_COMMAND_1 = 0x3B, + PMBUS_FAN_COMMAND_2 = 0x3C, + PMBUS_FAN_CONFIG_34 = 0x3D, + PMBUS_FAN_COMMAND_3 = 0x3E, + PMBUS_FAN_COMMAND_4 = 0x3F, + + PMBUS_VOUT_OV_FAULT_LIMIT = 0x40, + PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41, + PMBUS_VOUT_OV_WARN_LIMIT = 0x42, + PMBUS_VOUT_UV_WARN_LIMIT = 0x43, + PMBUS_VOUT_UV_FAULT_LIMIT = 0x44, + PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45, + PMBUS_IOUT_OC_FAULT_LIMIT = 0x46, + PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47, + PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48, + PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49, + PMBUS_IOUT_OC_WARN_LIMIT = 0x4A, + PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B, + PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C, + + PMBUS_OT_FAULT_LIMIT = 0x4F, + PMBUS_OT_FAULT_RESPONSE = 0x50, + PMBUS_OT_WARN_LIMIT = 0x51, + PMBUS_UT_WARN_LIMIT = 0x52, + PMBUS_UT_FAULT_LIMIT = 0x53, + PMBUS_UT_FAULT_RESPONSE = 0x54, + PMBUS_VIN_OV_FAULT_LIMIT = 0x55, + PMBUS_VIN_OV_FAULT_RESPONSE = 0x56, + PMBUS_VIN_OV_WARN_LIMIT = 0x57, + PMBUS_VIN_UV_WARN_LIMIT = 0x58, + PMBUS_VIN_UV_FAULT_LIMIT = 0x59, + + PMBUS_IIN_OC_FAULT_LIMIT = 0x5B, + PMBUS_IIN_OC_WARN_LIMIT = 0x5D, + + PMBUS_POUT_OP_FAULT_LIMIT = 0x68, + PMBUS_POUT_OP_WARN_LIMIT = 0x6A, + PMBUS_PIN_OP_WARN_LIMIT = 0x6B, + + PMBUS_STATUS_BYTE = 0x78, + PMBUS_STATUS_WORD = 0x79, + PMBUS_STATUS_VOUT = 0x7A, + PMBUS_STATUS_IOUT = 0x7B, + PMBUS_STATUS_INPUT = 0x7C, + PMBUS_STATUS_TEMPERATURE = 0x7D, + PMBUS_STATUS_CML = 0x7E, + PMBUS_STATUS_OTHER = 0x7F, + PMBUS_STATUS_MFR_SPECIFIC = 0x80, + PMBUS_STATUS_FAN_12 = 0x81, + PMBUS_STATUS_FAN_34 = 0x82, + + PMBUS_READ_VIN = 0x88, + PMBUS_READ_IIN = 0x89, + PMBUS_READ_VCAP = 0x8A, + PMBUS_READ_VOUT = 0x8B, + PMBUS_READ_IOUT = 0x8C, + PMBUS_READ_TEMPERATURE_1 = 0x8D, + PMBUS_READ_TEMPERATURE_2 = 0x8E, + PMBUS_READ_TEMPERATURE_3 = 0x8F, + PMBUS_READ_FAN_SPEED_1 = 0x90, + PMBUS_READ_FAN_SPEED_2 = 0x91, + PMBUS_READ_FAN_SPEED_3 = 0x92, + PMBUS_READ_FAN_SPEED_4 = 0x93, + PMBUS_READ_DUTY_CYCLE = 0x94, + PMBUS_READ_FREQUENCY = 0x95, + PMBUS_READ_POUT = 0x96, + PMBUS_READ_PIN = 0x97, + + PMBUS_REVISION = 0x98, + PMBUS_MFR_ID = 0x99, + PMBUS_MFR_MODEL = 0x9A, + PMBUS_MFR_REVISION = 0x9B, + PMBUS_MFR_LOCATION = 0x9C, + PMBUS_MFR_DATE = 0x9D, + PMBUS_MFR_SERIAL = 0x9E, + + PMBUS_MFR_VIN_MIN = 0xA0, + PMBUS_MFR_VIN_MAX = 0xA1, + PMBUS_MFR_IIN_MAX = 0xA2, + PMBUS_MFR_PIN_MAX = 0xA3, + PMBUS_MFR_VOUT_MIN = 0xA4, + PMBUS_MFR_VOUT_MAX = 0xA5, + PMBUS_MFR_IOUT_MAX = 0xA6, + PMBUS_MFR_POUT_MAX = 0xA7, + + PMBUS_IC_DEVICE_ID = 0xAD, + PMBUS_IC_DEVICE_REV = 0xAE, + + PMBUS_MFR_MAX_TEMP_1 = 0xC0, + PMBUS_MFR_MAX_TEMP_2 = 0xC1, + PMBUS_MFR_MAX_TEMP_3 = 0xC2, + +/* + * Virtual registers. + * Useful to support attributes which are not supported by standard PMBus + * registers but exist as manufacturer specific registers on individual chips. + * Must be mapped to real registers in device specific code. + * + * Semantics: + * Virtual registers are all word size. + * READ registers are read-only; writes are either ignored or return an error. + * RESET registers are read/write. Reading reset registers returns zero + * (used for detection), writing any value causes the associated history to be + * reset. + * Virtual registers have to be handled in device specific driver code. Chip + * driver code returns non-negative register values if a virtual register is + * supported, or a negative error code if not. The chip driver may return + * -ENODATA or any other error code in this case, though an error code other + * than -ENODATA is handled more efficiently and thus preferred. Either case, + * the calling PMBus core code will abort if the chip driver returns an error + * code when reading or writing virtual registers. + */ + PMBUS_VIRT_BASE = 0x100, + PMBUS_VIRT_READ_TEMP_AVG, + PMBUS_VIRT_READ_TEMP_MIN, + PMBUS_VIRT_READ_TEMP_MAX, + PMBUS_VIRT_RESET_TEMP_HISTORY, + PMBUS_VIRT_READ_VIN_AVG, + PMBUS_VIRT_READ_VIN_MIN, + PMBUS_VIRT_READ_VIN_MAX, + PMBUS_VIRT_RESET_VIN_HISTORY, + PMBUS_VIRT_READ_IIN_AVG, + PMBUS_VIRT_READ_IIN_MIN, + PMBUS_VIRT_READ_IIN_MAX, + PMBUS_VIRT_RESET_IIN_HISTORY, + PMBUS_VIRT_READ_PIN_AVG, + PMBUS_VIRT_READ_PIN_MIN, + PMBUS_VIRT_READ_PIN_MAX, + PMBUS_VIRT_RESET_PIN_HISTORY, + PMBUS_VIRT_READ_POUT_AVG, + PMBUS_VIRT_READ_POUT_MIN, + PMBUS_VIRT_READ_POUT_MAX, + PMBUS_VIRT_RESET_POUT_HISTORY, + PMBUS_VIRT_READ_VOUT_AVG, + PMBUS_VIRT_READ_VOUT_MIN, + PMBUS_VIRT_READ_VOUT_MAX, + PMBUS_VIRT_RESET_VOUT_HISTORY, + PMBUS_VIRT_READ_IOUT_AVG, + PMBUS_VIRT_READ_IOUT_MIN, + PMBUS_VIRT_READ_IOUT_MAX, + PMBUS_VIRT_RESET_IOUT_HISTORY, + PMBUS_VIRT_READ_TEMP2_AVG, + PMBUS_VIRT_READ_TEMP2_MIN, + PMBUS_VIRT_READ_TEMP2_MAX, + PMBUS_VIRT_RESET_TEMP2_HISTORY, + + PMBUS_VIRT_READ_VMON, + PMBUS_VIRT_VMON_UV_WARN_LIMIT, + PMBUS_VIRT_VMON_OV_WARN_LIMIT, + PMBUS_VIRT_VMON_UV_FAULT_LIMIT, + PMBUS_VIRT_VMON_OV_FAULT_LIMIT, + PMBUS_VIRT_STATUS_VMON, + + /* + * RPM and PWM Fan control + * + * Drivers wanting to expose PWM control must define the behaviour of + * PMBUS_VIRT_PWM_[1-4] and PMBUS_VIRT_PWM_ENABLE_[1-4] in the + * {read,write}_word_data callback. + * + * pmbus core provides a default implementation for + * PMBUS_VIRT_FAN_TARGET_[1-4]. + * + * TARGET, PWM and PWM_ENABLE members must be defined sequentially; + * pmbus core uses the difference between the provided register and + * it's _1 counterpart to calculate the FAN/PWM ID. + */ + PMBUS_VIRT_FAN_TARGET_1, + PMBUS_VIRT_FAN_TARGET_2, + PMBUS_VIRT_FAN_TARGET_3, + PMBUS_VIRT_FAN_TARGET_4, + PMBUS_VIRT_PWM_1, + PMBUS_VIRT_PWM_2, + PMBUS_VIRT_PWM_3, + PMBUS_VIRT_PWM_4, + PMBUS_VIRT_PWM_ENABLE_1, + PMBUS_VIRT_PWM_ENABLE_2, + PMBUS_VIRT_PWM_ENABLE_3, + PMBUS_VIRT_PWM_ENABLE_4, + + /* Samples for average + * + * Drivers wanting to expose functionality for changing the number of + * samples used for average values should implement support in + * {read,write}_word_data callback for either PMBUS_VIRT_SAMPLES if it + * applies to all types of measurements, or any number of specific + * PMBUS_VIRT_*_SAMPLES registers to allow for individual control. + */ + PMBUS_VIRT_SAMPLES, + PMBUS_VIRT_IN_SAMPLES, + PMBUS_VIRT_CURR_SAMPLES, + PMBUS_VIRT_POWER_SAMPLES, + PMBUS_VIRT_TEMP_SAMPLES, +}; + +/* + * OPERATION + */ +#define PB_OPERATION_CONTROL_ON BIT(7) + +/* + * WRITE_PROTECT + */ +#define PB_WP_ALL BIT(7) /* all but WRITE_PROTECT */ +#define PB_WP_OP BIT(6) /* all but WP, OPERATION, PAGE */ +#define PB_WP_VOUT BIT(5) /* all but WP, OPERATION, PAGE, VOUT, ON_OFF */ + +#define PB_WP_ANY (PB_WP_ALL | PB_WP_OP | PB_WP_VOUT) + +/* + * CAPABILITY + */ +#define PB_CAPABILITY_SMBALERT BIT(4) +#define PB_CAPABILITY_ERROR_CHECK BIT(7) + +/* + * VOUT_MODE + */ +#define PB_VOUT_MODE_MODE_MASK 0xe0 +#define PB_VOUT_MODE_PARAM_MASK 0x1f + +#define PB_VOUT_MODE_LINEAR 0x00 +#define PB_VOUT_MODE_VID 0x20 +#define PB_VOUT_MODE_DIRECT 0x40 + +/* + * Fan configuration + */ +#define PB_FAN_2_PULSE_MASK (BIT(0) | BIT(1)) +#define PB_FAN_2_RPM BIT(2) +#define PB_FAN_2_INSTALLED BIT(3) +#define PB_FAN_1_PULSE_MASK (BIT(4) | BIT(5)) +#define PB_FAN_1_RPM BIT(6) +#define PB_FAN_1_INSTALLED BIT(7) + +enum pmbus_fan_mode { percent = 0, rpm }; + +/* + * STATUS_BYTE, STATUS_WORD (lower) + */ +#define PB_STATUS_NONE_ABOVE BIT(0) +#define PB_STATUS_CML BIT(1) +#define PB_STATUS_TEMPERATURE BIT(2) +#define PB_STATUS_VIN_UV BIT(3) +#define PB_STATUS_IOUT_OC BIT(4) +#define PB_STATUS_VOUT_OV BIT(5) +#define PB_STATUS_OFF BIT(6) +#define PB_STATUS_BUSY BIT(7) + +/* + * STATUS_WORD (upper) + */ +#define PB_STATUS_UNKNOWN BIT(8) +#define PB_STATUS_OTHER BIT(9) +#define PB_STATUS_FANS BIT(10) +#define PB_STATUS_POWER_GOOD_N BIT(11) +#define PB_STATUS_WORD_MFR BIT(12) +#define PB_STATUS_INPUT BIT(13) +#define PB_STATUS_IOUT_POUT BIT(14) +#define PB_STATUS_VOUT BIT(15) + +/* + * STATUS_IOUT + */ +#define PB_POUT_OP_WARNING BIT(0) +#define PB_POUT_OP_FAULT BIT(1) +#define PB_POWER_LIMITING BIT(2) +#define PB_CURRENT_SHARE_FAULT BIT(3) +#define PB_IOUT_UC_FAULT BIT(4) +#define PB_IOUT_OC_WARNING BIT(5) +#define PB_IOUT_OC_LV_FAULT BIT(6) +#define PB_IOUT_OC_FAULT BIT(7) + +/* + * STATUS_VOUT, STATUS_INPUT + */ +#define PB_VOLTAGE_UV_FAULT BIT(4) +#define PB_VOLTAGE_UV_WARNING BIT(5) +#define PB_VOLTAGE_OV_WARNING BIT(6) +#define PB_VOLTAGE_OV_FAULT BIT(7) + +/* + * STATUS_INPUT + */ +#define PB_PIN_OP_WARNING BIT(0) +#define PB_IIN_OC_WARNING BIT(1) +#define PB_IIN_OC_FAULT BIT(2) + +/* + * STATUS_TEMPERATURE + */ +#define PB_TEMP_UT_FAULT BIT(4) +#define PB_TEMP_UT_WARNING BIT(5) +#define PB_TEMP_OT_WARNING BIT(6) +#define PB_TEMP_OT_FAULT BIT(7) + +/* + * STATUS_FAN + */ +#define PB_FAN_AIRFLOW_WARNING BIT(0) +#define PB_FAN_AIRFLOW_FAULT BIT(1) +#define PB_FAN_FAN2_SPEED_OVERRIDE BIT(2) +#define PB_FAN_FAN1_SPEED_OVERRIDE BIT(3) +#define PB_FAN_FAN2_WARNING BIT(4) +#define PB_FAN_FAN1_WARNING BIT(5) +#define PB_FAN_FAN2_FAULT BIT(6) +#define PB_FAN_FAN1_FAULT BIT(7) + +/* + * CML_FAULT_STATUS + */ +#define PB_CML_FAULT_OTHER_MEM_LOGIC BIT(0) +#define PB_CML_FAULT_OTHER_COMM BIT(1) +#define PB_CML_FAULT_PROCESSOR BIT(3) +#define PB_CML_FAULT_MEMORY BIT(4) +#define PB_CML_FAULT_PACKET_ERROR BIT(5) +#define PB_CML_FAULT_INVALID_DATA BIT(6) +#define PB_CML_FAULT_INVALID_COMMAND BIT(7) + +enum pmbus_sensor_classes { + PSC_VOLTAGE_IN = 0, + PSC_VOLTAGE_OUT, + PSC_CURRENT_IN, + PSC_CURRENT_OUT, + PSC_POWER, + PSC_TEMPERATURE, + PSC_FAN, + PSC_PWM, + PSC_NUM_CLASSES /* Number of power sensor classes */ +}; + +#define PMBUS_PAGES 32 /* Per PMBus specification */ +#define PMBUS_PHASES 8 /* Maximum number of phases per page */ + +/* Functionality bit mask */ +#define PMBUS_HAVE_VIN BIT(0) +#define PMBUS_HAVE_VCAP BIT(1) +#define PMBUS_HAVE_VOUT BIT(2) +#define PMBUS_HAVE_IIN BIT(3) +#define PMBUS_HAVE_IOUT BIT(4) +#define PMBUS_HAVE_PIN BIT(5) +#define PMBUS_HAVE_POUT BIT(6) +#define PMBUS_HAVE_FAN12 BIT(7) +#define PMBUS_HAVE_FAN34 BIT(8) +#define PMBUS_HAVE_TEMP BIT(9) +#define PMBUS_HAVE_TEMP2 BIT(10) +#define PMBUS_HAVE_TEMP3 BIT(11) +#define PMBUS_HAVE_STATUS_VOUT BIT(12) +#define PMBUS_HAVE_STATUS_IOUT BIT(13) +#define PMBUS_HAVE_STATUS_INPUT BIT(14) +#define PMBUS_HAVE_STATUS_TEMP BIT(15) +#define PMBUS_HAVE_STATUS_FAN12 BIT(16) +#define PMBUS_HAVE_STATUS_FAN34 BIT(17) +#define PMBUS_HAVE_VMON BIT(18) +#define PMBUS_HAVE_STATUS_VMON BIT(19) +#define PMBUS_HAVE_PWM12 BIT(20) +#define PMBUS_HAVE_PWM34 BIT(21) +#define PMBUS_HAVE_SAMPLES BIT(22) + +#define PMBUS_PHASE_VIRTUAL BIT(30) /* Phases on this page are virtual */ +#define PMBUS_PAGE_VIRTUAL BIT(31) /* Page is virtual */ + +enum pmbus_data_format { linear = 0, direct, vid }; +enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv }; + +struct pmbus_driver_info { + int pages; /* Total number of pages */ + u8 phases[PMBUS_PAGES]; /* Number of phases per page */ + enum pmbus_data_format format[PSC_NUM_CLASSES]; + enum vrm_version vrm_version[PMBUS_PAGES]; /* vrm version per page */ + /* + * Support one set of coefficients for each sensor type + * Used for chips providing data in direct mode. + */ + int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */ + int b[PSC_NUM_CLASSES]; /* offset */ + int R[PSC_NUM_CLASSES]; /* exponent */ + + u32 func[PMBUS_PAGES]; /* Functionality, per page */ + u32 pfunc[PMBUS_PHASES];/* Functionality, per phase */ + /* + * The following functions map manufacturing specific register values + * to PMBus standard register values. Specify only if mapping is + * necessary. + * Functions return the register value (read) or zero (write) if + * successful. A return value of -ENODATA indicates that there is no + * manufacturer specific register, but that a standard PMBus register + * may exist. Any other negative return value indicates that the + * register does not exist, and that no attempt should be made to read + * the standard register. + */ + int (*read_byte_data)(struct i2c_client *client, int page, int reg); + int (*read_word_data)(struct i2c_client *client, int page, int phase, + int reg); + int (*write_word_data)(struct i2c_client *client, int page, int reg, + u16 word); + int (*write_byte)(struct i2c_client *client, int page, u8 value); + /* + * The identify function determines supported PMBus functionality. + * This function is only necessary if a chip driver supports multiple + * chips, and the chip functionality is not pre-determined. + */ + int (*identify)(struct i2c_client *client, + struct pmbus_driver_info *info); + + /* Regulator functionality, if supported by this chip driver. */ + int num_regulators; + const struct regulator_desc *reg_desc; + + /* custom attributes */ + const struct attribute_group **groups; +}; + +/* Regulator ops */ + +extern const struct regulator_ops wb_pmbus_regulator_ops; + +/* Macro for filling in array of struct regulator_desc */ +#define PMBUS_REGULATOR(_name, _id) \ + [_id] = { \ + .name = (_name # _id), \ + .id = (_id), \ + .of_match = of_match_ptr(_name # _id), \ + .regulators_node = of_match_ptr("regulators"), \ + .ops = &wb_pmbus_regulator_ops, \ + .type = REGULATOR_VOLTAGE, \ + .owner = THIS_MODULE, \ + } + +struct pmbus_data { + struct device *dev; + struct device *hwmon_dev; + + u32 flags; /* from platform data */ + + int exponent[PMBUS_PAGES]; /* linear mode: exponent for output voltages */ + + const struct pmbus_driver_info *info; + + int max_attributes; + int num_attributes; + struct attribute_group group; + const struct attribute_group **groups; + struct dentry *debugfs; /* debugfs device directory */ + + struct pmbus_sensor *sensors; + + struct mutex update_lock; + + bool has_status_word; /* device uses STATUS_WORD register */ + int (*read_status)(struct i2c_client *client, int page); + + s16 currpage; /* current page, -1 for unknown/unset */ + s16 currphase; /* current phase, 0xff for all, -1 for unknown/unset */ + int vout_max[PMBUS_PAGES]; /* pmbus maximum output voltage */ + int vout_min[PMBUS_PAGES]; /* pmbus minimum output voltage */ +}; + +/* Function declarations */ +void wb_pmbus_clear_cache(struct i2c_client *client); +int wb_pmbus_set_page(struct i2c_client *client, int page, int phase); +int wb_pmbus_read_word_data(struct i2c_client *client, int page, int phase, + u8 reg); +int wb_pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, + u16 word); +int wb_pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); +int wb_pmbus_write_byte(struct i2c_client *client, int page, u8 value); +int wb_pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, + u8 value); +int wb_pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, + u8 mask, u8 value); +void wb_pmbus_clear_faults(struct i2c_client *client); +bool wb_pmbus_check_byte_register(struct i2c_client *client, int page, int reg); +bool wb_pmbus_check_word_register(struct i2c_client *client, int page, int reg); +int wb_pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info); +int wb_pmbus_do_remove(struct i2c_client *client); +const struct pmbus_driver_info *wb_pmbus_get_driver_info(struct i2c_client + *client); +int wb_pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode); +int wb_pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode); +int wb_pmbus_update_fan(struct i2c_client *client, int page, int id, + u8 config, u8 mask, u16 command); +struct dentry *wb_pmbus_get_debugfs_dir(struct i2c_client *client); + +#endif /* WB_PMBUS_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c new file mode 100644 index 0000000000..bba6ca39cd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_pmbus_core.c @@ -0,0 +1,2780 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for PMBus devices + * + * Copyright (c) 2010, 2011 Ericsson AB. + * Copyright (c) 2012 Guenter Roeck + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +/* + * Number of additional attribute pointers to allocate + * with each call to krealloc + */ +#define PMBUS_ATTR_ALLOC_SIZE (32) +#define PMBUS_NAME_SIZE (24) +#define PMBUS_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define PMBUS_RETRY_TIME (3) + +struct pmbus_sensor { + struct pmbus_sensor *next; + char name[PMBUS_NAME_SIZE]; /* sysfs sensor name */ + struct device_attribute attribute; + u8 page; /* page number */ + u8 phase; /* phase number, 0xff for all phases */ + u16 reg; /* register */ + enum pmbus_sensor_classes class; /* sensor class */ + bool update; /* runtime sensor update needed */ + bool convert; /* Whether or not to apply linear/vid/direct */ + int data; /* Sensor data. + Negative if there was a read error */ +}; +#define to_pmbus_sensor(_attr) \ + container_of(_attr, struct pmbus_sensor, attribute) + +struct pmbus_boolean { + char name[PMBUS_NAME_SIZE]; /* sysfs boolean name */ + struct sensor_device_attribute attribute; + struct pmbus_sensor *s1; + struct pmbus_sensor *s2; +}; +#define to_pmbus_boolean(_attr) \ + container_of(_attr, struct pmbus_boolean, attribute) + +struct pmbus_label { + char name[PMBUS_NAME_SIZE]; /* sysfs label name */ + struct device_attribute attribute; + char label[PMBUS_NAME_SIZE]; /* label */ +}; +#define to_pmbus_label(_attr) \ + container_of(_attr, struct pmbus_label, attribute) + +/* Macros for converting between sensor index and register/page/status mask */ + +#define PB_STATUS_MASK 0xffff +#define PB_REG_SHIFT 16 +#define PB_REG_MASK 0x3ff +#define PB_PAGE_SHIFT 26 +#define PB_PAGE_MASK 0x3f + +#define pb_reg_to_index(page, reg, mask) (((page) << PB_PAGE_SHIFT) | \ + ((reg) << PB_REG_SHIFT) | (mask)) + +#define pb_index_to_page(index) (((index) >> PB_PAGE_SHIFT) & PB_PAGE_MASK) +#define pb_index_to_reg(index) (((index) >> PB_REG_SHIFT) & PB_REG_MASK) +#define pb_index_to_mask(index) ((index) & PB_STATUS_MASK) + +struct pmbus_debugfs_entry { + struct i2c_client *client; + u8 page; + u8 reg; +}; + +static const int pmbus_fan_rpm_mask[] = { + PB_FAN_1_RPM, + PB_FAN_2_RPM, + PB_FAN_1_RPM, + PB_FAN_2_RPM, +}; + +static const int pmbus_fan_config_registers[] = { + PMBUS_FAN_CONFIG_12, + PMBUS_FAN_CONFIG_12, + PMBUS_FAN_CONFIG_34, + PMBUS_FAN_CONFIG_34 +}; + +static const int pmbus_fan_command_registers[] = { + PMBUS_FAN_COMMAND_1, + PMBUS_FAN_COMMAND_2, + PMBUS_FAN_COMMAND_3, + PMBUS_FAN_COMMAND_4, +}; + +void wb_pmbus_clear_cache(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + struct pmbus_sensor *sensor; + + for (sensor = data->sensors; sensor; sensor = sensor->next) + sensor->data = -ENODATA; +} +EXPORT_SYMBOL_GPL(wb_pmbus_clear_cache); + +static int wb_pmbus_set_page_tmp(struct i2c_client *client, int page, int phase) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int rv; + + if (page < 0) + return 0; + + if (!(data->info->func[page] & PMBUS_PAGE_VIRTUAL) && + data->info->pages > 1 && page != data->currpage) { + rv = i2c_smbus_write_byte_data(client, PMBUS_PAGE, page); + if (rv < 0) + return rv; + + rv = i2c_smbus_read_byte_data(client, PMBUS_PAGE); + if (rv < 0) + return rv; + + if (rv != page) + return -EIO; + } + data->currpage = page; + + if (data->info->phases[page] && data->currphase != phase && + !(data->info->func[page] & PMBUS_PHASE_VIRTUAL)) { + rv = i2c_smbus_write_byte_data(client, PMBUS_PHASE, + phase); + if (rv) + return rv; + } + data->currphase = phase; + + return 0; +} + +int wb_pmbus_set_page(struct i2c_client *client, int page, int phase) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_set_page_tmp(client, page, phase); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_set_page failed, page=%d, phase=%d, rv=%d\n", + page, phase, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_set_page); + +static int wb_pmbus_write_byte_tmp(struct i2c_client *client, int page, u8 value) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_write_byte(client, value); +} + +int wb_pmbus_write_byte(struct i2c_client *client, int page, u8 value) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_write_byte_tmp(client, page, value); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_write_byte failed, page=%d, value=0x%x, rv: %d\n", + page, value, rv); + return rv; +} + +EXPORT_SYMBOL_GPL(wb_pmbus_write_byte); + +/* + * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_write_byte(struct i2c_client *client, int page, u8 value) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->write_byte) { + status = info->write_byte(client, page, value); + if (status != -ENODATA) + return status; + } + return wb_pmbus_write_byte(client, page, value); +} + +static int wb_pmbus_write_word_data_tmp(struct i2c_client *client, int page, u8 reg, + u16 word) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_write_word_data(client, reg, word); +} + +int wb_pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, + u16 word) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_write_word_data_tmp(client, page, reg, word); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_write_word_data failed, page: %d, reg: 0x%x, value: 0x%x, rv: %d\n", + page, reg, word, rv); + return rv; + +} +EXPORT_SYMBOL_GPL(wb_pmbus_write_word_data); + +static int pmbus_write_virt_reg(struct i2c_client *client, int page, int reg, + u16 word) +{ + int bit; + int id; + int rv; + + switch (reg) { + case PMBUS_VIRT_FAN_TARGET_1 ... PMBUS_VIRT_FAN_TARGET_4: + id = reg - PMBUS_VIRT_FAN_TARGET_1; + bit = pmbus_fan_rpm_mask[id]; + rv = wb_pmbus_update_fan(client, page, id, bit, bit, word); + break; + default: + rv = -ENXIO; + break; + } + + return rv; +} + +/* + * _pmbus_write_word_data() is similar to pmbus_write_word_data(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg, + u16 word) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->write_word_data) { + status = info->write_word_data(client, page, reg, word); + if (status != -ENODATA) + return status; + } + + if (reg >= PMBUS_VIRT_BASE) + return pmbus_write_virt_reg(client, page, reg, word); + + return wb_pmbus_write_word_data(client, page, reg, word); +} + +int wb_pmbus_update_fan(struct i2c_client *client, int page, int id, + u8 config, u8 mask, u16 command) +{ + int from; + int rv; + u8 to; + + from = wb_pmbus_read_byte_data(client, page, + pmbus_fan_config_registers[id]); + if (from < 0) + return from; + + to = (from & ~mask) | (config & mask); + if (to != from) { + rv = wb_pmbus_write_byte_data(client, page, + pmbus_fan_config_registers[id], to); + if (rv < 0) + return rv; + } + + return _pmbus_write_word_data(client, page, + pmbus_fan_command_registers[id], command); +} +EXPORT_SYMBOL_GPL(wb_pmbus_update_fan); + +static int wb_pmbus_read_word_data_tmp(struct i2c_client *client, int page, int phase, u8 reg) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, phase); + if (rv < 0) + return rv; + + return i2c_smbus_read_word_data(client, reg); +} + +int wb_pmbus_read_word_data(struct i2c_client *client, int page, int phase, u8 reg) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_read_word_data_tmp(client, page, phase, reg); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_read_word_data failed, page: %d, phase: %d, reg: 0x%x, rv: %d\n", + page, phase, reg, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_read_word_data); + +static int pmbus_read_virt_reg(struct i2c_client *client, int page, int reg) +{ + int rv; + int id; + + switch (reg) { + case PMBUS_VIRT_FAN_TARGET_1 ... PMBUS_VIRT_FAN_TARGET_4: + id = reg - PMBUS_VIRT_FAN_TARGET_1; + rv = wb_pmbus_get_fan_rate_device(client, page, id, rpm); + break; + default: + rv = -ENXIO; + break; + } + + return rv; +} + +/* + * _pmbus_read_word_data() is similar to wb_pmbus_read_word_data(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->read_word_data) { + status = info->read_word_data(client, page, phase, reg); + if (status != -ENODATA) + return status; + } + + if (reg >= PMBUS_VIRT_BASE) + return pmbus_read_virt_reg(client, page, reg); + + return wb_pmbus_read_word_data(client, page, phase, reg); +} + +/* Same as above, but without phase parameter, for use in check functions */ +static int __pmbus_read_word_data(struct i2c_client *client, int page, int reg) +{ + return _pmbus_read_word_data(client, page, 0xff, reg); +} + +static int wb_pmbus_read_byte_data_tmp(struct i2c_client *client, int page, u8 reg) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_read_byte_data(client, reg); +} + +int wb_pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_read_byte_data_tmp(client, page, reg); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_read_byte_data failed, page: %d, reg: 0x%x, rv: %d\n", + page, reg, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_read_byte_data); + +static int wb_pmbus_write_byte_data_tmp(struct i2c_client *client, int page, u8 reg, u8 value) +{ + int rv; + + rv = wb_pmbus_set_page(client, page, 0xff); + if (rv < 0) + return rv; + + return i2c_smbus_write_byte_data(client, reg, value); +} + +int wb_pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, u8 value) +{ + int rv, i; + struct device *dev = &client->dev; + + for (i = 0; i < PMBUS_RETRY_TIME; i++) { + rv = wb_pmbus_write_byte_data_tmp(client, page, reg, value); + if(rv >= 0){ + return rv; + } + if ((i + 1) < PMBUS_RETRY_TIME) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + } + dev_dbg(dev, "wb_pmbus_write_byte_data failed, page: %d, reg: 0x%x, value: 0x%x, rv: %d\n", + page, reg, value, rv); + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_write_byte_data); + +int wb_pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, + u8 mask, u8 value) +{ + unsigned int tmp; + int rv; + + rv = wb_pmbus_read_byte_data(client, page, reg); + if (rv < 0) + return rv; + + tmp = (rv & ~mask) | (value & mask); + + if (tmp != rv) + rv = wb_pmbus_write_byte_data(client, page, reg, tmp); + + return rv; +} +EXPORT_SYMBOL_GPL(wb_pmbus_update_byte_data); + +/* + * _pmbus_read_byte_data() is similar to wb_pmbus_read_byte_data(), but checks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + const struct pmbus_driver_info *info = data->info; + int status; + + if (info->read_byte_data) { + status = info->read_byte_data(client, page, reg); + if (status != -ENODATA) + return status; + } + return wb_pmbus_read_byte_data(client, page, reg); +} + +static struct pmbus_sensor *pmbus_find_sensor(struct pmbus_data *data, int page, + int reg) +{ + struct pmbus_sensor *sensor; + + for (sensor = data->sensors; sensor; sensor = sensor->next) { + if (sensor->page == page && sensor->reg == reg) + return sensor; + } + + return ERR_PTR(-EINVAL); +} + +static int pmbus_get_fan_rate(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode, + bool from_cache) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + bool want_rpm, have_rpm; + struct pmbus_sensor *s; + int config; + int reg; + + want_rpm = (mode == rpm); + + if (from_cache) { + reg = want_rpm ? PMBUS_VIRT_FAN_TARGET_1 : PMBUS_VIRT_PWM_1; + s = pmbus_find_sensor(data, page, reg + id); + if (IS_ERR(s)) + return PTR_ERR(s); + + return s->data; + } + + config = wb_pmbus_read_byte_data(client, page, + pmbus_fan_config_registers[id]); + if (config < 0) + return config; + + have_rpm = !!(config & pmbus_fan_rpm_mask[id]); + if (want_rpm == have_rpm) + return wb_pmbus_read_word_data(client, page, 0xff, + pmbus_fan_command_registers[id]); + + /* Can't sensibly map between RPM and PWM, just return zero */ + return 0; +} + +int wb_pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode) +{ + return pmbus_get_fan_rate(client, page, id, mode, false); +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_fan_rate_device); + +int wb_pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, + enum pmbus_fan_mode mode) +{ + return pmbus_get_fan_rate(client, page, id, mode, true); +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_fan_rate_cached); + +static void pmbus_clear_fault_page(struct i2c_client *client, int page) +{ + _pmbus_write_byte(client, page, PMBUS_CLEAR_FAULTS); +} + +void wb_pmbus_clear_faults(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int i; + + for (i = 0; i < data->info->pages; i++) + pmbus_clear_fault_page(client, i); +} +EXPORT_SYMBOL_GPL(wb_pmbus_clear_faults); + +static int pmbus_check_status_cml(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int status, status2; + + status = data->read_status(client, -1); + if (status < 0 || (status & PB_STATUS_CML)) { + status2 = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML); + if (status2 < 0 || (status2 & PB_CML_FAULT_INVALID_COMMAND)) + return -EIO; + } + return 0; +} + +static bool pmbus_check_register(struct i2c_client *client, + int (*func)(struct i2c_client *client, + int page, int reg), + int page, int reg) +{ + int rv; + struct pmbus_data *data = i2c_get_clientdata(client); + + rv = func(client, page, reg); + if (rv >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK)) + rv = pmbus_check_status_cml(client); + pmbus_clear_fault_page(client, -1); + return rv >= 0; +} + +static bool pmbus_check_status_register(struct i2c_client *client, int page) +{ + int status; + struct pmbus_data *data = i2c_get_clientdata(client); + + status = data->read_status(client, page); + if (status >= 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK) && + (status & PB_STATUS_CML)) { + status = _pmbus_read_byte_data(client, -1, PMBUS_STATUS_CML); + if (status < 0 || (status & PB_CML_FAULT_INVALID_COMMAND)) + status = -EIO; + } + + pmbus_clear_fault_page(client, -1); + return status >= 0; +} + +bool wb_pmbus_check_byte_register(struct i2c_client *client, int page, int reg) +{ + return pmbus_check_register(client, _pmbus_read_byte_data, page, reg); +} +EXPORT_SYMBOL_GPL(wb_pmbus_check_byte_register); + +bool wb_pmbus_check_word_register(struct i2c_client *client, int page, int reg) +{ + return pmbus_check_register(client, __pmbus_read_word_data, page, reg); +} +EXPORT_SYMBOL_GPL(wb_pmbus_check_word_register); + +const struct pmbus_driver_info *wb_pmbus_get_driver_info(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + + return data->info; +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_driver_info); + +static int pmbus_read_status_byte(struct i2c_client *client, int page) +{ + return _pmbus_read_byte_data(client, page, PMBUS_STATUS_BYTE); +} + +static int pmbus_read_status_word(struct i2c_client *client, int page) +{ + return _pmbus_read_word_data(client, page, 0xff, PMBUS_STATUS_WORD); +} + +static int pmbus_get_status(struct i2c_client *client, int page, int reg) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + int status; + + switch (reg) { + case PMBUS_STATUS_WORD: + status = data->read_status(client, page); + if ((status < 0) || (data->has_status_word && (status == 0xffff)) + || (!data->has_status_word && (status == 0xff))) { + if (data->has_status_word) { + data->read_status = pmbus_read_status_byte; + } else { + data->read_status = pmbus_read_status_word; + } + data->has_status_word = !data->has_status_word; + status = data->read_status(client, page); + } + break; + default: + status = _pmbus_read_byte_data(client, page, reg); + break; + } + if (status < 0) + wb_pmbus_clear_faults(client); + return status; +} + +static void pmbus_update_sensor_data(struct i2c_client *client, struct pmbus_sensor *sensor) +{ + if (sensor->data < 0 || sensor->update) + sensor->data = _pmbus_read_word_data(client, sensor->page, + sensor->phase, sensor->reg); +} + +/* + * Convert linear sensor values to milli- or micro-units + * depending on sensor type. + */ +static s64 pmbus_reg2data_linear(struct pmbus_data *data, + struct pmbus_sensor *sensor) +{ + s16 exponent; + s32 mantissa; + s64 val; + + if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */ + exponent = data->exponent[sensor->page]; + mantissa = (u16) sensor->data; + } else { /* LINEAR11 */ + exponent = ((s16)sensor->data) >> 11; + mantissa = ((s16)((sensor->data & 0x7ff) << 5)) >> 5; + } + + val = mantissa; + + /* scale result to milli-units for all sensors except fans */ + if (sensor->class != PSC_FAN) + val = val * 1000LL; + + /* scale result to micro-units for power sensors */ + if (sensor->class == PSC_POWER) + val = val * 1000LL; + + if (exponent >= 0) + val <<= exponent; + else + val >>= -exponent; + + return val; +} + +/* + * Convert direct sensor values to milli- or micro-units + * depending on sensor type. + */ +static s64 pmbus_reg2data_direct(struct pmbus_data *data, + struct pmbus_sensor *sensor) +{ + s64 b, val = (s16)sensor->data; + s32 m, R; + + m = data->info->m[sensor->class]; + b = data->info->b[sensor->class]; + R = data->info->R[sensor->class]; + + if (m == 0) + return 0; + + /* X = 1/m * (Y * 10^-R - b) */ + R = -R; + /* scale result to milli-units for everything but fans */ + if (!(sensor->class == PSC_FAN || sensor->class == PSC_PWM)) { + R += 3; + b *= 1000; + } + + /* scale result to micro-units for power sensors */ + if (sensor->class == PSC_POWER) { + R += 3; + b *= 1000; + } + + while (R > 0) { + val *= 10; + R--; + } + while (R < 0) { + val = div_s64(val + 5LL, 10L); /* round closest */ + R++; + } + + val = div_s64(val - b, m); + return val; +} + +/* + * Convert VID sensor values to milli- or micro-units + * depending on sensor type. + */ +static s64 pmbus_reg2data_vid(struct pmbus_data *data, + struct pmbus_sensor *sensor) +{ + long val = sensor->data; + long rv = 0; + + switch (data->info->vrm_version[sensor->page]) { + case vr11: + if (val >= 0x02 && val <= 0xb2) + rv = DIV_ROUND_CLOSEST(160000 - (val - 2) * 625, 100); + break; + case vr12: + if (val >= 0x01) + rv = 250 + (val - 1) * 5; + break; + case vr13: + if (val >= 0x01) + rv = 500 + (val - 1) * 10; + break; + case imvp9: + if (val >= 0x01) + rv = 200 + (val - 1) * 10; + break; + case amd625mv: + if (val >= 0x0 && val <= 0xd8) + rv = DIV_ROUND_CLOSEST(155000 - val * 625, 100); + break; + } + return rv; +} + +static s64 pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor) +{ + s64 val; + + if (!sensor->convert) + return sensor->data; + + switch (data->info->format[sensor->class]) { + case direct: + val = pmbus_reg2data_direct(data, sensor); + break; + case vid: + val = pmbus_reg2data_vid(data, sensor); + break; + case linear: + default: + val = pmbus_reg2data_linear(data, sensor); + break; + } + return val; +} + +#define MAX_MANTISSA (1023 * 1000) +#define MIN_MANTISSA (511 * 1000) + +static u16 pmbus_data2reg_linear(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + s16 exponent = 0, mantissa; + bool negative = false; + + /* simple case */ + if (val == 0) + return 0; + + if (sensor->class == PSC_VOLTAGE_OUT) { + /* LINEAR16 does not support negative voltages */ + if (val < 0) + return 0; + + /* + * For a static exponents, we don't have a choice + * but to adjust the value to it. + */ + if (data->exponent[sensor->page] < 0) + val <<= -data->exponent[sensor->page]; + else + val >>= data->exponent[sensor->page]; + val = DIV_ROUND_CLOSEST_ULL(val, 1000); + return clamp_val(val, 0, 0xffff); + } + + if (val < 0) { + negative = true; + val = -val; + } + + /* Power is in uW. Convert to mW before converting. */ + if (sensor->class == PSC_POWER) + val = DIV_ROUND_CLOSEST_ULL(val, 1000); + + /* + * For simplicity, convert fan data to milli-units + * before calculating the exponent. + */ + if (sensor->class == PSC_FAN) + val = val * 1000LL; + + /* Reduce large mantissa until it fits into 10 bit */ + while (val >= MAX_MANTISSA && exponent < 15) { + exponent++; + val >>= 1; + } + /* Increase small mantissa to improve precision */ + while (val < MIN_MANTISSA && exponent > -15) { + exponent--; + val <<= 1; + } + + /* Convert mantissa from milli-units to units */ + mantissa = clamp_val(DIV_ROUND_CLOSEST_ULL(val, 1000), 0, 0x3ff); + + /* restore sign */ + if (negative) + mantissa = -mantissa; + + /* Convert to 5 bit exponent, 11 bit mantissa */ + return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800); +} + +static u16 pmbus_data2reg_direct(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + s64 b; + s32 m, R; + + m = data->info->m[sensor->class]; + b = data->info->b[sensor->class]; + R = data->info->R[sensor->class]; + + /* Power is in uW. Adjust R and b. */ + if (sensor->class == PSC_POWER) { + R -= 3; + b *= 1000; + } + + /* Calculate Y = (m * X + b) * 10^R */ + if (!(sensor->class == PSC_FAN || sensor->class == PSC_PWM)) { + R -= 3; /* Adjust R and b for data in milli-units */ + b *= 1000; + } + val = val * m + b; + + while (R > 0) { + val *= 10; + R--; + } + while (R < 0) { + val = div_s64(val + 5LL, 10L); /* round closest */ + R++; + } + + return (u16)clamp_val(val, S16_MIN, S16_MAX); +} + +static u16 pmbus_data2reg_vid(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + val = clamp_val(val, 500, 1600); + + return 2 + DIV_ROUND_CLOSEST_ULL((1600LL - val) * 100LL, 625); +} + +static u16 pmbus_data2reg(struct pmbus_data *data, + struct pmbus_sensor *sensor, s64 val) +{ + u16 regval; + + if (!sensor->convert) + return val; + + switch (data->info->format[sensor->class]) { + case direct: + regval = pmbus_data2reg_direct(data, sensor, val); + break; + case vid: + regval = pmbus_data2reg_vid(data, sensor, val); + break; + case linear: + default: + regval = pmbus_data2reg_linear(data, sensor, val); + break; + } + return regval; +} + +/* + * Return boolean calculated from converted data. + * defines a status register index and mask. + * The mask is in the lower 8 bits, the register index is in bits 8..23. + * + * The associated pmbus_boolean structure contains optional pointers to two + * sensor attributes. If specified, those attributes are compared against each + * other to determine if a limit has been exceeded. + * + * If the sensor attribute pointers are NULL, the function returns true if + * (status[reg] & mask) is true. + * + * If sensor attribute pointers are provided, a comparison against a specified + * limit has to be performed to determine the boolean result. + * In this case, the function returns true if v1 >= v2 (where v1 and v2 are + * sensor values referenced by sensor attribute pointers s1 and s2). + * + * To determine if an object exceeds upper limits, specify = . + * To determine if an object exceeds lower limits, specify = . + * + * If a negative value is stored in any of the referenced registers, this value + * reflects an error code which will be returned. + */ +static int pmbus_get_boolean(struct i2c_client *client, struct pmbus_boolean *b, + int index) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + struct pmbus_sensor *s1 = b->s1; + struct pmbus_sensor *s2 = b->s2; + u16 mask = pb_index_to_mask(index); + u8 page = pb_index_to_page(index); + u16 reg = pb_index_to_reg(index); + int ret, status; + u16 regval; + + mutex_lock(&data->update_lock); + status = pmbus_get_status(client, page, reg); + if (status < 0) { + ret = status; + goto unlock; + } + + if (s1) + pmbus_update_sensor_data(client, s1); + if (s2) + pmbus_update_sensor_data(client, s2); + + regval = status & mask; + if (s1 && s2) { + s64 v1, v2; + + if (s1->data < 0) { + ret = s1->data; + goto unlock; + } + if (s2->data < 0) { + ret = s2->data; + goto unlock; + } + + v1 = pmbus_reg2data(data, s1); + v2 = pmbus_reg2data(data, s2); + ret = !!(regval && v1 >= v2); + } else { + ret = !!regval; + } +unlock: + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t pmbus_show_boolean(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct pmbus_boolean *boolean = to_pmbus_boolean(attr); + struct i2c_client *client = to_i2c_client(dev->parent); + int val; + + val = pmbus_get_boolean(client, boolean, attr->index); + if (val < 0) + return val; + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t pmbus_show_sensor(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_sensor *sensor = to_pmbus_sensor(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + ssize_t ret; + + mutex_lock(&data->update_lock); + pmbus_update_sensor_data(client, sensor); + if (sensor->data < 0) + ret = sensor->data; + else + ret = snprintf(buf, PAGE_SIZE, "%lld\n", pmbus_reg2data(data, sensor)); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t pmbus_set_sensor(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_data *data = i2c_get_clientdata(client); + struct pmbus_sensor *sensor = to_pmbus_sensor(devattr); + ssize_t rv = count; + s64 val; + int ret; + u16 regval; + + if (kstrtos64(buf, 10, &val) < 0) + return -EINVAL; + + mutex_lock(&data->update_lock); + regval = pmbus_data2reg(data, sensor, val); + ret = _pmbus_write_word_data(client, sensor->page, sensor->reg, regval); + if (ret < 0) + rv = ret; + else + sensor->data = regval; + mutex_unlock(&data->update_lock); + return rv; +} + +static ssize_t pmbus_show_label(struct device *dev, + struct device_attribute *da, char *buf) +{ + struct pmbus_label *label = to_pmbus_label(da); + + return snprintf(buf, PAGE_SIZE, "%s\n", label->label); +} + +static int pmbus_add_attribute(struct pmbus_data *data, struct attribute *attr) +{ + if (data->num_attributes >= data->max_attributes - 1) { + int new_max_attrs = data->max_attributes + PMBUS_ATTR_ALLOC_SIZE; + void *new_attrs = devm_krealloc(data->dev, data->group.attrs, + new_max_attrs * sizeof(void *), + GFP_KERNEL); + if (!new_attrs) + return -ENOMEM; + data->group.attrs = new_attrs; + data->max_attributes = new_max_attrs; + } + + data->group.attrs[data->num_attributes++] = attr; + data->group.attrs[data->num_attributes] = NULL; + return 0; +} + +static void pmbus_dev_attr_init(struct device_attribute *dev_attr, + const char *name, + umode_t mode, + ssize_t (*show)(struct device *dev, + struct device_attribute *attr, + char *buf), + ssize_t (*store)(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count)) +{ + sysfs_attr_init(&dev_attr->attr); + dev_attr->attr.name = name; + dev_attr->attr.mode = mode; + dev_attr->show = show; + dev_attr->store = store; +} + +static void pmbus_attr_init(struct sensor_device_attribute *a, + const char *name, + umode_t mode, + ssize_t (*show)(struct device *dev, + struct device_attribute *attr, + char *buf), + ssize_t (*store)(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count), + int idx) +{ + pmbus_dev_attr_init(&a->dev_attr, name, mode, show, store); + a->index = idx; +} + +static int pmbus_add_boolean(struct pmbus_data *data, + const char *name, const char *type, int seq, + struct pmbus_sensor *s1, + struct pmbus_sensor *s2, + u8 page, u16 reg, u16 mask) +{ + struct pmbus_boolean *boolean; + struct sensor_device_attribute *a; + + if (WARN((s1 && !s2) || (!s1 && s2), "Bad s1/s2 parameters\n")) + return -EINVAL; + + boolean = devm_kzalloc(data->dev, sizeof(*boolean), GFP_KERNEL); + if (!boolean) + return -ENOMEM; + + a = &boolean->attribute; + + snprintf(boolean->name, sizeof(boolean->name), "%s%d_%s", + name, seq, type); + boolean->s1 = s1; + boolean->s2 = s2; + pmbus_attr_init(a, boolean->name, 0444, pmbus_show_boolean, NULL, + pb_reg_to_index(page, reg, mask)); + + return pmbus_add_attribute(data, &a->dev_attr.attr); +} + +static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data, + const char *name, const char *type, + int seq, int page, int phase, + int reg, + enum pmbus_sensor_classes class, + bool update, bool readonly, + bool convert) +{ + struct pmbus_sensor *sensor; + struct device_attribute *a; + + sensor = devm_kzalloc(data->dev, sizeof(*sensor), GFP_KERNEL); + if (!sensor) + return NULL; + a = &sensor->attribute; + + if (type) + snprintf(sensor->name, sizeof(sensor->name), "%s%d_%s", + name, seq, type); + else + snprintf(sensor->name, sizeof(sensor->name), "%s%d", + name, seq); + + if (data->flags & PMBUS_WRITE_PROTECTED) + readonly = true; + + sensor->page = page; + sensor->phase = phase; + sensor->reg = reg; + sensor->class = class; + sensor->update = update; + sensor->convert = convert; + sensor->data = -ENODATA; + pmbus_dev_attr_init(a, sensor->name, + readonly ? 0444 : 0644, + pmbus_show_sensor, pmbus_set_sensor); + + if (pmbus_add_attribute(data, &a->attr)) + return NULL; + + sensor->next = data->sensors; + data->sensors = sensor; + + return sensor; +} + +static int pmbus_add_label(struct pmbus_data *data, + const char *name, int seq, + const char *lstring, int index, int phase) +{ + struct pmbus_label *label; + struct device_attribute *a; + + label = devm_kzalloc(data->dev, sizeof(*label), GFP_KERNEL); + if (!label) + return -ENOMEM; + + a = &label->attribute; + + snprintf(label->name, sizeof(label->name), "%s%d_label", name, seq); + if (!index) { + if (phase == 0xff) + strncpy(label->label, lstring, + sizeof(label->label) - 1); + else + snprintf(label->label, sizeof(label->label), "%s.%d", + lstring, phase); + } else { + if (phase == 0xff) + snprintf(label->label, sizeof(label->label), "%s%d", + lstring, index); + else + snprintf(label->label, sizeof(label->label), "%s%d.%d", + lstring, index, phase); + } + + pmbus_dev_attr_init(a, label->name, 0444, pmbus_show_label, NULL); + return pmbus_add_attribute(data, &a->attr); +} + +/* + * Search for attributes. Allocate sensors, booleans, and labels as needed. + */ + +/* + * The pmbus_limit_attr structure describes a single limit attribute + * and its associated alarm attribute. + */ +struct pmbus_limit_attr { + u16 reg; /* Limit register */ + u16 sbit; /* Alarm attribute status bit */ + bool update; /* True if register needs updates */ + bool low; /* True if low limit; for limits with compare + functions only */ + const char *attr; /* Attribute name */ + const char *alarm; /* Alarm attribute name */ +}; + +/* + * The pmbus_sensor_attr structure describes one sensor attribute. This + * description includes a reference to the associated limit attributes. + */ +struct pmbus_sensor_attr { + u16 reg; /* sensor register */ + u16 gbit; /* generic status bit */ + u8 nlimit; /* # of limit registers */ + enum pmbus_sensor_classes class;/* sensor class */ + const char *label; /* sensor label */ + bool paged; /* true if paged sensor */ + bool update; /* true if update needed */ + bool compare; /* true if compare function needed */ + u32 func; /* sensor mask */ + u32 sfunc; /* sensor status mask */ + int sreg; /* status register */ + const struct pmbus_limit_attr *limit;/* limit registers */ +}; + +/* + * Add a set of limit attributes and, if supported, the associated + * alarm attributes. + * returns 0 if no alarm register found, 1 if an alarm register was found, + * < 0 on errors. + */ +static int pmbus_add_limit_attrs(struct i2c_client *client, + struct pmbus_data *data, + const struct pmbus_driver_info *info, + const char *name, int index, int page, + struct pmbus_sensor *base, + const struct pmbus_sensor_attr *attr) +{ + const struct pmbus_limit_attr *l = attr->limit; + int nlimit = attr->nlimit; + int have_alarm = 0; + int i, ret; + struct pmbus_sensor *curr; + + for (i = 0; i < nlimit; i++) { + if (wb_pmbus_check_word_register(client, page, l->reg)) { + curr = pmbus_add_sensor(data, name, l->attr, index, + page, 0xff, l->reg, attr->class, + attr->update || l->update, + false, true); + if (!curr) + return -ENOMEM; + if (l->sbit && (info->func[page] & attr->sfunc)) { + ret = pmbus_add_boolean(data, name, + l->alarm, index, + attr->compare ? l->low ? curr : base + : NULL, + attr->compare ? l->low ? base : curr + : NULL, + page, attr->sreg, l->sbit); + if (ret) + return ret; + have_alarm = 1; + } + } + l++; + } + return have_alarm; +} + +static int pmbus_add_sensor_attrs_one(struct i2c_client *client, + struct pmbus_data *data, + const struct pmbus_driver_info *info, + const char *name, + int index, int page, int phase, + const struct pmbus_sensor_attr *attr, + bool paged) +{ + struct pmbus_sensor *base; + bool upper = !!(attr->gbit & 0xff00); /* need to check STATUS_WORD */ + int ret; + + if (attr->label) { + ret = pmbus_add_label(data, name, index, attr->label, + paged ? page + 1 : 0, phase); + if (ret) + return ret; + } + base = pmbus_add_sensor(data, name, "input", index, page, phase, + attr->reg, attr->class, true, true, true); + if (!base) + return -ENOMEM; + /* No limit and alarm attributes for phase specific sensors */ + if (attr->sfunc && phase == 0xff) { + ret = pmbus_add_limit_attrs(client, data, info, name, + index, page, base, attr); + if (ret < 0) + return ret; + /* + * Add generic alarm attribute only if there are no individual + * alarm attributes, if there is a global alarm bit, and if + * the generic status register (word or byte, depending on + * which global bit is set) for this page is accessible. + */ + if (!ret && attr->gbit && + (!upper || (upper && data->has_status_word)) && + pmbus_check_status_register(client, page)) { + ret = pmbus_add_boolean(data, name, "alarm", index, + NULL, NULL, + page, PMBUS_STATUS_WORD, + attr->gbit); + if (ret) + return ret; + } + } + return 0; +} + +static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info, + const struct pmbus_sensor_attr *attr) +{ + int p; + + if (attr->paged) + return true; + + /* + * Some attributes may be present on more than one page despite + * not being marked with the paged attribute. If that is the case, + * then treat the sensor as being paged and add the page suffix to the + * attribute name. + * We don't just add the paged attribute to all such attributes, in + * order to maintain the un-suffixed labels in the case where the + * attribute is only on page 0. + */ + for (p = 1; p < info->pages; p++) { + if (info->func[p] & attr->func) + return true; + } + return false; +} + +static int pmbus_add_sensor_attrs(struct i2c_client *client, + struct pmbus_data *data, + const char *name, + const struct pmbus_sensor_attr *attrs, + int nattrs) +{ + const struct pmbus_driver_info *info = data->info; + int index, i; + int ret; + + index = 1; + for (i = 0; i < nattrs; i++) { + int page, pages; + bool paged = pmbus_sensor_is_paged(info, attrs); + + pages = paged ? info->pages : 1; + for (page = 0; page < pages; page++) { + if (!(info->func[page] & attrs->func)) + continue; + ret = pmbus_add_sensor_attrs_one(client, data, info, + name, index, page, + 0xff, attrs, paged); + if (ret) + return ret; + index++; + if (info->phases[page]) { + int phase; + + for (phase = 0; phase < info->phases[page]; + phase++) { + if (!(info->pfunc[phase] & attrs->func)) + continue; + ret = pmbus_add_sensor_attrs_one(client, + data, info, name, index, page, + phase, attrs, paged); + if (ret) + return ret; + index++; + } + } + } + attrs++; + } + return 0; +} + +static const struct pmbus_limit_attr vin_limit_attrs[] = { + { + .reg = PMBUS_VIN_UV_WARN_LIMIT, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_VOLTAGE_UV_WARNING, + }, { + .reg = PMBUS_VIN_UV_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_VOLTAGE_UV_FAULT, + }, { + .reg = PMBUS_VIN_OV_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_VOLTAGE_OV_WARNING, + }, { + .reg = PMBUS_VIN_OV_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_VOLTAGE_OV_FAULT, + }, { + .reg = PMBUS_VIRT_READ_VIN_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_VIN_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_VIN_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_VIN_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_VIN_MIN, + .attr = "rated_min", + }, { + .reg = PMBUS_MFR_VIN_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr vmon_limit_attrs[] = { + { + .reg = PMBUS_VIRT_VMON_UV_WARN_LIMIT, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_VOLTAGE_UV_WARNING, + }, { + .reg = PMBUS_VIRT_VMON_UV_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_VOLTAGE_UV_FAULT, + }, { + .reg = PMBUS_VIRT_VMON_OV_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_VOLTAGE_OV_WARNING, + }, { + .reg = PMBUS_VIRT_VMON_OV_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_VOLTAGE_OV_FAULT, + } +}; + +static const struct pmbus_limit_attr vout_limit_attrs[] = { + { + .reg = PMBUS_VOUT_UV_WARN_LIMIT, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_VOLTAGE_UV_WARNING, + }, { + .reg = PMBUS_VOUT_UV_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_VOLTAGE_UV_FAULT, + }, { + .reg = PMBUS_VOUT_OV_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_VOLTAGE_OV_WARNING, + }, { + .reg = PMBUS_VOUT_OV_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_VOLTAGE_OV_FAULT, + }, { + .reg = PMBUS_VIRT_READ_VOUT_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_VOUT_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_VOUT_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_VOUT_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_VOUT_MIN, + .attr = "rated_min", + }, { + .reg = PMBUS_MFR_VOUT_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr voltage_attributes[] = { + { + .reg = PMBUS_READ_VIN, + .class = PSC_VOLTAGE_IN, + .label = "vin", + .func = PMBUS_HAVE_VIN, + .sfunc = PMBUS_HAVE_STATUS_INPUT, + .sreg = PMBUS_STATUS_INPUT, + .gbit = PB_STATUS_VIN_UV, + .limit = vin_limit_attrs, + .nlimit = ARRAY_SIZE(vin_limit_attrs), + }, { + .reg = PMBUS_VIRT_READ_VMON, + .class = PSC_VOLTAGE_IN, + .label = "vmon", + .func = PMBUS_HAVE_VMON, + .sfunc = PMBUS_HAVE_STATUS_VMON, + .sreg = PMBUS_VIRT_STATUS_VMON, + .limit = vmon_limit_attrs, + .nlimit = ARRAY_SIZE(vmon_limit_attrs), + }, { + .reg = PMBUS_READ_VCAP, + .class = PSC_VOLTAGE_IN, + .label = "vcap", + .func = PMBUS_HAVE_VCAP, + }, { + .reg = PMBUS_READ_VOUT, + .class = PSC_VOLTAGE_OUT, + .label = "vout", + .paged = true, + .func = PMBUS_HAVE_VOUT, + .sfunc = PMBUS_HAVE_STATUS_VOUT, + .sreg = PMBUS_STATUS_VOUT, + .gbit = PB_STATUS_VOUT_OV, + .limit = vout_limit_attrs, + .nlimit = ARRAY_SIZE(vout_limit_attrs), + } +}; + +/* Current attributes */ + +static const struct pmbus_limit_attr iin_limit_attrs[] = { + { + .reg = PMBUS_IIN_OC_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_IIN_OC_WARNING, + }, { + .reg = PMBUS_IIN_OC_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_IIN_OC_FAULT, + }, { + .reg = PMBUS_VIRT_READ_IIN_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_IIN_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_IIN_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_IIN_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_IIN_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr iout_limit_attrs[] = { + { + .reg = PMBUS_IOUT_OC_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_IOUT_OC_WARNING, + }, { + .reg = PMBUS_IOUT_UC_FAULT_LIMIT, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_IOUT_UC_FAULT, + }, { + .reg = PMBUS_IOUT_OC_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_IOUT_OC_FAULT, + }, { + .reg = PMBUS_VIRT_READ_IOUT_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_IOUT_MIN, + .update = true, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_IOUT_MAX, + .update = true, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_IOUT_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_IOUT_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr current_attributes[] = { + { + .reg = PMBUS_READ_IIN, + .class = PSC_CURRENT_IN, + .label = "iin", + .func = PMBUS_HAVE_IIN, + .sfunc = PMBUS_HAVE_STATUS_INPUT, + .sreg = PMBUS_STATUS_INPUT, + .gbit = PB_STATUS_INPUT, + .limit = iin_limit_attrs, + .nlimit = ARRAY_SIZE(iin_limit_attrs), + }, { + .reg = PMBUS_READ_IOUT, + .class = PSC_CURRENT_OUT, + .label = "iout", + .paged = true, + .func = PMBUS_HAVE_IOUT, + .sfunc = PMBUS_HAVE_STATUS_IOUT, + .sreg = PMBUS_STATUS_IOUT, + .gbit = PB_STATUS_IOUT_OC, + .limit = iout_limit_attrs, + .nlimit = ARRAY_SIZE(iout_limit_attrs), + } +}; + +/* Power attributes */ + +static const struct pmbus_limit_attr pin_limit_attrs[] = { + { + .reg = PMBUS_PIN_OP_WARN_LIMIT, + .attr = "max", + .alarm = "alarm", + .sbit = PB_PIN_OP_WARNING, + }, { + .reg = PMBUS_VIRT_READ_PIN_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_PIN_MIN, + .update = true, + .attr = "input_lowest", + }, { + .reg = PMBUS_VIRT_READ_PIN_MAX, + .update = true, + .attr = "input_highest", + }, { + .reg = PMBUS_VIRT_RESET_PIN_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_PIN_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr pout_limit_attrs[] = { + { + .reg = PMBUS_POUT_MAX, + .attr = "cap", + .alarm = "cap_alarm", + .sbit = PB_POWER_LIMITING, + }, { + .reg = PMBUS_POUT_OP_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_POUT_OP_WARNING, + }, { + .reg = PMBUS_POUT_OP_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_POUT_OP_FAULT, + }, { + .reg = PMBUS_VIRT_READ_POUT_AVG, + .update = true, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_POUT_MIN, + .update = true, + .attr = "input_lowest", + }, { + .reg = PMBUS_VIRT_READ_POUT_MAX, + .update = true, + .attr = "input_highest", + }, { + .reg = PMBUS_VIRT_RESET_POUT_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_POUT_MAX, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr power_attributes[] = { + { + .reg = PMBUS_READ_PIN, + .class = PSC_POWER, + .label = "pin", + .func = PMBUS_HAVE_PIN, + .sfunc = PMBUS_HAVE_STATUS_INPUT, + .sreg = PMBUS_STATUS_INPUT, + .gbit = PB_STATUS_INPUT, + .limit = pin_limit_attrs, + .nlimit = ARRAY_SIZE(pin_limit_attrs), + }, { + .reg = PMBUS_READ_POUT, + .class = PSC_POWER, + .label = "pout", + .paged = true, + .func = PMBUS_HAVE_POUT, + .sfunc = PMBUS_HAVE_STATUS_IOUT, + .sreg = PMBUS_STATUS_IOUT, + .limit = pout_limit_attrs, + .nlimit = ARRAY_SIZE(pout_limit_attrs), + } +}; + +/* Temperature atributes */ + +static const struct pmbus_limit_attr temp_limit_attrs[] = { + { + .reg = PMBUS_UT_WARN_LIMIT, + .low = true, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_TEMP_UT_WARNING, + }, { + .reg = PMBUS_UT_FAULT_LIMIT, + .low = true, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_TEMP_UT_FAULT, + }, { + .reg = PMBUS_OT_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_TEMP_OT_WARNING, + }, { + .reg = PMBUS_OT_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_TEMP_OT_FAULT, + }, { + .reg = PMBUS_VIRT_READ_TEMP_MIN, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_TEMP_AVG, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_TEMP_MAX, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_TEMP_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_MAX_TEMP_1, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr temp_limit_attrs2[] = { + { + .reg = PMBUS_UT_WARN_LIMIT, + .low = true, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_TEMP_UT_WARNING, + }, { + .reg = PMBUS_UT_FAULT_LIMIT, + .low = true, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_TEMP_UT_FAULT, + }, { + .reg = PMBUS_OT_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_TEMP_OT_WARNING, + }, { + .reg = PMBUS_OT_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_TEMP_OT_FAULT, + }, { + .reg = PMBUS_VIRT_READ_TEMP2_MIN, + .attr = "lowest", + }, { + .reg = PMBUS_VIRT_READ_TEMP2_AVG, + .attr = "average", + }, { + .reg = PMBUS_VIRT_READ_TEMP2_MAX, + .attr = "highest", + }, { + .reg = PMBUS_VIRT_RESET_TEMP2_HISTORY, + .attr = "reset_history", + }, { + .reg = PMBUS_MFR_MAX_TEMP_2, + .attr = "rated_max", + }, +}; + +static const struct pmbus_limit_attr temp_limit_attrs3[] = { + { + .reg = PMBUS_UT_WARN_LIMIT, + .low = true, + .attr = "min", + .alarm = "min_alarm", + .sbit = PB_TEMP_UT_WARNING, + }, { + .reg = PMBUS_UT_FAULT_LIMIT, + .low = true, + .attr = "lcrit", + .alarm = "lcrit_alarm", + .sbit = PB_TEMP_UT_FAULT, + }, { + .reg = PMBUS_OT_WARN_LIMIT, + .attr = "max", + .alarm = "max_alarm", + .sbit = PB_TEMP_OT_WARNING, + }, { + .reg = PMBUS_OT_FAULT_LIMIT, + .attr = "crit", + .alarm = "crit_alarm", + .sbit = PB_TEMP_OT_FAULT, + }, { + .reg = PMBUS_MFR_MAX_TEMP_3, + .attr = "rated_max", + }, +}; + +static const struct pmbus_sensor_attr temp_attributes[] = { + { + .reg = PMBUS_READ_TEMPERATURE_1, + .class = PSC_TEMPERATURE, + .paged = true, + .update = true, + .compare = true, + .func = PMBUS_HAVE_TEMP, + .sfunc = PMBUS_HAVE_STATUS_TEMP, + .sreg = PMBUS_STATUS_TEMPERATURE, + .gbit = PB_STATUS_TEMPERATURE, + .limit = temp_limit_attrs, + .nlimit = ARRAY_SIZE(temp_limit_attrs), + }, { + .reg = PMBUS_READ_TEMPERATURE_2, + .class = PSC_TEMPERATURE, + .paged = true, + .update = true, + .compare = true, + .func = PMBUS_HAVE_TEMP2, + .sfunc = PMBUS_HAVE_STATUS_TEMP, + .sreg = PMBUS_STATUS_TEMPERATURE, + .gbit = PB_STATUS_TEMPERATURE, + .limit = temp_limit_attrs2, + .nlimit = ARRAY_SIZE(temp_limit_attrs2), + }, { + .reg = PMBUS_READ_TEMPERATURE_3, + .class = PSC_TEMPERATURE, + .paged = true, + .update = true, + .compare = true, + .func = PMBUS_HAVE_TEMP3, + .sfunc = PMBUS_HAVE_STATUS_TEMP, + .sreg = PMBUS_STATUS_TEMPERATURE, + .gbit = PB_STATUS_TEMPERATURE, + .limit = temp_limit_attrs3, + .nlimit = ARRAY_SIZE(temp_limit_attrs3), + } +}; + +static const int pmbus_fan_registers[] = { + PMBUS_READ_FAN_SPEED_1, + PMBUS_READ_FAN_SPEED_2, + PMBUS_READ_FAN_SPEED_3, + PMBUS_READ_FAN_SPEED_4 +}; + +static const int pmbus_fan_status_registers[] = { + PMBUS_STATUS_FAN_12, + PMBUS_STATUS_FAN_12, + PMBUS_STATUS_FAN_34, + PMBUS_STATUS_FAN_34 +}; + +static const u32 pmbus_fan_flags[] = { + PMBUS_HAVE_FAN12, + PMBUS_HAVE_FAN12, + PMBUS_HAVE_FAN34, + PMBUS_HAVE_FAN34 +}; + +static const u32 pmbus_fan_status_flags[] = { + PMBUS_HAVE_STATUS_FAN12, + PMBUS_HAVE_STATUS_FAN12, + PMBUS_HAVE_STATUS_FAN34, + PMBUS_HAVE_STATUS_FAN34 +}; + +/* Fans */ + +/* Precondition: FAN_CONFIG_x_y and FAN_COMMAND_x must exist for the fan ID */ +static int pmbus_add_fan_ctrl(struct i2c_client *client, + struct pmbus_data *data, int index, int page, int id, + u8 config) +{ + struct pmbus_sensor *sensor; + + sensor = pmbus_add_sensor(data, "fan", "target", index, page, + 0xff, PMBUS_VIRT_FAN_TARGET_1 + id, PSC_FAN, + false, false, true); + + if (!sensor) + return -ENOMEM; + + if (!((data->info->func[page] & PMBUS_HAVE_PWM12) || + (data->info->func[page] & PMBUS_HAVE_PWM34))) + return 0; + + sensor = pmbus_add_sensor(data, "pwm", NULL, index, page, + 0xff, PMBUS_VIRT_PWM_1 + id, PSC_PWM, + false, false, true); + + if (!sensor) + return -ENOMEM; + + sensor = pmbus_add_sensor(data, "pwm", "enable", index, page, + 0xff, PMBUS_VIRT_PWM_ENABLE_1 + id, PSC_PWM, + true, false, false); + + if (!sensor) + return -ENOMEM; + + return 0; +} + +static int pmbus_add_fan_attributes(struct i2c_client *client, + struct pmbus_data *data) +{ + const struct pmbus_driver_info *info = data->info; + int index = 1; + int page; + int ret; + + for (page = 0; page < info->pages; page++) { + int f; + + for (f = 0; f < ARRAY_SIZE(pmbus_fan_registers); f++) { + int regval; + + if (!(info->func[page] & pmbus_fan_flags[f])) + break; + + if (!wb_pmbus_check_word_register(client, page, + pmbus_fan_registers[f])) + break; + + /* + * Skip fan if not installed. + * Each fan configuration register covers multiple fans, + * so we have to do some magic. + */ + regval = _pmbus_read_byte_data(client, page, + pmbus_fan_config_registers[f]); + if (regval < 0 || + (!(regval & (PB_FAN_1_INSTALLED >> ((f & 1) * 4))))) + continue; + + if (pmbus_add_sensor(data, "fan", "input", index, + page, 0xff, pmbus_fan_registers[f], + PSC_FAN, true, true, true) == NULL) + return -ENOMEM; + + /* Fan control */ + if (wb_pmbus_check_word_register(client, page, + pmbus_fan_command_registers[f])) { + ret = pmbus_add_fan_ctrl(client, data, index, + page, f, regval); + if (ret < 0) + return ret; + } + + /* + * Each fan status register covers multiple fans, + * so we have to do some magic. + */ + if ((info->func[page] & pmbus_fan_status_flags[f]) && + wb_pmbus_check_byte_register(client, + page, pmbus_fan_status_registers[f])) { + int reg; + + if (f > 1) /* fan 3, 4 */ + reg = PMBUS_STATUS_FAN_34; + else + reg = PMBUS_STATUS_FAN_12; + ret = pmbus_add_boolean(data, "fan", + "alarm", index, NULL, NULL, page, reg, + PB_FAN_FAN1_WARNING >> (f & 1)); + if (ret) + return ret; + ret = pmbus_add_boolean(data, "fan", + "fault", index, NULL, NULL, page, reg, + PB_FAN_FAN1_FAULT >> (f & 1)); + if (ret) + return ret; + } + index++; + } + } + return 0; +} + +struct pmbus_samples_attr { + int reg; + char *name; +}; + +struct pmbus_samples_reg { + int page; + struct pmbus_samples_attr *attr; + struct device_attribute dev_attr; +}; + +static struct pmbus_samples_attr pmbus_samples_registers[] = { + { + .reg = PMBUS_VIRT_SAMPLES, + .name = "samples", + }, { + .reg = PMBUS_VIRT_IN_SAMPLES, + .name = "in_samples", + }, { + .reg = PMBUS_VIRT_CURR_SAMPLES, + .name = "curr_samples", + }, { + .reg = PMBUS_VIRT_POWER_SAMPLES, + .name = "power_samples", + }, { + .reg = PMBUS_VIRT_TEMP_SAMPLES, + .name = "temp_samples", + } +}; + +#define to_samples_reg(x) container_of(x, struct pmbus_samples_reg, dev_attr) + +static ssize_t pmbus_show_samples(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int val; + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_samples_reg *reg = to_samples_reg(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + val = _pmbus_read_word_data(client, reg->page, 0xff, reg->attr->reg); + mutex_unlock(&data->update_lock); + if (val < 0) + return val; + + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t pmbus_set_samples(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + int ret; + long val; + struct i2c_client *client = to_i2c_client(dev->parent); + struct pmbus_samples_reg *reg = to_samples_reg(devattr); + struct pmbus_data *data = i2c_get_clientdata(client); + + if (kstrtol(buf, 0, &val) < 0) + return -EINVAL; + + mutex_lock(&data->update_lock); + ret = _pmbus_write_word_data(client, reg->page, reg->attr->reg, val); + mutex_unlock(&data->update_lock); + + return ret ? : count; +} + +static int pmbus_add_samples_attr(struct pmbus_data *data, int page, + struct pmbus_samples_attr *attr) +{ + struct pmbus_samples_reg *reg; + + reg = devm_kzalloc(data->dev, sizeof(*reg), GFP_KERNEL); + if (!reg) + return -ENOMEM; + + reg->attr = attr; + reg->page = page; + + pmbus_dev_attr_init(®->dev_attr, attr->name, 0644, + pmbus_show_samples, pmbus_set_samples); + + return pmbus_add_attribute(data, ®->dev_attr.attr); +} + +static int pmbus_add_samples_attributes(struct i2c_client *client, + struct pmbus_data *data) +{ + const struct pmbus_driver_info *info = data->info; + int s; + + if (!(info->func[0] & PMBUS_HAVE_SAMPLES)) + return 0; + + for (s = 0; s < ARRAY_SIZE(pmbus_samples_registers); s++) { + struct pmbus_samples_attr *attr; + int ret; + + attr = &pmbus_samples_registers[s]; + if (!wb_pmbus_check_word_register(client, 0, attr->reg)) + continue; + + ret = pmbus_add_samples_attr(data, 0, attr); + if (ret) + return ret; + } + + return 0; +} + +static int pmbus_find_attributes(struct i2c_client *client, + struct pmbus_data *data) +{ + int ret; + + /* Voltage sensors */ + ret = pmbus_add_sensor_attrs(client, data, "in", voltage_attributes, + ARRAY_SIZE(voltage_attributes)); + if (ret) + return ret; + + /* Current sensors */ + ret = pmbus_add_sensor_attrs(client, data, "curr", current_attributes, + ARRAY_SIZE(current_attributes)); + if (ret) + return ret; + + /* Power sensors */ + ret = pmbus_add_sensor_attrs(client, data, "power", power_attributes, + ARRAY_SIZE(power_attributes)); + if (ret) + return ret; + + /* Temperature sensors */ + ret = pmbus_add_sensor_attrs(client, data, "temp", temp_attributes, + ARRAY_SIZE(temp_attributes)); + if (ret) + return ret; + + /* Fans */ + ret = pmbus_add_fan_attributes(client, data); + if (ret) + return ret; + + ret = pmbus_add_samples_attributes(client, data); + return ret; +} + +/* + * Identify chip parameters. + * This function is called for all chips. + */ +static int pmbus_identify_common(struct i2c_client *client, + struct pmbus_data *data, int page) +{ + int vout_mode = -1; + + if (wb_pmbus_check_byte_register(client, page, PMBUS_VOUT_MODE)) + vout_mode = _pmbus_read_byte_data(client, page, + PMBUS_VOUT_MODE); + if (vout_mode >= 0 && vout_mode != 0xff) { + /* + * Not all chips support the VOUT_MODE command, + * so a failure to read it is not an error. + */ + switch (vout_mode >> 5) { + case 0: /* linear mode */ + if (data->info->format[PSC_VOLTAGE_OUT] != linear) + return -ENODEV; + + data->exponent[page] = ((s8)(vout_mode << 3)) >> 3; + break; + case 1: /* VID mode */ + if (data->info->format[PSC_VOLTAGE_OUT] != vid) + return -ENODEV; + break; + case 2: /* direct mode */ + if (data->info->format[PSC_VOLTAGE_OUT] != direct) + return -ENODEV; + break; + default: + return -ENODEV; + } + } + + pmbus_clear_fault_page(client, page); + return 0; +} + +static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data, + struct pmbus_driver_info *info) +{ + struct device *dev = &client->dev; + int page, ret, i; + + /* + * Some PMBus chips don't support PMBUS_STATUS_WORD, so try + * to use PMBUS_STATUS_BYTE instead if that is the case. + * Bail out if both registers are not supported. + */ + for(i = 0; i < PMBUS_RETRY_TIME; i++) { + data->read_status = pmbus_read_status_word; + ret = i2c_smbus_read_word_data(client, PMBUS_STATUS_WORD); + if (ret < 0 || ret == 0xffff) { + data->read_status = pmbus_read_status_byte; + ret = i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE); + if (ret < 0 || ret == 0xff) { + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + continue; + } + } else { + data->has_status_word = true; + } + break; + } + + if(i == PMBUS_RETRY_TIME) { + dev_err(dev, "PMBus status register not found\n"); + return -ENODEV; + } + + /* Enable PEC if the controller supports it */ + for(i = 0; i < PMBUS_RETRY_TIME; i++) { + ret = i2c_smbus_read_byte_data(client, PMBUS_CAPABILITY); + if (ret >= 0) { + break; + } + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + + if (ret >= 0 && (ret & PB_CAPABILITY_ERROR_CHECK)) + client->flags |= I2C_CLIENT_PEC; + + /* + * Check if the chip is write protected. If it is, we can not clear + * faults, and we should not try it. Also, in that case, writes into + * limit registers need to be disabled. + */ + for(i = 0; i < PMBUS_RETRY_TIME; i++) { + ret = i2c_smbus_read_byte_data(client, PMBUS_WRITE_PROTECT); + if (ret >= 0) { + break; + } + usleep_range(PMBUS_RETRY_SLEEP_TIME, PMBUS_RETRY_SLEEP_TIME + 1); + } + + if (ret > 0 && (ret & PB_WP_ANY)) + data->flags |= PMBUS_WRITE_PROTECTED | PMBUS_SKIP_STATUS_CHECK; + + if (data->info->pages) + wb_pmbus_clear_faults(client); + else + pmbus_clear_fault_page(client, -1); + + if (info->identify) { + ret = (*info->identify)(client, info); + if (ret < 0) { + dev_err(dev, "Chip identification failed\n"); + return ret; + } + } + + if (info->pages <= 0 || info->pages > PMBUS_PAGES) { + dev_err(dev, "Bad number of PMBus pages: %d\n", info->pages); + return -ENODEV; + } + + for (page = 0; page < info->pages; page++) { + ret = pmbus_identify_common(client, data, page); + if (ret < 0) { + dev_err(dev, "Failed to identify chip capabilities\n"); + return ret; + } + } + return 0; +} + +#if IS_ENABLED(CONFIG_REGULATOR) +static int pmbus_regulator_is_enabled(struct regulator_dev *rdev) +{ + struct device *dev = rdev_get_dev(rdev); + struct i2c_client *client = to_i2c_client(dev->parent); + u8 page = rdev_get_id(rdev); + int ret; + + ret = wb_pmbus_read_byte_data(client, page, PMBUS_OPERATION); + if (ret < 0) + return ret; + + return !!(ret & PB_OPERATION_CONTROL_ON); +} + +static int _pmbus_regulator_on_off(struct regulator_dev *rdev, bool enable) +{ + struct device *dev = rdev_get_dev(rdev); + struct i2c_client *client = to_i2c_client(dev->parent); + u8 page = rdev_get_id(rdev); + + return wb_pmbus_update_byte_data(client, page, PMBUS_OPERATION, + PB_OPERATION_CONTROL_ON, + enable ? PB_OPERATION_CONTROL_ON : 0); +} + +static int pmbus_regulator_enable(struct regulator_dev *rdev) +{ + return _pmbus_regulator_on_off(rdev, 1); +} + +static int pmbus_regulator_disable(struct regulator_dev *rdev) +{ + return _pmbus_regulator_on_off(rdev, 0); +} + +const struct regulator_ops wb_pmbus_regulator_ops = { + .enable = pmbus_regulator_enable, + .disable = pmbus_regulator_disable, + .is_enabled = pmbus_regulator_is_enabled, +}; +EXPORT_SYMBOL_GPL(wb_pmbus_regulator_ops); + +static int pmbus_regulator_register(struct pmbus_data *data) +{ + struct device *dev = data->dev; + const struct pmbus_driver_info *info = data->info; + const struct pmbus_platform_data *pdata = dev_get_platdata(dev); + struct regulator_dev *rdev; + int i; + + for (i = 0; i < info->num_regulators; i++) { + struct regulator_config config = { }; + + config.dev = dev; + config.driver_data = data; + + if (pdata && pdata->reg_init_data) + config.init_data = &pdata->reg_init_data[i]; + + rdev = devm_regulator_register(dev, &info->reg_desc[i], + &config); + if (IS_ERR(rdev)) { + dev_err(dev, "Failed to register %s regulator\n", + info->reg_desc[i].name); + return PTR_ERR(rdev); + } + } + + return 0; +} +#else +static int pmbus_regulator_register(struct pmbus_data *data) +{ + return 0; +} +#endif + +static struct dentry *pmbus_debugfs_dir; /* pmbus debugfs directory */ + +#if IS_ENABLED(CONFIG_DEBUG_FS) +static int pmbus_debugfs_get(void *data, u64 *val) +{ + int rc; + struct pmbus_debugfs_entry *entry = data; + + rc = _pmbus_read_byte_data(entry->client, entry->page, entry->reg); + if (rc < 0) + return rc; + + *val = rc; + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops, pmbus_debugfs_get, NULL, + "0x%02llx\n"); + +static int pmbus_debugfs_get_status(void *data, u64 *val) +{ + int rc; + struct pmbus_debugfs_entry *entry = data; + struct pmbus_data *pdata = i2c_get_clientdata(entry->client); + + rc = pdata->read_status(entry->client, entry->page); + if (rc < 0) + return rc; + + *val = rc; + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_status, pmbus_debugfs_get_status, + NULL, "0x%04llx\n"); + +static int pmbus_debugfs_get_pec(void *data, u64 *val) +{ + struct i2c_client *client = data; + + *val = !!(client->flags & I2C_CLIENT_PEC); + + return 0; +} + +static int pmbus_debugfs_set_pec(void *data, u64 val) +{ + int rc; + struct i2c_client *client = data; + + if (!val) { + client->flags &= ~I2C_CLIENT_PEC; + return 0; + } + + if (val != 1) + return -EINVAL; + + rc = i2c_smbus_read_byte_data(client, PMBUS_CAPABILITY); + if (rc < 0) + return rc; + + if (!(rc & PB_CAPABILITY_ERROR_CHECK)) + return -EOPNOTSUPP; + + client->flags |= I2C_CLIENT_PEC; + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(pmbus_debugfs_ops_pec, pmbus_debugfs_get_pec, + pmbus_debugfs_set_pec, "%llu\n"); + +static int pmbus_init_debugfs(struct i2c_client *client, + struct pmbus_data *data) +{ + int i, idx = 0; + char name[PMBUS_NAME_SIZE]; + struct pmbus_debugfs_entry *entries; + + if (!pmbus_debugfs_dir) + return -ENODEV; + + /* + * Create the debugfs directory for this device. Use the hwmon device + * name to avoid conflicts (hwmon numbers are globally unique). + */ + data->debugfs = debugfs_create_dir(dev_name(data->hwmon_dev), + pmbus_debugfs_dir); + if (IS_ERR_OR_NULL(data->debugfs)) { + data->debugfs = NULL; + return -ENODEV; + } + + /* Allocate the max possible entries we need. */ + entries = devm_kcalloc(data->dev, + data->info->pages * 10, sizeof(*entries), + GFP_KERNEL); + if (!entries) + return -ENOMEM; + + debugfs_create_file("pec", 0664, data->debugfs, client, + &pmbus_debugfs_ops_pec); + + for (i = 0; i < data->info->pages; ++i) { + /* Check accessibility of status register if it's not page 0 */ + if (!i || pmbus_check_status_register(client, i)) { + /* No need to set reg as we have special read op. */ + entries[idx].client = client; + entries[idx].page = i; + scnprintf(name, PMBUS_NAME_SIZE, "status%d", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops_status); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_VOUT) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_VOUT; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_vout", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_IOUT) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_IOUT; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_iout", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_INPUT) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_INPUT; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_input", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_TEMP) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_TEMPERATURE; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_temp", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (wb_pmbus_check_byte_register(client, i, PMBUS_STATUS_CML)) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_CML; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_cml", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (wb_pmbus_check_byte_register(client, i, PMBUS_STATUS_OTHER)) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_OTHER; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_other", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (wb_pmbus_check_byte_register(client, i, + PMBUS_STATUS_MFR_SPECIFIC)) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_MFR_SPECIFIC; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_mfr", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_FAN12) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_FAN_12; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_fan12", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + + if (data->info->func[i] & PMBUS_HAVE_STATUS_FAN34) { + entries[idx].client = client; + entries[idx].page = i; + entries[idx].reg = PMBUS_STATUS_FAN_34; + scnprintf(name, PMBUS_NAME_SIZE, "status%d_fan34", i); + debugfs_create_file(name, 0444, data->debugfs, + &entries[idx++], + &pmbus_debugfs_ops); + } + } + + return 0; +} +#else +static int pmbus_init_debugfs(struct i2c_client *client, + struct pmbus_data *data) +{ + return 0; +} +#endif /* IS_ENABLED(CONFIG_DEBUG_FS) */ + +int wb_pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info) +{ + struct device *dev = &client->dev; + const struct pmbus_platform_data *pdata = dev_get_platdata(dev); + struct pmbus_data *data; + size_t groups_num = 0; + int ret; + + if (!info) + return -ENODEV; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WRITE_BYTE + | I2C_FUNC_SMBUS_BYTE_DATA + | I2C_FUNC_SMBUS_WORD_DATA)) + return -ENODEV; + + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + if (info->groups) + while (info->groups[groups_num]) + groups_num++; + + data->groups = devm_kcalloc(dev, groups_num + 2, sizeof(void *), + GFP_KERNEL); + if (!data->groups) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + data->dev = dev; + + if (pdata) + data->flags = pdata->flags; + data->info = info; + data->currpage = -1; + data->currphase = -1; + + ret = pmbus_init_common(client, data, info); + if (ret < 0) + return ret; + + ret = pmbus_find_attributes(client, data); + if (ret) + return ret; + + /* + * If there are no attributes, something is wrong. + * Bail out instead of trying to register nothing. + */ + if (!data->num_attributes) { + dev_err(dev, "No attributes found\n"); + return -ENODEV; + } + + data->groups[0] = &data->group; + memcpy(data->groups + 1, info->groups, sizeof(void *) * groups_num); + data->hwmon_dev = devm_hwmon_device_register_with_groups(dev, + client->name, data, data->groups); + if (IS_ERR(data->hwmon_dev)) { + dev_err(dev, "Failed to register hwmon device\n"); + return PTR_ERR(data->hwmon_dev); + } + + ret = pmbus_regulator_register(data); + if (ret) + return ret; + + ret = pmbus_init_debugfs(client, data); + if (ret) + dev_warn(dev, "Failed to register debugfs\n"); + + return 0; +} +EXPORT_SYMBOL_GPL(wb_pmbus_do_probe); + +int wb_pmbus_do_remove(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + + debugfs_remove_recursive(data->debugfs); + + return 0; +} +EXPORT_SYMBOL_GPL(wb_pmbus_do_remove); + +struct dentry *wb_pmbus_get_debugfs_dir(struct i2c_client *client) +{ + struct pmbus_data *data = i2c_get_clientdata(client); + + return data->debugfs; +} +EXPORT_SYMBOL_GPL(wb_pmbus_get_debugfs_dir); + +static int __init pmbus_core_init(void) +{ + pmbus_debugfs_dir = debugfs_create_dir("pmbus", NULL); + if (IS_ERR(pmbus_debugfs_dir)) + pmbus_debugfs_dir = NULL; + + return 0; +} + +static void __exit pmbus_core_exit(void) +{ + debugfs_remove_recursive(pmbus_debugfs_dir); +} + +module_init(pmbus_core_init); +module_exit(pmbus_core_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus core driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c new file mode 100644 index 0000000000..4118510b10 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tmp401.c @@ -0,0 +1,798 @@ +/* tmp401.c + * + * Copyright (C) 2007,2008 Hans de Goede + * Preliminary tmp411 support by: + * Gabriel Konat, Sander Leget, Wouter Willems + * Copyright (C) 2009 Andre Prendel + * + * Cleanup and support for TMP431 and TMP432 by Guenter Roeck + * Copyright (c) 2013 Guenter Roeck + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Driver for the Texas Instruments TMP401 SMBUS temperature sensor IC. + * + * Note this IC is in some aspect similar to the LM90, but it has quite a + * few differences too, for example the local temp has a higher resolution + * and thus has 16 bits registers for its value and limit instead of 8 bits. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Addresses to scan */ +/* static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4c, 0x4d, + 0x4e, 0x4f, I2C_CLIENT_END }; */ + +enum chips { tmp401, tmp411, tmp431, tmp432, tmp435, tmp461 }; + +/* + * The TMP401 registers, note some registers have different addresses for + * reading and writing + */ +#define TMP401_STATUS 0x02 +#define TMP401_CONFIG_READ 0x03 +#define TMP401_CONFIG_WRITE 0x09 +#define TMP401_CONVERSION_RATE_READ 0x04 +#define TMP401_CONVERSION_RATE_WRITE 0x0A +#define TMP401_TEMP_CRIT_HYST 0x21 +#define TMP401_MANUFACTURER_ID_REG 0xFE +#define TMP401_DEVICE_ID_REG 0xFF + +static const u8 TMP401_TEMP_MSB_READ[7][2] = { + { 0x00, 0x01 }, /* temp */ + { 0x06, 0x08 }, /* low limit */ + { 0x05, 0x07 }, /* high limit */ + { 0x20, 0x19 }, /* therm (crit) limit */ + { 0x30, 0x34 }, /* lowest */ + { 0x32, 0x36 }, /* highest */ + { 0, 0x11 }, /* offset */ +}; + +static const u8 TMP401_TEMP_MSB_WRITE[7][2] = { + { 0, 0 }, /* temp (unused) */ + { 0x0C, 0x0E }, /* low limit */ + { 0x0B, 0x0D }, /* high limit */ + { 0x20, 0x19 }, /* therm (crit) limit */ + { 0x30, 0x34 }, /* lowest */ + { 0x32, 0x36 }, /* highest */ + { 0, 0x11 }, /* offset */ +}; + +static const u8 TMP401_TEMP_LSB[7][2] = { + { 0x15, 0x10 }, /* temp */ + { 0x17, 0x14 }, /* low limit */ + { 0x16, 0x13 }, /* high limit */ + { 0, 0 }, /* therm (crit) limit (unused) */ + { 0x31, 0x35 }, /* lowest */ + { 0x33, 0x37 }, /* highest */ + { 0, 0x12 }, /* offset */ +}; + +static const u8 TMP432_TEMP_MSB_READ[4][3] = { + { 0x00, 0x01, 0x23 }, /* temp */ + { 0x06, 0x08, 0x16 }, /* low limit */ + { 0x05, 0x07, 0x15 }, /* high limit */ + { 0x20, 0x19, 0x1A }, /* therm (crit) limit */ +}; + +static const u8 TMP432_TEMP_MSB_WRITE[4][3] = { + { 0, 0, 0 }, /* temp - unused */ + { 0x0C, 0x0E, 0x16 }, /* low limit */ + { 0x0B, 0x0D, 0x15 }, /* high limit */ + { 0x20, 0x19, 0x1A }, /* therm (crit) limit */ +}; + +static const u8 TMP432_TEMP_LSB[3][3] = { + { 0x29, 0x10, 0x24 }, /* temp */ + { 0x3E, 0x14, 0x18 }, /* low limit */ + { 0x3D, 0x13, 0x17 }, /* high limit */ +}; + +/* [0] = fault, [1] = low, [2] = high, [3] = therm/crit */ +static const u8 TMP432_STATUS_REG[] = { + 0x1b, 0x36, 0x35, 0x37 }; + +/* Flags */ +#define TMP401_CONFIG_RANGE BIT(2) +#define TMP401_CONFIG_SHUTDOWN BIT(6) +#define TMP401_STATUS_LOCAL_CRIT BIT(0) +#define TMP401_STATUS_REMOTE_CRIT BIT(1) +#define TMP401_STATUS_REMOTE_OPEN BIT(2) +#define TMP401_STATUS_REMOTE_LOW BIT(3) +#define TMP401_STATUS_REMOTE_HIGH BIT(4) +#define TMP401_STATUS_LOCAL_LOW BIT(5) +#define TMP401_STATUS_LOCAL_HIGH BIT(6) + +/* On TMP432, each status has its own register */ +#define TMP432_STATUS_LOCAL BIT(0) +#define TMP432_STATUS_REMOTE1 BIT(1) +#define TMP432_STATUS_REMOTE2 BIT(2) + +/* Manufacturer / Device ID's */ +#define TMP401_MANUFACTURER_ID 0x55 +#define TMP401_DEVICE_ID 0x11 +#define TMP411A_DEVICE_ID 0x12 +#define TMP411B_DEVICE_ID 0x13 +#define TMP411C_DEVICE_ID 0x10 +#define TMP431_DEVICE_ID 0x31 +#define TMP432_DEVICE_ID 0x32 +#define TMP435_DEVICE_ID 0x35 + +/* + * Driver data (common to all clients) + */ + +static const struct i2c_device_id tmp401_id[] = { + { "wb_tmp401", tmp401 }, + { "wb_tmp411", tmp411 }, + { "wb_tmp431", tmp431 }, + { "wb_tmp432", tmp432 }, + { "wb_tmp435", tmp435 }, + { "wb_tmp461", tmp461 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tmp401_id); + +/* + * Client data (each client gets its own) + */ + +struct tmp401_data { + struct i2c_client *client; + const struct attribute_group *groups[3]; + struct mutex update_lock; + char valid; /* zero until following fields are valid */ + unsigned long last_updated; /* in jiffies */ + enum chips kind; + + unsigned int update_interval; /* in milliseconds */ + + /* register values */ + u8 status[4]; + u8 config; + u16 temp[7][3]; + u8 temp_crit_hyst; +}; + +/* + * Sysfs attr show / store functions + */ + +static int tmp401_register_to_temp(u16 reg, u8 config) +{ + int temp = reg; + + if (config & TMP401_CONFIG_RANGE) + temp -= 64 * 256; + + return DIV_ROUND_CLOSEST(temp * 125, 32); +} + +static u16 tmp401_temp_to_register(long temp, u8 config, int zbits) +{ + if (config & TMP401_CONFIG_RANGE) { + temp = clamp_val(temp, -64000, 191000); + temp += 64000; + } else + temp = clamp_val(temp, 0, 127000); + + return DIV_ROUND_CLOSEST(temp * (1 << (8 - zbits)), 1000) << zbits; +} + +static int tmp401_update_device_reg16(struct i2c_client *client, + struct tmp401_data *data) +{ + int i, j, val; + int num_regs = data->kind == tmp411 ? 6 : 4; + int num_sensors = data->kind == tmp432 ? 3 : 2; + + for (i = 0; i < num_sensors; i++) { /* local / r1 / r2 */ + for (j = 0; j < num_regs; j++) { /* temp / low / ... */ + u8 regaddr; + /* + * High byte must be read first immediately followed + * by the low byte + */ + regaddr = data->kind == tmp432 ? + TMP432_TEMP_MSB_READ[j][i] : + TMP401_TEMP_MSB_READ[j][i]; + val = i2c_smbus_read_byte_data(client, regaddr); + if (val < 0) + return val; + data->temp[j][i] = val << 8; + if (j == 3) /* crit is msb only */ + continue; + regaddr = data->kind == tmp432 ? TMP432_TEMP_LSB[j][i] + : TMP401_TEMP_LSB[j][i]; + val = i2c_smbus_read_byte_data(client, regaddr); + if (val < 0) + return val; + data->temp[j][i] |= val; + } + } + return 0; +} + +static struct tmp401_data *tmp401_update_device(struct device *dev) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + struct tmp401_data *ret = data; + int i, val; + unsigned long next_update; + + mutex_lock(&data->update_lock); + + next_update = data->last_updated + + msecs_to_jiffies(data->update_interval); + if (time_after(jiffies, next_update) || !data->valid) { + if (data->kind != tmp432) { + /* + * The driver uses the TMP432 status format internally. + * Convert status to TMP432 format for other chips. + */ + val = i2c_smbus_read_byte_data(client, TMP401_STATUS); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->status[0] = + (val & TMP401_STATUS_REMOTE_OPEN) >> 1; + data->status[1] = + ((val & TMP401_STATUS_REMOTE_LOW) >> 2) | + ((val & TMP401_STATUS_LOCAL_LOW) >> 5); + data->status[2] = + ((val & TMP401_STATUS_REMOTE_HIGH) >> 3) | + ((val & TMP401_STATUS_LOCAL_HIGH) >> 6); + data->status[3] = val & (TMP401_STATUS_LOCAL_CRIT + | TMP401_STATUS_REMOTE_CRIT); + } else { + for (i = 0; i < ARRAY_SIZE(data->status); i++) { + val = i2c_smbus_read_byte_data(client, + TMP432_STATUS_REG[i]); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->status[i] = val; + } + } + + val = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->config = val; + val = tmp401_update_device_reg16(client, data); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + val = i2c_smbus_read_byte_data(client, TMP401_TEMP_CRIT_HYST); + if (val < 0) { + ret = ERR_PTR(val); + goto abort; + } + data->temp_crit_hyst = val; + + data->last_updated = jiffies; + data->valid = 1; + } + +abort: + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t show_temp(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int nr = to_sensor_dev_attr_2(devattr)->nr; + int index = to_sensor_dev_attr_2(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + + if (IS_ERR(data)) + return PTR_ERR(data); + + return sprintf(buf, "%d\n", + tmp401_register_to_temp(data->temp[nr][index], data->config)); +} + +static ssize_t show_temp_crit_hyst(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int temp, index = to_sensor_dev_attr(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + + if (IS_ERR(data)) + return PTR_ERR(data); + + mutex_lock(&data->update_lock); + temp = tmp401_register_to_temp(data->temp[3][index], data->config); + temp -= data->temp_crit_hyst * 1000; + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", temp); +} + +static ssize_t show_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + int nr = to_sensor_dev_attr_2(devattr)->nr; + int mask = to_sensor_dev_attr_2(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + + if (IS_ERR(data)) + return PTR_ERR(data); + + return sprintf(buf, "%d\n", !!(data->status[nr] & mask)); +} + +static ssize_t store_temp(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + int nr = to_sensor_dev_attr_2(devattr)->nr; + int index = to_sensor_dev_attr_2(devattr)->index; + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + long val; + u16 reg; + u8 regaddr; + + if (kstrtol(buf, 10, &val)) + return -EINVAL; + + reg = tmp401_temp_to_register(val, data->config, nr == 3 ? 8 : 4); + + mutex_lock(&data->update_lock); + + regaddr = data->kind == tmp432 ? TMP432_TEMP_MSB_WRITE[nr][index] + : TMP401_TEMP_MSB_WRITE[nr][index]; + i2c_smbus_write_byte_data(client, regaddr, reg >> 8); + if (nr != 3) { + regaddr = data->kind == tmp432 ? TMP432_TEMP_LSB[nr][index] + : TMP401_TEMP_LSB[nr][index]; + i2c_smbus_write_byte_data(client, regaddr, reg & 0xFF); + } + data->temp[nr][index] = reg; + + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t store_temp_crit_hyst(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + int temp, index = to_sensor_dev_attr(devattr)->index; + struct tmp401_data *data = tmp401_update_device(dev); + long val; + u8 reg; + + if (IS_ERR(data)) + return PTR_ERR(data); + + if (kstrtol(buf, 10, &val)) + return -EINVAL; + + if (data->config & TMP401_CONFIG_RANGE) + val = clamp_val(val, -64000, 191000); + else + val = clamp_val(val, 0, 127000); + + mutex_lock(&data->update_lock); + temp = tmp401_register_to_temp(data->temp[3][index], data->config); + val = clamp_val(val, temp - 255000, temp); + reg = ((temp - val) + 500) / 1000; + + i2c_smbus_write_byte_data(data->client, TMP401_TEMP_CRIT_HYST, + reg); + + data->temp_crit_hyst = reg; + + mutex_unlock(&data->update_lock); + + return count; +} + +/* + * Resets the historical measurements of minimum and maximum temperatures. + * This is done by writing any value to any of the minimum/maximum registers + * (0x30-0x37). + */ +static ssize_t reset_temp_history(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + long val; + + if (kstrtol(buf, 10, &val)) + return -EINVAL; + + if (val != 1) { + dev_err(dev, + "temp_reset_history value %ld not supported. Use 1 to reset the history!\n", + val); + return -EINVAL; + } + mutex_lock(&data->update_lock); + i2c_smbus_write_byte_data(client, TMP401_TEMP_MSB_WRITE[5][0], val); + data->valid = 0; + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_update_interval(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", data->update_interval); +} + +static ssize_t set_update_interval(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct tmp401_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + unsigned long val; + int err, rate; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + + /* + * For valid rates, interval can be calculated as + * interval = (1 << (7 - rate)) * 125; + * Rounded rate is therefore + * rate = 7 - __fls(interval * 4 / (125 * 3)); + * Use clamp_val() to avoid overflows, and to ensure valid input + * for __fls. + */ + val = clamp_val(val, 125, 16000); + rate = 7 - __fls(val * 4 / (125 * 3)); + mutex_lock(&data->update_lock); + i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, rate); + data->update_interval = (1 << (7 - rate)) * 125; + mutex_unlock(&data->update_lock); + + return count; +} + +static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0); +static SENSOR_DEVICE_ATTR_2(temp1_min, S_IWUSR | S_IRUGO, show_temp, + store_temp, 1, 0); +static SENSOR_DEVICE_ATTR_2(temp1_max, S_IWUSR | S_IRUGO, show_temp, + store_temp, 2, 0); +static SENSOR_DEVICE_ATTR_2(temp1_crit, S_IWUSR | S_IRUGO, show_temp, + store_temp, 3, 0); +static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, + show_temp_crit_hyst, store_temp_crit_hyst, 0); +static SENSOR_DEVICE_ATTR_2(temp1_min_alarm, S_IRUGO, show_status, NULL, + 1, TMP432_STATUS_LOCAL); +static SENSOR_DEVICE_ATTR_2(temp1_max_alarm, S_IRUGO, show_status, NULL, + 2, TMP432_STATUS_LOCAL); +static SENSOR_DEVICE_ATTR_2(temp1_crit_alarm, S_IRUGO, show_status, NULL, + 3, TMP432_STATUS_LOCAL); +static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1); +static SENSOR_DEVICE_ATTR_2(temp2_min, S_IWUSR | S_IRUGO, show_temp, + store_temp, 1, 1); +static SENSOR_DEVICE_ATTR_2(temp2_max, S_IWUSR | S_IRUGO, show_temp, + store_temp, 2, 1); +static SENSOR_DEVICE_ATTR_2(temp2_crit, S_IWUSR | S_IRUGO, show_temp, + store_temp, 3, 1); +static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, + NULL, 1); +static SENSOR_DEVICE_ATTR_2(temp2_fault, S_IRUGO, show_status, NULL, + 0, TMP432_STATUS_REMOTE1); +static SENSOR_DEVICE_ATTR_2(temp2_min_alarm, S_IRUGO, show_status, NULL, + 1, TMP432_STATUS_REMOTE1); +static SENSOR_DEVICE_ATTR_2(temp2_max_alarm, S_IRUGO, show_status, NULL, + 2, TMP432_STATUS_REMOTE1); +static SENSOR_DEVICE_ATTR_2(temp2_crit_alarm, S_IRUGO, show_status, NULL, + 3, TMP432_STATUS_REMOTE1); + +static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval, + set_update_interval); + +static struct attribute *tmp401_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_min.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp1_crit.dev_attr.attr, + &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, + + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp2_min.dev_attr.attr, + &sensor_dev_attr_temp2_max.dev_attr.attr, + &sensor_dev_attr_temp2_crit.dev_attr.attr, + &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp2_fault.dev_attr.attr, + &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, + + &dev_attr_update_interval.attr, + + NULL +}; + +static const struct attribute_group tmp401_group = { + .attrs = tmp401_attributes, +}; + +/* + * Additional features of the TMP411 chip. + * The TMP411 stores the minimum and maximum + * temperature measured since power-on, chip-reset, or + * minimum and maximum register reset for both the local + * and remote channels. + */ +static SENSOR_DEVICE_ATTR_2(temp1_lowest, S_IRUGO, show_temp, NULL, 4, 0); +static SENSOR_DEVICE_ATTR_2(temp1_highest, S_IRUGO, show_temp, NULL, 5, 0); +static SENSOR_DEVICE_ATTR_2(temp2_lowest, S_IRUGO, show_temp, NULL, 4, 1); +static SENSOR_DEVICE_ATTR_2(temp2_highest, S_IRUGO, show_temp, NULL, 5, 1); +static SENSOR_DEVICE_ATTR(temp_reset_history, S_IWUSR, NULL, reset_temp_history, + 0); + +static struct attribute *tmp411_attributes[] = { + &sensor_dev_attr_temp1_highest.dev_attr.attr, + &sensor_dev_attr_temp1_lowest.dev_attr.attr, + &sensor_dev_attr_temp2_highest.dev_attr.attr, + &sensor_dev_attr_temp2_lowest.dev_attr.attr, + &sensor_dev_attr_temp_reset_history.dev_attr.attr, + NULL +}; + +static const struct attribute_group tmp411_group = { + .attrs = tmp411_attributes, +}; + +static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2); +static SENSOR_DEVICE_ATTR_2(temp3_min, S_IWUSR | S_IRUGO, show_temp, + store_temp, 1, 2); +static SENSOR_DEVICE_ATTR_2(temp3_max, S_IWUSR | S_IRUGO, show_temp, + store_temp, 2, 2); +static SENSOR_DEVICE_ATTR_2(temp3_crit, S_IWUSR | S_IRUGO, show_temp, + store_temp, 3, 2); +static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, + NULL, 2); +static SENSOR_DEVICE_ATTR_2(temp3_fault, S_IRUGO, show_status, NULL, + 0, TMP432_STATUS_REMOTE2); +static SENSOR_DEVICE_ATTR_2(temp3_min_alarm, S_IRUGO, show_status, NULL, + 1, TMP432_STATUS_REMOTE2); +static SENSOR_DEVICE_ATTR_2(temp3_max_alarm, S_IRUGO, show_status, NULL, + 2, TMP432_STATUS_REMOTE2); +static SENSOR_DEVICE_ATTR_2(temp3_crit_alarm, S_IRUGO, show_status, NULL, + 3, TMP432_STATUS_REMOTE2); + +static struct attribute *tmp432_attributes[] = { + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp3_min.dev_attr.attr, + &sensor_dev_attr_temp3_max.dev_attr.attr, + &sensor_dev_attr_temp3_crit.dev_attr.attr, + &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp3_fault.dev_attr.attr, + &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp3_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, + + NULL +}; + +static const struct attribute_group tmp432_group = { + .attrs = tmp432_attributes, +}; + +/* + * Additional features of the TMP461 chip. + * The TMP461 temperature offset for the remote channel. + */ +static SENSOR_DEVICE_ATTR_2(temp2_offset, S_IWUSR | S_IRUGO, show_temp, + store_temp, 6, 1); + +static struct attribute *tmp461_attributes[] = { + &sensor_dev_attr_temp2_offset.dev_attr.attr, + NULL +}; + +static const struct attribute_group tmp461_group = { + .attrs = tmp461_attributes, +}; + +/* + * Begin non sysfs callback code (aka Real code) + */ + +static int tmp401_init_client(struct tmp401_data *data, + struct i2c_client *client) +{ + int config, config_orig, status = 0; + + /* Set the conversion rate to 2 Hz */ + i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5); + data->update_interval = 500; + + /* Start conversions (disable shutdown if necessary) */ + config = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); + if (config < 0) + return config; + + config_orig = config; + config &= ~TMP401_CONFIG_SHUTDOWN; + + if (config != config_orig) + status = i2c_smbus_write_byte_data(client, + TMP401_CONFIG_WRITE, + config); + + return status; +} + +#if 0 +static int tmp401_detect(struct i2c_client *client, + struct i2c_board_info *info) +{ + enum chips kind; + struct i2c_adapter *adapter = client->adapter; + u8 reg; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) + return -ENODEV; + + /* Detect and identify the chip */ + reg = i2c_smbus_read_byte_data(client, TMP401_MANUFACTURER_ID_REG); + if (reg != TMP401_MANUFACTURER_ID) + return -ENODEV; + + reg = i2c_smbus_read_byte_data(client, TMP401_DEVICE_ID_REG); + + switch (reg) { + case TMP401_DEVICE_ID: + if (client->addr != 0x4c) + return -ENODEV; + kind = tmp401; + break; + case TMP411A_DEVICE_ID: + if (client->addr != 0x4c) + return -ENODEV; + kind = tmp411; + break; + case TMP411B_DEVICE_ID: + if (client->addr != 0x4d) + return -ENODEV; + kind = tmp411; + break; + case TMP411C_DEVICE_ID: + if (client->addr != 0x4e) + return -ENODEV; + kind = tmp411; + break; + case TMP431_DEVICE_ID: + if (client->addr != 0x4c && client->addr != 0x4d) + return -ENODEV; + kind = tmp431; + break; + case TMP432_DEVICE_ID: + if (client->addr != 0x4c && client->addr != 0x4d) + return -ENODEV; + kind = tmp432; + break; + case TMP435_DEVICE_ID: + kind = tmp435; + break; + default: + return -ENODEV; + } + + reg = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); + if (reg & 0x1b) + return -ENODEV; + + reg = i2c_smbus_read_byte_data(client, TMP401_CONVERSION_RATE_READ); + /* Datasheet says: 0x1-0x6 */ + if (reg > 15) + return -ENODEV; + + strlcpy(info->type, tmp401_id[kind].name, I2C_NAME_SIZE); + + return 0; +} +#endif + +static int tmp401_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + static const char * const names[] = { + "TMP401", "TMP411", "TMP431", "TMP432", "TMP435", "TMP461" + }; + struct device *dev = &client->dev; + struct device *hwmon_dev; + struct tmp401_data *data; + int groups = 0, status; + + data = devm_kzalloc(dev, sizeof(struct tmp401_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->client = client; + mutex_init(&data->update_lock); + data->kind = id->driver_data; + + /* Initialize the TMP401 chip */ + status = tmp401_init_client(data, client); + if (status < 0) + return status; + + /* Register sysfs hooks */ + data->groups[groups++] = &tmp401_group; + + /* Register additional tmp411 sysfs hooks */ + if (data->kind == tmp411) + data->groups[groups++] = &tmp411_group; + + /* Register additional tmp432 sysfs hooks */ + if (data->kind == tmp432) + data->groups[groups++] = &tmp432_group; + + if (data->kind == tmp461) + data->groups[groups++] = &tmp461_group; + + hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, + data, data->groups); + if (IS_ERR(hwmon_dev)) + return PTR_ERR(hwmon_dev); + + dev_info(dev, "Detected TI %s chip\n", names[data->kind]); + + return 0; +} + +static struct i2c_driver tmp401_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wb_tmp401", + }, + .probe = tmp401_probe, + .id_table = tmp401_id, + /* .detect = tmp401_detect, */ + /* .address_list = normal_i2c, */ +}; + +module_i2c_driver(tmp401_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Texas Instruments TMP401 temperature sensor driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c new file mode 100644 index 0000000000..b68196d9f5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_tps53622.c @@ -0,0 +1,265 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for Texas Instruments TPS53679 + * + * Copyright (c) 2017 Mellanox Technologies. All rights reserved. + * Copyright (c) 2017 Vadim Pasternak + */ + +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +enum chips { + tps53647, tps53667, tps53679, tps53681, tps53688, tps53622 +}; + +#define TPS53647_PAGE_NUM 1 + +#define TPS53679_PROT_VR12_5MV 0x01 /* VR12.0 mode, 5-mV DAC */ +#define TPS53679_PROT_VR12_5_10MV 0x02 /* VR12.5 mode, 10-mV DAC */ +#define TPS53679_PROT_VR13_10MV 0x04 /* VR13.0 mode, 10-mV DAC */ +#define TPS53679_PROT_IMVP8_5MV 0x05 /* IMVP8 mode, 5-mV DAC */ +#define TPS53679_PROT_VR13_5MV 0x07 /* VR13.0 mode, 5-mV DAC */ +#define TPS53679_PAGE_NUM 2 + +#define TPS53681_DEVICE_ID 0x81 + +#define TPS53681_PMBUS_REVISION 0x33 + +#define TPS53681_MFR_SPECIFIC_20 0xe4 /* Number of phases, per page */ + +static const struct i2c_device_id tps53679_id[]; + +static int tps53679_identify_mode(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + u8 vout_params; + int i, ret; + + for (i = 0; i < info->pages; i++) { + /* Read the register with VOUT scaling value.*/ + ret = wb_pmbus_read_byte_data(client, i, PMBUS_VOUT_MODE); + if (ret < 0) + return ret; + + vout_params = ret & GENMASK(4, 0); + + switch (vout_params) { + case TPS53679_PROT_VR13_10MV: + case TPS53679_PROT_VR12_5_10MV: + info->vrm_version[i] = vr13; + break; + case TPS53679_PROT_VR13_5MV: + case TPS53679_PROT_VR12_5MV: + case TPS53679_PROT_IMVP8_5MV: + info->vrm_version[i] = vr12; + break; + default: + return -EINVAL; + } + } + + return 0; +} + +static int tps53679_identify_phases(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + int ret; + + /* On TPS53681, only channel A provides per-phase output current */ + ret = wb_pmbus_read_byte_data(client, 0, TPS53681_MFR_SPECIFIC_20); + if (ret < 0) + return ret; + info->phases[0] = (ret & 0x07) + 1; + + return 0; +} + +static int tps53679_identify_chip(struct i2c_client *client, + u8 revision, u16 id) +{ + u8 buf[I2C_SMBUS_BLOCK_MAX]; + int ret; + + ret = wb_pmbus_read_byte_data(client, 0, PMBUS_REVISION); + if (ret < 0) + return ret; + if (ret != revision) { + dev_err(&client->dev, "Unexpected PMBus revision 0x%x\n", ret); + return -ENODEV; + } + + ret = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, buf); + if (ret < 0) + return ret; + if (ret != 1 || buf[0] != id) { + dev_err(&client->dev, "Unexpected device ID 0x%x\n", buf[0]); + return -ENODEV; + } + return 0; +} + +/* + * Common identification function for chips with multi-phase support. + * Since those chips have special configuration registers, we want to have + * some level of reassurance that we are really talking with the chip + * being probed. Check PMBus revision and chip ID. + */ +static int tps53679_identify_multiphase(struct i2c_client *client, + struct pmbus_driver_info *info, + int pmbus_rev, int device_id) +{ + int ret; + + ret = tps53679_identify_chip(client, pmbus_rev, device_id); + if (ret < 0) + return ret; + + ret = tps53679_identify_mode(client, info); + if (ret < 0) + return ret; + + return tps53679_identify_phases(client, info); +} + +static int tps53679_identify(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + return tps53679_identify_mode(client, info); +} + +static int tps53681_identify(struct i2c_client *client, + struct pmbus_driver_info *info) +{ + return tps53679_identify_multiphase(client, info, + TPS53681_PMBUS_REVISION, + TPS53681_DEVICE_ID); +} + +static int tps53681_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + /* + * For reading the total output current (READ_IOUT) for all phases, + * the chip datasheet is a bit vague. It says "PHASE must be set to + * FFh to access all phases simultaneously. PHASE may also be set to + * 80h readack (!) the total phase current". + * Experiments show that the command does _not_ report the total + * current for all phases if the phase is set to 0xff. Instead, it + * appears to report the current of one of the phases. Override phase + * parameter with 0x80 when reading the total output current on page 0. + */ + if (reg == PMBUS_READ_IOUT && page == 0 && phase == 0xff) + return wb_pmbus_read_word_data(client, page, 0x80, reg); + return -ENODATA; +} + +static struct pmbus_driver_info tps53679_info = { + .format[PSC_VOLTAGE_IN] = linear, + .format[PSC_VOLTAGE_OUT] = vid, + .format[PSC_TEMPERATURE] = linear, + .format[PSC_CURRENT_OUT] = linear, + .format[PSC_POWER] = linear, + .func[0] = PMBUS_HAVE_VIN | PMBUS_HAVE_IIN | PMBUS_HAVE_PIN | + PMBUS_HAVE_STATUS_INPUT | + PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | + PMBUS_HAVE_POUT, + .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | + PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | + PMBUS_HAVE_POUT, + .pfunc[0] = PMBUS_HAVE_IOUT, + .pfunc[1] = PMBUS_HAVE_IOUT, + .pfunc[2] = PMBUS_HAVE_IOUT, + .pfunc[3] = PMBUS_HAVE_IOUT, + .pfunc[4] = PMBUS_HAVE_IOUT, + .pfunc[5] = PMBUS_HAVE_IOUT, +}; + +static int tps53679_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct pmbus_driver_info *info; + enum chips chip_id; + + if (dev->of_node) + chip_id = (enum chips)of_device_get_match_data(dev); + else + chip_id = i2c_match_id(tps53679_id, client)->driver_data; + + info = devm_kmemdup(dev, &tps53679_info, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + switch (chip_id) { + case tps53647: + case tps53667: + info->pages = TPS53647_PAGE_NUM; + info->identify = tps53679_identify; + break; + case tps53679: + case tps53688: + case tps53622: + info->pages = TPS53679_PAGE_NUM; + info->identify = tps53679_identify; + break; + case tps53681: + info->pages = TPS53679_PAGE_NUM; + info->phases[0] = 6; + info->identify = tps53681_identify; + info->read_word_data = tps53681_read_word_data; + break; + default: + return -ENODEV; + } + + return wb_pmbus_do_probe(client, info); +} + +static const struct i2c_device_id tps53679_id[] = { + {"wb_tps53647", tps53647}, + {"wb_tps53667", tps53667}, + {"wb_tps53679", tps53679}, + {"wb_tps53681", tps53681}, + {"wb_tps53688", tps53688}, + {"wb_tps53622", tps53622}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, tps53679_id); + +static const struct of_device_id __maybe_unused tps53679_of_match[] = { + {.compatible = "ti,wb_tps53647", .data = (void *)tps53647}, + {.compatible = "ti,wb_tps53667", .data = (void *)tps53667}, + {.compatible = "ti,wb_tps53679", .data = (void *)tps53679}, + {.compatible = "ti,wb_tps53681", .data = (void *)tps53681}, + {.compatible = "ti,wb_tps53688", .data = (void *)tps53688}, + {.compatible = "ti,wb_tps53622", .data = (void *)tps53622}, + {} +}; +MODULE_DEVICE_TABLE(of, tps53679_of_match); + +static struct i2c_driver tps53679_driver = { + .driver = { + .name = "wb_tps53622", + .of_match_table = of_match_ptr(tps53679_of_match), + }, + .probe_new = tps53679_probe, + .remove = wb_pmbus_do_remove, + .id_table = tps53679_id, +}; + +module_i2c_driver(tps53679_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus driver for Texas Instruments TPS53679"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c new file mode 100644 index 0000000000..9b967f141a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/linux-5.10/wb_ucd9000.c @@ -0,0 +1,675 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Hardware monitoring driver for UCD90xxx Sequencer and System Health + * Controller series + * + * Copyright (C) 2011 Ericsson AB. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wb_pmbus.h" + +enum chips { ucd9000, ucd90120, ucd90124, ucd90160, ucd90320, ucd9090, + ucd90910 }; + +#define UCD9000_MONITOR_CONFIG 0xd5 +#define UCD9000_NUM_PAGES 0xd6 +#define UCD9000_FAN_CONFIG_INDEX 0xe7 +#define UCD9000_FAN_CONFIG 0xe8 +#define UCD9000_MFR_STATUS 0xf3 +#define UCD9000_GPIO_SELECT 0xfa +#define UCD9000_GPIO_CONFIG 0xfb +#define UCD9000_DEVICE_ID 0xfd + +/* GPIO CONFIG bits */ +#define UCD9000_GPIO_CONFIG_ENABLE BIT(0) +#define UCD9000_GPIO_CONFIG_OUT_ENABLE BIT(1) +#define UCD9000_GPIO_CONFIG_OUT_VALUE BIT(2) +#define UCD9000_GPIO_CONFIG_STATUS BIT(3) +#define UCD9000_GPIO_INPUT 0 +#define UCD9000_GPIO_OUTPUT 1 + +#define UCD9000_MON_TYPE(x) (((x) >> 5) & 0x07) +#define UCD9000_MON_PAGE(x) ((x) & 0x1f) + +#define UCD9000_MON_VOLTAGE 1 +#define UCD9000_MON_TEMPERATURE 2 +#define UCD9000_MON_CURRENT 3 +#define UCD9000_MON_VOLTAGE_HW 4 + +#define UCD9000_NUM_FAN 4 + +#define UCD9000_GPIO_NAME_LEN 16 +#define UCD9090_NUM_GPIOS 23 +#define UCD901XX_NUM_GPIOS 26 +#define UCD90320_NUM_GPIOS 84 +#define UCD90910_NUM_GPIOS 26 + +#define UCD9000_DEBUGFS_NAME_LEN 24 +#define UCD9000_GPI_COUNT 8 +#define UCD90320_GPI_COUNT 32 + +#define UCD9000_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define UCD9000_RETRY_TIME (3) +#define WB_DEV_NAME_MAX_LEN (64) + +static int g_wb_ucd9000_debug = 0; +static int g_wb_ucd9000_error = 0; + +module_param(g_wb_ucd9000_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_ucd9000_error, int, S_IRUGO | S_IWUSR); + +#define WB_UDC9000_VERBOSE(fmt, args...) do { \ + if (g_wb_ucd9000_debug) { \ + printk(KERN_INFO "[WB_UCD9000][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_UDC9000_ERROR(fmt, args...) do { \ + if (g_wb_ucd9000_error) { \ + printk(KERN_ERR "[WB_UCD9000][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct ucd9000_data { + u8 fan_data[UCD9000_NUM_FAN][I2C_SMBUS_BLOCK_MAX]; + struct pmbus_driver_info info; +#ifdef CONFIG_GPIOLIB + struct gpio_chip gpio; +#endif + struct dentry *debugfs; +}; +#define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info) + +struct ucd9000_debugfs_entry { + struct i2c_client *client; + u8 index; +}; + +static int wb_i2c_smbus_read_block_data(const struct i2c_client *client, u8 command, u8 *values) +{ + int rv, i; + + for(i = 0; i < UCD9000_RETRY_TIME; i++) { + rv = i2c_smbus_read_block_data(client, command, values); + if(rv >= 0){ + return rv; + } + usleep_range(UCD9000_RETRY_SLEEP_TIME, UCD9000_RETRY_SLEEP_TIME + 1); + } + WB_UDC9000_ERROR("read_block_data failed. nr:%d, addr:0x%x, reg:0x%x, rv:%d.", + client->adapter->nr, client->addr, command, rv); + return rv; +} + +static int ucd9000_get_fan_config(struct i2c_client *client, int fan) +{ + int fan_config = 0; + struct ucd9000_data *data + = to_ucd9000_data(wb_pmbus_get_driver_info(client)); + + if (data->fan_data[fan][3] & 1) + fan_config |= PB_FAN_2_INSTALLED; /* Use lower bit position */ + + /* Pulses/revolution */ + fan_config |= (data->fan_data[fan][3] & 0x06) >> 1; + + return fan_config; +} + +static int ucd9000_read_byte_data(struct i2c_client *client, int page, int reg) +{ + int ret = 0; + int fan_config; + + switch (reg) { + case PMBUS_FAN_CONFIG_12: + if (page > 0) + return -ENXIO; + + ret = ucd9000_get_fan_config(client, 0); + if (ret < 0) + return ret; + fan_config = ret << 4; + ret = ucd9000_get_fan_config(client, 1); + if (ret < 0) + return ret; + fan_config |= ret; + ret = fan_config; + break; + case PMBUS_FAN_CONFIG_34: + if (page > 0) + return -ENXIO; + + ret = ucd9000_get_fan_config(client, 2); + if (ret < 0) + return ret; + fan_config = ret << 4; + ret = ucd9000_get_fan_config(client, 3); + if (ret < 0) + return ret; + fan_config |= ret; + ret = fan_config; + break; + default: + ret = -ENODATA; + break; + } + return ret; +} + +static const struct i2c_device_id ucd9000_id[] = { + {"wb_ucd9000", ucd9000}, + {"wb_ucd90120", ucd90120}, + {"wb_ucd90124", ucd90124}, + {"wb_ucd90160", ucd90160}, + {"wb_ucd90320", ucd90320}, + {"wb_ucd9090", ucd9090}, + {"wb_ucd90910", ucd90910}, + {} +}; +MODULE_DEVICE_TABLE(i2c, ucd9000_id); + +static const struct of_device_id __maybe_unused ucd9000_of_match[] = { + { + .compatible = "ti,wb_ucd9000", + .data = (void *)ucd9000 + }, + { + .compatible = "ti,wb_ucd90120", + .data = (void *)ucd90120 + }, + { + .compatible = "ti,wb_ucd90124", + .data = (void *)ucd90124 + }, + { + .compatible = "ti,wb_ucd90160", + .data = (void *)ucd90160 + }, + { + .compatible = "ti,wb_ucd90320", + .data = (void *)ucd90320 + }, + { + .compatible = "ti,wb_ucd9090", + .data = (void *)ucd9090 + }, + { + .compatible = "ti,wb_ucd90910", + .data = (void *)ucd90910 + }, + { }, +}; +MODULE_DEVICE_TABLE(of, ucd9000_of_match); + +#ifdef CONFIG_GPIOLIB +static int ucd9000_gpio_read_config(struct i2c_client *client, + unsigned int offset) +{ + int ret; + + /* No page set required */ + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_SELECT, offset); + if (ret < 0) + return ret; + + return i2c_smbus_read_byte_data(client, UCD9000_GPIO_CONFIG); +} + +static int ucd9000_gpio_get(struct gpio_chip *gc, unsigned int offset) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) + return ret; + + return !!(ret & UCD9000_GPIO_CONFIG_STATUS); +} + +static void ucd9000_gpio_set(struct gpio_chip *gc, unsigned int offset, + int value) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) { + dev_dbg(&client->dev, "failed to read GPIO %d config: %d\n", + offset, ret); + return; + } + + if (value) { + if (ret & UCD9000_GPIO_CONFIG_STATUS) + return; + + ret |= UCD9000_GPIO_CONFIG_STATUS; + } else { + if (!(ret & UCD9000_GPIO_CONFIG_STATUS)) + return; + + ret &= ~UCD9000_GPIO_CONFIG_STATUS; + } + + ret |= UCD9000_GPIO_CONFIG_ENABLE; + + /* Page set not required */ + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret); + if (ret < 0) { + dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n", + offset, ret); + return; + } + + ret &= ~UCD9000_GPIO_CONFIG_ENABLE; + + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret); + if (ret < 0) + dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n", + offset, ret); +} + +static int ucd9000_gpio_get_direction(struct gpio_chip *gc, + unsigned int offset) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) + return ret; + + return !(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE); +} + +static int ucd9000_gpio_set_direction(struct gpio_chip *gc, + unsigned int offset, bool direction_out, + int requested_out) +{ + struct i2c_client *client = gpiochip_get_data(gc); + int ret, config, out_val; + + ret = ucd9000_gpio_read_config(client, offset); + if (ret < 0) + return ret; + + if (direction_out) { + out_val = requested_out ? UCD9000_GPIO_CONFIG_OUT_VALUE : 0; + + if (ret & UCD9000_GPIO_CONFIG_OUT_ENABLE) { + if ((ret & UCD9000_GPIO_CONFIG_OUT_VALUE) == out_val) + return 0; + } else { + ret |= UCD9000_GPIO_CONFIG_OUT_ENABLE; + } + + if (out_val) + ret |= UCD9000_GPIO_CONFIG_OUT_VALUE; + else + ret &= ~UCD9000_GPIO_CONFIG_OUT_VALUE; + + } else { + if (!(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE)) + return 0; + + ret &= ~UCD9000_GPIO_CONFIG_OUT_ENABLE; + } + + ret |= UCD9000_GPIO_CONFIG_ENABLE; + config = ret; + + /* Page set not required */ + ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, config); + if (ret < 0) + return ret; + + config &= ~UCD9000_GPIO_CONFIG_ENABLE; + + return i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, config); +} + +static int ucd9000_gpio_direction_input(struct gpio_chip *gc, + unsigned int offset) +{ + return ucd9000_gpio_set_direction(gc, offset, UCD9000_GPIO_INPUT, 0); +} + +static int ucd9000_gpio_direction_output(struct gpio_chip *gc, + unsigned int offset, int val) +{ + return ucd9000_gpio_set_direction(gc, offset, UCD9000_GPIO_OUTPUT, + val); +} + +static void ucd9000_probe_gpio(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ + int rc; + + switch (mid->driver_data) { + case ucd9090: + data->gpio.ngpio = UCD9090_NUM_GPIOS; + break; + case ucd90120: + case ucd90124: + case ucd90160: + data->gpio.ngpio = UCD901XX_NUM_GPIOS; + break; + case ucd90320: + data->gpio.ngpio = UCD90320_NUM_GPIOS; + break; + case ucd90910: + data->gpio.ngpio = UCD90910_NUM_GPIOS; + break; + default: + return; /* GPIO support is optional. */ + } + + /* + * Pinmux support has not been added to the new gpio_chip. + * This support should be added when possible given the mux + * behavior of these IO devices. + */ + data->gpio.label = client->name; + data->gpio.get_direction = ucd9000_gpio_get_direction; + data->gpio.direction_input = ucd9000_gpio_direction_input; + data->gpio.direction_output = ucd9000_gpio_direction_output; + data->gpio.get = ucd9000_gpio_get; + data->gpio.set = ucd9000_gpio_set; + data->gpio.can_sleep = true; + data->gpio.base = -1; + data->gpio.parent = &client->dev; + + rc = devm_gpiochip_add_data(&client->dev, &data->gpio, client); + if (rc) + dev_warn(&client->dev, "Could not add gpiochip: %d\n", rc); +} +#else +static void ucd9000_probe_gpio(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ +} +#endif /* CONFIG_GPIOLIB */ + +#ifdef CONFIG_DEBUG_FS +static int ucd9000_get_mfr_status(struct i2c_client *client, u8 *buffer) +{ + int ret = wb_pmbus_set_page(client, 0, 0xff); + + if (ret < 0) + return ret; + + return wb_i2c_smbus_read_block_data(client, UCD9000_MFR_STATUS, buffer); +} + +static int ucd9000_debugfs_show_mfr_status_bit(void *data, u64 *val) +{ + struct ucd9000_debugfs_entry *entry = data; + struct i2c_client *client = entry->client; + u8 buffer[I2C_SMBUS_BLOCK_MAX]; + int ret, i; + + ret = ucd9000_get_mfr_status(client, buffer); + if (ret < 0) + return ret; + + /* + * GPI fault bits are in sets of 8, two bytes from end of response. + */ + i = ret - 3 - entry->index / 8; + if (i >= 0) + *val = !!(buffer[i] & BIT(entry->index % 8)); + + return 0; +} +DEFINE_DEBUGFS_ATTRIBUTE(ucd9000_debugfs_mfr_status_bit, + ucd9000_debugfs_show_mfr_status_bit, NULL, "%1lld\n"); + +static ssize_t ucd9000_debugfs_read_mfr_status(struct file *file, + char __user *buf, size_t count, + loff_t *ppos) +{ + struct i2c_client *client = file->private_data; + u8 buffer[I2C_SMBUS_BLOCK_MAX]; + char str[(I2C_SMBUS_BLOCK_MAX * 2) + 2]; + char *res; + int rc; + + rc = ucd9000_get_mfr_status(client, buffer); + if (rc < 0) + return rc; + + res = bin2hex(str, buffer, min(rc, I2C_SMBUS_BLOCK_MAX)); + *res++ = '\n'; + *res = 0; + + return simple_read_from_buffer(buf, count, ppos, str, res - str); +} + +static const struct file_operations ucd9000_debugfs_show_mfr_status_fops = { + .llseek = noop_llseek, + .read = ucd9000_debugfs_read_mfr_status, + .open = simple_open, +}; + +static int ucd9000_init_debugfs(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ + struct dentry *debugfs; + struct ucd9000_debugfs_entry *entries; + int i, gpi_count; + char name[UCD9000_DEBUGFS_NAME_LEN]; + + debugfs = wb_pmbus_get_debugfs_dir(client); + if (!debugfs) + return -ENOENT; + + data->debugfs = debugfs_create_dir(client->name, debugfs); + if (!data->debugfs) + return -ENOENT; + + /* + * Of the chips this driver supports, only the UCD9090, UCD90160, + * UCD90320, and UCD90910 report GPI faults in their MFR_STATUS + * register, so only create the GPI fault debugfs attributes for those + * chips. + */ + if (mid->driver_data == ucd9090 || mid->driver_data == ucd90160 || + mid->driver_data == ucd90320 || mid->driver_data == ucd90910) { + gpi_count = mid->driver_data == ucd90320 ? UCD90320_GPI_COUNT + : UCD9000_GPI_COUNT; + entries = devm_kcalloc(&client->dev, + gpi_count, sizeof(*entries), + GFP_KERNEL); + if (!entries) + return -ENOMEM; + + for (i = 0; i < gpi_count; i++) { + entries[i].client = client; + entries[i].index = i; + scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, + "gpi%d_alarm", i + 1); + debugfs_create_file(name, 0444, data->debugfs, + &entries[i], + &ucd9000_debugfs_mfr_status_bit); + } + } + + scnprintf(name, UCD9000_DEBUGFS_NAME_LEN, "mfr_status"); + debugfs_create_file(name, 0444, data->debugfs, client, + &ucd9000_debugfs_show_mfr_status_fops); + + return 0; +} +#else +static int ucd9000_init_debugfs(struct i2c_client *client, + const struct i2c_device_id *mid, + struct ucd9000_data *data) +{ + return 0; +} +#endif /* CONFIG_DEBUG_FS */ + +static int ucd9000_probe(struct i2c_client *client) +{ + u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1]; + char wb_device_name[WB_DEV_NAME_MAX_LEN]; + struct ucd9000_data *data; + struct pmbus_driver_info *info; + const struct i2c_device_id *mid; + enum chips chip; + int i, ret; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_BLOCK_DATA)) + return -ENODEV; + + ret = wb_i2c_smbus_read_block_data(client, UCD9000_DEVICE_ID, + block_buffer); + if (ret < 0) { + dev_err(&client->dev, "Failed to read device ID\n"); + return ret; + } + block_buffer[ret] = '\0'; + dev_info(&client->dev, "Device ID %s\n", block_buffer); + + mem_clear(wb_device_name, sizeof(wb_device_name)); + snprintf(wb_device_name, sizeof(wb_device_name), "wb_%s", block_buffer); + + for (mid = ucd9000_id; mid->name[0]; mid++) { + if (!strncasecmp(mid->name, wb_device_name, strlen(mid->name))) + break; + } + if (!mid->name[0]) { + dev_err(&client->dev, "Unsupported device\n"); + return -ENODEV; + } + + if (client->dev.of_node) + chip = (enum chips)of_device_get_match_data(&client->dev); + else + chip = mid->driver_data; + + if (chip != ucd9000 && strcmp(client->name, mid->name) != 0) + dev_notice(&client->dev, + "Device mismatch: Configured %s, detected %s\n", + client->name, mid->name); + + data = devm_kzalloc(&client->dev, sizeof(struct ucd9000_data), + GFP_KERNEL); + if (!data) + return -ENOMEM; + info = &data->info; + + ret = i2c_smbus_read_byte_data(client, UCD9000_NUM_PAGES); + if (ret < 0) { + dev_err(&client->dev, + "Failed to read number of active pages\n"); + return ret; + } + info->pages = ret; + if (!info->pages) { + dev_err(&client->dev, "No pages configured\n"); + return -ENODEV; + } + + /* The internal temperature sensor is always active */ + info->func[0] = PMBUS_HAVE_TEMP; + + /* Everything else is configurable */ + ret = wb_i2c_smbus_read_block_data(client, UCD9000_MONITOR_CONFIG, + block_buffer); + if (ret <= 0) { + dev_err(&client->dev, "Failed to read configuration data\n"); + return -ENODEV; + } + for (i = 0; i < ret; i++) { + int page = UCD9000_MON_PAGE(block_buffer[i]); + + if (page >= info->pages) + continue; + + switch (UCD9000_MON_TYPE(block_buffer[i])) { + case UCD9000_MON_VOLTAGE: + case UCD9000_MON_VOLTAGE_HW: + info->func[page] |= PMBUS_HAVE_VOUT + | PMBUS_HAVE_STATUS_VOUT; + break; + case UCD9000_MON_TEMPERATURE: + info->func[page] |= PMBUS_HAVE_TEMP2 + | PMBUS_HAVE_STATUS_TEMP; + break; + case UCD9000_MON_CURRENT: + info->func[page] |= PMBUS_HAVE_IOUT + | PMBUS_HAVE_STATUS_IOUT; + break; + default: + break; + } + } + + /* Fan configuration */ + if (mid->driver_data == ucd90124) { + for (i = 0; i < UCD9000_NUM_FAN; i++) { + i2c_smbus_write_byte_data(client, + UCD9000_FAN_CONFIG_INDEX, i); + ret = wb_i2c_smbus_read_block_data(client, + UCD9000_FAN_CONFIG, + data->fan_data[i]); + if (ret < 0) + return ret; + } + i2c_smbus_write_byte_data(client, UCD9000_FAN_CONFIG_INDEX, 0); + + info->read_byte_data = ucd9000_read_byte_data; + info->func[0] |= PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12 + | PMBUS_HAVE_FAN34 | PMBUS_HAVE_STATUS_FAN34; + } + + ucd9000_probe_gpio(client, mid, data); + + ret = wb_pmbus_do_probe(client, info); + if (ret) + return ret; + + ret = ucd9000_init_debugfs(client, mid, data); + if (ret) + dev_warn(&client->dev, "Failed to register debugfs: %d\n", + ret); + + return 0; +} + +/* This is the driver that will be inserted */ +static struct i2c_driver ucd9000_driver = { + .driver = { + .name = "wb_ucd9000", + .of_match_table = of_match_ptr(ucd9000_of_match), + }, + .probe_new = ucd9000_probe, + .remove = wb_pmbus_do_remove, + .id_table = ucd9000_id, +}; + +module_i2c_driver(ucd9000_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("PMBus driver for TI UCD90xxx"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c deleted file mode 100755 index e15bed475d..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.c +++ /dev/null @@ -1,843 +0,0 @@ -/* - * i2c-ocores.c: I2C bus driver for OpenCores I2C controller - * (http://www.opencores.org/projects.cgi/web/i2c/overview). - * - * Peter Korsgaard - * - * Support for the GRLIB port of the controller by - * Andreas Larsson - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lpc_cpld_i2c_ocores.h" -#include -#include -#include -#include - -#define OCORES_FLAG_POLL BIT(0) - -struct ocores_i2c { - void __iomem *base; - u32 reg_shift; - u32 reg_io_width; - unsigned long flags; - wait_queue_head_t wait; - struct i2c_adapter adap; - struct i2c_msg *msg; - int pos; - int nmsgs; - int state; /* see STATE_ */ - spinlock_t process_lock; - int clock_khz; - void (*setreg)(struct ocores_i2c *i2c, int reg, u8 value); - u8 (*getreg)(struct ocores_i2c *i2c, int reg); -}; - -/* registers */ -#define OCI2C_PRELOW 0x0 -#define OCI2C_PREHIGH 0x1 -#define OCI2C_CONTROL 0x2 -#define OCI2C_DATA 0x3 -#define OCI2C_CMD 0x4 /* write only */ -#define OCI2C_STATUS 0x4 /* read only, same address as OCI2C_CMD */ - -#define OCI2C_TRAN_REV 0x14 -#define OCI2C_CMD_REV 0x18 - - -#define OCI2C_CTRL_IEN 0x40 -#define OCI2C_CTRL_EN 0x80 - -#define OCI2C_CMD_START 0x91 -#define OCI2C_CMD_STOP 0x41 -#define OCI2C_CMD_READ 0x21 -#define OCI2C_CMD_WRITE 0x11 -#define OCI2C_CMD_READ_ACK 0x21 -#define OCI2C_CMD_READ_NACK 0x29 -#define OCI2C_CMD_IACK 0x01 - -#define OCI2C_STAT_IF 0x01 -#define OCI2C_STAT_TIP 0x02 -#define OCI2C_STAT_ARBLOST 0x20 -#define OCI2C_STAT_BUSY 0x40 -#define OCI2C_STAT_NACK 0x80 - -#define STATE_DONE 0 -#define STATE_START 1 -#define STATE_WRITE 2 -#define STATE_READ 3 -#define STATE_ERROR 4 - -#define TYPE_OCORES 0 -#define TYPE_GRLIB 1 -#define OCI2C_WAIT_SLEEP 40 - -int g_lpc_cpld_i2c_debug = 0; -int g_lpc_cpld_i2c_irq = 0; -int g_lpc_cpld_i2c_error = 0; - -module_param(g_lpc_cpld_i2c_debug, int, S_IRUGO | S_IWUSR); -module_param(g_lpc_cpld_i2c_error, int, S_IRUGO | S_IWUSR); -module_param(g_lpc_cpld_i2c_irq, int, S_IRUGO | S_IWUSR); - -int g_irq_dump_debug = 0; -module_param(g_irq_dump_debug, int, S_IRUGO | S_IWUSR); -#define LPC_CPLD_I2C_DEBUG_DUMP(fmt, args...) do { \ - if (g_irq_dump_debug) { \ - printk(KERN_ERR ""fmt, ## args); \ - } \ -} while (0) -int g_irq_invalid_cnt = 0; -module_param(g_irq_invalid_cnt, int, S_IRUGO | S_IWUSR); -#define LPC_CPLD_I2C_DEBUG_XFER(fmt, args...) do { \ - if (g_lpc_cpld_i2c_irq) { \ - printk(KERN_ERR "[LPC_CPLD_I2C_OCORES][XFER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_CPLD_I2C_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_lpc_cpld_i2c_debug) { \ - printk(KERN_ERR "[LPC_CPLD_I2C_OCORES][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_CPLD_I2C_DEBUG_ERROR(fmt, args...) do { \ - if (g_lpc_cpld_i2c_error) { \ - printk(KERN_ERR "[LPC_CPLD_I2C_OCORES][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -static int g_lpc_cpld_i2c_irq_flag = 1; - -module_param(g_lpc_cpld_i2c_irq_flag, int, S_IRUGO | S_IWUSR); - -static void oc_debug_dump_reg(struct ocores_i2c *i2c); -static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u8 value) -{ - u64 base = (u64)i2c->base; - - outb(value, (u16)base + reg); -} - -static inline u8 oc_getreg_8(struct ocores_i2c *i2c, int reg) -{ - u64 base = (u64)i2c->base; - - return inb((u16)base + reg); -} - -static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value) -{ - i2c->setreg(i2c, reg, value); -} - -static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg) -{ - u8 status; - - status = i2c->getreg(i2c, reg); - return status; -} - -#define LPC_CPLD_I2C_SPIN_LOCK(lock, flags) spin_lock_irqsave(&(lock), (flags)) -#define LPC_CPLD_I2C_SPIN_UNLOCK(lock, flags) spin_unlock_irqrestore(&(lock), (flags)) - -static void ocores_process(struct ocores_i2c *i2c, u8 stat) -{ - struct i2c_msg *msg = i2c->msg; - - LPC_CPLD_I2C_DEBUG_XFER("Enter nr %d.\n", i2c->adap.nr); - - /* - * If we spin here is because we are in timeout, so we are going - * to be in STATE_ERROR. See ocores_process_timeout() - */ - if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) { - /* stop has been sent */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - wake_up(&i2c->wait); - LPC_CPLD_I2C_DEBUG_XFER("stop has been sent, exit.\n"); - goto out; - } - - /* error */ - if (stat & OCI2C_STAT_ARBLOST) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - LPC_CPLD_I2C_DEBUG_XFER("error, exit.\n"); - goto out; - } - - if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { - i2c->state = - (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; - - if (stat & OCI2C_STAT_NACK) { - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - LPC_CPLD_I2C_DEBUG_XFER("OCI2C_STAT_NACK, exit.\n"); - goto out; - } - } else - msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA); - - /* end of msg */ - if (i2c->pos == msg->len) { - LPC_CPLD_I2C_DEBUG_XFER("Enter end of msg.\n"); - i2c->nmsgs--; - i2c->msg++; - i2c->pos = 0; - msg = i2c->msg; - - if (i2c->nmsgs) { /* end? */ - /* send start */ - if (!(msg->flags & I2C_M_NOSTART)) { - u8 addr = (msg->addr << 1); - - if (msg->flags & I2C_M_RD) - addr |= 1; - - i2c->state = STATE_START; - - oc_setreg(i2c, OCI2C_DATA, addr); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - LPC_CPLD_I2C_DEBUG_XFER("send start, exit.\n"); - goto out; - } - - i2c->state = (msg->flags & I2C_M_RD) - ? STATE_READ : STATE_WRITE; - } else { - i2c->state = STATE_DONE; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - LPC_CPLD_I2C_DEBUG_XFER("send OCI2C_CMD_STOP, exit.\n"); - goto out; - } - } - - if (i2c->state == STATE_READ) { - oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ? - OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK); - } else { - oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]); - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE); - } - -out: - LPC_CPLD_I2C_DEBUG_XFER("normal, exit nr %d.\n", i2c->adap.nr); -} - -static irqreturn_t ocores_isr(int irq, void *dev_id) -{ - struct ocores_i2c *i2c = dev_id; - unsigned long flags; - u8 stat; - if (!i2c) { - return IRQ_NONE; - } - - LPC_CPLD_I2C_SPIN_LOCK(i2c->process_lock, flags); - stat = oc_getreg(i2c, OCI2C_STATUS); - - if (!(stat & OCI2C_STAT_IF)) { - g_irq_invalid_cnt++; - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - return IRQ_NONE; - } - - LPC_CPLD_I2C_DEBUG_XFER("Enter, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, i2c->msg->addr); - ocores_process(i2c, stat); - LPC_CPLD_I2C_DEBUG_XFER("Leave, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, i2c->msg->addr); - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - - return IRQ_HANDLED; -} - -/** - * Process timeout event - * @i2c: ocores I2C device instance - */ -static void ocores_process_timeout(struct ocores_i2c *i2c) -{ - unsigned long flags; - - LPC_CPLD_I2C_SPIN_LOCK(i2c->process_lock, flags); - i2c->state = STATE_ERROR; - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); - mdelay(1); - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - -} - -/** - * Wait until something change in a given register - * @i2c: ocores I2C device instance - * @reg: register to query - * @mask: bitmask to apply on register value - * @val: expected result - * @timeout: timeout in jiffies - * - * Timeout is necessary to avoid to stay here forever when the chip - * does not answer correctly. - * - * Return: 0 on success, -ETIMEDOUT on timeout - */ -static int ocores_wait(struct ocores_i2c *i2c, - int reg, u8 mask, u8 val, - const unsigned long timeout) -{ - u8 status; - unsigned long j, jiffies_tmp; - unsigned int usleep; - usleep = OCI2C_WAIT_SLEEP; - j = jiffies + timeout; - while (1) { - jiffies_tmp = jiffies; - status = oc_getreg(i2c, reg); - - if ((status & mask) == val) - break; - - if (time_after(jiffies_tmp, j)) { - LPC_CPLD_I2C_DEBUG_XFER("STATUS timeout, mask[0x%x] val[0x%x] status[0x%x]\n", mask, val, status); - return -ETIMEDOUT; - } - usleep_range(usleep,usleep + 1); - } - return 0; -} - -/** - * Wait until is possible to process some data - * @i2c: ocores I2C device instance - * - * Used when the device is in polling mode (interrupts disabled). - * - * Return: 0 on success, -ETIMEDOUT on timeout - */ -static int ocores_poll_wait(struct ocores_i2c *i2c) -{ - u8 mask; - int err; - - if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) { - /* transfer is over */ - mask = OCI2C_STAT_BUSY; - } else { - /* on going transfer */ - mask = OCI2C_STAT_TIP; - udelay((8 * 1000) / i2c->clock_khz); - } - - /* - * once we are here we expect to get the expected result immediately - * so if after 1ms we timeout then something is broken. - */ - err = ocores_wait(i2c, OCI2C_STATUS, mask, 0, msecs_to_jiffies(100)); - if (err) { - LPC_CPLD_I2C_DEBUG_XFER("STATUS timeout, bit 0x%x did not clear in 1ms, err %d\n", mask, err); - } - - return err; -} - - -/** - * It handles an IRQ-less transfer - * @i2c: ocores I2C device instance - * - * Even if IRQ are disabled, the I2C OpenCore IP behavior is exactly the same - * (only that IRQ are not produced). This means that we can re-use entirely - * ocores_isr(), we just add our polling code around it. - * - * It can run in atomic context - */ -static int ocores_process_polling(struct ocores_i2c *i2c) -{ - irqreturn_t ret; - int err; - while (1) { - err = ocores_poll_wait(i2c); - if (err) { - i2c->state = STATE_ERROR; - break; /* timeout */ - } - - ret = ocores_isr(-1, i2c); - if (ret == IRQ_NONE) - break; /* all messages have been transfered */ - } - return err; -} - -static int ocores_xfer_core(struct ocores_i2c *i2c, - struct i2c_msg *msgs, int num, - bool polling) -{ - int ret; - unsigned long flags; - u8 ctrl; - - LPC_CPLD_I2C_DEBUG_XFER("Enter.polling %d\n", polling); - LPC_CPLD_I2C_SPIN_LOCK(i2c->process_lock, flags); - ctrl = oc_getreg(i2c, OCI2C_CONTROL); - if (polling) - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~OCI2C_CTRL_IEN); - else - oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN); - - i2c->msg = msgs; - i2c->pos = 0; - i2c->nmsgs = num; - i2c->state = STATE_START; - - oc_setreg(i2c, OCI2C_DATA, - (i2c->msg->addr << 1) | - ((i2c->msg->flags & I2C_M_RD) ? 1:0)); - - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); - LPC_CPLD_I2C_SPIN_UNLOCK(i2c->process_lock, flags); - - if (polling) { - ret = ocores_process_polling(i2c); - if (ret) { /* timeout */ - ocores_process_timeout(i2c); - return -ETIMEDOUT; - } - } else { - ret = wait_event_timeout(i2c->wait, - (i2c->state == STATE_ERROR) || - (i2c->state == STATE_DONE), HZ); - if (ret == 0) { - ocores_process_timeout(i2c); - return -ETIMEDOUT; - } - } - - return (i2c->state == STATE_DONE) ? num : -EIO; -} - -static int ocores_xfer_polling(struct i2c_adapter *adap, - struct i2c_msg *msgs, int num) -{ - LPC_CPLD_I2C_DEBUG_XFER("Enter.\n"); - return ocores_xfer_core(i2c_get_adapdata(adap), msgs, num, true); -} - -static int ocores_xfer(struct i2c_adapter *adap, - struct i2c_msg *msgs, int num) -{ - struct ocores_i2c *i2c = i2c_get_adapdata(adap); - - if (i2c->flags & OCORES_FLAG_POLL) - return ocores_xfer_polling(adap, msgs, num); - return ocores_xfer_core(i2c, msgs, num, false); -} - -static void ocores_init(struct ocores_i2c *i2c) -{ - int prescale; - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - LPC_CPLD_I2C_DEBUG_XFER("Enter.\n"); - spin_lock_init(&i2c->process_lock); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - prescale = (i2c->clock_khz / (5*100)) - 1; - oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff); - oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8); - LPC_CPLD_I2C_DEBUG_VERBOSE("i2c->base 0x%p, i2c->clock_khz %d, prescale 0x%x.\n", i2c->base, i2c->clock_khz, prescale); - - /* Init the device */ - oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); - oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN); -} - - -static u32 ocores_func(struct i2c_adapter *adap) -{ - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; -} - -static const struct i2c_algorithm ocores_algorithm = { - .master_xfer = ocores_xfer, - .functionality = ocores_func, -}; - -static struct i2c_adapter ocores_adapter = { - .owner = THIS_MODULE, - .name = "rg-cpld-ocrore-i2c", - .class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED, - .algo = &ocores_algorithm, -}; - -static const struct of_device_id ocores_i2c_match[] = { - { - .compatible = "opencores,rg-cpld-ocrore-i2c", - .data = (void *)TYPE_OCORES, - }, - {}, -}; -MODULE_DEVICE_TABLE(of, ocores_i2c_match); - -#ifdef CONFIG_OF -/* Read and write functions for the GRLIB port of the controller. Registers are - * 32-bit big endian and the PRELOW and PREHIGH registers are merged into one - * register. The subsequent registers has their offset decreased accordingly. */ -static u8 oc_getreg_grlib(struct ocores_i2c *i2c, int reg) -{ - u32 rd; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - rd = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PREHIGH) - return (u8)(rd >> 8); - else - return (u8)rd; -} - -static void oc_setreg_grlib(struct ocores_i2c *i2c, int reg, u8 value) -{ - u32 curr, wr; - int rreg = reg; - if (reg != OCI2C_PRELOW) - rreg--; - if (reg == OCI2C_PRELOW || reg == OCI2C_PREHIGH) { - curr = ioread32be(i2c->base + (rreg << i2c->reg_shift)); - if (reg == OCI2C_PRELOW) - wr = (curr & 0xff00) | value; - else - wr = (((u32)value) << 8) | (curr & 0xff); - } else { - wr = value; - } - iowrite32be(wr, i2c->base + (rreg << i2c->reg_shift)); -} - -static int ocores_i2c_of_probe(struct platform_device *pdev, - struct ocores_i2c *i2c) -{ - struct device_node *np = pdev->dev.of_node; - const struct of_device_id *match; - u32 val; - - LPC_CPLD_I2C_DEBUG_VERBOSE("Enter ocores_i2c_of_probe.\n"); - if (of_property_read_u32(np, "reg-shift", &i2c->reg_shift)) { - /* no 'reg-shift', check for deprecated 'regstep' */ - if (!of_property_read_u32(np, "regstep", &val)) { - if (!is_power_of_2(val)) { - dev_err(&pdev->dev, "invalid regstep %d\n", - val); - return -EINVAL; - } - i2c->reg_shift = ilog2(val); - dev_warn(&pdev->dev, - "regstep property deprecated, use reg-shift\n"); - } - } - - if (of_property_read_u32(np, "clock-frequency", &val)) { - dev_err(&pdev->dev, - "Missing required parameter 'clock-frequency'\n"); - return -ENODEV; - } - i2c->clock_khz = val / 1000; - - of_property_read_u32(pdev->dev.of_node, "reg-io-width", - &i2c->reg_io_width); - - match = of_match_node(ocores_i2c_match, pdev->dev.of_node); - if (match && (long)match->data == TYPE_GRLIB) { - dev_dbg(&pdev->dev, "GRLIB variant of i2c-ocores\n"); - i2c->setreg = oc_setreg_grlib; - i2c->getreg = oc_getreg_grlib; - } - - return 0; -} -#else -#define ocores_i2c_of_probe(pdev,i2c) -ENODEV -#endif - -static void oc_debug_dump_reg(struct ocores_i2c *i2c) -{ - if (i2c) { - LPC_CPLD_I2C_DEBUG_DUMP("base: %p.\n", i2c->base); - LPC_CPLD_I2C_DEBUG_DUMP("reg_shift: %d.\n", i2c->reg_shift); - LPC_CPLD_I2C_DEBUG_DUMP("reg_io_width: %d.\n", i2c->reg_io_width); - LPC_CPLD_I2C_DEBUG_DUMP("adap.nr: %d.\n", i2c->adap.nr); - LPC_CPLD_I2C_DEBUG_DUMP("msg: %p.\n", i2c->msg); - if (i2c->msg) { - LPC_CPLD_I2C_DEBUG_DUMP("msg->buf: %p.\n", i2c->msg->buf); - LPC_CPLD_I2C_DEBUG_DUMP("msg->addr: 0x%x.\n", i2c->msg->addr); - LPC_CPLD_I2C_DEBUG_DUMP("msg->flags: 0x%x.\n", i2c->msg->flags); - LPC_CPLD_I2C_DEBUG_DUMP("msg->len: %d.\n", i2c->msg->len); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("msg: %p is null.\n", i2c->msg); - } - - LPC_CPLD_I2C_DEBUG_DUMP("pos: %d.\n", i2c->pos); - LPC_CPLD_I2C_DEBUG_DUMP("nmsgs: %d.\n", i2c->nmsgs); - LPC_CPLD_I2C_DEBUG_DUMP("state: %d.\n", i2c->state); - LPC_CPLD_I2C_DEBUG_DUMP("clock_khz: %d.\n", i2c->clock_khz); - LPC_CPLD_I2C_DEBUG_DUMP("setreg: %p.\n", i2c->setreg); - LPC_CPLD_I2C_DEBUG_DUMP("getreg: %p.\n", i2c->getreg); - if (i2c->getreg) { - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_PRELOW: 0x%02x.\n", oc_getreg(i2c, OCI2C_PRELOW)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_PREHIGH: 0x%02x.\n", oc_getreg(i2c, OCI2C_PREHIGH)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_CONTROL: 0x%02x.\n", oc_getreg(i2c, OCI2C_CONTROL)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_DATA: 0x%02x.\n", oc_getreg(i2c, OCI2C_DATA)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_CMD: 0x%02x.\n", oc_getreg(i2c, OCI2C_CMD)); - LPC_CPLD_I2C_DEBUG_DUMP("OCI2C_STATUS: 0x%02x.\n", oc_getreg(i2c, OCI2C_STATUS)); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("getreg: %p is null.\n", i2c->getreg); - } - } else { - LPC_CPLD_I2C_DEBUG_DUMP("i2c %p is null.\n", i2c); - } -} - -void oc_debug_dump_reg_exception(void) -{ - int bus_beg, bus_end, bus; - struct i2c_adapter *adap; - struct ocores_i2c *adap_data; - - bus_beg = 1; - bus_end = 14; - for (bus = bus_beg; bus <= bus_end; bus++) { - adap = i2c_get_adapter(bus); - if (adap) { - adap_data = (struct ocores_i2c *)i2c_get_adapdata(adap); - if (adap_data) { - LPC_CPLD_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg begin.\n", bus); - oc_debug_dump_reg(adap_data); - LPC_CPLD_I2C_DEBUG_DUMP("bus %d call oc_debug_dump_reg end.\n", bus); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("bus %d i2c_get_adapdata null.\n", bus); - } - i2c_put_adapter(adap); - } else { - LPC_CPLD_I2C_DEBUG_DUMP("bus %d i2c_get_adapter null.\n", bus); - } - } -} - -static ssize_t show_oc_debug_value(struct device *dev, struct device_attribute *da, char *buf) -{ - oc_debug_dump_reg_exception(); - return 0; -} - -static SENSOR_DEVICE_ATTR(oc_debug, S_IRUGO | S_IWUSR, show_oc_debug_value, NULL, 0x15); - -static struct attribute *oc_debug_sysfs_attrs[] = { - &sensor_dev_attr_oc_debug.dev_attr.attr, - NULL -}; - -static const struct attribute_group oc_debug_sysfs_group = { - .attrs = oc_debug_sysfs_attrs, -}; - -static void oc_debug_sysfs_init(struct platform_device *pdev) -{ - int ret; - - ret = sysfs_create_group(&pdev->dev.kobj, &oc_debug_sysfs_group); - LPC_CPLD_I2C_DEBUG_VERBOSE("sysfs_create_group ret %d.\n", ret); - return; -} - -static void oc_debug_sysfs_exit(struct platform_device *pdev) -{ - sysfs_remove_group(&pdev->dev.kobj, (const struct attribute_group *)&oc_debug_sysfs_group); - LPC_CPLD_I2C_DEBUG_VERBOSE("sysfs_remove_group.\n"); - return; -} - -static int rg_ocores_i2c_probe(struct platform_device *pdev) -{ - struct ocores_i2c *i2c; - struct rg_ocores_cpld_i2c_platform_data *pdata; - struct resource *res; - int irq; - int ret; - int i; - - LPC_CPLD_I2C_DEBUG_VERBOSE("Enter.\n"); - - i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); - if (!i2c) { - LPC_CPLD_I2C_DEBUG_ERROR("devm_kzalloc failed.\n"); - return -ENOMEM; - } - res = platform_get_resource(pdev, IORESOURCE_IO, 0); - if (!res) { - LPC_CPLD_I2C_DEBUG_ERROR("can't fetch device resource info\n"); - return -ENOMEM; - } - - i2c->base = (void __iomem *)res->start; - LPC_CPLD_I2C_DEBUG_VERBOSE("i2c->base is %p., res->end[%d]\n", i2c->base, (int)res->end); - - pdata = dev_get_platdata(&pdev->dev); - if (pdata) { - i2c->reg_shift = pdata->reg_shift; - i2c->reg_io_width = pdata->reg_io_width; - i2c->clock_khz = pdata->clock_khz; - } else { - ret = ocores_i2c_of_probe(pdev, i2c); - if (ret) - return ret; - } - - LPC_CPLD_I2C_DEBUG_VERBOSE("data: shift[%d], width[%d], clock_khz[%d] i2c_irq_flag=%d\n", - pdata->reg_shift, pdata->reg_io_width, pdata->clock_khz, pdata->i2c_irq_flag); - - if (i2c->reg_io_width == 0) - i2c->reg_io_width = 1; /* Set to default value */ - - - if (!i2c->setreg || !i2c->getreg) { - switch (i2c->reg_io_width) { - case 1: - i2c->setreg = oc_setreg_8; - i2c->getreg = oc_getreg_8; - break; - default: - dev_err(&pdev->dev, "Unsupported I/O width (%d)\n", - i2c->reg_io_width); - return -EINVAL; - } - } - - init_waitqueue_head(&i2c->wait); - - irq = platform_get_irq(pdev, 0); - LPC_CPLD_I2C_DEBUG_VERBOSE("get irq %d, ENXIO[%d]", irq, ENXIO); - if (irq == -ENXIO) { - i2c->flags |= OCORES_FLAG_POLL; - } else if(g_lpc_cpld_i2c_irq_flag){ - ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, - pdev->name, i2c); - if (ret) { - dev_err(&pdev->dev, "Cannot claim IRQ\n"); - } - - if(pdata->i2c_irq_flag) { - g_lpc_cpld_i2c_irq_flag = 0; - } - } - - ocores_init(i2c); - - /* hook up driver to tree */ - platform_set_drvdata(pdev, i2c); - i2c->adap = ocores_adapter; - i2c_set_adapdata(&i2c->adap, i2c); - i2c->adap.dev.parent = &pdev->dev; - i2c->adap.dev.of_node = pdev->dev.of_node; - - /* add i2c adapter to i2c tree */ - ret = i2c_add_adapter(&i2c->adap); - if (ret) { - dev_err(&pdev->dev, "Failed to add adapter\n"); - return ret; - } - - /* add in known devices to the bus */ - if (pdata) { - LPC_CPLD_I2C_DEBUG_VERBOSE("i2c device %d.\n", pdata->num_devices); - for (i = 0; i < pdata->num_devices; i++) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - i2c_new_client_device(&i2c->adap, pdata->devices + i); -#else - i2c_new_device(&i2c->adap, pdata->devices + i); -#endif - } - } - - oc_debug_sysfs_init(pdev); - return 0; -} - -static int rg_ocores_i2c_remove(struct platform_device *pdev) -{ - struct ocores_i2c *i2c = platform_get_drvdata(pdev); - - /* disable i2c logic */ - oc_setreg(i2c, OCI2C_CONTROL, oc_getreg(i2c, OCI2C_CONTROL) - & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - /* remove adapter & data */ - i2c_del_adapter(&i2c->adap); - oc_debug_sysfs_exit(pdev); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ocores_i2c_suspend(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); - - /* make sure the device is disabled */ - oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~(OCI2C_CTRL_EN|OCI2C_CTRL_IEN)); - - return 0; -} - -static int ocores_i2c_resume(struct device *dev) -{ - struct ocores_i2c *i2c = dev_get_drvdata(dev); - - ocores_init(i2c); - - return 0; -} - -static SIMPLE_DEV_PM_OPS(ocores_i2c_pm, ocores_i2c_suspend, ocores_i2c_resume); -#define OCORES_I2C_PM (&ocores_i2c_pm) -#else -#define OCORES_I2C_PM NULL -#endif - -static struct platform_driver ocores_i2c_driver = { - .probe = rg_ocores_i2c_probe, - .remove = rg_ocores_i2c_remove, - .driver = { - .owner = THIS_MODULE, - .name = "rg-cpld-ocrore-i2c", - .of_match_table = ocores_i2c_match, - .pm = OCORES_I2C_PM, - }, -}; - -module_platform_driver(ocores_i2c_driver); - -MODULE_AUTHOR("Peter Korsgaard "); -MODULE_DESCRIPTION("OpenCores I2C bus driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:ocores-i2c"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h deleted file mode 100755 index baf6a916b1..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_cpld_i2c_ocores.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _LPC_CPLD_I2C_OCORES_H -#define _LPC_CPLD_I2C_OCORES_H - -struct rg_ocores_cpld_i2c_platform_data { - u32 reg_shift; /* register offset shift value */ - u32 reg_io_width; /* register io read/write width */ - u32 clock_khz; /* input clock in kHz */ - u8 num_devices; /* number of devices in the devices list */ - u8 i2c_irq_flag; - struct i2c_board_info const *devices; /* devices connected to the bus */ -}; - -#endif /* _LPC_CPLD_I2C_OCORES_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c deleted file mode 100755 index 9c43bcee5c..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.c +++ /dev/null @@ -1,534 +0,0 @@ -#include -#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 19, 0) -#include -#endif - -#include -#include /* Wd're doing kernel work */ -#include /* specifically, a module */ -#include -#include /* Need for the macros */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lpc_dbg.h" - -typedef struct rg_lpc_device_s { - u16 base; - u16 size; - u8 type; - u8 id; - u8 lpc_pci_addr; -} rg_lpc_device_t; - -typedef enum rg_lpc_dev_type_s { - LPC_DEVICE_CPLD = 1, - LPC_DEVICE_FPGA = 2, -} rg_lpc_dev_type_t; - -#define MAX_LPC_DEV_NUM (4) -#define LPC_PCI_CFG_BASE(__lgir) ((0x84) + ((__lgir) * 4)) -#define MAX_CPLD_REG_SIZE (0x100) -#define MAX_FPGA_REG_SIZE (0x100) //# fix compile actual value 0x10000 -#define LPC_GET_CPLD_ID(addr) ((addr >> 16) & 0xff) -#define LPC_GET_CPLD_OFFSET(addr) ((addr) & 0xff) - -int lpc_dbg_verbose = 0; -int lpc_dbg_error = 0; -int lpc_dbg_info = 0; -module_param(lpc_dbg_verbose, int, S_IRUGO | S_IWUSR); -module_param(lpc_dbg_error, int, S_IRUGO | S_IWUSR); -module_param(lpc_dbg_info, int, S_IRUGO | S_IWUSR); - - -#define LPC_DBG_VERBOSE(fmt, args...) do { \ - if (lpc_dbg_verbose) { \ - printk(KERN_ERR "[LPC_DBG][VERBOSE][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_DBG_ERROR(fmt, args...) do { \ - if (lpc_dbg_error) { \ - printk(KERN_ERR "[LPC_DBG][ERROR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define LPC_DBG_INFO(fmt, args...) do { \ - if (lpc_dbg_info) { \ - printk(KERN_ERR ""fmt, ## args); \ - } \ -} while (0) - -static rg_lpc_device_t g_rg_lpc_dev_default[] = { - {.base = 0x700, .size = MAX_CPLD_REG_SIZE, .type = LPC_DEVICE_CPLD, .id = 0, .lpc_pci_addr = 0x84}, - {.base = 0x900, .size = MAX_CPLD_REG_SIZE, .type = LPC_DEVICE_CPLD, .id = 1, .lpc_pci_addr = 0x88}, - {.base = 0xb00, .size = MAX_CPLD_REG_SIZE, .type = LPC_DEVICE_CPLD, .id = 2, .lpc_pci_addr = 0x90}, -}; - -static rg_lpc_device_t *g_rg_lpc_dev = g_rg_lpc_dev_default; - -static rg_lpc_device_t* lpc_get_device_info(int type, int id) -{ - int i; - int size; - - size = ARRAY_SIZE(g_rg_lpc_dev_default); - for (i = 0; i < size; i++) { - if ((g_rg_lpc_dev[i].type == type) && (g_rg_lpc_dev[i].id == id)) { - return &g_rg_lpc_dev[i]; - } - } - - return NULL; -} - - -int lpc_cpld_read(int address, u8 *val) -{ - int cpld_id; - rg_lpc_device_t *info; - - cpld_id = LPC_GET_CPLD_ID(address); - info = lpc_get_device_info(LPC_DEVICE_CPLD, cpld_id); - if (info == NULL) { - LPC_DBG_ERROR("lpc_get_device_info addr 0x%x id %d failed.\r\n", address, cpld_id); - return -1; - } - - *val = inb(info->base + LPC_GET_CPLD_OFFSET(address)); - LPC_DBG_VERBOSE("Leave info->base 0x%x, addr 0x%x, cpld_id %d, val 0x%x.\r\n", info->base, address, cpld_id, *val); - return 0; -} - -int lpc_cpld_write(int address, u8 reg_val) -{ - int cpld_id; - rg_lpc_device_t *info; - - cpld_id = LPC_GET_CPLD_ID(address); - info = lpc_get_device_info(LPC_DEVICE_CPLD, cpld_id); - if (info == NULL) { - LPC_DBG_ERROR("lpc_get_device_info addr 0x%x id %d failed.\r\n", address, cpld_id); - return -1; - } - - outb(reg_val, info->base + LPC_GET_CPLD_OFFSET(address)); - LPC_DBG_VERBOSE("Leave info->base 0x%x, addr 0x%x, cpld_id %d, val 0x%x.\r\n", info->base, address, cpld_id, reg_val); - return 0; -} - -int lpc_fpga_read(int address, u8 *val) -{ - return -1; -} - -int lpc_fpga_write(int address, u8 reg_val) -{ - return -1; -} - -static ssize_t lpc_misc_cpld_dev_read (struct file *file, char __user *buf, size_t count, - loff_t *offset) -{ - int ret; - u8 value8[MAX_CPLD_REG_SIZE]; - int i; - - if ((count > MAX_CPLD_REG_SIZE) - || ((LPC_GET_CPLD_OFFSET(file->f_pos) + count) > MAX_CPLD_REG_SIZE)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_cpld_read((int)(file->f_pos + i), &value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_cpld_read i %d addr 0x%x failed ret %d.\n", - i, ((unsigned int)file->f_pos + i), ret); - return i; - } - } - - if (copy_to_user(buf, value8, count)) { - return -EFAULT; - } - - return count; -} - - -static ssize_t lpc_misc_cpld_dev_write (struct file *file, const char __user *buf, size_t count, - loff_t *offset) -{ - u8 value8[MAX_CPLD_REG_SIZE]; - int i; - int ret; - - if ((count > MAX_CPLD_REG_SIZE) - || ((LPC_GET_CPLD_OFFSET(file->f_pos) + count) > MAX_CPLD_REG_SIZE)) { - return -EFAULT; - } - - if (copy_from_user(value8, buf, count)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_cpld_write((int)(file->f_pos + i), value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_cpld_write i %d addr 0x%x value 0x%x failed ret %d.\n", - i, (unsigned int)file->f_pos + i, value8[i], ret); - return i; - } - } - - return count; -} - - -static loff_t lpc_misc_cpld_dev_llseek(struct file *file, loff_t offset, int origin) -{ - loff_t ret; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_lock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_lock(file_inode(file)); -#endif - - switch (origin) { - case 0: - file->f_pos = offset; - ret = file->f_pos; - break; - case 1: - file->f_pos += offset; - ret = file->f_pos; - break; - default: - ret = -EINVAL; - } - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_unlock(file_inode(file)); -#endif - - - return ret; -} - - -static long lpc_misc_cpld_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - return -1; -} - -static int lpc_misc_cpld_dev_open(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; - -} - -static int lpc_misc_cpld_dev_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; -} - -static const struct file_operations lpc_misc_cpld_dev_fops = { - .owner = THIS_MODULE, - .llseek = lpc_misc_cpld_dev_llseek, - .read = lpc_misc_cpld_dev_read, - .write = lpc_misc_cpld_dev_write, - .unlocked_ioctl = lpc_misc_cpld_dev_ioctl, - .open = lpc_misc_cpld_dev_open, - .release = lpc_misc_cpld_dev_release, -}; - -static ssize_t lpc_misc_fpga_dev_read (struct file *file, char __user *buf, size_t count, - loff_t *offset) -{ - int ret; - u8 value8[MAX_FPGA_REG_SIZE]; - int i; - - if ((count > MAX_FPGA_REG_SIZE) || ((file->f_pos + count) > MAX_FPGA_REG_SIZE)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_fpga_read((int)(file->f_pos + i), &value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_fpga_read i %d addr 0x%x failed ret %d.\n", - i, ((unsigned int)file->f_pos + i), ret); - return i; - } - - } - - if (copy_to_user(buf, value8, count)) { - return -EFAULT; - } - - return count; -} - - -static ssize_t lpc_misc_fpga_dev_write (struct file *file, const char __user *buf, size_t count, - loff_t *offset) -{ - int ret; - u8 value8[MAX_FPGA_REG_SIZE]; - int i; - - if ((count > MAX_FPGA_REG_SIZE) || ((file->f_pos + count) > MAX_FPGA_REG_SIZE)) { - return -EFAULT; - } - - if (copy_from_user(value8, buf, count)) { - return -EFAULT; - } - - for (i = 0; i < count; i++) { - ret = lpc_fpga_write((int)(file->f_pos + i), value8[i]); - if (ret) { - LPC_DBG_ERROR("lpc_fpga_write i %d addr 0x%x value 0x%x failed ret %d.\n", - i, (int)(file->f_pos + i), value8[i], ret); - return i; - } - } - - return count; -} - - -static loff_t lpc_misc_fpga_dev_llseek(struct file *file, loff_t offset, int origin) -{ - loff_t ret; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_lock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_lock(file_inode(file)); -#endif - - switch (origin) { - case 0: - file->f_pos = offset; - ret = file->f_pos; - break; - case 1: - file->f_pos += offset; - ret = file->f_pos; - break; - default: - ret = -EINVAL; - } - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,36) - mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); -#else - /* do noting add tjm */ - inode_unlock(file_inode(file)); -#endif - - - return ret; -} - - -static long lpc_misc_fpga_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - return -1; -} - -static int lpc_misc_fpga_dev_open(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; - -} - -static int lpc_misc_fpga_dev_release(struct inode *inode, struct file *file) -{ - file->private_data = NULL; - file->f_pos = 0; - return 0; -} - -static const struct file_operations lpc_misc_fpga_dev_fops = { - .owner = THIS_MODULE, - .llseek = lpc_misc_fpga_dev_llseek, - .read = lpc_misc_fpga_dev_read, - .write = lpc_misc_fpga_dev_write, - .unlocked_ioctl = lpc_misc_fpga_dev_ioctl, - .open = lpc_misc_fpga_dev_open, - .release = lpc_misc_fpga_dev_release, -}; - -static struct miscdevice lpc_misc_cpld_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "lpc_cpld", - .fops = &lpc_misc_cpld_dev_fops, -}; - -static struct miscdevice lpc_misc_fpga_dev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "lpc_fpga", - .fops = &lpc_misc_fpga_dev_fops, -}; - -static int lpc_misc_drv_init(void) -{ - if (misc_register(&lpc_misc_cpld_dev) != 0) { - LPC_DBG_ERROR("Register %s failed.\r\n", lpc_misc_cpld_dev.name); - return -ENXIO; - } - - if (misc_register(&lpc_misc_fpga_dev) != 0) { - LPC_DBG_ERROR("Register %s failed.\r\n", lpc_misc_fpga_dev.name); - return -ENXIO; - } - return 0; -} - -static void lpc_misc_drv_exit(void) -{ - misc_deregister(&lpc_misc_cpld_dev); - misc_deregister(&lpc_misc_fpga_dev); -} - -#define LPC_MAKE_PCI_IO_RANGE(__base) ((0xfc0001) | ((__base) & (0xFFFC))) - -static int lpc_pci_cfg_init(struct pci_dev *pdev, - const struct pci_device_id *id) -{ - int i; - int size; - - size = ARRAY_SIZE(g_rg_lpc_dev_default); - - for (i = 0; i < size; i++) { - pci_write_config_dword(pdev, g_rg_lpc_dev[i].lpc_pci_addr, LPC_MAKE_PCI_IO_RANGE(g_rg_lpc_dev[i].base)); - LPC_DBG_VERBOSE("set lpc pci cfg[addr: 0x%x, value:0x%x].\n", LPC_PCI_CFG_BASE(i), LPC_MAKE_PCI_IO_RANGE(g_rg_lpc_dev[i].base)); - if (!request_region(g_rg_lpc_dev[i].base, g_rg_lpc_dev[i].size, "rg_lpc")) { - LPC_DBG_ERROR("request_region [0x%x][0x%x] failed!\n", g_rg_lpc_dev[i].base, g_rg_lpc_dev[i].size); - return -EBUSY; - } - } - - return 0; -} - -static void lpc_pci_cfg_exit(void) -{ - int i; - int size; - - size = ARRAY_SIZE(g_rg_lpc_dev_default); - for (i = 0; i < size; i++) { - release_region(g_rg_lpc_dev[i].base, g_rg_lpc_dev[i].size); - } - return; -} - -static int rg_lpc_cpld_probe(struct pci_dev *pdev, - const struct pci_device_id *id) -{ - int ret; - - LPC_DBG_VERBOSE("Enter.\n"); - ret = lpc_pci_cfg_init(pdev, id); - if (ret) { - LPC_DBG_ERROR("lpc_pci_cfg_init failed ret %d.\n", ret); - return ret; - } - - ret = lpc_misc_drv_init(); - if (ret) { - LPC_DBG_ERROR("lpc_misc_drv_init failed ret %d.\n", ret); - return ret; - } - LPC_DBG_VERBOSE("Leave success\n"); - - return 0; -} - -static void rg_lpc_cpld_remove(struct pci_dev *pdev) -{ - LPC_DBG_VERBOSE("Enter.\n"); - lpc_misc_drv_exit(); - lpc_pci_cfg_exit(); - LPC_DBG_VERBOSE("Leave.\n"); -} - - -#define PCI_VENDOR_ID_D1527_LPC (0x8c54) -#define PCI_VENDOR_ID_C3000_LPC (0x19dc) - -#if 0 -static const struct pci_device_id rg_lpc_cpld_pcidev_id[] = { - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_C3000_LPC) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_D1527_LPC) }, - { 0, } -}; -MODULE_DEVICE_TABLE(pci, rg_lpc_cpld_pcidev_id); - -static struct pci_driver rg_lpc_driver = { - .name = "rg_lpc", - .id_table = rg_lpc_cpld_pcidev_id, - .probe = rg_lpc_cpld_probe, - .remove = rg_lpc_cpld_remove, -}; - -module_pci_driver(rg_lpc_driver); -#else -static int __init lpc_dbg_init(void) -{ - struct pci_dev *pdev = NULL; - int ret; - - LPC_DBG_VERBOSE("Enter.\n"); - - pdev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_VENDOR_ID_D1527_LPC, pdev); - if (!pdev) { - LPC_DBG_ERROR("pci_get_device(0x8086, 0x8c54) failed!\n"); - return 0; - } - - ret = rg_lpc_cpld_probe(pdev, NULL); - LPC_DBG_VERBOSE("Leave ret %d.\n", ret); - return ret; -} - -static void __exit lpc_dbg_exit(void) -{ - LPC_DBG_VERBOSE("Enter.\n"); - rg_lpc_cpld_remove(NULL); - LPC_DBG_VERBOSE("Leave.\n"); -} - - - -module_init(lpc_dbg_init); -module_exit(lpc_dbg_exit); - -#endif -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("support "); - diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h deleted file mode 100755 index d1aad9c907..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/lpc_dbg.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __ETH_CMD_TYPES_H__ -#define __ETH_CMD_TYPES_H__ - -typedef enum { - ETH_START = 1, - ETH_SHOW, - ETH_SET, - ETH_TEST, - ETH_MAC_REG, - ETH_PHY_REG, -} ether_dbg_top_cmd_t; - -typedef enum { - ETH_MAC_REG_READ = 1, - ETH_MAC_REG_WRITE, - ETH_MAC_REG_CHECK, - ETH_MAC_REG_DUMP_ALL, - ETH_MAC_REG_DUMP_PCI_CFG_ALL, -} ether_mac_reg_cmd_t; - - -#define ETH_DBG_TYPE(cmd1, cmd2, cmd3, cmd4) \ - ((cmd1) | ((cmd2) << 8) | ((cmd3) << 16) | ((cmd4) << 24)) -#define ETH_DBG_PARSE_TYPE(type, cmd1, cmd2, cmd3, cmd4) \ - do {\ - (cmd1) = (type) & 0xff;\ - (cmd2) = ((type) >> 8) & 0xff;\ - (cmd3) = ((type) >> 16) & 0xff;\ - (cmd4) = ((type) >> 24) & 0xff;\ - } while (0) - -typedef struct { - int type; - int length; - unsigned char value[128]; -} ether_msg_t; - - -#endif /* __ETH_CMD_TYPES_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile new file mode 100644 index 0000000000..369b64605d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/Makefile @@ -0,0 +1,20 @@ +pes_parent_dir:=$(shell pwd)/$(lastword $(MAKEFILE_LIST)) +pes_parent_dir:=$(shell dirname $(pes_parent_dir)) + +SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "build") print $$9}') +INC = -I./inc + +all : CHECK $(SUBDIRS) +CHECK : + @echo $(pes_parent_dir) + +$(SUBDIRS):ECHO + #@echo $@ + make -C $@ + +ECHO: + @echo $(SUBDIRS) + +.PHONY : clean +clean : + -rm -rf $(SYSFS_OUT_PUT) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile new file mode 100644 index 0000000000..e516b70b3d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/Makefile @@ -0,0 +1,25 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +SUBDIR_CFG = cfg +plat_dfd-objs := dfd_module.o dfd_fan_driver.o \ +dfd_slot_driver.o \ +dfd_sensors_driver.o \ +dfd_psu_driver.o \ +dfd_sff_driver.o \ +$(SUBDIR_CFG)/dfd_cfg.o \ +$(SUBDIR_CFG)/dfd_cfg_adapter.o \ +$(SUBDIR_CFG)/dfd_cfg_file.o \ +$(SUBDIR_CFG)/dfd_cfg_info.o \ +$(SUBDIR_CFG)/dfd_cfg_listnode.o \ + +obj-m := plat_dfd.o +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/$(SUBDIR_CFG)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd $(PWD)/$(SUBDIR_CFG)/.*.cmd $(PWD)/*.mod + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c new file mode 100644 index 0000000000..b0c9e9f6e7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg.c @@ -0,0 +1,812 @@ +#include +#include +#include +#include +#include +#include + +#include "../include/dfd_module.h" +#include "../include/dfd_cfg_file.h" +#include "../include/dfd_cfg_listnode.h" +#include "../include/dfd_cfg_info.h" +#include "../include/dfd_cfg_adapter.h" +#include "../include/dfd_cfg.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +#ifdef DFD_CFG_ITEM +#undef DFD_CFG_ITEM +#endif +#define DFD_CFG_ITEM(_id, _name, _index_min, _index_max) _name, +static char *dfd_cfg_item_name[] = { + DFD_CFG_ITEM_ALL +}; + +#ifdef DFD_CFG_ITEM +#undef DFD_CFG_ITEM +#endif +#define DFD_CFG_ITEM(_id, _name, _index_min, _index_max) {_index_min, _index_max}, +static index_range_t dfd_cfg_item_index_range[] = { + DFD_CFG_ITEM_ALL +}; + +static lnode_root_t dfd_ko_cfg_list_root; + +static void dfd_ko_cfg_del_space_lf_cr(char *str) +{ + int i, j; + int len; + + len = strlen(str); + for (i = 0; i < len; i++) { + if (str[i] == '\r' || str[i] == '\n' || str[i] == ' ') { + for (j = i; j < len - 1; j++) { + str[j] = str[j + 1]; + } + str[j] = '\0'; + len--; + i--; + } + } +} + +static int dfd_ko_cfg_get_value_from_char(char *value_str, int32_t *value, int line_num) +{ + int value_tmp = 0; + + if (strlen(value_str) == 0) { + DBG_DEBUG(DBG_WARN, "line%d: value str is empty\n", line_num); + *value = DFD_CFG_EMPTY_VALUE; + return 0; + } + + if ((strlen(value_str) > 2) && (value_str[0] == '0') + && (value_str[1] == 'x' || value_str[1] == 'X')) { + value_tmp = (int32_t)simple_strtol(value_str, NULL, 16); + } else { + value_tmp = (int32_t)simple_strtol(value_str, NULL, 10); + } + + *value = value_tmp; + return 0; +} + +static int dfd_ko_cfg_analyse_index(char *index_str, int *index1, int *index2, int line_num) +{ + int rv; + char *index1_begin_char, *index2_begin_char; + + if (index_str[0] != '_') { + DBG_DEBUG(DBG_ERROR, "line%d: no '-' between name and index1\n", line_num); + return -1; + } + + index1_begin_char = index_str; + rv = dfd_ko_cfg_get_value_from_char(++index1_begin_char, index1, line_num); + if (rv < 0) { + return -1; + } + + if (index2 == NULL) { + return 0; + } + + index2_begin_char = strchr(index1_begin_char, '_'); + if (index2_begin_char == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: no '-' between index1 and index2\n", line_num); + return -1; + } else { + rv = dfd_ko_cfg_get_value_from_char(++index2_begin_char, index2, line_num); + if (rv < 0) { + return -1; + } + } + + return 0; +} + +static int dfd_ko_cfg_check_array_index(index_range_t *index_range, int *index1, int *index2, + int line_num) +{ + + if ((*index1 < 0) || (*index1 > index_range->index1_max)) { + DBG_DEBUG(DBG_ERROR, "line%d: index1[%d] invalid, max=%d\n", line_num, *index1, + index_range->index1_max); + return -1; + } + + if (index2 == NULL) { + return 0; + } + + if ((*index2 < 0) || (*index2 > index_range->index2_max)) { + DBG_DEBUG(DBG_ERROR, "line%d: index2[%d] invalid, max=%d\n", line_num, *index2, + index_range->index2_max); + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_get_index(char *index_str, index_range_t *index_range, int *index1, + int *index2, int line_num) +{ + int rv; + + if (index_range->index2_max == INDEX_NOT_EXIST) { + index2 = NULL; + } + + rv = dfd_ko_cfg_analyse_index(index_str, index1, index2, line_num); + if (rv < 0) { + return -1; + } + + rv = dfd_ko_cfg_check_array_index(index_range, index1, index2, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_add_int_item(int key, int value, int line_num) +{ + int rv; + int *int_cfg; + + int_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (int_cfg == NULL) { + + int_cfg = (int *)kmalloc(sizeof(int), GFP_KERNEL); + if (int_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc int fail\n", line_num); + return -1; + } + + *int_cfg = value; + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, int_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add int item[%d] success, key=0x%08x\n", line_num, value, key); + } else { + kfree(int_cfg); + int_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add int item[%d] fail, key=0x%08x rv=%d \n", line_num, value, key, rv); + return -1; + } + } else { + + DBG_DEBUG(DBG_WARN, "line%d: replace int item[%d->%d], key=0x%08x\n", line_num, *int_cfg, value, key); + *int_cfg = value; + } + + return 0; +} + +static int dfd_ko_cfg_analyse_int_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, char *arg_value, + char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int value, key; + char *arg_name_tmp; + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + rv = dfd_ko_cfg_get_value_from_char(arg_value, &value, line_num); + if (rv < 0) { + return -1; + } + + key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_int_item(key, value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_add_str_item(int key, char *str, int line_num) +{ + int rv; + char *str_cfg; + + str_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (str_cfg == NULL) { + + str_cfg = (char *)kmalloc(DFD_CFG_STR_MAX_LEN, GFP_KERNEL); + if (str_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc str[%lu] fail\n", line_num, strlen(str)); + return -1; + } + mem_clear(str_cfg, DFD_CFG_STR_MAX_LEN); + strncpy(str_cfg, str, DFD_CFG_STR_MAX_LEN - 1); + + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, str_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add string item[%s] success, key=0x%08x\n", line_num, str_cfg, key); + } else { + kfree(str_cfg); + str_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add string item[%s] fail, key=0x%08x rv=%d \n", line_num, str_cfg, key, rv); + return -1; + } + } else { + DBG_DEBUG(DBG_WARN, "line%d: replace string item[%s->%s], key=0x%08x\n", line_num, str_cfg, str, key); + mem_clear(str_cfg, DFD_CFG_STR_MAX_LEN); + strncpy(str_cfg, str, DFD_CFG_STR_MAX_LEN - 1); + } + + return 0; +} + +static int dfd_ko_cfg_analyse_str_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, char *arg_value, + char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int btree_key; + char *arg_name_tmp; + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + if (strlen(arg_value) >= DFD_CFG_STR_MAX_LEN) { + DBG_DEBUG(DBG_ERROR, "line%d: string item[%s] is too long \n", line_num, arg_value); + return -1; + } + + btree_key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_str_item(btree_key, arg_value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_get_i2c_dev_member(char *member_str, dfd_i2c_dev_mem_t *member, int line_num) +{ + dfd_i2c_dev_mem_t mem_index; + + for (mem_index = DFD_I2C_DEV_MEM_BUS; mem_index < DFD_I2C_DEV_MEM_END; mem_index++) { + if (memcmp(member_str, g_dfd_i2c_dev_mem_str[mem_index], + strlen(g_dfd_i2c_dev_mem_str[mem_index])) == 0) { + *member = mem_index; + return 0; + } + } + + DBG_DEBUG(DBG_ERROR, "line%d: i2c dev member[%s] invalid\n", line_num, member_str); + return -1; +} + +static void dfd_ko_cfg_set_i2c_dev_mem_value(dfd_i2c_dev_t *i2c_dev, dfd_i2c_dev_mem_t member, + int value) +{ + switch (member) { + case DFD_I2C_DEV_MEM_BUS: + i2c_dev->bus = value; + break; + case DFD_I2C_DEV_MEM_ADDR: + i2c_dev->addr = value; + break; + default: + break; + } +} + +static int dfd_ko_cfg_add_i2c_dev_item(int key, dfd_i2c_dev_mem_t member, int value, int line_num) +{ + int rv; + dfd_i2c_dev_t *i2c_dev_cfg; + + i2c_dev_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (i2c_dev_cfg == NULL) { + + i2c_dev_cfg = (dfd_i2c_dev_t *)kmalloc(sizeof(dfd_i2c_dev_t), GFP_KERNEL); + if (i2c_dev_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc i2c_dev fail\n", line_num); + return -1; + } + mem_clear(i2c_dev_cfg, sizeof(dfd_i2c_dev_t)); + + dfd_ko_cfg_set_i2c_dev_mem_value(i2c_dev_cfg, member, value); + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, i2c_dev_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add i2c_dev item[%s=%d] success, key=0x%08x\n", line_num, + g_dfd_i2c_dev_mem_str[member], value, key); + } else { + kfree(i2c_dev_cfg); + i2c_dev_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add i2c_dev item[%s=%d] fail, key=0x%08x rv=%d\n", line_num, + g_dfd_i2c_dev_mem_str[member], value, key, rv); + return -1; + } + } else { + + DBG_DEBUG(DBG_VERBOSE, "line%d: replace i2c_dev item[%s=%d], key=0x%08x\n", line_num, + g_dfd_i2c_dev_mem_str[member], value, key); + dfd_ko_cfg_set_i2c_dev_mem_value(i2c_dev_cfg, member, value); + } + + return 0; +} + +static int dfd_ko_cfg_analyse_i2c_dev_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, + char *arg_value, char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int value, key; + char *arg_name_tmp; + dfd_i2c_dev_mem_t member; + + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_i2c_dev_member(arg_name_tmp, &member, line_num); + if (rv < 0) { + return -1; + } + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp += strlen(g_dfd_i2c_dev_mem_str[member]); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + rv = dfd_ko_cfg_get_value_from_char(arg_value, &value, line_num); + if (rv < 0) { + return -1; + } + + key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_i2c_dev_item(key, member, value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_get_enum_value_by_str(char *enum_val_str[], int enum_val_end, char *buf) +{ + int i; + int enum_val; + + enum_val = DFD_CFG_INVALID_VALUE; + for (i = 0; i < enum_val_end; i++) { + if (memcmp(buf, enum_val_str[i], strlen(enum_val_str[i])) == 0) { + enum_val = i; + break; + } + } + + return enum_val; +} + +static int dfd_ko_cfg_get_info_ctrl_member(char *member_str, info_ctrl_mem_t *member, int line_num) +{ + info_ctrl_mem_t mem_index; + + for (mem_index = INFO_CTRL_MEM_MODE; mem_index < INFO_CTRL_MEM_END; mem_index++) { + if (memcmp(member_str, g_info_ctrl_mem_str[mem_index], + strlen(g_info_ctrl_mem_str[mem_index])) == 0) { + *member = mem_index; + return 0; + } + } + + DBG_DEBUG(DBG_ERROR, "line%d: info ctrl member[%s] invalid\n", line_num, member_str); + return -1; +} + +static void dfd_ko_cfg_set_info_ctrl_mem_value(info_ctrl_t *info_ctrl, info_ctrl_mem_t member, + char *buf_val, int line_num) +{ + switch (member) { + case INFO_CTRL_MEM_MODE: + info_ctrl->mode = dfd_ko_cfg_get_enum_value_by_str(g_info_ctrl_mode_str, INFO_CTRL_MODE_END, buf_val);; + break; + case INFO_CTRL_MEM_INT_CONS: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->int_cons), line_num); + break; + case INFO_CTRL_MEM_SRC: + info_ctrl->src = dfd_ko_cfg_get_enum_value_by_str(g_info_src_str, INFO_SRC_END, buf_val); + break; + case INFO_CTRL_MEM_FRMT: + info_ctrl->frmt = dfd_ko_cfg_get_enum_value_by_str(g_info_frmt_str, INFO_FRMT_END, buf_val); + break; + case INFO_CTRL_MEM_POLA: + info_ctrl->pola = dfd_ko_cfg_get_enum_value_by_str(g_info_pola_str, INFO_POLA_END, buf_val); + break; + case INFO_CTRL_MEM_FPATH: + mem_clear(info_ctrl->fpath, sizeof(info_ctrl->fpath)); + strncpy(info_ctrl->fpath, buf_val, sizeof(info_ctrl->fpath) - 1); + break; + case INFO_CTRL_MEM_ADDR: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->addr), line_num); + break; + case INFO_CTRL_MEM_LEN: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->len), line_num); + break; + case INFO_CTRL_MEM_BIT_OFFSET: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->bit_offset), line_num); + break; + case INFO_CTRL_MEM_STR_CONS: + mem_clear(info_ctrl->str_cons, sizeof(info_ctrl->str_cons)); + strncpy(info_ctrl->str_cons, buf_val, sizeof(info_ctrl->str_cons) - 1); + break; + case INFO_CTRL_MEM_INT_EXTRA1: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->int_extra1), line_num); + break; + case INFO_CTRL_MEM_INT_EXTRA2: + dfd_ko_cfg_get_value_from_char(buf_val, &(info_ctrl->int_extra2), line_num); + break; + default: + break; + } +} + +static int dfd_ko_cfg_add_info_ctrl_item(int key, info_ctrl_mem_t member, char *buf_val, + int line_num) +{ + int rv; + info_ctrl_t *info_ctrl_cfg; + + info_ctrl_cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (info_ctrl_cfg == NULL) { + + info_ctrl_cfg = (info_ctrl_t *)kmalloc(sizeof(info_ctrl_t), GFP_KERNEL); + if (info_ctrl_cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "line%d: kmalloc info_ctrl fail\n", line_num); + return -1; + } + mem_clear(info_ctrl_cfg, sizeof(info_ctrl_t)); + + dfd_ko_cfg_set_info_ctrl_mem_value(info_ctrl_cfg, member, buf_val, line_num); + rv = lnode_insert_node(&dfd_ko_cfg_list_root, key, info_ctrl_cfg); + if (rv == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: add info_ctrl item[%s=%s] success, key=0x%08x\n", line_num, + g_info_ctrl_mem_str[member], buf_val, key); + } else { + kfree(info_ctrl_cfg); + info_ctrl_cfg = NULL; + DBG_DEBUG(DBG_ERROR, "line%d: add info_ctrl item[%s=%s] fail, key=0x%08x rv=%d\n", line_num, + g_info_ctrl_mem_str[member], buf_val, key, rv); + return -1; + } + } else { + + DBG_DEBUG(DBG_VERBOSE, "line%d: replace info_ctrl item[%s=%s], key=0x%08x\n", line_num, + g_info_ctrl_mem_str[member], buf_val, key); + dfd_ko_cfg_set_info_ctrl_mem_value(info_ctrl_cfg, member, buf_val, line_num); + } + + return 0; +} + +static int dfd_ko_cfg_analyse_info_ctrl_item(dfd_cfg_item_id_t cfg_item_id, char *arg_name, + char *arg_value, char *cfg_pre, index_range_t *index_range, int line_num) +{ + int rv; + int index1 = 0, index2 = 0; + int key; + char *arg_name_tmp; + info_ctrl_mem_t member; + + arg_name_tmp = arg_name + strlen(cfg_pre); + rv = dfd_ko_cfg_get_info_ctrl_member(arg_name_tmp, &member, line_num); + if (rv < 0) { + return -1; + } + + if (index_range->index1_max != INDEX_NOT_EXIST) { + arg_name_tmp += strlen(g_info_ctrl_mem_str[member]); + rv = dfd_ko_cfg_get_index(arg_name_tmp, index_range, &index1, &index2, line_num); + if (rv < 0) { + return -1; + } + } + + key = DFD_CFG_KEY(cfg_item_id, index1, index2); + rv = dfd_ko_cfg_add_info_ctrl_item(key, member, arg_value, line_num); + if (rv < 0) { + return -1; + } + + return 0; +} + +static int dfd_ko_cfg_analyse_config(char *arg_name, char*arg_value, int line_num) +{ + int i, rv = 0; + int cfg_item_num; + + cfg_item_num = sizeof(dfd_cfg_item_name) / sizeof(dfd_cfg_item_name[0]); + for (i = 0; i < cfg_item_num; i++) { + if (memcmp(arg_name, dfd_cfg_item_name[i], strlen(dfd_cfg_item_name[i])) == 0){ + if (DFD_CFG_ITEM_IS_INT(i)) { + rv = dfd_ko_cfg_analyse_int_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else if (DFD_CFG_ITEM_IS_STRING(i)) { + rv = dfd_ko_cfg_analyse_str_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else if (DFD_CFG_ITEM_IS_I2C_DEV(i)) { + rv = dfd_ko_cfg_analyse_i2c_dev_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else if (DFD_CFG_ITEM_IS_INFO_CTRL(i)) { + rv = dfd_ko_cfg_analyse_info_ctrl_item(i, arg_name, arg_value, dfd_cfg_item_name[i], + &(dfd_cfg_item_index_range[i]), line_num); + } else { + rv = -1; + } + break; + } + } + + return rv; +} + +static int dfd_ko_cfg_cut_config_line(char *config_line, char *arg_name, char *arg_value) +{ + int i, j = 0, k = 0; + int len, name_value_flag = 0; + + len = strlen(config_line); + for (i = 0; i < len; i++) { + if (config_line[i] == '=') { + name_value_flag = 1; + continue; + } + + if (name_value_flag == 0) { + arg_name[j++] = config_line[i]; + } else { + arg_value[k++] = config_line[i]; + } + } + + if (name_value_flag == 0) { + return -1; + } else { + return 0; + } +} + +static int dfd_ko_cfg_analyse_config_line(char *config_line, int line_num) +{ + int rv; + char arg_name[DFD_CFG_NAME_MAX_LEN] = {0}; + char arg_value[DFD_CFG_VALUE_MAX_LEN] = {0}; + + dfd_ko_cfg_del_space_lf_cr(config_line); + + if (strlen(config_line) == 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: space line\n", line_num); + return 0; + } + + if (config_line[0] == '#') { + DBG_DEBUG(DBG_VERBOSE, "line%d: comment line[%s]\n", line_num, config_line); + return 0; + } + + rv = dfd_ko_cfg_cut_config_line(config_line, arg_name, arg_value); + if (rv < 0) { + DBG_DEBUG(DBG_VERBOSE, "line%d: [%s]no '=' between name and value\n", line_num, config_line); + return -1; + } + + DBG_DEBUG(DBG_VERBOSE, "line%d: config_line[%s] name[%s] value[%s]\n", line_num, config_line, arg_name, arg_value); + return dfd_ko_cfg_analyse_config(arg_name, arg_value, line_num); +} + +static int dfd_ko_cfg_analyse_config_file(char *fpath) +{ + int rv; + int line_num = 1; + kfile_ctrl_t kfile_ctrl; + char config_line[DFD_CFG_CMDLINE_MAX_LEN] = {0}; + + rv = kfile_open(fpath, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_ERROR, "open config file[%s] fail, rv=%d\n", fpath, rv); + return -1; + } + + while(kfile_gets(config_line, sizeof(config_line), &kfile_ctrl) > 0){ + rv = dfd_ko_cfg_analyse_config_line(config_line, line_num++); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "!!!!file[%s] config line[%d %s] analyse fail\n", fpath, line_num - 1, + config_line); + break; + } + + (void)mem_clear(config_line, sizeof(config_line)); + + } + kfile_close(&kfile_ctrl); + + return rv; +} + +void *dfd_ko_cfg_get_item(int key) +{ + return lnode_find_node(&dfd_ko_cfg_list_root, key); +} + +static void dfd_ko_cfg_print_item(int key, const void *cfg) +{ + int item_id; + dfd_i2c_dev_t *i2c_dev; + info_ctrl_t *info_ctrl; + + if (cfg == NULL) { + DBG_DEBUG(DBG_ERROR, "input arguments error\n"); + return; + } + printk(KERN_INFO "**************************\n"); + printk(KERN_INFO "key=0x%08x\n", key); + + item_id = DFD_CFG_ITEM_ID(key); + if (DFD_CFG_ITEM_IS_INT(item_id)) { + printk(KERN_INFO "int=%d\n", *((int *)cfg)); + } else if (DFD_CFG_ITEM_IS_I2C_DEV(item_id)) { + i2c_dev = (dfd_i2c_dev_t *)cfg; + printk(KERN_INFO ".bus=0x%02x\n", i2c_dev->bus); + printk(KERN_INFO ".addr=0x%02x\n", i2c_dev->addr); + } else if (DFD_CFG_ITEM_IS_INFO_CTRL(item_id)) { + info_ctrl = (info_ctrl_t *)cfg; + printk(KERN_INFO ".mode=%s\n", g_info_ctrl_mode_str[info_ctrl->mode]); + printk(KERN_INFO ".int_cons=%d\n", info_ctrl->int_cons); + printk(KERN_INFO ".src=%s\n", g_info_src_str[info_ctrl->src]); + printk(KERN_INFO ".frmt=%s\n", g_info_frmt_str[info_ctrl->frmt]); + printk(KERN_INFO ".pola=%s\n", g_info_pola_str[info_ctrl->pola]); + printk(KERN_INFO ".fpath=%s\n", info_ctrl->fpath); + printk(KERN_INFO ".addr=0x%02x\n", info_ctrl->addr); + printk(KERN_INFO ".len=%d\n", info_ctrl->len); + printk(KERN_INFO ".bit_offset=%d\n", info_ctrl->bit_offset); + } else { + printk(KERN_INFO "item[%d] error!\n", item_id); + } +} + +void dfd_ko_cfg_show_item(int key) +{ + void *cfg; + + cfg = lnode_find_node(&dfd_ko_cfg_list_root, key); + if (cfg == 0) { + printk(KERN_INFO "item[0x%08x] not exist\n", key); + return; + } + + dfd_ko_cfg_print_item(key, cfg); +} + +static int dfd_get_my_dev_type_by_file(void) +{ + struct file *fp; + loff_t pos; + int card_type; + char buf[DFD_PID_BUF_LEN]; + int ret; + + fp= filp_open(DFD_PUB_CARDTYPE_FILE, O_RDONLY, 0); + if (IS_ERR(fp)) { + DBG_DEBUG(DBG_VERBOSE, "open file fail!\n"); + return -1; + } + mem_clear(buf, DFD_PID_BUF_LEN); + pos = 0; + ret = kernel_read(fp, buf, DFD_PRODUCT_ID_LENGTH + 1, &pos); + if (ret < 0) { + DBG_DEBUG(DBG_VERBOSE, "kernel_read failed, path=%s, addr=0, size=%d, ret=%d\n", + DFD_PUB_CARDTYPE_FILE, DFD_PRODUCT_ID_LENGTH + 1, ret); + filp_close(fp, NULL); + return -1; + } + + card_type = simple_strtoul(buf, NULL, 10); + DBG_DEBUG(DBG_VERBOSE, "card_type 0x%x.\n", card_type); + + filp_close(fp, NULL); + return card_type; +} + +static int drv_get_my_dev_type(void) +{ + static int type = -1; + + if (type > 0) { + return type; + } + type = dfd_get_my_dev_type_by_file(); + DBG_DEBUG(DBG_VERBOSE, "ko board type %d\n", type); + return type; +} + +static int dfd_ko_cfg_init(void) +{ + int rv; + int card_type; + char file_name[32] = {0}; + char fpath[128] = {0}; + kfile_ctrl_t kfile_ctrl; + + rv = lnode_init_root(&dfd_ko_cfg_list_root); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "init list root fail, rv=%d\n", rv); + return -1; + } + + card_type = drv_get_my_dev_type(); + if (card_type > 0) { + snprintf(fpath, sizeof(fpath), "%s0x%x", DFD_KO_CFG_FILE_DIR, card_type); + rv = kfile_open(fpath, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_VERBOSE, "open config file[%s] fail, rv=%d, maybe not exist\n", + fpath, rv); + + rv = kfile_open(DFD_KO_CFG_FILE_NAME, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_ERROR, "open config file[%s] fail, rv=%d\n", DFD_KO_CFG_FILE_NAME, + rv); + return -1; + } + DBG_DEBUG(DBG_ERROR, "get config file from: %s, success.\n", DFD_KO_CFG_FILE_NAME); + } else { + DBG_DEBUG(DBG_VERBOSE, "get config file from: %s, success.\n", fpath); + } + } else { + DBG_DEBUG(DBG_VERBOSE, "get board id failed, try to get config file from: %s\n", + DFD_KO_CFG_FILE_NAME); + + rv = kfile_open(DFD_KO_CFG_FILE_NAME, &kfile_ctrl); + if (rv != KFILE_RV_OK) { + DBG_DEBUG(DBG_ERROR, "open config file[%s] fail, rv=%d\n", DFD_KO_CFG_FILE_NAME, rv); + return -1; + } + DBG_DEBUG(DBG_ERROR, "get config file from: %s, success.\n", DFD_KO_CFG_FILE_NAME); + } + + while (kfile_gets(file_name, sizeof(file_name), &kfile_ctrl) > 0) { + + dfd_ko_cfg_del_space_lf_cr(file_name); + mem_clear(fpath, sizeof(fpath)); + snprintf(fpath, sizeof(fpath), "%s%s.cfg", DFD_KO_CFG_FILE_DIR, file_name); + DBG_DEBUG(DBG_VERBOSE, ">>>>start parsing config file[%s]\n", fpath); + + rv = dfd_ko_cfg_analyse_config_file(fpath); + if (rv < 0) { + break; + } + } + kfile_close(&kfile_ctrl); + + return 0; +} + +int32_t dfd_dev_cfg_init(void) +{ + return dfd_ko_cfg_init(); +} + +void dfd_dev_cfg_exit(void) +{ + lnode_free_list(&dfd_ko_cfg_list_root); + return; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c new file mode 100644 index 0000000000..1d5ca7072f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_adapter.c @@ -0,0 +1,351 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "../include/dfd_module.h" +#include "../include/dfd_cfg_file.h" +#include "../include/dfd_cfg.h" +#include "../include/dfd_cfg_adapter.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +char *g_dfd_i2c_dev_mem_str[DFD_I2C_DEV_MEM_END] = { + ".bus", + ".addr", +}; + +static dfd_i2c_dev_t* dfd_ko_get_cpld_i2c_dev(int sub_slot, int cpld_id) +{ + int key; + dfd_i2c_dev_t *i2c_dev; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_I2C_DEV, sub_slot, cpld_id); + i2c_dev = dfd_ko_cfg_get_item(key); + if (i2c_dev == NULL) { + DBG_DEBUG(DBG_ERROR, "get cpld[%d] i2c dev config fail, key=0x%08x\n", cpld_id, key); + return NULL; + } + + return i2c_dev; +} + +static int32_t dfd_ko_i2c_smbus_transfer(int read_write, int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int rv; + struct i2c_adapter *i2c_adap; + union i2c_smbus_data data; + + i2c_adap = i2c_get_adapter(bus); + if (i2c_adap == NULL) { + DBG_DEBUG(DBG_ERROR, "get i2c bus[%d] adapter fail\n", bus); + return -DFD_RV_DEV_FAIL; + } + + if (read_write == I2C_SMBUS_WRITE) { + data.byte = *buf; + } else { + data.byte = 0; + } + rv = i2c_smbus_xfer(i2c_adap, addr, 0, read_write, offset, I2C_SMBUS_BYTE_DATA, &data); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "i2c dev[bus=%d addr=0x%x offset=0x%x size=%d rw=%d] transfer fail, rv=%d\n", + bus, addr, offset, size, read_write, rv); + rv = -DFD_RV_DEV_FAIL; + } else { + DBG_DEBUG(DBG_VERBOSE, "i2c dev[bus=%d addr=0x%x offset=0x%x size=%d rw=%d] transfer success\n", + bus, addr, offset, size, read_write); + rv = DFD_RV_OK; + } + + if (read_write == I2C_SMBUS_READ) { + if (rv == DFD_RV_OK) { + *buf = data.byte; + } else { + *buf = 0; + } + } + + i2c_put_adapter(i2c_adap); + return rv; +} + +static int32_t dfd_ko_i2c_read_data(int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int i, rv; + for (i = 0; i < DFD_KO_CPLD_I2C_RETRY_TIMES; i++) { + rv = dfd_ko_i2c_smbus_transfer(I2C_SMBUS_READ, bus, addr, offset, buf, size); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "[%d]cpld read[offset=0x%x] fail, rv %d\n", i, addr, rv); + msleep(DFD_KO_CPLD_I2C_RETRY_SLEEP); + } else { + DBG_DEBUG(DBG_VERBOSE, "[%d]cpld read[offset=0x%x] success, value=0x%x\n", + i, addr, *buf); + break; + } + } + return rv; +} + +static int32_t dfd_ko_i2c_write_data(int bus, int addr, int offset, uint8_t data, uint32_t size) +{ + int i, rv; + for (i = 0; i < DFD_KO_CPLD_I2C_RETRY_TIMES; i++) { + rv = dfd_ko_i2c_smbus_transfer(I2C_SMBUS_WRITE, bus, addr, offset, &data, size); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "[%d]cpld write[offset=0x%x] fail, rv=%d\n", i, addr, rv); + msleep(DFD_KO_CPLD_I2C_RETRY_SLEEP); + } else { + DBG_DEBUG(DBG_VERBOSE, "[%d]cpld write[offset=0x%x, data=%d] success\n", i, addr, data); + break; + } + } + + return rv; +} + +static int32_t dfd_ko_cpld_i2c_read(int32_t addr, uint8_t *buf) +{ + int rv; + int sub_slot, cpld_id, cpld_addr; + dfd_i2c_dev_t *i2c_dev; + + if (buf == NULL) { + DBG_DEBUG(DBG_ERROR, "input arguments error\n"); + return -DFD_RV_INDEX_INVALID; + } + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + cpld_addr = DFD_KO_CPLD_GET_INDEX(addr); + + i2c_dev = dfd_ko_get_cpld_i2c_dev(sub_slot, cpld_id); + if (i2c_dev == NULL) { + return -DFD_RV_DEV_NOTSUPPORT; + } + rv = dfd_ko_i2c_read_data(i2c_dev->bus, i2c_dev->addr, cpld_addr, buf, sizeof(uint8_t)); + + return rv; +} + +static int32_t dfd_ko_cpld_i2c_write(int32_t addr, uint8_t data) +{ + int rv; + int sub_slot, cpld_id, cpld_addr; + dfd_i2c_dev_t *i2c_dev; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + cpld_addr = DFD_KO_CPLD_GET_INDEX(addr); + + i2c_dev = dfd_ko_get_cpld_i2c_dev(sub_slot, cpld_id); + if (i2c_dev == NULL) { + return -DFD_RV_DEV_NOTSUPPORT; + } + + rv = dfd_ko_i2c_write_data(i2c_dev->bus, i2c_dev->addr, cpld_addr, data, sizeof(uint8_t)); + + return rv; +} + +static int32_t dfd_ko_cpld_io_read(int32_t addr, uint8_t *buf) +{ + int cpld_id, sub_slot, offset; + int key; + int *tmp; + uint16_t io_port; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + offset = DFD_KO_CPLD_GET_INDEX(addr); + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_LPC_DEV, sub_slot, cpld_id); + tmp = dfd_ko_cfg_get_item(key); + if (tmp == NULL) { + DBG_DEBUG(DBG_ERROR,"get cpld io base config fail, key=0x%08x\n", key); + return -1; + } + + io_port = (u16)(*tmp) + offset; + *buf = inb(io_port); + DBG_DEBUG(DBG_VERBOSE, "read cpld io port addr 0x%x, data 0x%x\n", io_port, *buf); + + return DFD_RV_OK; + +} + +static int32_t dfd_ko_cpld_io_write(int32_t addr, uint8_t data) +{ + int cpld_id, sub_slot, offset; + int key; + int *tmp; + uint16_t io_port; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + offset = DFD_KO_CPLD_GET_INDEX(addr); + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_LPC_DEV, sub_slot, cpld_id); + tmp = dfd_ko_cfg_get_item(key); + if (tmp == NULL) { + DBG_DEBUG(DBG_ERROR, "get cpld io base config fail, key=0x%08x\n", key); + return -1; + } + + io_port = (u16)(*tmp) + offset; + DBG_DEBUG(DBG_VERBOSE, "write cpld io port addr 0x%x, data 0x%x\n", io_port, data); + outb(data, (u16)io_port); + + return DFD_RV_OK; +} + +static int dfd_cfg_get_cpld_mode(int sub_slot, int cpld_id, int *mode) +{ + int key; + char *name; + + if (mode == NULL) { + DBG_DEBUG(DBG_ERROR, "input arguments error\n"); + return -DFD_RV_TYPE_ERR; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_CPLD_MODE, sub_slot, cpld_id); + name = dfd_ko_cfg_get_item(key); + if (name == NULL) { + DBG_DEBUG(DBG_ERROR, "get cpld[%d] mode info ctrl fail, key=0x%08x\n", cpld_id, key); + return -DFD_RV_NODE_FAIL; + } + + DBG_DEBUG(DBG_VERBOSE, "cpld_id %d mode_name %s.\n", cpld_id, name); + if (!strncmp(name, DFD_KO_CPLD_MODE_I2C_STRING, strlen(DFD_KO_CPLD_MODE_I2C_STRING))) { + *mode = DFD_CPLD_MODE_I2C; + } else if (!strncmp(name, DFD_KO_CPLD_MODE_LPC_STRING, strlen(DFD_KO_CPLD_MODE_LPC_STRING))) { + *mode = DFD_CPLD_MODE_LPC; + } else { + + *mode = DFD_CPLD_MODE_I2C; + } + + DBG_DEBUG(DBG_VERBOSE, "cpld_id %d mode %d.\n", cpld_id, *mode); + return 0; +} + +int32_t dfd_ko_cpld_read(int32_t addr, uint8_t *buf) +{ + int ret; + int sub_slot, cpld_id; + int cpld_mode; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + + ret = dfd_cfg_get_cpld_mode(sub_slot, cpld_id, &cpld_mode); + if (ret) { + DBG_DEBUG(DBG_WARN, "drv_get_cpld_mode sub_slot %d cpldid %d faile, set default i2c mode.\n", sub_slot, cpld_id); + cpld_mode = DFD_CPLD_MODE_I2C; + } + + if (cpld_mode == DFD_CPLD_MODE_I2C) { + ret = dfd_ko_cpld_i2c_read(addr, buf); + } else if (cpld_mode == DFD_CPLD_MODE_LPC) { + ret = dfd_ko_cpld_io_read(addr, buf); + } else { + DBG_DEBUG(DBG_ERROR, "cpld_mode %d invalid.\n", cpld_mode); + ret = -DFD_RV_DEV_NOTSUPPORT; + } + + DBG_DEBUG(DBG_VERBOSE, "addr 0x%x val 0x%x ret %d\n", addr, *buf, ret); + return ret; +} + +int32_t dfd_ko_cpld_write(int32_t addr, uint8_t val) +{ + int ret; + int sub_slot, cpld_id, cpld_mode; + + sub_slot = DFD_KO_CPLD_GET_SLOT(addr); + cpld_id = DFD_KO_CPLD_GET_ID(addr); + + ret = dfd_cfg_get_cpld_mode(sub_slot, cpld_id, &cpld_mode); + if (ret) { + DBG_DEBUG(DBG_ERROR, "drv_get_cpld_mode sub_slot %d cpldid %d faile, set default local_bus mode.\n", sub_slot, cpld_id); + cpld_mode = DFD_CPLD_MODE_I2C; + } + + if (cpld_mode == DFD_CPLD_MODE_I2C) { + ret = dfd_ko_cpld_i2c_write(addr, val); + } else if (cpld_mode == DFD_CPLD_MODE_LPC) { + ret = dfd_ko_cpld_io_write(addr, val); + } else { + DBG_DEBUG(DBG_ERROR, "cpld_mode %d invalid.\n", cpld_mode); + ret = -DFD_RV_DEV_NOTSUPPORT; + } + + DBG_DEBUG(DBG_VERBOSE, "addr 0x%x val 0x%x ret %d\n", addr, val, ret); + return ret; +} + +int32_t dfd_ko_i2c_read(int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int i, rv; + + for (i = 0; i < size; i++) { + rv = dfd_ko_i2c_read_data(bus, addr, offset, &buf[i], sizeof(uint8_t)); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "dfd_ko_i2c_read[bus=%d addr=0x%x offset=0x%x]fail, rv=%d\n", + bus, addr, offset, rv); + return rv; + } + offset++; + } + + return size; +} + +int32_t dfd_ko_i2c_write(int bus, int addr, int offset, uint8_t *buf, uint32_t size) +{ + int i, rv; + + for (i = 0; i < size; i++) { + rv = dfd_ko_i2c_write_data(bus, addr, offset, buf[i], sizeof(uint8_t)); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "dfd_ko_i2c_write[bus=%d addr=0x%x offset=0x%x]fail, rv=%d\n", + bus, addr, offset, rv); + return rv; + } + offset++; + } + + return size; + +} + +int32_t dfd_ko_read_file(char *fpath, int32_t addr, uint8_t *val, int32_t read_bytes) +{ + int32_t ret; + struct file *filp; + loff_t pos; + + if ((fpath == NULL) || (val == NULL) || (addr < 0) || (read_bytes < 0)) { + DBG_DEBUG(DBG_ERROR, "input arguments error, addr=%d read_bytes=%d\n", addr, read_bytes); + return -DFD_RV_INDEX_INVALID; + } + + filp = filp_open(fpath, O_RDONLY, 0); + if (IS_ERR(filp)){ + DBG_DEBUG(DBG_ERROR, "open file[%s] fail\n", fpath); + return -DFD_RV_DEV_FAIL; + } + + pos = addr; + ret = kernel_read(filp, val, read_bytes, &pos); + if (ret < 0) { + DBG_DEBUG(DBG_ERROR, "kernel_read failed, path=%s, addr=%d, size=%d, ret=%d\n", fpath, addr, read_bytes, ret); + ret = -DFD_RV_DEV_FAIL; + } + + filp_close(filp, NULL); + return ret; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c new file mode 100644 index 0000000000..8d77759ba7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_file.c @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../include/dfd_cfg_file.h" +#include "../include/dfd_module.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +struct getdents_callback { + struct dir_context ctx; + const char *obj_name; + char *match_name; + int dir_len; + int found; +}; + +int kfile_open(char *fname, kfile_ctrl_t *kfile_ctrl) +{ + int ret; + struct file *filp; + loff_t pos; + + if ((fname == NULL) || (kfile_ctrl == NULL)) { + return KFILE_RV_INPUT_ERR; + } + + filp = filp_open(fname, O_RDONLY, 0); + if (IS_ERR(filp)){ + return KFILE_RV_OPEN_FAIL; + } + + kfile_ctrl->size = filp->f_inode->i_size; + + kfile_ctrl->buf = kmalloc(kfile_ctrl->size, GFP_KERNEL); + if (kfile_ctrl->buf == NULL) { + ret = KFILE_RV_MALLOC_FAIL; + goto close_fp; + } + mem_clear(kfile_ctrl->buf, kfile_ctrl->size); + + pos = 0; + ret = kernel_read(filp, kfile_ctrl->buf, kfile_ctrl->size, &pos); + if (ret < 0) { + ret = KFILE_RV_RD_FAIL; + goto free_buf; + } + + kfile_ctrl->pos = 0; + + ret = KFILE_RV_OK; + goto close_fp; + +free_buf: + kfree(kfile_ctrl->buf); + kfile_ctrl->buf = NULL; + +close_fp: + filp_close(filp, NULL); + return ret; +} + +void kfile_close(kfile_ctrl_t *kfile_ctrl) +{ + if (kfile_ctrl == NULL) { + return; + } + + kfile_ctrl->size = 0; + kfile_ctrl->pos = 0; + if (kfile_ctrl->buf) { + kfree(kfile_ctrl->buf); + kfile_ctrl->buf = NULL; + } +} + +int kfile_gets(char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl) +{ + int i; + int has_cr = 0; + + if ((buf == NULL) || (buf_size <= 0) || (kfile_ctrl == NULL) || (kfile_ctrl->buf == NULL) + || (kfile_ctrl->size <= 0)) { + return KFILE_RV_INPUT_ERR; + } + + mem_clear(buf, buf_size); + for (i = 0; i < buf_size; i++) { + + if (kfile_ctrl->pos >= kfile_ctrl->size) { + break; + } + + if (has_cr) { + break; + } + + if (IS_CR(kfile_ctrl->buf[kfile_ctrl->pos])) { + has_cr = 1; + } + + buf[i] = kfile_ctrl->buf[kfile_ctrl->pos]; + kfile_ctrl->pos++; + } + + return i; +} + +int kfile_read(int32_t addr, char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl) +{ + int i; + + if ((buf == NULL) || (buf_size <= 0) || (kfile_ctrl == NULL) || (kfile_ctrl->buf == NULL) + || (kfile_ctrl->size <= 0)) { + return KFILE_RV_INPUT_ERR; + } + + if ((addr < 0) || (addr >= kfile_ctrl->size)) { + return KFILE_RV_ADDR_ERR; + } + + mem_clear(buf, buf_size); + + kfile_ctrl->pos = addr; + for (i = 0; i < buf_size; i++) { + + if (kfile_ctrl->pos >= kfile_ctrl->size) { + break; + } + + buf[i] = kfile_ctrl->buf[kfile_ctrl->pos]; + kfile_ctrl->pos++; + } + + return i; +} + +static int kfile_filldir_one(struct dir_context *ctx, const char * name, int len, + loff_t pos, u64 ino, unsigned int d_type) +{ + struct getdents_callback *buf ; + int result; + buf = container_of(ctx, struct getdents_callback, ctx); + result = 0; + if (strncmp(buf->obj_name, name, strlen(buf->obj_name)) == 0) { + if (buf->dir_len < len) { + DBG_DEBUG(DBG_ERROR, "match ok. dir name:%s, but buf_len %d small than dir len %d.\n", + name, buf->dir_len, len); + buf->found = 0; + return -1; + } + mem_clear(buf->match_name, buf->dir_len); + memcpy(buf->match_name, name, len); + buf->found = 1; + result = -1; + } + return result; +} + +int kfile_iterate_dir(const char *dir_path, const char *obj_name, char *match_name, int len) +{ + int ret; + struct file *dir; + struct getdents_callback buffer = { + .ctx.actor = kfile_filldir_one, + }; + + if(!dir_path || !obj_name || !match_name) { + DBG_DEBUG(DBG_ERROR, "params error. \n"); + return KFILE_RV_INPUT_ERR; + } + buffer.obj_name = obj_name; + buffer.match_name = match_name; + buffer.dir_len = len; + buffer.found = 0; + + dir = filp_open(dir_path, O_RDONLY, 0); + if (IS_ERR(dir)) { + DBG_DEBUG(DBG_ERROR, "filp_open error, dir path:%s\n", dir_path); + return KFILE_RV_OPEN_FAIL; + } + ret = iterate_dir(dir, &buffer.ctx); + if (buffer.found) { + DBG_DEBUG(DBG_VERBOSE, "match ok, dir name:%s\n", match_name); + filp_close(dir, NULL); + return DFD_RV_OK; + } + filp_close(dir, NULL); + return -DFD_RV_NODE_FAIL; +} + +#if 0 + +int kfile_write(char *fpath, int32_t addr, char *buf, int buf_size) +{ + int ret = KFILE_RV_OK; + struct file *filp; + mm_segment_t old_fs; + int wlen; + + if ((fpath == NULL) || (buf == NULL) || (buf_size <= 0)) { + return KFILE_RV_INPUT_ERR; + } + + if (addr < 0) { + return KFILE_RV_ADDR_ERR; + } + + filp = filp_open(fpath, O_RDWR, 0); + if (IS_ERR(filp)){ + return KFILE_RV_OPEN_FAIL; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + filp->f_op->llseek(filp,0,0); + filp->f_pos = addr; + + wlen = filp->f_op->write(filp, buf, buf_size, &(filp->f_pos)); + if (wlen < 0) { + ret = KFILE_RV_WR_FAIL; + } + + filp->f_op->llseek(filp,0,0); + set_fs(old_fs); + filp_close(filp, NULL); + + return ret; +} +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c new file mode 100644 index 0000000000..5dae1539a1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_info.c @@ -0,0 +1,587 @@ +#include +#include +#include + +#include "../include/dfd_module.h" +#include "../include/dfd_cfg_adapter.h" +#include "../include/dfd_cfg.h" +#include "../include/dfd_cfg_info.h" +#include "../include/dfd_cfg_file.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +#define DFD_HWMON_NAME "hwmon" +#define DFD_GET_CPLD_VOLATGE_CODE_VALUE(value) ((value >> 4)& 0xfff) +#define DFD_GET_CPLD_VOLATGE_REAL_VALUE(code_val, k) ((code_val * 16 * 33 * k) / ((65536 - 5000) * 10)) + +char *g_info_ctrl_mem_str[INFO_CTRL_MEM_END] = { + ".mode", + ".int_cons", + ".src", + ".frmt", + ".pola", + ".fpath", + ".addr", + ".len", + ".bit_offset", + ".str_cons", + ".int_extra1", + ".int_extra2", +}; + +char *g_info_ctrl_mode_str[INFO_CTRL_MODE_END] = { + "none", + "config", + "constant", + "tlv", + "str_constant", +}; + +char *g_info_src_str[INFO_SRC_END] = { + "none", + "cpld", + "fpga", + "other_i2c", + "file", +}; + +char *g_info_frmt_str[INFO_FRMT_END] = { + "none", + "bit", + "byte", + "num_bytes", + "num_str", + "num_buf", + "buf", +}; + +char *g_info_pola_str[INFO_POLA_END] = { + "none", + "positive", + "negative", +}; + +static int dfd_read_info_from_cpld(int32_t addr, int read_bytes, uint8_t *val) +{ + int i, rv; + + for (i = 0; i < read_bytes; i++) { + rv = dfd_ko_cpld_read(addr, &(val[i])); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "read info[addr=0x%x read_bytes=%d] from cpld fail, reading_byte=%d rv=%d\n", + addr, read_bytes, i, rv); + return rv; + } + addr++; + } + + return read_bytes; +} + +static int dfd_write_info_to_cpld(int32_t addr, int write_bytes, uint8_t *val, uint8_t bit_mask) +{ + int rv; + uint8_t val_tmp; + + if (bit_mask != 0xff) { + rv = dfd_ko_cpld_read(addr, &val_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "read original info[addr=0x%x] from cpld fail, rv=%d\n", addr, rv); + return -1; + } + + val_tmp = (val_tmp & (~bit_mask)) | (val[0] & bit_mask); + } else { + val_tmp = val[0]; + } + + rv = dfd_ko_cpld_write(addr, val_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "write info[addr=0x%x val=0x%x] to cpld fail, rv=%d\n", addr, val_tmp, rv); + return -1; + } + + return 0; +} + +static int dfd_read_info(info_src_t src, char *fpath, int32_t addr, int read_bytes, uint8_t *val) +{ + int rv = 0; + + switch (src) { + case INFO_SRC_CPLD: + rv = dfd_read_info_from_cpld(addr, read_bytes, val); + break; + case INFO_SRC_FPGA: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support read info from fpga\n"); + break; + case INFO_SRC_OTHER_I2C: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support read info from other i2c\n"); + break; + case INFO_SRC_FILE: + rv = dfd_ko_read_file(fpath, addr, val, read_bytes); + break; + default: + rv = -1; + DBG_DEBUG(DBG_ERROR, "info src[%d] error\n", src); + break; + } + + return rv; +} + +static int dfd_write_info(info_src_t src, char *fpath, int32_t addr, int write_bytes, uint8_t *val, uint8_t bit_mask) +{ + int rv = 0; + + switch (src) { + case INFO_SRC_CPLD: + rv = dfd_write_info_to_cpld(addr, write_bytes, val, bit_mask); + break; + case INFO_SRC_FPGA: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support write info to fpga\n"); + break; + case INFO_SRC_OTHER_I2C: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support write info to other i2c\n"); + break; + case INFO_SRC_FILE: + rv = -1; + DBG_DEBUG(DBG_ERROR, "not support write info to file\n"); + break; + default: + rv = -1; + DBG_DEBUG(DBG_ERROR, "info src[%d] error\n", src); + break; + } + + return rv; +} + +int dfd_info_get_int(int key, int *ret, info_num_buf_to_value_f pfun) +{ + int i, rv; + int read_bytes, readed_bytes, int_tmp; + uint8_t byte_tmp, val[INFO_INT_MAX_LEN + 1] = {0}; + info_ctrl_t *info_ctrl; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key)) || (ret == NULL)) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key=0x%08x\n", key); + return -DFD_RV_INDEX_INVALID; + } + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if (info_ctrl->mode == INFO_CTRL_MODE_CONS) { + *ret = info_ctrl->int_cons; + return DFD_RV_OK; + } else if (info_ctrl->mode == INFO_CTRL_MODE_TLV) { + return INFO_CTRL_MODE_TLV; + } + + if (IS_INFO_FRMT_BIT(info_ctrl->frmt)) { + + if (!INFO_BIT_OFFSET_VALID(info_ctrl->bit_offset)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] bit_offsest[%d] invalid\n", + key, info_ctrl->bit_offset); + return -DFD_RV_TYPE_ERR; + } + + read_bytes = 1; + } else if (IS_INFO_FRMT_BYTE(info_ctrl->frmt) || IS_INFO_FRMT_NUM_STR(info_ctrl->frmt) + || IS_INFO_FRMT_NUM_BUF(info_ctrl->frmt)) { + + if (!INFO_INT_LEN_VALAID(info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] len[%d] invalid\n", key, info_ctrl->len); + return -DFD_RV_TYPE_ERR; + } + read_bytes = info_ctrl->len; + } else { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] info format[%d] error\n", key, info_ctrl->frmt); + return -DFD_RV_TYPE_ERR; + } + + readed_bytes = dfd_read_info(info_ctrl->src, info_ctrl->fpath, info_ctrl->addr, read_bytes, &(val[0])); + if (readed_bytes <= 0) { + DBG_DEBUG(DBG_ERROR, "read int info[key=0x%08x src=%s frmt=%s fpath=%s addr=0x%x read_bytes=%d] fail, rv=%d\n", + key, g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], info_ctrl->fpath, + info_ctrl->addr, read_bytes, readed_bytes); + return -DFD_RV_DEV_FAIL; + } + + if (IS_INFO_FRMT_BIT(info_ctrl->frmt)) { + + if (info_ctrl->pola == INFO_POLA_NEGA) { + val[0] = ~val[0]; + } + + byte_tmp = (val[0] >> info_ctrl->bit_offset) & (~(0xff << info_ctrl->len)); + + if (pfun) { + rv = pfun(&byte_tmp, sizeof(byte_tmp), &int_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] bit process fail, rv=%d\n", key, rv); + return rv; + } + } else { + int_tmp = (int)byte_tmp; + } + } else if (IS_INFO_FRMT_BYTE(info_ctrl->frmt)) { + + int_tmp = 0; + for (i = 0; i < info_ctrl->len; i++) { + if (info_ctrl->pola == INFO_POLA_NEGA) { + int_tmp |= val[info_ctrl->len - i - 1]; + } else { + int_tmp |= val[i]; + } + + if (i != (info_ctrl->len - 1)) { + int_tmp <<= 8; + } + } + } else if (IS_INFO_FRMT_NUM_STR(info_ctrl->frmt)) { + + val[readed_bytes] = '\0'; + int_tmp = simple_strtol((char *)(&(val[0])), NULL, 10); + } else { + if (pfun == NULL) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] number buf process function is null\n", key); + return -DFD_RV_INDEX_INVALID; + } + + rv = pfun(val, readed_bytes, &int_tmp); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] number buf process fail, rv=%d\n", key, rv); + return rv; + } + } + + *ret = int_tmp; + DBG_DEBUG(DBG_VERBOSE, "read int info[key=0x%08x src=%s frmt=%s pola=%s fpath=%s addr=0x%x len=%d bit_offset=%d] success, ret=%d\n", + key, g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], g_info_pola_str[info_ctrl->pola], + info_ctrl->fpath, info_ctrl->addr, info_ctrl->len, info_ctrl->bit_offset, *ret); + return DFD_RV_OK; +} + +int dfd_info_get_buf(int key, uint8_t *buf, int buf_len, info_buf_to_buf_f pfun) +{ + int rv; + int read_bytes, buf_real_len; + uint8_t buf_tmp[INFO_BUF_MAX_LEN]; + info_ctrl_t *info_ctrl; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key)) || (buf == NULL)) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key=0x%08x\n", key); + return -DFD_RV_INDEX_INVALID; + } + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if (info_ctrl->mode != INFO_CTRL_MODE_CFG) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] mode[%d] invalid\n", key, info_ctrl->mode); + return -DFD_RV_TYPE_ERR; + } + + if (!IS_INFO_FRMT_BUF(info_ctrl->frmt) || !INFO_BUF_LEN_VALAID(info_ctrl->len) + || (buf_len <= info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] format=%d or len=%d invlaid, buf_len=%d\n", + key, info_ctrl->frmt, info_ctrl->len, buf_len); + return -DFD_RV_TYPE_ERR; + } + + read_bytes = dfd_read_info(info_ctrl->src, info_ctrl->fpath, info_ctrl->addr, info_ctrl->len, buf_tmp); + if (read_bytes <= 0) { + DBG_DEBUG(DBG_ERROR, "read buf info[key=0x%08x src=%s frmt=%s fpath=%s addr=0x%x len=%d] fail, rv=%d\n", + key, g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], info_ctrl->fpath, + info_ctrl->addr, info_ctrl->len, read_bytes); + return -DFD_RV_DEV_FAIL; + } + + if (pfun) { + buf_real_len = buf_len; + rv = pfun(buf_tmp, read_bytes, buf, &buf_real_len); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] buf process fail, rv=%d\n", key, rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + } else { + buf_real_len = read_bytes; + memcpy(buf, buf_tmp, read_bytes); + } + + return buf_real_len; +} + +static int dfd_2key_info_get_buf(info_ctrl_t *info_ctrl, uint8_t *buf, int buf_len, info_hwmon_buf_f pfun) +{ + int rv; + int read_bytes, buf_real_len; + uint8_t buf_tmp[INFO_BUF_MAX_LEN]; + char temp_fpath[INFO_FPATH_MAX_LEN]; + + if (!IS_INFO_FRMT_BUF(info_ctrl->frmt) || !INFO_BUF_LEN_VALAID(info_ctrl->len) + || (buf_len <= info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "key_path info ctrl format=%d or len=%d invlaid, buf_len=%d\n", + info_ctrl->frmt, info_ctrl->len, buf_len); + return -DFD_RV_TYPE_ERR; + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + rv = kfile_iterate_dir(info_ctrl->fpath, DFD_HWMON_NAME, buf_tmp, INFO_BUF_MAX_LEN); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "dir patch:%s ,can find name %s dir \n", + info_ctrl->fpath, DFD_HWMON_NAME); + return -DFD_RV_NO_NODE; + } + mem_clear(temp_fpath, sizeof(temp_fpath)); + snprintf(temp_fpath, sizeof(temp_fpath), "%s%s/%s", + info_ctrl->fpath, buf_tmp, info_ctrl->str_cons); + DBG_DEBUG(DBG_VERBOSE, "match ok path = %s \n", temp_fpath); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + + read_bytes = dfd_read_info(info_ctrl->src, temp_fpath, info_ctrl->addr, info_ctrl->len, buf_tmp); + if (read_bytes <= 0) { + DBG_DEBUG(DBG_ERROR, "read buf info[src=%s frmt=%s fpath=%s addr=0x%x len=%d] fail, rv=%d\n", + g_info_src_str[info_ctrl->src], g_info_src_str[info_ctrl->frmt], temp_fpath, + info_ctrl->addr, info_ctrl->len, read_bytes); + return -DFD_RV_DEV_FAIL; + } + + if (pfun) { + buf_real_len = buf_len; + rv = pfun(buf_tmp, read_bytes, buf, &buf_real_len, info_ctrl); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "info ctrl buf process fail, rv=%d\n", rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + } else { + buf_real_len = read_bytes; + memcpy(buf, buf_tmp, buf_real_len); + } + return buf_real_len; +} + +int dfd_info_set_int(int key, int val) +{ + int rv; + int write_bytes; + uint8_t byte_tmp, bit_mask; + info_ctrl_t *info_ctrl; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key))) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key=0x%08x\n", key); + return -DFD_RV_INDEX_INVALID; + } + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if (info_ctrl->mode != INFO_CTRL_MODE_CFG) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] mode[%d] warnning\n", key, info_ctrl->mode); + return -DFD_RV_TYPE_ERR; + } + + if (IS_INFO_FRMT_BIT(info_ctrl->frmt)) { + + if (!INFO_BIT_OFFSET_VALID(info_ctrl->bit_offset)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] bit_offsest[%d] invalid\n", + key, info_ctrl->bit_offset); + return -DFD_RV_TYPE_ERR; + } + + write_bytes = 1; + + byte_tmp = (uint8_t)(val & 0xff); + byte_tmp <<= info_ctrl->bit_offset; + if (info_ctrl->pola == INFO_POLA_NEGA) { + byte_tmp = ~byte_tmp; + } + + bit_mask = (~(0xff << info_ctrl->len)) << info_ctrl->bit_offset; + } else if (IS_INFO_FRMT_BYTE(info_ctrl->frmt)) { + + if (!INFO_INT_LEN_VALAID(info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] len[%d] invalid\n", key, info_ctrl->len); + return -DFD_RV_TYPE_ERR; + } + + write_bytes = 1; + + byte_tmp = (uint8_t)(val & 0xff); + + bit_mask = 0xff; + } else if (IS_INFO_FRMT_NUM_STR(info_ctrl->frmt)) { + + DBG_DEBUG(DBG_ERROR, "not support str int set\n"); + return -1; + } else if (IS_INFO_FRMT_NUM_BUF(info_ctrl->frmt)) { + + if (!INFO_INT_LEN_VALAID(info_ctrl->len)) { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] len[%d] invalid\n", key, info_ctrl->len); + return -DFD_RV_TYPE_ERR; + } + + write_bytes = 1; + + byte_tmp = (uint8_t)(val & 0xff); + + bit_mask = 0xff; + } else { + DBG_DEBUG(DBG_ERROR, "info ctrl[key=0x%08x] format[%d] error\n", key, info_ctrl->frmt); + return -DFD_RV_TYPE_ERR; + } + + rv = dfd_write_info(info_ctrl->src, info_ctrl->fpath, info_ctrl->addr, write_bytes, + &byte_tmp, bit_mask); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "write int info[src=%s frmt=%s fpath=%s addr=0x%x len=%d val=%d] fail, rv=%d\n", + g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], info_ctrl->fpath, + info_ctrl->addr, info_ctrl->len, val, rv); + return -DFD_RV_DEV_FAIL; + } + + DBG_DEBUG(DBG_VERBOSE, "write int info[src=%s frmt=%s pola=%s fpath=%s addr=0x%x len=%d bit_offset=%d val=%d] success\n", + g_info_src_str[info_ctrl->src], g_info_frmt_str[info_ctrl->frmt], g_info_pola_str[info_ctrl->pola], + info_ctrl->fpath, info_ctrl->addr, info_ctrl->len, info_ctrl->bit_offset, val); + return DFD_RV_OK; +} + +static int dfd_info_get_cpld_voltage(int key, int *value) +{ + int rv, addr_tmp; + int vol_ref_tmp, vol_ref; + int vol_curr_tmp, vol_curr; + info_ctrl_t *info_ctrl; + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_WARN, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + rv = dfd_info_get_int(key, &vol_curr_tmp, NULL); + if(rv < 0) { + DBG_DEBUG(DBG_ERROR, "get cpld current voltage error, addr:0x%x, rv =%d\n", info_ctrl->addr, rv); + return rv; + } + vol_curr_tmp = DFD_GET_CPLD_VOLATGE_CODE_VALUE(vol_curr_tmp); + if(info_ctrl->addr == info_ctrl->int_extra1) { + + vol_curr = DFD_GET_CPLD_VOLATGE_REAL_VALUE(vol_curr_tmp, info_ctrl->int_extra2); + } else { + + addr_tmp = info_ctrl->addr; + info_ctrl->addr = info_ctrl->int_extra1; + rv = dfd_info_get_int(key, &vol_ref_tmp, NULL); + info_ctrl->addr = addr_tmp; + if(rv < 0) { + DBG_DEBUG(DBG_ERROR, "get cpld reference voltage error, addr:0x%x rv:%d\n", info_ctrl->addr, rv); + return rv; + } + vol_ref = DFD_GET_CPLD_VOLATGE_CODE_VALUE(vol_ref_tmp); + vol_curr = (vol_curr_tmp * info_ctrl->int_extra2) / vol_ref; + } + *value = vol_curr; + return DFD_RV_OK; +} + +static int dfd_info_get_sensor_value(int key, uint8_t *buf, int buf_len, info_hwmon_buf_f pfun) +{ + int rv, buf_real_len; + int value; + uint8_t buf_tmp[INFO_BUF_MAX_LEN]; + info_ctrl_t *info_ctrl; + + info_ctrl = dfd_ko_cfg_get_item(key); + if (info_ctrl == NULL) { + DBG_DEBUG(DBG_ERROR, "get info ctrl fail, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + + if ( DFD_CFG_ITEM_ID(key) == DFD_CFG_ITEM_HWMON_IN && info_ctrl->src == INFO_SRC_CPLD) { + + rv = dfd_info_get_cpld_voltage(key, &value); + if(rv < 0) { + DBG_DEBUG(DBG_ERROR, "get cpld voltage failed.key=0x%08x, rv:%d\n", key, rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + DBG_DEBUG(DBG_VERBOSE, "get cpld voltage ok, value:%d\n", value); + mem_clear(buf_tmp, sizeof(buf_tmp)); + snprintf(buf_tmp, sizeof(buf_tmp), "%d\n", value); + buf_real_len = strlen(buf_tmp); + if(buf_len <= buf_real_len) { + DBG_DEBUG(DBG_ERROR, "length not enough.buf_len:%d,need length:%d\n", buf_len, buf_real_len); + return -DFD_RV_DEV_FAIL; + } + if (pfun) { + buf_real_len = buf_len; + rv = pfun(buf_tmp, strlen(buf_tmp), buf, &buf_real_len, info_ctrl); + if (rv < 0) { + DBG_DEBUG(DBG_ERROR, "deal date error.org value:%s, buf_len:%d, rv=%d\n", + buf_tmp, buf_len, rv); + return -DFD_RV_DEV_NOTSUPPORT; + } + } else { + memcpy(buf, buf_tmp, buf_real_len); + } + return buf_real_len; + } + + DBG_DEBUG(DBG_ERROR, "not support mode. key:0x%08x\n", key); + return -DFD_RV_MODE_NOTSUPPORT; +} + +int dfd_info_get_sensor(uint32_t key, char *buf, int buf_len, info_hwmon_buf_f pfun) +{ + info_ctrl_t *key_info_ctrl; + int rv; + + if (!DFD_CFG_ITEM_IS_INFO_CTRL(DFD_CFG_ITEM_ID(key)) || + (buf == NULL) || buf_len <= 0) { + DBG_DEBUG(DBG_ERROR, "input arguments error, key_path=0x%08x, buf_len:%d.\n", + key, buf_len); + return -DFD_RV_INVALID_VALUE; + } + + key_info_ctrl = dfd_ko_cfg_get_item(key); + if (key_info_ctrl == NULL) { + DBG_DEBUG(DBG_ERROR, "key_path info error, key=0x%08x\n", key); + return -DFD_RV_DEV_NOTSUPPORT; + } + mem_clear(buf, buf_len); + + if (key_info_ctrl->mode == INFO_CTRL_MODE_SRT_CONS) { + snprintf(buf, buf_len, "%s\n", key_info_ctrl->str_cons); + DBG_DEBUG(DBG_VERBOSE, "get sensor value through string config, key=0x%08x, value:%s\n", key, buf); + return strlen(buf); + } + + if (key_info_ctrl->mode == INFO_CTRL_MODE_CFG && key_info_ctrl->src == INFO_SRC_FILE) { + DBG_DEBUG(DBG_VERBOSE, "get sensor value through hwmon, key:0x%08x\n", key); + rv = dfd_2key_info_get_buf(key_info_ctrl, buf, buf_len, pfun); + if (rv < 0) { + DBG_DEBUG(DBG_VERBOSE, "get sensor value through hwmon failed, key:0x%08x, rv:%d\n", key, rv); + } + return rv; + } + rv = dfd_info_get_sensor_value(key, buf, buf_len, pfun); + if( rv < 0) { + DBG_DEBUG(DBG_ERROR, "get sensor value failed, key=0x%08x, rv:%d.\n", key, rv); + } + return rv; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c new file mode 100644 index 0000000000..d6fd7e104c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/cfg/dfd_cfg_listnode.c @@ -0,0 +1,82 @@ +#include +#include + +#include "../include/dfd_cfg_listnode.h" +#include "../../dev_sysfs/include/sysfs_common.h" + +void *lnode_find_node(lnode_root_t *root, int key) +{ + lnode_node_t *lnode; + + if (root == NULL){ + return NULL; + } + + list_for_each_entry(lnode, &(root->root), lst) { + if (lnode->key == key) { + return lnode->data; + } + } + + return NULL; +} + +int lnode_insert_node(lnode_root_t *root, int key, void *data) +{ + lnode_node_t *lnode; + void *data_tmp; + + if ((root == NULL) || (data == NULL)) { + return LNODE_RV_INPUT_ERR; + } + + data_tmp = lnode_find_node(root, key); + if (data_tmp != NULL) { + return LNODE_RV_NODE_EXIST; + } + + lnode = kmalloc(sizeof(lnode_node_t), GFP_KERNEL); + if (lnode == NULL) { + return LNODE_RV_NOMEM; + } + + lnode->key = key; + lnode->data = data; + list_add_tail(&(lnode->lst), &(root->root)); + + return LNODE_RV_OK; +} + +int lnode_init_root(lnode_root_t *root) +{ + if (root == NULL) { + return LNODE_RV_INPUT_ERR; + } + + INIT_LIST_HEAD(&(root->root)); + + return LNODE_RV_OK; +} + +void lnode_free_list(lnode_root_t *root) +{ + lnode_node_t *lnode, *lnode_next; + + if (root == NULL){ + return ; + } + + list_for_each_entry_safe(lnode, lnode_next, &(root->root), lst) { + if ( lnode->data ) { + kfree(lnode->data); + lnode->data = NULL; + lnode->key = 0; + } + list_del(&lnode->lst); + kfree(lnode); + lnode = NULL; + } + + return ; + +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c new file mode 100644 index 0000000000..efc322046c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_fan_driver.c @@ -0,0 +1,170 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define FAN_SIZE (256) + +int g_dfd_fan_dbg_level = 0; +module_param(g_dfd_fan_dbg_level, int, S_IRUGO | S_IWUSR); + +int dfd_get_fan_roll_status(unsigned int fan_index, unsigned int motor_index) +{ + int key, ret; + int status; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_ROLL_STATUS, fan_index, motor_index); + ret = dfd_info_get_int(key, &status, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "get fan roll status error, fan:%d,motor:%d\n", + fan_index, motor_index); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan%u motor%u get fan roll status success, status:%d.\n", + fan_index, motor_index, status); + return status; +} + +int dfd_get_fan_present_status(unsigned int fan_index) +{ + int key, ret; + int status; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_DEV_PRESENT_STATUS, WB_MAIN_DEV_FAN, fan_index); + ret = dfd_info_get_int(key, &status, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan%u get present status error, key:0x%x\n", fan_index, key); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan%u get present status success, status:%d.\n", fan_index, status); + return status; +} + +ssize_t dfd_get_fan_speed(unsigned int fan_index, unsigned int motor_index,unsigned int *speed) +{ + int key, ret, speed_tmp; + + if (speed == NULL) { + DFD_FAN_DEBUG(DBG_ERROR, "param error. fan index:%d, motor index:%d.\n", + fan_index, motor_index); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_SPEED, fan_index, motor_index); + ret = dfd_info_get_int(key, &speed_tmp, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "get fan speed error, key:0x%x,ret:%d\n",key, ret); + return ret; + } + + if (speed_tmp == 0 || speed_tmp == 0xffff) { + *speed = 0; + } else { + *speed = 15000000 / speed_tmp; + } + return DFD_RV_OK; +} + +int dfd_set_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int level) +{ + int key, ret; + + if (level < 0 || level > 0xff) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, can not set fan speed level: %d.\n", + fan_index, motor_index, level); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_RATIO, fan_index, motor_index); + ret = dfd_info_set_int(key, level); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, set fan level 0x%02x error, key:0x%x,ret:%d\n", + fan_index, motor_index, level, key, ret); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, set fan speed level 0x%02x success.\n", + fan_index, motor_index, level); + return DFD_RV_OK; +} + +int dfd_set_fan_pwm(unsigned int fan_index, unsigned int motor_index, int pwm) +{ + int ret, data; + + if (pwm < 0 || pwm > 100) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, can't set pwm: %d.\n", + fan_index, motor_index, pwm); + return -DFD_RV_INVALID_VALUE; + } + + data = pwm * 255 / 100; + ret = dfd_set_fan_speed_level(fan_index, motor_index, data); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, set fan ratio:%d error, ret:%d\n", + fan_index, motor_index, data, ret); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, set fan ratio %d success.\n", + fan_index, motor_index, data); + return DFD_RV_OK; +} + +int dfd_get_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int *level) +{ + int key, ret, speed_level; + + if (level == NULL) { + DFD_FAN_DEBUG(DBG_ERROR, "param error. fan index:%d, motor index:%d.\n", + fan_index, motor_index); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_FAN_RATIO, fan_index, motor_index); + ret = dfd_info_get_int(key, &speed_level, NULL); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, get fan speed level error, key:0x%x,ret:%d\n", + fan_index, motor_index, key, ret); + return ret; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, get fan speed level success, value:0x%02x.\n", + fan_index, motor_index, speed_level); + *level = speed_level; + return DFD_RV_OK; +} + +int dfd_get_fan_pwm(unsigned int fan_index, unsigned int motor_index, int *pwm) +{ + int ret, level; + + if (pwm == NULL) { + DFD_FAN_DEBUG(DBG_ERROR, "param error. fan index:%d, motor index:%d.\n", + fan_index, motor_index); + return -DFD_RV_INVALID_VALUE; + } + + ret = dfd_get_fan_speed_level(fan_index, motor_index, &level); + if (ret < 0) { + DFD_FAN_DEBUG(DBG_ERROR, "fan:%u, motor:%u, get fan pwm error, ret:%d\n", + fan_index, motor_index, ret); + return ret; + } + + if ((level * 100) % 255 > 0) { + *pwm = level * 100 / 255 + 1; + } else { + *pwm = level * 100 / 255; + } + + DFD_FAN_DEBUG(DBG_VERBOSE, "fan:%u, motor:%u, get fan pwm success, value:%d.\n", + fan_index, motor_index, *pwm); + return DFD_RV_OK; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c new file mode 100644 index 0000000000..9e5b00b795 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_module.c @@ -0,0 +1,95 @@ +#include + +#include "../dev_sysfs/include/sysfs_common.h" +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_fan_driver.h" +#include "./include/dfd_slot_driver.h" +#include "./include/dfd_sensors_driver.h" +#include "./include/dfd_psu_driver.h" +#include "./include/dfd_sff_driver.h" + +typedef enum dfd_dev_init_fail_s { + DFD_KO_INIT_CPLD_FAIL = 1, + DFD_KO_INIT_FPGA_FAIL = 2, + DFD_KO_INIT_IRQ_FAIL = 3, + DFD_KO_INIT_CFG_FAIL = 4, + DFD_KO_INIT_DATA_FAIL = 5, +} dfd_dev_init_fail_t; + +int g_dfd_dbg_level = 0; + +int dfd_get_dev_number(unsigned int main_dev_id, unsigned int minor_dev_id) +{ + int key,dev_num; + int *p_dev_num; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_DEV_NUM, main_dev_id, minor_dev_id); + p_dev_num = dfd_ko_cfg_get_item(key); + if (p_dev_num == NULL) { + DBG_DEBUG(DBG_ERROR, "get device number failed, key:0x%x\n",key); + return -DFD_RV_DEV_NOTSUPPORT; + } + dev_num = *p_dev_num; + DBG_DEBUG(DBG_VERBOSE, "get device number ok, number:%d\n",dev_num); + return dev_num; +} + +static struct switch_drivers_t switch_drivers= { + .get_dev_number = dfd_get_dev_number, + /* fan */ + .get_fan_speed = dfd_get_fan_speed, + .get_fan_pwm = dfd_get_fan_pwm, + .set_fan_pwm = dfd_set_fan_pwm, + .get_fan_present_status = dfd_get_fan_present_status, + .get_fan_roll_status = dfd_get_fan_roll_status, + .get_fan_speed_level = dfd_get_fan_speed_level, + .set_fan_speed_level = dfd_set_fan_speed_level, + /* slot */ + .get_slot_present_status = dfd_get_slot_present_status, + /* sensors */ + .get_temp_info = dfd_get_temp_info, + .get_voltage_info = dfd_get_voltage_info, + /* psu */ + .get_psu_present_status = dfd_get_psu_present_status, + .get_psu_output_status = dfd_get_psu_output_status, + .get_psu_alert_status = dfd_get_psu_alert_status, + /* sff */ + .get_sff_cpld_info = dfd_get_sff_cpld_info, + .get_sff_dir_name = dfd_get_sff_dir_name, +}; + +struct switch_drivers_t * dfd_plat_driver_get(void) { + return &switch_drivers; +} + +static int32_t __init dfd_dev_init(void) +{ + int ret; + + DBG_DEBUG(DBG_VERBOSE, "Enter.\n"); + + ret = dfd_dev_cfg_init(); + if (ret != 0) { + DBG_DEBUG(DBG_ERROR, "dfd_dev_cfg_init failed ret %d.\n", ret); + ret = -DFD_KO_INIT_CFG_FAIL; + return ret; + } + + DBG_DEBUG(DBG_VERBOSE, "success.\n"); + return 0; +} + +static void __exit dfd_dev_exit(void) +{ + DBG_DEBUG(DBG_VERBOSE, "dfd_dev_exit.\n"); + dfd_dev_cfg_exit(); + return ; +} + +module_init(dfd_dev_init); +module_exit(dfd_dev_exit); +module_param(g_dfd_dbg_level, int, S_IRUGO | S_IWUSR); +EXPORT_SYMBOL(dfd_plat_driver_get); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c new file mode 100644 index 0000000000..55e2e4339a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_psu_driver.c @@ -0,0 +1,70 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define PSU_SIZE (256) + +typedef enum dfd_psu_status_e { + DFD_PSU_PRESENT_STATUS = 0, + DFD_PSU_OUTPUT_STATUS = 1, + DFD_PSU_ALERT_STATUS = 2, +} dfd_psu_status_t; + +int g_dfd_psu_dbg_level = 0; +module_param(g_dfd_psu_dbg_level, int, S_IRUGO | S_IWUSR); + +int dfd_get_psu_present_status(unsigned int psu_index) +{ + int ret, present_key, present_status; + + present_key = DFD_CFG_KEY(DFD_CFG_ITEM_PSU_STATUS, psu_index, DFD_PSU_PRESENT_STATUS); + ret = dfd_info_get_int(present_key, &present_status, NULL); + if (ret < 0) { + DFD_PSU_DEBUG(DBG_ERROR, "dfd_get_psu_present_status error. psu_index:%d, ret:%d\n", + psu_index, ret); + return ret; + } + + DFD_PSU_DEBUG(DBG_VERBOSE, "dfd_get_psu_present_status success. psu_index:%d, status:%d\n", + psu_index, present_status); + return present_status; +} + +int dfd_get_psu_output_status(unsigned int psu_index) +{ + int ret, output_key, output_status; + + output_key = DFD_CFG_KEY(DFD_CFG_ITEM_PSU_STATUS, psu_index, DFD_PSU_OUTPUT_STATUS); + ret = dfd_info_get_int(output_key, &output_status, NULL); + if (ret < 0) { + DFD_PSU_DEBUG(DBG_ERROR, "dfd_get_psu_output_status error. psu_index:%d, ret:%d\n", + psu_index, ret); + return ret; + } + + DFD_PSU_DEBUG(DBG_VERBOSE, "dfd_get_psu_output_status success. psu_index:%d, status:%d\n", + psu_index, output_status); + return output_status; +} + +int dfd_get_psu_alert_status(unsigned int psu_index) +{ + int ret, alert_key, alert_status; + + alert_key = DFD_CFG_KEY(DFD_CFG_ITEM_PSU_STATUS, psu_index, DFD_PSU_ALERT_STATUS); + ret = dfd_info_get_int(alert_key, &alert_status, NULL); + if (ret < 0) { + DFD_PSU_DEBUG(DBG_ERROR, "dfd_get_psu_alert_status error. psu_index:%d, ret:%d\n", + psu_index, ret); + return ret; + } + + DFD_PSU_DEBUG(DBG_VERBOSE, "dfd_get_psu_alert_status success. psu_index:%d, status:%d\n", + psu_index, alert_status); + return alert_status; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c new file mode 100644 index 0000000000..bfca20290e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sensors_driver.c @@ -0,0 +1,149 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "./include/dfd_cfg_file.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define DFD_GET_TEMP_SENSOR_KEY1(dev_index, temp_index) \ + (((dev_index & 0xff) << 8) | (temp_index & 0xff)) +#define DFD_GET_TEMP_SENSOR_KEY2(main_dev_id, temp_type) \ + (((main_dev_id & 0x0f) << 4) | (temp_type & 0x0f)) +#define DFD_FORMAT_STR_MAX_LEN (32) + +int g_dfd_sensor_dbg_level = 0; +module_param(g_dfd_sensor_dbg_level, int, S_IRUGO | S_IWUSR); + +static int dfd_deal_hwmon_buf(uint8_t *buf, int buf_len, uint8_t *buf_new, int *buf_len_new, info_ctrl_t *info_ctrl) +{ + int i, tmp_len; + int exp, decimal, divisor; + int org_value, tmp_value; + int div_result, div_mod; + char fmt_str[DFD_FORMAT_STR_MAX_LEN]; + + exp = info_ctrl->int_cons; + decimal = info_ctrl->bit_offset; + + if (exp <= 0) { + DBG_DEBUG(DBG_VERBOSE, "exponent %d, don't need transform. buf_len:%d, buf_len_new:%d\n", + exp, buf_len, *buf_len_new); + snprintf(buf_new, *buf_len_new, "%s", buf); + *buf_len_new = strlen(buf_new); + return DFD_RV_OK; + } + divisor = 1; + for (i = 0; i < exp; i++) { + divisor *= 10; + } + org_value = simple_strtol(buf, NULL, 10); + if (org_value < 0) { + tmp_value = 0 - org_value; + } else { + tmp_value = org_value; + } + div_result = tmp_value / divisor; + div_mod = tmp_value % divisor; + DBG_DEBUG(DBG_VERBOSE, "exp:%d, decimal:%d, original value:%d, divisor:%d, result :%d, mod:%d\n", + exp, decimal, org_value, divisor, div_result, div_mod); + + mem_clear(fmt_str, sizeof(fmt_str)); + if (org_value < 0) { + snprintf(fmt_str, sizeof(fmt_str), "-%%d.%%0%dd\n",exp); + } else { + snprintf(fmt_str, sizeof(fmt_str), "%%d.%%0%dd\n",exp); + } + DBG_DEBUG(DBG_VERBOSE, "format string:%s",fmt_str); + snprintf(buf_new, *buf_len_new, fmt_str, div_result, div_mod); + *buf_len_new = strlen(buf_new); + tmp_len = *buf_len_new; + + if ( decimal > 0) { + for(i = 0; i < *buf_len_new; i++) { + if (buf_new[i] == '.') { + if( i + decimal + 2 <= *buf_len_new ) { + buf_new[i + decimal + 1 ] = '\n'; + buf_new[i + decimal + 2 ] = '\0'; + *buf_len_new = strlen(buf_new); + DBG_DEBUG(DBG_VERBOSE, "deal decimal[%d] ok, str len:%d, value:%s\n", + decimal, *buf_len_new, buf_new); + } + break; + } + } + if (tmp_len == *buf_len_new) { + DBG_DEBUG(DBG_WARN, "deal decimal[%d] failed, use original value:%s\n", decimal, buf_new); + } + } + return DFD_RV_OK; +} + +static int dfd_get_sensor_info(uint8_t main_dev_id, uint8_t dev_index, uint8_t sensor_type, + uint8_t sensor_index, uint8_t sensor_attr, char *buf) +{ + uint32_t key; + uint16_t key_index1; + uint8_t key_index2; + int rv; + info_hwmon_buf_f pfunc; + + key_index1 = DFD_GET_TEMP_SENSOR_KEY1(dev_index, sensor_index); + key_index2 = DFD_GET_TEMP_SENSOR_KEY2(main_dev_id, sensor_attr); + if (sensor_type == WB_MINOR_DEV_TEMP ) { + key = DFD_CFG_KEY(DFD_CFG_ITEM_HWMON_TEMP, key_index1, key_index2); + } else if (sensor_type == WB_MINOR_DEV_IN) { + key = DFD_CFG_KEY(DFD_CFG_ITEM_HWMON_IN, key_index1, key_index2); + } else { + DFD_SENSOR_DEBUG(DBG_ERROR, "unknow sensor type:%d.\n",sensor_type); + return -DFD_RV_INVALID_VALUE; + } + + DFD_SENSOR_DEBUG(DBG_VERBOSE, "get sensor info.main_dev_id:%d, dev_index:0x%x, sensor_index:0x%x, sensor_attr:0x%x, key:0x%x,\n", + main_dev_id, dev_index, sensor_index, sensor_attr, key); + + pfunc = dfd_deal_hwmon_buf; + mem_clear(buf, PAGE_SIZE); + rv = dfd_info_get_sensor(key, buf, PAGE_SIZE, pfunc); + return rv; +} + +ssize_t dfd_get_temp_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t temp_index, uint8_t temp_attr, char *buf) +{ + int rv; + + if (buf == NULL) { + DFD_SENSOR_DEBUG(DBG_ERROR, "param error. buf is NULL.\n"); + return -DFD_RV_INVALID_VALUE; + } + + rv = dfd_get_sensor_info(main_dev_id, dev_index, WB_MINOR_DEV_TEMP, temp_index, temp_attr, buf); + if (rv < 0) { + DFD_SENSOR_DEBUG(DBG_ERROR, "get temp info error. rv:%d\n", rv); + } else { + DFD_SENSOR_DEBUG(DBG_VERBOSE, "get temp info ok.value:%s\n", buf); + } + return rv; +} + +ssize_t dfd_get_voltage_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t in_index, uint8_t in_attr, char *buf) +{ + int rv; + + if (buf == NULL) { + DFD_SENSOR_DEBUG(DBG_ERROR, "param error. buf is NULL.\n"); + return -DFD_RV_INVALID_VALUE; + } + + rv = dfd_get_sensor_info(main_dev_id, dev_index, WB_MINOR_DEV_IN, in_index, in_attr, buf); + if (rv < 0) { + DFD_SENSOR_DEBUG(DBG_ERROR, "get voltage info error. rv:%d\n", rv); + } else { + DFD_SENSOR_DEBUG(DBG_VERBOSE, "get voltage info ok.value:%s\n", buf); + } + return rv; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c new file mode 100644 index 0000000000..5c1faff975 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_sff_driver.c @@ -0,0 +1,56 @@ +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_info.h" +#include "./include/dfd_cfg_adapter.h" +#include "../dev_sysfs/include/sysfs_common.h" + +int g_dfd_sff_dbg_level = 0; +module_param(g_dfd_sff_dbg_level, int, S_IRUGO | S_IWUSR); + +ssize_t dfd_get_sff_cpld_info(unsigned int sff_index, int cpld_reg_type, char *buf, int len) +{ + int key, ret, value; + + if(buf == NULL) { + DFD_SFF_DEBUG(DBG_ERROR, "param error, buf is NULL. sff_index:%d, cpld_reg_type:%d.\n", + sff_index, cpld_reg_type); + return -DFD_RV_INVALID_VALUE; + } + + key = DFD_CFG_KEY(DFD_CFG_ITEM_SFF_CPLD_REG, sff_index, cpld_reg_type); + ret = dfd_info_get_int(key, &value, NULL); + if (ret < 0) { + DFD_SFF_DEBUG(DBG_ERROR, "get sff cpld reg error, key:0x%x,ret:%d.\n", key, ret); + return ret; + } + + mem_clear(buf, len); + return (ssize_t)snprintf(buf, len, "%d\n", value); +} + +ssize_t dfd_get_sff_dir_name(unsigned int sff_index, char *buf, int buf_len) +{ + int key; + char *sff_dir_name; + + if (buf == NULL) { + DFD_SFF_DEBUG(DBG_ERROR, "param error. buf is NULL.sff index:%d", sff_index); + return -DFD_RV_INVALID_VALUE; + } + + mem_clear(buf, buf_len); + + key = DFD_CFG_KEY(DFD_CFG_ITEM_SFF_DIR_NAME, sff_index, 0); + sff_dir_name = dfd_ko_cfg_get_item(key); + if (sff_dir_name == NULL) { + DFD_SFF_DEBUG(DBG_ERROR, "sff dir name config error, key=0x%08x\n", key); + return -DFD_RV_NODE_FAIL; + } + + DFD_SFF_DEBUG(DBG_VERBOSE, "%s\n", sff_dir_name); + snprintf(buf, buf_len, "%s", sff_dir_name); + return strlen(buf); + +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c new file mode 100644 index 0000000000..69c82adabe --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/dfd_slot_driver.c @@ -0,0 +1,27 @@ +#include +#include + +#include "./include/dfd_module.h" +#include "./include/dfd_cfg.h" +#include "./include/dfd_cfg_adapter.h" +#include "./include/dfd_cfg_info.h" +#include "../dev_sysfs/include/sysfs_common.h" + +#define SLOT_SIZE (256) + +int g_dfd_slot_dbg_level = 0; +module_param(g_dfd_slot_dbg_level, int, S_IRUGO | S_IWUSR); + +int dfd_get_slot_present_status(unsigned int slot_index) +{ + int key, ret; + int status; + + key = DFD_CFG_KEY(DFD_CFG_ITEM_DEV_PRESENT_STATUS, WB_MAIN_DEV_SLOT, slot_index); + ret = dfd_info_get_int(key, &status, NULL); + if (ret < 0) { + DFD_SLOT_DEBUG(DBG_ERROR, "get slot status error, key:0x%x\n",key); + return ret; + } + return status; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h new file mode 100644 index 0000000000..062654d015 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg.h @@ -0,0 +1,97 @@ +#ifndef __DFD_CFG_H__ +#define __DFD_CFG_H__ + +#include + +#define DFD_KO_CFG_FILE_NAME "/etc/plat_sysfs_cfg/cfg_file_name" +#define DFD_KO_CFG_FILE_DIR "/etc/plat_sysfs_cfg/" +#define DFD_PUB_CARDTYPE_FILE "/sys/module/platform_common/parameters/dfd_my_type" + +#define DFD_CFG_CMDLINE_MAX_LEN (256) +#define DFD_CFG_NAME_MAX_LEN (256) +#define DFD_CFG_VALUE_MAX_LEN (256) +#define DFD_CFG_STR_MAX_LEN (64) +#define DFD_CFG_CPLD_NUM_MAX (16) +#define DFD_PRODUCT_ID_LENGTH (8) +#define DFD_PID_BUF_LEN (32) +#define DFD_TEMP_NAME_BUF_LEN (32) + +#define DFD_CFG_EMPTY_VALUE (-1) +#define DFD_CFG_INVALID_VALUE (0) + +#define DFD_CFG_KEY(item, index1, index2) \ + ((((item) & 0xff) << 24) | (((index1) & 0xffff) << 8) | ((index2) & 0xff)) +#define DFD_CFG_ITEM_ID(key) (((key) >> 24) & 0xff) +#define DFD_CFG_INDEX1(key) (((key) >> 8) & 0xffff) +#define DFD_CFG_INDEX2(key) ((key)& 0xff) + +#define INDEX_NOT_EXIST (-1) +#define INDEX1_MAX (0xffff) +#define INDEX2_MAX (0xff) + +#define DFD_CFG_ITEM_ALL \ + DFD_CFG_ITEM(DFD_CFG_ITEM_NONE, "none", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_DEV_NUM, "dev_num", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_CPLD_LPC_DEV, "cpld_lpc_dev", INDEX1_MAX, DFD_CFG_CPLD_NUM_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_INT_END, "end_int", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + \ + DFD_CFG_ITEM(DFD_CFG_ITEM_CPLD_MODE, "mode_cpld", INDEX1_MAX, DFD_CFG_CPLD_NUM_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_SFF_DIR_NAME, "sff_dir_name", INDEX1_MAX, INDEX_NOT_EXIST) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_STRING_END, "end_string", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + \ + DFD_CFG_ITEM(DFD_CFG_ITEM_CPLD_I2C_DEV, "cpld_i2c_dev", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_OTHER_I2C_DEV, "other_i2c_dev", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_I2C_DEV_END, "end_i2c_dev", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + \ + DFD_CFG_ITEM(DFD_CFG_ITEM_FAN_ROLL_STATUS, "fan_roll_status", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_FAN_SPEED, "fan_speed", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_FAN_RATIO, "fan_ratio", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_DEV_PRESENT_STATUS, "dev_present_status", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_PSU_STATUS, "psu_status", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_HWMON_TEMP, "hwmon_temp", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_HWMON_IN, "hwmon_in", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_SFF_CPLD_REG, "sff_cpld_reg", INDEX1_MAX, INDEX2_MAX) \ + DFD_CFG_ITEM(DFD_CFG_ITEM_INFO_CTRL_END, "end_info_ctrl", INDEX_NOT_EXIST, INDEX_NOT_EXIST) \ + +#ifdef DFD_CFG_ITEM +#undef DFD_CFG_ITEM +#endif +#define DFD_CFG_ITEM(_id, _name, _index_min, _index_max) _id, +typedef enum dfd_cfg_item_id_s { + DFD_CFG_ITEM_ALL +} dfd_cfg_item_id_t; + +#define DFD_CFG_ITEM_IS_INT(item_id) \ + (((item_id) > DFD_CFG_ITEM_NONE) && ((item_id) < DFD_CFG_ITEM_INT_END)) + +#define DFD_CFG_ITEM_IS_STRING(item_id) \ + (((item_id) > DFD_CFG_ITEM_INT_END) && ((item_id) < DFD_CFG_ITEM_STRING_END)) + +#define DFD_CFG_ITEM_IS_I2C_DEV(item_id) \ + (((item_id) > DFD_CFG_ITEM_STRING_END) && ((item_id) < DFD_CFG_ITEM_I2C_DEV_END)) + +#define DFD_CFG_ITEM_IS_INFO_CTRL(item_id) \ + (((item_id) > DFD_CFG_ITEM_I2C_DEV_END) && ((item_id) < DFD_CFG_ITEM_INFO_CTRL_END)) + +typedef struct index_range_s { + int index1_max; + int index2_max; +} index_range_t; + +typedef struct val_convert_node_s { + struct list_head lst; + int int_val; + char str_val[DFD_CFG_STR_MAX_LEN]; + int index1; + int index2; +} val_convert_node_t; + +void *dfd_ko_cfg_get_item(int key); + +void dfd_ko_cfg_show_item(int key); + +int32_t dfd_dev_cfg_init(void); + +void dfd_dev_cfg_exit(void); + +#endif /* __DFD_CFG_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h new file mode 100644 index 0000000000..70d8b536c4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_adapter.h @@ -0,0 +1,46 @@ +#ifndef __DFD_CFG_ADAPTER_H__ +#define __DFD_CFG_ADAPTER_H__ + +#define DFD_KO_CPLD_I2C_RETRY_SLEEP (10) /* ms */ +#define DFD_KO_CPLD_I2C_RETRY_TIMES (50 / DFD_KO_CPLD_I2C_RETRY_SLEEP) + +#define DFD_KO_CPLD_GET_SLOT(addr) ((addr >> 24) & 0xff) +#define DFD_KO_CPLD_GET_ID(addr) ((addr >> 16) & 0xff) +#define DFD_KO_CPLD_GET_INDEX(addr) (addr & 0xffff) +#define DFD_KO_CPLD_MODE_I2C_STRING "i2c" +#define DFD_KO_CPLD_MODE_LPC_STRING "lpc" + +typedef struct dfd_i2c_dev_s { + int bus; + int addr; +} dfd_i2c_dev_t; + +typedef enum dfd_i2c_dev_mem_s { + DFD_I2C_DEV_MEM_BUS, + DFD_I2C_DEV_MEM_ADDR, + DFD_I2C_DEV_MEM_END +} dfd_i2c_dev_mem_t; + +typedef enum cpld_mode_e { + DFD_CPLD_MODE_I2C, + DFD_CPLD_MODE_LPC, +} cpld_mode_t; + +typedef enum i2c_mode_e { + DFD_I2C_MODE_NORMAL_I2C, + DFD_I2C_MODE_SMBUS, +} i2c_mode_t; + +extern char *g_dfd_i2c_dev_mem_str[DFD_I2C_DEV_MEM_END]; + +int32_t dfd_ko_cpld_read(int32_t addr, uint8_t *buf); + +int32_t dfd_ko_cpld_write(int32_t addr, uint8_t val); + +int32_t dfd_ko_i2c_read(int bus, int addr, int offset, uint8_t *buf, uint32_t size); + +int32_t dfd_ko_i2c_write(int bus, int addr, int offset, uint8_t *buf, uint32_t size); + +int32_t dfd_ko_read_file(char *fpath, int32_t addr, uint8_t *val, int32_t read_bytes); + +#endif /* __DFD_CFG_ADAPTER_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h new file mode 100644 index 0000000000..50d7a42d55 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_file.h @@ -0,0 +1,37 @@ +#ifndef __DFD_CFG_FILE_H__ +#define __DFD_CFG_FILE_H__ + +#include + +#define KFILE_RV_OK (0) +#define KFILE_RV_INPUT_ERR (-1) +#define KFILE_RV_STAT_FAIL (-2) +#define KFILE_RV_OPEN_FAIL (-3) +#define KFILE_RV_MALLOC_FAIL (-4) +#define KFILE_RV_RD_FAIL (-5) +#define KFILE_RV_ADDR_ERR (-6) +#define KFILE_RV_WR_FAIL (-7) + +#define IS_CR(c) ((c) == '\n') + +typedef struct kfile_ctrl_s { + int32_t size; + int32_t pos; + char *buf; +} kfile_ctrl_t; + +int kfile_open(char *fname, kfile_ctrl_t *kfile_ctrl); + +void kfile_close(kfile_ctrl_t *kfile_ctrl); + +int kfile_gets(char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl); + +int kfile_read(int32_t addr, char *buf, int buf_size, kfile_ctrl_t *kfile_ctrl); + +int kfile_iterate_dir(const char *dir_path, const char *obj_name, char *match_name, int len); + +#if 0 + +int kfile_write(char *fpath, int32_t addr, char *buf, int buf_size); +#endif +#endif /* __DFD_CFG_FILE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h new file mode 100644 index 0000000000..dc1ed17651 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_info.h @@ -0,0 +1,109 @@ +#ifndef __DFD_CFG_INFO_H__ +#define __DFD_CFG_INFO_H__ + +#include + +typedef int (*info_num_buf_to_value_f)(uint8_t *num_buf, int buf_len, int *num_val); + +typedef int (*info_buf_to_buf_f)(uint8_t *buf, int buf_len, uint8_t *buf_new, int *buf_len_new); + +#define IS_INFO_FRMT_BIT(frmt) ((frmt) == INFO_FRMT_BIT) +#define IS_INFO_FRMT_BYTE(frmt) (((frmt) == INFO_FRMT_BYTE) || ((frmt) == INFO_FRMT_NUM_BYTES)) +#define IS_INFO_FRMT_NUM_STR(frmt) ((frmt) == INFO_FRMT_NUM_STR) +#define IS_INFO_FRMT_NUM_BUF(frmt) ((frmt) == INFO_FRMT_NUM_BUF) +#define IS_INFO_FRMT_BUF(frmt) ((frmt) == INFO_FRMT_BUF) + +#define INFO_INT_MAX_LEN (32) +#define INFO_INT_LEN_VALAID(len) (((len) > 0) && ((len) < INFO_INT_MAX_LEN)) + +#define INFO_BUF_MAX_LEN (128) +#define INFO_BUF_LEN_VALAID(len) (((len) > 0) && ((len) < INFO_BUF_MAX_LEN)) + +#define INFO_BIT_OFFSET_VALID(bit_offset) (((bit_offset) >= 0) && ((bit_offset) < 8)) + +typedef enum info_ctrl_mode_e { + INFO_CTRL_MODE_NONE, + INFO_CTRL_MODE_CFG, + INFO_CTRL_MODE_CONS, + INFO_CTRL_MODE_TLV, + INFO_CTRL_MODE_SRT_CONS, + INFO_CTRL_MODE_END +} info_ctrl_mode_t; + +typedef enum info_frmt_e { + INFO_FRMT_NONE, + INFO_FRMT_BIT, + INFO_FRMT_BYTE, + INFO_FRMT_NUM_BYTES, + INFO_FRMT_NUM_STR, + INFO_FRMT_NUM_BUF, + INFO_FRMT_BUF, + INFO_FRMT_END +} info_frmt_t; + +typedef enum info_src_e { + INFO_SRC_NONE, + INFO_SRC_CPLD, + INFO_SRC_FPGA, + INFO_SRC_OTHER_I2C, + INFO_SRC_FILE, + INFO_SRC_END +} info_src_t; + +typedef enum info_pola_e { + INFO_POLA_NONE, + INFO_POLA_POSI, + INFO_POLA_NEGA, + INFO_POLA_END +} info_pola_t; + +#define INFO_FPATH_MAX_LEN (128) +#define INFO_STR_CONS_MAX_LEN (64) +typedef struct info_ctrl_s { + info_ctrl_mode_t mode; + int32_t int_cons; + info_src_t src; + info_frmt_t frmt; + info_pola_t pola; + char fpath[INFO_FPATH_MAX_LEN]; + int32_t addr; + int32_t len; + int32_t bit_offset; + char str_cons[INFO_STR_CONS_MAX_LEN]; + int32_t int_extra1; + int32_t int_extra2; +} info_ctrl_t; + +typedef enum info_ctrl_mem_s { + INFO_CTRL_MEM_MODE, + INFO_CTRL_MEM_INT_CONS, + INFO_CTRL_MEM_SRC, + INFO_CTRL_MEM_FRMT, + INFO_CTRL_MEM_POLA, + INFO_CTRL_MEM_FPATH, + INFO_CTRL_MEM_ADDR, + INFO_CTRL_MEM_LEN, + INFO_CTRL_MEM_BIT_OFFSET, + INFO_CTRL_MEM_STR_CONS, + INFO_CTRL_MEM_INT_EXTRA1, + INFO_CTRL_MEM_INT_EXTRA2, + INFO_CTRL_MEM_END +} info_ctrl_mem_t; + +typedef int (*info_hwmon_buf_f)(uint8_t *buf, int buf_len, uint8_t *buf_new, int *buf_len_new, info_ctrl_t *info_ctrl); + +extern char *g_info_ctrl_mem_str[INFO_CTRL_MEM_END]; +extern char *g_info_src_str[INFO_SRC_END]; +extern char *g_info_frmt_str[INFO_FRMT_END]; +extern char *g_info_pola_str[INFO_POLA_END]; +extern char *g_info_ctrl_mode_str[INFO_CTRL_MODE_END]; + +int dfd_info_get_int(int key, int *ret, info_num_buf_to_value_f pfun); + +int dfd_info_get_buf(int key, uint8_t *buf, int buf_len, info_buf_to_buf_f pfun); + +int dfd_info_set_int(int key, int val); + +int dfd_info_get_sensor(uint32_t key, char *buf, int buf_len, info_hwmon_buf_f pfun); + +#endif /* __DFD_CFG_INFO_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h new file mode 100644 index 0000000000..955dfa96e4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_cfg_listnode.h @@ -0,0 +1,30 @@ +#ifndef __DFD_CFG_LISTNODE_H__ +#define __DFD_CFG_LISTNODE_H__ + +#include + +#define LNODE_RV_OK (0) +#define LNODE_RV_INPUT_ERR (-1) +#define LNODE_RV_NODE_EXIST (-2) +#define LNODE_RV_NOMEM (-3) + +typedef struct lnode_root_s { + struct list_head root; +} lnode_root_t; + +typedef struct lnode_node_s { + struct list_head lst; + + int key; + void *data; +} lnode_node_t; + +void *lnode_find_node(lnode_root_t *root, int key); + +int lnode_insert_node(lnode_root_t *root, int key, void *data); + +int lnode_init_root(lnode_root_t *root); + +void lnode_free_list(lnode_root_t *root); + +#endif /* __DFD_CFG_LISTNODE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h new file mode 100644 index 0000000000..1065fd9eed --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_fan_driver.h @@ -0,0 +1,18 @@ +#ifndef _DFD_FAN_DRIVER_H_ +#define _DFD_FAN_DRIVER_H_ + +ssize_t dfd_get_fan_speed(unsigned int fan_index, unsigned int motor_index,unsigned int *speed); + +int dfd_set_fan_pwm(unsigned int fan_index, unsigned int motor_index, int pwm); + +int dfd_get_fan_pwm(unsigned int fan_index, unsigned int motor_index, int *pwm); + +int dfd_get_fan_present_status(unsigned int fan_index); + +int dfd_get_fan_roll_status(unsigned int fan_index, unsigned int motor_index); + +int dfd_get_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int *level); + +int dfd_set_fan_speed_level(unsigned int fan_index, unsigned int motor_index, int level); + +#endif /* _DFD_FAN_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h new file mode 100644 index 0000000000..a547255cf3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_module.h @@ -0,0 +1,96 @@ +#ifndef __DFD_MODULE_H__ +#define __DFD_MODULE_H__ + +typedef enum dfd_rv_s { + DFD_RV_OK = 0, + DFD_RV_INIT_ERR = 1, + DFD_RV_SLOT_INVALID = 2, + DFD_RV_MODE_INVALID = 3, + DFD_RV_MODE_NOTSUPPORT = 4, + DFD_RV_TYPE_ERR = 5, + DFD_RV_DEV_NOTSUPPORT = 6, + DFD_RV_DEV_FAIL = 7, + DFD_RV_INDEX_INVALID = 8, + DFD_RV_NO_INTF = 9, + DFD_RV_NO_NODE = 10, + DFD_RV_NODE_FAIL = 11, + DFD_RV_INVALID_VALUE = 12, + DFD_RV_NO_MEMORY = 13, +} dfd_rv_t; + +typedef enum { + DBG_VERBOSE = 0x01, + DBG_WARN = 0x02, + DBG_ERROR = 0x04, +} dbg_level_t; + +extern int g_dfd_dbg_level; +extern int g_dfd_fan_dbg_level; +extern int g_dfd_slot_dbg_level; +extern int g_dfd_sensor_dbg_level; +extern int g_dfd_psu_dbg_level; +extern int g_dfd_sff_dbg_level; + +#define DBG_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_FAN_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_fan_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_SLOT_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_slot_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_SENSOR_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_sensor_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_PSU_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_psu_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +#define DFD_SFF_DEBUG(level, fmt, arg...) do { \ + if (g_dfd_sff_dbg_level & level) { \ + if(level >= DBG_ERROR) { \ + printk(KERN_ERR "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } else { \ + printk(KERN_INFO "[DBG-%d]:<%s, %d>:"fmt, level, __FUNCTION__, __LINE__, ##arg); \ + } \ + } \ +} while (0) + +int dfd_get_dev_number(unsigned int main_dev_id, unsigned int minor_dev_id); + +#endif /* __DFD_MODULE_H__ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h new file mode 100644 index 0000000000..ce71996605 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_psu_driver.h @@ -0,0 +1,10 @@ +#ifndef _DFD_PSU_DRIVER_H_ +#define _DFD_PSU_DRIVER_H_ + +int dfd_get_psu_present_status(unsigned int psu_index); + +int dfd_get_psu_output_status(unsigned int psu_index); + +int dfd_get_psu_alert_status(unsigned int psu_index); + +#endif /* _DFD_PSU_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h new file mode 100644 index 0000000000..16733b2602 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sensors_driver.h @@ -0,0 +1,10 @@ +#ifndef _DFD_SENSORS_DRIVER_H_ +#define _DFD_SENSORS_DRIVER_H_ + +ssize_t dfd_get_temp_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t temp_index, uint8_t temp_attr, char *buf); + +ssize_t dfd_get_voltage_info(uint8_t main_dev_id, uint8_t dev_index, + uint8_t in_index, uint8_t in_attr, char *buf); + +#endif /* _DFD_SENSORS_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h new file mode 100644 index 0000000000..7107b72ee4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_sff_driver.h @@ -0,0 +1,8 @@ +#ifndef _DFD_SFF_DRIVER_H_ +#define _DFD_SFF_DRIVER_H_ + +ssize_t dfd_get_sff_cpld_info(unsigned int sff_index, int cpld_reg_type, char *buf, int len); + +ssize_t dfd_get_sff_dir_name(unsigned int sff_index, char *buf, int buf_len); + +#endif /* _DFD_SFF_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h new file mode 100644 index 0000000000..c68caecd2e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_cfg/include/dfd_slot_driver.h @@ -0,0 +1,6 @@ +#ifndef _DFD_SLOT_DRIVER_H_ +#define _DFD_SLOT_DRIVER_H_ + +int dfd_get_slot_present_status(unsigned int slot_index); + +#endif /* _DFD_SLOT_DRIVER_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile new file mode 100644 index 0000000000..1a1044bb1f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/Makefile @@ -0,0 +1,21 @@ +PWD = $(shell pwd) + +EXTRA_CFLAGS:= -I$(M)/include +EXTRA_CFLAGS+= -Wall +KBUILD_EXTRA_SYMBOLS += $(PLAT_SYSFS_DIR)/dev_cfg/Module.symvers + +obj-m := plat_switch.o +obj-m += plat_fan.o +obj-m += plat_psu.o +obj-m += plat_sff.o +obj-m += plat_sensor.o +obj-m += plat_slot.o + +all: + $(MAKE) -C $(KERNEL_SRC)/build M=$(PWD) modules + @if [ ! -d $(module_out_put_dir) ]; then mkdir -p $(module_out_put_dir) ;fi + cp -p $(PWD)/*.ko $(module_out_put_dir) +clean: + rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd $(PWD)/*.mod + rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order + rm -rf $(PWD)/.tmp_versions diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h new file mode 100644 index 0000000000..bbd813e871 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/plat_switch.h @@ -0,0 +1,86 @@ +#ifndef _PLAT_SWITCH_H_ +#define _PLAT_SWITCH_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +enum LOG_LEVEL{ + INFO = 0x1, + ERR = 0x2, + DBG = 0x4, + ALL = 0xf +}; + +#define LOG_INFO(_prefix, fmt, args...) \ + do { \ + if (g_loglevel & INFO) \ + { \ + printk( KERN_INFO _prefix "%s "fmt, __FUNCTION__, ##args); \ + } \ + } while (0) + +#define LOG_ERR(_prefix, fmt, args...) \ + do { \ + if (g_loglevel & ERR) \ + { \ + printk( KERN_ERR _prefix "%s "fmt, __FUNCTION__, ##args); \ + } \ + } while (0) + +#define LOG_DBG(_prefix, fmt, args...) \ + do { \ + if (g_loglevel & DBG) \ + { \ + printk( KERN_DEBUG _prefix "%s "fmt, __FUNCTION__, ##args); \ + } \ + } while (0) + +#define check_pfun(p) \ + do { \ + if (p == NULL) { \ + printk( KERN_ERR "%s, %s = NULL.\n", __FUNCTION__, #p); \ + return -ENOSYS; \ + } \ + }while(0) + +#define check_p(p) check_pfun(p) + +#define to_switch_obj(x) container_of(x, struct switch_obj, kobj) +#define to_switch_attr(x) container_of(x, struct switch_attribute, attr) +#define to_switch_device_attr(x) container_of(x, struct switch_device_attribute, switch_attr) + +#define SWITCH_ATTR(_name, _mode, _show, _store, _type) \ + { .switch_attr = __ATTR(_name, _mode, _show, _store), \ + .type = _type } + +#define SWITCH_DEVICE_ATTR(_name, _mode, _show, _store, _type) \ +struct switch_device_attribute switch_dev_attr_##_name \ + = SWITCH_ATTR(_name, _mode, _show, _store, _type) + +struct switch_obj { + struct kobject kobj; + unsigned int index; +}; + +/* a custom attribute that works just for a struct switch_obj. */ +struct switch_attribute { + struct attribute attr; + ssize_t (*show)(struct switch_obj *foo, struct switch_attribute *attr, char *buf); + ssize_t (*store)(struct switch_obj *foo, struct switch_attribute *attr, const char *buf, size_t count); +}; + +struct switch_device_attribute { + struct switch_attribute switch_attr; + int type; +}; + +extern struct switch_obj *wb_plat_kobject_create(const char *name, struct kobject *parent); +extern void wb_plat_kobject_delete(struct switch_obj **obj); + +#endif /* _PLAT_SWITCH_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h new file mode 100644 index 0000000000..5b73731e1f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/include/sysfs_common.h @@ -0,0 +1,90 @@ +#ifndef _SYSFS_COMMON_H_ +#define _SYSFS_COMMON_H_ + +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define DIR_NAME_MAX_LEN (64) + +#define WB_SYSFS_DEV_ERROR "NA" +/* sysfs directory name */ +#define FAN_SYSFS_NAME "fan" +#define PSU_SYSFS_NAME "psu" +#define SLOT_SYSFS_NAME "slot" +#define VOLTAGE_SYSFS_NAME "in" +#define TEMP_SYSFS_NAME "temp" +#define SFF_SYSFS_NAME "sff" + +typedef enum wb_main_dev_type_e { + WB_MAIN_DEV_MAINBOARD = 0, + WB_MAIN_DEV_FAN = 1, + WB_MAIN_DEV_PSU = 2, + WB_MAIN_DEV_SFF = 3, + WB_MAIN_DEV_CPLD = 4, + WB_MAIN_DEV_SLOT = 5, +} wb_main_dev_type_t; + +typedef enum wb_minor_dev_type_e { + WB_MINOR_DEV_NONE = 0, /* None */ + WB_MINOR_DEV_TEMP = 1, + WB_MINOR_DEV_IN = 2, + WB_MINOR_DEV_CURR = 3, + WB_MINOR_DEV_POWER = 4, + WB_MINOR_DEV_MOTOR = 5, + WB_MINOR_DEV_PSU = 6, +} wb_minor_dev_type_t; + +typedef enum wb_sensor_type_e { + WB_SENSOR_INPUT = 0, + WB_SENSOR_ALIAS = 1, + WB_SENSOR_TYPE = 2, + WB_SENSOR_MAX = 3, + WB_SENSOR_MAX_HYST = 4, + WB_SENSOR_MIN = 5, + WB_SENSOR_CRIT = 6, +} wb_sensor_type_t; + +typedef enum wb_sff_cpld_attr_e { + WB_SFF_POWER_ON = 0x01, + WB_SFF_TX_FAULT, + WB_SFF_TX_DIS, + WB_SFF_PRE_N, + WB_SFF_RX_LOS, + WB_SFF_RESET, + WB_SFF_LPMODE, + WB_SFF_MODULE_PRESENT, + WB_SFF_INTERRUPT, +} wb_sff_cpld_attr_t; + +struct switch_drivers_t{ + /* device */ + int (*get_dev_number) (unsigned int main_dev_id, unsigned int minor_dev_id); + /* fan */ + int (*get_fan_number) (void); + ssize_t (*get_fan_speed) (unsigned int fan_index, unsigned int motor_index, unsigned int *speed); + int (*get_fan_pwm) (unsigned int fan_index, unsigned int motor_index, int *pwm); + int (*set_fan_pwm) (unsigned int fan_index, unsigned int motor_index, int pwm); + int (*get_fan_present_status)(unsigned int fan_index); + int (*get_fan_roll_status)(unsigned int fan_index, unsigned int motor_index); + int (*get_fan_speed_level)(unsigned int fan_index, unsigned int motor_index, int *level); + int (*set_fan_speed_level)(unsigned int fan_index, unsigned int motor_index, int level); + /* slot */ + int (*get_slot_present_status) (unsigned int slot_index); + /* sensors */ + ssize_t (*get_temp_info)( uint8_t main_dev_id, uint8_t dev_index, + uint8_t temp_index, uint8_t temp_attr, char *buf); + ssize_t (*get_voltage_info)( uint8_t main_dev_id, uint8_t dev_index, + uint8_t in_index, uint8_t in_attr, char *buf); + /* psu */ + int (*get_psu_present_status)(unsigned int psu_index); + int (*get_psu_output_status)(unsigned int psu_index); + int (*get_psu_alert_status)(unsigned int psu_index); + /* sff */ + ssize_t (*get_sff_cpld_info)( unsigned int sff_index, int cpld_reg_type, char *buf, int len); + ssize_t (*get_sff_dir_name)(unsigned int sff_index, char *buf, int buf_len); +}; + +extern struct switch_drivers_t * dfd_plat_driver_get(void); + +#endif /*_SYSFS_COMMON_H_ */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c new file mode 100644 index 0000000000..d841f2547b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_fan.c @@ -0,0 +1,505 @@ +/* + * plat_fan.c + * Original Author: support 2020-02-17 + * + * This module create fan kobjects and attributes in /sys/wb_plat/fan + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define FAN_INFO(fmt, args...) LOG_INFO("fan: ", fmt, ##args) +#define FAN_ERR(fmt, args...) LOG_ERR("fan: ", fmt, ##args) +#define FAN_DBG(fmt, args...) LOG_DBG("fan: ", fmt, ##args) + +struct motor_obj_t{ + struct switch_obj *obj; +}; + +struct fan_obj_t{ + unsigned int motor_number; + struct motor_obj_t *motor; + struct switch_obj *obj; +}; + +struct fan_t{ + unsigned int fan_number; + struct fan_obj_t *fan; +}; + +static int g_loglevel = 0; +static struct fan_t g_fan; +static struct switch_obj *g_fan_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t fan_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_fan.fan_number); +} + +static ssize_t fan_motor_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int index; + + index = obj->index; + FAN_DBG("fan_motor_number_show,fan index:%d\n",index); + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_fan.fan[index-1].motor_number); +} + +static ssize_t fan_roll_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index, motor_index; + struct switch_obj *p_obj; + int ret; + + check_p(g_drv); + check_p(g_drv->get_fan_roll_status); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + fan_index = p_obj->index; + motor_index = obj->index; + + ret = g_drv->get_fan_roll_status(fan_index, motor_index); + if (ret < 0 ) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t fan_present_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index; + int ret; + + fan_index = obj->index; + FAN_DBG("fan_present_status_show, fan index:%d\n",fan_index); + check_p(g_drv); + check_p(g_drv->get_fan_present_status); + + ret = g_drv->get_fan_present_status(fan_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t fan_speed_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index, motor_index, speed; + int ret; + struct switch_obj *p_obj; + + check_p(g_drv); + check_p(g_drv->get_fan_speed); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + fan_index = p_obj->index; + motor_index = obj->index; + + ret = g_drv->get_fan_speed(fan_index, motor_index, &speed); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", speed); +} + +static ssize_t fan_motor_ratio_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int fan_index, motor_index; + struct switch_obj *p_obj; + int ret, pwm; + + check_p(g_drv); + check_p(g_drv->get_fan_pwm); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + fan_index = p_obj->index; + motor_index = obj->index; + ret = g_drv->get_fan_pwm(fan_index, motor_index, &pwm); + + if (ret < 0 ) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", pwm); +} + +static ssize_t fan_motor_ratio_store(struct switch_obj *obj, struct switch_attribute *attr, + const char* buf, size_t count) +{ + unsigned int fan_index, motor_index; + struct switch_obj *p_obj; + int ret, pwm; + + check_p(g_drv); + check_p(g_drv->set_fan_pwm); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + fan_index = p_obj->index; + motor_index = obj->index; + sscanf(buf, "%d", &pwm); + + if (pwm < 0 || pwm > 100) { + FAN_ERR("can not set pwm = %d.\n", pwm); + return -EINVAL; + } + ret = g_drv->set_fan_pwm(fan_index, motor_index, pwm); + if (ret < 0) { + FAN_ERR("can not set pwm = %d.\n", pwm); + return -EIO; + } + return count; +} + +/************************************fan dir and attrs*******************************************/ +static struct switch_attribute fan_number_att = __ATTR(num_fans, S_IRUGO, fan_number_show, NULL); + +static struct attribute *fan_dir_attrs[] = { + &fan_number_att.attr, + NULL, +}; + +static struct attribute_group fan_root_attr_group = { + .attrs = fan_dir_attrs, +}; + +/*******************************fan1 fan2 dir and attrs*******************************************/ +static struct switch_attribute fan_num_motors_att = __ATTR(num_motors, S_IRUGO, fan_motor_number_show, NULL); +static struct switch_attribute fan_present_att = __ATTR(present, S_IRUGO, fan_present_status_show, NULL); + +static struct attribute *fan_attrs[] = { + &fan_num_motors_att.attr, + &fan_present_att.attr, + NULL, +}; + +static struct attribute_group fan_attr_group = { + .attrs = fan_attrs, +}; + +/*******************************motor0 motor1 dir and attrs*******************************************/ +static struct switch_attribute motor_speed_att = __ATTR(speed, S_IRUGO, fan_speed_show, NULL); +static struct switch_attribute motor_status_att = __ATTR(status, S_IRUGO, fan_roll_status_show, NULL); +static struct switch_attribute motor_ratio_att = __ATTR(ratio, S_IRUGO | S_IWUSR, fan_motor_ratio_show, fan_motor_ratio_store); + +static struct attribute *motor_attrs[] = { + &motor_speed_att.attr, + &motor_status_att.attr, + &motor_ratio_att.attr, + NULL, +}; + +static struct attribute_group motor_attr_group = { + .attrs = motor_attrs, +}; + +static void fanindex_single_motor_remove_kobj_and_attrs(struct fan_obj_t * curr_fan, unsigned int motor_index) +{ + struct motor_obj_t *curr_motor; /* point to motor0 motor1...*/ + + curr_motor = &curr_fan->motor[motor_index]; + if (curr_motor->obj) { + sysfs_remove_group(&curr_motor->obj->kobj, &motor_attr_group); + wb_plat_kobject_delete(&curr_motor->obj); + FAN_DBG("delete fan:%d motor%d.\n", curr_fan->obj->index, motor_index); + } + return; +} + +static int fanindex_single_motor_create_kobj_and_attrs(struct fan_obj_t * curr_fan, unsigned int motor_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct motor_obj_t *curr_motor; /* point to motor0 motor1...*/ + + FAN_DBG("create fan_index:%d, motor%d ...\n", curr_fan->obj->index, motor_index); + + curr_motor = &curr_fan->motor[motor_index]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "motor%d", motor_index); + curr_motor->obj = wb_plat_kobject_create(name, &curr_fan->obj->kobj); + if (!curr_motor->obj) { + FAN_ERR("create fan_index:%d, motor%d object error!\n", curr_fan->obj->index, motor_index); + return -EBADRQC; + } + curr_motor->obj->index = motor_index; + if (sysfs_create_group(&curr_motor->obj->kobj, &motor_attr_group) != 0) { + FAN_ERR("create fan_index:%d, motor%d attrs error.\n", curr_fan->obj->index, motor_index); + wb_plat_kobject_delete(&curr_motor->obj); + return -EBADRQC; + } + FAN_DBG("create fan_index:%d, motor%d ok.\n", curr_fan->obj->index, motor_index); + return 0; +} + +static int fanindex_motor_create_kobj_and_attrs(struct fan_obj_t * curr_fan, int motor_num) +{ + int motor_index, i; + + curr_fan->motor = kzalloc(sizeof(struct motor_obj_t) * motor_num, GFP_KERNEL); + if (!curr_fan->motor) { + FAN_ERR("kzalloc motor error, fan index = %d, motor number = %d.\n", curr_fan->obj->index, motor_num); + return -ENOMEM; + } + curr_fan->motor_number = motor_num; + for (motor_index = 0; motor_index < motor_num; motor_index++) { + if (fanindex_single_motor_create_kobj_and_attrs(curr_fan, motor_index) != 0) { + goto motor_error; + } + } + return 0; +motor_error: + for(i = motor_index - 1; i >= 0; i--) { + fanindex_single_motor_remove_kobj_and_attrs(curr_fan, i); + } + if(curr_fan->motor) { + kfree(curr_fan->motor); + curr_fan->motor = NULL; + } + return -EBADRQC; +} + +static void fanindex_motor_remove_kobj_and_attrs(struct fan_obj_t *curr_fan, int motor_num) +{ + int motor_index; + + for (motor_index = motor_num - 1; motor_index >= 0; motor_index--) { + fanindex_single_motor_remove_kobj_and_attrs(curr_fan, motor_index); + } + return; +} + +static int fan_motor_create(void) +{ + int fan_num, motor_num; + unsigned int fan_index, i; + struct fan_obj_t *curr_fan; /* point to fan1 fan2...*/ + + check_p(g_drv->get_dev_number); + + motor_num = g_drv->get_dev_number(WB_MAIN_DEV_FAN, WB_MINOR_DEV_MOTOR); + if (motor_num <= 0) { + FAN_ERR("get fan motor number error, motor_num:%d error.\n", motor_num); + return -ENODEV; + } + + fan_num = g_fan.fan_number; + for (fan_index = 1; fan_index <= fan_num; fan_index++) { + curr_fan = &g_fan.fan[fan_index - 1]; + if (fanindex_motor_create_kobj_and_attrs(curr_fan, motor_num) != 0) { + goto error; + } + } + return 0; +error: + for (i = fan_index - 1; i > 0; i--) { + curr_fan = &g_fan.fan[i - 1]; + motor_num = curr_fan->motor_number; + fanindex_motor_remove_kobj_and_attrs(curr_fan, motor_num); + } + return -EBADRQC; +} + +static void fan_motor_remove(void) +{ + unsigned int fan_index; + struct fan_obj_t *curr_fan; + + if (g_fan.fan) { + for (fan_index = g_fan.fan_number; fan_index > 0; fan_index--) { + curr_fan = &g_fan.fan[fan_index - 1]; + if (curr_fan->motor) { + fanindex_motor_remove_kobj_and_attrs(curr_fan, curr_fan->motor_number); + kfree(curr_fan->motor); + curr_fan->motor = NULL; + curr_fan->motor_number = 0; + } + } + } + return; +} + +static void fan_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct fan_obj_t *curr_fan; + + curr_fan = &g_fan.fan[index - 1]; + if (curr_fan->obj) { + sysfs_remove_group(&curr_fan->obj->kobj, &fan_attr_group); + wb_plat_kobject_delete(&curr_fan->obj); + FAN_DBG("delete fan%d.\n", index); + } + return; +} + +static int fan_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct fan_obj_t *curr_fan; + + curr_fan = &g_fan.fan[index - 1]; + FAN_DBG("create fan%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "fan%d", index); + curr_fan->obj = wb_plat_kobject_create(name, parent); + if (!curr_fan->obj) { + FAN_ERR("create fan%d object error!\n", index); + return -EBADRQC; + } + curr_fan->obj->index = index; + if (sysfs_create_group(&curr_fan->obj->kobj, &fan_attr_group) != 0) { + FAN_ERR("create fan%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_fan->obj); + return -EBADRQC; + } + FAN_DBG("create fan%d ok.\n", index); + return 0; +} + +static int fan_sub_create_kobj_and_attrs(struct kobject *parent, int fan_num) +{ + unsigned int fan_index, i; + + g_fan.fan = kzalloc(sizeof(struct fan_obj_t) * fan_num, GFP_KERNEL); + if (!g_fan.fan) { + FAN_ERR("kzalloc fan.fan error, fan number = %d.\n", fan_num); + return -ENOMEM; + } + + for (fan_index = 1; fan_index <= fan_num; fan_index++) { + if(fan_sub_single_create_kobj_and_attrs(parent, fan_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = fan_index - 1; i > 0; i--) { + fan_sub_single_remove_kobj_and_attrs(i); + } + if (g_fan.fan) { + kfree(g_fan.fan); + g_fan.fan = NULL; + } + return -EBADRQC; +} + +static int fan_sub_create(void) +{ + int ret, fan_num; + + check_p(g_drv->get_dev_number); + fan_num = g_drv->get_dev_number(WB_MAIN_DEV_FAN, WB_MINOR_DEV_NONE); + if (fan_num < 0) { + FAN_ERR("fan number = %d error.\n", fan_num); + return -EINVAL; + } + g_fan.fan_number = fan_num; + ret = fan_sub_create_kobj_and_attrs(&g_fan_obj->kobj, fan_num); + return ret; +} + +static void fan_sub_remove(void) +{ + unsigned int fan_index; + + if (g_fan.fan) { + for (fan_index = g_fan.fan_number; fan_index > 0; fan_index--) { + fan_sub_single_remove_kobj_and_attrs(fan_index); + } + kfree(g_fan.fan); + } + mem_clear(&g_fan, sizeof(struct fan_t)); + return; +} + +static int fan_root_create(void) +{ + g_fan_obj = wb_plat_kobject_create("fan", NULL); + if (!g_fan_obj) { + FAN_ERR("wb_plat_kobject_create fan error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_fan_obj->kobj, &fan_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_fan_obj); + FAN_ERR("create fan dir attrs error!\n"); + return -EBADRQC; + } + FAN_DBG("wb_plat_kobject_create fan directory and attribute success.\n"); + return 0; +} + +static void fan_root_remove(void) +{ + if (g_fan_obj) { + sysfs_remove_group(&g_fan_obj->kobj, &fan_root_attr_group); + wb_plat_kobject_delete(&g_fan_obj); + FAN_DBG("delete fan root success\n"); + } + + return; +} + +static int fan_init(void) +{ + int ret; + + FAN_INFO("fan_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = fan_root_create(); + if (ret < 0) { + goto fan_root_error; + } + + ret = fan_sub_create(); + if (ret < 0) { + goto fan_sub_error; + } + + ret = fan_motor_create(); + if (ret < 0) { + goto fan_motor_error; + } + + FAN_INFO("fan_init ok.\n"); + return 0; +fan_motor_error: + fan_sub_remove(); +fan_sub_error: + fan_root_remove(); +fan_root_error: + return ret; +} + +static void fan_exit(void) +{ + fan_motor_remove(); + fan_sub_remove(); + fan_root_remove(); + FAN_INFO("fan_exit ok.\n"); + return ; +} + +module_init(fan_init); +module_exit(fan_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("fan sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c new file mode 100644 index 0000000000..af3b414314 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_psu.c @@ -0,0 +1,430 @@ +/* + * plat_psu.c + * Original Author: support 2020-02-17 + * + * This module create psu kobjects and attributes in /sys/wb_plat/psu + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define PSU_INFO(fmt, args...) LOG_INFO("psu: ", fmt, ##args) +#define PSU_ERR(fmt, args...) LOG_ERR("psu: ", fmt, ##args) +#define PSU_DBG(fmt, args...) LOG_DBG("psu: ", fmt, ##args) + +struct temp_obj_t{ + struct switch_obj *obj; +}; + +struct psu_obj_t{ + unsigned int temp_number; + struct temp_obj_t *temp; + struct switch_obj *obj; +}; + +struct psu_t{ + unsigned int psu_number; + struct psu_obj_t *psu; +}; + +static int g_loglevel = 0; +static struct psu_t g_psu; +static struct switch_obj *g_psu_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t psu_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_psu.psu_number); +} + +static ssize_t psu_present_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int psu_index; + int ret; + + psu_index = obj->index; + PSU_DBG("psu_present_status_show, psu index:%d\n",psu_index); + check_p(g_drv); + check_p(g_drv->get_psu_present_status); + + ret = g_drv->get_psu_present_status(psu_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t psu_output_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int psu_index; + int ret; + + psu_index = obj->index; + PSU_DBG("psu_output_status_show, psu index:%d\n",psu_index); + check_p(g_drv); + check_p(g_drv->get_psu_output_status); + + ret = g_drv->get_psu_output_status(psu_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t psu_alert_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int psu_index; + int ret; + + psu_index = obj->index; + PSU_DBG("psu_alert_status_show, psu index:%d\n",psu_index); + check_p(g_drv); + check_p(g_drv->get_psu_alert_status); + + ret = g_drv->get_psu_alert_status(psu_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +/************************************psu dir and attrs*******************************************/ +static struct switch_attribute psu_number_att = __ATTR(num_psus, S_IRUGO, psu_number_show, NULL); + +static struct attribute *psu_dir_attrs[] = { + &psu_number_att.attr, + NULL, +}; + +static struct attribute_group psu_root_attr_group = { + .attrs = psu_dir_attrs, +}; + +/*******************************psu1 psu2 dir and attrs*******************************************/ +static struct switch_attribute psu_present_status_att = __ATTR(present, S_IRUGO, psu_present_status_show, NULL); +static struct switch_attribute psu_output_status_att = __ATTR(output, S_IRUGO, psu_output_status_show, NULL); +static struct switch_attribute psu_alert_status_att = __ATTR(alert, S_IRUGO, psu_alert_status_show, NULL); + +static struct attribute *psu_attrs[] = { + &psu_present_status_att.attr, + &psu_output_status_att.attr, + &psu_alert_status_att.attr, + NULL, +}; + +static struct attribute_group psu_attr_group = { + .attrs = psu_attrs, +}; + +/*******************************psu temp0 temp1 dir and attrs*******************************************/ +static struct attribute *psu_temp_attrs[] = { + NULL, +}; + +static struct attribute_group psu_temp_attr_group = { + .attrs = psu_temp_attrs, +}; + +static void psuindex_single_temp_remove_kobj_and_attrs(struct psu_obj_t * curr_psu, unsigned int temp_index) +{ + + struct temp_obj_t *curr_temp; /* point to temp0 temp1...*/ + + curr_temp = &curr_psu->temp[temp_index]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &psu_temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + PSU_DBG("delete psu:%d temp%d.\n", curr_psu->obj->index, temp_index); + } + return; +} + +static int psuindex_single_temp_create_kobj_and_attrs(struct psu_obj_t * curr_psu, unsigned int temp_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct temp_obj_t *curr_temp; /* point to temp0 temp1...*/ + + PSU_DBG("create psu_index:%d, temp%d ...\n", curr_psu->obj->index, temp_index); + + curr_temp = &curr_psu->temp[temp_index]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "temp%d", temp_index); + curr_temp->obj = wb_plat_kobject_create(name, &curr_psu->obj->kobj); + if (!curr_temp->obj) { + PSU_ERR("create psu_index:%d, temp%d object error!\n", curr_psu->obj->index, temp_index); + return -EBADRQC; + } + curr_temp->obj->index = temp_index; + if (sysfs_create_group(&curr_temp->obj->kobj, &psu_temp_attr_group) != 0) { + PSU_ERR("create psu_index:%d, temp%d attrs error.\n", curr_psu->obj->index, temp_index); + wb_plat_kobject_delete(&curr_temp->obj); + return -EBADRQC; + } + PSU_DBG("create psu_index:%d, temp%d ok.\n", curr_psu->obj->index, temp_index); + return 0; +} + +static int psuindex_temp_create_kobj_and_attrs(struct psu_obj_t * curr_psu, int temp_num) +{ + int temp_index, i; + + curr_psu->temp = kzalloc(sizeof(struct temp_obj_t) * temp_num, GFP_KERNEL); + if (!curr_psu->temp) { + PSU_ERR("kzalloc temp error, psu index = %d, temp number = %d.\n", curr_psu->obj->index, temp_num); + return -ENOMEM; + } + curr_psu->temp_number = temp_num; + for (temp_index = 0; temp_index < temp_num; temp_index++) { + if (psuindex_single_temp_create_kobj_and_attrs(curr_psu, temp_index) != 0) { + goto temp_error; + } + } + return 0; +temp_error: + for (i = temp_index - 1; i >= 0; i--) { + psuindex_single_temp_remove_kobj_and_attrs(curr_psu, i); + } + if (curr_psu->temp) { + kfree(curr_psu->temp); + curr_psu->temp = NULL; + } + return -EBADRQC; +} + +static void psuindex_temp_remove_kobj_and_attrs(struct psu_obj_t * curr_psu, int temp_num) +{ + unsigned int temp_index; + + for (temp_index = temp_num - 1; temp_index >= 0; temp_index--) { + psuindex_single_temp_remove_kobj_and_attrs(curr_psu, temp_index); + } + return; +} + +static int psu_temp_create(void) +{ + int psu_num, temp_num; + unsigned int psu_index, i; + struct psu_obj_t *curr_psu; /* point to psu1 psu2...*/ + + check_p(g_drv->get_dev_number); + temp_num = g_drv->get_dev_number(WB_MAIN_DEV_PSU, WB_MINOR_DEV_TEMP); + if (temp_num <= 0) { + PSU_INFO("psu temp_num:%d, don't need creat temp directory.\n", temp_num); + return 0; + } + + psu_num = g_psu.psu_number; + for(psu_index = 1; psu_index <= psu_num; psu_index++) { + curr_psu = &g_psu.psu[psu_index - 1]; + if(psuindex_temp_create_kobj_and_attrs(curr_psu, temp_num) != 0) { + goto error; + } + } + return 0; +error: + for(i = psu_index - 1; i > 0; i--) { + curr_psu = &g_psu.psu[i - 1]; + temp_num = curr_psu->temp_number; + psuindex_temp_remove_kobj_and_attrs(curr_psu, temp_num); + } + return -EBADRQC; +} + +static void psu_temp_remove(void) +{ + unsigned int psu_index; + struct psu_obj_t *curr_psu; + + if (g_psu.psu) { + for (psu_index = g_psu.psu_number; psu_index > 0; psu_index--) { + curr_psu = &g_psu.psu[psu_index - 1]; + if (curr_psu->temp) { + psuindex_temp_remove_kobj_and_attrs(curr_psu,curr_psu->temp_number); + kfree(curr_psu->temp); + curr_psu->temp = NULL; + curr_psu->temp_number = 0; + } + } + } + return; +} + +static void psu_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct psu_obj_t *curr_psu; + + curr_psu = &g_psu.psu[index - 1]; + if (curr_psu->obj) { + sysfs_remove_group(&curr_psu->obj->kobj, &psu_attr_group); + wb_plat_kobject_delete(&curr_psu->obj); + PSU_DBG("delete psu%d.\n", index); + } + return; +} + +static int psu_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct psu_obj_t *curr_psu; + + curr_psu = &g_psu.psu[index-1]; + PSU_DBG("create psu%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d",PSU_SYSFS_NAME, index); + curr_psu->obj = wb_plat_kobject_create(name, parent); + if (!curr_psu->obj) { + PSU_ERR("create psu%d object error!\n", index); + return -EBADRQC; + } + curr_psu->obj->index = index; + if (sysfs_create_group(&curr_psu->obj->kobj, &psu_attr_group) != 0) { + PSU_ERR("create psu%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_psu->obj); + return -EBADRQC; + } + PSU_DBG("create psu%d ok.\n", index); + return 0; +} + +static int psu_sub_create_kobj_and_attrs(struct kobject *parent, int psu_num) +{ + unsigned int psu_index, i; + + g_psu.psu = kzalloc(sizeof(struct psu_obj_t) * psu_num, GFP_KERNEL); + if (!g_psu.psu) { + PSU_ERR("kzalloc psu.psu error, psu number = %d.\n", psu_num); + return -ENOMEM; + } + + for (psu_index = 1; psu_index <= psu_num; psu_index++) { + if (psu_sub_single_create_kobj_and_attrs(parent, psu_index) != 0) { + goto error; + } + } + return 0; +error: + for(i = psu_index - 1; i > 0; i--) { + psu_sub_single_remove_kobj_and_attrs(i); + } + if(g_psu.psu) { + kfree(g_psu.psu); + g_psu.psu = NULL; + } + return -EBADRQC; +} + +static int psu_sub_create(void) +{ + int ret, psu_num; + + check_p(g_drv->get_dev_number); + psu_num = g_drv->get_dev_number(WB_MAIN_DEV_PSU, WB_MINOR_DEV_NONE); + if (psu_num < 0) { + PSU_ERR("psu number = %d error.\n", psu_num); + return -EINVAL; + } + g_psu.psu_number = psu_num; + ret = psu_sub_create_kobj_and_attrs(&g_psu_obj->kobj, psu_num); + return ret; +} + +static void psu_sub_remove(void) +{ + unsigned int psu_index; + + if (g_psu.psu) { + for (psu_index = g_psu.psu_number; psu_index > 0; psu_index--) { + psu_sub_single_remove_kobj_and_attrs(psu_index); + } + kfree(g_psu.psu); + } + mem_clear(&g_psu, sizeof(struct psu_t)); + return ; +} + +static int psu_root_create(void) +{ + g_psu_obj = wb_plat_kobject_create(PSU_SYSFS_NAME, NULL); + if (!g_psu_obj) { + PSU_ERR("wb_plat_kobject_create psu error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_psu_obj->kobj, &psu_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_psu_obj); + PSU_ERR("create psu dir attrs error!\n"); + return -EBADRQC; + } + PSU_DBG("wb_plat_kobject_create psu directory and attribute success.\n"); + return 0; +} + +static void psu_root_remove(void) +{ + if (g_psu_obj) { + sysfs_remove_group(&g_psu_obj->kobj, &psu_root_attr_group); + wb_plat_kobject_delete(&g_psu_obj); + PSU_DBG("delete psu root success\n"); + } + return; +} + +static int wb_psu_init(void) +{ + int ret; + + PSU_INFO("wb_psu_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = psu_root_create(); + if (ret < 0) { + goto psu_root_error; + } + + ret = psu_sub_create(); + if (ret < 0) { + goto psu_sub_error; + } + + ret = psu_temp_create(); + if (ret < 0) { + goto psu_temp_error; + } + + PSU_INFO("wb_psu_init ok.\n"); + return 0; +psu_temp_error: + psu_sub_remove(); +psu_sub_error: + psu_root_remove(); +psu_root_error: + return ret; +} + +static void wb_psu_exit(void) +{ + psu_temp_remove(); + psu_sub_remove(); + psu_root_remove(); + PSU_INFO("wb_psu_exit ok.\n"); + return ; +} + +module_init(wb_psu_init); +module_exit(wb_psu_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("psu sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c new file mode 100644 index 0000000000..04b764e82d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sensor.c @@ -0,0 +1,457 @@ +/* + * plat_sensor.c + * Original Author: support 2020-02-17 + * + * This module create sensor kobjects and attributes in /sys/wb_plat/sensor + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define SENSOR_INFO(fmt, args...) LOG_INFO("sensor: ", fmt, ##args) +#define SENSOR_ERR(fmt, args...) LOG_ERR("sensor: ", fmt, ##args) +#define SENSOR_DBG(fmt, args...) LOG_DBG("sensor: ", fmt, ##args) + +struct sensor_t { + unsigned int in_number; + unsigned int temp_number; + struct sensor_in_t *in; + struct sensor_temp_t *temp; +}; + +struct sensor_temp_t { + struct switch_obj *obj; +}; + +struct sensor_in_t { + struct switch_obj *obj; +}; + +static int g_loglevel = 0; +static struct switch_drivers_t *g_drv = NULL; +static struct sensor_t g_sensor; +static struct switch_obj *g_sensor_obj = NULL; + +static ssize_t sensor_temp_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_sensor.temp_number); +} + +static ssize_t sensor_in_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_sensor.in_number); +} + +static ssize_t sensor_voltage_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int in_index; + int ret; + struct switch_device_attribute *in_attr; + + check_p(g_drv); + check_p(g_drv->get_voltage_info); + in_index = obj->index; + + in_attr = to_switch_device_attr(attr); + check_p(in_attr); + SENSOR_DBG("sensor_in_show, in index:0x%x, in type:0x%x\n",in_index, in_attr->type); + ret = g_drv->get_voltage_info(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_NONE, in_index, in_attr->type, buf); + if (ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +static ssize_t sensor_temp_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int temp_index; + int ret; + struct switch_device_attribute *temp_attr; + + check_p(g_drv); + check_p(g_drv->get_temp_info); + temp_index = obj->index; + + temp_attr = to_switch_device_attr(attr); + check_p(temp_attr); + SENSOR_DBG("sensor_temp_show, temp index:0x%x, temp type:0x%x\n", temp_index, temp_attr->type); + ret = g_drv->get_temp_info(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_NONE, temp_index, temp_attr->type, buf); + if (ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +/************************************sensor dir and attrs*******************************************/ +static struct switch_attribute num_temp_att = __ATTR(num_temp_sensors, S_IRUGO, sensor_temp_number_show, NULL); +static struct switch_attribute num_in_att = __ATTR(num_in_sensors, S_IRUGO, sensor_in_number_show, NULL); + +static struct attribute *sensor_dir_attrs[] = { + &num_temp_att.attr, + &num_in_att.attr, + NULL, +}; + +static struct attribute_group sensor_root_attr_group = { + .attrs = sensor_dir_attrs, +}; + +/*******************************temp0 temp1 dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(temp_input, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_INPUT); +static SWITCH_DEVICE_ATTR(temp_alias, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(temp_type, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(temp_max, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(temp_max_hyst, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_MAX_HYST); +static SWITCH_DEVICE_ATTR(temp_min, S_IRUGO, sensor_temp_show, NULL, WB_SENSOR_MIN); + +static struct attribute *sensor_temp_attrs[] = { + &switch_dev_attr_temp_input.switch_attr.attr, + &switch_dev_attr_temp_alias.switch_attr.attr, + &switch_dev_attr_temp_type.switch_attr.attr, + &switch_dev_attr_temp_max.switch_attr.attr, + &switch_dev_attr_temp_max_hyst.switch_attr.attr, + &switch_dev_attr_temp_min.switch_attr.attr, + NULL, +}; + +static struct attribute_group sensor_temp_attr_group = { + .attrs = sensor_temp_attrs, +}; + +/*******************************in0 in1 dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(in_input, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_INPUT); +static SWITCH_DEVICE_ATTR(in_alias, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(in_type, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(in_max, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(in_min, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_MIN); +static SWITCH_DEVICE_ATTR(in_crit, S_IRUGO, sensor_voltage_show, NULL, WB_SENSOR_CRIT); + +static struct attribute *sensor_in_attrs[] = { + &switch_dev_attr_in_input.switch_attr.attr, + &switch_dev_attr_in_alias.switch_attr.attr, + &switch_dev_attr_in_type.switch_attr.attr, + &switch_dev_attr_in_max.switch_attr.attr, + &switch_dev_attr_in_min.switch_attr.attr, + &switch_dev_attr_in_crit.switch_attr.attr, + NULL, +}; + +static struct attribute_group sensor_in_attr_group = { + .attrs = sensor_in_attrs, +}; + +static int sensor_in_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct sensor_in_t *curr_sensor; + + curr_sensor = &g_sensor.in[index - 1]; + SENSOR_DBG("create sensor in%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "in%d", index); + curr_sensor->obj = wb_plat_kobject_create(name, parent); + if (!curr_sensor->obj) { + SENSOR_ERR("create sensor in%d object error!\n", index); + return -EBADRQC; + } + curr_sensor->obj->index = index; + if (sysfs_create_group(&curr_sensor->obj->kobj, &sensor_in_attr_group) != 0) { + SENSOR_ERR("create sensor in%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_sensor->obj); + return -EBADRQC; + } + SENSOR_DBG("create sensor in%d ok.\n", index); + return 0; + +} + +static void sensor_in_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_in_t *curr_in; + + curr_in = &g_sensor.in[index - 1]; + if (curr_in->obj) { + sysfs_remove_group(&curr_in->obj->kobj, &sensor_in_attr_group); + wb_plat_kobject_delete(&curr_in->obj); + SENSOR_DBG("delete in%d.\n", index); + } + return; +} + +static int sensor_temp_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct sensor_temp_t *curr_sensor; + + curr_sensor = &g_sensor.temp[index - 1]; + SENSOR_DBG("create sensor temp%d ...\n", index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "temp%d", index); + curr_sensor->obj = wb_plat_kobject_create(name, parent); + if (!curr_sensor->obj) { + SENSOR_ERR("create sensor temp%d object error!\n", index); + return -EBADRQC; + } + curr_sensor->obj->index = index; + if (sysfs_create_group(&curr_sensor->obj->kobj, &sensor_temp_attr_group) != 0) { + SENSOR_ERR("create sensor temp%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_sensor->obj); + return -EBADRQC; + } + SENSOR_DBG("create sensor temp%d ok.\n", index); + return 0; + +} + +static void sensor_temp_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_temp_t *curr_temp; + + curr_temp = &g_sensor.temp[index - 1]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &sensor_temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + SENSOR_DBG("delete temp%d.\n", index); + } + return; +} + +static int sensor_temp_sub_create_kobj_and_attrs(struct kobject *parent, int temp_num) +{ + unsigned int temp_index, i; + + g_sensor.temp = kzalloc(sizeof(struct sensor_temp_t) * temp_num, GFP_KERNEL); + if (!g_sensor.temp ) { + SENSOR_ERR("kzalloc g_sensor.temp error, temp number = %d.\n", temp_num); + return -ENOMEM; + } + for (temp_index = 1; temp_index <= temp_num; temp_index++) { + if (sensor_temp_sub_single_create_kobj_and_attrs(parent, temp_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = temp_index - 1; i > 0; i--) { + sensor_temp_sub_single_remove_kobj_and_attrs(i); + } + + if (g_sensor.temp) { + kfree(g_sensor.temp); + g_sensor.temp = NULL; + } + return -EBADRQC; +} + +static int sensor_in_sub_create_kobj_and_attrs(struct kobject *parent, int in_num) +{ + unsigned int in_index, i; + + g_sensor.in = kzalloc(sizeof(struct sensor_in_t) * in_num, GFP_KERNEL); + if (!g_sensor.in) { + SENSOR_ERR("kzalloc g_sensor.in error, in number = %d.\n", in_num); + return -ENOMEM; + } + + for (in_index = 1; in_index <= in_num; in_index++) { + if (sensor_in_sub_single_create_kobj_and_attrs(parent, in_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = in_index - 1; i > 0; i--) { + sensor_in_sub_single_remove_kobj_and_attrs(i); + } + + if (g_sensor.in) { + kfree(g_sensor.in); + g_sensor.in = NULL; + } + return -EBADRQC; +} + +static int sensor_temp_sub_create(void) +{ + int ret, temp_num; + + check_p(g_drv->get_dev_number); + temp_num = g_drv->get_dev_number(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_TEMP); + g_sensor.temp_number = temp_num; + if (temp_num <= 0) { + SENSOR_DBG("Warning:sensor temp number = %d \n", temp_num); + return 0; + } + ret = sensor_temp_sub_create_kobj_and_attrs(&g_sensor_obj->kobj, temp_num); + return ret; +} + +static int sensor_in_sub_create(void) +{ + int ret, in_num; + + check_p(g_drv->get_dev_number); + in_num = g_drv->get_dev_number(WB_MAIN_DEV_MAINBOARD, WB_MINOR_DEV_IN); + g_sensor.in_number = in_num; + + if (in_num <= 0) { + SENSOR_DBG("Warning:sensor in number = %d \n", in_num); + return 0; + } + ret = sensor_in_sub_create_kobj_and_attrs(&g_sensor_obj->kobj, in_num); + return ret; +} + +static void temp_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_temp_t * curr_temp; + + curr_temp = &g_sensor.temp[index - 1]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &sensor_temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + SENSOR_DBG("delete sensor temp%d.\n", index); + } + return; +} + +static void in_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sensor_in_t * curr_in; + + curr_in = &g_sensor.in[index - 1]; + if (curr_in->obj) { + sysfs_remove_group(&curr_in->obj->kobj, &sensor_in_attr_group); + wb_plat_kobject_delete(&curr_in->obj); + SENSOR_DBG("delete sensor in%d.\n", index); + } + return; +} + +static void sensor_temp_sub_remove(void) +{ + unsigned int temp_index; + + if (g_sensor.temp) { + for (temp_index = g_sensor.temp_number; temp_index > 0; temp_index--) { + temp_sub_single_remove_kobj_and_attrs(temp_index); + } + kfree(g_sensor.temp); + g_sensor.temp = NULL; + } + return; +} + +static void sensor_in_sub_remove(void) +{ + unsigned int in_index; + + if (g_sensor.in) { + for (in_index = g_sensor.in_number; in_index > 0; in_index--) { + in_sub_single_remove_kobj_and_attrs(in_index); + } + kfree(g_sensor.in); + g_sensor.in = NULL; + } + return; +} + +static void sensor_sub_remove(void) +{ + sensor_temp_sub_remove(); + sensor_in_sub_remove(); +} + +static int sensor_sub_create(void) +{ + int ret; + /* temp creat */ + ret = sensor_temp_sub_create(); + if (ret < 0) { + goto temp_err; + } + /* Voltage creat */ + ret = sensor_in_sub_create(); + if (ret < 0) { + goto in_err; + } + return 0; +in_err: + sensor_temp_sub_remove(); +temp_err: + return ret; +} +static void sensor_root_remove(void) +{ + if (g_sensor_obj) { + sysfs_remove_group(&g_sensor_obj->kobj, &sensor_root_attr_group); + wb_plat_kobject_delete(&g_sensor_obj); + SENSOR_DBG("delete sensor root success\n"); + } + + return; +} + +static int sensor_root_create(void) +{ + g_sensor_obj = wb_plat_kobject_create("sensor", NULL); + if (!g_sensor_obj) { + SENSOR_ERR("wb_plat_kobject_create sensor error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_sensor_obj->kobj, &sensor_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_sensor_obj); + SENSOR_ERR("create sensor dir attrs error!\n"); + return -EBADRQC; + } + SENSOR_DBG("wb_plat_kobject_create sensor directory and attribute success.\n"); + return 0; +} + +static int wb_sensor_init(void) +{ + int ret; + + SENSOR_INFO("wb_sensor_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = sensor_root_create(); + if (ret < 0) { + goto sensor_root_error; + } + + ret = sensor_sub_create(); + if (ret < 0) { + goto sensor_sub_error; + } + SENSOR_INFO("sensor_init ok.\n"); + return 0; +sensor_sub_error: + sensor_root_remove(); +sensor_root_error: + return ret; +} + +static void wb_sensor_exit(void) +{ + sensor_sub_remove(); + sensor_root_remove(); + SENSOR_INFO("sensor_exit ok.\n"); + return; +} + +module_init(wb_sensor_init); +module_exit(wb_sensor_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("sensors sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c new file mode 100644 index 0000000000..8f09c551f6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_sff.c @@ -0,0 +1,291 @@ +/* + * plat_sff.c + * Original Author: support 2020-02-17 + * + * This module create sff kobjects and attributes in /sys/wb_plat/sff + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define SFF_INFO(fmt, args...) LOG_INFO("sff: ", fmt, ##args) +#define SFF_ERR(fmt, args...) LOG_ERR("sff: ", fmt, ##args) +#define SFF_DBG(fmt, args...) LOG_DBG("sff: ", fmt, ##args) + +struct sff_obj_t{ + struct switch_obj *sff_obj; + struct bin_attribute bin; + int sff_creat_bin_flag; +}; + +struct sff_t{ + unsigned int sff_number; + struct sff_obj_t *sff; +}; + +static int g_loglevel = 0; +static struct sff_t g_sff; +static struct switch_obj *g_sff_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t sff_cpld_info_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int sff_index; + int ret; + struct switch_device_attribute *sff_cpld_attr; + + check_p(g_drv); + check_p(g_drv->get_sff_cpld_info); + + sff_index = obj->index; + sff_cpld_attr = to_switch_device_attr(attr); + check_p(sff_cpld_attr); + SFF_DBG("sff_cpld_info_show, sff index:0x%x, sff cpld attr type:0x%x\n", sff_index, sff_cpld_attr->type); + ret = g_drv->get_sff_cpld_info(sff_index, sff_cpld_attr->type, buf, PAGE_SIZE); + if(ret < 0) { + SFF_ERR("sff_cpld_info_show error. sff index:0x%x, sff cpld attr type:0x%x, ret:%d\n", + sff_index, sff_cpld_attr->type,ret ); + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + SFF_DBG("sff_cpld_info_show ok. sff index:0x%x, sff cpld attr type:0x%x, ret:%d\n", sff_index, sff_cpld_attr->type, ret); + return ret; +} + +static ssize_t sff_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_sff.sff_number); +} + +/************************************sff attrs*******************************************/ +static struct switch_attribute sff_number_att = __ATTR(num_sffs, S_IRUGO, sff_number_show, NULL); +static SWITCH_DEVICE_ATTR(present, S_IRUGO, sff_cpld_info_show, NULL, WB_SFF_MODULE_PRESENT); + +/*******************************xcvr dir and attrs*******************************************/ +static struct attribute *xcvr_dir_attrs[] = { + &sff_number_att.attr, + NULL, +}; + +static struct attribute_group sff_xcvr_attr_group = { + .attrs = xcvr_dir_attrs, +}; + +/*******************************sff dir and attrs*******************************************/ +static struct attribute *sff_attrs[] = { + &switch_dev_attr_present.switch_attr.attr, + NULL, +}; + +static struct attribute_group sff_attr_group = { + .attrs = sff_attrs, +}; + +static int sff_sub_single_create_attrs(unsigned int index) +{ + struct sff_obj_t *curr_sff; + + curr_sff = &g_sff.sff[index-1]; + if (sysfs_create_group(&curr_sff->sff_obj->kobj, &sff_attr_group) != 0) { + SFF_ERR("create sff%d dir attrs error!\n", index); + wb_plat_kobject_delete(&curr_sff->sff_obj); + return -EBADRQC; + } + SFF_DBG("create sff%d dir attrs ok!\n", index); + return 0; +} + +static int sff_sub_single_create_kobj(struct kobject *parent, unsigned int index) +{ + struct sff_obj_t *curr_sff; + char sff_dir_name[DIR_NAME_MAX_LEN]; + int ret; + + check_p(g_drv->get_sff_dir_name); + ret = g_drv->get_sff_dir_name(index, sff_dir_name, sizeof(sff_dir_name)); + if (ret < 0) { + SFF_ERR("sff index:%d, get sff dir name error. please check sff config.\n", index); + return -ENOSYS; + } + + curr_sff = &g_sff.sff[index - 1]; + + curr_sff->sff_obj = wb_plat_kobject_create(sff_dir_name, parent); + if (!curr_sff->sff_obj) { + SFF_ERR("sff index:%d, create %s object error! \n", index, sff_dir_name); + return -EBADRQC; + } + + SFF_DBG("create sff kobj ok. sff index:%d, dir name:%s\n",index, sff_dir_name); + curr_sff->sff_obj->index = index; + + return 0; +} + +static void sff_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct sff_obj_t *curr_sff; + + curr_sff = &g_sff.sff[index - 1]; + /* remove sff dir and attr */ + if (curr_sff->sff_obj) { + SFF_DBG("delete sff%d attrs.\n", curr_sff->sff_obj->index); + curr_sff->sff_obj->index = 0; + sysfs_remove_group(&curr_sff->sff_obj->kobj, &sff_attr_group); + wb_plat_kobject_delete(&curr_sff->sff_obj); + } + + return; +} + +static int sff_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + int ret; + + ret = sff_sub_single_create_kobj(parent, index); + if (ret < 0) { + SFF_ERR("sff index:%d, create sff dir error.\n", index); + return ret; + } + + ret = sff_sub_single_create_attrs(index); + if (ret < 0) { + SFF_ERR("sff index:%d, create sff attr error.\n", index); + return ret; + } + return 0; +} + +static int sff_sub_create_kobj_and_attrs(struct kobject *parent, int sff_num) +{ + unsigned int sff_index, i; + + g_sff.sff = kzalloc(sizeof(struct sff_obj_t) * sff_num, GFP_KERNEL); + if (!g_sff.sff) { + SFF_ERR("kzalloc g_sff.sff error, sff number = %d.\n", sff_num); + return -ENOMEM; + } + + for (sff_index = 1; sff_index <= sff_num; sff_index++) { + if (sff_sub_single_create_kobj_and_attrs(parent, sff_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = sff_index - 1; i > 0; i--) { + sff_sub_single_remove_kobj_and_attrs(i); + } + if (g_sff.sff) { + kfree(g_sff.sff); + g_sff.sff = NULL; + } + return -EBADRQC; +} + +static int sff_sub_create(void) +{ + int ret, sff_num; + + check_p(g_drv->get_dev_number); + sff_num = g_drv->get_dev_number(WB_MAIN_DEV_SFF, WB_MINOR_DEV_NONE); + g_sff.sff_number = sff_num; + if (sff_num <= 0) { + SFF_ERR("ERROR. port number:%d\n", sff_num); + return -EINVAL; + } + + ret = sff_sub_create_kobj_and_attrs(&g_sff_obj->kobj, sff_num); + + return ret; +} + +static void sff_sub_remove(void) +{ + unsigned int sff_index; + + if (g_sff.sff) { + for (sff_index = g_sff.sff_number; sff_index > 0; sff_index--) { + sff_sub_single_remove_kobj_and_attrs(sff_index); + } + kfree(g_sff.sff); + } + mem_clear(&g_sff, sizeof(struct sff_t)); + return ; +} + +static int sff_xcvr_create(void) +{ + g_sff_obj = wb_plat_kobject_create(SFF_SYSFS_NAME, NULL); + if (!g_sff_obj) { + SFF_ERR("wb_plat_kobject_create sff error!\n"); + return -ENOMEM; + } + + g_sff_obj->index = 0; + if (sysfs_create_group(&g_sff_obj->kobj, &sff_xcvr_attr_group) != 0) { + wb_plat_kobject_delete(&g_sff_obj); + SFF_ERR("create sff dir attrs error!\n"); + return -EBADRQC; + } + SFF_DBG("wb_plat_kobject_create sff directory and attribute success.\n"); + return 0; +} + +static void sff_xcvr_remove(void) +{ + if (g_sff_obj) { + sysfs_remove_group(&g_sff_obj->kobj, &sff_xcvr_attr_group); + wb_plat_kobject_delete(&g_sff_obj); + SFF_DBG("delete sff root success\n"); + } + + return; +} + +static int wb_sff_init(void) +{ + int ret; + + SFF_INFO("wb_sff_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = sff_xcvr_create(); + if (ret < 0) { + goto sff_root_error; + } + + ret = sff_sub_create(); + if (ret < 0) { + goto sff_sub_error; + } + SFF_INFO("wb_sff_init ok.\n"); + return 0; + +sff_sub_error: + sff_xcvr_remove(); +sff_root_error: + return ret; +} + +static void wb_sff_exit(void) +{ + sff_sub_remove(); + sff_xcvr_remove(); + SFF_INFO("wb_sff_exit ok.\n"); + return ; +} + +module_init(wb_sff_init); +module_exit(wb_sff_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("sff sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c new file mode 100644 index 0000000000..97539a4c24 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_slot.c @@ -0,0 +1,667 @@ +/* + * plat_slot.c + * Original Author: support 2020-02-17 + * + * This module create sff kobjects and attributes in /sys/wb_plat/slot + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ + +#include + +#include "./include/plat_switch.h" +#include "./include/sysfs_common.h" + +#define SLOT_INFO(fmt, args...) LOG_INFO("slot: ", fmt, ##args) +#define SLOT_ERR(fmt, args...) LOG_ERR("slot: ", fmt, ##args) +#define SLOT_DBG(fmt, args...) LOG_DBG("slot: ", fmt, ##args) + +struct slot_temp_obj_t{ + struct switch_obj *obj; +}; + +struct slot_in_obj_t{ + struct switch_obj *obj; +}; + +struct slot_obj_t{ + unsigned int temp_number; + unsigned int in_number; + struct slot_temp_obj_t *temp; + struct slot_in_obj_t *in; + struct switch_obj *obj; +}; + +struct slot_t{ + unsigned int slot_number; + struct slot_obj_t *slot; +}; + +static int g_loglevel = 0; +static struct slot_t g_slot; +static struct switch_obj *g_slot_obj = NULL; +static struct switch_drivers_t *g_drv = NULL; + +static ssize_t slot_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_slot.slot_number); +} + +static ssize_t slot_temp_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int index; + + index = obj->index; + SLOT_DBG("slot_temp_number_show,slot index:%d\n",index); + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_slot.slot[index-1].temp_number); +} + +static ssize_t slot_in_number_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int index; + + index = obj->index; + SLOT_DBG("slot_in_number_show,slot index:%d\n",index); + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", g_slot.slot[index-1].in_number); +} + +static ssize_t slot_present_status_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int slot_index; + int ret; + + slot_index = obj->index; + SLOT_DBG("slot_present_status_show, slot index:%d\n",slot_index); + check_p(g_drv); + check_p(g_drv->get_slot_present_status); + + ret = g_drv->get_slot_present_status(slot_index); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + + return (ssize_t)snprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t slot_voltage_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int slot_index, in_index; + int ret; + struct switch_obj *p_obj; + struct switch_device_attribute *in_attr; + + check_p(g_drv); + check_p(g_drv->get_voltage_info); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + slot_index = p_obj->index; + in_index = obj->index; + + in_attr = to_switch_device_attr(attr); + check_p(in_attr); + SLOT_DBG("slot_voltage_show, slot index:0x%x, temp index:0x%x, temp type:0x%x\n",slot_index, in_index, in_attr->type); + ret = g_drv->get_voltage_info(WB_MAIN_DEV_SLOT, slot_index, in_index, in_attr->type, buf); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +static ssize_t slot_temp_show(struct switch_obj *obj, struct switch_attribute *attr, char *buf) +{ + unsigned int slot_index, temp_index; + int ret; + struct switch_obj *p_obj; + struct switch_device_attribute *temp_attr; + + check_p(g_drv); + check_p(g_drv->get_temp_info); + + p_obj = to_switch_obj(obj->kobj.parent); + check_p(p_obj); + + slot_index = p_obj->index; + temp_index = obj->index; + + temp_attr = to_switch_device_attr(attr); + check_p(temp_attr); + SLOT_DBG("slot_temp_show, slot index:0x%x, temp index:0x%x, temp type:0x%x\n",slot_index, temp_index, temp_attr->type); + ret = g_drv->get_temp_info(WB_MAIN_DEV_SLOT, slot_index, temp_index, temp_attr->type, buf); + if(ret < 0) { + return (ssize_t)snprintf(buf, PAGE_SIZE, "%s\n", WB_SYSFS_DEV_ERROR); + } + return ret; +} + +/************************************slot dir and attrs*******************************************/ +static struct switch_attribute slot_number_att = __ATTR(num_slots, S_IRUGO, slot_number_show, NULL); + +static struct attribute *slot_dir_attrs[] = { + &slot_number_att.attr, + NULL, +}; + +static struct attribute_group slot_root_attr_group = { + .attrs = slot_dir_attrs, +}; + +/*******************************slot1 slot2 dir and attrs*******************************************/ +static struct switch_attribute num_temp_sensors_att = __ATTR(num_temp_sensors, S_IRUGO, slot_temp_number_show, NULL); +static struct switch_attribute num_in_sensors_att = __ATTR(num_in_sensors, S_IRUGO, slot_in_number_show, NULL); +static struct switch_attribute slot_present_status_att = __ATTR(present, S_IRUGO, slot_present_status_show, NULL); + +static struct attribute *slot_attrs[] = { + &num_temp_sensors_att.attr, + &num_in_sensors_att.attr, + &slot_present_status_att.attr, + NULL, +}; + +static struct attribute_group slot_attr_group = { + .attrs = slot_attrs, +}; + +/*******************************temp dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(temp_alias, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(temp_type, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(temp_max, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(temp_max_hyst, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_MAX_HYST); +static SWITCH_DEVICE_ATTR(temp_min, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_MIN); +static SWITCH_DEVICE_ATTR(temp_input, S_IRUGO, slot_temp_show, NULL, WB_SENSOR_INPUT); + +static struct attribute *temp_attrs[] = { + &switch_dev_attr_temp_alias.switch_attr.attr, + &switch_dev_attr_temp_type.switch_attr.attr, + &switch_dev_attr_temp_max.switch_attr.attr, + &switch_dev_attr_temp_max_hyst.switch_attr.attr, + &switch_dev_attr_temp_min.switch_attr.attr, + &switch_dev_attr_temp_input.switch_attr.attr, + NULL, +}; + +static struct attribute_group temp_attr_group = { + .attrs = temp_attrs, +}; + +/*******************************Voltage dir and attrs*******************************************/ +static SWITCH_DEVICE_ATTR(in_alias, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_ALIAS); +static SWITCH_DEVICE_ATTR(in_type, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_TYPE); +static SWITCH_DEVICE_ATTR(in_max, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_MAX); +static SWITCH_DEVICE_ATTR(in_crit, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_CRIT); +static SWITCH_DEVICE_ATTR(in_min, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_MIN); +static SWITCH_DEVICE_ATTR(in_input, S_IRUGO, slot_voltage_show, NULL, WB_SENSOR_INPUT); + +static struct attribute *in_attrs[] = { + &switch_dev_attr_in_alias.switch_attr.attr, + &switch_dev_attr_in_type.switch_attr.attr, + &switch_dev_attr_in_max.switch_attr.attr, + &switch_dev_attr_in_crit.switch_attr.attr, + &switch_dev_attr_in_min.switch_attr.attr, + &switch_dev_attr_in_input.switch_attr.attr, + NULL, +}; + +static struct attribute_group in_attr_group = { + .attrs = in_attrs, +}; + +static void slotindex_single_temp_remove_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int temp_index) +{ + + struct slot_temp_obj_t *curr_temp; /* point to temp1 temp2...*/ + + curr_temp = &curr_slot->temp[temp_index - 1]; + if (curr_temp->obj) { + sysfs_remove_group(&curr_temp->obj->kobj, &temp_attr_group); + wb_plat_kobject_delete(&curr_temp->obj); + SLOT_DBG("delete slot:%d temp%d.\n", curr_slot->obj->index, temp_index); + } + return; +} + +static int slotindex_single_temp_create_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int temp_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct slot_temp_obj_t *curr_temp; /* point to temp1 temp2...*/ + + curr_temp = &curr_slot->temp[temp_index - 1]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d", TEMP_SYSFS_NAME, temp_index); + + curr_temp->obj = wb_plat_kobject_create(name, &curr_slot->obj->kobj); + if (!curr_temp->obj) { + SLOT_ERR("create slot_index:%d, temp%d object error!\n", curr_slot->obj->index, temp_index); + return -EBADRQC; + } + curr_temp->obj->index = temp_index; + if (sysfs_create_group(&curr_temp->obj->kobj, &temp_attr_group) != 0) { + SLOT_ERR("create slot_index:%d, temp%d attrs error.\n", curr_slot->obj->index, temp_index); + wb_plat_kobject_delete(&curr_temp->obj); + return -EBADRQC; + } + SLOT_DBG("create slot_index:%d, temp%d ok.\n", curr_slot->obj->index, temp_index); + return 0; +} + +static void slotindex_temp_remove_kobj_and_attrs(struct slot_obj_t * curr_slot) +{ + int temp_index; + + for(temp_index = curr_slot->temp_number; temp_index > 0; temp_index--) { + slotindex_single_temp_remove_kobj_and_attrs(curr_slot, temp_index); + } + + if(curr_slot->temp) { + kfree(curr_slot->temp); + curr_slot->temp = NULL; + curr_slot->temp_number = 0; + } + return; +} + +static int slotindex_temp_create_kobj_and_attrs(struct slot_obj_t * curr_slot, int temp_num) +{ + int temp_index, i; + + curr_slot->temp_number = temp_num; + curr_slot->temp = kzalloc(sizeof(struct slot_temp_obj_t) * temp_num, GFP_KERNEL); + if (!curr_slot->temp) { + SLOT_ERR("kzalloc slot temp error, slot index = %d, temp number = %d.\n", curr_slot->obj->index, temp_num); + return -ENOMEM; + } + + for (temp_index = 1; temp_index <= temp_num; temp_index++) { + if (slotindex_single_temp_create_kobj_and_attrs(curr_slot, temp_index) != 0) { + goto error; + } + } + return 0; +error: + for (i = temp_index - 1; i > 0; i--) { + slotindex_single_temp_remove_kobj_and_attrs(curr_slot, i); + } + + if (curr_slot->temp) { + kfree(curr_slot->temp); + curr_slot->temp = NULL; + curr_slot->temp_number = 0; + } + return -EBADRQC; +} + +static void slotindex_single_in_remove_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int in_index) +{ + + struct slot_in_obj_t *curr_in; /* point to in1 in2...*/ + + curr_in = &curr_slot->in[in_index - 1]; + if (curr_in->obj) { + sysfs_remove_group(&curr_in->obj->kobj, &in_attr_group); + wb_plat_kobject_delete(&curr_in->obj); + SLOT_DBG("delete slot:%d in%d.\n", curr_slot->obj->index, in_index); + } + return; +} + +static int slotindex_single_in_create_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int in_index) +{ + char name[DIR_NAME_MAX_LEN]; + struct slot_in_obj_t *curr_in; /* point to in1 in2...*/ + + curr_in = &curr_slot->in[in_index - 1]; + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d", VOLTAGE_SYSFS_NAME, in_index); + curr_in->obj = wb_plat_kobject_create(name, &curr_slot->obj->kobj); + if (!curr_in->obj) { + SLOT_ERR("create slot_index:%d, in%d object error!\n", curr_slot->obj->index, in_index); + return -EBADRQC; + } + curr_in->obj->index = in_index; + if (sysfs_create_group(&curr_in->obj->kobj, &in_attr_group) != 0) { + SLOT_ERR("create slot_index:%d, in%d attrs error.\n", curr_slot->obj->index, in_index); + wb_plat_kobject_delete(&curr_in->obj); + return -EBADRQC; + } + SLOT_DBG("create slot_index:%d, in%d ok.\n", curr_slot->obj->index, in_index); + return 0; +} + +static void slotindex_in_remove_kobj_and_attrs(struct slot_obj_t * curr_slot) +{ + int in_index; + + for(in_index = curr_slot->in_number; in_index > 0; in_index--) { + slotindex_single_in_remove_kobj_and_attrs(curr_slot, in_index); + } + + if(curr_slot->in) { + kfree(curr_slot->in); + curr_slot->in = NULL; + curr_slot->in_number = 0; + } + return; +} + +static int slotindex_in_create_kobj_and_attrs(struct slot_obj_t * curr_slot, int in_num) +{ + int in_index, i; + + curr_slot->in_number = in_num; + curr_slot->in = kzalloc(sizeof(struct slot_in_obj_t) * in_num, GFP_KERNEL); + if (!curr_slot->in) { + SLOT_ERR("kzalloc slot Voltage error, slot index = %d, Voltage number = %d.\n", curr_slot->obj->index, in_num); + return -ENOMEM; + } + + for (in_index = 1; in_index <= in_num; in_index++) { + if (slotindex_single_in_create_kobj_and_attrs(curr_slot, in_index) != 0 ) { + goto error; + } + } + return 0; +error: + for (i = in_index - 1; i > 0; i++) { + slotindex_single_in_remove_kobj_and_attrs(curr_slot, i); + } + + if (curr_slot->in) { + kfree(curr_slot->in); + curr_slot->in = NULL; + curr_slot->in_number = 0; + } + return -EBADRQC; +} + +static void slotindex_obj_remove_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int obj_id) +{ + switch (obj_id) { + case WB_MINOR_DEV_TEMP: + slotindex_temp_remove_kobj_and_attrs(curr_slot); + break; + case WB_MINOR_DEV_IN: + slotindex_in_remove_kobj_and_attrs(curr_slot); + break; + default: + SLOT_ERR("Unknow obj id:%d\n", obj_id); + } + return ; +} + +static int slotindex_obj_create_kobj_and_attrs(struct slot_obj_t * curr_slot, unsigned int obj_id, int obj_num) +{ + int ret; + + switch (obj_id) { + case WB_MINOR_DEV_TEMP: + ret = slotindex_temp_create_kobj_and_attrs(curr_slot, obj_num); + break; + case WB_MINOR_DEV_IN: + ret = slotindex_in_create_kobj_and_attrs(curr_slot, obj_num); + break; + default: + SLOT_ERR("Unknow obj id:%d\n", obj_id); + ret = -EINVAL; + } + return ret; +} + +static void slot_child_obj_remove_by_id(unsigned int obj_id) +{ + int slot_num; + unsigned int slot_index; + struct slot_obj_t *curr_slot; /* point to slot1 slot2...*/ + + slot_num = g_slot.slot_number; + if (slot_num <= 0 || !g_slot.slot) { + SLOT_DBG("Warning:slot number = %d\n", slot_num); + return; + } + + for(slot_index = slot_num; slot_index > 0; slot_index--) { + curr_slot = &g_slot.slot[slot_index - 1]; + slotindex_obj_remove_kobj_and_attrs(curr_slot, obj_id); + } + return; +} + +static int slot_child_obj_create_by_id(unsigned int obj_id) +{ + int slot_num, obj_num; + unsigned int slot_index, i; + struct slot_obj_t *curr_slot; /* point to slot1 slot2...*/ + + check_p(g_drv->get_dev_number); + obj_num = g_drv->get_dev_number(WB_MAIN_DEV_SLOT,obj_id); + slot_num = g_slot.slot_number; + if (obj_num <= 0 || slot_num <= 0 || !g_slot.slot) { + SLOT_DBG("Warning:slot number = %d, object number:%d.obj_id:%d\n", slot_num, obj_num, obj_id); + return 0; + } + + for (slot_index = 1; slot_index <= slot_num; slot_index++) { + curr_slot = &g_slot.slot[slot_index - 1]; + if (slotindex_obj_create_kobj_and_attrs(curr_slot, obj_id, obj_num) != 0) { + goto error; + } + } + return 0; +error: + for(i = slot_index - 1; i > 0; i++) { + curr_slot = &g_slot.slot[i - 1]; + slotindex_obj_remove_kobj_and_attrs(curr_slot, obj_id); + } + return -EBADRQC; +} + +static void slot_child_obj_remove(void) +{ + /* temp remove */ + slot_child_obj_remove_by_id(WB_MINOR_DEV_TEMP); + + /* in creat */ + slot_child_obj_remove_by_id(WB_MINOR_DEV_IN); + return; +} + +static int slot_child_obj_create(void) +{ + int ret; + + /* temp creat */ + ret = slot_child_obj_create_by_id(WB_MINOR_DEV_TEMP); + if (ret < 0) { + goto temp_err; + } + /* Voltage creat */ + ret = slot_child_obj_create_by_id(WB_MINOR_DEV_IN); + if(ret < 0) { + goto in_err; + } + return 0; +in_err: + slot_child_obj_remove_by_id(WB_MINOR_DEV_TEMP); +temp_err: + return ret; +} + +static void slot_sub_single_remove_kobj_and_attrs(unsigned int index) +{ + struct slot_obj_t *curr_slot; + + curr_slot = &g_slot.slot[index - 1]; + if (curr_slot->obj) { + sysfs_remove_group(&curr_slot->obj->kobj, &slot_attr_group); + wb_plat_kobject_delete(&curr_slot->obj); + SLOT_DBG("delete slot%d.\n", index); + } + return; +} + +static int slot_sub_single_create_kobj_and_attrs(struct kobject *parent, unsigned int index) +{ + char name[DIR_NAME_MAX_LEN]; + struct slot_obj_t *curr_slot; + + curr_slot = &g_slot.slot[index - 1]; + SLOT_DBG("create %s%d ...\n", SLOT_SYSFS_NAME, index); + mem_clear(name, sizeof(name)); + snprintf(name, sizeof(name), "%s%d", SLOT_SYSFS_NAME, index); + curr_slot->obj = wb_plat_kobject_create(name, parent); + if (!curr_slot->obj) { + SLOT_ERR("create slot%d object error!\n", index); + return -EBADRQC; + } + curr_slot->obj->index = index; + if (sysfs_create_group(&curr_slot->obj->kobj, &slot_attr_group) != 0) { + SLOT_ERR("create slot%d attrs error.\n", index); + wb_plat_kobject_delete(&curr_slot->obj); + return -EBADRQC; + } + SLOT_DBG("create slot%d ok.\n", index); + return 0; +} + +static int slot_sub_create_kobj_and_attrs(struct kobject *parent, int slot_num) +{ + unsigned int slot_index, i; + + g_slot.slot = kzalloc(sizeof(struct slot_obj_t) * slot_num, GFP_KERNEL); + if (!g_slot.slot) { + SLOT_ERR("kzalloc slot.slot error, slot number = %d.\n", slot_num); + return -ENOMEM; + } + + for (slot_index = 1; slot_index <= slot_num; slot_index++) { + if (slot_sub_single_create_kobj_and_attrs(parent, slot_index) != 0) { + goto error; + } + } + return 0; +error: + for (i = slot_index - 1; i > 0; i--) { + slot_sub_single_remove_kobj_and_attrs(i); + } + if (g_slot.slot) { + kfree(g_slot.slot); + g_slot.slot = NULL; + } + return -EBADRQC; +} + +/* create slot1 slot2...dir and attrs */ +static int slot_sub_create(void) +{ + int ret, slot_num; + + check_p(g_drv->get_dev_number); + slot_num = g_drv->get_dev_number(WB_MAIN_DEV_SLOT, WB_MINOR_DEV_NONE); + g_slot.slot_number = slot_num; + if (slot_num <= 0) { + SLOT_DBG("Warning:slot number = %d \n", slot_num); + return 0; + } + ret = slot_sub_create_kobj_and_attrs(&g_slot_obj->kobj, slot_num); + return ret; +} + +/** + * slot_sub_remove - delete slot1 slot2...dir and attrs + */ +static void slot_sub_remove(void) +{ + unsigned int slot_index; + + if (g_slot.slot) { + for (slot_index = g_slot.slot_number; slot_index > 0; slot_index--) { + slot_sub_single_remove_kobj_and_attrs(slot_index); + } + kfree(g_slot.slot); + } + mem_clear(&g_slot, sizeof(struct slot_t)); + return ; +} + +/* create slot dir and num_slots attr */ +static int slot_root_create(void) +{ + g_slot_obj = wb_plat_kobject_create(SLOT_SYSFS_NAME, NULL); + if (!g_slot_obj) { + SLOT_ERR("wb_plat_kobject_create slot error!\n"); + return -ENOMEM; + } + + if (sysfs_create_group(&g_slot_obj->kobj, &slot_root_attr_group) != 0) { + wb_plat_kobject_delete(&g_slot_obj); + SLOT_ERR("create slot dir attrs error!\n"); + return -EBADRQC; + } + SLOT_DBG("wb_plat_kobject_create slot directory and attribute success.\n"); + return 0; +} + +static void slot_root_remove(void) +{ + if (g_slot_obj) { + sysfs_remove_group(&g_slot_obj->kobj, &slot_root_attr_group); + wb_plat_kobject_delete(&g_slot_obj); + SLOT_DBG("delete slot root success\n"); + } + + return; +} + +static int wb_slot_init(void) +{ + int ret; + + SLOT_INFO("wb_slot_init...\n"); + g_drv = dfd_plat_driver_get(); + check_p(g_drv); + + ret = slot_root_create(); + if (ret < 0) { + goto slot_root_error; + } + + ret = slot_sub_create(); + if (ret < 0) { + goto slot_sub_error; + } + + ret = slot_child_obj_create(); + if (ret < 0) { + goto slot_child_obj_error; + } + + SLOT_INFO("wb_slot_init ok.\n"); + return 0; +slot_child_obj_error: + slot_sub_remove(); +slot_sub_error: + slot_root_remove(); +slot_root_error: + return ret; +} + +static void wb_slot_exit(void) +{ + slot_child_obj_remove(); + slot_sub_remove(); + slot_root_remove(); + SLOT_INFO("wb_slot_exit ok.\n"); + return ; +} + +module_init(wb_slot_init); +module_exit(wb_slot_exit); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("slot sysfs driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c new file mode 100644 index 0000000000..7c71fdb3bd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/plat_sysfs/dev_sysfs/plat_switch.c @@ -0,0 +1,135 @@ +/* + * plat_switch.c + * Original Author: support 2020-02-17 + * + * This module create a kset in sysfs called /sys/wb_plat + * Then other switch kobjects are created and assigned to this kset, + * such as "board", "cpld", "fan", "psu", "sff", ... + * + * History + * [Version] [Author] [Date] [Description] + * * v1.0 support 2020-02-17 Initial version + */ +#include "./include/plat_switch.h" + +#define SWITCH_INFO(fmt, args...) LOG_INFO("switch: ", fmt, ##args) +#define SWITCH_ERR(fmt, args...) LOG_ERR("switch: ", fmt, ##args) +#define SWITCH_DBG(fmt, args...) LOG_DBG("switch: ", fmt, ##args) + +static int g_loglevel = 0; + +static ssize_t switch_attr_show(struct kobject *kobj, + struct attribute *attr, char *buf) +{ + struct switch_attribute *attribute; + struct switch_obj *device; + + attribute = to_switch_attr(attr); + device = to_switch_obj(kobj); + + if (!attribute->show) + return -ENOSYS; + + return attribute->show(device, attribute, buf); +} + +static ssize_t switch_attr_store(struct kobject *kobj, + struct attribute *attr, const char *buf, size_t len) +{ + struct switch_attribute *attribute; + struct switch_obj *obj; + + attribute = to_switch_attr(attr); + obj = to_switch_obj(kobj); + + if (!attribute->store) + return -ENOSYS; + + return attribute->store(obj, attribute, buf, len); +} + +static const struct sysfs_ops switch_sysfs_ops = { + .show = switch_attr_show, + .store = switch_attr_store, +}; + +static void switch_obj_release(struct kobject *kobj) +{ + struct switch_obj *obj; + + obj = to_switch_obj(kobj); + kfree(obj); +} + +static struct kobj_type switch_ktype = { + .sysfs_ops = &switch_sysfs_ops, + .release = switch_obj_release, + .default_attrs = NULL, +}; + +static struct kset *switch_kset; + +struct switch_obj *wb_plat_kobject_create(const char *name, struct kobject *parent) +{ + struct switch_obj *obj = NULL; + int ret = 0; + + obj = kzalloc(sizeof(*obj), GFP_KERNEL); + if (!obj) { + SWITCH_DBG("wb_plat_kobject_create %s kzalloc error", name); + return NULL; + } + + obj->kobj.kset = switch_kset; + + ret = kobject_init_and_add(&obj->kobj, &switch_ktype, parent, "%s", name); + if (ret) { + kobject_put(&obj->kobj); + SWITCH_DBG("kobject_init_and_add %s error", name); + return NULL; + } + + return obj; +} + +void wb_plat_kobject_delete(struct switch_obj **obj) +{ + if (*obj) { + SWITCH_DBG("%s delete %s.\n", (*obj)->kobj.parent->name, (*obj)->kobj.name); + kobject_put(&((*obj)->kobj)); + *obj = NULL; + } +} + +static int __init switch_init(void) +{ + SWITCH_INFO("...\n"); + + switch_kset = kset_create_and_add("wb_plat", NULL, NULL); + if (!switch_kset) { + SWITCH_ERR("create switch_kset error.\n"); + return -ENOMEM; + } + + SWITCH_INFO("ok.\n"); + return 0; +} + +static void __exit switch_exit(void) +{ + if (switch_kset) { + kset_unregister(switch_kset); + } + + SWITCH_INFO("ok.\n"); +} + +module_init(switch_init); +module_exit(switch_exit); +EXPORT_SYMBOL(wb_plat_kobject_create); +EXPORT_SYMBOL(wb_plat_kobject_delete); +module_param(g_loglevel, int, 0644); +MODULE_PARM_DESC(g_loglevel, "the log level(info=0x1, err=0x2, dbg=0x4).\n"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("Switch driver"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h new file mode 100644 index 0000000000..9e4a4fae00 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common.h @@ -0,0 +1,74 @@ +#ifndef __PLATFORM_COMMON_H__ +#define __PLATFORM_COMMON_H__ + +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +typedef enum { + DBG_START, + DBG_VERBOSE, + DBG_KEY, + DBG_WARN, + DBG_ERROR, + DBG_END, +} dbg_level_t; + + typedef struct dfd_i2c_dev_s { + int bus; + int addr; + } dfd_i2c_dev_t; + +typedef struct dfd_dev_head_info_s { + uint8_t ver; + uint8_t flag; + uint8_t hw_ver; + uint8_t type; + int16_t tlv_len; +} dfd_dev_head_info_t; + +typedef struct dfd_dev_tlv_info_s { + uint8_t type; + uint8_t len; + uint8_t data[0]; +} dfd_dev_tlv_info_t; + +typedef enum dfd_dev_info_type_e { + DFD_DEV_INFO_TYPE_MAC = 1, + DFD_DEV_INFO_TYPE_NAME = 2, + DFD_DEV_INFO_TYPE_SN = 3, + DFD_DEV_INFO_TYPE_PWR_CONS = 4, + DFD_DEV_INFO_TYPE_HW_INFO = 5, + DFD_DEV_INFO_TYPE_DEV_TYPE = 6, +} dfd_dev_tlv_type_t; + +extern int debuglevel; +extern s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); +extern s32 platform_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, + u8 command, u8 length, u8 *values); +extern s32 platform_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command); + +#define DBG_DEBUG(fmt, arg...) do { \ + if ( debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ + printk(KERN_INFO "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else if ( debuglevel >= DBG_ERROR ) { \ + printk(KERN_ERR "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else { } \ +} while (0) + +#define DBG_INFO(fmt, arg...) do { \ + if ( debuglevel > DBG_KEY) { \ + printk(KERN_INFO "[INFO]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } \ + } while (0) + +#define DBG_ERROR(fmt, arg...) do { \ + if ( debuglevel > DBG_START) { \ + printk(KERN_ERR "[ERROR]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } \ + } while (0) + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c new file mode 100644 index 0000000000..62e04b7db8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/platform_common_module.c @@ -0,0 +1,210 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,152) +#include +#else +#include +#endif +#include +#include +#include +#include +#include "platform_common.h" +#include "dfd_tlveeprom.h" + +#define PLATFORM_I2C_RETRY_TIMES 3 + +#define DFD_TLVEEPROM_I2C_BUS (0) +#define DFD_TLVEEPROM_I2C_ADDR (0x56) +#define DFD_E2PROM_MAX_LEN (256) +#define DFD_CARDTYPE_EXT_TLVLEN (4) + +#define PLATFORM_CARDTYPE_RETRY_CNT (10) +#define PLATFORM_CARDTYPE_RETRY_TIMES (1000) + +int debuglevel = 0; +module_param(debuglevel, int, S_IRUGO | S_IWUSR); + +static int dfd_my_type = 0; +module_param(dfd_my_type, int, S_IRUGO | S_IWUSR); + +int g_common_debug_error = 0; +module_param(g_common_debug_error, int, S_IRUGO | S_IWUSR); + +int g_common_debug_verbose = 0; +module_param(g_common_debug_verbose, int, S_IRUGO | S_IWUSR); + +uint32_t dfd_my_type_i2c_bus = 0; +module_param(dfd_my_type_i2c_bus, int, S_IRUGO | S_IWUSR); + +uint32_t dfd_my_type_i2c_addr = 0; +module_param(dfd_my_type_i2c_addr, int, S_IRUGO | S_IWUSR); + +#define RUJIE_COMMON_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_common_debug_verbose) { \ + printk(KERN_ERR "[PLATFORM_COMMON][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define RUJIE_COMMON_DEBUG_ERROR(fmt, args...) do { \ + if (g_common_debug_error) { \ + printk(KERN_ERR "[PLATFORM_COMMON][ERROR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static int32_t dfd_i2c_read(char *dev, uint32_t addr, uint32_t offset_addr, unsigned char * +buf, int32_t size) +{ + struct file *fp; + struct i2c_client client; + int i ,j; + int rv; + s32 val_t; + + val_t = -1; + rv = 0; + fp = filp_open(dev, O_RDWR, S_IRUSR | S_IWUSR); + if (IS_ERR(fp)) { + DBG_ERROR("i2c open fail.\n"); + RUJIE_COMMON_DEBUG_ERROR("i2c open fail.\n"); + return -1; + } + memcpy(&client, fp->private_data, sizeof(struct i2c_client)); + client.addr = addr; + for (j = 0 ;j < size ;j++){ + for (i = 0; i < PLATFORM_I2C_RETRY_TIMES; i++) { + if ((val_t = i2c_smbus_read_byte_data(&client, (offset_addr + j)))< 0) { + DBG_DEBUG("read try(%d)time offset_addr:%x \n", i, offset_addr); + continue; + } else { + * (buf + j) = val_t; + break; + } + } + if (val_t < 0) { + rv = -1; + break; + } + } + filp_close(fp, NULL); + return rv; +} + +static int dfd_tlvinfo_get_cardtype(void) +{ + char i2c_path[16] = {0}; + int ret; + int cardtype; + u_int8_t eeprom[DFD_E2PROM_MAX_LEN]; + dfd_i2c_dev_t i2c_dev; + uint8_t buf[DFD_CARDTYPE_EXT_TLVLEN]; + uint8_t len; + dfd_tlv_type_t tlv_type; + + if (dfd_my_type_i2c_bus != 0) { + i2c_dev.bus = dfd_my_type_i2c_bus; + } else { + i2c_dev.bus = DFD_TLVEEPROM_I2C_BUS; + } + + if (dfd_my_type_i2c_addr != 0) { + i2c_dev.addr = dfd_my_type_i2c_addr; + } else { + i2c_dev.addr = DFD_TLVEEPROM_I2C_ADDR; + } + snprintf(i2c_path, sizeof(i2c_path), "/dev/i2c-%d", i2c_dev.bus); + RUJIE_COMMON_DEBUG_VERBOSE("Read device eeprom info:(dev:%s, addr:%02x).\n", i2c_path, i2c_dev.addr); + + ret = dfd_i2c_read(i2c_path, i2c_dev.addr, 0, eeprom, DFD_E2PROM_MAX_LEN); + if (ret != 0) { + DBG_ERROR("Read eeprom info error(dev: %s, addr: %02x).\n", i2c_path, i2c_dev.addr); + RUJIE_COMMON_DEBUG_ERROR("Read eeprom info error(dev: %s, addr: %02x).\n", i2c_path, i2c_dev.addr); + return ret; + } + + tlv_type.main_type = TLV_CODE_VENDOR_EXT; + tlv_type.ext_type = DFD_TLVINFO_EXT_TLV_TYPE_DEV_TYPE; + len = sizeof(buf); + mem_clear(buf, len); + ret = dfd_tlvinfo_get_e2prom_info(eeprom, DFD_E2PROM_MAX_LEN, &tlv_type, buf, &len); + if (ret) { + DBG_ERROR("dfd_tlvinfo_get_e2prom_info failed ret %d.\n", ret); + return -1; + } + for (ret = 0; ret < 4; ret++) { + DBG_DEBUG("buf 0x%02x.\n", buf[ret]); + } + + cardtype = ntohl(*((uint32_t *)buf)); + DBG_DEBUG("cardtype 0x%x.\n", cardtype); + return cardtype; +} + +static int __dfd_get_my_card_type(void) +{ + return dfd_tlvinfo_get_cardtype(); +} + +int dfd_get_my_card_type(void) +{ + int type; + int cnt; + + if (dfd_my_type != 0) { + DBG_DEBUG("my_type = 0x%x\r\n", dfd_my_type); + return dfd_my_type; + } + + cnt = PLATFORM_CARDTYPE_RETRY_CNT; + while (cnt--) { + type = __dfd_get_my_card_type(); + if (type < 0) { + RUJIE_COMMON_DEBUG_ERROR("__dfd_get_my_card_type fail cnt %d, ret %d.\n", cnt, type); + msleep(PLATFORM_CARDTYPE_RETRY_TIMES); + continue; + } + RUJIE_COMMON_DEBUG_VERBOSE("success to get type 0x%x.\n", type); + break; + } + + dfd_my_type = type; + return dfd_my_type; +} +EXPORT_SYMBOL(dfd_get_my_card_type); + +static int __init platform_common_init(void) +{ + int ret; + + RUJIE_COMMON_DEBUG_VERBOSE("Enter.\n"); + ret = dfd_get_my_card_type(); + if (ret <= 0) { + RUJIE_COMMON_DEBUG_ERROR("dfd_get_my_card_type failed, ret %d.\n", ret); + printk(KERN_ERR "Warning: Device type get failed, please check the TLV-EEPROM!\n"); + return -1; + } + + RUJIE_COMMON_DEBUG_VERBOSE("Leave success type 0x%x.\n", ret); + return 0; +} + +static void __exit platform_common_exit(void) +{ + RUJIE_COMMON_DEBUG_VERBOSE("Exit.\n"); +} + +module_init(platform_common_init); +module_exit(platform_common_exit); + +MODULE_DESCRIPTION("Platform Support"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h deleted file mode 100755 index cd5550ab41..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/pmbus.h +++ /dev/null @@ -1,520 +0,0 @@ -/* - * pmbus.h - Common defines and structures for PMBus devices - * - * Copyright (c) 2010, 2011 Ericsson AB. - * Copyright (c) 2012 Guenter Roeck - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef PMBUS_H -#define PMBUS_H - -#include -#include -#include - -/* - * Registers - */ -enum pmbus_regs { - PMBUS_PAGE = 0x00, - PMBUS_OPERATION = 0x01, - PMBUS_ON_OFF_CONFIG = 0x02, - PMBUS_CLEAR_FAULTS = 0x03, - PMBUS_PHASE = 0x04, - - PMBUS_WRITE_PROTECT = 0x10, - - PMBUS_CAPABILITY = 0x19, - PMBUS_QUERY = 0x1A, - - PMBUS_VOUT_MODE = 0x20, - PMBUS_VOUT_COMMAND = 0x21, - PMBUS_VOUT_TRIM = 0x22, - PMBUS_VOUT_CAL_OFFSET = 0x23, - PMBUS_VOUT_MAX = 0x24, - PMBUS_VOUT_MARGIN_HIGH = 0x25, - PMBUS_VOUT_MARGIN_LOW = 0x26, - PMBUS_VOUT_TRANSITION_RATE = 0x27, - PMBUS_VOUT_DROOP = 0x28, - PMBUS_VOUT_SCALE_LOOP = 0x29, - PMBUS_VOUT_SCALE_MONITOR = 0x2A, - - PMBUS_COEFFICIENTS = 0x30, - PMBUS_POUT_MAX = 0x31, - - PMBUS_FAN_CONFIG_12 = 0x3A, - PMBUS_FAN_COMMAND_1 = 0x3B, - PMBUS_FAN_COMMAND_2 = 0x3C, - PMBUS_FAN_CONFIG_34 = 0x3D, - PMBUS_FAN_COMMAND_3 = 0x3E, - PMBUS_FAN_COMMAND_4 = 0x3F, - - PMBUS_VOUT_OV_FAULT_LIMIT = 0x40, - PMBUS_VOUT_OV_FAULT_RESPONSE = 0x41, - PMBUS_VOUT_OV_WARN_LIMIT = 0x42, - PMBUS_VOUT_UV_WARN_LIMIT = 0x43, - PMBUS_VOUT_UV_FAULT_LIMIT = 0x44, - PMBUS_VOUT_UV_FAULT_RESPONSE = 0x45, - PMBUS_IOUT_OC_FAULT_LIMIT = 0x46, - PMBUS_IOUT_OC_FAULT_RESPONSE = 0x47, - PMBUS_IOUT_OC_LV_FAULT_LIMIT = 0x48, - PMBUS_IOUT_OC_LV_FAULT_RESPONSE = 0x49, - PMBUS_IOUT_OC_WARN_LIMIT = 0x4A, - PMBUS_IOUT_UC_FAULT_LIMIT = 0x4B, - PMBUS_IOUT_UC_FAULT_RESPONSE = 0x4C, - - PMBUS_OT_FAULT_LIMIT = 0x4F, - PMBUS_OT_FAULT_RESPONSE = 0x50, - PMBUS_OT_WARN_LIMIT = 0x51, - PMBUS_UT_WARN_LIMIT = 0x52, - PMBUS_UT_FAULT_LIMIT = 0x53, - PMBUS_UT_FAULT_RESPONSE = 0x54, - PMBUS_VIN_OV_FAULT_LIMIT = 0x55, - PMBUS_VIN_OV_FAULT_RESPONSE = 0x56, - PMBUS_VIN_OV_WARN_LIMIT = 0x57, - PMBUS_VIN_UV_WARN_LIMIT = 0x58, - PMBUS_VIN_UV_FAULT_LIMIT = 0x59, - - PMBUS_IIN_OC_FAULT_LIMIT = 0x5B, - PMBUS_IIN_OC_WARN_LIMIT = 0x5D, - - PMBUS_POUT_OP_FAULT_LIMIT = 0x68, - PMBUS_POUT_OP_WARN_LIMIT = 0x6A, - PMBUS_PIN_OP_WARN_LIMIT = 0x6B, - - PMBUS_STATUS_BYTE = 0x78, - PMBUS_STATUS_WORD = 0x79, - PMBUS_STATUS_VOUT = 0x7A, - PMBUS_STATUS_IOUT = 0x7B, - PMBUS_STATUS_INPUT = 0x7C, - PMBUS_STATUS_TEMPERATURE = 0x7D, - PMBUS_STATUS_CML = 0x7E, - PMBUS_STATUS_OTHER = 0x7F, - PMBUS_STATUS_MFR_SPECIFIC = 0x80, - PMBUS_STATUS_FAN_12 = 0x81, - PMBUS_STATUS_FAN_34 = 0x82, - - PMBUS_READ_VIN = 0x88, - PMBUS_READ_IIN = 0x89, - PMBUS_READ_VCAP = 0x8A, - PMBUS_READ_VOUT = 0x8B, - PMBUS_READ_IOUT = 0x8C, - PMBUS_READ_TEMPERATURE_1 = 0x8D, - PMBUS_READ_TEMPERATURE_2 = 0x8E, - PMBUS_READ_TEMPERATURE_3 = 0x8F, - PMBUS_READ_FAN_SPEED_1 = 0x90, - PMBUS_READ_FAN_SPEED_2 = 0x91, - PMBUS_READ_FAN_SPEED_3 = 0x92, - PMBUS_READ_FAN_SPEED_4 = 0x93, - PMBUS_READ_DUTY_CYCLE = 0x94, - PMBUS_READ_FREQUENCY = 0x95, - PMBUS_READ_POUT = 0x96, - PMBUS_READ_PIN = 0x97, - - PMBUS_REVISION = 0x98, - PMBUS_MFR_ID = 0x99, - PMBUS_MFR_MODEL = 0x9A, - PMBUS_MFR_REVISION = 0x9B, - PMBUS_MFR_LOCATION = 0x9C, - PMBUS_MFR_DATE = 0x9D, - PMBUS_MFR_SERIAL = 0x9E, - - PMBUS_MFR_VIN_MIN = 0xA0, - PMBUS_MFR_VIN_MAX = 0xA1, - PMBUS_MFR_IIN_MAX = 0xA2, - PMBUS_MFR_PIN_MAX = 0xA3, - PMBUS_MFR_VOUT_MIN = 0xA4, - PMBUS_MFR_VOUT_MAX = 0xA5, - PMBUS_MFR_IOUT_MAX = 0xA6, - PMBUS_MFR_POUT_MAX = 0xA7, - - PMBUS_IC_DEVICE_ID = 0xAD, - PMBUS_IC_DEVICE_REV = 0xAE, - - PMBUS_MFR_MAX_TEMP_1 = 0xC0, - PMBUS_MFR_MAX_TEMP_2 = 0xC1, - PMBUS_MFR_MAX_TEMP_3 = 0xC2, - - - /* - * Virtual registers. - * Useful to support attributes which are not supported by standard PMBus - * registers but exist as manufacturer specific registers on individual chips. - * Must be mapped to real registers in device specific code. - * - * Semantics: - * Virtual registers are all word size. - * READ registers are read-only; writes are either ignored or return an error. - * RESET registers are read/write. Reading reset registers returns zero - * (used for detection), writing any value causes the associated history to be - * reset. - * Virtual registers have to be handled in device specific driver code. Chip - * driver code returns non-negative register values if a virtual register is - * supported, or a negative error code if not. The chip driver may return - * -ENODATA or any other error code in this case, though an error code other - * than -ENODATA is handled more efficiently and thus preferred. Either case, - * the calling PMBus core code will abort if the chip driver returns an error - * code when reading or writing virtual registers. - */ - PMBUS_VIRT_BASE = 0x100, - PMBUS_VIRT_READ_TEMP_AVG, - PMBUS_VIRT_READ_TEMP_MIN, - PMBUS_VIRT_READ_TEMP_MAX, - PMBUS_VIRT_RESET_TEMP_HISTORY, - PMBUS_VIRT_READ_VIN_AVG, - PMBUS_VIRT_READ_VIN_MIN, - PMBUS_VIRT_READ_VIN_MAX, - PMBUS_VIRT_RESET_VIN_HISTORY, - PMBUS_VIRT_READ_IIN_AVG, - PMBUS_VIRT_READ_IIN_MIN, - PMBUS_VIRT_READ_IIN_MAX, - PMBUS_VIRT_RESET_IIN_HISTORY, - PMBUS_VIRT_READ_PIN_AVG, - PMBUS_VIRT_READ_PIN_MIN, - PMBUS_VIRT_READ_PIN_MAX, - PMBUS_VIRT_RESET_PIN_HISTORY, - PMBUS_VIRT_READ_POUT_AVG, - PMBUS_VIRT_READ_POUT_MIN, - PMBUS_VIRT_READ_POUT_MAX, - PMBUS_VIRT_RESET_POUT_HISTORY, - PMBUS_VIRT_READ_VOUT_AVG, - PMBUS_VIRT_READ_VOUT_MIN, - PMBUS_VIRT_READ_VOUT_MAX, - PMBUS_VIRT_RESET_VOUT_HISTORY, - PMBUS_VIRT_READ_IOUT_AVG, - PMBUS_VIRT_READ_IOUT_MIN, - PMBUS_VIRT_READ_IOUT_MAX, - PMBUS_VIRT_RESET_IOUT_HISTORY, - PMBUS_VIRT_READ_TEMP2_AVG, - PMBUS_VIRT_READ_TEMP2_MIN, - PMBUS_VIRT_READ_TEMP2_MAX, - PMBUS_VIRT_RESET_TEMP2_HISTORY, - - PMBUS_VIRT_READ_VMON, - PMBUS_VIRT_VMON_UV_WARN_LIMIT, - PMBUS_VIRT_VMON_OV_WARN_LIMIT, - PMBUS_VIRT_VMON_UV_FAULT_LIMIT, - PMBUS_VIRT_VMON_OV_FAULT_LIMIT, - PMBUS_VIRT_STATUS_VMON, - - /* - * RPM and PWM Fan control - * - * Drivers wanting to expose PWM control must define the behaviour of - * PMBUS_VIRT_PWM_[1-4] and PMBUS_VIRT_PWM_ENABLE_[1-4] in the - * {read,write}_word_data callback. - * - * pmbus core provides a default implementation for - * PMBUS_VIRT_FAN_TARGET_[1-4]. - * - * TARGET, PWM and PWM_ENABLE members must be defined sequentially; - * pmbus core uses the difference between the provided register and - * it's _1 counterpart to calculate the FAN/PWM ID. - */ - PMBUS_VIRT_FAN_TARGET_1, - PMBUS_VIRT_FAN_TARGET_2, - PMBUS_VIRT_FAN_TARGET_3, - PMBUS_VIRT_FAN_TARGET_4, - PMBUS_VIRT_PWM_1, - PMBUS_VIRT_PWM_2, - PMBUS_VIRT_PWM_3, - PMBUS_VIRT_PWM_4, - PMBUS_VIRT_PWM_ENABLE_1, - PMBUS_VIRT_PWM_ENABLE_2, - PMBUS_VIRT_PWM_ENABLE_3, - PMBUS_VIRT_PWM_ENABLE_4, - /* Samples for average - * - * Drivers wanting to expose functionality for changing the number of - * samples used for average values should implement support in - * {read,write}_word_data callback for either PMBUS_VIRT_SAMPLES if it - * applies to all types of measurements, or any number of specific - * PMBUS_VIRT_*_SAMPLES registers to allow for individual control. - */ - PMBUS_VIRT_SAMPLES, - PMBUS_VIRT_IN_SAMPLES, - PMBUS_VIRT_CURR_SAMPLES, - PMBUS_VIRT_POWER_SAMPLES, - PMBUS_VIRT_TEMP_SAMPLES, -}; - -/* - * OPERATION - */ -#define PB_OPERATION_CONTROL_ON BIT(7) - -/* - * WRITE_PROTECT - */ -#define PB_WP_ALL BIT(7) /* all but WRITE_PROTECT */ -#define PB_WP_OP BIT(6) /* all but WP, OPERATION, PAGE */ -#define PB_WP_VOUT BIT(5) /* all but WP, OPERATION, PAGE, VOUT, ON_OFF */ - -#define PB_WP_ANY (PB_WP_ALL | PB_WP_OP | PB_WP_VOUT) - -/* - * CAPABILITY - */ -#define PB_CAPABILITY_SMBALERT BIT(4) -#define PB_CAPABILITY_ERROR_CHECK BIT(7) - -/* - * VOUT_MODE - */ -#define PB_VOUT_MODE_MODE_MASK 0xe0 -#define PB_VOUT_MODE_PARAM_MASK 0x1f - -#define PB_VOUT_MODE_LINEAR 0x00 -#define PB_VOUT_MODE_VID 0x20 -#define PB_VOUT_MODE_DIRECT 0x40 - -/* - * Fan configuration - */ -#define PB_FAN_2_PULSE_MASK (BIT(0) | BIT(1)) -#define PB_FAN_2_RPM BIT(2) -#define PB_FAN_2_INSTALLED BIT(3) -#define PB_FAN_1_PULSE_MASK (BIT(4) | BIT(5)) -#define PB_FAN_1_RPM BIT(6) -#define PB_FAN_1_INSTALLED BIT(7) - -enum pmbus_fan_mode { percent = 0, rpm }; - -/* - * STATUS_BYTE, STATUS_WORD (lower) - */ -#define PB_STATUS_NONE_ABOVE BIT(0) -#define PB_STATUS_CML BIT(1) -#define PB_STATUS_TEMPERATURE BIT(2) -#define PB_STATUS_VIN_UV BIT(3) -#define PB_STATUS_IOUT_OC BIT(4) -#define PB_STATUS_VOUT_OV BIT(5) -#define PB_STATUS_OFF BIT(6) -#define PB_STATUS_BUSY BIT(7) - -/* - * STATUS_WORD (upper) - */ -#define PB_STATUS_UNKNOWN BIT(8) -#define PB_STATUS_OTHER BIT(9) -#define PB_STATUS_FANS BIT(10) -#define PB_STATUS_POWER_GOOD_N BIT(11) -#define PB_STATUS_WORD_MFR BIT(12) -#define PB_STATUS_INPUT BIT(13) -#define PB_STATUS_IOUT_POUT BIT(14) -#define PB_STATUS_VOUT BIT(15) - -/* - * STATUS_IOUT - */ -#define PB_POUT_OP_WARNING BIT(0) -#define PB_POUT_OP_FAULT BIT(1) -#define PB_POWER_LIMITING BIT(2) -#define PB_CURRENT_SHARE_FAULT BIT(3) -#define PB_IOUT_UC_FAULT BIT(4) -#define PB_IOUT_OC_WARNING BIT(5) -#define PB_IOUT_OC_LV_FAULT BIT(6) -#define PB_IOUT_OC_FAULT BIT(7) - -/* - * STATUS_VOUT, STATUS_INPUT - */ -#define PB_VOLTAGE_UV_FAULT BIT(4) -#define PB_VOLTAGE_UV_WARNING BIT(5) -#define PB_VOLTAGE_OV_WARNING BIT(6) -#define PB_VOLTAGE_OV_FAULT BIT(7) - -/* - * STATUS_INPUT - */ -#define PB_PIN_OP_WARNING BIT(0) -#define PB_IIN_OC_WARNING BIT(1) -#define PB_IIN_OC_FAULT BIT(2) - -/* - * STATUS_TEMPERATURE - */ -#define PB_TEMP_UT_FAULT BIT(4) -#define PB_TEMP_UT_WARNING BIT(5) -#define PB_TEMP_OT_WARNING BIT(6) -#define PB_TEMP_OT_FAULT BIT(7) - -/* - * STATUS_FAN - */ -#define PB_FAN_AIRFLOW_WARNING BIT(0) -#define PB_FAN_AIRFLOW_FAULT BIT(1) -#define PB_FAN_FAN2_SPEED_OVERRIDE BIT(2) -#define PB_FAN_FAN1_SPEED_OVERRIDE BIT(3) -#define PB_FAN_FAN2_WARNING BIT(4) -#define PB_FAN_FAN1_WARNING BIT(5) -#define PB_FAN_FAN2_FAULT BIT(6) -#define PB_FAN_FAN1_FAULT BIT(7) - -/* - * CML_FAULT_STATUS - */ -#define PB_CML_FAULT_OTHER_MEM_LOGIC BIT(0) -#define PB_CML_FAULT_OTHER_COMM BIT(1) -#define PB_CML_FAULT_PROCESSOR BIT(3) -#define PB_CML_FAULT_MEMORY BIT(4) -#define PB_CML_FAULT_PACKET_ERROR BIT(5) -#define PB_CML_FAULT_INVALID_DATA BIT(6) -#define PB_CML_FAULT_INVALID_COMMAND BIT(7) - -enum pmbus_sensor_classes { - PSC_VOLTAGE_IN = 0, - PSC_VOLTAGE_OUT, - PSC_CURRENT_IN, - PSC_CURRENT_OUT, - PSC_POWER, - PSC_TEMPERATURE, - PSC_FAN, - PSC_PWM, - PSC_NUM_CLASSES /* Number of power sensor classes */ -}; - -#define PMBUS_PAGES 32 /* Per PMBus specification */ -#define PMBUS_PHASES 8 /* Maximum number of phases per page */ -/* Functionality bit mask */ -#define PMBUS_HAVE_VIN BIT(0) -#define PMBUS_HAVE_VCAP BIT(1) -#define PMBUS_HAVE_VOUT BIT(2) -#define PMBUS_HAVE_IIN BIT(3) -#define PMBUS_HAVE_IOUT BIT(4) -#define PMBUS_HAVE_PIN BIT(5) -#define PMBUS_HAVE_POUT BIT(6) -#define PMBUS_HAVE_FAN12 BIT(7) -#define PMBUS_HAVE_FAN34 BIT(8) -#define PMBUS_HAVE_TEMP BIT(9) -#define PMBUS_HAVE_TEMP2 BIT(10) -#define PMBUS_HAVE_TEMP3 BIT(11) -#define PMBUS_HAVE_STATUS_VOUT BIT(12) -#define PMBUS_HAVE_STATUS_IOUT BIT(13) -#define PMBUS_HAVE_STATUS_INPUT BIT(14) -#define PMBUS_HAVE_STATUS_TEMP BIT(15) -#define PMBUS_HAVE_STATUS_FAN12 BIT(16) -#define PMBUS_HAVE_STATUS_FAN34 BIT(17) -#define PMBUS_HAVE_VMON BIT(18) -#define PMBUS_HAVE_STATUS_VMON BIT(19) -#define PMBUS_HAVE_PWM12 BIT(20) -#define PMBUS_HAVE_PWM34 BIT(21) -#define PMBUS_HAVE_SAMPLES BIT(22) -#define PMBUS_PHASE_VIRTUAL BIT(30) -#define PMBUS_PAGE_VIRTUAL BIT(31) - -enum pmbus_data_format { linear = 0, direct, vid }; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -enum vrm_version { vr11 = 0, vr12, vr13, imvp9, amd625mv }; -#else -enum vrm_version { vr11 = 0, vr12, vr13 }; -#endif - -struct pmbus_driver_info { - int pages; /* Total number of pages */ - enum pmbus_data_format format[PSC_NUM_CLASSES]; - enum vrm_version vrm_version[PMBUS_PAGES]; - u8 phases[PMBUS_PAGES];/* Number of phases per page */ - u32 pfunc[PMBUS_PHASES];/* Functionality, per phase */ - /* - * Support one set of coefficients for each sensor type - * Used for chips providing data in direct mode. - */ - int m[PSC_NUM_CLASSES]; /* mantissa for direct data format */ - int b[PSC_NUM_CLASSES]; /* offset */ - int R[PSC_NUM_CLASSES]; /* exponent */ - - u32 func[PMBUS_PAGES]; /* Functionality, per page */ - /* - * The following functions map manufacturing specific register values - * to PMBus standard register values. Specify only if mapping is - * necessary. - * Functions return the register value (read) or zero (write) if - * successful. A return value of -ENODATA indicates that there is no - * manufacturer specific register, but that a standard PMBus register - * may exist. Any other negative return value indicates that the - * register does not exist, and that no attempt should be made to read - * the standard register. - */ - int (*read_byte_data)(struct i2c_client *client, int page, int reg); - int (*read_word_data)(struct i2c_client *client, int page, int reg); - int (*write_word_data)(struct i2c_client *client, int page, int reg, - u16 word); - int (*write_byte)(struct i2c_client *client, int page, u8 value); - /* - * The identify function determines supported PMBus functionality. - * This function is only necessary if a chip driver supports multiple - * chips, and the chip functionality is not pre-determined. - */ - int (*identify)(struct i2c_client *client, - struct pmbus_driver_info *info); - - /* Regulator functionality, if supported by this chip driver. */ - int num_regulators; - const struct regulator_desc *reg_desc; - const struct attribute_group **groups; -}; - -/* Regulator ops */ - -extern const struct regulator_ops pmbus_regulator_ops; - -/* Macro for filling in array of struct regulator_desc */ -#define PMBUS_REGULATOR(_name, _id) \ - [_id] = { \ - .name = (_name # _id), \ - .id = (_id), \ - .of_match = of_match_ptr(_name # _id), \ - .regulators_node = of_match_ptr("regulators"), \ - .ops = &pmbus_regulator_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - } - -/* Function declarations */ - -void pmbus_clear_cache(struct i2c_client *client); -int pmbus_set_page(struct i2c_client *client, int page); -int pmbus_read_word_data(struct i2c_client *client, int page, u8 reg); -int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg, u16 word); -int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); -int pmbus_write_byte(struct i2c_client *client, int page, u8 value); -int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, - u8 value); -int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg, - u8 mask, u8 value); -void pmbus_clear_faults(struct i2c_client *client); -bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg); -bool pmbus_check_word_register(struct i2c_client *client, int page, int reg); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) -int pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info); -#else -int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, - struct pmbus_driver_info *info); -#endif -int pmbus_do_remove(struct i2c_client *client); -const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client - *client); -int pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id, - enum pmbus_fan_mode mode); -int pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id, - enum pmbus_fan_mode mode); -int pmbus_update_fan(struct i2c_client *client, int page, int id, - u8 config, u8 mask, u16 command); -struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client); - -#endif /* PMBUS_H */ diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c deleted file mode 100755 index f28852ec33..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_common_module.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int dfd_my_type = 0; -module_param(dfd_my_type, int, S_IRUGO | S_IWUSR); - -int g_common_debug_error = 0; -module_param(g_common_debug_error, int, S_IRUGO | S_IWUSR); - -int g_common_debug_verbose = 0; -module_param(g_common_debug_verbose, int, S_IRUGO | S_IWUSR); - -#define RAGILE_COMMON_DEBUG_VERBOSE(fmt, args...) do { \ - if (g_common_debug_verbose) { \ - printk(KERN_ERR "[RAGILE_COMMON][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - -#define RAGILE_COMMON_DEBUG_ERROR(fmt, args...) do { \ - if (g_common_debug_error) { \ - printk(KERN_ERR "[RAGILE_COMMON][ERROR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ - } \ -} while (0) - - -int dfd_get_my_card_type(void) -{ - if (dfd_my_type != 0) { - RAGILE_COMMON_DEBUG_VERBOSE("my_type = 0x%x\r\n", dfd_my_type); - return dfd_my_type; - } - - return -1; -} -EXPORT_SYMBOL(dfd_get_my_card_type); - -static int __init ragile_common_init(void) -{ - int ret; - - RAGILE_COMMON_DEBUG_VERBOSE("Enter.\n"); - ret = dfd_get_my_card_type(); - if (ret <= 0) { - RAGILE_COMMON_DEBUG_ERROR("dfd_get_my_card_type failed, ret %d.\n", ret); - printk(KERN_ERR "Warning: Device type get failed, please check the TLV-EEPROM!\n"); - return -1; - } - - RAGILE_COMMON_DEBUG_VERBOSE("Leave success type 0x%x.\n", ret); - return 0; -} - -static void __exit ragile_common_exit(void) -{ - RAGILE_COMMON_DEBUG_VERBOSE("Exit.\n"); -} - -module_init(ragile_common_init); -module_exit(ragile_common_exit); - -MODULE_DESCRIPTION("ragile Platform Support"); -MODULE_AUTHOR("support "); -MODULE_LICENSE("GPL"); - diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c deleted file mode 100755 index 5d9908f8c3..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/ragile_platform.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ragile_platform.c - A driver for ragile platform module - * - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define PLATFORM_I2C_RETRY_TIMES (3) - -s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < PLATFORM_I2C_RETRY_TIMES; try ++) { - if ((ret = i2c_smbus_read_byte_data(client, command)) >= 0) - break; - } - return ret; -} -EXPORT_SYMBOL(platform_i2c_smbus_read_byte_data); - -s32 platform_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, - u8 command, u8 length, u8 *values) -{ - int try ; - s32 ret; - - ret = -1; - for (try = 0; try < PLATFORM_I2C_RETRY_TIMES; try ++) { - if ((ret = i2c_smbus_read_i2c_block_data(client, command, length, values)) >= 0) - break; - } - return ret; -} -EXPORT_SYMBOL(platform_i2c_smbus_read_i2c_block_data); - -s32 platform_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < PLATFORM_I2C_RETRY_TIMES; try ++) { - if ((ret = i2c_smbus_read_word_data(client, command)) >= 0) - break; - } - return ret; -} -EXPORT_SYMBOL(platform_i2c_smbus_read_word_data); - -static int __init ragile_platform_init(void) -{ - return 0; -} - -static void __exit ragile_platform_exit(void) -{ - return; -} - -module_init(ragile_platform_init); -module_exit(ragile_platform_exit); - -MODULE_DESCRIPTION("ragile Platform Support"); -MODULE_AUTHOR("support "); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c deleted file mode 100755 index 84b62c50ab..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-gpio-xeon.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * GPIO interface for XEON Super I/O chip - * - * Author: support - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License 2 as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define GPIO_NAME "xeon-gpio" -#define GPIO_IOSIZE 7 -#define GPIO_BASE 0x500 - -#define GPIO_USE_SEL GPIO_BASE -#define GP_IO_SEL (GPIO_BASE+0x4) -#define GP_LVL (GPIO_BASE+0xC) - -#define GPIO_USE_SEL2 (GPIO_BASE+0x30) -#define GP_IO_SEL2 (GPIO_BASE+0x34) -#define GP_LVL2 (GPIO_BASE+0x38) - -#define GPIO_USE_SEL3 (GPIO_BASE+0x40) -#define GP_IO_SEL3 (GPIO_BASE+0x44) -#define GP_LVL3 (GPIO_BASE+0x48) - - -#define GPIO_BASE_ID 0 -#define BANKSIZE 32 - -#define GPIO_SDA 17 -#define GPIO_SCL 1 - -#define GPIO_XEON_SPIN_LOCK(lock, flags) spin_lock_irqsave(&(lock), (flags)) -#define GPIO_XEON_SPIN_UNLOCK(lock, flags) spin_unlock_irqrestore(&(lock), (flags)) -static DEFINE_SPINLOCK(sio_lock); - -/****************** i2c adapter with gpio ***********************/ - -static struct i2c_gpio_platform_data i2c_pdata = { - .timeout = 200, - .udelay = 10, - .scl_is_output_only = 0, - .sda_is_open_drain = 0, - .scl_is_open_drain = 0, -}; - -static struct gpiod_lookup_table rg_gpio_lookup_table = { - .dev_id = "i2c-gpio", - .table = { - GPIO_LOOKUP(GPIO_NAME, GPIO_SDA, "sda", - GPIO_ACTIVE_HIGH), - GPIO_LOOKUP(GPIO_NAME, GPIO_SCL, "scl", - GPIO_ACTIVE_HIGH), - }, -}; - -static void i2c_gpio_release(struct device *dev) -{ - return; -} - -static struct platform_device i2c_gpio = { - .name = "i2c-gpio", - .num_resources = 0, - .id = -1, - - .dev = { - .platform_data = &i2c_pdata, - .release = i2c_gpio_release, - } -}; - -static int xeon_gpio_get(struct gpio_chip *gc, unsigned gpio_num) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - data = 0; - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_LVL) & (1 << offset); - if (data) { - data = 1; - } - } else if (bank == 1) { - data = inl(GP_LVL2) & (1 << offset); - if (data) { - data = 1; - } - } else if (bank == 2) { - data = inl(GP_LVL3) & (1 << offset); - if (data) { - data = 1; - } - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - - return data; -} - -static int xeon_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_IO_SEL); - data = data | (1 << offset); - outl(data, GP_IO_SEL); - } else if (bank == 1) { - data = inl(GP_IO_SEL2); - data = data | (1 << offset); - outl(data, GP_IO_SEL2); - } else if (bank == 2) { - data = inl(GP_IO_SEL3); - data = data | (1 << offset); - outl(data, GP_IO_SEL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - - return 0; -} - -static void xeon_gpio_set(struct gpio_chip *gc, - unsigned gpio_num, int val) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_LVL); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL); - } else if (bank == 1) { - data = inl(GP_LVL2); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL2); - } else if (bank == 2) { - data = inl(GP_LVL3); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); -} - -static int xeon_gpio_direction_out(struct gpio_chip *gc, - unsigned gpio_num, int val) -{ - unsigned int data; - unsigned int bank, offset; - unsigned long flags; - - bank = gpio_num / BANKSIZE; - offset = gpio_num % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GP_IO_SEL); - data = data & ~(1 << offset); - outl(data, GP_IO_SEL); - - data = inl(GP_LVL); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL); - } else if (bank == 1) { - data = inl(GP_IO_SEL2); - data = data & ~(1 << offset); - outl(data, GP_IO_SEL2); - - data = inl(GP_LVL2); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL2); - } else if (bank == 2) { - data = inl(GP_IO_SEL3); - data = data & ~(1 << offset); - outl(data, GP_IO_SEL3); - - data = inl(GP_LVL3); - if (val) { - data = data | (1 << offset); - } else { - data = data & ~(1 << offset); - } - outl(data, GP_LVL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - - return 0; -} - -static int xeon_gpio_request(struct gpio_chip *chip, unsigned int offset) -{ - unsigned int data; - unsigned int bank, tmp_offset; - unsigned long flags; - - bank = offset / BANKSIZE; - tmp_offset = offset % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GPIO_USE_SEL); - data = data | (1 << tmp_offset); - outl(data, GPIO_USE_SEL); - } else if (bank == 1) { - data = inl(GPIO_USE_SEL2); - data = data | (1 << tmp_offset); - outl(data, GPIO_USE_SEL2); - } else if (bank == 2) { - data = inl(GPIO_USE_SEL3); - data = data | (1 << tmp_offset); - outl(data, GPIO_USE_SEL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); - return 0; -} - -static void xeon_gpio_free(struct gpio_chip *chip, unsigned int offset) -{ - unsigned int data; - unsigned int bank, tmp_offset; - unsigned long flags; - - bank = offset / BANKSIZE; - tmp_offset = offset % BANKSIZE; - - GPIO_XEON_SPIN_LOCK(sio_lock, flags); - if (bank == 0) { - data = inl(GPIO_USE_SEL); - data = data & ~(1 << tmp_offset); - outl(data, GPIO_USE_SEL); - } else if (bank == 1) { - data = inl(GPIO_USE_SEL2); - data = data & ~(1 << tmp_offset); - outl(data, GPIO_USE_SEL2); - } else if (bank == 2) { - data = inl(GPIO_USE_SEL3); - data = data & ~(1 << tmp_offset); - outl(data, GPIO_USE_SEL3); - } - GPIO_XEON_SPIN_UNLOCK(sio_lock, flags); -} - -static struct gpio_chip xeon_gpio_chip = { - .label = GPIO_NAME, - .owner = THIS_MODULE, - .get = xeon_gpio_get, - .direction_input = xeon_gpio_direction_in, - .set = xeon_gpio_set, - .direction_output = xeon_gpio_direction_out, - .request = xeon_gpio_request, - .free = xeon_gpio_free, -}; - -static int __init xeon_gpio_init(void) -{ - int err; - if (!request_region(GPIO_BASE, GPIO_IOSIZE, GPIO_NAME)) - return -EBUSY; - - xeon_gpio_chip.base = GPIO_BASE_ID; - xeon_gpio_chip.ngpio = 96; - - err = gpiochip_add_data(&xeon_gpio_chip, NULL); - if (err < 0) - goto gpiochip_add_err; - gpiod_add_lookup_table(&rg_gpio_lookup_table); - err = platform_device_register(&i2c_gpio); - if (err < 0) { - goto i2c_get_adapter_err; - } - return 0; - -i2c_get_adapter_err: - gpiod_remove_lookup_table(&rg_gpio_lookup_table); - platform_device_unregister(&i2c_gpio); - gpiochip_remove(&xeon_gpio_chip); - -gpiochip_add_err: - release_region(GPIO_BASE, GPIO_IOSIZE); - return -1; -} - -static void __exit xeon_gpio_exit(void) -{ - gpiod_remove_lookup_table(&rg_gpio_lookup_table); - platform_device_unregister(&i2c_gpio); - mdelay(100); - gpiochip_remove(&xeon_gpio_chip); - release_region(GPIO_BASE, GPIO_IOSIZE); -} - -module_init(xeon_gpio_init); -module_exit(xeon_gpio_exit); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("GPIO interface for XEON Super I/O chip"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c deleted file mode 100644 index 5e8f2c29d2..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-algo-bit.c +++ /dev/null @@ -1,734 +0,0 @@ -/* ------------------------------------------------------------------------- - * i2c-algo-bit.c i2c driver algorithms for bit-shift adapters - * ------------------------------------------------------------------------- - * Copyright (C) 1995-2000 Simon G. Vogl - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - * ------------------------------------------------------------------------- */ - -/* With some changes from Frodo Looijaard , Kyösti Mälkki - and Jean Delvare */ - -#include -#include -#include -#include -#include -#include -#include - - -/* ----- global defines ----------------------------------------------- */ - -#ifdef DEBUG -#define bit_dbg(level, dev, format, args...) \ - do { \ - if (i2c_debug >= level) \ - dev_dbg(dev, format, ##args); \ - } while (0) -#else -#define bit_dbg(level, dev, format, args...) \ - do {} while (0) -#endif /* DEBUG */ - -/* ----- global variables --------------------------------------------- */ - -static int bit_test; /* see if the line-setting functions work */ -module_param(bit_test, int, S_IRUGO); -MODULE_PARM_DESC(bit_test, "lines testing - 0 off; 1 report; 2 fail if stuck"); - -#ifdef DEBUG -static int i2c_debug = 1; -module_param(i2c_debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(i2c_debug, - "debug level - 0 off; 1 normal; 2 verbose; 3 very verbose"); -#endif - -/* --- setting states on the bus with the right timing: --------------- */ - -#define setsda(adap, val) adap->setsda(adap->data, val) -#define setscl(adap, val) adap->setscl(adap->data, val) -#define getsda(adap) adap->getsda(adap->data) -#define getscl(adap) adap->getscl(adap->data) - -static inline void sdalo(struct i2c_algo_bit_data *adap) -{ - setsda(adap, 0); - udelay((adap->udelay + 1) / 2); -} - -static inline void sdahi(struct i2c_algo_bit_data *adap) -{ - setsda(adap, 1); - udelay((adap->udelay + 1) / 2); -} - -static inline void scllo(struct i2c_algo_bit_data *adap) -{ - setscl(adap, 0); - udelay(adap->udelay / 2); -} - -/* - * Raise scl line, and do checking for delays. This is necessary for slower - * devices. - */ -static int sclhi(struct i2c_algo_bit_data *adap) -{ - unsigned long start; - - setscl(adap, 1); - - /* Not all adapters have scl sense line... */ - if (!adap->getscl) - goto done; - - start = jiffies; - while (!getscl(adap)) { - /* This hw knows how to read the clock line, so we wait - * until it actually gets high. This is safer as some - * chips may hold it low ("clock stretching") while they - * are processing data internally. - */ - if (time_after(jiffies, start + adap->timeout)) { - /* Test one last time, as we may have been preempted - * between last check and timeout test. - */ - if (getscl(adap)) - break; - return -ETIMEDOUT; - } - cpu_relax(); - } -#ifdef DEBUG - if (jiffies != start && i2c_debug >= 3) - pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go high\n", - jiffies - start); -#endif - -done: - udelay(adap->udelay); - return 0; -} - - -/* --- other auxiliary functions -------------------------------------- */ -static void i2c_start(struct i2c_algo_bit_data *adap) -{ - /* assert: scl, sda are high */ - setsda(adap, 0); - udelay(adap->udelay); - scllo(adap); -} - -static void i2c_repstart(struct i2c_algo_bit_data *adap) -{ - /* assert: scl is low */ - sdahi(adap); - sclhi(adap); - setsda(adap, 0); - udelay(adap->udelay); - scllo(adap); -} - - -static void i2c_stop(struct i2c_algo_bit_data *adap) -{ - /* assert: scl is low */ - sdalo(adap); - sclhi(adap); - setsda(adap, 1); - udelay(adap->udelay); -} - - - -/* send a byte without start cond., look for arbitration, - check ackn. from slave */ -/* returns: - * 1 if the device acknowledged - * 0 if the device did not ack - * -ETIMEDOUT if an error occurred (while raising the scl line) - */ -static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c) -{ - int i; - int sb; - int ack; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - /* assert: scl is low */ - for (i = 7; i >= 0; i--) { - sb = (c >> i) & 1; - setsda(adap, sb); - udelay((adap->udelay + 1) / 2); - if (sclhi(adap) < 0) { /* timed out */ - bit_dbg(1, &i2c_adap->dev, - "i2c_outb: 0x%02x, timeout at bit #%d\n", - (int)c, i); - return -ETIMEDOUT; - } - /* FIXME do arbitration here: - * if (sb && !getsda(adap)) -> ouch! Get out of here. - * - * Report a unique code, so higher level code can retry - * the whole (combined) message and *NOT* issue STOP. - */ - scllo(adap); - } - sdahi(adap); - if (sclhi(adap) < 0) { /* timeout */ - bit_dbg(1, &i2c_adap->dev, - "i2c_outb: 0x%02x, timeout at ack\n", (int)c); - return -ETIMEDOUT; - } - - /* read ack: SDA should be pulled down by slave, or it may - * NAK (usually to report problems with the data we wrote). - */ - ack = !getsda(adap); /* ack: sda is pulled low -> success */ - bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c, - ack ? "A" : "NA"); - - scllo(adap); - return ack; - /* assert: scl is low (sda undef) */ -} - - -static int i2c_inb(struct i2c_adapter *i2c_adap) -{ - /* read byte via i2c port, without start/stop sequence */ - /* acknowledge is sent in i2c_read. */ - int i; - unsigned char indata = 0; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - /* assert: scl is low */ - sdahi(adap); - for (i = 0; i < 8; i++) { - if (sclhi(adap) < 0) { /* timeout */ - bit_dbg(1, &i2c_adap->dev, - "i2c_inb: timeout at bit #%d\n", - 7 - i); - return -ETIMEDOUT; - } - indata *= 2; - if (getsda(adap)) - indata |= 0x01; - setscl(adap, 0); - udelay(i == 7 ? adap->udelay / 2 : adap->udelay); - } - /* assert: scl is low */ - return indata; -} - -/* - * Sanity check for the adapter hardware - check the reaction of - * the bus lines only if it seems to be idle. - */ -static int test_bus(struct i2c_adapter *i2c_adap) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - const char *name = i2c_adap->name; - int scl, sda, ret; - - if (adap->pre_xfer) { - ret = adap->pre_xfer(i2c_adap); - if (ret < 0) - return -ENODEV; - } - - if (adap->getscl == NULL) - pr_info("%s: Testing SDA only, SCL is not readable\n", name); - - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (!scl || !sda) { - printk(KERN_WARNING - "%s: bus seems to be busy (scl=%d, sda=%d)\n", - name, scl, sda); - goto bailout; - } - - sdalo(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (sda) { - printk(KERN_WARNING "%s: SDA stuck high!\n", name); - goto bailout; - } - if (!scl) { - printk(KERN_WARNING - "%s: SCL unexpected low while pulling SDA low!\n", - name); - goto bailout; - } - - sdahi(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (!sda) { - printk(KERN_WARNING "%s: SDA stuck low!\n", name); - goto bailout; - } - if (!scl) { - printk(KERN_WARNING - "%s: SCL unexpected low while pulling SDA high!\n", - name); - goto bailout; - } - - scllo(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 0 : getscl(adap); - if (scl) { - printk(KERN_WARNING "%s: SCL stuck high!\n", name); - goto bailout; - } - if (!sda) { - printk(KERN_WARNING - "%s: SDA unexpected low while pulling SCL low!\n", - name); - goto bailout; - } - - sclhi(adap); - sda = getsda(adap); - scl = (adap->getscl == NULL) ? 1 : getscl(adap); - if (!scl) { - printk(KERN_WARNING "%s: SCL stuck low!\n", name); - goto bailout; - } - if (!sda) { - printk(KERN_WARNING - "%s: SDA unexpected low while pulling SCL high!\n", - name); - goto bailout; - } - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); - - pr_info("%s: Test OK\n", name); - return 0; -bailout: - sdahi(adap); - sclhi(adap); - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); - - return -ENODEV; -} - -/* ----- Utility functions -*/ - -/* try_address tries to contact a chip for a number of - * times before it gives up. - * return values: - * 1 chip answered - * 0 chip did not answer - * -x transmission error - */ -static int try_address(struct i2c_adapter *i2c_adap, - unsigned char addr, int retries) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - int i, ret = 0; - - for (i = 0; i <= retries; i++) { - ret = i2c_outb(i2c_adap, addr); - if (ret == 1 || i == retries) - break; - bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); - i2c_stop(adap); - udelay(adap->udelay); - yield(); - bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); - i2c_start(adap); - } - if (i && ret) - bit_dbg(1, &i2c_adap->dev, - "Used %d tries to %s client at 0x%02x: %s\n", i + 1, - addr & 1 ? "read from" : "write to", addr >> 1, - ret == 1 ? "success" : "failed, timeout?"); - return ret; -} - -static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) -{ - const unsigned char *temp = msg->buf; - int count = msg->len; - unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; - int retval; - int wrcount = 0; - - while (count > 0) { - retval = i2c_outb(i2c_adap, *temp); - - /* OK/ACK; or ignored NAK */ - if ((retval > 0) || (nak_ok && (retval == 0))) { - count--; - temp++; - wrcount++; - - /* A slave NAKing the master means the slave didn't like - * something about the data it saw. For example, maybe - * the SMBus PEC was wrong. - */ - } else if (retval == 0) { - dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n"); - return -EIO; - - /* Timeout; or (someday) lost arbitration - * - * FIXME Lost ARB implies retrying the transaction from - * the first message, after the "winning" master issues - * its STOP. As a rule, upper layer code has no reason - * to know or care about this ... it is *NOT* an error. - */ - } else { - dev_err(&i2c_adap->dev, "sendbytes: error %d\n", - retval); - return retval; - } - } - return wrcount; -} - -static int acknak(struct i2c_adapter *i2c_adap, int is_ack) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - /* assert: sda is high */ - if (is_ack) /* send ack */ - setsda(adap, 0); - udelay((adap->udelay + 1) / 2); - if (sclhi(adap) < 0) { /* timeout */ - dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n"); - return -ETIMEDOUT; - } - scllo(adap); - return 0; -} - -static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) -{ - int inval; - int rdcount = 0; /* counts bytes read */ - unsigned char *temp = msg->buf; - int count = msg->len; - const unsigned flags = msg->flags; - - while (count > 0) { - inval = i2c_inb(i2c_adap); - if (inval >= 0) { - *temp = inval; - rdcount++; - } else { /* read timed out */ - break; - } - - temp++; - count--; - - /* Some SMBus transactions require that we receive the - transaction length as the first read byte. */ - if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) { - if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) { - if (!(flags & I2C_M_NO_RD_ACK)) - acknak(i2c_adap, 0); - dev_err(&i2c_adap->dev, - "readbytes: invalid block length (%d)\n", - inval); - return -EPROTO; - } - /* The original count value accounts for the extra - bytes, that is, either 1 for a regular transaction, - or 2 for a PEC transaction. */ - count += inval; - msg->len += inval; - } - - bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n", - inval, - (flags & I2C_M_NO_RD_ACK) - ? "(no ack/nak)" - : (count ? "A" : "NA")); - - if (!(flags & I2C_M_NO_RD_ACK)) { - inval = acknak(i2c_adap, count); - if (inval < 0) - return inval; - } - } - return rdcount; -} - -/* doAddress initiates the transfer by generating the start condition (in - * try_address) and transmits the address in the necessary format to handle - * reads, writes as well as 10bit-addresses. - * returns: - * 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set - * -x an error occurred (like: -ENXIO if the device did not answer, or - * -ETIMEDOUT, for example if the lines are stuck...) - */ -static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) -{ - unsigned short flags = msg->flags; - unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - unsigned char addr; - int ret, retries; - - retries = nak_ok ? 0 : i2c_adap->retries; - - if (flags & I2C_M_TEN) { - /* a ten bit address */ - addr = 0xf0 | ((msg->addr >> 7) & 0x06); - bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr); - /* try extended address code...*/ - ret = try_address(i2c_adap, addr, retries); - if ((ret != 1) && !nak_ok) { - dev_err(&i2c_adap->dev, - "died at extended address code\n"); - return -ENXIO; - } - /* the remaining 8 bit address */ - ret = i2c_outb(i2c_adap, msg->addr & 0xff); - if ((ret != 1) && !nak_ok) { - /* the chip did not ack / xmission error occurred */ - dev_err(&i2c_adap->dev, "died at 2nd address code\n"); - return -ENXIO; - } - if (flags & I2C_M_RD) { - bit_dbg(3, &i2c_adap->dev, - "emitting repeated start condition\n"); - i2c_repstart(adap); - /* okay, now switch into reading mode */ - addr |= 0x01; - ret = try_address(i2c_adap, addr, retries); - if ((ret != 1) && !nak_ok) { - dev_err(&i2c_adap->dev, - "died at repeated address code\n"); - return -EIO; - } - } - } else { /* normal 7bit address */ - addr = i2c_8bit_addr_from_msg(msg); - if (flags & I2C_M_REV_DIR_ADDR) - addr ^= 1; - ret = try_address(i2c_adap, addr, retries); - if ((ret != 1) && !nak_ok) - return -ENXIO; - } - - return 0; -} - -static void bit_i2c_unblock(struct i2c_adapter *i2c_adap) -{ - int i; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - - for (i = 0; i < 9; i++) { - setscl(adap, 0); - udelay(5); - setscl(adap, 1); - udelay(5); - } - setscl(adap, 0); - setsda(adap, 0); - udelay(5); - setscl(adap, 1); - udelay(5); - setsda(adap, 1); -} - -static int check_bit_i2c_unblock(struct i2c_adapter *i2c_adap) -{ - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - int sda, scl; - - sda = getsda(adap); - scl = getscl(adap); - if ((sda == 0) && scl) { - // I2C_ALGO_BIT_ERROR("SCL is high and SDA is low, send 9 clock to device.\n"); - bit_i2c_unblock(i2c_adap); - } - - sda = getsda(adap); - scl = getscl(adap); - if (sda && scl) { - // I2C_ALGO_BIT_DEBUG("SCL and SDA are both high, i2c level check ok.\n"); - return 0; - } - dev_warn(&i2c_adap->dev, "Check i2c level failed, SCL %s, SDA %s.\n", scl ? "high" : "low", sda ? "high" : "low"); - return -EIO; -} - -static int bit_xfer(struct i2c_adapter *i2c_adap, - struct i2c_msg msgs[], int num) -{ - struct i2c_msg *pmsg; - struct i2c_algo_bit_data *adap = i2c_adap->algo_data; - int i, ret; - unsigned short nak_ok; - - if (adap->pre_xfer) { - ret = adap->pre_xfer(i2c_adap); - if (ret < 0) - return ret; - } - - if (check_bit_i2c_unblock(i2c_adap) < 0) { - // I2C_ALGO_BIT_ERROR("check i2c is block.\n"); - return -EIO; - } - - bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); - i2c_start(adap); - for (i = 0; i < num; i++) { - pmsg = &msgs[i]; - nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; - if (!(pmsg->flags & I2C_M_NOSTART)) { - if (i) { - if (msgs[i - 1].flags & I2C_M_STOP) { - bit_dbg(3, &i2c_adap->dev, - "emitting enforced stop/start condition\n"); - i2c_stop(adap); - i2c_start(adap); - } else { - bit_dbg(3, &i2c_adap->dev, - "emitting repeated start condition\n"); - i2c_repstart(adap); - } - } - ret = bit_doAddress(i2c_adap, pmsg); - if ((ret != 0) && !nak_ok) { - bit_dbg(1, &i2c_adap->dev, - "NAK from device addr 0x%02x msg #%d\n", - msgs[i].addr, i); - goto bailout; - } - } - if (pmsg->flags & I2C_M_RD) { - /* read bytes into buffer*/ - ret = readbytes(i2c_adap, pmsg); - if (ret >= 1) - bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n", - ret, ret == 1 ? "" : "s"); - if (ret < pmsg->len) { - if (ret >= 0) - ret = -EIO; - goto bailout; - } - } else { - /* write bytes from buffer */ - ret = sendbytes(i2c_adap, pmsg); - if (ret >= 1) - bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n", - ret, ret == 1 ? "" : "s"); - if (ret < pmsg->len) { - if (ret >= 0) - ret = -EIO; - goto bailout; - } - } - } - ret = i; - -bailout: - bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); - i2c_stop(adap); - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); - return ret; -} - -static u32 bit_func(struct i2c_adapter *adap) -{ - return I2C_FUNC_I2C | I2C_FUNC_NOSTART | I2C_FUNC_SMBUS_EMUL | - I2C_FUNC_SMBUS_READ_BLOCK_DATA | - I2C_FUNC_SMBUS_BLOCK_PROC_CALL | - I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING; -} - - -/* -----exported algorithm data: ------------------------------------- */ - -const struct i2c_algorithm rg_i2c_bit_algo = { - .master_xfer = bit_xfer, - .functionality = bit_func, -}; -EXPORT_SYMBOL(rg_i2c_bit_algo); - -static const struct i2c_adapter_quirks i2c_bit_quirk_no_clk_stretch = { - .flags = I2C_AQ_NO_CLK_STRETCH, -}; - -/* - * registering functions to load algorithms at runtime - */ -static int __i2c_bit_add_bus(struct i2c_adapter *adap, - int (*add_adapter)(struct i2c_adapter *)) -{ - struct i2c_algo_bit_data *bit_adap = adap->algo_data; - int ret; - - if (bit_test) { - ret = test_bus(adap); - if (bit_test >= 2 && ret < 0) - return -ENODEV; - } - - /* register new adapter to i2c module... */ - adap->algo = &rg_i2c_bit_algo; - adap->retries = 3; - if (bit_adap->getscl == NULL) - adap->quirks = &i2c_bit_quirk_no_clk_stretch; - - /* - * We tried forcing SCL/SDA to an initial state here. But that caused a - * regression, sadly. Check Bugzilla #200045 for details. - */ - - ret = add_adapter(adap); - if (ret < 0) - return ret; - - /* Complain if SCL can't be read */ - if (bit_adap->getscl == NULL) { - dev_warn(&adap->dev, "Not I2C compliant: can't read SCL\n"); - dev_warn(&adap->dev, "Bus may be unreliable\n"); - } - return 0; -} - -int rg_i2c_bit_add_bus(struct i2c_adapter *adap) -{ - return __i2c_bit_add_bus(adap, i2c_add_adapter); -} -EXPORT_SYMBOL(rg_i2c_bit_add_bus); - -int rg_i2c_bit_add_numbered_bus(struct i2c_adapter *adap) -{ - return __i2c_bit_add_bus(adap, i2c_add_numbered_adapter); -} -EXPORT_SYMBOL(rg_i2c_bit_add_numbered_bus); - -MODULE_AUTHOR("Simon G. Vogl "); -MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c deleted file mode 100644 index bce3afac61..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg-i2c-gpio.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Bitbanging I2C bus driver using the GPIO API - * - * Copyright (C) 2007 Atmel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int rg_i2c_bit_add_numbered_bus(struct i2c_adapter *adap); - -struct i2c_gpio_private_data { - struct gpio_desc *sda; - struct gpio_desc *scl; - struct i2c_adapter adap; - struct i2c_algo_bit_data bit_data; - struct i2c_gpio_platform_data pdata; -#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR - struct dentry *debug_dir; -#endif -}; - -/* - * Toggle SDA by changing the output value of the pin. This is only - * valid for pins configured as open drain (i.e. setting the value - * high effectively turns off the output driver.) - */ -static void i2c_gpio_setsda_val(void *data, int state) -{ - struct i2c_gpio_private_data *priv = data; - - gpiod_set_value_cansleep(priv->sda, state); -} - -/* - * Toggle SCL by changing the output value of the pin. This is used - * for pins that are configured as open drain and for output-only - * pins. The latter case will break the i2c protocol, but it will - * often work in practice. - */ -static void i2c_gpio_setscl_val(void *data, int state) -{ - struct i2c_gpio_private_data *priv = data; - - gpiod_set_value_cansleep(priv->scl, state); -} - -static int i2c_gpio_getsda(void *data) -{ - struct i2c_gpio_private_data *priv = data; - - return gpiod_get_value_cansleep(priv->sda); -} - -static int i2c_gpio_getscl(void *data) -{ - struct i2c_gpio_private_data *priv = data; - - return gpiod_get_value_cansleep(priv->scl); -} - -#ifdef CONFIG_I2C_GPIO_FAULT_INJECTOR -static struct dentry *i2c_gpio_debug_dir; - -#define setsda(bd, val) ((bd)->setsda((bd)->data, val)) -#define setscl(bd, val) ((bd)->setscl((bd)->data, val)) -#define getsda(bd) ((bd)->getsda((bd)->data)) -#define getscl(bd) ((bd)->getscl((bd)->data)) - -#define WIRE_ATTRIBUTE(wire) \ - static int fops_##wire##_get(void *data, u64 *val) \ -{ \ - struct i2c_gpio_private_data *priv = data; \ - \ - i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - *val = get##wire(&priv->bit_data); \ - i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - return 0; \ -} \ -static int fops_##wire##_set(void *data, u64 val) \ -{ \ - struct i2c_gpio_private_data *priv = data; \ - \ - i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - set##wire(&priv->bit_data, val); \ - i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); \ - return 0; \ -} \ -DEFINE_DEBUGFS_ATTRIBUTE(fops_##wire, fops_##wire##_get, fops_##wire##_set, "%llu\n") - -WIRE_ATTRIBUTE(scl); -WIRE_ATTRIBUTE(sda); - -static void i2c_gpio_incomplete_transfer(struct i2c_gpio_private_data *priv, - u32 pattern, u8 pattern_size) -{ - struct i2c_algo_bit_data *bit_data = &priv->bit_data; - int i; - - i2c_lock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); - - /* START condition */ - setsda(bit_data, 0); - udelay(bit_data->udelay); - - /* Send pattern, request ACK, don't send STOP */ - for (i = pattern_size - 1; i >= 0; i--) { - setscl(bit_data, 0); - udelay(bit_data->udelay / 2); - setsda(bit_data, (pattern >> i) & 1); - udelay((bit_data->udelay + 1) / 2); - setscl(bit_data, 1); - udelay(bit_data->udelay); - } - - i2c_unlock_bus(&priv->adap, I2C_LOCK_ROOT_ADAPTER); -} - -static int fops_incomplete_addr_phase_set(void *data, u64 addr) -{ - struct i2c_gpio_private_data *priv = data; - u32 pattern; - - if (addr > 0x7f) - return -EINVAL; - - /* ADDR (7 bit) + RD (1 bit) + Client ACK, keep SDA hi (1 bit) */ - pattern = (addr << 2) | 3; - - i2c_gpio_incomplete_transfer(priv, pattern, 9); - - return 0; -} -DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_addr_phase, NULL, fops_incomplete_addr_phase_set, "%llu\n"); - -static int fops_incomplete_write_byte_set(void *data, u64 addr) -{ - struct i2c_gpio_private_data *priv = data; - u32 pattern; - - if (addr > 0x7f) - return -EINVAL; - - /* ADDR (7 bit) + WR (1 bit) + Client ACK (1 bit) */ - pattern = (addr << 2) | 1; - /* 0x00 (8 bit) + Client ACK, keep SDA hi (1 bit) */ - pattern = (pattern << 9) | 1; - - i2c_gpio_incomplete_transfer(priv, pattern, 18); - - return 0; -} -DEFINE_DEBUGFS_ATTRIBUTE(fops_incomplete_write_byte, NULL, fops_incomplete_write_byte_set, "%llu\n"); - -static void i2c_gpio_fault_injector_init(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); - - /* - * If there will be a debugfs-dir per i2c adapter somewhen, put the - * 'fault-injector' dir there. Until then, we have a global dir with - * all adapters as subdirs. - */ - if (!i2c_gpio_debug_dir) { - i2c_gpio_debug_dir = debugfs_create_dir("i2c-fault-injector", NULL); - if (!i2c_gpio_debug_dir) - return; - } - - priv->debug_dir = debugfs_create_dir(pdev->name, i2c_gpio_debug_dir); - if (!priv->debug_dir) - return; - - debugfs_create_file_unsafe("scl", 0600, priv->debug_dir, priv, &fops_scl); - debugfs_create_file_unsafe("sda", 0600, priv->debug_dir, priv, &fops_sda); - debugfs_create_file_unsafe("incomplete_address_phase", 0200, priv->debug_dir, - priv, &fops_incomplete_addr_phase); - debugfs_create_file_unsafe("incomplete_write_byte", 0200, priv->debug_dir, - priv, &fops_incomplete_write_byte); -} - -static void i2c_gpio_fault_injector_exit(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv = platform_get_drvdata(pdev); - - debugfs_remove_recursive(priv->debug_dir); -} -#else -static inline void i2c_gpio_fault_injector_init(struct platform_device *pdev) {} -static inline void i2c_gpio_fault_injector_exit(struct platform_device *pdev) {} -#endif /* CONFIG_I2C_GPIO_FAULT_INJECTOR*/ - -static void of_i2c_gpio_get_props(struct device_node *np, - struct i2c_gpio_platform_data *pdata) -{ - u32 reg; - - of_property_read_u32(np, "i2c-gpio,delay-us", &pdata->udelay); - - if (!of_property_read_u32(np, "i2c-gpio,timeout-ms", ®)) - pdata->timeout = msecs_to_jiffies(reg); - - pdata->sda_is_open_drain = - of_property_read_bool(np, "i2c-gpio,sda-open-drain"); - pdata->scl_is_open_drain = - of_property_read_bool(np, "i2c-gpio,scl-open-drain"); - pdata->scl_is_output_only = - of_property_read_bool(np, "i2c-gpio,scl-output-only"); -} - -static struct gpio_desc *i2c_gpio_get_desc(struct device *dev, - const char *con_id, - unsigned int index, - enum gpiod_flags gflags) -{ - struct gpio_desc *retdesc; - int ret; - - retdesc = devm_gpiod_get(dev, con_id, gflags); - if (!IS_ERR(retdesc)) { - dev_dbg(dev, "got GPIO from name %s\n", con_id); - return retdesc; - } - - retdesc = devm_gpiod_get_index(dev, NULL, index, gflags); - if (!IS_ERR(retdesc)) { - dev_dbg(dev, "got GPIO from index %u\n", index); - return retdesc; - } - - ret = PTR_ERR(retdesc); - - /* FIXME: hack in the old code, is this really necessary? */ - if (ret == -EINVAL) - retdesc = ERR_PTR(-EPROBE_DEFER); - - /* This happens if the GPIO driver is not yet probed, let's defer */ - if (ret == -ENOENT) - retdesc = ERR_PTR(-EPROBE_DEFER); - - if (PTR_ERR(retdesc) != -EPROBE_DEFER) - dev_err(dev, "error trying to get descriptor: %d\n", ret); - - return retdesc; -} - -static int i2c_gpio_probe(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv; - struct i2c_gpio_platform_data *pdata; - struct i2c_algo_bit_data *bit_data; - struct i2c_adapter *adap; - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - enum gpiod_flags gflags; - int ret; - - priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - adap = &priv->adap; - bit_data = &priv->bit_data; - pdata = &priv->pdata; - - if (np) { - of_i2c_gpio_get_props(np, pdata); - } else { - /* - * If all platform data settings are zero it is OK - * to not provide any platform data from the board. - */ - if (dev_get_platdata(dev)) - memcpy(pdata, dev_get_platdata(dev), sizeof(*pdata)); - } - - /* - * First get the GPIO pins; if it fails, we'll defer the probe. - * If the SDA line is marked from platform data or device tree as - * "open drain" it means something outside of our control is making - * this line being handled as open drain, and we should just handle - * it as any other output. Else we enforce open drain as this is - * required for an I2C bus. - */ - if (pdata->sda_is_open_drain) - gflags = GPIOD_OUT_HIGH; - else - gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; - priv->sda = i2c_gpio_get_desc(dev, "sda", 0, gflags); - if (IS_ERR(priv->sda)) - return PTR_ERR(priv->sda); - - /* - * If the SCL line is marked from platform data or device tree as - * "open drain" it means something outside of our control is making - * this line being handled as open drain, and we should just handle - * it as any other output. Else we enforce open drain as this is - * required for an I2C bus. - */ - if (pdata->scl_is_open_drain) - gflags = GPIOD_OUT_HIGH; - else - gflags = GPIOD_OUT_HIGH_OPEN_DRAIN; - priv->scl = i2c_gpio_get_desc(dev, "scl", 1, gflags); - if (IS_ERR(priv->scl)) - return PTR_ERR(priv->scl); - - if (gpiod_cansleep(priv->sda) || gpiod_cansleep(priv->scl)) - dev_warn(dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing"); - - bit_data->setsda = i2c_gpio_setsda_val; - bit_data->setscl = i2c_gpio_setscl_val; - - if (!pdata->scl_is_output_only) - bit_data->getscl = i2c_gpio_getscl; - bit_data->getsda = i2c_gpio_getsda; - - if (pdata->udelay) - bit_data->udelay = pdata->udelay; - else if (pdata->scl_is_output_only) - bit_data->udelay = 50; /* 10 kHz */ - else - bit_data->udelay = 5; /* 100 kHz */ - - if (pdata->timeout) - bit_data->timeout = pdata->timeout; - else - bit_data->timeout = HZ / 10; /* 100 ms */ - - bit_data->data = priv; - - adap->owner = THIS_MODULE; - if (np) - strlcpy(adap->name, dev_name(dev), sizeof(adap->name)); - else - snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id); - - adap->algo_data = bit_data; - adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; - adap->dev.parent = dev; - adap->dev.of_node = np; - - adap->nr = pdev->id; - ret = rg_i2c_bit_add_numbered_bus(adap); - if (ret) - return ret; - - platform_set_drvdata(pdev, priv); - - /* - * FIXME: using global GPIO numbers is not helpful. If/when we - * get accessors to get the actual name of the GPIO line, - * from the descriptor, then provide that instead. - */ - dev_info(dev, "using lines %u (SDA) and %u (SCL%s)\n", - desc_to_gpio(priv->sda), desc_to_gpio(priv->scl), - pdata->scl_is_output_only - ? ", no clock stretching" : ""); - - i2c_gpio_fault_injector_init(pdev); - - return 0; -} - -static int i2c_gpio_remove(struct platform_device *pdev) -{ - struct i2c_gpio_private_data *priv; - struct i2c_adapter *adap; - - i2c_gpio_fault_injector_exit(pdev); - - priv = platform_get_drvdata(pdev); - adap = &priv->adap; - - i2c_del_adapter(adap); - - return 0; -} - -#if defined(CONFIG_OF) -static const struct of_device_id i2c_gpio_dt_ids[] = { - { .compatible = "rg-i2c-gpio", }, - { /* sentinel */ } -}; - -MODULE_DEVICE_TABLE(of, i2c_gpio_dt_ids); -#endif - -static struct platform_driver i2c_gpio_driver = { - .driver = { - .name = "rg-i2c-gpio", - .of_match_table = of_match_ptr(i2c_gpio_dt_ids), - }, - .probe = i2c_gpio_probe, - .remove = i2c_gpio_remove, -}; - -static int __init i2c_gpio_init(void) -{ - int ret; - - ret = platform_driver_register(&i2c_gpio_driver); - if (ret) - printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret); - - return ret; -} -subsys_initcall(i2c_gpio_init); - -static void __exit i2c_gpio_exit(void) -{ - platform_driver_unregister(&i2c_gpio_driver); -} -module_exit(i2c_gpio_exit); - -MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); -MODULE_DESCRIPTION("Platform-independent bitbanging I2C driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:i2c-gpio"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c deleted file mode 100755 index f8a70adeee..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_fan.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * rg_fan.c - A driver for control rg_fan base on rg_fan.c - * - * Copyright (c) 1998, 1999 Frodo Looijaard - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define FAN_SIZE (256) -#define SYS_FAN_BUF_LEN (64) - -typedef enum { - DBG_START, - DBG_VERBOSE, - DBG_KEY, - DBG_WARN, - DBG_ERROR, - DBG_END, -} dbg_level_t; - -static int debuglevel = 0; - -#define DBG_DEBUG(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ - printk(KERN_INFO "[DEBUG]:<%s, %d>:" fmt, \ - __FUNCTION__, __LINE__, ##arg); \ - } else if (debuglevel >= DBG_ERROR) { \ - printk(KERN_ERR "[DEBUG]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } else { \ - } \ - } while (0) - -#define DBG_ERROR(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START) { \ - printk(KERN_ERR "[ERROR]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } \ - } while (0) - -extern s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); -extern s32 platform_i2c_smbus_read_i2c_block_data( - const struct i2c_client *client, u8 command, u8 length, u8 *values); -extern s32 platform_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command); - -typedef enum dfd_dev_info_type_e { - DFD_DEV_INFO_TYPE_MAC = 1, - DFD_DEV_INFO_TYPE_NAME = 2, - DFD_DEV_INFO_TYPE_SN = 3, - DFD_DEV_INFO_TYPE_PWR_CONS = 4, - DFD_DEV_INFO_TYPE_HW_INFO = 5, - DFD_DEV_INFO_TYPE_DEV_TYPE = 6, -} dfd_dev_tlv_type_t; - -typedef struct dfd_dev_head_info_s { - uint8_t ver; /* define E2PROM version,default is 0x01 */ - uint8_t flag; /* flag is 0x7E in new version E2PROM */ - uint8_t hw_ver; /* consists of main version and revise version */ - uint8_t type; /* HW type */ - int16_t tlv_len; /* 16 bits */ -} dfd_dev_head_info_t; - -typedef struct dfd_dev_tlv_info_s { - uint8_t type; - uint8_t len; - uint8_t data[0]; -} dfd_dev_tlv_info_t; - -struct fan_data { - struct i2c_client *client; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated[8]; /* In jiffies */ - u8 data[FAN_SIZE]; /* Register value */ -}; - -static ssize_t show_fan_sysfs_tlv_value(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct fan_data *data = i2c_get_clientdata(client); - - dfd_dev_head_info_t info; - uint8_t tmp_tlv_len[sizeof(uint16_t)]; - uint8_t *tlv_data; - dfd_dev_tlv_info_t *tlv; - int type; - int buf_len = SYS_FAN_BUF_LEN - 1; - u8 sysfs_buf[SYS_FAN_BUF_LEN]; - int i; - int ret = 0; - - mutex_lock(&data->update_lock); - memset(sysfs_buf, 0, SYS_FAN_BUF_LEN); - ret = platform_i2c_smbus_read_i2c_block_data( - client, 0, sizeof(dfd_dev_head_info_t), (uint8_t *)&info); - if (ret != sizeof(dfd_dev_head_info_t)) { - DBG_ERROR("fan maybe not set mac or not present0"); - goto exit; - } - - /* transform TLV_LEN */ - memcpy(tmp_tlv_len, (uint8_t *)&info.tlv_len, sizeof(int16_t)); - info.tlv_len = (tmp_tlv_len[0] << 8) + tmp_tlv_len[1]; - - if ((info.tlv_len <= 0) || (info.tlv_len > 0xFF)) { - DBG_ERROR("fan maybe not set mac or not present1"); - goto exit; - } - - type = attr->index; - tlv_data = (uint8_t *)kmalloc(info.tlv_len, GFP_KERNEL); - memset(tlv_data, 0, info.tlv_len); - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { - for (i = 0; i < info.tlv_len; i += 32) - if (platform_i2c_smbus_read_i2c_block_data(client, - sizeof(dfd_dev_head_info_t) + i, - 32, tlv_data + i) != 32) - break; - } - - DBG_DEBUG("TLV Len:%d\n", (int)sizeof(dfd_dev_tlv_info_t)); - for (tlv = (dfd_dev_tlv_info_t *)tlv_data; - (ulong)tlv < (ulong)tlv_data + info.tlv_len;) { - DBG_DEBUG( - "tlv: %p, tlv->type: 0x%x, tlv->len: 0x%x info->tlv_len: 0x%x\n", - tlv, tlv->type, tlv->len, info.tlv_len); - if (tlv->type == type && buf_len >= tlv->len) { - memcpy((uint8_t *)sysfs_buf, (uint8_t *)tlv->data, - tlv->len); - buf_len = (uint32_t)tlv->len; - break; - } - tlv = (dfd_dev_tlv_info_t *)((uint8_t *)tlv + - sizeof(dfd_dev_tlv_info_t) + - tlv->len); - } - - kfree(tlv_data); - DBG_DEBUG("value: %s \n", sysfs_buf); -exit: - mutex_unlock(&data->update_lock); - return sprintf(buf, "%s\n", sysfs_buf); -} - -static ssize_t show_fan_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct fan_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - int i; - - mutex_lock(&data->update_lock); - - if (i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { - for (i = 0; i < FAN_SIZE; i += 32) { - if (platform_i2c_smbus_read_i2c_block_data( - client, i, 32, data->data + i) != 32) - goto exit; - } - } else { - for (i = 0; i < FAN_SIZE; i += 2) { - int word = platform_i2c_smbus_read_word_data(client, i); - if (word < 0) - goto exit; - data->data[i] = word & 0xff; - data->data[i + 1] = word >> 8; - } - } - memcpy(buf, &data->data[0], FAN_SIZE); -exit: - mutex_unlock(&data->update_lock); - return FAN_SIZE; -} - -static SENSOR_DEVICE_ATTR(fan_hw_version, S_IRUGO, show_fan_sysfs_tlv_value, NULL, DFD_DEV_INFO_TYPE_HW_INFO); -static SENSOR_DEVICE_ATTR(fan_sn, S_IRUGO, show_fan_sysfs_tlv_value, NULL, DFD_DEV_INFO_TYPE_SN); -static SENSOR_DEVICE_ATTR(fan_type, S_IRUGO, show_fan_sysfs_tlv_value, NULL, DFD_DEV_INFO_TYPE_NAME); -static SENSOR_DEVICE_ATTR(fan, S_IRUGO, show_fan_value, NULL, 0); - -static struct attribute *fan_sysfs_attrs[] = { - &sensor_dev_attr_fan_hw_version.dev_attr.attr, - &sensor_dev_attr_fan_sn.dev_attr.attr, - &sensor_dev_attr_fan_type.dev_attr.attr, - &sensor_dev_attr_fan.dev_attr.attr, - NULL -}; - -static const struct attribute_group fan_sysfs_group = { - .attrs = fan_sysfs_attrs, -}; - -static int fan_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct fan_data *data; - int status; - - status = -1; - DBG_DEBUG("fan_probe(0x%02x)\n", client->addr); - data = devm_kzalloc(&client->dev, sizeof(struct fan_data), GFP_KERNEL); - if (!data) { - return -ENOMEM; - } - - data->client = client; - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - status = sysfs_create_group(&client->dev.kobj, &fan_sysfs_group); - if (status != 0) { - DBG_ERROR(" sysfs_create_group err\n"); - return status; - } - return 0; -} - -static int fan_remove(struct i2c_client *client) -{ - sysfs_remove_group(&client->dev.kobj, &fan_sysfs_group); - return 0; -} - -static const struct i2c_device_id fan_id[] = { { "rg_fan", 0 }, {} }; -MODULE_DEVICE_TABLE(i2c, fan_id); - -static struct i2c_driver rg_fan_driver = { - .driver = { - .name = "rg_fan", - }, - .probe = fan_probe, - .remove = fan_remove, - .id_table = fan_id, -}; - -module_i2c_driver(rg_fan_driver); -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile fan driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c deleted file mode 100755 index 78abd41cf5..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/modules/rg_psu.c +++ /dev/null @@ -1,340 +0,0 @@ -/* - * rg_cpld.c - A driver for pmbus psu - * - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAGIC_PSU_RATE (0xA7) -#define MAGIC_PSU_OUT_CURRENT (0x8C) -#define MAGIC_PSU_OUT_VOLTAGE (0x8B) -#define MAGIC_PSU_IN_VOLTAGE (0x88) -#define MAGIC_PSU_IN_CURRENT (0x89) -#define MAGIC_PSU_TEMP (0x8D) -#define MAGIC_PSU_TYPE (0x25) -#define MAGIC_PSU_SN (0x38) -#define MAGIC_PSU_HW (0x35) -#define PSU_SIZE (256) - -typedef enum { - DBG_START, - DBG_VERBOSE, - DBG_KEY, - DBG_WARN, - DBG_ERROR, - DBG_END, -} dbg_level_t; - -static int debuglevel = 0; - -#define DBG_DEBUG(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ - printk(KERN_INFO "[DEBUG]:<%s, %d>:" fmt, \ - __FUNCTION__, __LINE__, ##arg); \ - } else if (debuglevel >= DBG_ERROR) { \ - printk(KERN_ERR "[DEBUG]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } else { \ - } \ - } while (0) - -#define DBG_INFO(fmt, arg...) \ - do { \ - if (debuglevel > DBG_KEY) { \ - printk(KERN_INFO "[INFO]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } \ - } while (0) - -#define DBG_ERROR(fmt, arg...) \ - do { \ - if (debuglevel > DBG_START) { \ - printk(KERN_ERR "[ERROR]:<%s, %d>:" fmt, __FUNCTION__, \ - __LINE__, ##arg); \ - } \ - } while (0) - -static const unsigned short rg_i2c_psu[] = { 0x50, 0x53, 0x58, 0x5b, I2C_CLIENT_END }; - -extern s32 platform_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); -extern s32 platform_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, - u8 command, u8 length, u8 *values); - -struct psu_data { - struct i2c_client *client; - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 data[PSU_SIZE]; /* Register value */ -}; - -static ssize_t show_psu_sysfs_value(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_sysfs_15_value(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_psu_value(struct device *dev, struct device_attribute *da, char *buf); - -static SENSOR_DEVICE_ATTR(psu_rate, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_RATE); -static SENSOR_DEVICE_ATTR(psu_out_current, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_OUT_CURRENT); -static SENSOR_DEVICE_ATTR(psu_out_voltage, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_OUT_VOLTAGE); -static SENSOR_DEVICE_ATTR(psu_in_voltage, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_IN_VOLTAGE); -static SENSOR_DEVICE_ATTR(psu_in_current, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_IN_CURRENT); -static SENSOR_DEVICE_ATTR(psu_temp, S_IRUGO, show_psu_sysfs_value, NULL, MAGIC_PSU_TEMP); -static SENSOR_DEVICE_ATTR(psu_type, S_IRUGO, show_sysfs_15_value, NULL, MAGIC_PSU_TYPE); -static SENSOR_DEVICE_ATTR(psu_sn, S_IRUGO, show_sysfs_15_value, NULL, MAGIC_PSU_SN); -static SENSOR_DEVICE_ATTR(psu_hw, S_IRUGO, show_psu_value, NULL, MAGIC_PSU_HW); - -static struct attribute *psu_pmbus_sysfs_attrs[] = { - &sensor_dev_attr_psu_rate.dev_attr.attr, - &sensor_dev_attr_psu_out_current.dev_attr.attr, - &sensor_dev_attr_psu_out_voltage.dev_attr.attr, - &sensor_dev_attr_psu_in_voltage.dev_attr.attr, - &sensor_dev_attr_psu_in_current.dev_attr.attr, - &sensor_dev_attr_psu_temp.dev_attr.attr, - NULL -}; - -static struct attribute *psu_fru_sysfs_attrs[] = { - &sensor_dev_attr_psu_type.dev_attr.attr, - &sensor_dev_attr_psu_sn.dev_attr.attr, - &sensor_dev_attr_psu_hw.dev_attr.attr, - NULL -}; - -static const struct attribute_group psu_pmbus_sysfs_attrs_group = { - .attrs = psu_pmbus_sysfs_attrs, -}; - -static const struct attribute_group psu_fru_sysfs_attrs_group = { - .attrs = psu_fru_sysfs_attrs, -}; - -static ssize_t show_psu_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - char psu_buf[PSU_SIZE]; - memset(psu_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 2, psu_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu\n"); - } - DBG_DEBUG("cpld reg pos:0x%x value:0x%02x\n", attr->index, data->data[0]); - mutex_unlock(&data->update_lock); - return snprintf(buf, 3, "%s\n", psu_buf); -} - -static int linear_to_value(short reg, bool v_out) -{ - short exponent; - int mantissa; - long val; - - if (v_out) { - exponent = -9; - mantissa = reg; - } else { - exponent = reg >> 11; - mantissa = (((reg & 0x7ff) << 5)) >> 5; - } - val = mantissa; - val = val * 1000L; - if (exponent >= 0) { - val <<= exponent; - } else { - val >>= -exponent; - } - - return val; -} - -static ssize_t show_psu_sysfs_value(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - u8 smbud_buf[PSU_SIZE]; - uint16_t value; - int result; - - ret = -1; - memset(smbud_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - DBG_DEBUG("ret:%d", ret); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 2, smbud_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu \n"); - } - value = smbud_buf[1]; - value = value << 8; - value |= smbud_buf[0]; - - if (attr->index == 0x8b) { - result = linear_to_value(value, true); - } else { - result = linear_to_value(value, false); - } - mutex_unlock(&data->update_lock); - return snprintf(buf, PSU_SIZE, "%d\n", result); -} - -static ssize_t show_sysfs_15_value(struct device *dev, - struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - u8 smbud_buf[PSU_SIZE]; - - memset(smbud_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 15, smbud_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu\n"); - } - mutex_unlock(&data->update_lock); - return snprintf(buf, PSU_SIZE, "%s\n", smbud_buf); -} - -static ssize_t show_sysfs_13_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct psu_data *data = i2c_get_clientdata(client); - int ret; - u8 smbud_buf[PSU_SIZE]; - - memset(smbud_buf, 0, PSU_SIZE); - mutex_lock(&data->update_lock); - ret = platform_i2c_smbus_read_i2c_block_data(client, attr->index, 13, smbud_buf); - if (ret < 0) { - DBG_ERROR("Failed to read psu \n"); - } - mutex_unlock(&data->update_lock); - return snprintf(buf, PSU_SIZE, "%s\n", smbud_buf); -} - -static int psu_detect(struct i2c_client *new_client, - struct i2c_board_info *info) -{ - struct i2c_adapter *adapter = new_client->adapter; - int conf; - - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_SMBUS_WORD_DATA)) - return -ENODEV; - conf = platform_i2c_smbus_read_byte_data(new_client, 0); - if (!conf) - return -ENODEV; - - return 0; -} - -static int psu_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct psu_data *data; - int status; - - status = -1; - data = devm_kzalloc(&client->dev, sizeof(struct psu_data), GFP_KERNEL); - if (!data) - return -ENOMEM; - - data->client = client; - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - switch (client->addr) { - case 0x50: - case 0x53: - status = sysfs_create_group(&client->dev.kobj, - &psu_fru_sysfs_attrs_group); - if (status != 0) { - DBG_ERROR("%s %d sysfs_create_group err\n", __func__, __LINE__); - } - break; - case 0x58: - case 0x5b: - status = sysfs_create_group(&client->dev.kobj, - &psu_pmbus_sysfs_attrs_group); - if (status != 0) { - DBG_ERROR("%s %d sysfs_create_group err\n", __func__, __LINE__); - break; - } - break; - default: - break; - } - - return status; -} - -static int psu_remove(struct i2c_client *client) -{ - switch (client->addr) { - case 0x50: - case 0x53: - sysfs_remove_group(&client->dev.kobj, &psu_fru_sysfs_attrs_group); - break; - case 0x58: - case 0x5b: - sysfs_remove_group(&client->dev.kobj, &psu_pmbus_sysfs_attrs_group); - break; - default: - break; - } - return 0; -} - -static const struct i2c_device_id psu_id[] = { - { "rg_psu", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, psu_id); - -static struct i2c_driver rg_psu_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "rg_psu", - }, - .probe = psu_probe, - .remove = psu_remove, - .id_table = psu_id, - .detect = psu_detect, - .address_list = rg_i2c_psu, -}; - -module_i2c_driver(rg_psu_driver); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile pmbus psu driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h new file mode 100644 index 0000000000..47bb9b898d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/spi-bitbang-txrx.h @@ -0,0 +1,107 @@ +/* + * Mix this utility code with some glue code to get one of several types of + * simple SPI master driver. Two do polled word-at-a-time I/O: + * + * - GPIO/parport bitbangers. Provide chipselect() and txrx_word[](), + * expanding the per-word routines from the inline templates below. + * + * - Drivers for controllers resembling bare shift registers. Provide + * chipselect() and txrx_word[](), with custom setup()/cleanup() methods + * that use your controller's clock and chipselect registers. + * + * Some hardware works well with requests at spi_transfer scope: + * + * - Drivers leveraging smarter hardware, with fifos or DMA; or for half + * duplex (MicroWire) controllers. Provide chipselect() and txrx_bufs(), + * and custom setup()/cleanup() methods. + */ + +/* + * The code that knows what GPIO pins do what should have declared four + * functions, ideally as inlines, before including this header: + * + * void setsck(struct spi_device *, int is_on); + * void setmosi(struct spi_device *, int is_on); + * int getmiso(struct spi_device *); + * void spidelay(unsigned); + * + * setsck()'s is_on parameter is a zero/nonzero boolean. + * + * setmosi()'s is_on parameter is a zero/nonzero boolean. + * + * getmiso() is required to return 0 or 1 only. Any other value is invalid + * and will result in improper operation. + * + * A non-inlined routine would call bitbang_txrx_*() routines. The + * main loop could easily compile down to a handful of instructions, + * especially if the delay is a NOP (to run at peak speed). + * + * Since this is software, the timings may not be exactly what your board's + * chips need ... there may be several reasons you'd need to tweak timings + * in these routines, not just to make it faster or slower to match a + * particular CPU clock rate. + */ + +static inline u32 +bitbang_txrx_be_cpha0(struct spi_device *spi, + unsigned nsecs, unsigned cpol, unsigned flags, + u32 word, u8 bits) +{ + /* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */ + + u32 oldbit = (!(word & (1<<(bits-1)))) << 31; + /* clock starts at inactive polarity */ + for (word <<= (32 - bits); likely(bits); bits--) { + + /* setup MSB (to slave) on trailing edge */ + if ((flags & SPI_MASTER_NO_TX) == 0) { + if ((word & (1 << 31)) != oldbit) { + setmosi(spi, word & (1 << 31)); + oldbit = word & (1 << 31); + } + } + spidelay(nsecs); /* T(setup) */ + + setsck(spi, !cpol); + spidelay(nsecs); + + /* sample MSB (from slave) on leading edge */ + word <<= 1; + if ((flags & SPI_MASTER_NO_RX) == 0) + word |= getmiso(spi); + setsck(spi, cpol); + } + return word; +} + +static inline u32 +bitbang_txrx_be_cpha1(struct spi_device *spi, + unsigned nsecs, unsigned cpol, unsigned flags, + u32 word, u8 bits) +{ + /* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */ + + u32 oldbit = (!(word & (1<<(bits-1)))) << 31; + /* clock starts at inactive polarity */ + for (word <<= (32 - bits); likely(bits); bits--) { + + /* setup MSB (to slave) on leading edge */ + setsck(spi, !cpol); + if ((flags & SPI_MASTER_NO_TX) == 0) { + if ((word & (1 << 31)) != oldbit) { + setmosi(spi, word & (1 << 31)); + oldbit = word & (1 << 31); + } + } + spidelay(nsecs); /* T(setup) */ + + setsck(spi, cpol); + spidelay(nsecs); + + /* sample MSB (from slave) on trailing edge */ + word <<= 1; + if ((flags & SPI_MASTER_NO_RX) == 0) + word |= getmiso(spi); + } + return word; +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c new file mode 100644 index 0000000000..2ba7e7912e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_eeprom_93xx46.c @@ -0,0 +1,558 @@ +/* + * Driver for 93xx46 EEPROMs + * + * (C) 2011 DENX Software Engineering, Anatolij Gustschin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define OP_START 0x4 +#define OP_WRITE (OP_START | 0x1) +#define OP_READ (OP_START | 0x2) +#define ADDR_EWDS 0x00 +#define ADDR_ERAL 0x20 +#define ADDR_EWEN 0x30 + +static int g_wb_eeprom_93xx46_debug = 0; + +module_param(g_wb_eeprom_93xx46_debug, int, S_IRUGO | S_IWUSR); + +#define SPI_93xx46_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_eeprom_93xx46_debug) { \ + printk(KERN_INFO "[EEPROM-93xx46][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct eeprom_93xx46_devtype_data { + unsigned int quirks; +}; + +static const struct eeprom_93xx46_devtype_data atmel_at93c46d_data = { + .quirks = EEPROM_93XX46_QUIRK_SINGLE_WORD_READ | + EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH, +}; + +struct eeprom_93xx46_dev { + struct spi_device *spi; + struct eeprom_93xx46_platform_data *pdata; + struct mutex lock; + struct nvmem_config nvmem_config; + struct nvmem_device *nvmem; + int addrlen; + int size; +}; + +static inline bool has_quirk_single_word_read(struct eeprom_93xx46_dev *edev) +{ + return edev->pdata->quirks & EEPROM_93XX46_QUIRK_SINGLE_WORD_READ; +} + +static inline bool has_quirk_instruction_length(struct eeprom_93xx46_dev *edev) +{ + return edev->pdata->quirks & EEPROM_93XX46_QUIRK_INSTRUCTION_LENGTH; +} + +static int eeprom_93xx46_read(void *priv, unsigned int off, + void *val, size_t count) +{ + struct eeprom_93xx46_dev *edev = priv; + char *buf = val; + int err = 0; + + if (unlikely(off >= edev->size)) + return 0; + if ((off + count) > edev->size) + count = edev->size - off; + if (unlikely(!count)) + return count; + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + while (count) { + struct spi_message m; + struct spi_transfer t[2] = { { 0 } }; + u16 cmd_addr = OP_READ << edev->addrlen; + size_t nbytes = count; + int bits; + int data_bit; + + if (edev->addrlen == 7) { + cmd_addr |= off & 0x7f; + bits = 10; + data_bit = 8; + if (has_quirk_single_word_read(edev)) + nbytes = 1; + } else { + cmd_addr |= (off >> 1) & 0x3f; + bits = 9; + data_bit = 16; + if (has_quirk_single_word_read(edev)) + nbytes = 2; + } + + dev_dbg(&edev->spi->dev, "read cmd 0x%x, %d Hz\n", + cmd_addr, edev->spi->max_speed_hz); + + spi_message_init(&m); + + t[0].tx_buf = (char *)&cmd_addr; + t[0].len = 2; + t[0].bits_per_word = bits; + spi_message_add_tail(&t[0], &m); + + t[1].rx_buf = buf; + t[1].len = nbytes; + t[1].bits_per_word = data_bit; + spi_message_add_tail(&t[1], &m); + + err = spi_sync(edev->spi, &m); + /* have to wait at least Tcsl ns */ + ndelay(250); + + if (err) { + dev_err(&edev->spi->dev, "read %zu bytes at %d: err. %d\n", + nbytes, (int)off, err); + break; + } + + buf += nbytes; + off += nbytes; + count -= nbytes; + } + + if (edev->pdata->finish) + edev->pdata->finish(edev); + + mutex_unlock(&edev->lock); + + return err; +} + +static int eeprom_93xx46_ew(struct eeprom_93xx46_dev *edev, int is_on) +{ + struct spi_message m; + struct spi_transfer t; + int bits, ret; + u16 cmd_addr; + + cmd_addr = OP_START << edev->addrlen; + if (edev->addrlen == 7) { + cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << 1; + bits = 10; + } else { + cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS); + bits = 9; + } + + if (has_quirk_instruction_length(edev)) { + cmd_addr <<= 2; + bits += 2; + } + + dev_dbg(&edev->spi->dev, "ew%s cmd 0x%04x, %d bits\n", + is_on ? "en" : "ds", cmd_addr, bits); + + spi_message_init(&m); + mem_clear(&t, sizeof(t)); + + t.tx_buf = &cmd_addr; + t.len = 2; + t.bits_per_word = bits; + spi_message_add_tail(&t, &m); + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + ret = spi_sync(edev->spi, &m); + /* have to wait at least Tcsl ns */ + ndelay(250); + if (ret) + dev_err(&edev->spi->dev, "erase/write %sable error %d\n", + is_on ? "en" : "dis", ret); + + if (edev->pdata->finish) + edev->pdata->finish(edev); + + mutex_unlock(&edev->lock); + return ret; +} + +static ssize_t +eeprom_93xx46_write_word(struct eeprom_93xx46_dev *edev, + char *buf, unsigned off) +{ + struct spi_message m; + struct spi_transfer t[2]; + int bits, data_len, ret; + u16 cmd_addr; + int data_bit; + + cmd_addr = OP_WRITE << edev->addrlen; + + if (edev->addrlen == 7) { + cmd_addr |= off & 0x7f; + bits = 10; + data_len = 1; + data_bit = 8; + } else { + cmd_addr |= (off >> 1) & 0x3f; + bits = 9; + data_len = 2; + data_bit = 16; + } + + dev_dbg(&edev->spi->dev, "write cmd 0x%x\n", cmd_addr); + + spi_message_init(&m); + mem_clear(t, sizeof(t)); + + t[0].tx_buf = (char *)&cmd_addr; + t[0].len = 2; + t[0].bits_per_word = bits; + spi_message_add_tail(&t[0], &m); + + t[1].tx_buf = buf; + t[1].len = data_len; + t[1].bits_per_word = data_bit; + spi_message_add_tail(&t[1], &m); + + ret = spi_sync(edev->spi, &m); + /* have to wait program cycle time Twc ms */ + mdelay(6); + return ret; +} + +static int eeprom_93xx46_write(void *priv, unsigned int off, + void *val, size_t count) +{ + struct eeprom_93xx46_dev *edev = priv; + char *buf = val; + int i, ret, step = 1; + + if (unlikely(off >= edev->size)) + return -EFBIG; + if ((off + count) > edev->size) + count = edev->size - off; + if (unlikely(!count)) + return count; + + /* only write even number of bytes on 16-bit devices */ + if (edev->addrlen == 6) { + step = 2; + count &= ~1; + } + + /* erase/write enable */ + ret = eeprom_93xx46_ew(edev, 1); + if (ret) + return ret; + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + for (i = 0; i < count; i += step) { + ret = eeprom_93xx46_write_word(edev, &buf[i], off + i); + if (ret) { + dev_err(&edev->spi->dev, "write failed at %d: %d\n", + (int)off + i, ret); + break; + } + } + + if (edev->pdata->finish) + edev->pdata->finish(edev); + + mutex_unlock(&edev->lock); + + /* erase/write disable */ + eeprom_93xx46_ew(edev, 0); + return ret; +} + +static int eeprom_93xx46_eral(struct eeprom_93xx46_dev *edev) +{ + struct eeprom_93xx46_platform_data *pd = edev->pdata; + struct spi_message m; + struct spi_transfer t; + int bits, ret; + u16 cmd_addr; + + cmd_addr = OP_START << edev->addrlen; + if (edev->addrlen == 7) { + cmd_addr |= ADDR_ERAL << 1; + bits = 10; + } else { + cmd_addr |= ADDR_ERAL; + bits = 9; + } + + if (has_quirk_instruction_length(edev)) { + cmd_addr <<= 2; + bits += 2; + } + + dev_dbg(&edev->spi->dev, "eral cmd 0x%04x, %d bits\n", cmd_addr, bits); + + spi_message_init(&m); + mem_clear(&t, sizeof(t)); + + t.tx_buf = &cmd_addr; + t.len = 2; + t.bits_per_word = bits; + spi_message_add_tail(&t, &m); + + mutex_lock(&edev->lock); + + if (edev->pdata->prepare) + edev->pdata->prepare(edev); + + ret = spi_sync(edev->spi, &m); + if (ret) + dev_err(&edev->spi->dev, "erase error %d\n", ret); + /* have to wait erase cycle time Tec ms */ + mdelay(6); + + if (pd->finish) + pd->finish(edev); + + mutex_unlock(&edev->lock); + return ret; +} + +static ssize_t eeprom_93xx46_store_erase(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct eeprom_93xx46_dev *edev = dev_get_drvdata(dev); + int erase = 0, ret; + + sscanf(buf, "%d", &erase); + if (erase) { + ret = eeprom_93xx46_ew(edev, 1); + if (ret) + return ret; + ret = eeprom_93xx46_eral(edev); + if (ret) + return ret; + ret = eeprom_93xx46_ew(edev, 0); + if (ret) + return ret; + } + return count; +} +static DEVICE_ATTR(erase, S_IWUSR, NULL, eeprom_93xx46_store_erase); + +static void select_assert(void *context) +{ + struct eeprom_93xx46_dev *edev = context; + + gpiod_set_value_cansleep(edev->pdata->select, 1); +} + +static void select_deassert(void *context) +{ + struct eeprom_93xx46_dev *edev = context; + + gpiod_set_value_cansleep(edev->pdata->select, 0); +} + +static const struct of_device_id eeprom_93xx46_of_table[] = { + { .compatible = "eeprom-93xx46", }, + { .compatible = "atmel,at93c46d", .data = &atmel_at93c46d_data, }, + {} +}; +MODULE_DEVICE_TABLE(of, eeprom_93xx46_of_table); + +static int eeprom_93xx46_probe_dt(struct spi_device *spi) +{ + const struct of_device_id *of_id = + of_match_device(eeprom_93xx46_of_table, &spi->dev); + struct device_node *np = spi->dev.of_node; + struct eeprom_93xx46_platform_data *pd; + u32 tmp; + int gpio; + enum of_gpio_flags of_flags; + int ret; + + pd = devm_kzalloc(&spi->dev, sizeof(*pd), GFP_KERNEL); + if (!pd) + return -ENOMEM; + + ret = of_property_read_u32(np, "data-size", &tmp); + if (ret < 0) { + dev_err(&spi->dev, "data-size property not found\n"); + return ret; + } + + if (tmp == 8) { + pd->flags |= EE_ADDR8; + } else if (tmp == 16) { + pd->flags |= EE_ADDR16; + } else { + dev_err(&spi->dev, "invalid data-size (%d)\n", tmp); + return -EINVAL; + } + + if (of_property_read_bool(np, "read-only")) + pd->flags |= EE_READONLY; + + gpio = of_get_named_gpio_flags(np, "select-gpios", 0, &of_flags); + if (gpio_is_valid(gpio)) { + unsigned long flags = + of_flags == OF_GPIO_ACTIVE_LOW ? GPIOF_ACTIVE_LOW : 0; + + ret = devm_gpio_request_one(&spi->dev, gpio, flags, + "eeprom_93xx46_select"); + if (ret) + return ret; + + pd->select = gpio_to_desc(gpio); + pd->prepare = select_assert; + pd->finish = select_deassert; + + gpiod_direction_output(pd->select, 0); + } + + if (of_id) { + if (of_id->data) { + const struct eeprom_93xx46_devtype_data *data = of_id->data; + + pd->quirks = data->quirks; + } + } + + spi->dev.platform_data = pd; + + return 0; +} + +static int eeprom_93xx46_probe(struct spi_device *spi) +{ + struct eeprom_93xx46_platform_data *pd; + struct eeprom_93xx46_dev *edev; + int err; + + if (spi->dev.of_node) { + err = eeprom_93xx46_probe_dt(spi); + if (err < 0) + return err; + } + + pd = spi->dev.platform_data; + if (!pd) { + dev_err(&spi->dev, "missing platform data\n"); + return -ENODEV; + } + + edev = kzalloc(sizeof(*edev), GFP_KERNEL); + if (!edev) + return -ENOMEM; + + if (pd->flags & EE_ADDR8) + edev->addrlen = 7; + else if (pd->flags & EE_ADDR16) + edev->addrlen = 6; + else { + dev_err(&spi->dev, "unspecified address type\n"); + err = -EINVAL; + goto fail; + } + + mutex_init(&edev->lock); + + edev->spi = spi; + edev->pdata = pd; + + edev->size = 128; + edev->nvmem_config.name = dev_name(&spi->dev); + edev->nvmem_config.dev = &spi->dev; + edev->nvmem_config.read_only = pd->flags & EE_READONLY; + edev->nvmem_config.root_only = true; + edev->nvmem_config.owner = THIS_MODULE; + edev->nvmem_config.compat = true; + edev->nvmem_config.base_dev = &spi->dev; + edev->nvmem_config.reg_read = eeprom_93xx46_read; + edev->nvmem_config.reg_write = eeprom_93xx46_write; + edev->nvmem_config.priv = edev; + edev->nvmem_config.stride = 4; + edev->nvmem_config.word_size = 1; + edev->nvmem_config.size = edev->size; + + edev->nvmem = nvmem_register(&edev->nvmem_config); + if (IS_ERR(edev->nvmem)) { + err = PTR_ERR(edev->nvmem); + goto fail; + } + + if (g_wb_eeprom_93xx46_debug) { + dev_info(&spi->dev, "%d-bit eeprom %s\n", + (pd->flags & EE_ADDR8) ? 8 : 16, + (pd->flags & EE_READONLY) ? "(readonly)" : ""); + } + + if (!(pd->flags & EE_READONLY)) { + if (device_create_file(&spi->dev, &dev_attr_erase)) + dev_err(&spi->dev, "can't create erase interface\n"); + } + + spi_set_drvdata(spi, edev); + return 0; +fail: + kfree(edev); + return err; +} + +static int eeprom_93xx46_remove(struct spi_device *spi) +{ + struct eeprom_93xx46_dev *edev = spi_get_drvdata(spi); + + nvmem_unregister(edev->nvmem); + + if (!(edev->pdata->flags & EE_READONLY)) + device_remove_file(&spi->dev, &dev_attr_erase); + + kfree(edev); + return 0; +} + +static struct spi_driver wb_eeprom_93xx46_driver = { + .driver = { + .name = "wb_93xx46", + .of_match_table = of_match_ptr(eeprom_93xx46_of_table), + }, + .probe = eeprom_93xx46_probe, + .remove = eeprom_93xx46_remove, +}; + +module_spi_driver(wb_eeprom_93xx46_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs"); +MODULE_AUTHOR("support"); +MODULE_ALIAS("spi:93xx46"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c new file mode 100644 index 0000000000..e46663514e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_i2c_bus_drv.c @@ -0,0 +1,1121 @@ +/* + * fpga_i2c_bus_drv.c + * ko to create fpga i2c adapter + */ +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) +#include +#endif +#include +#include +#include +#include +#include +#include +#include "fpga_i2c.h" + +#include +#include + +#define DRV_NAME "wb-fpga-i2c" +#define DRV_VERSION "1.0" +#define DTS_NO_CFG_FLAG (0) + +extern int i2c_device_func_write(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int i2c_device_func_read(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int io_device_func_read(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int spi_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int spi_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); + + +#define FPGA_I2C_STRETCH_TIMEOUT (0x01) +#define FPGA_I2C_DEADLOCK_FAILED (0x02) +#define FPGA_I2C_SLAVE_NO_RESPOND (0x03) +#define FPGA_I2C_STA_FAIL (0x01) +#define FPGA_I2C_STA_BUSY (0x02) +#define FPGA_I2C_CTL_BG (0x01 << 1) +#define FPGA_I2C_CTL_NO_REG (0x01 << 2) +#define FPGA_I2C_CTL_RD (0x01) +#define FPGA_I2C_CTL_WR (0x00) +#define I2C_READ_MSG_NUM (0x02) +#define I2C_WRITE_MSG_NUM (0x01) +#define FPGA_REG_WIDTH (4) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) +#define SYMBOL_SPI_DEV_MODE (5) + +int g_wb_fpga_i2c_debug = 0; +int g_wb_fpga_i2c_error = 0; + +module_param(g_wb_fpga_i2c_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_fpga_i2c_error, int, S_IRUGO | S_IWUSR); + +#define FPGA_I2C_VERBOSE(fmt, args...) do { \ + if (g_wb_fpga_i2c_debug) { \ + printk(KERN_INFO "[FPFA_I2C_BUS][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FPGA_I2C_ERROR(fmt, args...) do { \ + if (g_wb_fpga_i2c_error) { \ + printk(KERN_ERR "[FPFA_I2C_BUS][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static int fpga_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + FPGA_I2C_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + FPGA_I2C_ERROR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int fpga_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FPGA_I2C_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + FPGA_I2C_ERROR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int fpga_device_write(fpga_i2c_dev_t *fpga_i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (fpga_i2c->i2c_func_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = fpga_file_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_SPI_DEV_MODE: + ret = spi_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + default: + FPGA_I2C_ERROR("err func_mode, write failed.\n"); + return -EINVAL; + } + return ret; + +} + +static int fpga_device_read(fpga_i2c_dev_t *fpga_i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (fpga_i2c->i2c_func_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = fpga_file_read(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_SPI_DEV_MODE: + ret = spi_device_func_read(fpga_i2c->dev_name, pos, val, size); + break; + default: + FPGA_I2C_ERROR("err func_mode, read failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int little_endian_dword_to_buf(uint8_t *buf, int len, uint32_t dword) +{ + uint8_t tmp_buf[FPGA_REG_WIDTH]; + + if (len < 4) { + FPGA_I2C_ERROR("Not enough buf, dword to buf: len[%d], dword[0x%x]\n", len, dword); + return -1; + } + + mem_clear(tmp_buf, sizeof(tmp_buf)); + tmp_buf[0] = dword & 0xff; + tmp_buf[1] = (dword >> 8) & 0xff; + tmp_buf[2] = (dword >> 16) & 0xff; + tmp_buf[3] = (dword >> 24) & 0xff; + + memcpy(buf, tmp_buf, sizeof(tmp_buf)); + + return 0; +} + +static int little_endian_buf_to_dword(uint8_t *buf, int len, uint32_t *dword) +{ + int i; + uint32_t dword_tmp; + + if (len != FPGA_REG_WIDTH) { + FPGA_I2C_ERROR("buf length %d error, can't convert to dowrd.\n", len); + return -1; + } + dword_tmp = 0; + for (i = 0; i < FPGA_REG_WIDTH; i++) { + dword_tmp |= (buf[i] << (i * 8)); + } + *dword = dword_tmp; + return 0; +} + +static int fpga_reg_write(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t val) +{ + int ret; + + ret = fpga_device_write(fpga_i2c, addr, &val, sizeof(uint8_t)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg write failed, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga reg write success, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return 0; +} + +static int fpga_reg_read(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t *val) +{ + int ret; + + ret = fpga_device_read(fpga_i2c, addr, val, sizeof(uint8_t)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg read failed, dev name:%s, offset:0x%x\n", + fpga_i2c->dev_name, addr); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga reg read success, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, *val); + return 0; +} + +static int fpga_data_write(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + + ret = fpga_device_write(fpga_i2c, addr, val, size); + if (ret < 0) { + FPGA_I2C_ERROR("fpga data write failed, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga data write success, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return 0; +} + +static int fpga_data_read(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t *val, size_t size) +{ + int ret; + + ret = fpga_device_read(fpga_i2c, addr, val, size); + if (ret < 0) { + FPGA_I2C_ERROR("fpga data read failed, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga data read success, dev name:%s, offset:0x%x, size:%lu.\n", + fpga_i2c->dev_name, addr, size); + return 0; +} + +static int fpga_reg_write_32(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint32_t val) +{ + int ret; + uint8_t buf[FPGA_REG_WIDTH]; + + mem_clear(buf, sizeof(buf)); + little_endian_dword_to_buf(buf, sizeof(buf), val); + ret = fpga_device_write(fpga_i2c, addr, buf, sizeof(buf)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg write failed, dev name: %s, offset: 0x%x, value: 0x%x.\n", + fpga_i2c->dev_name, addr, val); + return -EIO; + } + + FPGA_I2C_VERBOSE("fpga reg write success, dev name: %s, offset: 0x%x, value: 0x%x.\n", + fpga_i2c->dev_name, addr, val); + return 0; +} + +static int fpga_reg_read_32(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint32_t *val) +{ + int ret; + uint8_t buf[FPGA_REG_WIDTH]; + + mem_clear(buf, sizeof(buf)); + ret = fpga_device_read(fpga_i2c, addr, buf, sizeof(buf)); + if (ret < 0) { + FPGA_I2C_ERROR("fpga reg read failed, dev name: %s, offset: 0x%x, ret: %d\n", + fpga_i2c->dev_name, addr, ret); + return -EIO; + } + little_endian_buf_to_dword(buf, sizeof(buf), val); + FPGA_I2C_VERBOSE("fpga reg read success, dev name: %s, offset: 0x%x, value: 0x%x.\n", + fpga_i2c->dev_name, addr, *val); + return 0; +} + +static int fpga_i2c_is_busy(fpga_i2c_dev_t *fpga_i2c) +{ + uint8_t val; + int ret; + fpga_i2c_reg_t *reg; + + reg = &fpga_i2c->reg; + ret = fpga_reg_read(fpga_i2c, reg->i2c_status, &val); + if (ret < 0 ) { + FPGA_I2C_ERROR("read fpga i2c status reg failed, reg addr:0x%x, ret:%d.\n", + reg->i2c_status, ret); + return 1; + } + if (val & FPGA_I2C_STA_BUSY) { + FPGA_I2C_ERROR("fpga i2c status busy, reg addr:0x%x, value:0x%x.\n", + reg->i2c_status, val); + return 1; + } else { + return 0; + } +} + +static int fpga_i2c_wait(fpga_i2c_dev_t *fpga_i2c) +{ + int retry_cnt; + + retry_cnt = FPGA_I2C_XFER_TIME_OUT/FPGA_I2C_SLEEP_TIME; + while (retry_cnt--) { + if (fpga_i2c_is_busy(fpga_i2c)) { + usleep_range(FPGA_I2C_SLEEP_TIME, FPGA_I2C_SLEEP_TIME + 1); + } else { + return 0; + } + } + + return -EBUSY; +} + +static int fpga_i2c_check_status(fpga_i2c_dev_t *fpga_i2c) +{ + uint8_t data; + int ret; + fpga_i2c_reg_t *reg; + + reg = &fpga_i2c->reg; + + ret = fpga_reg_read(fpga_i2c, reg->i2c_status, &data); + if (ret) { + FPGA_I2C_ERROR("read fpga i2c status reg failed, reg addr:0x%x, ret:%d.\n", + reg->i2c_status, ret); + return ret; + } + + if (data & FPGA_I2C_STA_FAIL) { + FPGA_I2C_ERROR("fpga i2c status error, reg addr:0x%x, value:%d.\n", + reg->i2c_status, data); + + /* read i2c_err_vec to confirm err type*/ + if (reg->i2c_err_vec != DTS_NO_CFG_FLAG) { + /* read i2c_err_vec reg */ + ret = fpga_reg_read(fpga_i2c, reg->i2c_err_vec, &data); + if (ret) { + FPGA_I2C_ERROR("read fpga i2c err vec reg failed, reg addr:0x%x, ret:%d.\n", + reg->i2c_err_vec, ret); + return ret; + } + FPGA_I2C_VERBOSE("get i2c err vec, reg addr:0x%x, read value:0x%x\n", reg->i2c_err_vec, data); + + /* match i2c_err_vec reg value and err type*/ + switch (data) { + case FPGA_I2C_STRETCH_TIMEOUT: + ret = -ETIMEDOUT; + break; + case FPGA_I2C_DEADLOCK_FAILED: + ret = -EDEADLK; + break; + case FPGA_I2C_SLAVE_NO_RESPOND: + ret = -ENXIO; + break; + default: + FPGA_I2C_ERROR("get i2c err vec value out of range, reg addr:0x%x, read value:0x%x\n", + reg->i2c_err_vec, data); + ret = -EREMOTEIO; + break; + } + return ret; + } else { + FPGA_I2C_VERBOSE("i2c err vec not config, fpga i2c status check return -1\n"); + return -EREMOTEIO; + } + } + return 0; +} + +static int fpga_i2c_do_work(fpga_i2c_dev_t *fpga_i2c, int i2c_addr, + unsigned char *data, uint32_t length, int is_read) +{ + int ret, i; + uint8_t op, i2c_reg_addr_len; + uint8_t *i2c_read_addr_buf; + fpga_i2c_reg_t *reg; + fpga_i2c_reg_addr_t *i2c_addr_desc; + + reg = &fpga_i2c->reg; + + ret = fpga_reg_write(fpga_i2c, reg->i2c_slave, i2c_addr); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c slave reg failed, reg addr:0x%x, value:0x%x, ret:%d.\n", + reg->i2c_slave, i2c_addr, ret); + goto exit; + } + + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + i2c_reg_addr_len = i2c_addr_desc->reg_addr_len; + i2c_read_addr_buf = &i2c_addr_desc->read_reg_addr[0]; + + if (i2c_reg_addr_len > 0 && i2c_reg_addr_len <= I2C_REG_MAX_WIDTH) { + ret = fpga_data_write(fpga_i2c, reg->i2c_reg, i2c_read_addr_buf, i2c_reg_addr_len); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c offset reg failed, fpga addr:0x%x, reg len:%d, ret:%d\n", + reg->i2c_reg, i2c_reg_addr_len, ret); + for (i = 0; i < i2c_reg_addr_len; i++) { + FPGA_I2C_ERROR("%02d : %02x\n", i, i2c_read_addr_buf[i]); + } + goto exit; + } + } + + ret = fpga_reg_write_32(fpga_i2c, reg->i2c_data_len, length); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c date len reg failed, reg addr:0x%x, value:0x%x, ret:%d.\n", + reg->i2c_data_len, length, ret); + goto exit; + } + + ret = fpga_reg_write(fpga_i2c, reg->i2c_reg_len, i2c_reg_addr_len); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c reg len reg failed, reg addr:0x%x, value:0x%x, ret:%d.\n", + reg->i2c_reg_len, i2c_reg_addr_len, ret); + goto exit; + } + + if (is_read) { + op = FPGA_I2C_CTL_RD | FPGA_I2C_CTL_BG; + } else { + + ret = fpga_data_write(fpga_i2c, reg->i2c_data_buf, data, length); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c date buf failed, reg addr:0x%x, write len:%d, ret:%d.\n", + reg->i2c_data_buf, length, ret); + goto exit; + } + op = FPGA_I2C_CTL_WR | FPGA_I2C_CTL_BG ; + } + + ret = fpga_reg_write(fpga_i2c, reg->i2c_ctrl, op); + if (ret) { + FPGA_I2C_ERROR("write fpga i2c control reg failed, reg addr:0x%x, value:%d, ret:%d.\n", + reg->i2c_ctrl, op, ret); + goto exit; + } + + ret = fpga_i2c_wait(fpga_i2c); + if (ret) { + FPGA_I2C_ERROR("wait fpga i2c status timeout.\n"); + goto exit; + } + + ret = fpga_i2c_check_status(fpga_i2c); + if (ret) { + FPGA_I2C_ERROR("check fpga i2c status error.\n"); + goto exit; + } + + if (is_read) { + + ret = fpga_data_read(fpga_i2c, reg->i2c_data_buf, data, length); + if (ret) { + FPGA_I2C_ERROR("read fpga i2c data buf failed, reg addr:0x%x, read len:%d, ret:%d.\n", + reg->i2c_data_buf, length, ret); + goto exit; + } + } + +exit: + return ret; +} + +static int fpga_i2c_write(fpga_i2c_dev_t *fpga_i2c, int target, + u8 *data, int length, int i2c_msg_num) +{ + int ret, i; + fpga_i2c_reg_addr_t *i2c_addr_desc; + + if (i2c_msg_num == I2C_READ_MSG_NUM) { + + if (length > I2C_REG_MAX_WIDTH) { + FPGA_I2C_ERROR("read reg addr len %d, more than max length.\n", length); + return -EINVAL; + } + + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + for (i = 0; i < length; i++) { + i2c_addr_desc->read_reg_addr[i] = data[length -i -1]; + FPGA_I2C_VERBOSE("%02d : %02x\n", i, i2c_addr_desc->read_reg_addr[i]); + } + i2c_addr_desc->reg_addr_len = length; + ret = 0; + } else { + + ret = fpga_i2c_do_work(fpga_i2c, target, data, length, 0); + } + + return ret; +} + +/** + * fpga_i2c_read - receive data from the bus. + * @i2c: The struct fpga_i2c_dev_t. + * @target: Target address. + * @data: Pointer to the location to store the datae . + * @length: Length of the data. + * + * The address is sent over the bus, then the data is read. + * + * Returns 0 on success, otherwise a negative errno. + */ +static int fpga_i2c_read(fpga_i2c_dev_t *fpga_i2c, int target, + u8 *data, int length) +{ + int ret, offset_size; + int i, tmp_val; + fpga_i2c_reg_addr_t *i2c_addr_desc; + uint8_t i2c_reg_addr_len; + uint8_t *i2c_read_addr_buf; + + offset_size = 0; + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + i2c_reg_addr_len = i2c_addr_desc->reg_addr_len; + i2c_read_addr_buf = &i2c_addr_desc->read_reg_addr[0]; + + while (1) { + if (length <= fpga_i2c->reg.i2c_data_buf_len) { + return fpga_i2c_do_work(fpga_i2c, target, data + offset_size, length, 1); + } + + ret = fpga_i2c_do_work(fpga_i2c, target, data + offset_size, fpga_i2c->reg.i2c_data_buf_len, 1); + if (ret != 0) { + FPGA_I2C_ERROR("fpga_i2c_read failed, i2c addr:0x%x, offset:0x%x, ret:%d.\n", + target, offset_size, ret); + return ret; + } + + tmp_val = i2c_read_addr_buf[0]; + tmp_val += fpga_i2c->reg.i2c_data_buf_len; + if (tmp_val > 0xff) { + i2c_read_addr_buf[0] = tmp_val & 0xff; + for (i = 1; i < i2c_reg_addr_len; i++) { + if (i2c_read_addr_buf[i] == 0xff) { + i2c_read_addr_buf[i] = 0; + } else { + i2c_read_addr_buf[i]++; + break; + } + } + } else { + i2c_read_addr_buf[0] = tmp_val & 0xff; + } + offset_size += fpga_i2c->reg.i2c_data_buf_len; + length -= fpga_i2c->reg.i2c_data_buf_len; + } + + return ret; +} + +static void fpga_i2c_reset(fpga_i2c_dev_t *fpga_i2c) { + fpga_i2c_reset_cfg_t *reset_cfg; + uint32_t reset_addr; + + reset_cfg = &fpga_i2c->reset_cfg; + reset_addr = reset_cfg->reset_addr; + if (reset_cfg->reset_delay_b) { + usleep_range(reset_cfg->reset_delay_b, reset_cfg->reset_delay_b + 1); + } + + fpga_reg_write_32(fpga_i2c, reset_addr, reset_cfg->reset_on); + if (reset_cfg->reset_delay) { + usleep_range(reset_cfg->reset_delay, reset_cfg->reset_delay + 1); + } + + fpga_reg_write_32(fpga_i2c, reset_addr, reset_cfg->reset_off); + if (reset_cfg->reset_delay_a) { + usleep_range(reset_cfg->reset_delay_a, reset_cfg->reset_delay_a + 1); + } + + return; +} + +/** + * fpga_i2c_xfer - The driver's master_xfer function. + * @adap: Pointer to the i2c_adapter structure. + * @msgs: Pointer to the messages to be processed. + * @num: Length of the MSGS array. + * + * Returns the number of messages processed, or a negative errno on + * failure. + */ +static int fpga_i2c_adapter_init(fpga_i2c_dev_t *fpga_i2c) +{ + int ret; + fpga_i2c_reg_t *reg; + + reg = &fpga_i2c->reg; + + ret = 0; + ret += fpga_reg_write(fpga_i2c, reg->i2c_scale, fpga_i2c->i2c_scale_value); + ret += fpga_reg_write(fpga_i2c, reg->i2c_filter, fpga_i2c->i2c_filter_value); + ret += fpga_reg_write(fpga_i2c, reg->i2c_stretch, fpga_i2c->i2c_stretch_value); + if (ret < 0) { + FPGA_I2C_ERROR("fpga_i2c_init failed.\n"); + return ret; + } + + FPGA_I2C_VERBOSE("fpga_i2c_init ok.\n"); + return 0; +} + +static int fpga_i2c_params_check(fpga_i2c_dev_t *fpga_i2c) +{ + int ret; + fpga_i2c_reg_t *reg; + uint8_t i2c_scale_value, i2c_filter_value, i2c_stretch_value; + + reg = &fpga_i2c->reg; + ret = 0; + ret += fpga_reg_read(fpga_i2c, reg->i2c_scale, &i2c_scale_value); + ret += fpga_reg_read(fpga_i2c, reg->i2c_filter, &i2c_filter_value); + ret += fpga_reg_read(fpga_i2c, reg->i2c_stretch, &i2c_stretch_value); + if (ret < 0) { + FPGA_I2C_ERROR("read fpga i2c params failed.\n"); + return 1; + } + + if ((i2c_scale_value != fpga_i2c->i2c_scale_value) + || (i2c_filter_value != fpga_i2c->i2c_filter_value) + || (i2c_stretch_value != fpga_i2c->i2c_stretch_value)) { + FPGA_I2C_ERROR("fpga i2c params check error, read value: i2c_scale 0x%x, i2c_filter:0x%x, i2c_stretch:0x%x.\n", + i2c_scale_value, i2c_filter_value, i2c_stretch_value); + FPGA_I2C_ERROR("fpga i2c params check error, config value: i2c_scale 0x%x, i2c_filter:0x%x, i2c_stretch:0x%x.\n", + fpga_i2c->i2c_scale_value, fpga_i2c->i2c_filter_value, fpga_i2c->i2c_stretch_value); + return 1; + } + + FPGA_I2C_VERBOSE("fpga i2c params check ok.\n"); + return 0; +} + +static int fpga_i2c_xfer(struct i2c_adapter *adap, + struct i2c_msg *msgs, int num) +{ + struct i2c_msg *pmsg; + int i; + int ret; + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_addr_t *i2c_addr_desc; + + fpga_i2c = i2c_get_adapdata(adap); + + if (num != I2C_READ_MSG_NUM && num != I2C_WRITE_MSG_NUM) { + FPGA_I2C_ERROR("unsupport i2c_msg len:%d.\n", num); + return -EINVAL; + } + + if ((num == I2C_WRITE_MSG_NUM) && (msgs[0].len > fpga_i2c->reg.i2c_data_buf_len)) { + FPGA_I2C_ERROR("unsupport i2c_msg type:msg[0].flag:0x%x, buf len:0x%x.\n", + msgs[0].flags, msgs[0].len); + return -EINVAL; + } + + if (num == I2C_READ_MSG_NUM ) { + if ((msgs[0].flags & I2C_M_RD) ||!(msgs[1].flags & I2C_M_RD)) { + FPGA_I2C_ERROR("unsupport i2c_msg type:msg[0].flag:0x%x, msg[1].flag:0x%x.\n", + msgs[0].flags, msgs[1].flags); + return -EINVAL; + } + } + + if (fpga_i2c_is_busy(fpga_i2c)) { + FPGA_I2C_ERROR("fpga i2c adapter %d is busy, do reset.\n", adap->nr); + if (fpga_i2c->reset_cfg.i2c_adap_reset_flag == 1) { + + fpga_i2c_reset(fpga_i2c); + + fpga_i2c_adapter_init(fpga_i2c); + } + return -EAGAIN; + } + + if (fpga_i2c->i2c_params_check && fpga_i2c_params_check(fpga_i2c)) { + FPGA_I2C_ERROR("fpga i2c params check failed, try to reinitialize.\n"); + fpga_i2c_adapter_init(fpga_i2c); + } + + ret = 0; + i2c_addr_desc = &fpga_i2c->i2c_addr_desc; + i2c_addr_desc->reg_addr_len = 0; + mem_clear(i2c_addr_desc->read_reg_addr, sizeof(i2c_addr_desc->read_reg_addr)); + + for (i = 0; ret == 0 && i < num; i++) { + pmsg = &msgs[i]; + FPGA_I2C_VERBOSE("Doing %s %d byte(s) to/from 0x%02x - %d of %d messages\n", + pmsg->flags & I2C_M_RD ? "read" : "write", pmsg->len, pmsg->addr, i + 1, num); + + if (pmsg->flags & I2C_M_RD) { + ret = fpga_i2c_read(fpga_i2c, pmsg->addr, pmsg->buf, pmsg->len); + + if ((pmsg->len == 1) && (pmsg->flags & I2C_M_RECV_LEN)) { + if ((ret != 0) || (pmsg->buf[0] > I2C_SMBUS_BLOCK_MAX)) { + FPGA_I2C_ERROR("smbus block data read failed, ret:%d, read len:%u.\n", + ret, pmsg->buf[0]); + return -EPROTO; + } + pmsg->len = 1 + pmsg->buf[0]; + FPGA_I2C_VERBOSE("smbus block data read, read len:%d.\n", pmsg->len); + ret = fpga_i2c_read(fpga_i2c, pmsg->addr, pmsg->buf, pmsg->len); + } + } else { + ret = fpga_i2c_write(fpga_i2c, pmsg->addr, pmsg->buf, pmsg->len, num); + } + } + + return (ret != 0) ? ret : num; +} + +static u32 fpga_i2c_functionality(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_BLOCK_DATA; +} + +static const struct i2c_algorithm fpga_i2c_algo = { + .master_xfer = fpga_i2c_xfer, + .functionality = fpga_i2c_functionality, +}; + +static struct i2c_adapter fpga_i2c_ops = { + .owner = THIS_MODULE, + .name = "wb_fpga_i2c", + .algo = &fpga_i2c_algo, +}; + +static int fpga_i2c_config_init(fpga_i2c_dev_t *fpga_i2c) +{ + int ret = 0, rv = 0; + fpga_i2c_reg_t *reg; + fpga_i2c_reset_cfg_t *reset_cfg; + struct device *dev; + uint32_t i2c_offset_reg, i2c_data_buf_len_reg; + int32_t i2c_offset_val; + + fpga_i2c_bus_device_t *fpga_i2c_bus_device; + + dev = fpga_i2c->dev; + reg = &fpga_i2c->reg; + reset_cfg = &fpga_i2c->reset_cfg; + + i2c_offset_val = 0; + + if (dev->of_node) { + ret = 0; + ret += of_property_read_u32(dev->of_node, "i2c_ext_9548_addr", ®->i2c_ext_9548_addr); + ret += of_property_read_u32(dev->of_node, "i2c_ext_9548_chan", ®->i2c_ext_9548_chan); + ret += of_property_read_u32(dev->of_node, "i2c_slave", ®->i2c_slave); + ret += of_property_read_u32(dev->of_node, "i2c_reg", ®->i2c_reg); + ret += of_property_read_u32(dev->of_node, "i2c_data_len", ®->i2c_data_len); + ret += of_property_read_u32(dev->of_node, "i2c_ctrl", ®->i2c_ctrl); + ret += of_property_read_u32(dev->of_node, "i2c_status", ®->i2c_status); + ret += of_property_read_u32(dev->of_node, "i2c_scale", ®->i2c_scale); + ret += of_property_read_u32(dev->of_node, "i2c_filter", ®->i2c_filter); + ret += of_property_read_u32(dev->of_node, "i2c_stretch", ®->i2c_stretch); + ret += of_property_read_u32(dev->of_node, "i2c_ext_9548_exits_flag", ®->i2c_ext_9548_exits_flag); + ret += of_property_read_u32(dev->of_node, "i2c_reg_len", ®->i2c_reg_len); + ret += of_property_read_u32(dev->of_node, "i2c_in_9548_chan", ®->i2c_in_9548_chan); + ret += of_property_read_u32(dev->of_node, "i2c_data_buf", ®->i2c_data_buf); + ret += of_property_read_string(dev->of_node, "dev_name", &fpga_i2c->dev_name); + ret += of_property_read_u32(dev->of_node, "i2c_scale_value", &fpga_i2c->i2c_scale_value); + ret += of_property_read_u32(dev->of_node, "i2c_filter_value", &fpga_i2c->i2c_filter_value); + ret += of_property_read_u32(dev->of_node, "i2c_stretch_value", &fpga_i2c->i2c_stretch_value); + ret += of_property_read_u32(dev->of_node, "i2c_timeout", &fpga_i2c->i2c_timeout); + ret += of_property_read_u32(dev->of_node, "i2c_func_mode", &fpga_i2c->i2c_func_mode); + ret += of_property_read_u32(dev->of_node, "i2c_reset_addr", &reset_cfg->reset_addr); + ret += of_property_read_u32(dev->of_node, "i2c_reset_on", &reset_cfg->reset_on); + ret += of_property_read_u32(dev->of_node, "i2c_reset_off", &reset_cfg->reset_off); + ret += of_property_read_u32(dev->of_node, "i2c_rst_delay_b", &reset_cfg->reset_delay_b); + ret += of_property_read_u32(dev->of_node, "i2c_rst_delay", &reset_cfg->reset_delay); + ret += of_property_read_u32(dev->of_node, "i2c_rst_delay_a", &reset_cfg->reset_delay_a); + ret += of_property_read_u32(dev->of_node, "i2c_adap_reset_flag", &reset_cfg->i2c_adap_reset_flag); + + if (ret != 0) { + FPGA_I2C_ERROR("dts config error, ret:%d.\n", ret); + ret = -ENXIO; + return ret; + } + + rv = of_property_read_u32(dev->of_node, "i2c_data_buf_len_reg", &i2c_data_buf_len_reg); + if (rv == 0) { + ret = fpga_reg_read_32(fpga_i2c, i2c_data_buf_len_reg, ®->i2c_data_buf_len); + if (ret < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c data buf length, reg addr: 0x%x, ret: %d\n", + i2c_data_buf_len_reg, ret); + return ret; + } + FPGA_I2C_VERBOSE("fpga i2c data buf length reg addr: 0x%x, value: %d\n", + i2c_data_buf_len_reg, reg->i2c_data_buf_len); + if (reg->i2c_data_buf_len == 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + } + } else { + ret = of_property_read_u32(dev->of_node, "i2c_data_buf_len", ®->i2c_data_buf_len); + if (ret != 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + ret = 0; + } + } + + rv = of_property_read_u32(dev->of_node, "i2c_offset_reg", &i2c_offset_reg); + if (rv == 0) { + ret = fpga_reg_read_32(fpga_i2c, i2c_offset_reg, &i2c_offset_val); + if (ret < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c adapter offset value, reg addr: 0x%x, ret: %d\n", + i2c_offset_reg, ret); + return ret; + } + FPGA_I2C_VERBOSE("fpga i2c adapter offset reg addr: 0x%x, value: %d\n", + i2c_offset_reg, i2c_offset_val); + reg->i2c_scale +=i2c_offset_val; + reg->i2c_filter += i2c_offset_val; + reg->i2c_stretch += i2c_offset_val; + reg->i2c_ext_9548_exits_flag += i2c_offset_val; + reg->i2c_ext_9548_addr += i2c_offset_val; + reg->i2c_ext_9548_chan += i2c_offset_val; + reg->i2c_in_9548_chan += i2c_offset_val; + reg->i2c_slave += i2c_offset_val; + reg->i2c_reg += i2c_offset_val; + reg->i2c_reg_len += i2c_offset_val; + reg->i2c_data_len += i2c_offset_val; + reg->i2c_ctrl += i2c_offset_val; + reg->i2c_status += i2c_offset_val; + reg->i2c_data_buf += i2c_offset_val; + } + + ret = of_property_read_u32(dev->of_node, "i2c_err_vec", ®->i2c_err_vec); + if (ret != 0) { + reg->i2c_err_vec = DTS_NO_CFG_FLAG; + FPGA_I2C_VERBOSE("not support i2c_err_vec cfg. ret: %d, set DTS_NO_CFG_FLAG: %d\n", + ret, reg->i2c_err_vec); + ret = 0; /* Not configuring i2c_err_vec is not an error */ + } else { + if (i2c_offset_val != 0) { + reg->i2c_err_vec += i2c_offset_val; + } + } + } else { + if (dev->platform_data == NULL) { + dev_err(fpga_i2c->dev, "Failed to get platform data config.\n"); + ret = -ENXIO; + return ret; + } + fpga_i2c_bus_device = dev->platform_data; + fpga_i2c->dev_name = fpga_i2c_bus_device->dev_name; + fpga_i2c->adap_nr = fpga_i2c_bus_device->adap_nr; + fpga_i2c->i2c_scale_value = fpga_i2c_bus_device->i2c_scale_value; + fpga_i2c->i2c_filter_value = fpga_i2c_bus_device->i2c_filter_value; + fpga_i2c->i2c_stretch_value = fpga_i2c_bus_device->i2c_stretch_value; + fpga_i2c->i2c_timeout = fpga_i2c_bus_device->i2c_timeout; + fpga_i2c->i2c_func_mode = fpga_i2c_bus_device->i2c_func_mode; + fpga_i2c->i2c_params_check = fpga_i2c_bus_device->i2c_func_mode; + + reset_cfg->reset_addr = fpga_i2c_bus_device->i2c_reset_addr; + reset_cfg->reset_on = fpga_i2c_bus_device->i2c_reset_on; + reset_cfg->reset_off = fpga_i2c_bus_device->i2c_reset_off; + reset_cfg->reset_delay_b = fpga_i2c_bus_device->i2c_rst_delay_b; + reset_cfg->reset_delay = fpga_i2c_bus_device->i2c_rst_delay; + reset_cfg->reset_delay_a = fpga_i2c_bus_device->i2c_rst_delay_a; + reset_cfg->i2c_adap_reset_flag = fpga_i2c_bus_device->i2c_adap_reset_flag; + + reg->i2c_ext_9548_addr = fpga_i2c_bus_device->i2c_ext_9548_addr; + reg->i2c_ext_9548_chan = fpga_i2c_bus_device->i2c_ext_9548_chan; + reg->i2c_slave = fpga_i2c_bus_device->i2c_slave; + reg->i2c_reg = fpga_i2c_bus_device->i2c_reg; + reg->i2c_data_len = fpga_i2c_bus_device->i2c_data_len; + reg->i2c_ctrl = fpga_i2c_bus_device->i2c_ctrl; + reg->i2c_status = fpga_i2c_bus_device->i2c_status; + reg->i2c_scale = fpga_i2c_bus_device->i2c_scale; + reg->i2c_filter = fpga_i2c_bus_device->i2c_filter; + reg->i2c_stretch = fpga_i2c_bus_device->i2c_stretch; + reg->i2c_ext_9548_exits_flag = fpga_i2c_bus_device->i2c_ext_9548_exits_flag; + reg->i2c_reg_len = fpga_i2c_bus_device->i2c_reg_len; + reg->i2c_in_9548_chan = fpga_i2c_bus_device->i2c_in_9548_chan; + reg->i2c_data_buf = fpga_i2c_bus_device->i2c_data_buf; + + i2c_data_buf_len_reg = fpga_i2c_bus_device->i2c_data_buf_len_reg; + if (i2c_data_buf_len_reg > 0) { + ret = fpga_reg_read_32(fpga_i2c, i2c_data_buf_len_reg, ®->i2c_data_buf_len); + if (ret < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c data buf length, reg addr: 0x%x, ret: %d\n", + i2c_data_buf_len_reg, ret); + return ret; + } + FPGA_I2C_VERBOSE("fpga i2c data buf length reg addr: 0x%x, value: %d\n", + i2c_data_buf_len_reg, reg->i2c_data_buf_len); + if (reg->i2c_data_buf_len == 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + } + } else { + if (fpga_i2c_bus_device->i2c_data_buf_len == 0) { + reg->i2c_data_buf_len = FPGA_I2C_RDWR_MAX_LEN_DEFAULT; + FPGA_I2C_VERBOSE("not support i2c_data_buf_len cfg, set default_val:%d\n", + reg->i2c_data_buf_len); + } else { + reg->i2c_data_buf_len = fpga_i2c_bus_device->i2c_data_buf_len; + } + } + + i2c_offset_reg = fpga_i2c_bus_device->i2c_offset_reg; + if (i2c_offset_reg > 0) { + rv = fpga_reg_read_32(fpga_i2c, i2c_offset_reg, &i2c_offset_val); + if (rv < 0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c adapter offset value, reg addr: 0x%x, rv: %d\n", + i2c_offset_reg, rv); + return rv; + } + FPGA_I2C_VERBOSE("fpga i2c adapter offset reg addr: 0x%x, value: %d\n", + i2c_offset_reg, i2c_offset_val); + reg->i2c_scale +=i2c_offset_val; + reg->i2c_filter += i2c_offset_val; + reg->i2c_stretch += i2c_offset_val; + reg->i2c_ext_9548_exits_flag += i2c_offset_val; + reg->i2c_ext_9548_addr += i2c_offset_val; + reg->i2c_ext_9548_chan += i2c_offset_val; + reg->i2c_in_9548_chan += i2c_offset_val; + reg->i2c_slave += i2c_offset_val; + reg->i2c_reg += i2c_offset_val; + reg->i2c_reg_len += i2c_offset_val; + reg->i2c_data_len += i2c_offset_val; + reg->i2c_ctrl += i2c_offset_val; + reg->i2c_status += i2c_offset_val; + reg->i2c_data_buf += i2c_offset_val; + } + + if (fpga_i2c_bus_device->i2c_err_vec == 0) { + reg->i2c_err_vec = DTS_NO_CFG_FLAG; + FPGA_I2C_VERBOSE("not support i2c_err_vec cfg, set DTS_NO_CFG_FLAG:%d\n", + reg->i2c_err_vec); + } else { + reg->i2c_err_vec = fpga_i2c_bus_device->i2c_err_vec; + if (i2c_offset_val != 0) { + reg->i2c_err_vec += i2c_offset_val; + } + } + } + + FPGA_I2C_VERBOSE("i2c_ext_9548_addr:0x%x, i2c_ext_9548_chan:0x%x, i2c_slave:0x%x, i2c_reg:0x%x, i2c_data_len:0x%x.\n", + reg->i2c_ext_9548_addr, reg->i2c_ext_9548_chan, reg->i2c_slave, reg->i2c_reg, reg->i2c_data_len); + FPGA_I2C_VERBOSE("i2c_ctrl:0x%x, i2c_status:0x%x, i2c_scale:0x%x, i2c_filter:0x%x, i2c_stretch:0x%x.\n", + reg->i2c_ctrl, reg->i2c_status, reg->i2c_scale, reg->i2c_filter, reg->i2c_stretch); + FPGA_I2C_VERBOSE("i2c_ext_9548_exits_flag:0x%x, i2c_in_9548_chan:0x%x, i2c_data_buf:0x%x, i2c_reg_len:0x%x, i2c_data_buf_len:0x%x.\n", + reg->i2c_ext_9548_exits_flag, reg->i2c_in_9548_chan, reg->i2c_data_buf, reg->i2c_reg_len, reg->i2c_data_buf_len); + FPGA_I2C_VERBOSE("dev_name:%s, i2c_scale_value:0x%x, i2c_filter_value:0x%x, i2c_stretch_value:0x%x, i2c_timeout:0x%x.\n", + fpga_i2c->dev_name, fpga_i2c->i2c_scale_value, fpga_i2c->i2c_filter_value, fpga_i2c->i2c_stretch_value, fpga_i2c->i2c_timeout); + FPGA_I2C_VERBOSE("i2c_reset_addr:0x%x, i2c_reset_on:0x%x, i2c_reset_off:0x%x, i2c_rst_delay_b:0x%x, i2c_rst_delay:0x%x, i2c_rst_delay_a:0x%x.\n", + reset_cfg->reset_addr, reset_cfg->reset_on, reset_cfg->reset_off, reset_cfg->reset_delay_b, reset_cfg->reset_delay, reset_cfg->reset_delay_a); + FPGA_I2C_VERBOSE("i2c_adap_reset_flag:0x%x.\n", reset_cfg->i2c_adap_reset_flag); + FPGA_I2C_VERBOSE("i2c_err_vec:0x%x\n", reg->i2c_err_vec); + + return ret; +} + +static int fpga_i2c_probe(struct platform_device *pdev) +{ + int ret; + fpga_i2c_dev_t *fpga_i2c; + struct device *dev; + + fpga_i2c = devm_kzalloc(&pdev->dev, sizeof(fpga_i2c_dev_t), GFP_KERNEL); + if (!fpga_i2c) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + goto out; + } + + fpga_i2c->dev = &pdev->dev; + + ret = fpga_i2c_config_init(fpga_i2c); + if (ret !=0) { + dev_err(fpga_i2c->dev, "Failed to get fpga i2c dts config.\n"); + goto out; + } + + ret = fpga_i2c_adapter_init(fpga_i2c); + if (ret !=0) { + dev_err(fpga_i2c->dev, "Failed to init fpga i2c adapter.\n"); + goto out; + } + + if (fpga_i2c->dev->of_node) { + fpga_i2c->i2c_params_check = of_property_read_bool(fpga_i2c->dev->of_node, "i2c_params_check"); + } + FPGA_I2C_VERBOSE("fpga i2c params check flag:%d.\n", fpga_i2c->i2c_params_check); + + init_waitqueue_head(&fpga_i2c->queue); + + dev = fpga_i2c->dev; + fpga_i2c->adap = fpga_i2c_ops; + fpga_i2c->adap.timeout = msecs_to_jiffies(fpga_i2c->i2c_timeout); + fpga_i2c->adap.dev.parent = &pdev->dev; + fpga_i2c->adap.dev.of_node = pdev->dev.of_node; + i2c_set_adapdata(&fpga_i2c->adap, fpga_i2c); + platform_set_drvdata(pdev, fpga_i2c); + + if (fpga_i2c->dev->of_node) { + /* adap.nr get from dts aliases */ + ret = i2c_add_adapter(&fpga_i2c->adap); + } else { + fpga_i2c->adap.nr = fpga_i2c->adap_nr; + ret = i2c_add_numbered_adapter(&fpga_i2c->adap); + } + + if (ret < 0) { + dev_info(fpga_i2c->dev, "Failed to add adapter.\n"); + goto fail_add; + } + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0) + of_i2c_register_devices(&fpga_i2c->adap); +#endif + dev_info(fpga_i2c->dev, "registered i2c-%d for %s using mode %d with base address:0x%x, data buf len: %d success.\n", + fpga_i2c->adap.nr, fpga_i2c->dev_name, fpga_i2c->i2c_func_mode, fpga_i2c->reg.i2c_scale, + fpga_i2c->reg.i2c_data_buf_len); + return 0; + +fail_add: + platform_set_drvdata(pdev, NULL); +out: + return ret; +}; + +static int fpga_i2c_remove(struct platform_device *pdev) +{ + fpga_i2c_dev_t *fpga_i2c; + + fpga_i2c = platform_get_drvdata(pdev); + i2c_del_adapter(&fpga_i2c->adap); + platform_set_drvdata(pdev, NULL); + return 0; +}; + +static struct of_device_id fpga_i2c_match[] = { + { + .compatible = "wb-fpga-i2c", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, fpga_i2c_match); + +static struct platform_driver wb_fpga_i2c_driver = { + .probe = fpga_i2c_probe, + .remove = fpga_i2c_remove, + .driver = { + .owner = THIS_MODULE, + .name = DRV_NAME, + .of_match_table = fpga_i2c_match, + }, +}; + +static int __init wb_fpga_i2c_init(void) +{ + return platform_driver_register(&wb_fpga_i2c_driver); +} + +static void __exit wb_fpga_i2c_exit(void) +{ + platform_driver_unregister(&wb_fpga_i2c_driver); +} + +module_init(wb_fpga_i2c_init); +module_exit(wb_fpga_i2c_exit); +MODULE_DESCRIPTION("fpga i2c adapter driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c new file mode 100644 index 0000000000..5845195bb3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pca954x_drv.c @@ -0,0 +1,525 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fpga_i2c.h" + +extern int i2c_device_func_write(const char *path, uint32_t pos, uint8_t *val, size_t size); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); + +#define PCA954X_MAX_NCHANS (8) +#define FPGA_INTERNAL_PCA9548 (1) +#define FPGA_EXTERNAL_PCA9548 (2) +#define FPGA_I2C_EXT_9548_EXITS (0x01 << 0) +#define FPGA_I2C_9548_NO_RESET (0x01 << 1) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) + +int g_fpga_pca954x_debug = 0; +int g_fpga_pca954x_error = 0; + +module_param(g_fpga_pca954x_debug, int, S_IRUGO | S_IWUSR); +module_param(g_fpga_pca954x_error, int, S_IRUGO | S_IWUSR); + +#define FPGA_PCA954X_VERBOSE(fmt, args...) do { \ + if (g_fpga_pca954x_debug) { \ + printk(KERN_INFO "[FPGA_PCA954X][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FPGA_PCA954X_ERROR(fmt, args...) do { \ + if (g_fpga_pca954x_error) { \ + printk(KERN_ERR "[FPGA_PCA954X][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +enum pca_type { + pca_9540, + pca_9541, + pca_9542, + pca_9543, + pca_9544, + pca_9545, + pca_9546, + pca_9547, + pca_9548, +}; + +struct pca954x { + enum pca_type type; + struct i2c_adapter *virt_adaps[PCA954X_MAX_NCHANS]; + u8 last_chan; /* last register value */ + uint32_t fpga_9548_flag; + uint32_t fpga_9548_reset_flag; + uint32_t pca9548_base_nr; + struct i2c_client *client; +}; + +struct chip_desc { + u8 nchans; + u8 enable; /* used for muxes only */ + enum muxtype { + pca954x_ismux = 0, + pca954x_isswi + } muxtype; +}; + +/* Provide specs for the PCA954x types we know about */ +static const struct chip_desc chips[] = { + [pca_9540] = { + .nchans = 2, + .enable = 0x4, + .muxtype = pca954x_ismux, + }, + [pca_9541] = { + .nchans = 1, + .muxtype = pca954x_isswi, + }, + [pca_9543] = { + .nchans = 2, + .muxtype = pca954x_isswi, + }, + [pca_9544] = { + .nchans = 4, + .enable = 0x4, + .muxtype = pca954x_ismux, + }, + [pca_9545] = { + .nchans = 4, + .muxtype = pca954x_isswi, + }, + [pca_9547] = { + .nchans = 8, + .enable = 0x8, + .muxtype = pca954x_ismux, + }, + [pca_9548] = { + .nchans = 8, + .muxtype = pca954x_isswi, + }, +}; + +static const struct i2c_device_id fpga_pca954x_id[] = { + { "wb_fpga_pca9540", pca_9540 }, + { "wb_fpga_pca9541", pca_9541 }, + { "wb_fpga_pca9542", pca_9543 }, + { "wb_fpga_pca9543", pca_9543 }, + { "wb_fpga_pca9544", pca_9544 }, + { "wb_fpga_pca9545", pca_9545 }, + { "wb_fpga_pca9546", pca_9545 }, + { "wb_fpga_pca9547", pca_9547 }, + { "wb_fpga_pca9548", pca_9548 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, fpga_pca954x_id); + +static int fpga_file_write(const char *path, int pos, unsigned char *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + FPGA_PCA954X_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + FPGA_PCA954X_ERROR("kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; + +} +static int fpga_device_write(fpga_i2c_dev_t *fpga_i2c, int pos, unsigned char *val, size_t size) +{ + int ret; + + switch (fpga_i2c->i2c_func_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = fpga_file_write(fpga_i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(fpga_i2c->dev_name, pos, val, size); + break; + default: + FPGA_PCA954X_ERROR("err func mode, write failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int fpga_reg_write(fpga_i2c_dev_t *fpga_i2c, uint32_t addr, uint8_t val) +{ + int ret; + + ret = fpga_device_write(fpga_i2c, addr, &val, sizeof(uint8_t)); + if (ret < 0) { + FPGA_PCA954X_ERROR("fpga_device_write failed. name:%s, addr:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return ret; + } + + FPGA_PCA954X_VERBOSE("fpga reg write success, dev name:%s, offset:0x%x, value:0x%x.\n", + fpga_i2c->dev_name, addr, val); + return 0; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,7) +static int pca954x_select_chan(struct i2c_adapter *adap, void *client, u32 chan) +{ + struct pca954x *data = i2c_get_clientdata(client); + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + u8 regval, i2c_9548_opt; + + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + FPGA_PCA954X_VERBOSE("root bus:%d, chan:0x%x, 9548 flag:0x%x, 9548 addr:0x%x.\n", + adap->nr, chan, data->fpga_9548_flag, client->addr); + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + + regval = 1 << chan; + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, regval); + } else { + if (data->fpga_9548_reset_flag == 1) { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS & ~(FPGA_I2C_9548_NO_RESET); + } else { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS | FPGA_I2C_9548_NO_RESET; + } + FPGA_PCA954X_VERBOSE("fpga pca9548 reset flag:0x%x, opt:0x%x.\n", + data->fpga_9548_reset_flag, i2c_9548_opt); + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, i2c_9548_opt); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_addr, client->addr); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, regval); + } + + return ret; +} + +static int pca954x_deselect_mux(struct i2c_adapter *adap, void *client, u32 chan) +{ + struct pca954x *data = i2c_get_clientdata(client); + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + /* Deselect active channel */ + data->last_chan = 0; + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, 0); + } else { + + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, FPGA_I2C_9548_NO_RESET); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, 0); + } + + return ret; +} +#else +static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_client *client = data->client; + struct i2c_adapter *adap; + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + u8 regval, i2c_9548_opt; + + adap = muxc->parent; + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + FPGA_PCA954X_VERBOSE("root bus:%d, chan:0x%x, 9548 flag:0x%x, 9548 addr:0x%x.\n", + adap->nr, chan, data->fpga_9548_flag, client->addr); + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + + regval = 1 << chan; + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, regval); + } else { + if (data->fpga_9548_reset_flag == 1) { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS & ~(FPGA_I2C_9548_NO_RESET); + } else { + i2c_9548_opt = FPGA_I2C_EXT_9548_EXITS | FPGA_I2C_9548_NO_RESET; + } + FPGA_PCA954X_VERBOSE("fpga pca9548 reset flag:0x%x, opt:0x%x.\n", + data->fpga_9548_reset_flag, i2c_9548_opt); + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, i2c_9548_opt); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_addr, client->addr); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, regval); + } + + return ret; +} + +static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan) +{ + struct pca954x *data = i2c_mux_priv(muxc); + struct i2c_adapter *adap; + fpga_i2c_dev_t *fpga_i2c; + fpga_i2c_reg_t *reg; + int ret; + + adap = muxc->parent; + while(i2c_parent_is_i2c_adapter(adap)){ + adap = to_i2c_adapter(adap->dev.parent); + } + + fpga_i2c = i2c_get_adapdata(adap); + reg = &fpga_i2c->reg; + ret = 0; + /* Deselect active channel */ + data->last_chan = 0; + + if (data->fpga_9548_flag == FPGA_INTERNAL_PCA9548) { + ret = fpga_reg_write(fpga_i2c, reg->i2c_in_9548_chan, 0); + } else { + + ret = fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_exits_flag, FPGA_I2C_9548_NO_RESET); + ret += fpga_reg_write(fpga_i2c, reg->i2c_ext_9548_chan, 0); + } + + return ret; +} +#endif +/* + * I2C init/probing/exit functions + */ +static int fpga_i2c_pca954x_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct i2c_adapter *adap = to_i2c_adapter(client->dev.parent); + int num, force, class; + struct pca954x *data; + int ret = -ENODEV; + struct device *dev; + int dynamic_nr = 1; + fpga_pca954x_device_t *fpga_pca954x_device; + +#if LINUX_VERSION_CODE > KERNEL_VERSION(4,6,7) + struct i2c_mux_core *muxc; +#endif + + if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE)) { + dev_err(&client->dev, "i2c adapter:%d, unsupport I2C_FUNC_SMBUS_BYTE.\n", adap->nr); + goto err; + } + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + data = kzalloc(sizeof(struct pca954x), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "kzalloc failed.\n"); + ret = -ENOMEM; + goto err; + } + + i2c_set_clientdata(client, data); +#else + muxc = i2c_mux_alloc(adap, &client->dev, + PCA954X_MAX_NCHANS, sizeof(*data), 0, + pca954x_select_chan, pca954x_deselect_mux); + if (!muxc) { + dev_err(&client->dev, "i2c_mux_alloc failed.\n"); + return -ENOMEM; + } + data = i2c_mux_priv(muxc); + i2c_set_clientdata(client, muxc); + data->client = client; +#endif + + dev = &client->dev; + if (dev == NULL) { + dev_err(&client->dev, "dev is NULL.\n"); + ret = -ENODEV; + goto exit_free; + } + + if (dev->of_node == NULL) { + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "Failed to get 954x platform data config.\n"); + ret = -EINVAL; + goto exit_free; + } + fpga_pca954x_device = client->dev.platform_data; + data->fpga_9548_flag = fpga_pca954x_device->fpga_9548_flag; + data->fpga_9548_reset_flag = fpga_pca954x_device->fpga_9548_reset_flag; + data->pca9548_base_nr = fpga_pca954x_device->pca9548_base_nr; + if (data->pca9548_base_nr == 0) { + + dynamic_nr = 1; + } else { + dynamic_nr = 0; + FPGA_PCA954X_VERBOSE("pca9548_base_nr:%u.\n", data->pca9548_base_nr); + } + } else { + data->type = id->driver_data; + /* BUS ID */ + ret = of_property_read_u32(dev->of_node, "fpga_9548_flag", &data->fpga_9548_flag); + ret += of_property_read_u32(dev->of_node, "fpga_9548_reset_flag", &data->fpga_9548_reset_flag); + if (ret != 0) { + dev_err(&client->dev, "Failed to get 954x dts config, ret:%d.\n", ret); + ret = -EINVAL; + goto exit_free; + } + if (of_property_read_u32(dev->of_node, "pca9548_base_nr", &data->pca9548_base_nr)) { + + dynamic_nr = 1; + FPGA_PCA954X_VERBOSE("pca9548_base_nr not found, use dynamic adap number"); + } else { + dynamic_nr = 0; + FPGA_PCA954X_VERBOSE("pca9548_base_nr:%u.\n", data->pca9548_base_nr); + } + } + + if (data->fpga_9548_flag != FPGA_EXTERNAL_PCA9548 && data->fpga_9548_flag != FPGA_INTERNAL_PCA9548) { + dev_err(&client->dev, "Error: fpga 954x flag config error, value:0x%x.\n", data->fpga_9548_flag); + ret = -EINVAL; + goto exit_free; + } + + data->type = id->driver_data; + data->last_chan = 0; /* force the first selection */ + + /* Now create an adapter for each channel */ + for (num = 0; num < chips[data->type].nchans; num++) { + if (dynamic_nr == 1) { + force = 0; /* dynamic adap number */ + } else { + force = data->pca9548_base_nr + num; + } + class = 0; /* no class by default */ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + data->virt_adaps[num] = + i2c_add_mux_adapter(adap, &client->dev, client, + force, num, class, pca954x_select_chan, pca954x_deselect_mux); + + if (data->virt_adaps[num] == NULL) { + ret = -ENODEV; + dev_err(&client->dev, "Failed to register multiplexed adapter %d as bus %d\n", + num, force); + goto virt_reg_failed; + } +#else + ret = i2c_mux_add_adapter(muxc, force, num, class); + if (ret) { + dev_err(&client->dev, "Failed to register multiplexed adapter %d as bus %d\n", + num, force); + goto virt_reg_failed; + } +#endif + } /* end for num = 0; num < chips[data->type].nchans... */ + + dev_info(&client->dev, "registered %d multiplexed busses for I2C %s %s\n", + num, chips[data->type].muxtype == pca954x_ismux ? "mux" : "switch", client->name); + + return 0; + +virt_reg_failed: +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + for (num--; num >= 0; num--) + i2c_del_mux_adapter(data->virt_adaps[num]); +exit_free: + kfree(data); +#else +exit_free: + i2c_mux_del_adapters(muxc); +#endif +err: + return ret; +} + +static int fpga_i2c_pca954x_remove(struct i2c_client *client) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,6,7) + struct pca954x *data = i2c_get_clientdata(client); + const struct chip_desc *chip = &chips[data->type]; + int i; + + for (i = 0; i < chip->nchans; ++i) + if (data->virt_adaps[i]) { + i2c_del_mux_adapter(data->virt_adaps[i]); + data->virt_adaps[i] = NULL; + } + + kfree(data); +#else + struct i2c_mux_core *muxc = i2c_get_clientdata(client); + + i2c_mux_del_adapters(muxc); +#endif + + return 0; +} + +static struct i2c_driver fpga_i2c_pca954x_driver = { + .driver = { + .name = "wb_fpga_pca954x", + .owner = THIS_MODULE, + }, + .probe = fpga_i2c_pca954x_probe, + .remove = fpga_i2c_pca954x_remove, + .id_table = fpga_pca954x_id, +}; + +static int __init fpga_i2c_pca954x_init(void) +{ + int ret; + + ret = i2c_add_driver(&fpga_i2c_pca954x_driver); + return ret; +} + +static void __exit fpga_i2c_pca954x_exit(void) +{ + i2c_del_driver(&fpga_i2c_pca954x_driver); +} + +module_init(fpga_i2c_pca954x_init); +module_exit(fpga_i2c_pca954x_exit); +MODULE_DESCRIPTION("fpga pca954x driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c new file mode 100644 index 0000000000..aedcc78dab --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_fpga_pcie.c @@ -0,0 +1,164 @@ +/* + * wb_fpga_pcie.c + * ko to enable fpga pcie + */ +#include +#include +#include +#include +#include + +#define FPGA_MSI_IRQ_NUM (14) +#define FPGA_MSI_IRQ_BEGIN (0) +#define XILINX_FPGA_USE_MSI (0) +#define XILINX_FPGA_NUSE_MSI (1) + +int g_fpga_pcie_dev_debug = 0; +int g_fpga_pcie_dev_error = 0; +module_param(g_fpga_pcie_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_fpga_pcie_dev_error, int, S_IRUGO | S_IWUSR); + +#define FPGA_PCIE_DEV_VERBOSE(fmt, args...) do { \ + if (g_fpga_pcie_dev_debug) { \ + printk(KERN_INFO "[FPGA_PCIE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define FPGA_PCIE_DEV_ERROR(fmt, args...) do { \ + if (g_fpga_pcie_dev_error) { \ + printk(KERN_ERR "[FPGA_PCIE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct wb_fpga_pcie_s { + struct pci_dev *pci_dev; + int driver_data; +} wb_fpga_pcie_t; + +static void fpga_pcie_recover(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct resource *mem_base; + u32 bar0_val; + int ret; + + mem_base = &pdev->resource[0]; + ret = pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &bar0_val); + if (ret) { + FPGA_PCIE_DEV_ERROR("pci_read_config_dword failed ret %d.\n", ret); + return; + } + FPGA_PCIE_DEV_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], ret %d.\n", + mem_base->start, bar0_val, ret); + + if (bar0_val != mem_base->start) { + ret = pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, mem_base->start); + if (ret) { + FPGA_PCIE_DEV_ERROR("pci_write_config_dword mem_base->start[0x%llx], failed ret %d.\n", mem_base->start, ret); + return; + } + FPGA_PCIE_DEV_VERBOSE("pci_write_config_dword mem_base->start[0x%llx] success.\n", mem_base->start); + } else { + FPGA_PCIE_DEV_VERBOSE("mem_base->start[0x%llx], bar0_val[0x%x], do nothing.\n", + mem_base->start, bar0_val); + } +} + +static int fpga_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + int err; + wb_fpga_pcie_t *wb_fpga_pcie; + + FPGA_PCIE_DEV_VERBOSE("Enter vendor 0x%x, subsystem_vendor 0x%x.\n", pdev->vendor, pdev->subsystem_vendor); + + wb_fpga_pcie = devm_kzalloc(&pdev->dev, sizeof(wb_fpga_pcie_t), GFP_KERNEL); + if (!wb_fpga_pcie) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + fpga_pcie_recover(pdev, id); + + /* enable device: ask low-level code to enable I/O and memory */ + FPGA_PCIE_DEV_VERBOSE("start pci_enable_device!\n"); + err = pci_enable_device(pdev); + if (err) { + dev_err(&pdev->dev, "Failed to enable pci device, ret:%d.\n", err); + return err; + } + + FPGA_PCIE_DEV_VERBOSE("start pci_set_master!\n"); + pci_set_master(pdev); + + wb_fpga_pcie->driver_data = id->driver_data; + wb_fpga_pcie->pci_dev = pdev; + pci_set_drvdata(pdev, wb_fpga_pcie); + + if (wb_fpga_pcie->driver_data == XILINX_FPGA_USE_MSI) { + FPGA_PCIE_DEV_VERBOSE("start pci_enable_msi_range!\n"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,152) + err = pci_enable_msi_range(pdev, FPGA_MSI_IRQ_BEGIN + 1, FPGA_MSI_IRQ_NUM); +#else + err = pci_alloc_irq_vectors_affinity(pdev, FPGA_MSI_IRQ_BEGIN + 1, + FPGA_MSI_IRQ_NUM, PCI_IRQ_MSI, NULL); +#endif + if (err != FPGA_MSI_IRQ_NUM) { + FPGA_PCIE_DEV_ERROR("pci_enable_msi_block err %d FPGA_MSI_IRQ_NUM %d.\n", err, + FPGA_MSI_IRQ_NUM); + dev_err(&pdev->dev, "Failed to enable pci msi, ret:%d.\n", err); + return -EINVAL; + } + } + + dev_info(&pdev->dev, "fpga pci device init success.\n"); + return 0; +} + +static void fpga_pcie_remove(struct pci_dev *pdev) +{ + wb_fpga_pcie_t *wb_fpga_pcie; + + FPGA_PCIE_DEV_VERBOSE("fpga_pcie_remove.\n"); + + wb_fpga_pcie = pci_get_drvdata(pdev); + if (wb_fpga_pcie->driver_data == XILINX_FPGA_USE_MSI) { + FPGA_PCIE_DEV_VERBOSE("start pci_disable_msi!\n"); + pci_disable_msi(pdev); + } + + pci_disable_device(pdev); + return; +} + +static const struct pci_device_id fpga_pci_ids[] = { + { PCI_DEVICE(0x10ee, 0x7022), .driver_data = XILINX_FPGA_USE_MSI}, + { PCI_DEVICE(0x10ee, 0x7011), .driver_data = XILINX_FPGA_NUSE_MSI}, + {0} +}; +MODULE_DEVICE_TABLE(pci, fpga_pci_ids); + +static struct pci_driver wb_fpga_pcie_driver = { + .name = "wb_fpga_pcie", + .id_table = fpga_pci_ids,/* only dynamic id's */ + .probe = fpga_pcie_probe, + .remove = fpga_pcie_remove, +}; + +static int __init wb_fpga_pcie_init(void) +{ + + FPGA_PCIE_DEV_VERBOSE("wb_fpga_pcie_init enter!\n"); + return pci_register_driver(&wb_fpga_pcie_driver); +} + +static void __exit wb_fpga_pcie_exit(void) +{ + FPGA_PCIE_DEV_VERBOSE("wb_fpga_pcie_exit enter!\n"); + pci_unregister_driver(&wb_fpga_pcie_driver); + return; +} + +module_init(wb_fpga_pcie_init); +module_exit(wb_fpga_pcie_exit); +MODULE_DESCRIPTION("fpga pcie driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c new file mode 100644 index 0000000000..7d5d5da87e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_d1500.c @@ -0,0 +1,367 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2011, 2012 Cavium Inc. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GPIO_NAME "wb_gpio_d1500" + +#define GPIO_BASE (0x500) +#define GP_IO_SEL (GPIO_BASE + 0x4) +#define GP_LVL (GPIO_BASE + 0xC) +#define GPI_NMI_EN (GPIO_BASE + 0x28) +#define GPI_NMI_STS (GPIO_BASE + 0x2a) +#define GPI_INV (GPIO_BASE + 0x2c) +#define GPIO_USE_SEL2 (GPIO_BASE + 0x30) +#define GP_IO_SEL2 (GPIO_BASE + 0x34) +#define GP_LVL2 (GPIO_BASE + 0x38) +#define GPI_NMI_EN_2 (GPIO_BASE + 0x3c) +#define GPI_NMI_STS_2 (GPIO_BASE + 0x3e) +#define GPIO_USE_SEL3 (GPIO_BASE + 0x40) +#define GP_IO_SEL3 (GPIO_BASE + 0x44) +#define GP_LVL3 (GPIO_BASE + 0x48) +#define GPI_NMI_EN_3 (GPIO_BASE + 0x50) +#define GPI_NMI_STS_3 (GPIO_BASE + 0x54) + +#define GPIO_BASE_ID (0) +#define BANKSIZE (32) +#define D1500_GPIO_PIN_NUM (96) +#define CELL_NUM (2) + +int g_gpio_d1500_debug = 0; +int g_gpio_d1500_error = 0; +module_param(g_gpio_d1500_debug, int, S_IRUGO | S_IWUSR); +module_param(g_gpio_d1500_error, int, S_IRUGO | S_IWUSR); + +#define GPIO_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_gpio_d1500_debug) { \ + printk(KERN_ERR "[GPIO-D1500][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define GPIO_DEBUG_ERROR(fmt, args...) do { \ + if (g_gpio_d1500_error) { \ + printk(KERN_ERR "[GPIO-D1500][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static DEFINE_SPINLOCK(sio_lock); + +struct gpio_d1500_t { + struct gpio_chip chip; + u64 register_base; +}; + +static int wb_gpio_get(struct gpio_chip *gc, unsigned gpio_num) +{ + u32 data = 0; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_LVL) & (1 << offset); + if (data) { + data = 1; + } + } else if (bank == 1) { + data = inl(GP_LVL2) & (1 << offset); + if (data) { + data = 1; + } + } else if (bank == 2) { + data = inl(GP_LVL3) & (1 << offset); + if (data) { + data = 1; + } + } + spin_unlock_irqrestore(&sio_lock, flags); + + return data; +} + +static int wb_gpio_direction_in(struct gpio_chip *gc, unsigned gpio_num) +{ + u32 data; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_IO_SEL); + data = data | (1 << offset); + outl(data, GP_IO_SEL); + } else if (bank == 1) { + data = inl(GP_IO_SEL2); + data = data | (1 << offset); + outl(data, GP_IO_SEL2); + } else if (bank == 2) { + data = inl(GP_IO_SEL3); + data = data | (1 << offset); + outl(data, GP_IO_SEL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return 0; +} + +static void wb_gpio_set(struct gpio_chip *gc, + unsigned gpio_num, int val) +{ + u32 data; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_LVL); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL); + } else if (bank == 1) { + data = inl(GP_LVL2); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL2); + } else if (bank == 2) { + data = inl(GP_LVL3); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return; +} + +static int wb_gpio_direction_out(struct gpio_chip *gc, + unsigned gpio_num, int val) +{ + u32 data; + unsigned int bank, offset; + unsigned long flags; + + bank = gpio_num / BANKSIZE; + offset = gpio_num % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GP_IO_SEL); + data = data & ~(1 << offset); + outl(data, GP_IO_SEL); + + data = inl(GP_LVL); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL); + } else if (bank == 1) { + data = inl(GP_IO_SEL2); + data = data & ~(1 << offset); + outl(data, GP_IO_SEL2); + + data = inl(GP_LVL2); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL2); + } else if (bank == 2) { + data = inl(GP_IO_SEL3); + data = data & ~(1 << offset); + outl(data, GP_IO_SEL3); + + data = inl(GP_LVL3); + if (val) { + data = data | (1 << offset); + } else { + data = data & ~(1 << offset); + } + outl(data, GP_LVL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return 0; +} + +#ifdef CONFIG_OF +static int wb_gpio_of_xlate(struct gpio_chip *chip, + const struct of_phandle_args *gpio_desc, + u32 *flags) +{ + if (chip->of_gpio_n_cells < 2) { + return -EINVAL; + } + + if (flags) { + *flags = gpio_desc->args[1]; + } + + return gpio_desc->args[0]; +} +#endif + +static int wb_gpio_request(struct gpio_chip *chip, unsigned int offset) +{ + u32 data; + unsigned int bank, tmp_offset; + unsigned long flags; + + bank = offset / BANKSIZE; + tmp_offset = offset % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GPIO_BASE); + data = data | (1 << tmp_offset); + outl(data, GPIO_BASE); + } else if (bank == 1) { + data = inl(GPIO_USE_SEL2); + data = data | (1 << tmp_offset); + outl(data, GPIO_USE_SEL2); + } else if (bank == 2) { + data = inl(GPIO_USE_SEL3); + data = data | (1 << tmp_offset); + outl(data, GPIO_USE_SEL3); + } + spin_unlock_irqrestore(&sio_lock, flags); + + return 0; +} + +#if 0 +static void wb_gpio_free(struct gpio_chip *chip, unsigned int offset) +{ + u32 data; + unsigned int bank, tmp_offset; + unsigned long flags; + + bank = offset / BANKSIZE; + tmp_offset = offset % BANKSIZE; + + spin_lock_irqsave(&sio_lock, flags); + if (bank == 0) { + data = inl(GPIO_BASE); + data = data & ~(1 << tmp_offset); + outl(data, GPIO_BASE); + } else if (bank == 1) { + data = inl(GPIO_USE_SEL2); + data = data & ~(1 << tmp_offset); + outl(data, GPIO_USE_SEL2); + } else if (bank == 2) { + data = inl(GPIO_USE_SEL3); + data = data & ~(1 << tmp_offset); + outl(data, GPIO_USE_SEL3); + } + + spin_unlock_irqrestore(&sio_lock, flags); + + return; +} +#endif + +static struct gpio_chip wb_gpio_chip = { + .label = GPIO_NAME, + .owner = THIS_MODULE, + .base = GPIO_BASE_ID, + .get = wb_gpio_get, + .direction_input = wb_gpio_direction_in, + .set = wb_gpio_set, + .direction_output = wb_gpio_direction_out, +#ifdef CONFIG_OF + .of_xlate = wb_gpio_of_xlate, +#endif + .request = wb_gpio_request, + .ngpio = D1500_GPIO_PIN_NUM, +#ifdef CONFIG_OF + .of_gpio_n_cells = CELL_NUM, +#endif + .can_sleep = false, +}; + +static int wb_gpio_probe(struct platform_device *pdev) +{ + struct gpio_d1500_t *gpio; + int err; + + gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); + if (!gpio) { + dev_err(&pdev->dev, "gpio kzalloc failed\n"); + return -ENOMEM; + } + + wb_gpio_chip.parent = &pdev->dev; + gpio->register_base = GPIO_BASE; + gpio->chip = wb_gpio_chip; + pdev->dev.platform_data = &wb_gpio_chip; + err = devm_gpiochip_add_data(&pdev->dev, &wb_gpio_chip, gpio); + if (err) { + dev_err(&pdev->dev, "gpiochip add failed\n"); + return err; + } + + dev_info(&pdev->dev, "register %llu gpio success.\n", gpio->register_base); + + return 0; +} + +static int wb_gpio_remove(struct platform_device *pdev) +{ + dev_info(&pdev->dev, "unregister d1500 gpio success\n"); + return 0; +} + +static const struct of_device_id gpio_d1500_match[] = { + { + .compatible = "wb_gpio_d1500", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, gpio_d1500_match); + +static struct platform_driver wb_gpio_driver = { + .driver = { + .name = GPIO_NAME, + .of_match_table = gpio_d1500_match, + }, + .probe = wb_gpio_probe, + .remove = wb_gpio_remove, +}; + +module_platform_driver(wb_gpio_driver); + +MODULE_DESCRIPTION("d1500 gpio driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c new file mode 100644 index 0000000000..75f883b590 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_gpio_device.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include + +static int g_wb_gpio_device_debug = 0; +static int g_wb_gpio_device_error = 0; + +module_param(g_wb_gpio_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_gpio_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_GPIO_DEVICE_VERBOSE(fmt, args...) do { \ + if (g_wb_gpio_device_debug) { \ + printk(KERN_INFO "[WB_GPIO_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_GPIO_DEVICE_ERROR(fmt, args...) do { \ + if (g_wb_gpio_device_error) { \ + printk(KERN_ERR "[WB_GPIO_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static void wb_gpio_device_release(struct device *dev) +{ + return; +} + +static struct platform_device wb_gpio_d1500_device = { + .name = "wb_gpio_d1500", + .id = -1, + .dev = { + .release = wb_gpio_device_release, + }, +}; + +static int __init wb_gpio_device_init(void) +{ + WB_GPIO_DEVICE_VERBOSE("wb_gpio_device_init enter!\n"); + return platform_device_register(&wb_gpio_d1500_device); +} + +static void __exit wb_gpio_device_exit(void) +{ + WB_GPIO_DEVICE_VERBOSE("wb_gpio_device_exit enter!\n"); + return platform_device_unregister(&wb_gpio_d1500_device); +} + +module_init(wb_gpio_device_init); +module_exit(wb_gpio_device_exit); +MODULE_DESCRIPTION("GPIO Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c new file mode 100644 index 0000000000..14f85f33f5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.c @@ -0,0 +1,774 @@ +/* + * wb_io_dev.c + * ko to read/write i2c client through /dev/XXX device + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_dev.h" + +#define MAX_I2C_DEV_NUM (256) +#define FPGA_MAX_LEN (256) +#define MAX_NAME_SIZE (20) +#define MAX_BUS_WIDTH (16) +#define TRANSFER_WRITE_BUFF (FPGA_MAX_LEN + MAX_BUS_WIDTH) + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) + +static int g_i2c_dev_debug = 0; +static int g_i2c_dev_error = 0; + +module_param(g_i2c_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_i2c_dev_error, int, S_IRUGO | S_IWUSR); + +#define I2C_DEV_DEBUG_DMESG(fmt, args...) do { \ + if (g_i2c_dev_debug) { \ + printk(KERN_ERR "[I2C_DEV][DEBUG][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define I2C_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_i2c_dev_error) { \ + printk(KERN_ERR "[I2C_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct i2c_dev_info* i2c_dev_arry[MAX_I2C_DEV_NUM]; + +struct i2c_dev_info { + const char *name; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + uint32_t i2c_len; + struct miscdevice misc; + struct i2c_client *client; +}; + +static int transfer_read(struct i2c_client *client, u8 *buf, loff_t regaddr, size_t count) +{ + struct i2c_adapter *adap; + int i; + u8 offset_buf[MAX_BUS_WIDTH]; + struct i2c_msg msgs[2]; + int msgs_num, ret; + struct i2c_dev_info *i2c_dev; + + if (!client) { + I2C_DEV_DEBUG_ERROR("can't get read client\n"); + return -ENODEV; + } + + adap = client->adapter; + if (!adap) { + I2C_DEV_DEBUG_ERROR("can't get read adap\n"); + return -ENODEV; + } + + i2c_dev = i2c_get_clientdata(client); + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\n", + i2c_dev->addr_bus_width); + return -EINVAL; + } + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width; + msgs[0].buf = offset_buf; + + msgs[1].addr = client->addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = count; + msgs[1].buf = buf; + + msgs_num = 2; + ret = i2c_transfer(client->adapter, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer read error\n"); + return -EINVAL; + } + } else { + I2C_DEV_DEBUG_ERROR("don't find read master_xfer\n"); + return -EINVAL; + + } + return 0; +} + +static int transfer_write(struct i2c_client *client, u8 *buf, loff_t regaddr, size_t count) +{ + struct i2c_adapter *adap; + int i; + u8 offset_buf[TRANSFER_WRITE_BUFF]; + struct i2c_msg msgs[1]; + int msgs_num, ret; + struct i2c_dev_info *i2c_dev; + + if (!client) { + I2C_DEV_DEBUG_ERROR("can't get write client\n"); + return -ENODEV; + } + + adap = client->adapter; + if (!adap) { + I2C_DEV_DEBUG_ERROR("can't get write adap\n"); + return -ENODEV; + } + + i2c_dev = i2c_get_clientdata(client); + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\n", + i2c_dev->addr_bus_width); + return -EINVAL; + } + + memcpy(offset_buf + i2c_dev->addr_bus_width, buf, count); + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + + msgs[0].addr = client->addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width + count; + msgs[0].buf = offset_buf; + + msgs_num = 1; + ret = i2c_transfer(adap, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer write error\n"); + return -EINVAL; + } + } else { + I2C_DEV_DEBUG_ERROR("don't find write master_xfer\n"); + return -EINVAL; + } + + return 0; +} + +static long i2c_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static int i2c_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + struct i2c_dev_info *i2c_dev; + + i2c_dev = i2c_dev_arry[minor]; + if (i2c_dev == NULL) { + return -ENODEV; + } + + file->private_data = i2c_dev; + + return 0; +} + +static int i2c_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static int device_read(struct i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 tmp_offset; + u8 val[FPGA_MAX_LEN]; + u32 width, rd_len, per_len, tmp; + u32 max_per_len; + + if (offset > i2c_dev->i2c_len) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, count: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + if (count > (i2c_dev->i2c_len - offset)) { + I2C_DEV_DEBUG_DMESG("read count out of range. input len:%lu, read len:%u.\n", + count, i2c_dev->i2c_len - offset); + count = i2c_dev->i2c_len - offset; + } + + if (count == 0) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, read len: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\n", width); + return -EINVAL; + } + + max_per_len = i2c_dev->per_rd_len; + tmp = (width - 1) & count; + rd_len = (tmp == 0) ? count : count + width - tmp; + per_len = (rd_len > max_per_len) ? (max_per_len) : (rd_len); + + mem_clear(val, sizeof(val)); + for (i = 0; i < rd_len; i += per_len) { + ret = transfer_read(i2c_dev->client, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("read error.read offset = %u\n", (offset + i)); + return -EFAULT; + } + } + + if (width == WIDTH_1Byte) { + memcpy(buf, val, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + buf[i + j] = val[i + width - j - 1]; + } + } + } + + return count; +} + +static int device_write(struct i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 tmp_offset; + u32 width; + u8 val[FPGA_MAX_LEN]; + u32 wr_len, per_len, tmp; + u32 max_per_len; + + if (offset > i2c_dev->i2c_len) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, count: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + if (count > (i2c_dev->i2c_len - offset)) { + I2C_DEV_DEBUG_DMESG("read count out of range. input len:%lu, read len:%u.\n", + count, i2c_dev->i2c_len - offset); + count = i2c_dev->i2c_len - offset; + } + + if (count == 0) { + I2C_DEV_DEBUG_DMESG("offset: 0x%x, i2c len: 0x%x, read len: %lu, EOF.\n", + offset, i2c_dev->i2c_len, count); + return 0; + } + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\n", width); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + + if (width == WIDTH_1Byte) { + memcpy(val, buf, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + val[i + width - j - 1] = buf[i + j]; + } + } + } + + max_per_len = i2c_dev->per_wr_len; + tmp = (width - 1) & count; + wr_len = (tmp == 0) ? count : count + width - tmp; + per_len = (wr_len > max_per_len) ? (max_per_len) : (wr_len); + + for (i = 0; i < wr_len; i += per_len) { + ret = transfer_write(i2c_dev->client, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("write error.offset = %u\n", (offset + i)); + return -EFAULT; + } + } + return count; +} + +static ssize_t i2c_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int ret, read_len; + struct i2c_dev_info *i2c_dev; + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("can't get read private_data.n"); + return -EINVAL; + } + + if (count == 0) { + I2C_DEV_DEBUG_ERROR("Invalid params, read count is 0.n"); + return -EINVAL; + } + + if (count > sizeof(val)) { + I2C_DEV_DEBUG_DMESG("read conut %lu exceed max %lu.\n", count, sizeof(val)); + count = sizeof(val); + } + + mem_clear(val, sizeof(val)); + read_len = device_read(i2c_dev, (uint32_t)*offset, val, count); + if (read_len < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, (uint32_t)*offset, count); + return read_len; + } + + if (access_ok(buf, read_len)) { + I2C_DEV_DEBUG_DMESG("user space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + if (copy_to_user(buf, val, read_len)) { + I2C_DEV_DEBUG_ERROR("copy_to_user failed.\n"); + return -EFAULT; + } + } else { + I2C_DEV_DEBUG_DMESG("kernel space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + memcpy(buf, val, read_len); + } + + *offset += read_len; + ret = read_len; + return ret; +} + +static ssize_t i2c_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) +{ + int ret; + + I2C_DEV_DEBUG_DMESG("i2c_dev_read_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, to->count, iocb->ki_pos); + ret = i2c_dev_read(iocb->ki_filp, to->kvec->iov_base, to->count, &iocb->ki_pos); + return ret; +} + +static ssize_t i2c_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int write_len; + struct i2c_dev_info *i2c_dev; + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("get write private_data error.\n"); + return -EINVAL; + } + + if (count == 0) { + I2C_DEV_DEBUG_ERROR("Invalid params, write count is 0.\n"); + return -EINVAL; + } + + if (count > sizeof(val)) { + I2C_DEV_DEBUG_DMESG("write conut %lu exceed max %lu.\n", count, sizeof(val)); + count = sizeof(val); + } + + mem_clear(val, sizeof(val)); + if (access_ok(buf, count)) { + I2C_DEV_DEBUG_DMESG("user space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + if (copy_from_user(val, buf, count)) { + I2C_DEV_DEBUG_ERROR("copy_from_user failed.\n"); + return -EFAULT; + } + } else { + I2C_DEV_DEBUG_DMESG("kernel space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + memcpy(val, buf, count); + } + + write_len = device_write(i2c_dev, (uint32_t)*offset, val, count); + if (write_len < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%llx, len:%lu.\n", + i2c_dev->name, *offset, count); + return write_len; + } + + *offset += write_len; + return write_len; +} + +static ssize_t i2c_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + int ret; + + I2C_DEV_DEBUG_DMESG("i2c_dev_write_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, from->count, iocb->ki_pos); + ret = i2c_dev_write(iocb->ki_filp, from->kvec->iov_base, from->count, &iocb->ki_pos); + return ret; +} + +static loff_t i2c_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + struct i2c_dev_info *i2c_dev; + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev is NULL, llseek failed.\n"); + return -EINVAL; + } + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + I2C_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + if (offset > i2c_dev->i2c_len) { + I2C_DEV_DEBUG_ERROR("SEEK_SET out of range, offset:%lld, i2c_len:0x%x.\n", + offset, i2c_dev->i2c_len); + ret = - EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (((file->f_pos + offset) > i2c_dev->i2c_len) || ((file->f_pos + offset) < 0)) { + I2C_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld, i2c_len:0x%x.\n", + file->f_pos, offset, i2c_dev->i2c_len); + ret = - EINVAL; + break; + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + I2C_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static const struct file_operations i2c_dev_fops = { + .owner = THIS_MODULE, + .llseek = i2c_dev_llseek, + .read_iter = i2c_dev_read_iter, + .write_iter = i2c_dev_write_iter, + .unlocked_ioctl = i2c_dev_ioctl, + .open = i2c_dev_open, + .release = i2c_dev_release, +}; + +static struct i2c_dev_info * dev_match(const char *path) +{ + struct i2c_dev_info * i2c_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + for (i = 0; i < MAX_I2C_DEV_NUM; i++) { + if (i2c_dev_arry[ i ] == NULL) { + continue; + } + i2c_dev = i2c_dev_arry[ i ]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", i2c_dev->name); + if (!strcmp(path, dev_name)) { + I2C_DEV_DEBUG_DMESG("get dev_name = %s, minor = %d\n", dev_name, i); + return i2c_dev; + } + } + + return NULL; +} + +int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("read conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_read(i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("fpga i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(i2c_device_func_read); + +int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("write conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_write (i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(i2c_device_func_write); + +static int i2c_dev_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret = 0; + struct i2c_dev_info *i2c_dev; + struct miscdevice *misc; + i2c_dev_device_t *i2c_dev_device; + + i2c_dev = devm_kzalloc(&client->dev, sizeof(struct i2c_dev_info), GFP_KERNEL); + if (!i2c_dev) { + dev_err(&client->dev, "devm_kzalloc error. \n"); + return -ENOMEM; + } + + i2c_set_clientdata(client, i2c_dev); + i2c_dev->client = client; + + if (client->dev.of_node) { + + ret += of_property_read_string(client->dev.of_node, "i2c_name", &i2c_dev->name); + ret += of_property_read_u32(client->dev.of_node, "data_bus_width", &i2c_dev->data_bus_width); + ret += of_property_read_u32(client->dev.of_node, "addr_bus_width", &i2c_dev->addr_bus_width); + ret += of_property_read_u32(client->dev.of_node, "per_rd_len", &i2c_dev->per_rd_len); + ret += of_property_read_u32(client->dev.of_node, "per_wr_len", &i2c_dev->per_wr_len); + ret += of_property_read_u32(client->dev.of_node, "i2c_len", &i2c_dev->i2c_len); + if (ret != 0) { + dev_err(&client->dev, "dts config error.ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + i2c_dev_device = client->dev.platform_data; + i2c_dev->name = i2c_dev_device->i2c_name; + i2c_dev->data_bus_width = i2c_dev_device->data_bus_width; + i2c_dev->addr_bus_width = i2c_dev_device->addr_bus_width; + i2c_dev->per_rd_len = i2c_dev_device->per_rd_len; + i2c_dev->per_wr_len = i2c_dev_device->per_wr_len; + i2c_dev->i2c_len = i2c_dev_device->i2c_len; + } + + if ((i2c_dev->per_rd_len & (i2c_dev->data_bus_width - 1)) || + (i2c_dev->per_wr_len & (i2c_dev->data_bus_width - 1))) { + dev_err(&client->dev, "Invalid config per_rd_len %d per_wr_len %d data bus_width %d.\n", + i2c_dev->per_rd_len, i2c_dev->per_wr_len, i2c_dev->data_bus_width); + return -ENXIO; + } + + if ((i2c_dev->i2c_len == 0) || (i2c_dev->i2c_len & (i2c_dev->data_bus_width - 1))) { + dev_err(&client->dev, "Invalid config i2c_len %d, data bus_width %d.\n", + i2c_dev->i2c_len, i2c_dev->data_bus_width); + return -ENXIO; + } + + misc = &i2c_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = i2c_dev->name; + misc->fops = &i2c_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&client->dev, "register %s faild.\n", misc->name); + return -ENXIO; + } + + if (misc->minor >= MAX_I2C_DEV_NUM) { + dev_err(&client->dev, "minor number beyond the limit! is %d.\n", misc->minor); + misc_deregister(misc); + return -ENXIO; + } + i2c_dev_arry[misc->minor] = i2c_dev; + + dev_info(&client->dev, "register %u addr_bus_width %u data_bus_width 0x%x i2c_len device %s with %u per_rd_len %u per_wr_len success.\n", + i2c_dev->addr_bus_width, i2c_dev->data_bus_width, i2c_dev->i2c_len, i2c_dev->name, i2c_dev->per_rd_len, i2c_dev->per_wr_len); + + return 0; +} + +static int i2c_dev_remove(struct i2c_client *client) +{ + int i; + for (i = 0; i < MAX_I2C_DEV_NUM; i++) { + if (i2c_dev_arry[i] != NULL) { + misc_deregister(&i2c_dev_arry[i]->misc); + i2c_dev_arry[i] = NULL; + } + } + return 0; +} + +static const struct i2c_device_id i2c_dev_id[] = { + { "wb-i2c-dev", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, i2c_dev_id); + +static const struct of_device_id i2c_dev_of_match[] = { + { .compatible = "wb-i2c-dev" }, + { }, +}; +MODULE_DEVICE_TABLE(of, i2c_dev_of_match); + +static struct i2c_driver i2c_dev_driver = { + .driver = { + .name = "wb-i2c-dev", + .of_match_table = i2c_dev_of_match, + }, + .probe = i2c_dev_probe, + .remove = i2c_dev_remove, + .id_table = i2c_dev_id, +}; +module_i2c_driver(i2c_dev_driver); + +MODULE_DESCRIPTION("i2c dev driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h new file mode 100644 index 0000000000..9cc95d88e8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_dev.h @@ -0,0 +1,20 @@ +#ifndef __WB_I2C_DEV_H__ +#define __WB_I2C_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define I2C_DEV_NAME_MAX_LEN (64) + +typedef struct i2c_dev_device_s { + struct i2c_client *client; + uint32_t i2c_bus; + uint32_t i2c_addr; + char i2c_name[I2C_DEV_NAME_MAX_LEN]; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + uint32_t i2c_len; +} i2c_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c new file mode 100644 index 0000000000..1f69d96bad --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.c @@ -0,0 +1,1143 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * i2c-ocores.c: I2C bus driver for OpenCores I2C controller + * (https://opencores.org/project/i2c/overview) + * + * Peter Korsgaard + * + * Support for the GRLIB port of the controller by + * Andreas Larsson + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_i2c_ocores.h" + +#define OCORES_FLAG_POLL BIT(0) + +/* registers */ +#define OCI2C_PRELOW (0) +#define OCI2C_PREHIGH (1) +#define OCI2C_CONTROL (2) +#define OCI2C_DATA (3) +#define OCI2C_CMD (4) /* write only */ +#define OCI2C_STATUS (4) /* read only, same address as OCI2C_CMD */ + +#define OCI2C_CTRL_IEN (0x40) +#define OCI2C_CTRL_EN (0x80) + +#define OCI2C_CMD_START (0x91) +#define OCI2C_CMD_STOP (0x41) +#define OCI2C_CMD_READ (0x21) +#define OCI2C_CMD_WRITE (0x11) +#define OCI2C_CMD_READ_ACK (0x21) +#define OCI2C_CMD_READ_NACK (0x29) +#define OCI2C_CMD_IACK (0x01) + +#define OCI2C_STAT_IF (0x01) +#define OCI2C_STAT_TIP (0x02) +#define OCI2C_STAT_ARBLOST (0x20) +#define OCI2C_STAT_BUSY (0x40) +#define OCI2C_STAT_NACK (0x80) + +#define STATE_DONE (0) +#define STATE_START (1) +#define STATE_WRITE (2) +#define STATE_READ (3) +#define STATE_ERROR (4) + +#define TYPE_OCORES (0) +#define TYPE_GRLIB (1) + +#define OCORE_WAIT_SCH (40) +#define REG_IO_WIDTH_1 (1) +#define REG_IO_WIDTH_2 (2) +#define REG_IO_WIDTH_4 (4) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) + +typedef struct wb_pci_dev_s { + uint32_t domain; + uint32_t bus; + uint32_t slot; + uint32_t fn; +} wb_pci_dev_t; + +/* + * 'process_lock' exists because ocores_process() and ocores_process_timeout() + * can't run in parallel. + */ +struct ocores_i2c { + uint32_t base_addr; + uint32_t reg_shift; + uint32_t reg_io_width; + unsigned long flags; + wait_queue_head_t wait; + struct i2c_adapter adap; + int adap_nr; + struct i2c_msg *msg; + int pos; + int nmsgs; + int state; + spinlock_t process_lock; + uint32_t ip_clock_khz; + uint32_t bus_clock_khz; + void (*setreg)(struct ocores_i2c *i2c, int reg, u32 value); + u32 (*getreg)(struct ocores_i2c *i2c, int reg); + const char *dev_name; + uint32_t reg_access_mode; + uint32_t big_endian; + uint32_t irq_offset; + wb_pci_dev_t wb_pci_dev; + struct device *dev; +}; + +int g_wb_ocores_i2c_debug = 0; +int g_wb_ocores_i2c_error = 0; +int g_wb_ocores_i2c_xfer = 0; + +module_param(g_wb_ocores_i2c_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_ocores_i2c_error, int, S_IRUGO | S_IWUSR); +module_param(g_wb_ocores_i2c_xfer, int, S_IRUGO | S_IWUSR); + +#define OCORES_I2C_VERBOSE(fmt, args...) do { \ + if (g_wb_ocores_i2c_debug) { \ + printk(KERN_INFO "[OCORES_I2C][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define OCORES_I2C_ERROR(fmt, args...) do { \ + if (g_wb_ocores_i2c_error) { \ + printk(KERN_ERR "[OCORES_I2C][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define OCORES_I2C_XFER(fmt, args...) do { \ + if (g_wb_ocores_i2c_xfer) { \ + printk(KERN_INFO "[OCORES_I2C][XFER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +extern int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +#if 0 +int __attribute__((weak)) i2c_device_func_read(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak i2c func read\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) i2c_device_func_write(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak i2c func write\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) pcie_device_func_read(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak pcie func read\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) pcie_device_func_write(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak pcie func write\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) io_device_func_read(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak io func read\r\n"); + return -EINVAL; +} + +int __attribute__((weak)) io_device_func_write(const char *path, uint32_t offset, + uint8_t *buf, size_t count) +{ + OCORES_I2C_ERROR("enter __weak io func write\r\n"); + return -EINVAL; +} +#endif +static int ocores_i2c_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + OCORES_I2C_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + OCORES_I2C_ERROR("kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int ocores_i2c_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + OCORES_I2C_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + OCORES_I2C_ERROR("kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int ocores_i2c_reg_write(struct ocores_i2c *i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (i2c->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = ocores_i2c_file_write(i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(i2c->dev_name, pos, val, size); + break; + default: + OCORES_I2C_ERROR("err func_mode, write failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int ocores_i2c_reg_read(struct ocores_i2c *i2c, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (i2c->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(i2c->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = ocores_i2c_file_read(i2c->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(i2c->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(i2c->dev_name, pos, val, size); + break; + default: + OCORES_I2C_ERROR("err func_mode, read failed.\n"); + return -EINVAL; + } + + return ret; +} +static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_1); + return; +} + +static void oc_setreg_16(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + buf_tmp[1] = (value >> 8) & 0xff; + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_setreg_32(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0xff); + buf_tmp[1] = (value >> 8) & 0xff; + buf_tmp[2] = (value >> 16) & 0xff; + buf_tmp[3] = (value >> 24) & 0xff; + + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static void oc_setreg_16be(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 8) & 0xff; + buf_tmp[1] = (value & 0Xff); + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_setreg_32be(struct ocores_i2c *i2c, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 24) & 0xff; + buf_tmp[1] = (value >> 16) & 0xff; + buf_tmp[2] = (value >> 8) & 0xff; + buf_tmp[3] = (value & 0xff); + ocores_i2c_reg_write(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static inline u32 oc_getreg_8(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 value, pos; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_1); + value = buf_tmp[0]; + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + + return value; +} + +static inline u32 oc_getreg_16(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_getreg_32(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_getreg_16be(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_2 -i - 1)); + } + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_getreg_32be(struct ocores_i2c *i2c, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = i2c->base_addr + (reg << i2c->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + ocores_i2c_reg_read(i2c, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_4 -i - 1)); + } + + OCORES_I2C_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + i2c->dev_name, i2c->reg_access_mode, pos, value); + return value; + +} + +static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u32 value) +{ + i2c->setreg(i2c, reg, value); + return; +} + +static inline u32 oc_getreg(struct ocores_i2c *i2c, int reg) +{ + return i2c->getreg(i2c, reg); +} + +static int ocores_msg_check(struct i2c_msg *msgs, int num) +{ + int i, ret = 0; + + if (!msgs) { + ret = -EFAULT; + goto out; + } + + for (i = 0; i < num; ++i) { + if (!msgs[i].buf) { + ret = -EFAULT; + goto out; + } + } + +out: + return ret; +} + +static void ocores_process(struct ocores_i2c *i2c, u8 stat) +{ + struct i2c_msg *msg = i2c->msg; + + OCORES_I2C_XFER("Enter nr %d.\n", i2c->adap.nr); + if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) { + /* stop has been sent */ + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); + wake_up(&i2c->wait); + OCORES_I2C_XFER("stop has been sent, exit.\n"); + goto out; + } + + /* error? */ + if (stat & OCI2C_STAT_ARBLOST) { + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + OCORES_I2C_XFER("error exit, lose arbitration.\n"); + goto out; + } + + if (ocores_msg_check(i2c->msg, i2c->nmsgs) != 0) { + OCORES_I2C_XFER("msg buf is NULL\n"); + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + goto out; + } + + if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) { + i2c->state = + (msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE; + + if (stat & OCI2C_STAT_NACK) { + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + OCORES_I2C_XFER("OCI2C_STAT_NACK, exit.\n"); + goto out; + } + } else { + msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA); + } + + /* end of msg? */ + if (i2c->pos == msg->len) { + OCORES_I2C_XFER("Enter end of msg.\n"); + i2c->nmsgs--; + i2c->msg++; + i2c->pos = 0; + msg = i2c->msg; + + if (i2c->nmsgs) { /* end? */ + /* send start? */ + if (!(msg->flags & I2C_M_NOSTART)) { + u8 addr = i2c_8bit_addr_from_msg(msg); + + i2c->state = STATE_START; + + oc_setreg(i2c, OCI2C_DATA, addr); + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); + OCORES_I2C_XFER("send start, exit.\n"); + goto out; + } + i2c->state = (msg->flags & I2C_M_RD) + ? STATE_READ : STATE_WRITE; + } else { + i2c->state = STATE_DONE; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + OCORES_I2C_XFER("send OCI2C_CMD_STOP, exit.\n"); + goto out; + } + } + + if (i2c->state == STATE_READ) { + oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ? + OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK); + } else { + oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]); + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE); + } + +out: + OCORES_I2C_XFER("normal, exit nr %d.\n", i2c->adap.nr); + return; +} + +static irqreturn_t ocores_isr(int irq, void *dev_id) +{ + struct ocores_i2c *i2c = dev_id; + u8 stat; + unsigned long flags; + + if (!i2c) { + return IRQ_NONE; + } + + spin_lock_irqsave(&i2c->process_lock, flags); + stat = oc_getreg(i2c, OCI2C_STATUS); + if (!(stat & OCI2C_STAT_IF)) { + spin_unlock_irqrestore(&i2c->process_lock, flags); + return IRQ_NONE; + } + OCORES_I2C_XFER("Enter, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)? 0 : i2c->msg->addr); + ocores_process(i2c, stat); + OCORES_I2C_XFER("Leave, irq %d nr %d addr 0x%x.\n", irq, i2c->adap.nr, (!i2c->msg)? 0 : i2c->msg->addr); + spin_unlock_irqrestore(&i2c->process_lock, flags); + + return IRQ_HANDLED; +} + +/** + * Process timeout event + * @i2c: ocores I2C device instance + */ +static void ocores_process_timeout(struct ocores_i2c *i2c) +{ + unsigned long flags; + + spin_lock_irqsave(&i2c->process_lock, flags); + i2c->state = STATE_ERROR; + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP); + mdelay(1); + spin_unlock_irqrestore(&i2c->process_lock, flags); + return; +} + +/** + * Wait until something change in a given register + * @i2c: ocores I2C device instance + * @reg: register to query + * @mask: bitmask to apply on register value + * @val: expected result + * @timeout: timeout in jiffies + * + * Timeout is necessary to avoid to stay here forever when the chip + * does not answer correctly. + * + * Return: 0 on success, -ETIMEDOUT on timeout + */ +static int ocores_wait(struct ocores_i2c *i2c, + int reg, u8 mask, u8 val, + const unsigned long timeout) +{ + u8 status; + unsigned long j, jiffies_tmp; + unsigned int usleep; + + usleep = OCORE_WAIT_SCH; + j = jiffies + timeout; + while (1) { + jiffies_tmp = jiffies; + status = oc_getreg(i2c, reg); + + if ((status & mask) == val) { + break; + } + + if (time_after(jiffies_tmp, j)) { + OCORES_I2C_XFER("STATUS timeout, mask[0x%x] val[0x%x] status[0x%x]\n", mask, val, status); + return -ETIMEDOUT; + } + usleep_range(usleep,usleep + 1); + } + return 0; + +} + +/** + * Wait until is possible to process some data + * @i2c: ocores I2C device instance + * + * Used when the device is in polling mode (interrupts disabled). + * + * Return: 0 on success, -ETIMEDOUT on timeout + */ +static int ocores_poll_wait(struct ocores_i2c *i2c) +{ + u8 mask; + int err; + + if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) { + /* transfer is over */ + mask = OCI2C_STAT_BUSY; + } else { + /* on going transfer */ + mask = OCI2C_STAT_TIP; + /* + * We wait for the data to be transferred (8bit), + * then we start polling on the ACK/NACK bit + */ + udelay((8 * 1000) / i2c->bus_clock_khz); + } + + /* + * once we are here we expect to get the expected result immediately + * so if after 100ms we timeout then something is broken. + */ + err = ocores_wait(i2c, OCI2C_STATUS, mask, 0, msecs_to_jiffies(100)); + if (err) { + OCORES_I2C_XFER("STATUS timeout, bit 0x%x did not clear in 100ms, err %d\n", mask, err); + } + return err; +} + +/** + * It handles an IRQ-less transfer + * @i2c: ocores I2C device instance + * + * Even if IRQ are disabled, the I2C OpenCore IP behavior is exactly the same + * (only that IRQ are not produced). This means that we can re-use entirely + * ocores_isr(), we just add our polling code around it. + * + * It can run in atomic context + */ +static int ocores_process_polling(struct ocores_i2c *i2c) +{ + irqreturn_t ret; + int err; + + while (1) { + err = ocores_poll_wait(i2c); + if (err) { + i2c->state = STATE_ERROR; + break; /* timeout */ + } + + ret = ocores_isr(-1, i2c); + if (ret == IRQ_NONE) { + break; /* all messages have been transferred */ + } + } + + return err; +} + +static int ocores_xfer_core(struct ocores_i2c *i2c, + struct i2c_msg *msgs, int num, + bool polling) +{ + int ret; + u8 ctrl; + unsigned long flags; + + OCORES_I2C_VERBOSE("Enter ocores_xfer_core. polling mode:%d.\n", polling); + spin_lock_irqsave(&i2c->process_lock, flags); + + ctrl = oc_getreg(i2c, OCI2C_CONTROL); + if (polling) { + oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~OCI2C_CTRL_IEN); + } else { + oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN); + } + + i2c->msg = msgs; + i2c->pos = 0; + i2c->nmsgs = num; + i2c->state = STATE_START; + + oc_setreg(i2c, OCI2C_DATA, i2c_8bit_addr_from_msg(i2c->msg)); + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START); + + spin_unlock_irqrestore(&i2c->process_lock, flags); + + if (polling) { + ret = ocores_process_polling(i2c); + if (ret) { + ocores_process_timeout(i2c); + return -ETIMEDOUT; + } + } else { + ret = wait_event_timeout(i2c->wait, + (i2c->state == STATE_ERROR) || + (i2c->state == STATE_DONE), HZ); + if (ret == 0) { + ocores_process_timeout(i2c); + return -ETIMEDOUT; + } + } + + return (i2c->state == STATE_DONE) ? num : -EIO; +} + +static int ocores_xfer(struct i2c_adapter *adap, + struct i2c_msg *msgs, int num) +{ + struct ocores_i2c *i2c; + int ret; + + OCORES_I2C_VERBOSE("Enter ocores_xfer.\n"); + if (!adap || ocores_msg_check(msgs, num)) { + OCORES_I2C_ERROR("[MAY BE USER SPACE ERROR]:msg buf is NULL\n"); + return -EFAULT; + } + OCORES_I2C_VERBOSE("i2c bus:%d, msgs num:%d.\n", adap->nr, num); + + i2c = i2c_get_adapdata(adap); + + if (i2c->flags & OCORES_FLAG_POLL) { + ret = ocores_xfer_core(i2c, msgs, num, true); + } else { + ret = ocores_xfer_core(i2c, msgs, num, false); + } + + return ret; +} + +static int ocores_init(struct device *dev, struct ocores_i2c *i2c) +{ + int prescale; + int diff; + u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); + + /* make sure the device is disabled */ + ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN); + oc_setreg(i2c, OCI2C_CONTROL, ctrl); + + prescale = (i2c->ip_clock_khz / (5 * i2c->bus_clock_khz)) - 1; + prescale = clamp(prescale, 0, 0xffff); + + diff = i2c->ip_clock_khz / (5 * (prescale + 1)) - i2c->bus_clock_khz; + if (abs(diff) > i2c->bus_clock_khz / 10) { + dev_err(dev, "Unsupported clock settings: core: %d KHz, bus: %d KHz\n", + i2c->ip_clock_khz, i2c->bus_clock_khz); + return -EINVAL; + } + + oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff); + oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8); + + /* Init the device */ + oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK); + oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN); + + return 0; +} + +static u32 ocores_func(struct i2c_adapter *adap) +{ + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; +} + +static const struct i2c_algorithm ocores_algorithm = { + .master_xfer = ocores_xfer, + .functionality = ocores_func, +}; + +static const struct i2c_adapter ocores_adapter = { + .owner = THIS_MODULE, + .name = "wb-i2c-ocores", + .class = I2C_CLASS_DEPRECATED, + .algo = &ocores_algorithm, +}; + +static const struct of_device_id ocores_i2c_match[] = { + { + .compatible = "opencores,wb-i2c-ocores", + .data = (void *)TYPE_OCORES, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, ocores_i2c_match); + +static int fpga_ocores_i2c_get_irq(struct ocores_i2c *i2c) +{ + int devfn, irq; + struct device *dev; + wb_pci_dev_t *wb_pci_dev; + struct pci_dev *pci_dev; + i2c_ocores_device_t *i2c_ocores_device; + int ret; + + dev = i2c->dev; + wb_pci_dev = &i2c->wb_pci_dev; + + if (dev->of_node) { + ret = 0; + ret += of_property_read_u32(dev->of_node, "pci_domain", &wb_pci_dev->domain); + ret += of_property_read_u32(dev->of_node, "pci_bus", &wb_pci_dev->bus); + ret += of_property_read_u32(dev->of_node, "pci_slot", &wb_pci_dev->slot); + ret += of_property_read_u32(dev->of_node, "pci_fn", &wb_pci_dev->fn); + + if (ret != 0) { + OCORES_I2C_ERROR("dts config error, ret:%d.\n", ret); + ret = -EINVAL; + return ret; + } + } else { + if (i2c->dev->platform_data == NULL) { + OCORES_I2C_ERROR("Failed to get platform data config.\n"); + ret = -EINVAL; + return ret; + } + i2c_ocores_device = i2c->dev->platform_data; + wb_pci_dev->domain = i2c_ocores_device->pci_domain; + wb_pci_dev->bus = i2c_ocores_device->pci_bus; + wb_pci_dev->slot = i2c_ocores_device->pci_slot; + wb_pci_dev->fn = i2c_ocores_device->pci_fn; + } + + OCORES_I2C_VERBOSE("pci_domain:0x%x, pci_bus:0x%x, pci_slot:0x%x, pci_fn:0x%x.\n", + wb_pci_dev->domain, wb_pci_dev->bus, wb_pci_dev->slot, wb_pci_dev->fn); + + devfn = PCI_DEVFN(wb_pci_dev->slot, wb_pci_dev->fn); + pci_dev = pci_get_domain_bus_and_slot(wb_pci_dev->domain, wb_pci_dev->bus, devfn); + if (pci_dev == NULL) { + OCORES_I2C_ERROR("Failed to find pci_dev, domain:0x%04x, bus:0x%02x, devfn:0x%x\n", + wb_pci_dev->domain, wb_pci_dev->bus, devfn); + return -ENODEV; + } + irq = pci_dev->irq + i2c->irq_offset; + OCORES_I2C_VERBOSE("get irq no:%d.\n", irq); + return irq; +} + +static int ocores_i2c_config_init(struct ocores_i2c *i2c) +{ + int ret; + struct device *dev; + i2c_ocores_device_t *i2c_ocores_device; + + dev = i2c->dev; + ret = 0; + + if (dev->of_node) { + ret += of_property_read_string(dev->of_node, "dev_name", &i2c->dev_name); + ret += of_property_read_u32(dev->of_node, "dev_base", &i2c->base_addr); + ret += of_property_read_u32(dev->of_node, "reg_shift", &i2c->reg_shift); + ret += of_property_read_u32(dev->of_node, "reg_io_width", &i2c->reg_io_width); + ret += of_property_read_u32(dev->of_node, "ip_clock_khz", &i2c->ip_clock_khz); + ret += of_property_read_u32(dev->of_node, "bus_clock_khz", &i2c->bus_clock_khz); + ret += of_property_read_u32(dev->of_node, "reg_access_mode", &i2c->reg_access_mode); + + if (ret != 0) { + OCORES_I2C_ERROR("dts config error, ret:%d.\n", ret); + ret = -ENXIO; + return ret; + } + } else { + if (i2c->dev->platform_data == NULL) { + OCORES_I2C_ERROR("Failed to get platform data config.\n"); + ret = -ENXIO; + return ret; + } + i2c_ocores_device = i2c->dev->platform_data; + i2c->dev_name = i2c_ocores_device->dev_name; + i2c->adap_nr = i2c_ocores_device->adap_nr; + i2c->big_endian = i2c_ocores_device->big_endian; + i2c->base_addr = i2c_ocores_device->dev_base; + i2c->reg_shift = i2c_ocores_device->reg_shift; + i2c->reg_io_width = i2c_ocores_device->reg_io_width; + i2c->ip_clock_khz = i2c_ocores_device->ip_clock_khz; + i2c->bus_clock_khz = i2c_ocores_device->bus_clock_khz; + i2c->reg_access_mode = i2c_ocores_device->reg_access_mode; + } + + OCORES_I2C_VERBOSE("name:%s, base:0x%x, reg_shift:0x%x, io_width:0x%x, ip_clock_khz:0x%x, bus_clock_khz:0x%x.\n", + i2c->dev_name, i2c->base_addr, i2c->reg_shift, i2c->reg_io_width, i2c->ip_clock_khz, i2c->bus_clock_khz); + OCORES_I2C_VERBOSE("reg access mode:%d.\n", i2c->reg_access_mode); + return ret; +} + +static int ocores_i2c_probe(struct platform_device *pdev) +{ + struct ocores_i2c *i2c; + int irq, ret; + bool be; + i2c_ocores_device_t *i2c_ocores_device; + + OCORES_I2C_VERBOSE("Enter main probe\n"); + + i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); + if (!i2c) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + spin_lock_init(&i2c->process_lock); + + i2c->dev = &pdev->dev; + ret = ocores_i2c_config_init(i2c); + if (ret !=0) { + dev_err(i2c->dev, "Failed to get ocores i2c dts config.\n"); + goto out; + } + + if (i2c->dev->of_node) { + if (of_property_read_u32(i2c->dev->of_node, "big_endian", &i2c->big_endian)) { + + be = 0; + } else { + be = i2c->big_endian; + } + } else { + be = i2c->big_endian; + } + + if (i2c->reg_io_width == 0) { + i2c->reg_io_width = 1; /* Set to default value */ + } + + if (!i2c->setreg || !i2c->getreg) { + switch (i2c->reg_io_width) { + case REG_IO_WIDTH_1: + i2c->setreg = oc_setreg_8; + i2c->getreg = oc_getreg_8; + break; + + case REG_IO_WIDTH_2: + i2c->setreg = be ? oc_setreg_16be : oc_setreg_16; + i2c->getreg = be ? oc_getreg_16be : oc_getreg_16; + break; + + case REG_IO_WIDTH_4: + i2c->setreg = be ? oc_setreg_32be : oc_setreg_32; + i2c->getreg = be ? oc_getreg_32be : oc_getreg_32; + break; + + default: + dev_err(i2c->dev, "Unsupported I/O width (%d)\n", + i2c->reg_io_width); + ret = -EINVAL; + goto out; + } + } + + init_waitqueue_head(&i2c->wait); + irq = -1; + + if (i2c->dev->of_node) { + if (of_property_read_u32(i2c->dev->of_node, "irq_offset", &i2c->irq_offset)) { + + i2c->flags |= OCORES_FLAG_POLL; + } else { + + irq = fpga_ocores_i2c_get_irq(i2c); + if (irq < 0 ) { + dev_err(i2c->dev, "Failed to get ocores i2c irq number, ret: %d.\n", irq); + ret = irq; + goto out; + } + } + } else { + if (i2c->dev->platform_data == NULL) { + + i2c->flags |= OCORES_FLAG_POLL; + OCORES_I2C_VERBOSE("Failed to get platform data config, set OCORES_FLAG_POLL.\n"); + } else { + i2c_ocores_device = i2c->dev->platform_data; + if (i2c_ocores_device->irq_type == 0) { + + i2c->flags |= OCORES_FLAG_POLL; + } else { + + irq = fpga_ocores_i2c_get_irq(i2c); + if (irq < 0 ) { + dev_err(i2c->dev, "Failed to get ocores i2c irq number, ret: %d.\n", irq); + ret = irq; + goto out; + } + } + } + } + + if (!(i2c->flags & OCORES_FLAG_POLL)) { + ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, + pdev->name, i2c); + if (ret) { + dev_err(i2c->dev, "Cannot claim IRQ\n"); + goto out; + } + } + + ret = ocores_init(i2c->dev, i2c); + if (ret) { + goto out; + } + + /* hook up driver to tree */ + platform_set_drvdata(pdev, i2c); + i2c->adap = ocores_adapter; + i2c_set_adapdata(&i2c->adap, i2c); + i2c->adap.dev.parent = &pdev->dev; + i2c->adap.dev.of_node = pdev->dev.of_node; + + if (i2c->dev->of_node) { + /* adap.nr get from dts aliases */ + ret = i2c_add_adapter(&i2c->adap); + } else { + i2c->adap.nr = i2c->adap_nr; + ret = i2c_add_numbered_adapter(&i2c->adap); + } + if (ret) { + goto fail_add; + } + OCORES_I2C_VERBOSE("Main probe out\n"); + dev_info(i2c->dev, "registered i2c-%d for %s with base address:0x%x success.\n", + i2c->adap.nr, i2c->dev_name, i2c->base_addr); + return 0; +fail_add: + platform_set_drvdata(pdev, NULL); +out: + return ret; +} + +static int ocores_i2c_remove(struct platform_device *pdev) +{ + struct ocores_i2c *i2c = platform_get_drvdata(pdev); + u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL); + + /* disable i2c logic */ + ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN); + oc_setreg(i2c, OCI2C_CONTROL, ctrl); + + /* remove adapter & data */ + i2c_del_adapter(&i2c->adap); + return 0; +} + +static struct platform_driver ocores_i2c_driver = { + .probe = ocores_i2c_probe, + .remove = ocores_i2c_remove, + .driver = { + .name = "wb-ocores-i2c", + .of_match_table = ocores_i2c_match, + }, +}; + +module_platform_driver(ocores_i2c_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("OpenCores I2C bus driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ocores-i2c"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h new file mode 100644 index 0000000000..acd2710a92 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_i2c_ocores.h @@ -0,0 +1,28 @@ +#ifndef __WB_I2C_OCORES_H__ +#define __WB_I2C_OCORES_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define I2C_OCORES_DEV_NAME_MAX_LEN (64) + +typedef struct i2c_ocores_device_s { + uint32_t big_endian; + char dev_name[I2C_OCORES_DEV_NAME_MAX_LEN]; + int adap_nr; + uint32_t dev_base; + uint32_t reg_shift; + uint32_t reg_io_width; + uint32_t ip_clock_khz; + uint32_t bus_clock_khz; + uint32_t reg_access_mode; + + uint32_t irq_type; + uint32_t irq_offset; + uint32_t pci_domain; + uint32_t pci_bus; + uint32_t pci_slot; + uint32_t pci_fn; + int device_flag; +} i2c_ocores_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c new file mode 100644 index 0000000000..4a4bbba0ad --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.c @@ -0,0 +1,571 @@ +/* + * wb_io_dev.c + * ko to read/write ioports through /dev/XXX device + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_io_dev.h" + +#define PROXY_NAME "wb-io-dev" +#define MAX_IO_DEV_NUM (256) +#define IO_RDWR_MAX_LEN (256) +#define MAX_NAME_SIZE (20) +#define IO_INDIRECT_ADDR_H(addr) ((addr >> 8) & 0xff) +#define IO_INDIRECT_ADDR_L(addr) ((addr) & 0xff) +#define IO_INDIRECT_OP_WRITE (0x2) +#define IO_INDIRECT_OP_READ (0X3) + +static int g_io_dev_debug = 0; +static int g_io_dev_error = 0; + +module_param(g_io_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_io_dev_error, int, S_IRUGO | S_IWUSR); + +#define IO_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_io_dev_debug) { \ + printk(KERN_INFO "[IO_DEV][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define IO_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_io_dev_error) { \ + printk(KERN_ERR "[IO_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct wb_io_dev_s { + const char *name; + uint32_t io_base; + uint32_t io_len; + uint32_t indirect_addr; + uint32_t wr_data; + uint32_t addr_low; + uint32_t addr_high; + uint32_t rd_data; + uint32_t opt_ctl; + spinlock_t io_dev_lock; + struct miscdevice misc; +} wb_io_dev_t; + +static wb_io_dev_t* io_dev_arry[MAX_IO_DEV_NUM]; + +static int io_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + wb_io_dev_t *wb_io_dev; + + if (minor >= MAX_IO_DEV_NUM) { + IO_DEV_DEBUG_ERROR("minor out of range, minor = %d.\n", minor); + return -ENODEV; + } + + wb_io_dev = io_dev_arry[minor]; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, open failed, minor = %d\n", minor); + return -ENODEV; + } + + file->private_data = wb_io_dev; + return 0; +} + +static int io_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +uint8_t io_indirect_addressing_read(wb_io_dev_t *wb_io_dev, uint32_t address) +{ + uint8_t addr_l, addr_h, value; + unsigned long flags; + + addr_h = IO_INDIRECT_ADDR_H(address); + addr_l = IO_INDIRECT_ADDR_L(address); + IO_DEV_DEBUG_VERBOSE("read one count, addr = 0x%x\n", address); + + spin_lock_irqsave(&wb_io_dev->io_dev_lock, flags); + + outb(addr_l, wb_io_dev->io_base + wb_io_dev->addr_low); + + outb(addr_h, wb_io_dev->io_base + wb_io_dev->addr_high); + + outb(IO_INDIRECT_OP_READ, wb_io_dev->io_base + wb_io_dev->opt_ctl); + + value = inb(wb_io_dev->io_base + wb_io_dev->rd_data); + + spin_unlock_irqrestore(&wb_io_dev->io_dev_lock, flags); + + return value; +} + +static int io_dev_read_tmp(wb_io_dev_t *wb_io_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i; + + if (offset > wb_io_dev->io_len) { + IO_DEV_DEBUG_VERBOSE("offset:0x%x, io len:0x%x, EOF.\n", offset, wb_io_dev->io_len); + return 0; + } + + if (count > wb_io_dev->io_len - offset) { + IO_DEV_DEBUG_VERBOSE("read count out of range. input len:%lu, read len:%u.\n", + count, wb_io_dev->io_len - offset); + count = wb_io_dev->io_len - offset; + } + if (wb_io_dev->indirect_addr) { + for (i = 0; i < count; i++) { + buf[i] = io_indirect_addressing_read(wb_io_dev, offset + i); + } + } else { + for (i = 0; i < count; i++) { + buf[i] = inb(wb_io_dev->io_base + offset + i); + } + } + + return count; +} + +static ssize_t io_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + wb_io_dev_t *wb_io_dev; + int ret, read_len; + u8 buf_tmp[IO_RDWR_MAX_LEN]; + + wb_io_dev = file->private_data; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, read failed.\n"); + return -EINVAL; + } + + if (count == 0) { + IO_DEV_DEBUG_ERROR("Invalid params, read count is 0.n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + IO_DEV_DEBUG_VERBOSE("read conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + read_len = io_dev_read_tmp(wb_io_dev, *offset, buf_tmp, count); + if (read_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_read_tmp failed, ret:%d.\n", read_len); + return read_len; + } + + if (access_ok(buf, read_len)) { + IO_DEV_DEBUG_VERBOSE("user space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + if (copy_to_user(buf, buf_tmp, read_len)) { + IO_DEV_DEBUG_ERROR("copy_to_user failed.\n"); + return -EFAULT; + } + } else { + IO_DEV_DEBUG_VERBOSE("kernel space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + memcpy(buf, buf_tmp, read_len); + } + *offset += read_len; + ret = read_len; + return ret; +} + +static ssize_t io_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) +{ + int ret; + + IO_DEV_DEBUG_VERBOSE("io_dev_read_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, to->count, iocb->ki_pos); + ret = io_dev_read(iocb->ki_filp, to->kvec->iov_base, to->count, &iocb->ki_pos); + return ret; +} + +void io_indirect_addressing_write(wb_io_dev_t *wb_io_dev, uint32_t address, uint8_t reg_val) +{ + uint8_t addr_l, addr_h; + unsigned long flags; + + addr_h = IO_INDIRECT_ADDR_H(address); + addr_l = IO_INDIRECT_ADDR_L(address); + IO_DEV_DEBUG_VERBOSE("write one count, addr = 0x%x\n", address); + + spin_lock_irqsave(&wb_io_dev->io_dev_lock, flags); + + outb(reg_val, wb_io_dev->io_base + wb_io_dev->wr_data); + + outb(addr_l, wb_io_dev->io_base + wb_io_dev->addr_low); + + outb(addr_h, wb_io_dev->io_base + wb_io_dev->addr_high); + + outb(IO_INDIRECT_OP_WRITE, wb_io_dev->io_base + wb_io_dev->opt_ctl); + + spin_unlock_irqrestore(&wb_io_dev->io_dev_lock, flags); + + return; +} + +static int io_dev_write_tmp(wb_io_dev_t *wb_io_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i; + + if (offset > wb_io_dev->io_len) { + IO_DEV_DEBUG_VERBOSE("offset:0x%x, io len:0x%x, EOF.\n", offset, wb_io_dev->io_len); + return 0; + } + + if (count > wb_io_dev->io_len - offset) { + IO_DEV_DEBUG_VERBOSE("write count out of range. input len:%lu, write len:%u.\n", + count, wb_io_dev->io_len - offset); + count = wb_io_dev->io_len - offset; + } + if (wb_io_dev->indirect_addr) { + for (i = 0; i < count; i++) { + io_indirect_addressing_write(wb_io_dev, offset + i, buf[i]); + } + } else { + for (i = 0; i < count; i++) { + outb(buf[i], wb_io_dev->io_base + offset + i); + } + } + + return count; +} + +static ssize_t io_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + wb_io_dev_t *wb_io_dev; + int write_len; + u8 buf_tmp[IO_RDWR_MAX_LEN]; + + wb_io_dev = file->private_data; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, write failed.\n"); + return -EINVAL; + } + + if (count == 0) { + IO_DEV_DEBUG_ERROR("Invalid params, write count is 0.\n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + IO_DEV_DEBUG_VERBOSE("write conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + if (access_ok(buf, count)) { + IO_DEV_DEBUG_VERBOSE("user space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + if (copy_from_user(buf_tmp, buf, count)) { + IO_DEV_DEBUG_ERROR("copy_from_user failed.\n"); + return -EFAULT; + } + } else { + IO_DEV_DEBUG_VERBOSE("kernel space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + memcpy(buf_tmp, buf, count); + } + + write_len = io_dev_write_tmp(wb_io_dev, *offset, buf_tmp, count); + if (write_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_write_tmp failed, ret:%d.\n", write_len); + return write_len; + } + + *offset += write_len; + return write_len; +} + +static ssize_t io_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + int ret; + + IO_DEV_DEBUG_VERBOSE("io_dev_write_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, from->count, iocb->ki_pos); + ret = io_dev_write(iocb->ki_filp, from->kvec->iov_base, from->count, &iocb->ki_pos); + return ret; +} + +static loff_t io_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + wb_io_dev_t *wb_io_dev; + + wb_io_dev = file->private_data; + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("wb_io_dev is NULL, llseek failed.\n"); + return -EINVAL; + } + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + IO_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + if (offset > wb_io_dev->io_len) { + IO_DEV_DEBUG_ERROR("SEEK_SET out of range, offset:%lld, io_len:0x%x.\n", + offset, wb_io_dev->io_len); + ret = - EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (((file->f_pos + offset) > wb_io_dev->io_len) || ((file->f_pos + offset) < 0)) { + IO_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld, io_len:0x%x.\n", + file->f_pos, offset, wb_io_dev->io_len); + ret = - EINVAL; + break; + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + IO_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static long io_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static const struct file_operations io_dev_fops = { + .owner = THIS_MODULE, + .llseek = io_dev_llseek, + .read_iter = io_dev_read_iter, + .write_iter = io_dev_write_iter, + .unlocked_ioctl = io_dev_ioctl, + .open = io_dev_open, + .release = io_dev_release, +}; + +static wb_io_dev_t *dev_match(const char *path) +{ + wb_io_dev_t *wb_io_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + + for (i = 0; i < MAX_IO_DEV_NUM; i++) { + if (io_dev_arry[i] == NULL) { + continue; + } + wb_io_dev = io_dev_arry[i]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", wb_io_dev->name); + if (!strcmp(path, dev_name)) { + IO_DEV_DEBUG_VERBOSE("get dev_name = %s, minor = %d\n", dev_name, i); + return wb_io_dev; + } + } + + return NULL; +} + +int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_io_dev_t *wb_io_dev; + int read_len; + + if (path == NULL) { + IO_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + IO_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_io_dev = dev_match(path); + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("io_dev match failed. dev path = %s", path); + return -EINVAL; + } + + read_len = io_dev_read_tmp(wb_io_dev, offset, buf, count); + if (read_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_read_tmp failed, ret:%d.\n", read_len); + } + return read_len; +} +EXPORT_SYMBOL(io_device_func_read); + +int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_io_dev_t *wb_io_dev; + int write_len; + + if (path == NULL) { + IO_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + IO_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_io_dev = dev_match(path); + if (wb_io_dev == NULL) { + IO_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + write_len = io_dev_write_tmp(wb_io_dev, offset, buf, count); + if (write_len < 0) { + IO_DEV_DEBUG_ERROR("io_dev_write_tmp failed, ret:%d.\n", write_len); + } + return write_len; +} +EXPORT_SYMBOL(io_device_func_write); + +static int io_dev_probe(struct platform_device *pdev) +{ + int ret; + wb_io_dev_t *wb_io_dev; + struct miscdevice *misc; + io_dev_device_t *io_dev_device; + + wb_io_dev = devm_kzalloc(&pdev->dev, sizeof(wb_io_dev_t), GFP_KERNEL); + if (!wb_io_dev) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + return ret; + } + spin_lock_init(&wb_io_dev->io_dev_lock); + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "io_dev_name", &wb_io_dev->name); + ret += of_property_read_u32(pdev->dev.of_node, "io_base", &wb_io_dev->io_base); + ret += of_property_read_u32(pdev->dev.of_node, "io_len", &wb_io_dev->io_len); + if (of_property_read_bool(pdev->dev.of_node, "indirect_addr")) { + + wb_io_dev->indirect_addr = 1; + ret += of_property_read_u32(pdev->dev.of_node, "wr_data", &wb_io_dev->wr_data); + ret += of_property_read_u32(pdev->dev.of_node, "addr_low", &wb_io_dev->addr_low); + ret += of_property_read_u32(pdev->dev.of_node, "addr_high", &wb_io_dev->addr_high); + ret += of_property_read_u32(pdev->dev.of_node, "rd_data", &wb_io_dev->rd_data); + ret += of_property_read_u32(pdev->dev.of_node, "opt_ctl", &wb_io_dev->opt_ctl); + } else { + + wb_io_dev->indirect_addr = 0; + } + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get dts config, ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + io_dev_device = pdev->dev.platform_data; + wb_io_dev->name = io_dev_device->io_dev_name; + wb_io_dev->io_base = io_dev_device->io_base; + wb_io_dev->io_len = io_dev_device->io_len; + wb_io_dev->indirect_addr = io_dev_device->indirect_addr; + if (wb_io_dev->indirect_addr == 1) { + wb_io_dev->wr_data = io_dev_device->wr_data; + wb_io_dev->addr_low = io_dev_device->addr_low; + wb_io_dev->addr_high = io_dev_device->addr_high; + wb_io_dev->rd_data = io_dev_device->rd_data; + wb_io_dev->opt_ctl = io_dev_device->opt_ctl; + } + } + + IO_DEV_DEBUG_VERBOSE("name:%s, io base:0x%x, io len:0x%x, addressing type:%s.\n", + wb_io_dev->name, wb_io_dev->io_base, wb_io_dev->io_len, + wb_io_dev->indirect_addr ? "indirect" : "direct"); + + misc = &wb_io_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = wb_io_dev->name; + misc->fops = &io_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&pdev->dev, "Failed to register %s device.\n", misc->name); + return -ENXIO; + } + if (misc->minor >= MAX_IO_DEV_NUM) { + dev_err(&pdev->dev, "Error: device minor[%d] more than max io device num[%d].\n", + misc->minor, MAX_IO_DEV_NUM); + misc_deregister(misc); + return -EINVAL; + } + io_dev_arry[misc->minor] = wb_io_dev; + dev_info(&pdev->dev, "register %s device [0x%x][0x%x] with minor %d using %s addressing success.\n", + misc->name, wb_io_dev->io_base, wb_io_dev->io_len, misc->minor, + wb_io_dev->indirect_addr ? "indirect" : "direct"); + + return 0; +} + +static int io_dev_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_IO_DEV_NUM ; i++) { + if (io_dev_arry[i] != NULL) { + misc_deregister(&io_dev_arry[i]->misc); + io_dev_arry[i] = NULL; + } + } + + return 0; +} + +static struct of_device_id io_dev_match[] = { + { + .compatible = "wb-io-dev", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, io_dev_match); + +static struct platform_driver wb_io_dev_driver = { + .probe = io_dev_probe, + .remove = io_dev_remove, + .driver = { + .owner = THIS_MODULE, + .name = PROXY_NAME, + .of_match_table = io_dev_match, + }, +}; + +static int __init wb_io_dev_init(void) +{ + return platform_driver_register(&wb_io_dev_driver); +} + +static void __exit wb_io_dev_exit(void) +{ + platform_driver_unregister(&wb_io_dev_driver); +} + +module_init(wb_io_dev_init); +module_exit(wb_io_dev_exit); +MODULE_DESCRIPTION("IO device driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h new file mode 100644 index 0000000000..3a1a10f0f2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_io_dev.h @@ -0,0 +1,21 @@ +#ifndef __WB_IO_DEV_H__ +#define __WB_IO_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define IO_DEV_NAME_MAX_LEN (64) + +typedef struct io_dev_device_s { + char io_dev_name[IO_DEV_NAME_MAX_LEN]; + uint32_t io_base; + uint32_t io_len; + uint32_t indirect_addr; + uint32_t wr_data; + uint32_t addr_low; + uint32_t addr_high; + uint32_t rd_data; + uint32_t opt_ctl; + int device_flag; +} io_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c new file mode 100644 index 0000000000..c079dc4096 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.c @@ -0,0 +1,166 @@ +/* + * wb_lpc_drv.c + * ko to set lpc pcie config io addr and enable lpc + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_lpc_drv.h" + +#define LPC_DRIVER_NAME "wb-lpc" +#define LPC_MAKE_PCI_IO_RANGE(__base) ((0xfc0001) | ((__base) & (0xFFFC))) + +int g_lpc_dev_debug = 0; +int g_lpc_dev_error = 0; + +module_param(g_lpc_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_lpc_dev_error, int, S_IRUGO | S_IWUSR); + +#define LPC_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_lpc_dev_debug) { \ + printk(KERN_INFO "[LPC_DEV][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define LPC_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_lpc_dev_error) { \ + printk(KERN_ERR "[LPC_DEV][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct wb_lpc_dev_s { + const char *lpc_io_name; + uint32_t domain; + uint32_t bus; + uint32_t slot; + uint32_t fn; + uint32_t lpc_io_base; + uint32_t lpc_io_size; + uint32_t lpc_gen_dec; +} wb_lpc_dev_t; + +static int wb_lpc_probe(struct platform_device *pdev) +{ + int ret, devfn; + wb_lpc_dev_t *wb_lpc_dev; + struct pci_dev *pci_dev; + lpc_drv_device_t *lpc_drv_device; + + wb_lpc_dev = devm_kzalloc(&pdev->dev, sizeof(wb_lpc_dev_t), GFP_KERNEL); + if (!wb_lpc_dev) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + return ret; + } + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "lpc_io_name", &wb_lpc_dev->lpc_io_name); + ret += of_property_read_u32(pdev->dev.of_node, "pci_domain", &wb_lpc_dev->domain); + ret += of_property_read_u32(pdev->dev.of_node, "pci_bus", &wb_lpc_dev->bus); + ret += of_property_read_u32(pdev->dev.of_node, "pci_slot", &wb_lpc_dev->slot); + ret += of_property_read_u32(pdev->dev.of_node, "pci_fn", &wb_lpc_dev->fn); + ret += of_property_read_u32(pdev->dev.of_node, "lpc_io_base", &wb_lpc_dev->lpc_io_base); + ret += of_property_read_u32(pdev->dev.of_node, "lpc_io_size", &wb_lpc_dev->lpc_io_size); + ret += of_property_read_u32(pdev->dev.of_node, "lpc_gen_dec", &wb_lpc_dev->lpc_gen_dec); + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get dts config, ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + lpc_drv_device = pdev->dev.platform_data; + wb_lpc_dev->lpc_io_name = lpc_drv_device->lpc_io_name; + wb_lpc_dev->domain = lpc_drv_device->pci_domain; + wb_lpc_dev->bus = lpc_drv_device->pci_bus; + wb_lpc_dev->slot = lpc_drv_device->pci_slot; + wb_lpc_dev->fn = lpc_drv_device->pci_fn; + wb_lpc_dev->lpc_io_base = lpc_drv_device->lpc_io_base; + wb_lpc_dev->lpc_io_size = lpc_drv_device->lpc_io_size; + wb_lpc_dev->lpc_gen_dec = lpc_drv_device->lpc_gen_dec; + } + + LPC_DEV_DEBUG_VERBOSE("domain:0x%04x, bus:0x%02x, slot:0x%02x, fn:%u\n", + wb_lpc_dev->domain,wb_lpc_dev->bus, wb_lpc_dev->slot, wb_lpc_dev->fn); + LPC_DEV_DEBUG_VERBOSE("lpc_io_name:%s, lpc_io_base:0x%x, lpc_io_size:%u, lpc_gen_dec:0x%x.\n", + wb_lpc_dev->lpc_io_name, wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size, wb_lpc_dev->lpc_gen_dec); + + devfn = PCI_DEVFN(wb_lpc_dev->slot, wb_lpc_dev->fn); + pci_dev = pci_get_domain_bus_and_slot(wb_lpc_dev->domain, wb_lpc_dev->bus, devfn); + if (pci_dev == NULL) { + dev_err(&pdev->dev, "Failed to find pci_dev, domain:0x%04x, bus:0x%02x, devfn:0x%x\n", + wb_lpc_dev->domain, wb_lpc_dev->bus, devfn); + return -ENXIO; + } + + pci_write_config_dword(pci_dev, wb_lpc_dev->lpc_gen_dec, LPC_MAKE_PCI_IO_RANGE(wb_lpc_dev->lpc_io_base)); + if (!request_region(wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size, wb_lpc_dev->lpc_io_name)) { + dev_err(&pdev->dev, "Failed to request_region [0x%x][0x%x].\n", wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size); + return -EBUSY; + } + + platform_set_drvdata(pdev, wb_lpc_dev); + + dev_info(&pdev->dev, "lpc request_region [0x%x][0x%x] success.\n", wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size); + + return 0; +} + +static int wb_lpc_remove(struct platform_device *pdev) +{ + wb_lpc_dev_t *wb_lpc_dev; + + wb_lpc_dev = platform_get_drvdata(pdev); + if (wb_lpc_dev) { + release_region(wb_lpc_dev->lpc_io_base , wb_lpc_dev->lpc_io_size); + LPC_DEV_DEBUG_VERBOSE("lpc base:0x%x, len:0x%x.\n", wb_lpc_dev->lpc_io_base, wb_lpc_dev->lpc_io_size); + } + LPC_DEV_DEBUG_VERBOSE("lpc remove.\n"); + + return 0; +} + +static struct of_device_id lpc_dev_match[] = { + { + .compatible = "wb-lpc", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, lpc_dev_match); + +static struct platform_driver wb_lpc_driver = { + .probe = wb_lpc_probe, + .remove = wb_lpc_remove, + .driver = { + .owner = THIS_MODULE, + .name = LPC_DRIVER_NAME, + .of_match_table = lpc_dev_match, + }, +}; + +static int __init wb_lpc_init(void) +{ + return platform_driver_register(&wb_lpc_driver); +} + +static void __exit wb_lpc_exit(void) +{ + platform_driver_unregister(&wb_lpc_driver); +} + +module_init(wb_lpc_init); +module_exit(wb_lpc_exit); +MODULE_DESCRIPTION("lpc driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h new file mode 100644 index 0000000000..76e8c32c12 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_lpc_drv.h @@ -0,0 +1,18 @@ +#ifndef __WB_LPC_DRV_H__ +#define __WB_LPC_DRV_H__ + +#define LPC_IO_NAME_MAX_LEN (64) + +typedef struct lpc_drv_device_s { + char lpc_io_name[LPC_IO_NAME_MAX_LEN]; + int pci_domain; + int pci_bus; + int pci_slot; + int pci_fn; + int lpc_io_base; + int lpc_io_size; + int lpc_gen_dec; + int device_flag; +} lpc_drv_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c new file mode 100644 index 0000000000..1e84e65d7b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_mac_bsc.c @@ -0,0 +1,660 @@ +/* + * wb_mac_th3.c - A driver for control wb_mac_th3 base on wb_mac.c + * + * Copyright (c) 1998, 1999 Frodo Looijaard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define MAC_TEMP_INVALID (99999999) + +#define MAC_SIZE (256) +#define MAC_TEMP_NUM (16) + +#define MAC_ID_REG (0x02000000) + +typedef enum { + DBG_START, + DBG_VERBOSE, + DBG_KEY, + DBG_WARN, + DBG_ERROR, + DBG_END, +} dbg_level_t; + +typedef enum{ + MAC_TYPE_START, + TD4_X9 = 0xb780, + TD4_X9_8 = 0xb788, + TH3 = 0xb980, + TD3 = 0xb870, + TD4 = 0xb880, + TH4 = 0xb990, + MAC_TYPE_END, +} mac_type; + +typedef struct sensor_regs_s { + int id; + u32 reg; +} sensor_reg_t; + +typedef struct mac_temp_regs_s { + int mac_type; + sensor_reg_t sensor_reg[MAC_TEMP_NUM]; +} mac_temp_reg_t; + +typedef enum { + MAC_TEMP_START, + MAC_TEMP_INDEX1, + MAC_TEMP_INDEX2, + MAC_TEMP_INDEX3, + MAC_TEMP_INDEX4, + MAC_TEMP_INDEX5, + MAC_TEMP_INDEX6, + MAC_TEMP_INDEX7, + MAC_TEMP_INDEX8, + MAC_TEMP_INDEX9, + MAC_TEMP_INDEX10, + MAC_TEMP_INDEX11, + MAC_TEMP_INDEX12, + MAC_TEMP_INDEX13, + MAC_TEMP_INDEX14, + MAC_TEMP_INDEX15, + MAC_TEMP_END, +} mac_hwmon_index; + +static mac_temp_reg_t mac_temp_reg[] = { + { + /* TD3 */ + .mac_type = TD3, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02004700}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02004800}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02004900}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02004a00}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02004b00}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02004c00}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02004d00}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02004e00}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02005200}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02005100}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02005000}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02004f00}, + }, + }, + { + /* TD4 */ + .mac_type = TD4, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02004900}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02004b00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02004d00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02004f00}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02005100}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02005300}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02005500}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02005700}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02005900}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02005b00}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02005d00}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02005f00}, + {.id = MAC_TEMP_INDEX13, .reg = 0x02006100}, + {.id = MAC_TEMP_INDEX14, .reg = 0x02006300}, + {.id = MAC_TEMP_INDEX15, .reg = 0x02006500}, + }, + }, + { + /* TD4_X9 */ + .mac_type = TD4_X9, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02005a00}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02005c00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02005e00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02006000}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02006200}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02006400}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02006600}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02006800}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02006a00}, + }, + }, + { + /* TD4_X9_8 */ + .mac_type = TD4_X9_8, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02005a00}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02005c00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02005e00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02006000}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02006200}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02006400}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02006600}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02006800}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02006a00}, + }, + }, + { + /* TH3 */ + .mac_type = TH3, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x02004a00}, + {.id = MAC_TEMP_INDEX2, .reg = 0x02004b00}, + {.id = MAC_TEMP_INDEX3, .reg = 0x02004c00}, + {.id = MAC_TEMP_INDEX4, .reg = 0x02004d00}, + {.id = MAC_TEMP_INDEX5, .reg = 0x02004e00}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02004f00}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02005000}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02005100}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02005200}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02005300}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02005400}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02005500}, + {.id = MAC_TEMP_INDEX13, .reg = 0x02005600}, + {.id = MAC_TEMP_INDEX14, .reg = 0x02005700}, + {.id = MAC_TEMP_INDEX15, .reg = 0x02005800}, + }, + }, + { + /* TH4 */ + .mac_type = TH4, + .sensor_reg = { + {.id = MAC_TEMP_INDEX1, .reg = 0x0201d800}, + {.id = MAC_TEMP_INDEX2, .reg = 0x0201e000}, + {.id = MAC_TEMP_INDEX3, .reg = 0x0201e800}, + {.id = MAC_TEMP_INDEX4, .reg = 0x0201f000}, + {.id = MAC_TEMP_INDEX5, .reg = 0x0201f800}, + {.id = MAC_TEMP_INDEX6, .reg = 0x02020000}, + {.id = MAC_TEMP_INDEX7, .reg = 0x02020800}, + {.id = MAC_TEMP_INDEX8, .reg = 0x02021000}, + {.id = MAC_TEMP_INDEX9, .reg = 0x02021800}, + {.id = MAC_TEMP_INDEX10, .reg = 0x02022000}, + {.id = MAC_TEMP_INDEX11, .reg = 0x02022800}, + {.id = MAC_TEMP_INDEX12, .reg = 0x02023000}, + {.id = MAC_TEMP_INDEX13, .reg = 0x02023800}, + {.id = MAC_TEMP_INDEX14, .reg = 0x02024000}, + {.id = MAC_TEMP_INDEX15, .reg = 0x02024800}, + }, + }, +}; + +static int debuglevel = 0; +module_param(debuglevel, int, S_IRUGO | S_IWUSR); + +static int mac_pcie_id = MAC_TYPE_START; +module_param(mac_pcie_id, int, S_IRUGO | S_IWUSR); + +#define DBG_DEBUG(fmt, arg...) do { \ + if ( debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ + printk(KERN_INFO "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else if ( debuglevel >= DBG_ERROR ) { \ + printk(KERN_ERR "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } else { } \ +} while (0) + +#define DBG_ERROR(fmt, arg...) do { \ + if ( debuglevel > DBG_START) { \ + printk(KERN_ERR "[ERROR]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ + } \ + } while (0) + +struct mac_data { + struct i2c_client *client; + struct device *hwmon_dev; + struct mutex update_lock; + u8 data[MAC_SIZE]; /* Register value */ +}; + +static int wb_i2c_read_one_time(struct i2c_client *client, u8 *recv_buf, int size) +{ + struct i2c_msg msgs[2]; + int ret = 0; + + if ((client == NULL) || (recv_buf == NULL)) { + DBG_DEBUG("i2c_client || recv_buf = NULL\r\n"); + return -1; + } + + mem_clear(msgs, sizeof(msgs)); + + msgs[0].buf = recv_buf; + msgs[0].len = size; + msgs[0].addr = client->addr; + msgs[0].flags |= I2C_M_RD; + + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + return ret; + } + DBG_DEBUG("i2c_transfer, dev_addr 0x%x, size %d.\n", client->addr, size); + + return 0; +} + +static int wb_i2c_write_one_time(struct i2c_client *client, u8 *write_buf, int size) +{ + struct i2c_msg msgs[2]; + int ret = 0; + + if ((client == NULL) || (write_buf == NULL)) { + DBG_DEBUG("i2c_client || write_buf = NULL\r\n"); + return -1; + } + + if ((size <= 0)) { + DBG_DEBUG("size invalid, size %d\n", size); + return -1; + } + + mem_clear(msgs, sizeof(msgs)); + + msgs[0].len = size; + msgs[0].buf = write_buf; + msgs[0].addr = client->addr; + + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + return ret; + } + DBG_DEBUG("i2c_transfer, dev_addr 0x%x, size %d\n", client->addr, size); + + return 0; +} + +static u8 step2_buf1[8] = {0x03, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}; +static u8 step2_buf2[8] = {0x03, 0x21, 0x04, 0x0c, 0x2c, 0x38, 0x02, 0x00}; +static u8 step2_buf3[8] = {0x03, 0x21, 0x04, 0x10, 0x02, 0x00, 0x4a, 0x00}; +static u8 step2_buf4[8] = {0x03, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01}; +static u8 step2_buf5[4] = {0x03, 0x21, 0x04, 0x08}; +static u8 step2_buf6[4] = {0x03, 0x21, 0x04, 0x10}; + +static int getmac_register(struct i2c_client *client, u32 index, int *reg_value) +{ + int i; + int ret = 0; + int value = 0; + unsigned char read_buf[8]; + + if (index == 0) { + DBG_ERROR("invalid index\n"); + return -1; + } + + step2_buf3[7] = index & 0xff; + step2_buf3[6] = (index >> 8) & 0xff; + step2_buf3[5] = (index >> 16) & 0xff; + step2_buf3[4] = (index >> 24) & 0xff; + + ret = wb_i2c_write_one_time(client, step2_buf1, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf1 failed, ret = %d\n", ret); + } + ret = wb_i2c_write_one_time(client, step2_buf2, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf2 failed, ret = %d\n", ret); + } + ret = wb_i2c_write_one_time(client, step2_buf3, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf3 failed, ret = %d\n", ret); + } + ret = wb_i2c_write_one_time(client, step2_buf4, 8); + if (ret < 0) { + DBG_ERROR("write step2_buf4 failed, ret = %d\n", ret); + } + + ret = wb_i2c_write_one_time(client, step2_buf5, 4); + if (ret < 0) { + DBG_ERROR("write step2_buf5 failed, ret = %d\n", ret); + } + ret = wb_i2c_read_one_time(client, read_buf, 4); + if (ret < 0) { + DBG_ERROR("read failed, ret = %d\n", ret); + } + for (i = 0; i < 4; i++) { + DBG_DEBUG("read_buf[%d] = 0x%x \n", i, read_buf[i]); + } + + ret = wb_i2c_write_one_time(client, step2_buf6, 4); + if (ret < 0) { + DBG_ERROR("write step2_buf6 failed, ret = %d\n", ret); + } + + ret = wb_i2c_read_one_time(client, read_buf, 4); + if (ret < 0) { + DBG_ERROR("read failed, ret = %d\n", ret); + return ret; + } + + value = (read_buf[0] << 24)| (read_buf[1] << 16) | (read_buf[2] << 8) | read_buf[3]; + *reg_value = value; + + return ret; +} + +static int mac_calcute(u32 reg, int *temp) +{ + int ret = 0; + u32 tmp = 0; + + switch(mac_pcie_id) { + case TD3: + case TH3: + tmp = reg & 0x3ff; + *temp = 434100 - (tmp * 535); + break; + case TD4: + case TH4: + case TD4_X9: + case TD4_X9_8: + tmp = reg & 0x7ff; + *temp = (356070 - (tmp * 237)); + break; + default: + ret = -1; + DBG_ERROR("read failed, ret = %d\n", ret); + break; + } + + if ((*temp / 1000 < -70) || (*temp / 1000 > 200)) { + ret = -1; + DBG_ERROR("mac temp invalid, temp = %d\n", *temp ); + } + + return ret; +} + +static int find_reg_type(int type, int *type_index) +{ + int i; + int size; + + size = ARRAY_SIZE(mac_temp_reg); + for (i = 0; i < size; i++) { + if (mac_temp_reg[i].mac_type == type) { + *type_index = i; + return 0; + } + } + + return -1; +} + +static sensor_reg_t * find_reg_offset(int type, int index) +{ + int i; + int type_index; + int ret; + + ret = find_reg_type(type, &type_index); + if (ret < 0) { + DBG_ERROR("find_reg_type failed, ret = %d\n", ret); + return NULL; + } + + for (i = 0; i < MAC_TEMP_NUM; i++) { + if (mac_temp_reg[type_index].sensor_reg[i].id == index) { + return &(mac_temp_reg[type_index].sensor_reg[i]); + } + } + + return NULL; +} + +static int get_mactemp(struct i2c_client *client, int index, int *temp) +{ + int ret; + int reg_value; + + if (index == 0) { + DBG_ERROR("invalid index\n"); + return -1; + } + + ret = getmac_register(client, index, ®_value); + if (ret < 0) { + DBG_ERROR("getmac_register failed, ret = %d\n", ret); + return ret; + } + DBG_DEBUG("reg_value = 0x%x \n", reg_value); + + ret = mac_calcute(reg_value, temp); + if (ret < 0) { + DBG_ERROR("mac_calcute failed, ret = %d\n", ret); + return ret; + } + + return 0; +} + +static ssize_t show_mac_temp(struct device *dev, struct device_attribute *da, char *buf) +{ + struct mac_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + u32 index_value = to_sensor_dev_attr_2(da)->index; + sensor_reg_t *t; + int result = 0; + int temp = -MAC_TEMP_INVALID; + + mutex_lock(&data->update_lock); + t = find_reg_offset(mac_pcie_id, index_value); + if (t == NULL) { + temp = -MAC_TEMP_INVALID; + DBG_ERROR("find_reg_offset failed, mac_pcie_id = %d, index_value = %d\n", mac_pcie_id, index_value); + } else { + result = get_mactemp(client, t->reg, &temp); + if (result < 0) { + temp = -MAC_TEMP_INVALID; + DBG_ERROR("get_mactemp failed, ret = %d\n", result); + } + } + + mutex_unlock(&data->update_lock); + return snprintf(buf, MAC_SIZE, "%d\n", temp); +} + +static ssize_t show_mac_max_temp(struct device *dev, struct device_attribute *da, char *buf) +{ + struct mac_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + int i; + int result; + int temp = -MAC_TEMP_INVALID; + int type_index; + int tmp; + + mutex_lock(&data->update_lock); + + result = find_reg_type(mac_pcie_id, &type_index); + if (result < 0) { + DBG_ERROR("find_reg_type failed, ret = %d\n", result); + goto exit; + } + + for (i = 0; i < MAC_TEMP_NUM; i++) { + result = get_mactemp(client, mac_temp_reg[type_index].sensor_reg[i].reg, &tmp); + if (result < 0) { + DBG_ERROR("get_mactemp failed, ret = %d\n", result); + tmp = -MAC_TEMP_INVALID; + } + + temp = (temp > tmp) ? temp : tmp; + } + +exit: + mutex_unlock(&data->update_lock); + return snprintf(buf, MAC_SIZE, "%d\n", temp); +} + +static int mac_bsc_init(struct i2c_client *client) +{ + int ret; + int reg_value; + int mac_id = 0; + + ret = getmac_register(client, MAC_ID_REG, ®_value); + if (ret < 0) { + DBG_ERROR("getmac_register failed, ret = %d\n", ret); + return ret; + } + + DBG_DEBUG("reg_value = 0x%x \n", reg_value); + mac_id = reg_value & 0xffff; + return mac_id; +} + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX1); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX2); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX3); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX4); +static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX5); +static SENSOR_DEVICE_ATTR(temp6_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX6); +static SENSOR_DEVICE_ATTR(temp7_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX7); +static SENSOR_DEVICE_ATTR(temp8_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX8); +static SENSOR_DEVICE_ATTR(temp9_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX9); +static SENSOR_DEVICE_ATTR(temp10_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX10); +static SENSOR_DEVICE_ATTR(temp11_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX11); +static SENSOR_DEVICE_ATTR(temp12_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX12); +static SENSOR_DEVICE_ATTR(temp13_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX13); +static SENSOR_DEVICE_ATTR(temp14_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX14); +static SENSOR_DEVICE_ATTR(temp15_input, S_IRUGO, show_mac_temp, NULL, MAC_TEMP_INDEX15); +static SENSOR_DEVICE_ATTR(temp99_input, S_IRUGO, show_mac_max_temp, NULL, 0); + +static struct attribute *mac_hwmon_attrs[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp4_input.dev_attr.attr, + &sensor_dev_attr_temp5_input.dev_attr.attr, + &sensor_dev_attr_temp6_input.dev_attr.attr, + &sensor_dev_attr_temp7_input.dev_attr.attr, + &sensor_dev_attr_temp8_input.dev_attr.attr, + &sensor_dev_attr_temp9_input.dev_attr.attr, + &sensor_dev_attr_temp10_input.dev_attr.attr, + &sensor_dev_attr_temp11_input.dev_attr.attr, + &sensor_dev_attr_temp12_input.dev_attr.attr, + &sensor_dev_attr_temp13_input.dev_attr.attr, + &sensor_dev_attr_temp14_input.dev_attr.attr, + &sensor_dev_attr_temp15_input.dev_attr.attr, + &sensor_dev_attr_temp99_input.dev_attr.attr, + NULL +}; +ATTRIBUTE_GROUPS(mac_hwmon); + +static int init_bcs_command(int mac_type) { + int ret; + + ret = 0; + switch (mac_type) { + case TD3: + step2_buf2[5] = 0x38; + break; + case TH3: + case TH4: + case TD4: + case TD4_X9: + case TD4_X9_8: + step2_buf2[5] = 0x40; + break; + default: + ret = -1; + break; + } + return ret; +} + +static int mac_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct mac_data *data; + int mac_type; + int ret; + + mac_type = id->driver_data; + mac_pcie_id = mac_type; + if (init_bcs_command(mac_type) < 0) { + DBG_ERROR("mactype[%x] not support \n", mac_type); + return -1; + }; + + if (mac_type == TD4) { + ret = mac_bsc_init(client); + if (ret < 0) { + DBG_ERROR("mac_bsc_init failed, ret = %d\n", ret); + return -1; + } + mac_type = ret; + mac_pcie_id = mac_type; + } + + DBG_DEBUG("=========mac_probe(%x)===========\n",client->addr); + DBG_DEBUG("mac_type: %x\n", mac_type); + data = devm_kzalloc(&client->dev, sizeof(struct mac_data), GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + data->client = client; + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, mac_hwmon_groups); + if (IS_ERR(data->hwmon_dev)) { + return PTR_ERR(data->hwmon_dev); + } + + return 0; +} + +static int mac_remove(struct i2c_client *client) +{ + struct mac_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + return 0; +} + +static const struct i2c_device_id mac_id[] = { + { "wb_mac_bsc_td3", TD3 }, + { "wb_mac_bsc_td4", TD4 }, + { "wb_mac_bsc_th3", TH3 }, + { "wb_mac_bsc_th4", TH4 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, mac_id); + +static struct i2c_driver wb_mac_bsc_driver = { + .driver = { + .name = "wb_mac_bsc", + }, + .probe = mac_probe, + .remove = mac_remove, + .id_table = mac_id, +}; + +module_i2c_driver(wb_mac_bsc_driver); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("mac bsc driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c new file mode 100644 index 0000000000..c09162368a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_optoe.c @@ -0,0 +1,1192 @@ +/* + * optoe.c - A driver to read and write the EEPROM on optical transceivers + * (SFP, QSFP and similar I2C based devices) + * + * Copyright (C) 2014 Cumulus networks Inc. + * Copyright (C) 2017 Finisar Corp. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Freeoftware Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* + * Description: + * a) Optical transceiver EEPROM read/write transactions are just like + * the at24 eeproms managed by the at24.c i2c driver + * b) The register/memory layout is up to 256 128 byte pages defined by + * a "pages valid" register and switched via a "page select" + * register as explained in below diagram. + * c) 256 bytes are mapped at a time. 'Lower page 00h' is the first 128 + * bytes of address space, and always references the same + * location, independent of the page select register. + * All mapped pages are mapped into the upper 128 bytes + * (offset 128-255) of the i2c address. + * d) Devices with one I2C address (eg QSFP) use I2C address 0x50 + * (A0h in the spec), and map all pages in the upper 128 bytes + * of that address. + * e) Devices with two I2C addresses (eg SFP) have 256 bytes of data + * at I2C address 0x50, and 256 bytes of data at I2C address + * 0x51 (A2h in the spec). Page selection and paged access + * only apply to this second I2C address (0x51). + * e) The address space is presented, by the driver, as a linear + * address space. For devices with one I2C client at address + * 0x50 (eg QSFP), offset 0-127 are in the lower + * half of address 50/A0h/client[0]. Offset 128-255 are in + * page 0, 256-383 are page 1, etc. More generally, offset + * 'n' resides in page (n/128)-1. ('page -1' is the lower + * half, offset 0-127). + * f) For devices with two I2C clients at address 0x50 and 0x51 (eg SFP), + * the address space places offset 0-127 in the lower + * half of 50/A0/client[0], offset 128-255 in the upper + * half. Offset 256-383 is in the lower half of 51/A2/client[1]. + * Offset 384-511 is in page 0, in the upper half of 51/A2/... + * Offset 512-639 is in page 1, in the upper half of 51/A2/... + * Offset 'n' is in page (n/128)-3 (for n > 383) + * + * One I2c addressed (eg QSFP) Memory Map + * + * 2-Wire Serial Address: 1010000x + * + * Lower Page 00h (128 bytes) + * ===================== + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * | | + * |Page Select Byte(127)| + * ===================== + * | + * | + * | + * | + * V + * ------------------------------------------------------------ + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * V V V V + * ------------ -------------- --------------- -------------- + * | | | | | | | | + * | Upper | | Upper | | Upper | | Upper | + * | Page 00h | | Page 01h | | Page 02h | | Page 03h | + * | | | (Optional) | | (Optional) | | (Optional | + * | | | | | | | for Cable | + * | | | | | | | Assemblies) | + * | ID | | AST | | User | | | + * | Fields | | Table | | EEPROM Data | | | + * | | | | | | | | + * | | | | | | | | + * | | | | | | | | + * ------------ -------------- --------------- -------------- + * + * The SFF 8436 (QSFP) spec only defines the 4 pages described above. + * In anticipation of future applications and devices, this driver + * supports access to the full architected range, 256 pages. + * + * The CMIS (Common Management Interface Specification) defines use of + * considerably more pages (at least to page 0xAF), which this driver + * supports. + * + * NOTE: This version of the driver ONLY SUPPORTS BANK 0 PAGES on CMIS + * devices. + * + **/ + +/* #define DEBUG 1 */ + +#undef EEPROM_CLASS +#ifdef CONFIG_EEPROM_CLASS +#define EEPROM_CLASS +#endif +#ifdef CONFIG_EEPROM_CLASS_MODULE +#define EEPROM_CLASS +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#ifdef EEPROM_CLASS +#include +#endif + +#include + +/* The maximum length of a port name */ +#define MAX_PORT_NAME_LEN 20 + +struct optoe_platform_data { + u32 byte_len; /* size (sum of all addr) */ + u16 page_size; /* for writes */ + u8 flags; + void *dummy1; /* backward compatibility */ + void *dummy2; /* backward compatibility */ + +#ifdef EEPROM_CLASS + struct eeprom_platform_data *eeprom_data; +#endif + char port_name[MAX_PORT_NAME_LEN]; +}; + +/* fundamental unit of addressing for EEPROM */ +#define OPTOE_PAGE_SIZE 128 +/* + * Single address devices (eg QSFP) have 256 pages, plus the unpaged + * low 128 bytes. If the device does not support paging, it is + * only 2 'pages' long. + */ +#define OPTOE_ARCH_PAGES 256 +#define ONE_ADDR_EEPROM_SIZE ((1 + OPTOE_ARCH_PAGES) * OPTOE_PAGE_SIZE) +#define ONE_ADDR_EEPROM_UNPAGED_SIZE (2 * OPTOE_PAGE_SIZE) +/* + * Dual address devices (eg SFP) have 256 pages, plus the unpaged + * low 128 bytes, plus 256 bytes at 0x50. If the device does not + * support paging, it is 4 'pages' long. + */ +#define TWO_ADDR_EEPROM_SIZE ((3 + OPTOE_ARCH_PAGES) * OPTOE_PAGE_SIZE) +#define TWO_ADDR_EEPROM_UNPAGED_SIZE (4 * OPTOE_PAGE_SIZE) +#define TWO_ADDR_NO_0X51_SIZE (2 * OPTOE_PAGE_SIZE) + +/* a few constants to find our way around the EEPROM */ +#define OPTOE_PAGE_SELECT_REG 0x7F +#define ONE_ADDR_PAGEABLE_REG 0x02 +#define QSFP_NOT_PAGEABLE (1<<2) +#define CMIS_NOT_PAGEABLE (1<<7) +#define TWO_ADDR_PAGEABLE_REG 0x40 +#define TWO_ADDR_PAGEABLE (1<<4) +#define TWO_ADDR_0X51_REG 92 +#define TWO_ADDR_0X51_SUPP (1<<6) +#define OPTOE_ID_REG 0 +#define OPTOE_READ_OP 0 +#define OPTOE_WRITE_OP 1 +#define OPTOE_EOF 0 /* used for access beyond end of device */ + +struct optoe_data { + struct optoe_platform_data chip; + int use_smbus; + char port_name[MAX_PORT_NAME_LEN]; + + /* + * Lock protects against activities from other Linux tasks, + * but not from changes by other I2C masters. + */ + struct mutex lock; + struct bin_attribute bin; + struct attribute_group attr_group; + + u8 *writebuf; + unsigned int write_max; + + unsigned int num_addresses; + +#ifdef EEPROM_CLASS + struct eeprom_device *eeprom_dev; +#endif + + /* dev_class: ONE_ADDR (QSFP) or TWO_ADDR (SFP) */ + int dev_class; + + struct i2c_client *client[]; +}; + +/* + * This parameter is to help this driver avoid blocking other drivers out + * of I2C for potentially troublesome amounts of time. With a 100 kHz I2C + * clock, one 256 byte read takes about 1/43 second which is excessive; + * but the 1/170 second it takes at 400 kHz may be quite reasonable; and + * at 1 MHz (Fm+) a 1/430 second delay could easily be invisible. + * + * This value is forced to be a power of two so that writes align on pages. + */ +static unsigned int io_limit = OPTOE_PAGE_SIZE; + +/* + * specs often allow 5 msec for a page write, sometimes 20 msec; + * it's important to recover from write timeouts. + */ +static unsigned int write_timeout = 50; + +/* + * flags to distinguish one-address (QSFP family) from two-address (SFP family) + * If the family is not known, figure it out when the device is accessed + */ +#define ONE_ADDR 1 +#define TWO_ADDR 2 +#define CMIS_ADDR 3 + +static const struct i2c_device_id optoe_ids[] = { + { "wb_optoe1", ONE_ADDR }, + { "wb_optoe2", TWO_ADDR }, + { "wb_optoe3", CMIS_ADDR }, + { "wb_sff8436", ONE_ADDR }, + { "wb_24c04", TWO_ADDR }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(i2c, optoe_ids); + +/*-------------------------------------------------------------------------*/ +/* + * This routine computes the addressing information to be used for + * a given r/w request. + * + * Task is to calculate the client (0 = i2c addr 50, 1 = i2c addr 51), + * the page, and the offset. + * + * Handles both single address (eg QSFP) and two address (eg SFP). + * For SFP, offset 0-255 are on client[0], >255 is on client[1] + * Offset 256-383 are on the lower half of client[1] + * Pages are accessible on the upper half of client[1]. + * Offset >383 are in 128 byte pages mapped into the upper half + * + * For QSFP, all offsets are on client[0] + * offset 0-127 are on the lower half of client[0] (no paging) + * Pages are accessible on the upper half of client[1]. + * Offset >127 are in 128 byte pages mapped into the upper half + * + * Callers must not read/write beyond the end of a client or a page + * without recomputing the client/page. Hence offset (within page) + * plus length must be less than or equal to 128. (Note that this + * routine does not have access to the length of the call, hence + * cannot do the validity check.) + * + * Offset within Lower Page 00h and Upper Page 00h are not recomputed + */ + +static uint8_t optoe_translate_offset(struct optoe_data *optoe, + loff_t *offset, struct i2c_client **client) +{ + unsigned int page = 0; + + *client = optoe->client[0]; + + /* if SFP style, offset > 255, shift to i2c addr 0x51 */ + if (optoe->dev_class == TWO_ADDR) { + if (*offset > 255) { + /* like QSFP, but shifted to client[1] */ + *client = optoe->client[1]; + *offset -= 256; + } + } + + /* + * if offset is in the range 0-128... + * page doesn't matter (using lower half), return 0. + * offset is already correct (don't add 128 to get to paged area) + */ + if (*offset < OPTOE_PAGE_SIZE) + return page; + + /* note, page will always be positive since *offset >= 128 */ + page = (*offset >> 7)-1; + /* 0x80 places the offset in the top half, offset is last 7 bits */ + *offset = OPTOE_PAGE_SIZE + (*offset & 0x7f); + + return page; /* note also returning client and offset */ +} + +static ssize_t optoe_eeprom_read(struct optoe_data *optoe, + struct i2c_client *client, + char *buf, unsigned int offset, size_t count) +{ + struct i2c_msg msg[2]; + u8 msgbuf[2]; + unsigned long timeout, read_time; + int status, i; + + mem_clear(msg, sizeof(msg)); + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + /*smaller eeproms can work given some SMBus extension calls */ + if (count > I2C_SMBUS_BLOCK_MAX) + count = I2C_SMBUS_BLOCK_MAX; + break; + case I2C_SMBUS_WORD_DATA: + /* Check for odd length transaction */ + count = (count == 1) ? 1 : 2; + break; + case I2C_SMBUS_BYTE_DATA: + count = 1; + break; + default: + /* + * When we have a better choice than SMBus calls, use a + * combined I2C message. Write address; then read up to + * io_limit data bytes. msgbuf is u8 and will cast to our + * needs. + */ + i = 0; + msgbuf[i++] = offset; + + msg[0].addr = client->addr; + msg[0].buf = msgbuf; + msg[0].len = i; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + } + + /* + * Reads fail if the previous write didn't complete yet. We may + * loop a few times until this one succeeds, waiting at least + * long enough for one entire page write to work. + */ + timeout = jiffies + msecs_to_jiffies(write_timeout); + do { + read_time = jiffies; + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + status = i2c_smbus_read_i2c_block_data(client, offset, + count, buf); + break; + case I2C_SMBUS_WORD_DATA: + status = i2c_smbus_read_word_data(client, offset); + if (status >= 0) { + buf[0] = status & 0xff; + if (count == 2) + buf[1] = status >> 8; + status = count; + } + break; + case I2C_SMBUS_BYTE_DATA: + status = i2c_smbus_read_byte_data(client, offset); + if (status >= 0) { + buf[0] = status; + status = count; + } + break; + default: + status = i2c_transfer(client->adapter, msg, 2); + if (status == 2) + status = count; + } + + dev_dbg(&client->dev, "eeprom read %zu@%d --> %d (%ld)\n", + count, offset, status, jiffies); + + if (status == count) /* happy path */ + return count; + + /* REVISIT: at HZ=100, this is sloooow */ + usleep_range(1000, 2000); + } while (time_before(read_time, timeout)); + + return -ETIMEDOUT; +} + +static ssize_t optoe_eeprom_write(struct optoe_data *optoe, + struct i2c_client *client, + const char *buf, + unsigned int offset, size_t count) +{ + struct i2c_msg msg; + ssize_t status; + unsigned long timeout, write_time; + unsigned int next_page_start; + int i = 0; + + /* write max is at most a page + * (In this driver, write_max is actually one byte!) + */ + if (count > optoe->write_max) + count = optoe->write_max; + + /* shorten count if necessary to avoid crossing page boundary */ + next_page_start = roundup(offset + 1, OPTOE_PAGE_SIZE); + if (offset + count > next_page_start) + count = next_page_start - offset; + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + /*smaller eeproms can work given some SMBus extension calls */ + if (count > I2C_SMBUS_BLOCK_MAX) + count = I2C_SMBUS_BLOCK_MAX; + break; + case I2C_SMBUS_WORD_DATA: + /* Check for odd length transaction */ + count = (count == 1) ? 1 : 2; + break; + case I2C_SMBUS_BYTE_DATA: + count = 1; + break; + default: + /* If we'll use I2C calls for I/O, set up the message */ + msg.addr = client->addr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = optoe->writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + break; + } + + /* + * Reads fail if the previous write didn't complete yet. We may + * loop a few times until this one succeeds, waiting at least + * long enough for one entire page write to work. + */ + timeout = jiffies + msecs_to_jiffies(write_timeout); + do { + write_time = jiffies; + + switch (optoe->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + status = i2c_smbus_write_i2c_block_data(client, + offset, count, buf); + if (status == 0) + status = count; + break; + case I2C_SMBUS_WORD_DATA: + if (count == 2) { + status = i2c_smbus_write_word_data(client, + offset, (u16)((buf[0])|(buf[1] << 8))); + } else { + /* count = 1 */ + status = i2c_smbus_write_byte_data(client, + offset, buf[0]); + } + if (status == 0) + status = count; + break; + case I2C_SMBUS_BYTE_DATA: + status = i2c_smbus_write_byte_data(client, offset, + buf[0]); + if (status == 0) + status = count; + break; + default: + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + break; + } + + dev_dbg(&client->dev, "eeprom write %zu@%d --> %ld (%lu)\n", + count, offset, (long int) status, jiffies); + + if (status == count) + return count; + + /* REVISIT: at HZ=100, this is sloooow */ + usleep_range(1000, 2000); + } while (time_before(write_time, timeout)); + + return -ETIMEDOUT; +} + +static ssize_t optoe_eeprom_update_client(struct optoe_data *optoe, + char *buf, loff_t off, + size_t count, int opcode) +{ + struct i2c_client *client; + ssize_t retval = 0; + uint8_t page = 0; + uint8_t loc; + loff_t phy_offset = off; + int ret = 0; + + page = optoe_translate_offset(optoe, &phy_offset, &client); + dev_dbg(&client->dev, + "%s off %lld page:%d phy_offset:%lld, count:%ld, opcode:%d\n", + __func__, off, page, phy_offset, (long int) count, opcode); + + ret = optoe_eeprom_read(optoe, client, &loc, OPTOE_PAGE_SELECT_REG, 1); + if (ret < 0) { + dev_dbg(&client->dev, "Read page register for get now location page failed. ret:%d\n", ret); + return ret; + } + + /* Only when read and now location page is inconsistent, will doing switch page */ + if (loc != page) { + ret = optoe_eeprom_write(optoe, client, &page, + OPTOE_PAGE_SELECT_REG, 1); + if (ret < 0) { + dev_dbg(&client->dev, + "Write page register for page %d failed ret:%d!\n", + page, ret); + return ret; + } + } + + while (count) { + ssize_t status; + + if (opcode == OPTOE_READ_OP) { + status = optoe_eeprom_read(optoe, client, + buf, phy_offset, count); + } else { + status = optoe_eeprom_write(optoe, client, + buf, phy_offset, count); + } + if (status <= 0) { + if (retval == 0) + retval = status; + break; + } + buf += status; + phy_offset += status; + count -= status; + retval += status; + } + + return retval; +} + +/* + * Figure out if this access is within the range of supported pages. + * Note this is called on every access because we don't know if the + * module has been replaced since the last call. + * If/when modules support more pages, this is the routine to update + * to validate and allow access to additional pages. + * + * Returns updated len for this access: + * - entire access is legal, original len is returned. + * - access begins legal but is too long, len is truncated to fit. + * - initial offset exceeds supported pages, return OPTOE_EOF (zero) + */ +static ssize_t optoe_page_legal(struct optoe_data *optoe, + loff_t off, size_t len) +{ + struct i2c_client *client = optoe->client[0]; + u8 regval; + int not_pageable; + int status; + size_t maxlen; + + if (off < 0) + return -EINVAL; + if (optoe->dev_class == TWO_ADDR) { + /* SFP case */ + /* if only using addr 0x50 (first 256 bytes) we're good */ + if ((off + len) <= TWO_ADDR_NO_0X51_SIZE) + return len; + /* if offset exceeds possible pages, we're not good */ + if (off >= TWO_ADDR_EEPROM_SIZE) + return OPTOE_EOF; + /* in between, are pages supported? */ + status = optoe_eeprom_read(optoe, client, ®val, + TWO_ADDR_PAGEABLE_REG, 1); + if (status < 0) + return status; /* error out (no module?) */ + if (regval & TWO_ADDR_PAGEABLE) { + /* Pages supported, trim len to the end of pages */ + maxlen = TWO_ADDR_EEPROM_SIZE - off; + } else { + /* pages not supported, trim len to unpaged size */ + if (off >= TWO_ADDR_EEPROM_UNPAGED_SIZE) + return OPTOE_EOF; + + /* will be accessing addr 0x51, is that supported? */ + /* byte 92, bit 6 implies DDM support, 0x51 support */ + status = optoe_eeprom_read(optoe, client, ®val, + TWO_ADDR_0X51_REG, 1); + if (status < 0) + return status; + if (regval & TWO_ADDR_0X51_SUPP) { + /* addr 0x51 is OK */ + maxlen = TWO_ADDR_EEPROM_UNPAGED_SIZE - off; + } else { + /* addr 0x51 NOT supported, trim to 256 max */ + if (off >= TWO_ADDR_NO_0X51_SIZE) + return OPTOE_EOF; + maxlen = TWO_ADDR_NO_0X51_SIZE - off; + } + } + len = (len > maxlen) ? maxlen : len; + dev_dbg(&client->dev, + "page_legal, SFP, off %lld len %ld\n", + off, (long int) len); + } else { + /* QSFP case, CMIS case */ + /* if no pages needed, we're good */ + if ((off + len) <= ONE_ADDR_EEPROM_UNPAGED_SIZE) + return len; + /* if offset exceeds possible pages, we're not good */ + if (off >= ONE_ADDR_EEPROM_SIZE) + return OPTOE_EOF; + /* in between, are pages supported? */ + status = optoe_eeprom_read(optoe, client, ®val, + ONE_ADDR_PAGEABLE_REG, 1); + if (status < 0) + return status; /* error out (no module?) */ + + if (optoe->dev_class == ONE_ADDR) { + not_pageable = QSFP_NOT_PAGEABLE; + } else { + not_pageable = CMIS_NOT_PAGEABLE; + } + dev_dbg(&client->dev, + "Paging Register: 0x%x; not_pageable mask: 0x%x\n", + regval, not_pageable); + + if (regval & not_pageable) { + /* pages not supported, trim len to unpaged size */ + if (off >= ONE_ADDR_EEPROM_UNPAGED_SIZE) + return OPTOE_EOF; + maxlen = ONE_ADDR_EEPROM_UNPAGED_SIZE - off; + } else { + /* Pages supported, trim len to the end of pages */ + maxlen = ONE_ADDR_EEPROM_SIZE - off; + } + len = (len > maxlen) ? maxlen : len; + dev_dbg(&client->dev, + "page_legal, QSFP, off %lld len %ld\n", + off, (long int) len); + } + return len; +} + +static ssize_t optoe_read_write(struct optoe_data *optoe, + char *buf, loff_t off, size_t len, int opcode) +{ + struct i2c_client *client = optoe->client[0]; + int chunk; + int status = 0; + ssize_t retval; + size_t pending_len = 0, chunk_len = 0; + loff_t chunk_offset = 0, chunk_start_offset = 0; + loff_t chunk_end_offset = 0; + + dev_dbg(&client->dev, + "%s: off %lld len:%ld, opcode:%s\n", + __func__, off, (long int) len, + (opcode == OPTOE_READ_OP) ? "r" : "w"); + if (unlikely(!len)) + return len; + + /* + * Read data from chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&optoe->lock); + + /* + * Confirm this access fits within the device suppored addr range + */ + status = optoe_page_legal(optoe, off, len); + if ((status == OPTOE_EOF) || (status < 0)) { + mutex_unlock(&optoe->lock); + return status; + } + len = status; + + /* + * For each (128 byte) chunk involved in this request, issue a + * separate call to sff_eeprom_update_client(), to + * ensure that each access recalculates the client/page + * and writes the page register as needed. + * Note that chunk to page mapping is confusing, is different for + * QSFP and SFP, and never needs to be done. Don't try! + */ + pending_len = len; /* amount remaining to transfer */ + retval = 0; /* amount transferred */ + for (chunk = off >> 7; chunk <= (off + len - 1) >> 7; chunk++) { + + /* + * Compute the offset and number of bytes to be read/write + * + * 1. start at an offset not equal to 0 (within the chunk) + * and read/write less than the rest of the chunk + * 2. start at an offset not equal to 0 and read/write the rest + * of the chunk + * 3. start at offset 0 (within the chunk) and read/write less + * than entire chunk + * 4. start at offset 0 (within the chunk), and read/write + * the entire chunk + */ + chunk_start_offset = chunk * OPTOE_PAGE_SIZE; + chunk_end_offset = chunk_start_offset + OPTOE_PAGE_SIZE; + + if (chunk_start_offset < off) { + chunk_offset = off; + if ((off + pending_len) < chunk_end_offset) + chunk_len = pending_len; + else + chunk_len = chunk_end_offset - off; + } else { + chunk_offset = chunk_start_offset; + if (pending_len < OPTOE_PAGE_SIZE) + chunk_len = pending_len; + else + chunk_len = OPTOE_PAGE_SIZE; + } + + dev_dbg(&client->dev, + "sff_r/w: off %lld, len %ld, chunk_start_offset %lld, chunk_offset %lld, chunk_len %ld, pending_len %ld\n", + off, (long int) len, chunk_start_offset, chunk_offset, + (long int) chunk_len, (long int) pending_len); + + /* + * note: chunk_offset is from the start of the EEPROM, + * not the start of the chunk + */ + status = optoe_eeprom_update_client(optoe, buf, + chunk_offset, chunk_len, opcode); + if (status != chunk_len) { + /* This is another 'no device present' path */ + dev_dbg(&client->dev, + "o_u_c: chunk %d c_offset %lld c_len %ld failed %d!\n", + chunk, chunk_offset, (long int) chunk_len, status); + if (status > 0) + retval += status; + if (retval == 0) + retval = status; + break; + } + buf += status; + pending_len -= status; + retval += status; + } + mutex_unlock(&optoe->lock); + + return retval; +} + +static ssize_t optoe_bin_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, + struct device, kobj)); + struct optoe_data *optoe = i2c_get_clientdata(client); + + return optoe_read_write(optoe, buf, off, count, OPTOE_READ_OP); +} + +static ssize_t optoe_bin_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, + struct device, kobj)); + struct optoe_data *optoe = i2c_get_clientdata(client); + + return optoe_read_write(optoe, buf, off, count, OPTOE_WRITE_OP); +} + +static int optoe_remove(struct i2c_client *client) +{ + struct optoe_data *optoe; + int i; + + optoe = i2c_get_clientdata(client); + sysfs_remove_group(&client->dev.kobj, &optoe->attr_group); + sysfs_remove_bin_file(&client->dev.kobj, &optoe->bin); + + for (i = 1; i < optoe->num_addresses; i++) + i2c_unregister_device(optoe->client[i]); + +#ifdef EEPROM_CLASS + eeprom_device_unregister(optoe->eeprom_dev); +#endif + + kfree(optoe->writebuf); + kfree(optoe); + return 0; +} + +static ssize_t show_dev_class(struct device *dev, + struct device_attribute *dattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&optoe->lock); + count = sprintf(buf, "%d\n", optoe->dev_class); + mutex_unlock(&optoe->lock); + + return count; +} + +static ssize_t set_dev_class(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + int dev_class; + + /* + * dev_class is actually the number of i2c addresses used, thus + * legal values are "1" (QSFP class) and "2" (SFP class) + * And... CMIS spec is 1 i2c address, but puts the pageable + * bit in a different location, so CMIS devices are "3" + */ + + if (kstrtoint(buf, 0, &dev_class) != 0 || + dev_class < 1 || dev_class > 3) + return -EINVAL; + + mutex_lock(&optoe->lock); + if (dev_class == TWO_ADDR) { + /* SFP family */ + /* if it doesn't exist, create 0x51 i2c address */ + if (!optoe->client[1]) { + optoe->client[1] = i2c_new_dummy_device(client->adapter, 0x51); + if (!optoe->client[1]) { + dev_err(&client->dev, + "address 0x51 unavailable\n"); + mutex_unlock(&optoe->lock); + return -EADDRINUSE; + } + } + optoe->bin.size = TWO_ADDR_EEPROM_SIZE; + optoe->num_addresses = 2; + } else { + /* one-address (eg QSFP) and CMIS family */ + /* if it exists, remove 0x51 i2c address */ + if (optoe->client[1]) { + i2c_unregister_device(optoe->client[1]); + optoe->client[1] = NULL; + } + optoe->bin.size = ONE_ADDR_EEPROM_SIZE; + optoe->num_addresses = 1; + } + optoe->dev_class = dev_class; + mutex_unlock(&optoe->lock); + + return count; +} + +/* + * if using the EEPROM CLASS driver, we don't report a port_name, + * the EEPROM CLASS drive handles that. Hence all this code is + * only compiled if we are NOT using the EEPROM CLASS driver. + */ +#ifndef EEPROM_CLASS + +static ssize_t show_port_name(struct device *dev, + struct device_attribute *dattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&optoe->lock); + count = sprintf(buf, "%s\n", optoe->port_name); + mutex_unlock(&optoe->lock); + + return count; +} + +static ssize_t set_port_name(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct optoe_data *optoe = i2c_get_clientdata(client); + char port_name[MAX_PORT_NAME_LEN]; + + /* no checking, this value is not used except by show_port_name */ + + if (sscanf(buf, "%19s", port_name) != 1) + return -EINVAL; + + mutex_lock(&optoe->lock); + strcpy(optoe->port_name, port_name); + mutex_unlock(&optoe->lock); + + return count; +} + +static DEVICE_ATTR(port_name, 0644, show_port_name, set_port_name); +#endif /* if NOT defined EEPROM_CLASS, the common case */ + +static DEVICE_ATTR(dev_class, 0644, show_dev_class, set_dev_class); + +static struct attribute *optoe_attrs[] = { +#ifndef EEPROM_CLASS + &dev_attr_port_name.attr, +#endif + &dev_attr_dev_class.attr, + NULL, +}; + +static struct attribute_group optoe_attr_group = { + .attrs = optoe_attrs, +}; + +static int optoe_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int err; + int use_smbus = 0; + struct optoe_platform_data chip; + struct optoe_data *optoe; + int num_addresses = 0; + char port_name[MAX_PORT_NAME_LEN]; + + if (client->addr != 0x50) { + dev_dbg(&client->dev, "probe, bad i2c addr: 0x%x\n", + client->addr); + err = -EINVAL; + goto exit; + } + + if (client->dev.platform_data) { + chip = *(struct optoe_platform_data *)client->dev.platform_data; + /* take the port name from the supplied platform data */ +#ifdef EEPROM_CLASS + strncpy(port_name, chip.eeprom_data->label, MAX_PORT_NAME_LEN); +#else + memcpy(port_name, chip.port_name, MAX_PORT_NAME_LEN); +#endif + dev_dbg(&client->dev, + "probe, chip provided, flags:0x%x; name: %s\n", + chip.flags, client->name); + } else { + if (!id->driver_data) { + err = -ENODEV; + goto exit; + } + dev_dbg(&client->dev, "probe, building chip\n"); + strcpy(port_name, "unitialized"); + chip.flags = 0; +#ifdef EEPROM_CLASS + chip.eeprom_data = NULL; +#endif + } + + /* Use I2C operations unless we're stuck with SMBus extensions. */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { + use_smbus = I2C_SMBUS_I2C_BLOCK_DATA; + } else if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_WORD_DATA)) { + use_smbus = I2C_SMBUS_WORD_DATA; + } else if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_BYTE_DATA)) { + use_smbus = I2C_SMBUS_BYTE_DATA; + } else { + err = -EPFNOSUPPORT; + goto exit; + } + } + + /* + * Make room for two i2c clients + */ + num_addresses = 2; + + optoe = kzalloc(sizeof(struct optoe_data) + + num_addresses * sizeof(struct i2c_client *), + GFP_KERNEL); + if (!optoe) { + err = -ENOMEM; + goto exit; + } + + mutex_init(&optoe->lock); + + /* determine whether this is a one-address or two-address module */ + if ((strcmp(client->name, "wb_optoe1") == 0) || + (strcmp(client->name, "wb_sff8436") == 0)) { + /* one-address (eg QSFP) family */ + optoe->dev_class = ONE_ADDR; + chip.byte_len = ONE_ADDR_EEPROM_SIZE; + num_addresses = 1; + } else if ((strcmp(client->name, "wb_optoe2") == 0) || + (strcmp(client->name, "wb_24c04") == 0)) { + /* SFP family */ + optoe->dev_class = TWO_ADDR; + chip.byte_len = TWO_ADDR_EEPROM_SIZE; + num_addresses = 2; + } else if (strcmp(client->name, "wb_optoe3") == 0) { + /* CMIS spec */ + optoe->dev_class = CMIS_ADDR; + chip.byte_len = ONE_ADDR_EEPROM_SIZE; + num_addresses = 1; + } else { /* those were the only choices */ + err = -EINVAL; + goto exit; + } + + dev_dbg(&client->dev, "dev_class: %d\n", optoe->dev_class); + optoe->use_smbus = use_smbus; + optoe->chip = chip; + optoe->num_addresses = num_addresses; + memcpy(optoe->port_name, port_name, MAX_PORT_NAME_LEN); + + /* + * Export the EEPROM bytes through sysfs, since that's convenient. + * By default, only root should see the data (maybe passwords etc) + */ + sysfs_bin_attr_init(&optoe->bin); + optoe->bin.attr.name = "eeprom"; + optoe->bin.attr.mode = 0444; + optoe->bin.read = optoe_bin_read; + optoe->bin.size = chip.byte_len; + + if (!use_smbus || + (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) || + i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_WORD_DATA) || + i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) { + /* + * NOTE: AN-2079 + * Finisar recommends that the host implement 1 byte writes + * only since this module only supports 32 byte page boundaries. + * 2 byte writes are acceptable for PE and Vout changes per + * Application Note AN-2071. + */ + unsigned int write_max = 1; + + optoe->bin.write = optoe_bin_write; + optoe->bin.attr.mode |= 0200; + + if (write_max > io_limit) + write_max = io_limit; + if (use_smbus && write_max > I2C_SMBUS_BLOCK_MAX) + write_max = I2C_SMBUS_BLOCK_MAX; + optoe->write_max = write_max; + + /* buffer (data + address at the beginning) */ + optoe->writebuf = kmalloc(write_max + 2, GFP_KERNEL); + if (!optoe->writebuf) { + err = -ENOMEM; + goto exit_kfree; + } + } else { + dev_warn(&client->dev, + "cannot write due to controller restrictions."); + } + + optoe->client[0] = client; + + /* SFF-8472 spec requires that the second I2C address be 0x51 */ + if (num_addresses == 2) { + optoe->client[1] = i2c_new_dummy_device(client->adapter, 0x51); + if (!optoe->client[1]) { + dev_err(&client->dev, "address 0x51 unavailable\n"); + err = -EADDRINUSE; + goto err_struct; + } + } + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &optoe->bin); + if (err) + goto err_struct; + + optoe->attr_group = optoe_attr_group; + + err = sysfs_create_group(&client->dev.kobj, &optoe->attr_group); + if (err) { + dev_err(&client->dev, "failed to create sysfs attribute group.\n"); + goto err_struct; + } + +#ifdef EEPROM_CLASS + optoe->eeprom_dev = eeprom_device_register(&client->dev, + chip.eeprom_data); + if (IS_ERR(optoe->eeprom_dev)) { + dev_err(&client->dev, "error registering eeprom device.\n"); + err = PTR_ERR(optoe->eeprom_dev); + goto err_sysfs_cleanup; + } +#endif + + i2c_set_clientdata(client, optoe); + + dev_info(&client->dev, "%zu byte %s EEPROM, %s\n", + optoe->bin.size, client->name, + optoe->bin.write ? "read/write" : "read-only"); + + if (use_smbus == I2C_SMBUS_WORD_DATA || + use_smbus == I2C_SMBUS_BYTE_DATA) { + dev_notice(&client->dev, + "Falling back to %s reads, performance will suffer\n", + use_smbus == I2C_SMBUS_WORD_DATA ? "word" : "byte"); + } + + return 0; + +#ifdef EEPROM_CLASS +err_sysfs_cleanup: + sysfs_remove_group(&client->dev.kobj, &optoe->attr_group); + sysfs_remove_bin_file(&client->dev.kobj, &optoe->bin); +#endif + +err_struct: + if (num_addresses == 2) { + if (optoe->client[1]) { + i2c_unregister_device(optoe->client[1]); + optoe->client[1] = NULL; + } + } + + kfree(optoe->writebuf); +exit_kfree: + kfree(optoe); +exit: + dev_dbg(&client->dev, "probe error %d\n", err); + + return err; +} + +/*-------------------------------------------------------------------------*/ + +static struct i2c_driver optoe_driver = { + .driver = { + .name = "wb_optoe", + .owner = THIS_MODULE, + }, + .probe = optoe_probe, + .remove = optoe_remove, + .id_table = optoe_ids, +}; + +static int __init optoe_init(void) +{ + + if (!io_limit) { + pr_err("optoe: io_limit must not be 0!\n"); + return -EINVAL; + } + + io_limit = rounddown_pow_of_two(io_limit); + return i2c_add_driver(&optoe_driver); +} +module_init(optoe_init); + +static void __exit optoe_exit(void) +{ + i2c_del_driver(&optoe_driver); +} +module_exit(optoe_exit); + +MODULE_DESCRIPTION("Driver for optical transceiver (SFP, QSFP, ...) EEPROMs"); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c new file mode 100644 index 0000000000..1f5180ffcc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.c @@ -0,0 +1,770 @@ +/* + * wb_pcie_dev.c + * ko to read/write pcie iomem and ioports through /dev/XXX device + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_pcie_dev.h" + +#define PROXY_NAME "wb-pci-dev" +#define MAX_NAME_SIZE (20) +#define MAX_PCIE_NUM (256) +#define PCI_RDWR_MAX_LEN (256) +#define PCIE_BUS_WIDTH_1 (1) +#define PCIE_BUS_WIDTH_2 (2) +#define PCIE_BUS_WIDTH_4 (4) + +static int g_pcie_dev_debug = 0; +static int g_pcie_dev_error = 0; + +module_param(g_pcie_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_pcie_dev_error, int, S_IRUGO | S_IWUSR); + +#define PCIE_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_pcie_dev_debug) { \ + printk(KERN_INFO "[PCIE_DEV][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define PCIE_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_pcie_dev_error) { \ + printk(KERN_ERR "[PCIE_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +typedef struct firmware_upg_s { + int upg_ctrl_base; + int upg_flash_base; +} firmware_upg_t; + +typedef struct wb_pci_dev_s { + const char *name; + uint32_t domain; + uint32_t bus; + uint32_t slot; + uint32_t fn; + uint32_t bar; + void __iomem *pci_mem_base; + uint32_t pci_io_base; + uint32_t bar_len; + uint32_t bar_flag; + uint32_t bus_width; + struct miscdevice misc; + void (*setreg)(struct wb_pci_dev_s *wb_pci_dev, int reg, u32 value); + u32 (*getreg)(struct wb_pci_dev_s *wb_pci_dev, int reg); + firmware_upg_t firmware_upg; +} wb_pci_dev_t; + +static wb_pci_dev_t* pcie_dev_arry[MAX_PCIE_NUM]; + +static void pci_dev_setreg_8(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + u8 w_value; + + w_value = (u8)(value & 0xff); + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + writeb(w_value, wb_pci_dev->pci_mem_base + reg); + } else { + outb(w_value, wb_pci_dev->pci_io_base + reg); + } + return; +} + +static void pci_dev_setreg_16(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + u16 w_value; + + w_value = (u16)(value & 0xffff); + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + writew(w_value, wb_pci_dev->pci_mem_base + reg); + } else { + outw(w_value, wb_pci_dev->pci_io_base + reg); + } + + return; +} + +static void pci_dev_setreg_32(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + writel(value, wb_pci_dev->pci_mem_base + reg); + } else { + outl(value, wb_pci_dev->pci_io_base + reg); + } + return; +} + +static inline u32 pci_dev_getreg_8(wb_pci_dev_t *wb_pci_dev, int reg) +{ + u32 value; + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + value = readb(wb_pci_dev->pci_mem_base + reg); + } else { + value = inb(wb_pci_dev->pci_io_base + reg); + } + + return value; +} + +static inline u32 pci_dev_getreg_16(wb_pci_dev_t *wb_pci_dev, int reg) +{ + u32 value; + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + value = readw(wb_pci_dev->pci_mem_base + reg); + } else { + value = inw(wb_pci_dev->pci_io_base + reg); + } + + return value; +} + +static inline u32 pci_dev_getreg_32(wb_pci_dev_t *wb_pci_dev, int reg) +{ + u32 value; + + if (wb_pci_dev->bar_flag == IORESOURCE_MEM) { + value = readl(wb_pci_dev->pci_mem_base + reg); + } else { + value = inl(wb_pci_dev->pci_io_base + reg); + } + + return value; +} + +static inline void pci_dev_setreg(wb_pci_dev_t *wb_pci_dev, int reg, u32 value) +{ + wb_pci_dev->setreg(wb_pci_dev, reg, value); +} + +static inline u32 pci_dev_getreg(wb_pci_dev_t *wb_pci_dev, int reg) +{ + return wb_pci_dev->getreg(wb_pci_dev, reg); +} + +static int pci_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + wb_pci_dev_t *wb_pci_dev; + + PCIE_DEV_DEBUG_VERBOSE("inode: %p, file: %p, minor: %u", inode, file, minor); + + if (minor >= MAX_PCIE_NUM) { + PCIE_DEV_DEBUG_ERROR("minor out of range, minor = %d.\n", minor); + return -ENODEV; + } + + wb_pci_dev = pcie_dev_arry[minor]; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, open failed, minor = %d\n", minor); + return -ENODEV; + } + + file->private_data = wb_pci_dev; + return 0; +} + +static int pci_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + return 0; +} + +static int pci_dev_read_tmp(wb_pci_dev_t *wb_pci_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int width, i, j; + u32 val; + + if (offset > wb_pci_dev->bar_len) { + PCIE_DEV_DEBUG_VERBOSE("offset:0x%x, bar len:0x%x, EOF.\n", offset, wb_pci_dev->bar_len); + return 0; + } + + width = wb_pci_dev->bus_width; + + if (offset % width) { + PCIE_DEV_DEBUG_ERROR("pci bus width:%d, offset:0x%x, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + + if (count > wb_pci_dev->bar_len - offset) { + PCIE_DEV_DEBUG_VERBOSE("read count out of range. input len:%lu, read len:%u.\n", + count, wb_pci_dev->bar_len - offset); + count = wb_pci_dev->bar_len - offset; + } + + for (i = 0; i < count; i += width) { + val = pci_dev_getreg(wb_pci_dev, offset + i); + for (j = 0; (j < width) && (i + j < count); j++) { + buf[i + j] = (val >> (8 * j)) & 0xff; + } + } + return count; +} + +static ssize_t pci_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + wb_pci_dev_t *wb_pci_dev; + int ret, read_len; + u8 buf_tmp[PCI_RDWR_MAX_LEN]; + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, read failed.\n"); + return -EINVAL; + } + + if (count == 0) { + PCIE_DEV_DEBUG_ERROR("Invalid params, read count is 0.n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + PCIE_DEV_DEBUG_VERBOSE("read conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + read_len = pci_dev_read_tmp(wb_pci_dev, *offset, buf_tmp, count); + if (read_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_read_tmp failed, ret:%d.\n", read_len); + return read_len; + } + if (access_ok(buf, read_len)) { + PCIE_DEV_DEBUG_VERBOSE("user space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + if (copy_to_user(buf, buf_tmp, read_len)) { + PCIE_DEV_DEBUG_ERROR("copy_to_user failed.\n"); + return -EFAULT; + } + } else { + PCIE_DEV_DEBUG_VERBOSE("kernel space read, buf: %p, offset: %lld, read conut %lu.\n", + buf, *offset, count); + memcpy(buf, buf_tmp, read_len); + } + *offset += read_len; + ret = read_len; + return ret; +} + +static ssize_t pci_dev_read_iter(struct kiocb *iocb, struct iov_iter *to) +{ + int ret; + + PCIE_DEV_DEBUG_VERBOSE("pci_dev_read_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, to->count, iocb->ki_pos); + ret = pci_dev_read(iocb->ki_filp, to->kvec->iov_base, to->count, &iocb->ki_pos); + return ret; +} + +static int pci_dev_write_tmp(wb_pci_dev_t *wb_pci_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int width, i, j; + u32 val; + + if (offset > wb_pci_dev->bar_len) { + PCIE_DEV_DEBUG_VERBOSE("offset:0x%x, bar len:0x%x, EOF.\n", offset, wb_pci_dev->bar_len); + return 0; + } + + width = wb_pci_dev->bus_width; + + if (offset % width) { + PCIE_DEV_DEBUG_ERROR("pci bus width:%d, offset:0x%x, read size %lu invalid.\n", + width, offset, count); + return -EINVAL; + } + + if (count > wb_pci_dev->bar_len - offset) { + PCIE_DEV_DEBUG_VERBOSE("write count out of range. input len:%lu, write len:%u.\n", + count, wb_pci_dev->bar_len - offset); + count = wb_pci_dev->bar_len - offset; + } + + for (i = 0; i < count; i += width) { + val = 0; + for (j = 0; (j < width) && (i + j < count); j++) { + val |= buf[i + j] << (8 * j); + } + pci_dev_setreg(wb_pci_dev, i + offset, val); + } + + return count; +} + +static ssize_t pci_dev_write(struct file *file, const char __user *buf, size_t count, + loff_t *offset) +{ + wb_pci_dev_t *wb_pci_dev; + u8 buf_tmp[PCI_RDWR_MAX_LEN]; + int write_len; + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, write failed.\n"); + return -EINVAL; + } + + if (count == 0) { + PCIE_DEV_DEBUG_ERROR("Invalid params, write count is 0.\n"); + return -EINVAL; + } + + if (count > sizeof(buf_tmp)) { + PCIE_DEV_DEBUG_VERBOSE("write conut %lu exceed max %lu.\n", count, sizeof(buf_tmp)); + count = sizeof(buf_tmp); + } + + mem_clear(buf_tmp, sizeof(buf_tmp)); + if (access_ok(buf, count)) { + PCIE_DEV_DEBUG_VERBOSE("user space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + if (copy_from_user(buf_tmp, buf, count)) { + PCIE_DEV_DEBUG_ERROR("copy_from_user failed.\n"); + return -EFAULT; + } + } else { + PCIE_DEV_DEBUG_VERBOSE("kernel space write, buf: %p, offset: %lld, write conut %lu.\n", + buf, *offset, count); + memcpy(buf_tmp, buf, count); + } + + write_len = pci_dev_write_tmp(wb_pci_dev, *offset, buf_tmp, count); + if (write_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_write_tmp failed, ret:%d.\n", write_len); + return write_len; + } + + *offset += write_len; + return write_len; +} + +static ssize_t pci_dev_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + int ret; + + PCIE_DEV_DEBUG_VERBOSE("pci_dev_write_iter, file: %p, count: %lu, offset: %lld\n", + iocb->ki_filp, from->count, iocb->ki_pos); + ret = pci_dev_write(iocb->ki_filp, from->kvec->iov_base, from->count, &iocb->ki_pos); + return ret; +} + +static loff_t pci_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + wb_pci_dev_t *wb_pci_dev; + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, llseek failed.\n"); + return -EINVAL; + } + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + PCIE_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + if (offset > wb_pci_dev->bar_len) { + PCIE_DEV_DEBUG_ERROR("SEEK_SET out of range, offset:%lld, bar len:0x%x.\n", + offset, wb_pci_dev->bar_len); + ret = - EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (((file->f_pos + offset) > wb_pci_dev->bar_len) || ((file->f_pos + offset) < 0)) { + PCIE_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld, bar len:0x%x.\n", + file->f_pos, offset, wb_pci_dev->bar_len); + ret = - EINVAL; + break; + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + PCIE_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static long pci_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + wb_pci_dev_t *wb_pci_dev; + void __user *argp; + firmware_upg_t *firmware_upg; + int upg_ctrl_base; + int upg_flash_base; + + PCIE_DEV_DEBUG_VERBOSE("ioctl, cmd=0x%02x, arg=0x%02lx\n",cmd, arg); + + wb_pci_dev = file->private_data; + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("wb_pci_dev is NULL, ioctl failed.\n"); + return -EINVAL; + } + + firmware_upg = &wb_pci_dev->firmware_upg; + + argp = (void __user *)arg; + + switch (cmd) { + case GET_FPGA_UPG_CTL_BASE: + if (firmware_upg->upg_ctrl_base < 0) { + PCIE_DEV_DEBUG_ERROR("dts not adaptive upg_ctrl_base\n"); + return -EFAULT; + } else { + upg_ctrl_base = firmware_upg->upg_ctrl_base; + if (copy_to_user(argp, &upg_ctrl_base, sizeof(upg_ctrl_base))) { + PCIE_DEV_DEBUG_ERROR("upg_ctrl_base copy_from_user failed\n"); + return -EFAULT; + } + } + break; + case GET_FPGA_UPG_FLASH_BASE: + if (firmware_upg->upg_flash_base < 0) { + PCIE_DEV_DEBUG_ERROR("dts not adaptive upg_flash_base\n"); + return -EFAULT; + } else { + upg_flash_base = firmware_upg->upg_flash_base; + if (copy_to_user(argp, &upg_flash_base, sizeof(upg_flash_base))) { + PCIE_DEV_DEBUG_ERROR("upg_flash_base copy_from_user failed\n"); + return -EFAULT; + } + } + break; + default: + PCIE_DEV_DEBUG_ERROR("command unsupported \n"); + return -ENOTTY; + } + + return 0; +} + +static const struct file_operations pcie_dev_fops = { + .owner = THIS_MODULE, + .llseek = pci_dev_llseek, + .read_iter = pci_dev_read_iter, + .write_iter = pci_dev_write_iter, + .unlocked_ioctl = pci_dev_ioctl, + .open = pci_dev_open, + .release = pci_dev_release, +}; + +static wb_pci_dev_t *dev_match(const char *path) +{ + wb_pci_dev_t *wb_pci_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + + for (i = 0; i < MAX_PCIE_NUM; i++) { + if (pcie_dev_arry[i] == NULL) { + continue; + } + wb_pci_dev = pcie_dev_arry[i]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", wb_pci_dev->name); + if (!strcmp(path, dev_name)) { + PCIE_DEV_DEBUG_VERBOSE("get dev_name = %s, minor = %d\n", dev_name, i); + return wb_pci_dev; + } + } + + return NULL; +} + +int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_pci_dev_t *wb_pci_dev; + int read_len; + + if (path == NULL) { + PCIE_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + PCIE_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_pci_dev = dev_match(path); + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + read_len = pci_dev_read_tmp(wb_pci_dev, offset, buf, count); + if (read_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_read_tmp failed, ret:%d.\n", read_len); + } + return read_len; +} +EXPORT_SYMBOL(pcie_device_func_read); + +int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + wb_pci_dev_t *wb_pci_dev; + int write_len; + + if (path == NULL) { + PCIE_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if (buf == NULL) { + PCIE_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + wb_pci_dev = dev_match(path); + if (wb_pci_dev == NULL) { + PCIE_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + write_len = pci_dev_write_tmp(wb_pci_dev, offset, buf, count); + if (write_len < 0) { + PCIE_DEV_DEBUG_ERROR("pci_dev_write_tmp failed, ret:%d.\n", write_len); + } + return write_len; +} +EXPORT_SYMBOL(pcie_device_func_write); + +static int pci_setup_bars(wb_pci_dev_t *wb_pci_dev, struct pci_dev *dev) +{ + int ret; + uint32_t addr, len, flags; + + ret = 0; + addr = pci_resource_start(dev, wb_pci_dev->bar); + len = pci_resource_len(dev, wb_pci_dev->bar); + if (addr == 0 || len == 0) { + PCIE_DEV_DEBUG_ERROR("get bar addr failed. bar:%d, addr:0x%x, len:0x%x.\n", + wb_pci_dev->bar, addr, len); + return -EFAULT; + } + wb_pci_dev->bar_len = len; + + flags = pci_resource_flags(dev, wb_pci_dev->bar); + PCIE_DEV_DEBUG_VERBOSE("bar:%d, flag:0x%08x, phys addr:0x%x, len:0x%x\n", + wb_pci_dev->bar, flags, addr, len); + if (flags & IORESOURCE_MEM) { + wb_pci_dev->bar_flag = IORESOURCE_MEM; + wb_pci_dev->pci_mem_base = ioremap(addr, len); + PCIE_DEV_DEBUG_VERBOSE("pci mem base:%p.\n", wb_pci_dev->pci_mem_base); + } else if (flags & IORESOURCE_IO) { + wb_pci_dev->bar_flag = IORESOURCE_IO; + wb_pci_dev->pci_io_base = addr; + PCIE_DEV_DEBUG_VERBOSE("pci io base:0x%x.\n", wb_pci_dev->pci_io_base); + } else { + PCIE_DEV_DEBUG_ERROR("unknow pci bar flag:0x%08x.\n", flags); + ret = -EINVAL; + } + + return ret; +} + +static int pci_dev_probe(struct platform_device *pdev) +{ + int ret, devfn; + wb_pci_dev_t *wb_pci_dev; + struct pci_dev *pci_dev; + struct miscdevice *misc; + firmware_upg_t *firmware_upg; + pci_dev_device_t *pci_dev_device; + + wb_pci_dev = devm_kzalloc(&pdev->dev, sizeof(wb_pci_dev_t), GFP_KERNEL); + if (!wb_pci_dev) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + ret = -ENOMEM; + return ret; + } + + firmware_upg = &wb_pci_dev->firmware_upg; + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "pci_dev_name", &wb_pci_dev->name); + ret += of_property_read_u32(pdev->dev.of_node, "pci_domain", &wb_pci_dev->domain); + ret += of_property_read_u32(pdev->dev.of_node, "pci_bus", &wb_pci_dev->bus); + ret += of_property_read_u32(pdev->dev.of_node, "pci_slot", &wb_pci_dev->slot); + ret += of_property_read_u32(pdev->dev.of_node, "pci_fn", &wb_pci_dev->fn); + ret += of_property_read_u32(pdev->dev.of_node, "pci_bar", &wb_pci_dev->bar); + ret += of_property_read_u32(pdev->dev.of_node, "bus_width", &wb_pci_dev->bus_width); + + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get dts config, ret:%d.\n", ret); + return -ENXIO; + } + + ret = 0; + ret += of_property_read_u32(pdev->dev.of_node, "upg_ctrl_base", &firmware_upg->upg_ctrl_base); + ret += of_property_read_u32(pdev->dev.of_node, "upg_flash_base", &firmware_upg->upg_flash_base); + if (ret != 0) { + PCIE_DEV_DEBUG_VERBOSE("dts don't adaptive fpga upg related, ret:%d.\n", ret); + firmware_upg->upg_ctrl_base = -1; + firmware_upg->upg_flash_base = -1; + } else { + PCIE_DEV_DEBUG_VERBOSE("upg_ctrl_base:0x%04x, upg_flash_base:0x%02x.\n", + firmware_upg->upg_ctrl_base, firmware_upg->upg_flash_base); + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + pci_dev_device = pdev->dev.platform_data; + wb_pci_dev->name = pci_dev_device->pci_dev_name; + wb_pci_dev->domain = pci_dev_device->pci_domain; + wb_pci_dev->bus = pci_dev_device->pci_bus; + wb_pci_dev->slot = pci_dev_device->pci_slot; + wb_pci_dev->fn = pci_dev_device->pci_fn; + wb_pci_dev->bar = pci_dev_device->pci_bar; + wb_pci_dev->bus_width = pci_dev_device->bus_width; + firmware_upg->upg_ctrl_base = pci_dev_device->upg_ctrl_base; + firmware_upg->upg_flash_base = pci_dev_device->upg_flash_base; + PCIE_DEV_DEBUG_VERBOSE("upg_ctrl_base:0x%04x, upg_flash_base:0x%02x.\n", + firmware_upg->upg_ctrl_base, firmware_upg->upg_flash_base); + } + + PCIE_DEV_DEBUG_VERBOSE("name:%s, domain:0x%04x, bus:0x%02x, slot:0x%02x, fn:%u, bar:%u, bus_width:%d.\n", + wb_pci_dev->name, wb_pci_dev->domain, wb_pci_dev->bus, wb_pci_dev->slot, wb_pci_dev->fn, + wb_pci_dev->bar, wb_pci_dev->bus_width); + + devfn = PCI_DEVFN(wb_pci_dev->slot, wb_pci_dev->fn); + pci_dev = pci_get_domain_bus_and_slot(wb_pci_dev->domain, wb_pci_dev->bus, devfn); + if (pci_dev == NULL) { + dev_err(&pdev->dev, "Failed to find pci_dev, domain:0x%04x, bus:0x%02x, devfn:0x%x\n", + wb_pci_dev->domain, wb_pci_dev->bus, devfn); + return -ENXIO; + } + ret = pci_setup_bars(wb_pci_dev, pci_dev); + if (ret != 0) { + dev_err(&pdev->dev, "Failed to get pci bar address.\n"); + return ret; + } + + if (!wb_pci_dev->setreg || !wb_pci_dev->getreg) { + switch (wb_pci_dev->bus_width) { + case 1: + wb_pci_dev->setreg = pci_dev_setreg_8; + wb_pci_dev->getreg = pci_dev_getreg_8; + break; + + case 2: + wb_pci_dev->setreg = pci_dev_setreg_16; + wb_pci_dev->getreg = pci_dev_getreg_16; + break; + + case 4: + wb_pci_dev->setreg = pci_dev_setreg_32; + wb_pci_dev->getreg = pci_dev_getreg_32; + break; + default: + dev_err(&pdev->dev, "Error: unsupported I/O width (%d).\n", wb_pci_dev->bus_width); + ret = -EINVAL; + goto io_unmap; + } + } + + misc = &wb_pci_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = wb_pci_dev->name; + misc->fops = &pcie_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&pdev->dev, "Failed to register %s device.\n", misc->name); + ret = -ENXIO; + goto io_unmap; + } + if (misc->minor >= MAX_PCIE_NUM) { + dev_err(&pdev->dev, "Error: device minor[%d] more than max pcie num[%d].\n", + misc->minor, MAX_PCIE_NUM); + misc_deregister(misc); + ret = -EINVAL; + goto io_unmap; + } + pcie_dev_arry[misc->minor] = wb_pci_dev; + dev_info(&pdev->dev, "%04x:%02x:%02x.%d[bar%d: %s]: register %s device with minor:%d success.\n", + wb_pci_dev->domain, wb_pci_dev->bus, wb_pci_dev->slot, wb_pci_dev->fn, wb_pci_dev->bar, + wb_pci_dev->bar_flag == IORESOURCE_MEM ? "IORESOURCE_MEM" : "IORESOURCE_IO", + misc->name, misc->minor ); + return 0; + +io_unmap: + if (wb_pci_dev->pci_mem_base) { + iounmap(wb_pci_dev->pci_mem_base); + } + return ret; +} + +static int pci_dev_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_PCIE_NUM ; i++) { + if (pcie_dev_arry[i] != NULL) { + if (pcie_dev_arry[i]->pci_mem_base) { + iounmap(pcie_dev_arry[i]->pci_mem_base); + } + misc_deregister(&pcie_dev_arry[i]->misc); + pcie_dev_arry[i] = NULL; + } + } + + return 0; +} + +static struct of_device_id pci_dev_match[] = { + { + .compatible = "wb-pci-dev", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, pci_dev_match); + +static struct platform_driver wb_pci_dev_driver = { + .probe = pci_dev_probe, + .remove = pci_dev_remove, + .driver = { + .owner = THIS_MODULE, + .name = PROXY_NAME, + .of_match_table = pci_dev_match, + }, +}; + +static int __init wb_pci_dev_init(void) +{ + return platform_driver_register(&wb_pci_dev_driver); +} + +static void __exit wb_pci_dev_exit(void) +{ + platform_driver_unregister(&wb_pci_dev_driver); +} + +module_init(wb_pci_dev_init); +module_exit(wb_pci_dev_exit); +MODULE_DESCRIPTION("pcie device driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h new file mode 100644 index 0000000000..9ba0f3b457 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_pcie_dev.h @@ -0,0 +1,26 @@ +#ifndef __WB_PCIE_DEV_H__ +#define __WB_PCIE_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define UPG_TYPE 'U' +#define GET_FPGA_UPG_CTL_BASE _IOR(UPG_TYPE, 0, int) +#define GET_FPGA_UPG_FLASH_BASE _IOR(UPG_TYPE, 1, int) + +#define PCI_DEV_NAME_MAX_LEN (64) + +typedef struct pci_dev_device_s { + char pci_dev_name[PCI_DEV_NAME_MAX_LEN]; + int pci_domain; + int pci_bus; + int pci_slot; + int pci_fn; + int pci_bar; + int bus_width; + int upg_ctrl_base; + int upg_flash_base; + int device_flag; +} pci_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c new file mode 100644 index 0000000000..3fe1c4aa10 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.c @@ -0,0 +1,749 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_platform_i2c_dev.h" + +#define PROXY_NAME "wb-platform-i2c-dev" +#define MAX_I2C_DEV_NUM (256) +#define FPGA_MAX_LEN (256) +#define MAX_NAME_SIZE (20) +#define MAX_BUS_WIDTH (16) +#define TRANSFER_WRITE_BUFF (FPGA_MAX_LEN + MAX_BUS_WIDTH) + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) + +int g_i2c_dev_debug = 0; +int g_i2c_dev_error = 0; + +module_param(g_i2c_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_i2c_dev_error, int, S_IRUGO | S_IWUSR); + +#define I2C_DEV_DEBUG_DMESG(fmt, args...) do { \ + if (g_i2c_dev_debug) { \ + printk(KERN_ERR "[I2C_DEV][DEBUG][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define I2C_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_i2c_dev_error) { \ + printk(KERN_ERR "[I2C_DEV][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct platform_i2c_dev_info* i2c_dev_arry[MAX_I2C_DEV_NUM]; + +struct platform_i2c_dev_info { + uint32_t i2c_bus; + uint32_t i2c_addr; + const char *name; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + struct miscdevice misc; +}; + +static int transfer_read(struct platform_i2c_dev_info *i2c_dev, u8 *buf, loff_t regaddr, size_t count) +{ + int i, j; + struct i2c_adapter *adap; + union i2c_smbus_data data; + u8 offset_buf[MAX_BUS_WIDTH]; + struct i2c_msg msgs[2]; + int msgs_num, ret; + u8 offset; + u8 length; + + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\r\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\r\n", i2c_dev->addr_bus_width); + return -EINVAL; + } + + adap = i2c_get_adapter(i2c_dev->i2c_bus); + if (adap == NULL) { + I2C_DEV_DEBUG_ERROR("get i2c adapter %d faild.\n", i2c_dev->i2c_bus); + return -ENXIO; + } + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + msgs[0].addr = i2c_dev->i2c_addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width; + msgs[0].buf = offset_buf; + + msgs[1].addr = i2c_dev->i2c_addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = count; + msgs[1].buf = buf; + + msgs_num = 2; + ret = i2c_transfer(adap, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer read error\r\n"); + ret = -EFAULT; + goto error_exit; + } + } else { + if (i2c_dev->addr_bus_width == WIDTH_1Byte) { + offset = regaddr & 0xFF; + if (i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { + for (j = 0; j < count; j += I2C_SMBUS_BLOCK_MAX) { + if (count - j > I2C_SMBUS_BLOCK_MAX) { + length = I2C_SMBUS_BLOCK_MAX; + } else { + length = count - j; + } + data.block[0] = length; + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_READ, + offset, I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (ret) { + I2C_DEV_DEBUG_ERROR("smbus_xfer read block error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + memcpy(buf + j, data.block + 1, length); + offset += length; + } + } else { + for (j = 0; j < count; j++) { + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_READ, + offset, I2C_SMBUS_BYTE_DATA, &data); + + if (!ret) { + buf[j] = data.byte; + } else { + I2C_DEV_DEBUG_ERROR("smbus_xfer read byte error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + offset++; + } + } + } else { + I2C_DEV_DEBUG_ERROR("smbus_xfer not support addr_bus_width = %d\r\n", i2c_dev->addr_bus_width); + ret = -EINVAL; + goto error_exit; + } + } + + i2c_put_adapter(adap); + return 0; +error_exit: + i2c_put_adapter(adap); + return ret; +} + +static int transfer_write(struct platform_i2c_dev_info *i2c_dev, u8 *buf, loff_t regaddr, size_t count) +{ + int i, j; + struct i2c_adapter *adap; + union i2c_smbus_data data; + u8 offset_buf[TRANSFER_WRITE_BUFF]; + struct i2c_msg msgs[1]; + int msgs_num, ret; + u8 offset; + u8 length; + + if (!i2c_dev) { + I2C_DEV_DEBUG_ERROR("can't get read i2c_dev\r\n"); + return -ENODEV; + } + + i = 0; + + mem_clear(offset_buf, sizeof(offset_buf)); + + switch (i2c_dev->addr_bus_width) { + case WIDTH_4Byte: + offset_buf[i++] = (regaddr >> 24) & 0xFF; + offset_buf[i++] = (regaddr >> 16) & 0xFF; + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + offset_buf[i++] = (regaddr >> 8) & 0xFF; + offset_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + offset_buf[i++] = regaddr & 0xFF; + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Address Width,but set width = %u\r\n", i2c_dev->addr_bus_width); + return -EINVAL; + } + + memcpy(offset_buf + i2c_dev->addr_bus_width, buf, count); + + adap = i2c_get_adapter(i2c_dev->i2c_bus); + if (adap == NULL) { + I2C_DEV_DEBUG_ERROR("get i2c adapter %d faild.\n", i2c_dev->i2c_bus); + return -ENXIO; + } + + if (adap->algo->master_xfer) { + mem_clear(msgs, sizeof(msgs)); + + msgs[0].addr = i2c_dev->i2c_addr; + msgs[0].flags = 0; + msgs[0].len = i2c_dev->addr_bus_width + count; + msgs[0].buf = offset_buf; + + msgs_num = 1; + ret = i2c_transfer(adap, msgs, msgs_num); + if (ret != msgs_num) { + I2C_DEV_DEBUG_ERROR("i2c_transfer write error\r\n"); + ret = -EFAULT; + goto error_exit; + } + } else { + if (i2c_dev->addr_bus_width == WIDTH_1Byte) { + offset = regaddr & 0xFF; + if (i2c_check_functionality(adap, I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) { + for (j = 0; j < count; j += I2C_SMBUS_BLOCK_MAX) { + if (count - j > I2C_SMBUS_BLOCK_MAX) { + length = I2C_SMBUS_BLOCK_MAX; + } else { + length = count - j; + } + data.block[0] = length; + memcpy(data.block + 1, buf + j, length); + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_WRITE, + offset, I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (ret) { + I2C_DEV_DEBUG_ERROR("smbus_xfer write block error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + offset += length; + } + } else { + for (j = 0; j < count; j++) { + data.byte = buf[j]; + ret = adap->algo->smbus_xfer(adap, i2c_dev->i2c_addr, + 0, + I2C_SMBUS_WRITE, + offset, I2C_SMBUS_BYTE_DATA, &data); + if (ret) { + I2C_DEV_DEBUG_ERROR("smbus_xfer write byte error, ret = %d\r\n", ret); + ret = -EFAULT; + goto error_exit; + } + offset += 1; + } + } + } else { + I2C_DEV_DEBUG_ERROR("smbus_xfer not support addr_bus_width = %d\r\n", i2c_dev->addr_bus_width); + ret = -EINVAL; + goto error_exit; + } + } + + i2c_put_adapter(adap); + return 0; +error_exit: + i2c_put_adapter(adap); + return ret; +} + +static long i2c_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static int i2c_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + struct platform_i2c_dev_info *i2c_dev; + + i2c_dev = i2c_dev_arry[minor]; + if (i2c_dev == NULL) { + return -ENODEV; + } + + file->private_data = i2c_dev; + + return 0; +} + +static int i2c_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static int device_read(struct platform_i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, int count) +{ + int i, j, ret; + u8 tmp_offset; + u8 val[FPGA_MAX_LEN]; + u32 width, rd_len, per_len, tmp; + u32 max_per_len; + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %d invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %d invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\r\n", width); + return -EINVAL; + } + + max_per_len = i2c_dev->per_rd_len; + tmp = (width - 1) & count; + rd_len = (tmp == 0) ? count : count + width - tmp; + per_len = (rd_len > max_per_len) ? (max_per_len) : (rd_len); + + mem_clear(val, sizeof(val)); + for (i = 0; i < rd_len; i += per_len) { + ret = transfer_read(i2c_dev, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("read error.read offset = %u\r\n", (offset + i)); + return -EFAULT; + } + } + + if (width == WIDTH_1Byte) { + memcpy(buf, val, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + buf[i + j] = val[i + width - j - 1]; + } + } + } + + return 0; +} + +static int device_write(struct platform_i2c_dev_info *i2c_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 tmp_offset; + u32 width; + u8 val[FPGA_MAX_LEN]; + u32 wr_len, per_len, tmp; + u32 max_per_len; + + width = i2c_dev->data_bus_width; + switch (width) { + case WIDTH_4Byte: + tmp_offset = offset & 0x3; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_2Byte: + tmp_offset = offset & 0x1; + if (tmp_offset) { + I2C_DEV_DEBUG_ERROR("data bus width:%u, offset:%u, read size %lu invalid.\r\n", width, offset, count); + return -EINVAL; + } + break; + case WIDTH_1Byte: + break; + default: + I2C_DEV_DEBUG_ERROR("Only support 1,2,4 Byte Data Width,but set width = %u\r\n", width); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + + if (width == WIDTH_1Byte) { + memcpy(val, buf, count); + } else { + for (i = 0; i < count; i += width) { + for (j = 0; (j < width) && (i + j < count); j++) { + val[i + width - j - 1] = buf[i + j]; + } + } + } + + max_per_len = i2c_dev->per_wr_len; + tmp = (width - 1) & count; + wr_len = (tmp == 0) ? count : count + width - tmp; + per_len = (wr_len > max_per_len) ? (max_per_len) : (wr_len); + + for (i = 0; i < wr_len; i += per_len) { + ret = transfer_write(i2c_dev, val + i, offset + i, per_len); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("write error.offset = %u\r\n", (offset + i)); + return -EFAULT; + } + } + return 0; +} + +static ssize_t i2c_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int ret; + struct platform_i2c_dev_info *i2c_dev; + + if (count <= 0 || count > sizeof(val)) { + I2C_DEV_DEBUG_ERROR("read conut %lu , beyond max:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("can't get read private_data .\r\n"); + return -EINVAL; + } + + ret = device_read(i2c_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, (uint32_t)*offset, count); + return -EINVAL; + } + + if (copy_to_user(buf, val, count)) { + I2C_DEV_DEBUG_ERROR("copy_to_user error \r\n"); + return -EFAULT; + } else{ + *offset += count; + } + + return count; +} + +static ssize_t i2c_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) +{ + u8 val[FPGA_MAX_LEN]; + int ret; + struct platform_i2c_dev_info *i2c_dev; + + if (count <= 0 || count > sizeof(val)) { + I2C_DEV_DEBUG_ERROR("write conut %lu, beyond max val:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + i2c_dev = file->private_data; + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("get write private_data error.\r\n"); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + if (copy_from_user(val, buf, count)) { + I2C_DEV_DEBUG_ERROR("copy_from_user error.\r\n"); + return -EFAULT; + } + + ret = device_write (i2c_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%llx, len:%lu.\n", + i2c_dev->name, *offset, count); + return -EINVAL; + } + + *offset += count; + return count; +} + +static loff_t i2c_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + I2C_DEV_DEBUG_ERROR("SEEK_SET, offset:%lld, invalid.\r\n", offset); + ret = -EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (file->f_pos + offset < 0) { + I2C_DEV_DEBUG_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld.\n", + file->f_pos, offset); + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + I2C_DEV_DEBUG_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static const struct file_operations i2c_dev_fops = { + .owner = THIS_MODULE, + .llseek = i2c_dev_llseek, + .read = i2c_dev_read, + .write = i2c_dev_write, + .unlocked_ioctl = i2c_dev_ioctl, + .open = i2c_dev_open, + .release = i2c_dev_release, +}; + +static struct platform_i2c_dev_info * dev_match(const char *path) +{ + struct platform_i2c_dev_info *i2c_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + for (i = 0; i < MAX_I2C_DEV_NUM; i++) { + if (i2c_dev_arry[ i ] == NULL) { + continue; + } + i2c_dev = i2c_dev_arry[ i ]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", i2c_dev->name); + if (!strcmp(path, dev_name)) { + I2C_DEV_DEBUG_DMESG("get dev_name = %s, minor = %d\n", dev_name, i); + return i2c_dev; + } + } + + return NULL; +} + +int platform_i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct platform_i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("read conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_read(i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("fpga i2c dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(platform_i2c_device_func_read); + +int platform_i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct platform_i2c_dev_info *i2c_dev = NULL; + int ret; + + if(path == NULL){ + I2C_DEV_DEBUG_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + I2C_DEV_DEBUG_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > FPGA_MAX_LEN) { + I2C_DEV_DEBUG_ERROR("write conut %lu, beyond max:%d.\n", count, FPGA_MAX_LEN); + return -EINVAL; + } + + i2c_dev = dev_match(path); + if (i2c_dev == NULL) { + I2C_DEV_DEBUG_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_write (i2c_dev, offset, buf, count); + if (ret < 0) { + I2C_DEV_DEBUG_ERROR("i2c dev write failed, dev name:%s, offset:0x%x, len:%lu.\n", + i2c_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(platform_i2c_device_func_write); + +static int platform_i2c_dev_probe(struct platform_device *pdev) +{ + int ret = 0; + struct platform_i2c_dev_info *i2c_dev; + struct miscdevice *misc; + platform_i2c_dev_device_t *platform_i2c_dev_device; + + i2c_dev = devm_kzalloc(&pdev->dev, sizeof(struct platform_i2c_dev_info), GFP_KERNEL); + if (!i2c_dev) { + dev_err(&pdev->dev, "devm_kzalloc error. \r\n"); + return -ENOMEM; + } + + if (pdev->dev.of_node) { + + ret += of_property_read_u32(pdev->dev.of_node, "i2c_bus", &i2c_dev->i2c_bus); + ret += of_property_read_u32(pdev->dev.of_node, "i2c_addr", &i2c_dev->i2c_addr); + ret += of_property_read_string(pdev->dev.of_node, "i2c_name", &i2c_dev->name); + ret += of_property_read_u32(pdev->dev.of_node, "data_bus_width", &i2c_dev->data_bus_width); + ret += of_property_read_u32(pdev->dev.of_node, "addr_bus_width", &i2c_dev->addr_bus_width); + ret += of_property_read_u32(pdev->dev.of_node, "per_rd_len", &i2c_dev->per_rd_len); + ret += of_property_read_u32(pdev->dev.of_node, "per_wr_len", &i2c_dev->per_wr_len); + if (ret != 0) { + dev_err(&pdev->dev, "dts config error.ret:%d.\r\n", ret); + return -ENXIO; + } + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + platform_i2c_dev_device = pdev->dev.platform_data; + i2c_dev->i2c_bus = platform_i2c_dev_device->i2c_bus; + i2c_dev->i2c_addr = platform_i2c_dev_device->i2c_addr; + i2c_dev->name = platform_i2c_dev_device->i2c_name; + i2c_dev->data_bus_width = platform_i2c_dev_device->data_bus_width; + i2c_dev->addr_bus_width = platform_i2c_dev_device->addr_bus_width; + i2c_dev->per_rd_len = platform_i2c_dev_device->per_rd_len; + i2c_dev->per_wr_len = platform_i2c_dev_device->per_wr_len; + } + + if ((i2c_dev->per_rd_len & (i2c_dev->data_bus_width - 1)) || (i2c_dev->per_wr_len & (i2c_dev->data_bus_width - 1))) { + dev_err(&pdev->dev, "Invalid config per_rd_len %d per_wr_len %d data bus_width %d.\r\n", i2c_dev->per_rd_len, + i2c_dev->per_wr_len, i2c_dev->data_bus_width); + return -ENXIO; + } + + misc = &i2c_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = i2c_dev->name; + misc->fops = &i2c_dev_fops; + if (misc_register(misc) != 0) { + dev_err(&pdev->dev, "register %s faild.\r\n", misc->name); + return -ENXIO; + } + + if (misc->minor >= MAX_I2C_DEV_NUM) { + dev_err(&pdev->dev, "minor number beyond the limit! is %d.\r\n", misc->minor); + misc_deregister(misc); + return -ENXIO; + } + i2c_dev_arry[misc->minor] = i2c_dev; + + dev_info(&pdev->dev, "register %u addr_bus_width %u data_bus_width device %s with %u per_rd_len %u per_wr_len success.\r\n", + i2c_dev->addr_bus_width, i2c_dev->data_bus_width, i2c_dev->name, i2c_dev->per_rd_len, i2c_dev->per_wr_len); + + return 0; +} + +static int platform_i2c_dev_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < MAX_I2C_DEV_NUM ; i++) { + if (i2c_dev_arry[i] != NULL) { + misc_deregister(&i2c_dev_arry[i]->misc); + i2c_dev_arry[i] = NULL; + } + } + + return 0; +} + +static const struct of_device_id platform_i2c_dev_of_match[] = { + { .compatible = "wb-platform-i2c-dev" }, + { }, +}; +MODULE_DEVICE_TABLE(of, platform_i2c_dev_of_match); + +static struct platform_driver wb_platform_i2c_dev_driver = { + .probe = platform_i2c_dev_probe, + .remove = platform_i2c_dev_remove, + .driver = { + .owner = THIS_MODULE, + .name = PROXY_NAME, + .of_match_table = platform_i2c_dev_of_match, + }, +}; + +static int __init wb_platform_i2c_dev_init(void) +{ + return platform_driver_register(&wb_platform_i2c_dev_driver); +} + +static void __exit wb_platform_i2c_dev_exit(void) +{ + platform_driver_unregister(&wb_platform_i2c_dev_driver); +} + +module_init(wb_platform_i2c_dev_init); +module_exit(wb_platform_i2c_dev_exit); + +MODULE_DESCRIPTION("platform i2c dev driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h new file mode 100644 index 0000000000..b5158c9fec --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_platform_i2c_dev.h @@ -0,0 +1,19 @@ +#ifndef __WB_PLATFORM_I2C_DEV_H__ +#define __WB_PLATFORM_I2C_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define I2C_DEV_NAME_MAX_LEN (64) + +typedef struct platform_i2c_dev_device_s { + uint32_t i2c_bus; + uint32_t i2c_addr; + char i2c_name[I2C_DEV_NAME_MAX_LEN]; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + int device_flag; +} platform_i2c_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c new file mode 100644 index 0000000000..abc4f1567a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_93xx46.c @@ -0,0 +1,111 @@ +/* + * EEPROMs access control driver for display configuration EEPROMs + * on DigsyMTC board. + * + * (C) 2011 DENX Software Engineering, Anatolij Gustschin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DEFAULT_SPI_BUS_NUM (0) +#define DEFAULT_SPI_CS_NUM (0) +#define DEFAULT_SPI_HZ (100000) + +#define GPIO_EEPROM_CS (-1) + +int g_wb_spi_93xx46_debug = 0; +int g_wb_spi_93xx46_error = 0; +int spi_bus_num = DEFAULT_SPI_BUS_NUM; +int spi_cs_gpio = GPIO_EEPROM_CS; + +module_param(g_wb_spi_93xx46_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_spi_93xx46_error, int, S_IRUGO | S_IWUSR); +module_param(spi_bus_num, int, S_IRUGO | S_IWUSR); +module_param(spi_cs_gpio, int, S_IRUGO | S_IWUSR); + +#define SPI_93xx46_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_spi_93xx46_debug) { \ + printk(KERN_INFO "[SPI-93xx46][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_93xx46_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_spi_93xx46_error) { \ + printk(KERN_ERR "[SPI-93xx46][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct eeprom_93xx46_platform_data eeprom_data = { + .flags = EE_ADDR16, + .quirks = EEPROM_93XX46_QUIRK_SINGLE_WORD_READ, +}; + +struct spi_board_info eeprom_93xx46_info __initdata = { + .modalias = "wb_93xx46", + .max_speed_hz = DEFAULT_SPI_HZ, + .bus_num = DEFAULT_SPI_BUS_NUM, + .chip_select = DEFAULT_SPI_CS_NUM, + .mode = SPI_MODE_0 | SPI_CS_HIGH, + .controller_data = (void *)GPIO_EEPROM_CS, + .platform_data = &eeprom_data, +}; + +static struct spi_device *g_spi_device; + +static int __init wb_spi_93xx46_init(void) +{ + struct spi_master *master; + + SPI_93xx46_DEBUG_VERBOSE("Enter.\n"); + + eeprom_93xx46_info.bus_num = spi_bus_num; + eeprom_93xx46_info.controller_data = (void *)(long)spi_cs_gpio; + master = spi_busnum_to_master(eeprom_93xx46_info.bus_num); + if (!master) { + SPI_93xx46_DEBUG_ERROR("get bus_num %u spi master failed.\n", + eeprom_93xx46_info.bus_num); + return -EINVAL; + } + + g_spi_device = spi_new_device(master, &eeprom_93xx46_info); + put_device(&master->dev); + if (!g_spi_device) { + SPI_93xx46_DEBUG_ERROR("register spi new device failed.\n"); + return -EPERM; + } + + if (g_wb_spi_93xx46_debug) { + dev_info(&g_spi_device->dev, "register %u bus_num spi 93xx46 eeprom success\n", + eeprom_93xx46_info.bus_num); + } + + return 0; +} + +static void __exit wb_spi_93xx46_exit(void) +{ + spi_unregister_device(g_spi_device); + + if (g_wb_spi_93xx46_debug) { + dev_info(&g_spi_device->dev, "unregister spi 93xx46 eeprom success\n"); + } + + return; +} + +module_init(wb_spi_93xx46_init); +module_exit(wb_spi_93xx46_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("create 93xx46 eeprom device"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c new file mode 100644 index 0000000000..807663592d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.c @@ -0,0 +1,583 @@ +/* + * wb_spi_dev.c + * ko to read/write spi device through /dev/XXX device + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_spi_dev.h" + +#define MAX_SPI_DEV_NUM (256) +#define MAX_RW_LEN (256) +#define MAX_NAME_SIZE (20) +#define MAX_ADDR_BUS_WIDTH (4) + +#define TRANSFER_WRITE_BUFF (1 + MAX_ADDR_BUS_WIDTH + MAX_RW_LEN) + +#define WIDTH_1Byte (1) +#define WIDTH_2Byte (2) +#define WIDTH_4Byte (4) + +#define OP_READ (0x3) +#define OP_WRITE (0x2) + +int g_spi_dev_debug = 0; +int g_spi_dev_error = 0; + +module_param(g_spi_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_spi_dev_error, int, S_IRUGO | S_IWUSR); + +#define SPI_DEV_DEBUG(fmt, args...) do { \ + if (g_spi_dev_debug) { \ + printk(KERN_ERR "[SPI_DEV][DEBUG][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_DEV_ERROR(fmt, args...) do { \ + if (g_spi_dev_error) { \ + printk(KERN_ERR "[SPI_DEV][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct spi_dev_info* spi_dev_arry[MAX_SPI_DEV_NUM]; + +struct spi_dev_info { + const char *name; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; + struct miscdevice misc; + struct spi_device *spi_device; +}; + +static int transfer_read(struct spi_dev_info *spi_dev, u8 *buf, uint32_t regaddr, size_t count) +{ + int i, ret; + u8 tx_buf[MAX_ADDR_BUS_WIDTH + 1]; + struct spi_message m; + struct spi_transfer xfer[2]; + + i = 0; + mem_clear(tx_buf, sizeof(tx_buf)); + tx_buf[i++] = OP_READ; + + switch (spi_dev->addr_bus_width) { + case WIDTH_4Byte: + tx_buf[i++] = (regaddr >> 24) & 0xFF; + tx_buf[i++] = (regaddr >> 16) & 0xFF; + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + tx_buf[i++] = regaddr & 0xFF; + break; + default: + SPI_DEV_ERROR("Only support 1,2,4 Byte Width,but set width = %u\n", + spi_dev->addr_bus_width); + return -EINVAL; + } + + mem_clear(xfer, sizeof(xfer)); + spi_message_init(&m); + xfer[0].tx_buf = tx_buf; + xfer[0].len = spi_dev->addr_bus_width + 1; + spi_message_add_tail(&xfer[0], &m); + + xfer[1].rx_buf = buf; + xfer[1].len = count; + spi_message_add_tail(&xfer[1], &m); + + ret = spi_sync(spi_dev->spi_device, &m); + if (ret) { + SPI_DEV_ERROR("transfer_read failed, reg addr:0x%x, len:%lu, ret:%d.\n", + regaddr, count, ret); + return -EIO; + } + return 0; +} + +static int transfer_write(struct spi_dev_info *spi_dev, u8 *buf, uint32_t regaddr, size_t count) +{ + int i, ret; + u8 tx_buf[TRANSFER_WRITE_BUFF]; + struct spi_message m; + struct spi_transfer xfer ; + + i = 0; + mem_clear(tx_buf, sizeof(tx_buf)); + tx_buf[i++] = OP_WRITE; + switch (spi_dev->addr_bus_width) { + case WIDTH_4Byte: + tx_buf[i++] = (regaddr >> 24) & 0xFF; + tx_buf[i++] = (regaddr >> 16) & 0xFF; + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_2Byte: + tx_buf[i++] = (regaddr >> 8) & 0xFF; + tx_buf[i++] = regaddr & 0xFF; + break; + case WIDTH_1Byte: + tx_buf[i++] = regaddr & 0xFF; + break; + default: + SPI_DEV_ERROR("Only support 1,2,4 Byte Width, but set width = %u\n", + spi_dev->addr_bus_width); + return -EINVAL; + } + + memcpy(tx_buf + i, buf, count); + + mem_clear(&xfer, sizeof(xfer)); + spi_message_init(&m); + xfer.tx_buf = tx_buf; + xfer.len = count + i; + spi_message_add_tail(&xfer, &m); + + ret = spi_sync(spi_dev->spi_device, &m); + if (ret) { + SPI_DEV_ERROR("transfer_write failed, reg addr:0x%x, len:%lu, ret:%d.\n", + regaddr, count, ret); + return -EIO; + } + return 0; +} + +static long spi_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static int spi_dev_open(struct inode *inode, struct file *file) +{ + unsigned int minor = iminor(inode); + struct spi_dev_info *spi_dev; + + if (minor >= MAX_SPI_DEV_NUM) { + SPI_DEV_ERROR("minor out of range, minor = %d.\n", minor); + return -ENODEV; + } + + spi_dev = spi_dev_arry[minor]; + if (spi_dev == NULL) { + SPI_DEV_ERROR("spi_dev is NULL, open failed, minor = %d\n", minor); + return -ENODEV; + } + + file->private_data = spi_dev; + + return 0; +} + +static int spi_dev_release(struct inode *inode, struct file *file) +{ + file->private_data = NULL; + + return 0; +} + +static int device_read(struct spi_dev_info *spi_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u8 val[MAX_RW_LEN]; + u32 data_width, rd_len, per_len, tmp; + u32 max_per_len; + + data_width = spi_dev->data_bus_width; + + if (offset % data_width) { + SPI_DEV_ERROR("data bus width:%d, offset:0x%x, read size %lu invalid.\n", + data_width, offset, count); + return -EINVAL; + } + + max_per_len = spi_dev->per_rd_len; + tmp = (data_width - 1) & count; + rd_len = (tmp == 0) ? count : count + data_width - tmp; + per_len = (rd_len > max_per_len) ? (max_per_len) : (rd_len); + + mem_clear(val, sizeof(val)); + for (i = 0; i < rd_len; i += per_len) { + ret = transfer_read(spi_dev, val + i, offset + i, per_len); + if (ret < 0) { + SPI_DEV_ERROR("read error.read offset = %u\n", (offset + i)); + return -EFAULT; + } + } + + if (data_width == WIDTH_1Byte) { + memcpy(buf, val, count); + } else { + for (i = 0; i < count; i += data_width) { + for (j = 0; (j < data_width) && (i + j < count); j++) { + buf[i + j] = val[i + data_width - j - 1]; + } + } + } + + return 0; +} + +static int device_write(struct spi_dev_info *spi_dev, uint32_t offset, uint8_t *buf, size_t count) +{ + int i, j, ret; + u32 data_width; + u8 val[MAX_RW_LEN]; + u32 wr_len, per_len, tmp; + u32 max_per_len; + + data_width = spi_dev->data_bus_width; + + if (offset % data_width) { + SPI_DEV_ERROR("data bus width:%d, offset:0x%x, read size %lu invalid.\n", + data_width, offset, count); + return -EINVAL; + } + mem_clear(val, sizeof(val)); + + if (data_width == WIDTH_1Byte) { + memcpy(val, buf, count); + } else { + for (i = 0; i < count; i += data_width) { + for (j = 0; (j < data_width) && (i + j < count); j++) { + val[i + data_width - j - 1] = buf[i + j]; + } + } + } + + max_per_len = spi_dev->per_wr_len; + tmp = (data_width - 1) & count; + wr_len = (tmp == 0) ? count : count + data_width - tmp; + per_len = (wr_len > max_per_len) ? (max_per_len) : (wr_len); + + for (i = 0; i < wr_len; i += per_len) { + ret = transfer_write(spi_dev, val + i, offset + i, per_len); + if (ret < 0) { + SPI_DEV_ERROR("write error.offset = %u\n", (offset + i)); + return -EFAULT; + } + } + return 0; +} + +static ssize_t spi_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) +{ + u8 val[MAX_RW_LEN]; + int ret; + struct spi_dev_info *spi_dev; + + if (count <= 0 || count > sizeof(val)) { + SPI_DEV_ERROR("read conut %lu , beyond max:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + spi_dev = file->private_data; + if (spi_dev == NULL) { + SPI_DEV_ERROR("can't get read private_data .\n"); + return -EINVAL; + } + + ret = device_read(spi_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + SPI_DEV_ERROR("spi dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + spi_dev->name, (uint32_t)*offset, count); + return -EINVAL; + } + + if (copy_to_user(buf, val, count)) { + SPI_DEV_ERROR("copy_to_user error \n"); + return -EFAULT; + } else{ + *offset += count; + } + + return count; +} + +static ssize_t spi_dev_write(struct file *file, const char __user *buf, + size_t count, loff_t *offset) +{ + u8 val[MAX_RW_LEN]; + int ret; + struct spi_dev_info *spi_dev; + + if (count <= 0 || count > sizeof(val)) { + SPI_DEV_ERROR("write conut %lu, beyond max val:%lu.\n", count, sizeof(val)); + return -EINVAL; + } + + spi_dev = file->private_data; + if (spi_dev == NULL) { + SPI_DEV_ERROR("get write private_data error.\n"); + return -EINVAL; + } + + mem_clear(val, sizeof(val)); + if (copy_from_user(val, buf, count)) { + SPI_DEV_ERROR("copy_from_user error.\n"); + return -EFAULT; + } + + ret = device_write(spi_dev, (uint32_t)*offset, val, count); + if (ret < 0) { + SPI_DEV_ERROR("spi dev write failed, dev name:%s, offset:0x%llx, len:%lu.\n", + spi_dev->name, *offset, count); + return -EINVAL; + } + + *offset += count; + return count; +} + +static loff_t spi_dev_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret = 0; + + switch (origin) { + case SEEK_SET: + if (offset < 0) { + SPI_DEV_ERROR("SEEK_SET, offset:%lld, invalid.\n", offset); + ret = -EINVAL; + break; + } + file->f_pos = offset; + ret = file->f_pos; + break; + case SEEK_CUR: + if (file->f_pos + offset < 0) { + SPI_DEV_ERROR("SEEK_CUR out of range, f_ops:%lld, offset:%lld.\n", + file->f_pos, offset); + } + file->f_pos += offset; + ret = file->f_pos; + break; + default: + SPI_DEV_ERROR("unsupport llseek type:%d.\n", origin); + ret = -EINVAL; + break; + } + return ret; +} + +static const struct file_operations spi_dev_fops = { + .owner = THIS_MODULE, + .llseek = spi_dev_llseek, + .read = spi_dev_read, + .write = spi_dev_write, + .unlocked_ioctl = spi_dev_ioctl, + .open = spi_dev_open, + .release = spi_dev_release, +}; + +static struct spi_dev_info * dev_match(const char *path) +{ + struct spi_dev_info * spi_dev; + char dev_name[MAX_NAME_SIZE]; + int i; + for (i = 0; i < MAX_SPI_DEV_NUM; i++) { + if (spi_dev_arry[ i ] == NULL) { + continue; + } + spi_dev = spi_dev_arry[ i ]; + snprintf(dev_name, MAX_NAME_SIZE,"/dev/%s", spi_dev->name); + if (!strcmp(path, dev_name)) { + SPI_DEV_DEBUG("get dev_name = %s, minor = %d\n", dev_name, i); + return spi_dev; + } + } + + return NULL; +} + +int spi_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct spi_dev_info *spi_dev = NULL; + int ret; + + if(path == NULL){ + SPI_DEV_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + SPI_DEV_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > MAX_RW_LEN) { + SPI_DEV_ERROR("read conut %lu, beyond max:%d.\n", count, MAX_RW_LEN); + return -EINVAL; + } + + spi_dev = dev_match(path); + if (spi_dev == NULL) { + SPI_DEV_ERROR("spi_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_read(spi_dev, offset, buf, count); + if (ret < 0) { + SPI_DEV_ERROR("spi dev read failed, dev name:%s, offset:0x%x, len:%lu.\n", + spi_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(spi_device_func_read); + +int spi_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count) +{ + struct spi_dev_info *spi_dev = NULL; + int ret; + + if(path == NULL){ + SPI_DEV_ERROR("path NULL"); + return -EINVAL; + } + + if(buf == NULL){ + SPI_DEV_ERROR("buf NULL"); + return -EINVAL; + } + + if (count > MAX_RW_LEN) { + SPI_DEV_ERROR("write conut %lu, beyond max:%d.\n", count, MAX_RW_LEN); + return -EINVAL; + } + + spi_dev = dev_match(path); + if (spi_dev == NULL) { + SPI_DEV_ERROR("i2c_dev match failed. dev path = %s", path); + return -EINVAL; + } + + ret = device_write (spi_dev, offset, buf, count); + if (ret < 0) { + SPI_DEV_ERROR("i2c dev write failed, dev name:%s, offset:0x%x, len:%lu.\n", + spi_dev->name, offset, count); + return -EINVAL; + } + + return count; +} +EXPORT_SYMBOL(spi_device_func_write); + +static int spi_dev_probe(struct spi_device *spi) +{ + int ret; + struct spi_dev_info *spi_dev; + struct miscdevice *misc; + spi_dev_device_t *spi_dev_device; + + spi_dev = devm_kzalloc(&spi->dev, sizeof(struct spi_dev_info), GFP_KERNEL); + if (!spi_dev) { + dev_err(&spi->dev, "devm_kzalloc error. \n"); + return -ENOMEM; + } + + spi_set_drvdata(spi, spi_dev); + spi_dev->spi_device = spi; + + if (spi->dev.of_node) { + + ret = 0; + ret += of_property_read_string(spi->dev.of_node, "spi_dev_name", &spi_dev->name); + ret += of_property_read_u32(spi->dev.of_node, "data_bus_width", &spi_dev->data_bus_width); + ret += of_property_read_u32(spi->dev.of_node, "addr_bus_width", &spi_dev->addr_bus_width); + ret += of_property_read_u32(spi->dev.of_node, "per_rd_len", &spi_dev->per_rd_len); + ret += of_property_read_u32(spi->dev.of_node, "per_wr_len", &spi_dev->per_wr_len); + if (ret != 0) { + dev_err(&spi->dev, "dts config error.ret:%d.\n", ret); + return -ENXIO; + } + } else { + if (spi->dev.platform_data == NULL) { + dev_err(&spi->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + spi_dev_device = spi->dev.platform_data; + spi_dev->name = spi_dev_device->spi_dev_name; + spi_dev->data_bus_width = spi_dev_device->data_bus_width; + spi_dev->addr_bus_width = spi_dev_device->addr_bus_width; + spi_dev->per_rd_len = spi_dev_device->per_rd_len; + spi_dev->per_wr_len = spi_dev_device->per_wr_len; + } + + if ((spi_dev->per_rd_len & (spi_dev->data_bus_width - 1)) + || (spi_dev->per_wr_len & (spi_dev->data_bus_width - 1))) { + dev_err(&spi->dev, "Invalid config per_rd_len [%u] per_wr_len [%u] data bus_width [%u], addr bus width [%u].\n", + spi_dev->per_rd_len, spi_dev->per_wr_len, spi_dev->data_bus_width, spi_dev->addr_bus_width); + return -ENXIO; + } + + misc = &spi_dev->misc; + misc->minor = MISC_DYNAMIC_MINOR; + misc->name = spi_dev->name; + misc->fops = &spi_dev_fops; + misc->mode = 0666; + if (misc_register(misc) != 0) { + dev_err(&spi->dev, "register %s faild.\n", misc->name); + return -ENXIO; + } + + if (misc->minor >= MAX_SPI_DEV_NUM) { + dev_err(&spi->dev, "minor number beyond the limit! is %d.\n", misc->minor); + misc_deregister(misc); + return -ENXIO; + } + spi_dev_arry[misc->minor] = spi_dev; + + dev_info(&spi->dev, "register %u data_bus_width %u addr_bus_witdh device %s with %u per_rd_len %u per_wr_len success.\n", + spi_dev->data_bus_width, spi_dev->addr_bus_width, spi_dev->name, spi_dev->per_rd_len, spi_dev->per_wr_len); + + return 0; +} + +static int spi_dev_remove(struct spi_device *spi) +{ + int i; + + for (i = 0; i < MAX_SPI_DEV_NUM; i++) { + if (spi_dev_arry[i] != NULL) { + misc_deregister(&spi_dev_arry[i]->misc); + spi_dev_arry[i] = NULL; + } + } + return 0; +} + +static const struct of_device_id spi_dev_of_match[] = { + { .compatible = "wb-spi-dev" }, + { }, +}; + +MODULE_DEVICE_TABLE(of, spi_dev_of_match); + +static struct spi_driver spi_dev_driver = { + .driver = { + .name = "wb-spi-dev", + .of_match_table = of_match_ptr(spi_dev_of_match), + }, + .probe = spi_dev_probe, + .remove = spi_dev_remove, +}; + +module_spi_driver(spi_dev_driver); + +MODULE_DESCRIPTION("spi dev driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h new file mode 100644 index 0000000000..6afc014563 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_dev.h @@ -0,0 +1,16 @@ +#ifndef __WB_SPI_DEV_H__ +#define __WB_SPI_DEV_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define SPI_DEV_NAME_MAX_LEN (64) + +typedef struct spi_dev_device_s { + char spi_dev_name[SPI_DEV_NAME_MAX_LEN]; + uint32_t data_bus_width; + uint32_t addr_bus_width; + uint32_t per_rd_len; + uint32_t per_wr_len; +} spi_dev_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c new file mode 100644 index 0000000000..16408f067b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio.c @@ -0,0 +1,477 @@ +/* + * SPI master driver using generic bitbanged GPIO + * + * Copyright (C) 2006,2008 David Brownell + * Copyright (C) 2017 Linus Walleij + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* + * This bitbanging SPI master driver should help make systems usable + * when a native hardware SPI engine is not available, perhaps because + * its driver isn't yet working or because the I/O pins it requires + * are used for other purposes. + * + * platform_device->driver_data ... points to spi_gpio + * + * spi->controller_state ... reserved for bitbang framework code + * spi->controller_data ... holds chipselect GPIO + * + * spi->master->dev.driver_data ... points to spi_gpio->bitbang + */ + +struct spi_gpio { + struct spi_bitbang bitbang; + struct spi_gpio_platform_data pdata; + struct platform_device *pdev; + struct gpio_desc *sck; + struct gpio_desc *miso; + struct gpio_desc *mosi; + struct gpio_desc **cs_gpios; + bool has_cs; +}; + +/*----------------------------------------------------------------------*/ + +/* + * Because the overhead of going through four GPIO procedure calls + * per transferred bit can make performance a problem, this code + * is set up so that you can use it in either of two ways: + * + * - The slow generic way: set up platform_data to hold the GPIO + * numbers used for MISO/MOSI/SCK, and issue procedure calls for + * each of them. This driver can handle several such busses. + * + * - The quicker inlined way: only helps with platform GPIO code + * that inlines operations for constant GPIOs. This can give + * you tight (fast!) inner loops, but each such bus needs a + * new driver. You'll define a new C file, with Makefile and + * Kconfig support; the C code can be a total of six lines: + * + * #define DRIVER_NAME "myboard_spi2" + * #define SPI_MISO_GPIO 119 + * #define SPI_MOSI_GPIO 120 + * #define SPI_SCK_GPIO 121 + * #define SPI_N_CHIPSEL 4 + * #include "spi-gpio.c" + */ + +#ifndef DRIVER_NAME +#define DRIVER_NAME "wb_spi_gpio" + +#define GENERIC_BITBANG /* vs tight inlines */ + +#endif + +/*----------------------------------------------------------------------*/ + +static inline struct spi_gpio *__pure +spi_to_spi_gpio(const struct spi_device *spi) +{ + const struct spi_bitbang *bang; + struct spi_gpio *spi_gpio; + + bang = spi_master_get_devdata(spi->master); + spi_gpio = container_of(bang, struct spi_gpio, bitbang); + return spi_gpio; +} + +static inline struct spi_gpio_platform_data *__pure +spi_to_pdata(const struct spi_device *spi) +{ + return &spi_to_spi_gpio(spi)->pdata; +} + +/* These helpers are in turn called by the bitbang inlines */ +static inline void setsck(const struct spi_device *spi, int is_on) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + gpiod_set_value_cansleep(spi_gpio->sck, is_on); +} + +static inline void setmosi(const struct spi_device *spi, int is_on) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + gpiod_set_value_cansleep(spi_gpio->mosi, is_on); +} + +static inline int getmiso(const struct spi_device *spi) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + if (spi->mode & SPI_3WIRE) + return !!gpiod_get_value_cansleep(spi_gpio->mosi); + else + return !!gpiod_get_value_cansleep(spi_gpio->miso); +} + +/* + * NOTE: this clocks "as fast as we can". It "should" be a function of the + * requested device clock. Software overhead means we usually have trouble + * reaching even one Mbit/sec (except when we can inline bitops), so for now + * we'll just assume we never need additional per-bit slowdowns. + */ +#define spidelay(nsecs) do {} while (0) + +#include "spi-bitbang-txrx.h" + +/* + * These functions can leverage inline expansion of GPIO calls to shrink + * costs for a txrx bit, often by factors of around ten (by instruction + * count). That is particularly visible for larger word sizes, but helps + * even with default 8-bit words. + * + * REVISIT overheads calling these functions for each word also have + * significant performance costs. Having txrx_bufs() calls that inline + * the txrx_word() logic would help performance, e.g. on larger blocks + * used with flash storage or MMC/SD. There should also be ways to make + * GCC be less stupid about reloading registers inside the I/O loops, + * even without inlined GPIO calls; __attribute__((hot)) on GCC 4.3? + */ + +static u32 spi_gpio_txrx_word_mode0(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_txrx_word_mode1(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_txrx_word_mode2(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); +} + +static u32 spi_gpio_txrx_word_mode3(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); +} + +/* + * These functions do not call setmosi or getmiso if respective flag + * (SPI_MASTER_NO_RX or SPI_MASTER_NO_TX) is set, so they are safe to + * call when such pin is not present or defined in the controller. + * A separate set of callbacks is defined to get highest possible + * speed in the generic case (when both MISO and MOSI lines are + * available), as optimiser will remove the checks when argument is + * constant. + */ + +static u32 spi_gpio_spec_txrx_word_mode0(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha0(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_spec_txrx_word_mode1(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha1(spi, nsecs, 0, flags, word, bits); +} + +static u32 spi_gpio_spec_txrx_word_mode2(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha0(spi, nsecs, 1, flags, word, bits); +} + +static u32 spi_gpio_spec_txrx_word_mode3(struct spi_device *spi, + unsigned nsecs, u32 word, u8 bits, unsigned flags) +{ + flags = spi->master->flags; + return bitbang_txrx_be_cpha1(spi, nsecs, 1, flags, word, bits); +} + +/*----------------------------------------------------------------------*/ + +static void spi_gpio_chipselect(struct spi_device *spi, int is_active) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + /* set initial clock line level */ + if (is_active) + gpiod_set_value_cansleep(spi_gpio->sck, spi->mode & SPI_CPOL); + + /* Drive chip select line, if we have one */ + if (spi_gpio->has_cs) { + struct gpio_desc *cs = spi_gpio->cs_gpios[spi->chip_select]; + + /* SPI chip selects are normally active-low */ + gpiod_set_value_cansleep(cs, (spi->mode & SPI_CS_HIGH) ? is_active : !is_active); + } +} + +static int spi_gpio_setup(struct spi_device *spi) +{ + struct gpio_desc *cs; + int status = 0; + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + /* + * The CS GPIOs have already been + * initialized from the descriptor lookup. + */ + cs = spi_gpio->cs_gpios[spi->chip_select]; + if (!spi->controller_state && cs) + status = gpiod_direction_output(cs, + !(spi->mode & SPI_CS_HIGH)); + + if (!status) + status = spi_bitbang_setup(spi); + + return status; +} + +static int spi_gpio_set_direction(struct spi_device *spi, bool output) +{ + struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); + + if (output) + return gpiod_direction_output(spi_gpio->mosi, 1); + else + return gpiod_direction_input(spi_gpio->mosi); +} + +static void spi_gpio_cleanup(struct spi_device *spi) +{ + spi_bitbang_cleanup(spi); +} + +/* + * It can be convenient to use this driver with pins that have alternate + * functions associated with a "native" SPI controller if a driver for that + * controller is not available, or is missing important functionality. + * + * On platforms which can do so, configure MISO with a weak pullup unless + * there's an external pullup on that signal. That saves power by avoiding + * floating signals. (A weak pulldown would save power too, but many + * drivers expect to see all-ones data as the no slave "response".) + */ +static int spi_gpio_request(struct device *dev, + struct spi_gpio *spi_gpio, + unsigned int num_chipselects, + u16 *mflags) +{ + int i; + + spi_gpio->mosi = devm_gpiod_get_optional(dev, "mosi", GPIOD_OUT_LOW); + if (IS_ERR(spi_gpio->mosi)) + return PTR_ERR(spi_gpio->mosi); + if (!spi_gpio->mosi) + /* HW configuration without MOSI pin */ + *mflags |= SPI_MASTER_NO_TX; + + spi_gpio->miso = devm_gpiod_get_optional(dev, "miso", GPIOD_IN); + if (IS_ERR(spi_gpio->miso)) + return PTR_ERR(spi_gpio->miso); + /* + * No setting SPI_MASTER_NO_RX here - if there is only a MOSI + * pin connected the host can still do RX by changing the + * direction of the line. + */ + + spi_gpio->sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW); + if (IS_ERR(spi_gpio->sck)) + return PTR_ERR(spi_gpio->sck); + + for (i = 0; i < num_chipselects; i++) { + spi_gpio->cs_gpios[i] = devm_gpiod_get_index(dev, "cs", + i, GPIOD_OUT_HIGH); + if (IS_ERR(spi_gpio->cs_gpios[i])) + return PTR_ERR(spi_gpio->cs_gpios[i]); + } + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id spi_gpio_dt_ids[] = { + { .compatible = "wb-spi-gpio" }, + {} +}; +MODULE_DEVICE_TABLE(of, spi_gpio_dt_ids); + +static int spi_gpio_probe_dt(struct platform_device *pdev) +{ + int ret; + u32 tmp; + struct spi_gpio_platform_data *pdata; + struct device_node *np = pdev->dev.of_node; + const struct of_device_id *of_id = + of_match_device(spi_gpio_dt_ids, &pdev->dev); + + if (!of_id) + return 0; + + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + ret = of_property_read_u32(np, "num-chipselects", &tmp); + if (ret < 0) { + dev_err(&pdev->dev, "num-chipselects property not found\n"); + goto error_free; + } + + pdata->num_chipselect = tmp; + pdev->dev.platform_data = pdata; + + return 1; + +error_free: + devm_kfree(&pdev->dev, pdata); + return ret; +} +#else +static inline int spi_gpio_probe_dt(struct platform_device *pdev) +{ + return 0; +} +#endif + +static int spi_gpio_probe(struct platform_device *pdev) +{ + int status; + struct spi_master *master; + struct spi_gpio *spi_gpio; + struct spi_gpio_platform_data *pdata; + u16 master_flags = 0; + bool use_of = 0; + + status = spi_gpio_probe_dt(pdev); + if (status < 0) + return status; + if (status > 0) + use_of = 1; + + pdata = dev_get_platdata(&pdev->dev); +#ifdef GENERIC_BITBANG + if (!pdata || (!use_of && !pdata->num_chipselect)) + return -ENODEV; +#endif + + master = spi_alloc_master(&pdev->dev, sizeof(*spi_gpio)); + if (!master) + return -ENOMEM; + + spi_gpio = spi_master_get_devdata(master); + + spi_gpio->cs_gpios = devm_kcalloc(&pdev->dev, + pdata->num_chipselect, + sizeof(*spi_gpio->cs_gpios), + GFP_KERNEL); + if (!spi_gpio->cs_gpios) + return -ENOMEM; + + platform_set_drvdata(pdev, spi_gpio); + + /* Determine if we have chip selects connected */ + spi_gpio->has_cs = !!pdata->num_chipselect; + + spi_gpio->pdev = pdev; + if (pdata) + spi_gpio->pdata = *pdata; + + status = spi_gpio_request(&pdev->dev, spi_gpio, + pdata->num_chipselect, &master_flags); + if (status) + return status; + + master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); + master->mode_bits = SPI_3WIRE | SPI_CPHA | SPI_CPOL | SPI_CS_HIGH; + master->flags = master_flags; + master->bus_num = pdev->id; + /* The master needs to think there is a chipselect even if not connected */ + master->num_chipselect = spi_gpio->has_cs ? pdata->num_chipselect : 1; + master->setup = spi_gpio_setup; + master->cleanup = spi_gpio_cleanup; + + if (pdev->dev.of_node) { + master->dev.of_node = pdev->dev.of_node; + } + + spi_gpio->bitbang.master = master; + spi_gpio->bitbang.chipselect = spi_gpio_chipselect; + spi_gpio->bitbang.set_line_direction = spi_gpio_set_direction; + + if ((master_flags & SPI_MASTER_NO_TX) == 0) { + spi_gpio->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_word_mode0; + spi_gpio->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_word_mode1; + spi_gpio->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_word_mode2; + spi_gpio->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_word_mode3; + } else { + spi_gpio->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_spec_txrx_word_mode0; + spi_gpio->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_spec_txrx_word_mode1; + spi_gpio->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_spec_txrx_word_mode2; + spi_gpio->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_spec_txrx_word_mode3; + } + spi_gpio->bitbang.setup_transfer = spi_bitbang_setup_transfer; + + status = spi_bitbang_start(&spi_gpio->bitbang); + if (status) + spi_master_put(master); + + return status; +} + +static int spi_gpio_remove(struct platform_device *pdev) +{ + struct spi_gpio *spi_gpio; + struct spi_gpio_platform_data *pdata; + + spi_gpio = platform_get_drvdata(pdev); + pdata = dev_get_platdata(&pdev->dev); + + /* stop() unregisters child devices too */ + spi_bitbang_stop(&spi_gpio->bitbang); + + spi_master_put(spi_gpio->bitbang.master); + + return 0; +} + +MODULE_ALIAS("platform:" DRIVER_NAME); + +static struct platform_driver spi_gpio_driver = { + .driver = { + .name = DRIVER_NAME, + .of_match_table = of_match_ptr(spi_gpio_dt_ids), + }, + .probe = spi_gpio_probe, + .remove = spi_gpio_remove, +}; +module_platform_driver(spi_gpio_driver); + +MODULE_DESCRIPTION("SPI master driver using generic bitbanged GPIO "); +MODULE_AUTHOR("support"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c new file mode 100644 index 0000000000..e70c97b1af --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_gpio_device.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define mem_clear(data, size) memset((data), 0, (size)) + +#define DEFAULT_GPIO_SCK (67) +#define DEFAULT_GPIO_MISO (32) +#define DEFAULT_GPIO_MOSI (65) +#define DEFAULT_GPIO_CS (6) +#define DEFAULT_SPI_BUS (0) + +static int sck = DEFAULT_GPIO_SCK; +module_param(sck, int, S_IRUGO | S_IWUSR); + +static int miso = DEFAULT_GPIO_MISO; +module_param(miso, int, S_IRUGO | S_IWUSR); + +static int mosi = DEFAULT_GPIO_MOSI; +module_param(mosi, int, S_IRUGO | S_IWUSR); + +static int cs = DEFAULT_GPIO_CS; +module_param(cs, int, S_IRUGO | S_IWUSR); + +static int bus = DEFAULT_SPI_BUS; +module_param(bus, int, S_IRUGO | S_IWUSR); + +static int g_wb_spi_gpio_device_debug = 0; +static int g_wb_spi_gpio_device_error = 0; + +module_param(g_wb_spi_gpio_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_spi_gpio_device_error, int, S_IRUGO | S_IWUSR); + +static char gpiod_lookup_table_devid[64]; + +#define WB_SPI_GPIO_DEVICE_VERBOSE(fmt, args...) do { \ + if (g_wb_spi_gpio_device_debug) { \ + printk(KERN_INFO "[WB_SPI_GPIO_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_SPI_GPIO_DEVICE_ERROR(fmt, args...) do { \ + if (g_wb_spi_gpio_device_error) { \ + printk(KERN_ERR "[WB_SPI_GPIO_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static struct gpiod_lookup_table wb_spi_gpio_table = { + .table = { + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_SCK, + "sck", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_MOSI, + "mosi", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_MISO, + "miso", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("wb_gpio_d1500", DEFAULT_GPIO_CS, + "cs", GPIO_ACTIVE_HIGH), + { }, + }, +}; + +static struct spi_gpio_platform_data spi_pdata = { + .num_chipselect = 1, +}; + +static void spi_gpio_release(struct device *dev) +{ + return; +} + +static struct platform_device wb_spi_gpio_device = { + .name = "wb_spi_gpio", + .num_resources = 0, + .id = -1, + + .dev = { + .platform_data = &spi_pdata, + .release = spi_gpio_release, + } +}; + +static void wb_spi_gpio_table_devid_name_set(void) { + int size; + + size = sizeof(gpiod_lookup_table_devid); + wb_spi_gpio_device.id = bus; + + mem_clear(gpiod_lookup_table_devid, size); + switch (bus) { + case PLATFORM_DEVID_NONE: + snprintf(gpiod_lookup_table_devid, size, "%s", wb_spi_gpio_device.name); + break; + case PLATFORM_DEVID_AUTO: + snprintf(gpiod_lookup_table_devid, size, "%s.%d.auto", wb_spi_gpio_device.name, bus); + break; + default: + snprintf(gpiod_lookup_table_devid, size, "%s.%d", wb_spi_gpio_device.name, bus); + break; + } + + wb_spi_gpio_table.dev_id = gpiod_lookup_table_devid; + return ; +} +static int __init wb_spi_gpio_device_init(void) +{ + int err; + struct gpiod_lookup *p; + + WB_SPI_GPIO_DEVICE_VERBOSE("enter!\n"); + wb_spi_gpio_table.table[0].chip_hwnum = sck; + wb_spi_gpio_table.table[1].chip_hwnum = mosi; + wb_spi_gpio_table.table[2].chip_hwnum = miso; + wb_spi_gpio_table.table[3].chip_hwnum = cs; + wb_spi_gpio_table_devid_name_set(); + WB_SPI_GPIO_DEVICE_VERBOSE("spi gpi device table bus[%d] dev id[%s]\n", bus, wb_spi_gpio_table.dev_id); + for (p = &wb_spi_gpio_table.table[0]; p->key; p++) { + WB_SPI_GPIO_DEVICE_VERBOSE("con_id:%s gpio:%d\n", p->con_id, p->chip_hwnum); + } + + gpiod_add_lookup_table(&wb_spi_gpio_table); + err = platform_device_register(&wb_spi_gpio_device); + if (err < 0) { + printk(KERN_ERR "register spi gpio device fail(%d). \n", err); + gpiod_remove_lookup_table(&wb_spi_gpio_table); + return -1; + } + + return 0; +} + +static void __exit wb_spi_gpio_device_exit(void) +{ + WB_SPI_GPIO_DEVICE_VERBOSE("enter!\n"); + platform_device_unregister(&wb_spi_gpio_device); + gpiod_remove_lookup_table(&wb_spi_gpio_table); +} + +module_init(wb_spi_gpio_device_init); +module_exit(wb_spi_gpio_device_exit); +MODULE_DESCRIPTION("SPI GPIO Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c new file mode 100644 index 0000000000..4196601f71 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_nor_device.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include + +/* The SPI Bus number that the device is mounted on can be specified manually when this module is loaded */ +#define DEFAULT_SPI_BUS_NUM (0) +#define DEFAULT_SPI_CS_NUM (0) +#define DEFAULT_SPI_HZ (100000) + +int g_wb_spi_nor_dev_debug = 0; +int g_wb_spi_nor_dev_error = 0; +int spi_bus_num = DEFAULT_SPI_BUS_NUM; + +module_param(g_wb_spi_nor_dev_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_spi_nor_dev_error, int, S_IRUGO | S_IWUSR); +module_param(spi_bus_num, int, S_IRUGO | S_IWUSR); + +#define SPI_NOR_DEV_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_spi_nor_dev_debug) { \ + printk(KERN_INFO "[SPI_NOR_DEV][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_NOR_DEV_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_spi_nor_dev_error) { \ + printk(KERN_ERR "[SPI_NOR_DEV][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct spi_board_info spi_nor_device_info __initdata= { + .modalias = "mx25l6405d", + .bus_num = DEFAULT_SPI_BUS_NUM, + .chip_select = DEFAULT_SPI_CS_NUM, + .max_speed_hz = 10 * 1000 * 1000, +}; + +static struct spi_device *g_spi_device; + +static int __init wb_spi_nor_dev_init(void) +{ + struct spi_master *master; + + SPI_NOR_DEV_DEBUG_VERBOSE("Enter.\n"); + + spi_nor_device_info.bus_num = spi_bus_num; + master = spi_busnum_to_master(spi_nor_device_info.bus_num); /* Get the controller according to the SPI Bus number */ + if (!master) { + SPI_NOR_DEV_DEBUG_ERROR("get bus_num %u spi master failed.\n", + spi_nor_device_info.bus_num); + return -EINVAL; + } + + g_spi_device = spi_new_device(master, &spi_nor_device_info); + put_device(&master->dev); + if (!g_spi_device) { + SPI_NOR_DEV_DEBUG_ERROR("register spi new device failed.\n"); + return -EPERM; + } + + if (g_wb_spi_nor_dev_debug) { + dev_info(&g_spi_device->dev, "register %u bus_num spi nor device success\n", + spi_nor_device_info.bus_num); + } + + return 0; +} + +static void __exit wb_spi_nor_dev_exit(void) +{ + spi_unregister_device(g_spi_device); + + if (g_wb_spi_nor_dev_debug) { + dev_info(&g_spi_device->dev, "unregister spi nor device success\n"); + } + + return; +} + +module_init(wb_spi_nor_dev_init); +module_exit(wb_spi_nor_dev_exit); + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("create spi nor device"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c new file mode 100644 index 0000000000..a709427c5b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.c @@ -0,0 +1,1025 @@ +/* + * wb_spi_ocores.c + * ko to create ocores spi adapter + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_spi_ocores.h" + +#define SPIOC_WAIT_SCH (5) +#define SPIOC_CONF (0x00) +#define SPIOC_LSBF BIT(0) /* 0:MSB 1:LSB */ +#define SPIOC_IDLE_LOW BIT(1) +#define SPIOC_INTREN BIT(2) /* 0:enable 1:disabel */ +#define SPIOC_DIV_MASK (0xf0) +#define SPIOC_MAX_DIV (0x0E) +#define SPIOC_DIV(div) (((div) & 0x0f) << 4) + +#define SPIOC_STS (0x01) +#define SPIOC_INTR_STS BIT(0) +#define SPIOC_BUSY_STS BIT(1) +#define SPIOC_RXNUM_SHIFT (4) +#define SPIOC_RXNUM_MASK (0xf << SPIOC_RXNUM_SHIFT) +/* Just for read */ +#define SPIOC_RXNUM(reg) (((reg) & SPIOC_RXNUM_MASK) >> SPIOC_RXNUM_SHIFT ) + +#define SPIOC_TXTOT_NUM (0x02) +#define SPIOC_TXNUM(reg) ((reg) & 0x0f) +#define SPIOC_TOTNUM(reg) (((reg) & 0x0f) << 4) + +#define SPIOC_TXCTL (0x03) +#define SPIOC_CSLV BIT(0) /* 0:Deassert SPICS 1:Laeve SPICS */ +#define SPIOC_TRSTART BIT(1) +#define SPIOC_CSID_SHIFT (5) +#define SPIOC_CSID_MASK (0x7 << SPIOC_CSID_SHIFT) +/* Just for write */ +#define SPIOC_CSID(id) (((id) << SPIOC_CSID_SHIFT) & SPIOC_CSID_MASK) + +/* Just single byte */ +#define SPIOC_RX(i) ((0x4) + i) +#define SPIOC_TX(i) ((0x4) + i) + +#define SPIOC_MAX_LEN ((unsigned int)8) +#define SPIOC_TXRX_MAX_LEN ((unsigned int)7) + +#define MODEBITS (SPI_CPHA |SPI_CPOL | SPI_LSB_FIRST |SPI_CS_HIGH) + +#define REG_IO_WIDTH_1 (1) +#define REG_IO_WIDTH_2 (2) +#define REG_IO_WIDTH_4 (4) + +#define SYMBOL_I2C_DEV_MODE (1) +#define FILE_MODE (2) +#define SYMBOL_PCIE_DEV_MODE (3) +#define SYMBOL_IO_DEV_MODE (4) + +int g_spi_oc_debug = 0; +int g_spi_oc_error = 0; + +module_param(g_spi_oc_debug, int, S_IRUGO | S_IWUSR); +module_param(g_spi_oc_error, int, S_IRUGO | S_IWUSR); + +#define SPI_OC_VERBOSE(fmt, args...) do { \ + if (g_spi_oc_debug) { \ + printk(KERN_INFO "[OC_SPI_BUS][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define SPI_OC_ERROR(fmt, args...) do { \ + if (g_spi_oc_error) { \ + printk(KERN_ERR "[OC_SPI_BUS][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct spioc { + /* bitbang has to be first */ + struct spi_bitbang bitbang; + int irq; + struct completion done; + unsigned int reamin_len; + unsigned int cur_pos; + unsigned int cur_len; + const u8 *txp; + u8 *rxp; + u8 chip_select; + void (*setreg)(struct spioc *spioc, int reg, u32 value); + u32 (*getreg)(struct spioc *spioc, int reg); + uint32_t bus_num; + const char *dev_name; + uint32_t reg_access_mode; + uint32_t base_addr; + uint32_t reg_shift; + uint32_t reg_io_width; + uint32_t num_chipselect; + uint32_t freq; + uint32_t big_endian; + struct device *dev; + int transfer_busy_flag; +}; + +extern int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); + +static int oc_spi_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + SPI_OC_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + SPI_OC_ERROR("kernel_read failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int oc_spi_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + SPI_OC_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + SPI_OC_ERROR("kernel_write failed, path=%s, addr=%d, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int oc_spi_reg_write(struct spioc *spioc, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (spioc->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(spioc->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = oc_spi_file_write(spioc->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(spioc->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(spioc->dev_name, pos, val, size); + break; + default: + SPI_OC_ERROR("err func_mode, write failed.\n"); + return -EINVAL; + } + + return ret; +} + +static int oc_spi_reg_read(struct spioc *spioc, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + + switch (spioc->reg_access_mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(spioc->dev_name, pos, val, size); + break; + case FILE_MODE: + ret = oc_spi_file_read(spioc->dev_name, pos, val, size); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(spioc->dev_name, pos, val, size); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(spioc->dev_name, pos, val, size); + break; + default: + SPI_OC_ERROR("err func_mode, read failed.\n"); + return -EINVAL; + } + + return ret; +} + +static void oc_spi_setreg_8(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_1); + return; +} + +static void oc_spi_setreg_16(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0Xff); + buf_tmp[1] = (value >> 8) & 0xff; + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_spi_setreg_32(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value & 0xff); + buf_tmp[1] = (value >> 8) & 0xff; + buf_tmp[2] = (value >> 16) & 0xff; + buf_tmp[3] = (value >> 24) & 0xff; + + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static void oc_spi_setreg_16be(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 8) & 0xff; + buf_tmp[1] = (value & 0Xff); + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + return; +} + +static void oc_spi_setreg_32be(struct spioc *spioc, int reg, u32 value) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + buf_tmp[0] = (value >> 24) & 0xff; + buf_tmp[1] = (value >> 16) & 0xff; + buf_tmp[2] = (value >> 8) & 0xff; + buf_tmp[3] = (value & 0xff); + oc_spi_reg_write(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + return; +} + +static inline u32 oc_spi_getreg_8(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_1]; + u32 value, pos; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_1); + value = buf_tmp[0]; + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + + return value; +} + +static inline u32 oc_spi_getreg_16(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_spi_getreg_32(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * i); + } + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_spi_getreg_16be(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_2]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_2); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_2 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_2 -i - 1)); + } + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; +} + +static inline u32 oc_spi_getreg_32be(struct spioc *spioc, int reg) +{ + u8 buf_tmp[REG_IO_WIDTH_4]; + u32 value, pos; + int i; + + pos = spioc->base_addr + (reg << spioc->reg_shift); + + mem_clear(buf_tmp, sizeof(buf_tmp)); + oc_spi_reg_read(spioc, pos, buf_tmp, REG_IO_WIDTH_4); + + value = 0; + for (i = 0; i < REG_IO_WIDTH_4 ; i++) { + value |= buf_tmp[i] << (8 * (REG_IO_WIDTH_4 -i - 1)); + } + + SPI_OC_VERBOSE("path:%s, access mode:%d, pos:0x%x, value0x%x.\n", + spioc->dev_name, spioc->reg_access_mode, pos, value); + return value; + +} + +static inline void oc_spi_setreg(struct spioc *spioc, int reg, u32 value) +{ + spioc->setreg(spioc, reg, value); + return; +} + +static inline u32 oc_spi_getreg(struct spioc *spioc, int reg) +{ + return spioc->getreg(spioc, reg); +} + +static int spioc_get_clkdiv(struct spioc *spioc, u32 speed) +{ + u32 rate, div; + + rate = spioc->freq; + SPI_OC_VERBOSE("clk get rate:%u, speed:%u\n", rate, speed); + /* fs = fw/((DIV+2)*2) */ + + if (speed > (rate / 4)) { + div = 0; + SPI_OC_VERBOSE("spi device speed[%u] more than a quarter of clk rate[%u].\n", + speed, rate); + return div; + } + div = (rate/(2 * speed)) - 2; + if (div > SPIOC_MAX_DIV) { + SPI_OC_ERROR("Unsupport spi device speed, div:%u.\n", div); + return -1; + } + SPI_OC_VERBOSE("DIV is:0x%x\n", div); + return div; +} + +static inline int spioc_wait_trans(struct spioc *spioc, const unsigned long timeout) +{ + unsigned long j; + unsigned int sch_time; + u8 reg; + + j = jiffies + timeout; + sch_time = SPIOC_WAIT_SCH; + while (1) { + reg = oc_spi_getreg(spioc, SPIOC_STS); + if (!(reg & SPIOC_BUSY_STS)) { + SPI_OC_VERBOSE("wait ok!\n"); + break; + } + + if (time_after(jiffies, j)) { + return -ETIMEDOUT; + } + + usleep_range(sch_time, sch_time + 1); + } + + return 0; +} + +static void spioc_chipselect(struct spi_device *spi, int is_active) +{ + struct spioc *spioc; + u8 tx_conf; + int ret; + + spioc = spi_master_get_devdata(spi->master); + spioc->transfer_busy_flag = 0; + ret = spioc_wait_trans(spioc, msecs_to_jiffies(100)); + if (ret < 0) { + SPI_OC_ERROR("spi transfer is busy, ret=%d.\n", ret); + spioc->transfer_busy_flag = 1; + return; + } + spioc->chip_select = spi->chip_select; + SPI_OC_VERBOSE("spioc_chipselect:%u, value:%d.\n", spioc->chip_select, is_active); + tx_conf = 0; + tx_conf |= SPIOC_CSID(spioc->chip_select); + if (is_active) { + tx_conf |= SPIOC_CSLV; + } + + SPI_OC_VERBOSE("tx_config:[0x%x]\n", tx_conf); + oc_spi_setreg(spioc, SPIOC_TXCTL, tx_conf); + return; +} + +static void spioc_copy_tx(struct spioc *spioc) +{ + const u8 *src; + int i; + + if (!spioc->txp) { + SPI_OC_ERROR("spioc->txp is NULL.\n"); + return; + } + + src = (u8 *)spioc->txp + spioc->cur_pos; + SPI_OC_VERBOSE("current tx len:0x%x, tx pos:[0x%x]\n", spioc->cur_len, spioc->cur_pos); + + for (i = 0; i < spioc->cur_len; i++) { + SPI_OC_VERBOSE("write %d, val:[0x%x]\n", i, src[i]); + oc_spi_setreg(spioc, SPIOC_TX(i), src[i]); + } +} + +static void spioc_copy_rx(struct spioc *spioc) +{ + u8 *dest; + int i; + + if (!spioc->rxp) { + SPI_OC_ERROR("spioc->rxp is NULL.\n"); + return; + } + + dest = (u8 *)spioc->rxp + spioc->cur_pos; + SPI_OC_VERBOSE("current rx len:0x%x, rx pos:[0x%x]\n", spioc->cur_len, spioc->cur_pos); + + for (i = 0; i < spioc->cur_len; i++) { + dest[i] = oc_spi_getreg(spioc, SPIOC_RX(i)); + SPI_OC_VERBOSE("read %d, val:[0x%x]\n", i, dest[i]); + } +} + +static int spioc_setup_transfer(struct spi_device *spi, struct spi_transfer *transfer) +{ + struct spioc *spioc; + u8 ctrl; + u32 hz; + int div; + + spioc = spi_master_get_devdata(spi->master); + ctrl = 0; + + if (spi->mode & SPI_LSB_FIRST) { + ctrl |= SPIOC_LSBF; + } + + if (!(spi->mode & SPI_CPOL)) { + ctrl |= SPIOC_IDLE_LOW; + } + + if (spioc->irq < 0) { + + ctrl |= SPIOC_INTREN; + } + + if (transfer != NULL) { + hz = transfer->speed_hz; + + if (hz == 0) { + hz = spi->max_speed_hz; + } + } else { + hz = spi->max_speed_hz; + } + + if (hz == 0) { + SPI_OC_ERROR("Unsupport zero speed.\n"); + return -EINVAL; + } + + div = spioc_get_clkdiv(spioc, hz); + if (div < 0) { + SPI_OC_ERROR("get div error, div:%d.\n", div); + return -EINVAL; + } + ctrl |= SPIOC_DIV(div); + + SPI_OC_VERBOSE("ctrl:[0x%x].\n", ctrl); + + oc_spi_setreg(spioc, SPIOC_CONF, ctrl); + return 0; +} + +static int spioc_spi_setup(struct spi_device *spi) +{ + struct spioc *spioc; + + if (!(spi->mode & SPI_CPHA)) { + SPI_OC_ERROR("Unsupport spi device mde:0x%x, SPI_CPHA must be 1.\n", spi->mode); + return -EINVAL; + } + + spioc = spi_master_get_devdata(spi->master); + if (spi->chip_select >= spioc->num_chipselect) { + SPI_OC_ERROR("Spi device chipselect:%u, more than max chipselect:%u.\n", + spi->chip_select, spioc->num_chipselect); + return -EINVAL; + } + SPI_OC_VERBOSE("Support spi device mode:0x%x, chip_select:%u.\n", + spi->mode, spi->chip_select); + return 0; +} + +static int spioc_transfer_start(struct spioc *spioc) +{ + u8 tx_conf; + int ret; + + tx_conf = oc_spi_getreg(spioc, SPIOC_TXCTL); + tx_conf |= SPIOC_TRSTART; + + SPI_OC_VERBOSE("tx_config:[0x%x]\n", tx_conf); + oc_spi_setreg(spioc, SPIOC_TXCTL, tx_conf); + + ret = spioc_wait_trans(spioc, msecs_to_jiffies(100)); + return ret; +} + +static int spioc_tx_start_one(struct spioc *spioc) +{ + unsigned int txlen; + u8 txreg; + int ret; + + if (!spioc->reamin_len) { + SPI_OC_VERBOSE("spioc txlen:[0x0]\n"); + return 0; + } + + spioc->cur_len = spioc->reamin_len > SPIOC_MAX_LEN ? SPIOC_MAX_LEN : spioc->reamin_len; + + txlen = spioc->cur_len; + spioc->reamin_len -= txlen; + SPI_OC_VERBOSE("txlen:[0x%x], tx len remain:[0x%x]\n", txlen, spioc->reamin_len); + + spioc_copy_tx(spioc); + + /* when we only send, txlen == totlen */ + txreg = SPIOC_TXNUM(txlen) | SPIOC_TOTNUM(txlen); + SPI_OC_VERBOSE("txreg:[0x%x]\n", txreg); + oc_spi_setreg(spioc, SPIOC_TXTOT_NUM, txreg); + + ret = spioc_transfer_start(spioc); + if (ret) { + SPI_OC_ERROR("spioc tx rx poll wait for transfer timeout.\n"); + return ret; + } + + if (spioc->reamin_len) { + spioc->cur_pos += txlen; + SPI_OC_VERBOSE("cur_txpos:[0x%x]\n", spioc->cur_pos); + } + + return 0; +} + +static int spioc_rx_start_one(struct spioc *spioc) +{ + unsigned int rxlen; + u8 txtnum; + int ret; + + if (!spioc->reamin_len) { + SPI_OC_VERBOSE("spioc reamin_len:[0x0]\n"); + return 0; + } + + spioc->cur_len = spioc->reamin_len > SPIOC_MAX_LEN ? SPIOC_MAX_LEN : spioc->reamin_len; + + rxlen = spioc->cur_len; + spioc->reamin_len -= rxlen; + SPI_OC_VERBOSE("rxlen:[0x%x], rx len remain:[0x%x]\n", rxlen, spioc->reamin_len); + + /* when we only receive, rxnum=totnum. txnum=0 */ + txtnum = SPIOC_TOTNUM(rxlen); + SPI_OC_VERBOSE("tx total reg:0x%x\n", txtnum); + oc_spi_setreg(spioc, SPIOC_TXTOT_NUM, txtnum); + + ret = spioc_transfer_start(spioc); + if (ret) { + SPI_OC_ERROR("spioc tx rx poll wait for transfer timeout.\n"); + return ret; + } + + spioc_copy_rx(spioc); + + if (spioc->reamin_len) { + spioc->cur_pos += rxlen; + SPI_OC_VERBOSE("cur_rxpos:[0x%x]\n", spioc->cur_pos); + } + + return 0; +} + +static int spioc_tx_rx_start_one(struct spioc *spioc) +{ + unsigned int txlen, total_len; + u8 txreg; + int ret; + + if (!spioc->reamin_len) { + SPI_OC_VERBOSE("spioc reamin_len:[0x0]\n"); + return 0; + } + + spioc->cur_len = spioc->reamin_len > SPIOC_TXRX_MAX_LEN ? SPIOC_TXRX_MAX_LEN : spioc->reamin_len; + + txlen = spioc->cur_len; + spioc->reamin_len -= txlen; + SPI_OC_VERBOSE("tx len:[0x%x], tx len remain:[0x%x]\n", txlen, spioc->reamin_len); + + spioc_copy_tx(spioc); + + total_len = 2 * txlen; /* total_len=txlen + rxlen; rxlen=txlen */ + txreg = SPIOC_TXNUM(txlen) | SPIOC_TOTNUM(total_len); + SPI_OC_VERBOSE("txreg:[0x%x]\n", txreg); + oc_spi_setreg(spioc, SPIOC_TXTOT_NUM, txreg); + + ret = spioc_transfer_start(spioc); + if (ret) { + SPI_OC_ERROR("spioc tx rx poll wait for transfer timeout.\n"); + return ret; + } + + spioc_copy_rx(spioc); + if (spioc->reamin_len) { + spioc->cur_pos += txlen; + SPI_OC_VERBOSE("cur_txrx pos:[0x%x]\n", spioc->cur_pos); + } + return 0; +} + +static int spioc_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) +{ + struct spioc *spioc; + int ret , len; + + if(!t->len || (!t->tx_buf && !t->rx_buf)) { + SPI_OC_ERROR("params error, tx_buf and rx_buf may both NULL, transfer len:0x%x.\n", + t->len); + return 0; + } + + spioc = spi_master_get_devdata(spi->master); + if (spioc->transfer_busy_flag) { + ret = -EBUSY; + goto err; + } + + spioc->txp = t->tx_buf; + spioc->rxp = t->rx_buf; + spioc->reamin_len = t->len; + spioc->cur_len = 0; + spioc->cur_pos = 0; + len = t->len; + ret = 0; + if (spioc->irq >= 0) { + /* use interrupt driven data transfer */ + if (t->tx_buf && t->rx_buf) { + spioc_tx_rx_start_one(spioc); + wait_for_completion(&spioc->done); + } else if (t->tx_buf) { + spioc_tx_start_one(spioc); + wait_for_completion(&spioc->done); + + } else { + spioc_rx_start_one(spioc); + wait_for_completion(&spioc->done); + } + } else { + if (t->tx_buf && t->rx_buf) { + SPI_OC_VERBOSE("start tx rx, len:0x%x\n", t->len); + while (spioc->reamin_len) { + ret = spioc_tx_rx_start_one(spioc); + if (ret) { + goto err; + } + } + } else if (t->tx_buf) { + SPI_OC_VERBOSE("start tx, txlen:0x%x\n", t->len); + while (spioc->reamin_len) { + ret = spioc_tx_start_one(spioc); + if (ret) { + goto err; + } + } + } else { + SPI_OC_VERBOSE("start rx, rxlen:0x%x\n", t->len); + while (spioc->reamin_len) { + ret = spioc_rx_start_one(spioc); + if (ret) { + goto err; + } + } + } + } + SPI_OC_VERBOSE("return num: 0x%x\n", len); + return len; +err: + return ret; +} + +static irqreturn_t spioc_spi_irq(int irq, void *dev) +{ + struct spioc *spioc; + + spioc = dev; + /* gooooohi, interrupt status bit judgment is not done */ + + if (spioc->txp && spioc->rxp) { + if (!spioc->reamin_len) { + complete(&spioc->done); + } else { + spioc_tx_rx_start_one(spioc); + } + } else if (spioc->txp) { + if (!spioc->reamin_len) { + complete(&spioc->done); + } else { + spioc_tx_start_one(spioc); + } + } else if (spioc->rxp){ + if (!spioc->reamin_len) { + complete(&spioc->done); + } else { + spioc_rx_start_one(spioc); + } + } + + return IRQ_HANDLED; +} + +static int ocores_spi_config_init(struct spioc *spioc) +{ + int ret = 0; + struct device *dev; + spi_ocores_device_t *spi_ocores_device; + + dev = spioc->dev; + if (dev->of_node) { + ret += of_property_read_string(dev->of_node, "dev_name", &spioc->dev_name); + ret += of_property_read_u32(dev->of_node, "dev_base", &spioc->base_addr); + ret += of_property_read_u32(dev->of_node, "reg_shift", &spioc->reg_shift); + ret += of_property_read_u32(dev->of_node, "reg_io_width", &spioc->reg_io_width); + ret += of_property_read_u32(dev->of_node, "clock-frequency", &spioc->freq); + ret += of_property_read_u32(dev->of_node, "reg_access_mode", &spioc->reg_access_mode); + ret += of_property_read_u32(dev->of_node, "num_chipselect", &spioc->num_chipselect); + + if (ret != 0) { + SPI_OC_ERROR("dts config error, ret:%d.\n", ret); + ret = -ENXIO; + return ret; + } + } else { + if (spioc->dev->platform_data == NULL) { + SPI_OC_ERROR("platform data config error.\n"); + ret = -ENXIO; + return ret; + } + spi_ocores_device = spioc->dev->platform_data; + spioc->bus_num = spi_ocores_device->bus_num; + spioc->dev_name = spi_ocores_device->dev_name; + spioc->big_endian = spi_ocores_device->big_endian; + spioc->base_addr = spi_ocores_device->dev_base; + spioc->reg_shift = spi_ocores_device->reg_shift; + spioc->reg_io_width = spi_ocores_device->reg_io_width; + spioc->freq = spi_ocores_device->clock_frequency; + spioc->reg_access_mode = spi_ocores_device->reg_access_mode; + spioc->num_chipselect = spi_ocores_device->num_chipselect; + } + + SPI_OC_VERBOSE("name:%s, base:0x%x, reg_shift:0x%x, io_width:0x%x, clock-frequency:0x%x.\n", + spioc->dev_name, spioc->base_addr, spioc->reg_shift, spioc->reg_io_width, spioc->freq); + SPI_OC_VERBOSE("reg access mode:%u, num_chipselect:%u.\n", + spioc->reg_access_mode, spioc->num_chipselect); + return ret; +} + +static int spioc_probe(struct platform_device *pdev) +{ + struct spi_master *master; + struct spioc *spioc; + int ret; + bool be; + + ret = -1; + master = spi_alloc_master(&pdev->dev, sizeof(struct spioc)); + if (!master) { + dev_err(&pdev->dev, "Failed to alloc spi master.\n"); + goto out; + } + + spioc = spi_master_get_devdata(master); + platform_set_drvdata(pdev, spioc); + + spioc->dev = &pdev->dev; + ret = ocores_spi_config_init(spioc); + if (ret != 0) { + dev_err(spioc->dev, "Failed to get ocores spi dts config.\n"); + goto free; + } + + if (spioc->dev->of_node) { + if (of_property_read_u32(spioc->dev->of_node, "big_endian", &spioc->big_endian)) { + + be = 0; + } else { + be = spioc->big_endian; + } + } else { + be = spioc->big_endian; + } + + if (spioc->reg_io_width == 0) { + spioc->reg_io_width = 1; /* Set to default value */ + } + + if (!spioc->setreg || !spioc->getreg) { + switch (spioc->reg_io_width) { + case REG_IO_WIDTH_1: + spioc->setreg = oc_spi_setreg_8; + spioc->getreg = oc_spi_getreg_8; + break; + + case REG_IO_WIDTH_2: + spioc->setreg = be ? oc_spi_setreg_16be : oc_spi_setreg_16; + spioc->getreg = be ? oc_spi_getreg_16be : oc_spi_getreg_16; + break; + + case REG_IO_WIDTH_4: + spioc->setreg = be ? oc_spi_setreg_32be : oc_spi_setreg_32; + spioc->getreg = be ? oc_spi_getreg_32be : oc_spi_getreg_32; + break; + + default: + dev_err(spioc->dev, "Unsupported I/O width (%d)\n", spioc->reg_io_width); + ret = -EINVAL; + goto free; + } + } + + /* master state */ + master->num_chipselect = spioc->num_chipselect; + master->mode_bits = MODEBITS; + master->setup = spioc_spi_setup; + if (spioc->dev->of_node) { + master->dev.of_node = pdev->dev.of_node; + } else { + master->bus_num = spioc->bus_num; + } + + /* setup the state for the bitbang driver */ + spioc->bitbang.master = master; + spioc->bitbang.setup_transfer = spioc_setup_transfer; + spioc->bitbang.chipselect = spioc_chipselect; + spioc->bitbang.txrx_bufs = spioc_spi_txrx_bufs; + + /* gooooohi need revision */ + spioc->irq = platform_get_irq(pdev, 0); + if (spioc->irq >= 0) { + SPI_OC_VERBOSE("spi oc use irq, irq number:%d.\n", spioc->irq); + init_completion(&spioc->done); + ret = devm_request_irq(&pdev->dev, spioc->irq, spioc_spi_irq, 0, + pdev->name, spioc); + if (ret) { + dev_err(spioc->dev, "Failed to request irq:%d.\n", spioc->irq); + goto free; + } + } + + ret = spi_bitbang_start(&spioc->bitbang); + if (ret) { + dev_err(spioc->dev, "Failed to start spi bitbang, ret:%d.\n", ret); + goto free; + } + dev_info(spioc->dev, "registered spi-%d for %s with base address:0x%x success.\n", + master->bus_num, spioc->dev_name, spioc->base_addr); + + return ret; +free: + spi_master_put(master); +out: + return ret; +} + +static int spioc_remove(struct platform_device *pdev) +{ + struct spioc *spioc; + struct spi_master *master; + + spioc = platform_get_drvdata(pdev); + master = spioc->bitbang.master; + spi_bitbang_stop(&spioc->bitbang); + platform_set_drvdata(pdev, NULL); + spi_master_put(master); + + return 0; +} + +static const struct of_device_id spioc_match[] = { + { .compatible = "wb-spi-oc", }, + {}, +}; +MODULE_DEVICE_TABLE(of, spioc_match); + +static struct platform_driver spioc_driver = { + .probe = spioc_probe, + .remove = spioc_remove, + .driver = { + .name = "wb-spioc", + .owner = THIS_MODULE, + .of_match_table = spioc_match, + }, +}; + +module_platform_driver(spioc_driver); + +MODULE_DESCRIPTION("spi open core adapter driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h new file mode 100644 index 0000000000..647ff0c5f9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_spi_ocores.h @@ -0,0 +1,21 @@ +#ifndef __WB_SPI_OCORES_H__ +#define __WB_SPI_OCORES_H__ +#include + +#define mem_clear(data, size) memset((data), 0, (size)) +#define SPI_OCORES_DEV_NAME_MAX_LEN (64) + +typedef struct spi_ocores_device_s { + uint32_t bus_num; + uint32_t big_endian; + char dev_name[SPI_OCORES_DEV_NAME_MAX_LEN]; + uint32_t reg_access_mode; + uint32_t dev_base; + uint32_t reg_shift; + uint32_t reg_io_width; + uint32_t clock_frequency; + uint32_t num_chipselect; + int device_flag; +} spi_ocores_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c new file mode 100644 index 0000000000..da2b582443 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_uio_irq.c @@ -0,0 +1,282 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct dfd_irq_s { + int gpio; + int irq_type; + struct uio_info dfd_irq_info; + spinlock_t lock; + struct attribute_group attr_group; +} dfd_irq_t; + +#define DRV_NAME "uio-irq" +#define DRV_VERSION "1.0" +#define ENABLE_VAL (1) +#define DISABLE_VAL (0) + +#define DEBUG_ERR_LEVEL (0x1) +#define DEBUG_WARN_LEVEL (0x2) +#define DEBUG_INFO_LEVEL (0x4) +#define DEBUG_VER_LEVEL (0x8) + +static int debug = 0; +module_param(debug, int, S_IRUGO | S_IWUSR); +#define DEBUG_ERROR(fmt, args...) \ + do { \ + if (debug & DEBUG_ERR_LEVEL) { \ + printk(KERN_ERR "[ERR][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +#define DEBUG_WARN(fmt, args...) \ + do { \ + if (debug & DEBUG_WARN_LEVEL) { \ + printk(KERN_WARNING "[WARN][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +#define DEBUG_INFO(fmt, args...) \ + do { \ + if (debug & DEBUG_INFO_LEVEL) { \ + printk(KERN_INFO "[INFO][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +#define DEBUG_VERBOSE(fmt, args...) \ + do { \ + if (debug & DEBUG_VER_LEVEL) { \ + printk(KERN_DEBUG "[VER][func:%s line:%d] "fmt, __func__, __LINE__, ## args); \ + } else { \ + pr_debug(fmt, ## args); \ + } \ + } while(0) + +static irqreturn_t dfd_genirq_handler(int irq, struct uio_info *dev_info) +{ + disable_irq_nosync(irq); + DEBUG_VERBOSE("handler disable irq"); + return IRQ_HANDLED; +} + +static int dfd_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on) +{ + struct irq_data *irqdata; + + irqdata = irq_get_irq_data(dev_info->irq); + + if (irqd_irq_disabled(irqdata) == !irq_on) { + DEBUG_VERBOSE("irq already disable"); + return 0; + } + if (irq_on) { + DEBUG_VERBOSE("irqcontrol enable irq"); + enable_irq(dev_info->irq); + } else { + DEBUG_VERBOSE("irqcontrol disable irq"); + disable_irq(dev_info->irq); + } + + return 0; +} + +static ssize_t set_irq_enable(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + dfd_irq_t *dfd_irq; + struct uio_info *dev_info; + unsigned long flags; + int ret, val; + + dfd_irq = dev_get_drvdata(dev); + dev_info = &dfd_irq->dfd_irq_info; + + spin_lock_irqsave(&dfd_irq->lock, flags); + + sscanf(buf, "%d", &val); + DEBUG_VERBOSE("set val:%d.\n", val); + + if ((val != ENABLE_VAL) && (val != DISABLE_VAL)) { + DEBUG_ERROR("unsupport val:%d ", val); + ret = -EINVAL; + goto fail; + } + + if (val) { + DEBUG_VERBOSE("sysfs enable irq"); + enable_irq(dev_info->irq); + } else { + DEBUG_VERBOSE("sysfs disable irq"); + disable_irq(dev_info->irq); + } + + spin_unlock_irqrestore(&dfd_irq->lock, flags); + return count; + +fail: + spin_unlock_irqrestore(&dfd_irq->lock, flags); + return ret; +} + +static DEVICE_ATTR(irq_enable, S_IWUSR, NULL, set_irq_enable); + +static struct attribute *irq_attrs[] = { + &dev_attr_irq_enable.attr, + NULL, +}; + +static struct attribute_group irq_attr_group = { + .attrs = irq_attrs, +}; + +static int dfd_irq_probe(struct platform_device *pdev) +{ + u32 gpio, irq_type, pirq_line; + int ret, ret1, ret2; + struct uio_info *dfd_irq_info; + dfd_irq_t *dfd_irq; + + dfd_irq = kzalloc(sizeof(dfd_irq_t), GFP_KERNEL); + if (!dfd_irq) { + dev_err(&pdev->dev, "dfd_irq_t kzalloc failed.\n"); + return -ENOMEM; + } + + dfd_irq_info = &dfd_irq->dfd_irq_info; + dfd_irq_info->version = "1.0"; + dfd_irq_info->name = "uio-irq"; + + /* get pirq line for x86 */ + ret1 = of_property_read_u32(pdev->dev.of_node, "pirq-line", &pirq_line); + if (!ret1) { + DEBUG_VERBOSE("use pirq-line method, pirq-line:%u", pirq_line); + dfd_irq_info->irq = pirq_line; + } + + ret2 = of_property_read_u32(pdev->dev.of_node, "gpio", &gpio); + if (!ret2 && ret1) { + dfd_irq->gpio = gpio; + gpio_request(dfd_irq->gpio, "GPIOA"); + dfd_irq_info->irq = gpio_to_irq(dfd_irq->gpio); + DEBUG_VERBOSE("use gpio:%u, irq num:%ld", gpio, dfd_irq_info->irq); + } else if (ret2 && ret1){ + ret = -ENXIO; + dev_err(&pdev->dev, "no define irq num. ret2:%d, ret1:%d.\n", ret2, ret1); + goto free_mem; + } + + ret = of_property_read_u32(pdev->dev.of_node, "irq_type", &irq_type); + if (!ret && ret1) { + DEBUG_VERBOSE("use irq_type:%u", irq_type); + dfd_irq->irq_type = irq_type; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) + irq_set_irq_type(dfd_irq_info->irq, dfd_irq->irq_type); +#else + set_irq_type(dfd_irq_info->irq, dfd_irq->irq_type); +#endif + } else if (ret && ret1){ + ret = -ENXIO; + dev_err(&pdev->dev, "no define irq type. ret:%d, ret1:%d.\n", ret, ret1); + goto free_mem; + } + + dfd_irq_info->irq_flags = IRQF_SHARED; + dfd_irq_info->handler = dfd_genirq_handler; + dfd_irq_info->irqcontrol = dfd_genirq_irqcontrol; + + if(uio_register_device(&pdev->dev, dfd_irq_info)){ + ret = -ENODEV; + dev_err(&pdev->dev, "uio register failed.\n"); + goto free_mem; + } + + spin_lock_init(&dfd_irq->lock); + + dfd_irq->attr_group = irq_attr_group; + ret = sysfs_create_group(&pdev->dev.kobj, &dfd_irq->attr_group); + if (ret != 0) { + dev_err(&pdev->dev, "sysfs_create_group failed. ret:%d.\n", ret); + goto free_mem; + } + DEBUG_VERBOSE("sysfs create group success\n"); + + platform_set_drvdata(pdev, dfd_irq); + + return 0; + +free_mem: + kfree(dfd_irq); + + return ret; +} + +static int dfd_irq_remove(struct platform_device *pdev) +{ + dfd_irq_t *dfd_irq; + struct uio_info *dfd_irq_info; + + dfd_irq = platform_get_drvdata(pdev); + dfd_irq_info = &dfd_irq->dfd_irq_info; + + uio_unregister_device(dfd_irq_info); + kfree(dfd_irq); + + sysfs_remove_group(&pdev->dev.kobj, &dfd_irq->attr_group); + + return 0; +} + +static struct of_device_id dfd_irq_match[] = { + { + .compatible = "uio-irq", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, dfd_irq_match); + +static struct platform_driver dfd_irq_driver = { + .probe = dfd_irq_probe, + .remove = dfd_irq_remove, + .driver = { + .owner = THIS_MODULE, + .name = DRV_NAME, + .of_match_table = dfd_irq_match, + }, +}; + +static int __init dfd_irq_init(void) +{ + int ret; + + ret = platform_driver_register(&dfd_irq_driver); + if (ret != 0 ) { + return ret; + } + + return 0; +} + +static void __exit dfd_irq_exit(void) +{ + platform_driver_unregister(&dfd_irq_driver); +} + +module_init(dfd_irq_init); +module_exit(dfd_irq_exit); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c new file mode 100644 index 0000000000..8c02d98184 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.c @@ -0,0 +1,1038 @@ +/* + * wb_wdt.c + * ko for watchdog function + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wb_wdt.h" + +#define GPIO_FEED_WDT_MODE (1) +#define LOGIC_FEED_WDT_MODE (2) + +#define SYMBOL_I2C_DEV_MODE (1) +#define SYMBOL_PCIE_DEV_MODE (2) +#define SYMBOL_IO_DEV_MODE (3) +#define FILE_MODE (4) + +#define ONE_BYTE (1) + +#define WDT_OFF (0) +#define WDT_ON (1) + +#define MS_TO_S (1000) +#define MS_TO_NS (1000 * 1000) + +#define MAX_REG_VAL (255) + +extern int i2c_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int i2c_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int pcie_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_write(const char *path, uint32_t offset, uint8_t *buf, size_t count); +extern int io_device_func_read(const char *path, uint32_t offset, uint8_t *buf, size_t count); + +int g_wb_wdt_debug = 0; +int g_wb_wdt_error = 0; + +module_param(g_wb_wdt_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_wdt_error, int, S_IRUGO | S_IWUSR); + +#define WDT_VERBOSE(fmt, args...) do { \ + if (g_wb_wdt_debug) { \ + printk(KERN_INFO "[WDT][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WDT_ERROR(fmt, args...) do { \ + if (g_wb_wdt_error) { \ + printk(KERN_ERR "[WDT][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +enum { + HW_ALGO_TOGGLE, + HW_ALGO_LEVEL, +}; + +enum { + WATCHDOG_DEVICE_TYPE = 0, + HRTIMER_TYPE, + THREAD_TYPE, +}; + +typedef struct wb_wdt_priv_s { + + struct task_struct *thread; + struct hrtimer hrtimer; + ktime_t m_kt; + const char *config_dev_name; + uint8_t config_mode; + uint8_t hw_algo; + uint8_t enable_val; + uint8_t disable_val; + uint8_t enable_mask; + uint8_t priv_func_mode; + uint8_t feed_wdt_type; + uint32_t enable_reg; + uint32_t timeout_cfg_reg; + uint32_t timeleft_cfg_reg; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t timer_accuracy; + gpio_wdt_info_t gpio_wdt; + logic_wdt_info_t logic_wdt; + struct device *dev; + const struct attribute_group *sysfs_group; + uint8_t sysfs_index; + struct mutex update_lock; + struct watchdog_device wdd; +}wb_wdt_priv_t; + +static int wdt_file_read(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(filp)) { + WDT_ERROR("read open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_read(filp, val, size, &tmp_pos); + if (ret < 0) { + WDT_ERROR("kernel_read failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int wdt_file_write(const char *path, uint32_t pos, uint8_t *val, size_t size) +{ + int ret; + struct file *filp; + loff_t tmp_pos; + + filp = filp_open(path, O_RDWR, 777); + if (IS_ERR(filp)) { + WDT_ERROR("write open failed errno = %ld\r\n", -PTR_ERR(filp)); + filp = NULL; + goto exit; + } + + tmp_pos = (loff_t)pos; + ret = kernel_write(filp, val, size, &tmp_pos); + if (ret < 0) { + WDT_ERROR("kernel_write failed, path=%s, addr=0x%x, size=%ld, ret=%d\r\n", path, pos, size, ret); + goto exit; + } + + vfs_fsync(filp, 1); + filp_close(filp, NULL); + + return ret; + +exit: + if (filp != NULL) { + filp_close(filp, NULL); + } + + return -1; +} + +static int wb_wdt_read(uint8_t mode, const char *path, + uint32_t offset, uint8_t *buf, size_t count) +{ + int ret; + + switch (mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_read(path, offset, buf, count); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_read(path, offset, buf, count); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_read(path, offset, buf, count); + break; + case FILE_MODE: + ret = wdt_file_read(path, offset, buf, count); + break; + default: + WDT_ERROR("mode %u error, wdt func read failed.\n", mode); + return -EINVAL; + } + + WDT_VERBOSE("wdt func read mode:%u,dev_nam:%s, offset:0x%x, read_val:0x%x, size:%lu.\n", + mode, path, offset, *buf, count); + + return ret; +} + +static int wb_wdt_write(uint8_t mode, const char *path, + uint32_t offset, uint8_t *buf, size_t count) +{ + int ret; + + switch (mode) { + case SYMBOL_I2C_DEV_MODE: + ret = i2c_device_func_write(path, offset, buf, count); + break; + case SYMBOL_PCIE_DEV_MODE: + ret = pcie_device_func_write(path, offset, buf, count); + break; + case SYMBOL_IO_DEV_MODE: + ret = io_device_func_write(path, offset, buf, count); + break; + case FILE_MODE: + ret = wdt_file_write(path, offset, buf, count); + break; + default: + WDT_ERROR("mode %u error, wdt func write failed.\n", mode); + return -EINVAL; + } + + WDT_VERBOSE("wdt func write mode:%u, dev_nam:%s, offset:0x%x, write_val:0x%x, size:%lu.\n", + mode, path, offset, *buf, count); + + return ret; +} + +static int wb_wdt_enable_ctrl(wb_wdt_priv_t *priv, uint8_t flag) +{ + int ret; + uint8_t val; + uint8_t ctrl_val; + + switch (flag) { + case WDT_ON: + ctrl_val = priv->enable_val; + break; + case WDT_OFF: + ctrl_val = priv->disable_val; + break; + default: + WDT_ERROR("unsupport wdt enable ctrl:%u.\n", flag); + return -EINVAL; + } + + ret = wb_wdt_read(priv->priv_func_mode, priv->config_dev_name, + priv->enable_reg, &val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "read wdt control reg error.\n"); + return ret; + } + + val &= ~priv->enable_mask; + + val |= ctrl_val & priv->enable_mask; + + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->enable_reg, &val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "write wdt control reg error.\n"); + return ret; + } + + return 0; +} + +static void wdt_hwping(wb_wdt_priv_t *priv) +{ + gpio_wdt_info_t *gpio_wdt; + logic_wdt_info_t *logic_wdt; + uint8_t tmp_val; + int ret; + + if (priv->config_mode == GPIO_FEED_WDT_MODE) { + gpio_wdt = &priv->gpio_wdt; + switch (priv->hw_algo) { + case HW_ALGO_TOGGLE: + gpio_wdt = &priv->gpio_wdt; + gpio_wdt->state = !gpio_wdt->state; + gpio_set_value_cansleep(gpio_wdt->gpio, gpio_wdt->state); + WDT_VERBOSE("gpio toggle wdt work. val:%u\n", gpio_wdt->state); + break; + case HW_ALGO_LEVEL: + gpio_wdt = &priv->gpio_wdt; + /* Pulse */ + gpio_set_value_cansleep(gpio_wdt->gpio, !gpio_wdt->active_low); + udelay(1); + gpio_set_value_cansleep(gpio_wdt->gpio, gpio_wdt->active_low); + WDT_VERBOSE("gpio level wdt work.\n"); + break; + } + } else { + logic_wdt = &priv->logic_wdt; + switch (priv->hw_algo) { + case HW_ALGO_TOGGLE: + logic_wdt->active_val = !logic_wdt->active_val; + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &logic_wdt->active_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("logic toggle wdt write failed.ret = %d\n", ret); + } + WDT_VERBOSE("logic toggle wdt work.\n"); + break; + case HW_ALGO_LEVEL: + tmp_val = !logic_wdt->active_val; + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &tmp_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("logic level wdt write first failed.ret = %d\n", ret); + } + udelay(1); + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &logic_wdt->active_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("logic level wdt write second failed.ret = %d\n", ret); + } + WDT_VERBOSE("logic level wdt work.\n"); + break; + } + } + return; +} + +static enum hrtimer_restart hrtimer_hwping(struct hrtimer *timer) +{ + wb_wdt_priv_t *priv = container_of(timer, wb_wdt_priv_t, hrtimer); + + wdt_hwping(priv); + hrtimer_forward(timer, timer->base->get_time(), priv->m_kt); + return HRTIMER_RESTART; +} + +static int thread_timer_cfg(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t accuracy; + uint8_t set_time_val; + int ret; + + dev = priv->dev; + + ret = 0; + if (dev->of_node) { + ret += of_property_read_u32(dev->of_node, "feed_time", &priv->feed_time); + if (ret != 0) { + dev_err(dev, "thread Failed to priv dts.\n"); + return -ENXIO; + } + } else { + priv->feed_time = wb_wdt_device->feed_time; + } + WDT_VERBOSE("thread priv->feed_time: %u.\n", priv->feed_time); + + hw_margin = priv->hw_margin; + feed_time = priv->feed_time; + accuracy = priv->timer_accuracy; + + if ((feed_time > (hw_margin / 2)) || (feed_time == 0)) { + dev_err(dev, "thread timer feed_time[%d] should be less than half hw_margin or zero.\n", feed_time); + return -EINVAL; + } + + set_time_val = hw_margin / accuracy; + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + dev_err(dev, "set wdt thread timer reg error.\n"); + return ret; + } + return 0; +} + +static int wdt_thread_timer(void *data) +{ + wb_wdt_priv_t *priv = data; + + while (!kthread_should_stop()) { + schedule_timeout_uninterruptible(msecs_to_jiffies(priv->feed_time)); + wdt_hwping(priv); + } + return 0; +} + +static int thread_timer_create(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct task_struct *p; + int ret; + + ret = thread_timer_cfg(priv, wb_wdt_device); + if (ret < 0) { + dev_err(priv->dev, "set wdt thread timer failed.\n"); + return ret; + } + + p = kthread_create(wdt_thread_timer, (void *)priv, "%s", "wb_wdt"); + if (!IS_ERR(p)) { + WDT_VERBOSE("timer thread create success.\n"); + priv->thread = p; + wake_up_process(p); + } else { + dev_err(priv->dev, "timer thread create failed.\n"); + return -ENXIO; + } + + ret = wb_wdt_enable_ctrl(priv, WDT_ON); + if (ret < 0) { + dev_err(priv->dev, "thread enable wdt failed.\n"); + return -ENXIO; + } + + return 0; +} + +static int hrtimer_cfg(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + struct hrtimer *hrtimer; + uint8_t set_time_val; + uint8_t hrtimer_s; + uint32_t hrtimer_ns; + int ret; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t accuracy; + uint32_t max_timeout; + + dev = priv->dev; + + ret = 0; + if (dev->of_node) { + ret += of_property_read_u32(dev->of_node, "feed_time", &priv->feed_time); + if (ret != 0) { + dev_err(dev, "hrtimer Failed to priv dts.\n"); + return -ENXIO; + } + } else { + priv->feed_time = wb_wdt_device->feed_time; + } + WDT_VERBOSE("hrtimer priv->feed_time: %u.\n", priv->feed_time); + + hrtimer = &priv->hrtimer; + hw_margin = priv->hw_margin; + feed_time = priv->feed_time; + accuracy = priv->timer_accuracy; + max_timeout = accuracy * 255; + + if (hw_margin < accuracy || hw_margin > max_timeout) { + dev_err(dev, "hrtimer_hw_margin should be between %u and %u.\n", + accuracy, max_timeout); + return -EINVAL; + } + if ((feed_time > (hw_margin / 2)) || (feed_time == 0)) { + dev_err(dev, "feed_time[%d] should be less than half hw_margin or zeor.\n", feed_time); + return -EINVAL; + } + + hrtimer_s = feed_time / MS_TO_S; + hrtimer_ns = (feed_time % MS_TO_S) * MS_TO_NS; + set_time_val = hw_margin / accuracy; + + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + dev_err(dev, "set wdt time reg error.\n"); + return ret; + } + + priv->m_kt = ktime_set(hrtimer_s, hrtimer_ns); + hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer->function = hrtimer_hwping; + hrtimer_start(hrtimer, priv->m_kt, HRTIMER_MODE_REL); + + ret = wb_wdt_enable_ctrl(priv, WDT_ON); + if (ret < 0) { + dev_err(dev, "hrtimer enable wdt failed.\n"); + return -ENXIO; + } + + return 0; +} + +static int wb_wdt_ping(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + + wdt_hwping(priv); + return 0; +} + +static int wb_wdt_start(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + int ret; + + ret = wb_wdt_enable_ctrl(priv, WDT_ON); + if (ret < 0) { + WDT_ERROR("start wdt enable failed.\n"); + return -ENXIO; + } + set_bit(WDOG_HW_RUNNING, &wdd->status); + return 0; +} + +static int wb_wdt_stop(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + int ret; + + ret = wb_wdt_enable_ctrl(priv, WDT_OFF); + if (ret < 0) { + WDT_ERROR("stop wdt enable failed.\n"); + return -ENXIO; + } + clear_bit(WDOG_HW_RUNNING, &wdd->status); + return 0; +} + +static int wb_wdt_set_timeout(struct watchdog_device *wdd, unsigned int t) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + uint32_t timeout_ms; + uint32_t accuracy; + uint8_t set_time_val; + int ret; + + accuracy = priv->timer_accuracy; + timeout_ms = t * 1000; + if (timeout_ms > accuracy * 255) { + WDT_ERROR("set wdt timeout too larger error.timeout_ms:%u\n", timeout_ms); + return -EINVAL; + } + + set_time_val = timeout_ms / accuracy; + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("set wdt timeout reg error, set_time_val:%u ret:%d\n", set_time_val, ret); + return ret; + } + wdd->timeout = t; + + return 0; +} + +static unsigned int wb_wdt_get_timeleft(struct watchdog_device *wdd) +{ + wb_wdt_priv_t *priv = watchdog_get_drvdata(wdd); + unsigned int time_left; + uint32_t accuracy; + uint8_t get_time_val; + int ret; + + accuracy = priv->timer_accuracy; + + ret = wb_wdt_read(priv->priv_func_mode, priv->config_dev_name, + priv->timeleft_cfg_reg, &get_time_val, ONE_BYTE); + if (ret < 0) { + WDT_ERROR("get wdt timeout reg error.ret:%d\n", ret); + return ret; + } + time_left = get_time_val * accuracy / MS_TO_S; + + WDT_VERBOSE("get wdt timeleft %d get_time_val %d accuracy=%d\n", + time_left, get_time_val, accuracy); + return time_left; +} + +static const struct watchdog_info wb_wdt_ident = { + .options = WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT, + .firmware_version = 0, + .identity = "CPLD Watchdog", +}; + +static const struct watchdog_ops wb_wdt_ops = { + .owner = THIS_MODULE, + .start = wb_wdt_start, + .stop = wb_wdt_stop, + .ping = wb_wdt_ping, + .set_timeout = wb_wdt_set_timeout, + .get_timeleft = wb_wdt_get_timeleft, +}; + +static int watchdog_device_cfg(wb_wdt_priv_t *priv) +{ + int ret; + uint8_t set_time_val; + + ret = wb_wdt_enable_ctrl(priv, WDT_OFF); + if (ret < 0) { + dev_err(priv->dev, "probe disable wdt failed.\n"); + return -ENXIO; + } + + set_time_val = priv->hw_margin / priv->timer_accuracy; + ret = wb_wdt_write(priv->priv_func_mode, priv->config_dev_name, + priv->timeout_cfg_reg, &set_time_val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "set wdt time reg error.\n"); + return ret; + } + + watchdog_set_drvdata(&priv->wdd, priv); + + priv->wdd.info = &wb_wdt_ident; + priv->wdd.ops = &wb_wdt_ops; + priv->wdd.bootstatus = 0; + priv->wdd.timeout = priv->hw_margin / MS_TO_S; + priv->wdd.min_timeout = priv->timer_accuracy / MS_TO_S; + priv->wdd.max_timeout = priv->timer_accuracy * MAX_REG_VAL / MS_TO_S; + priv->wdd.parent = priv->dev; + + watchdog_stop_on_reboot(&priv->wdd); + + ret = devm_watchdog_register_device(priv->dev, &priv->wdd); + if (ret != 0) { + dev_err(priv->dev, "cannot register watchdog device (err=%d)\n", ret); + return -ENXIO; + } + + return 0; +} + +static int logic_wdt_init(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + logic_wdt_info_t *logic_wdt; + int ret; + + dev = priv->dev; + logic_wdt = &priv->logic_wdt; + + ret = 0; + if (dev->of_node) { + ret += of_property_read_string(dev->of_node, "feed_dev_name", &logic_wdt->feed_dev_name); + ret += of_property_read_u32(dev->of_node, "feed_reg", &logic_wdt->feed_reg); + ret += of_property_read_u8(dev->of_node, "active_val", &logic_wdt->active_val); + ret += of_property_read_u8(dev->of_node, "logic_func_mode", &logic_wdt->logic_func_mode); + if (ret != 0) { + dev_err(dev, "Failed to logic_wdt dts.\n"); + return -ENXIO; + } + } else { + logic_wdt->feed_dev_name = wb_wdt_device->wdt_config_mode.logic_wdt.feed_dev_name; + logic_wdt->feed_reg = wb_wdt_device->wdt_config_mode.logic_wdt.feed_reg; + logic_wdt->active_val = wb_wdt_device->wdt_config_mode.logic_wdt.active_val; + logic_wdt->logic_func_mode = wb_wdt_device->wdt_config_mode.logic_wdt.logic_func_mode; + } + + logic_wdt->state_val = logic_wdt->active_val; + + WDT_VERBOSE("feed_dev_name:%s, feed_reg:0x%x, active_val:%u, logic_func_mode:%u\n", + logic_wdt->feed_dev_name, logic_wdt->feed_reg, + logic_wdt->active_val, logic_wdt->logic_func_mode); + + return 0; +} + +static int gpio_wdt_init(wb_wdt_priv_t *priv, wb_wdt_device_t *wb_wdt_device) +{ + struct device *dev; + gpio_wdt_info_t *gpio_wdt; + enum of_gpio_flags flags; + uint32_t f = 0; + int ret; + + dev = priv->dev; + gpio_wdt = &priv->gpio_wdt; + + if (dev->of_node) { + gpio_wdt->gpio = of_get_gpio_flags(dev->of_node, 0, &flags); + } else { + gpio_wdt->gpio = wb_wdt_device->wdt_config_mode.gpio_wdt.gpio; + flags = wb_wdt_device->wdt_config_mode.gpio_wdt.flags; + } + if (!gpio_is_valid(gpio_wdt->gpio)) { + dev_err(dev, "gpio is invalid.\n"); + return gpio_wdt->gpio; + } + + gpio_wdt->active_low = flags & OF_GPIO_ACTIVE_LOW; + + if(priv->hw_algo == HW_ALGO_TOGGLE) { + f = GPIOF_IN; + } else { + f = gpio_wdt->active_low ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; + } + + ret = devm_gpio_request_one(dev, gpio_wdt->gpio, f, + dev_name(dev)); + if (ret) { + dev_err(dev, "devm_gpio_request_one failed.\n"); + return ret; + } + + gpio_wdt->state = gpio_wdt->active_low; + gpio_direction_output(gpio_wdt->gpio, gpio_wdt->state); + + WDT_VERBOSE("active_low:%d\n", gpio_wdt->active_low); + return 0; +} + +static ssize_t set_wdt_sysfs_value(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + wb_wdt_priv_t *priv = dev_get_drvdata(dev); + int ret, val; + + val = 0; + sscanf(buf, "%d", &val); + WDT_VERBOSE("set wdt, val:%d.\n", val); + + if (val < 0 || val > 255) { + WDT_ERROR("set wdt val %d failed.\n", val); + return -EINVAL; + } + + mutex_lock(&priv->update_lock); + + ret = wb_wdt_enable_ctrl(priv, val); + if (ret < 0) { + WDT_ERROR("set wdt sysfs value:%u failed.\n", val); + goto fail; + } + + WDT_VERBOSE("set wdt sysfs value:%u successed.\n", val); + mutex_unlock(&priv->update_lock); + return count; + +fail: + mutex_unlock(&priv->update_lock); + return ret; +} + +static ssize_t show_wdt_sysfs_value(struct device *dev, + struct device_attribute *da, char *buf) +{ + wb_wdt_priv_t *priv = dev_get_drvdata(dev); + uint8_t val, status; + int ret; + + mutex_lock(&priv->update_lock); + + ret = wb_wdt_read(priv->priv_func_mode, priv->config_dev_name, + priv->enable_reg, &val, ONE_BYTE); + if (ret < 0) { + dev_err(priv->dev, "read wdt enable reg val error.\n"); + goto fail; + } + + val &= priv->enable_mask; + if (val == priv->enable_val) { + status = WDT_ON; + } else if(val == priv->disable_val) { + status = WDT_OFF; + } else { + WDT_ERROR("enable reg read val not match set val, read val:%u, mask:%u, enable_val:%u, disable_val:%u", + val, priv->enable_mask, priv->enable_val, priv->disable_val); + ret = -EIO; + goto fail; + } + + WDT_VERBOSE("read_val:%u, mask:%u, enable_val:%u, disable_val:%u, status:%u", + val, priv->enable_mask, priv->enable_val, priv->disable_val, status); + + mutex_unlock(&priv->update_lock); + return sprintf(buf, "%u\n", status); + +fail: + mutex_unlock(&priv->update_lock); + return ret; +} + +static SENSOR_DEVICE_ATTR(wdt_status, S_IRUGO | S_IWUSR, show_wdt_sysfs_value, set_wdt_sysfs_value, 0); + +static struct attribute *wdt_sysfs_attrs[] = { + &sensor_dev_attr_wdt_status.dev_attr.attr, + NULL +}; + +static const struct attribute_group wdt_sysfs_group = { + .attrs = wdt_sysfs_attrs, +}; + +struct wdt_attr_match_group { + uint8_t index; + const struct attribute_group *attr_group_ptr; +}; + +static struct wdt_attr_match_group g_wdt_attr_match[] = { + {0, &wdt_sysfs_group}, +}; + +static const struct attribute_group *wdt_get_attr_group(uint32_t index) +{ + int i; + struct wdt_attr_match_group *group; + + for (i = 0; i < ARRAY_SIZE(g_wdt_attr_match); i++) { + group = &g_wdt_attr_match[i]; + if (index == group->index) { + WDT_VERBOSE("get wdt attr, index:%u.\n", index); + return group->attr_group_ptr; + } + } + + return NULL; +} + +static int wb_wdt_probe(struct platform_device *pdev) +{ + wb_wdt_priv_t *priv; + int ret; + const char *algo; + wb_wdt_device_t *wb_wdt_device; + + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) { + dev_err(&pdev->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + platform_set_drvdata(pdev, priv); + + if (pdev->dev.of_node) { + ret = 0; + ret += of_property_read_string(pdev->dev.of_node, "config_dev_name", &priv->config_dev_name); + ret += of_property_read_string(pdev->dev.of_node, "hw_algo", &algo); + ret += of_property_read_u8(pdev->dev.of_node, "config_mode", &priv->config_mode); + ret += of_property_read_u8(pdev->dev.of_node, "priv_func_mode", &priv->priv_func_mode); + ret += of_property_read_u8(pdev->dev.of_node, "enable_val", &priv->enable_val); + ret += of_property_read_u8(pdev->dev.of_node, "disable_val", &priv->disable_val); + ret += of_property_read_u8(pdev->dev.of_node, "enable_mask", &priv->enable_mask); + ret += of_property_read_u32(pdev->dev.of_node, "enable_reg", &priv->enable_reg); + ret += of_property_read_u32(pdev->dev.of_node, "timeout_cfg_reg", &priv->timeout_cfg_reg); + ret += of_property_read_u32(pdev->dev.of_node,"hw_margin_ms", &priv->hw_margin); + ret += of_property_read_u8(pdev->dev.of_node,"feed_wdt_type", &priv->feed_wdt_type); + ret += of_property_read_u32(pdev->dev.of_node,"timer_accuracy", &priv->timer_accuracy); + if (ret != 0) { + dev_err(&pdev->dev, "Failed to priv dts.\n"); + return -ENXIO; + } + + priv->sysfs_index = SYSFS_NO_CFG; + of_property_read_u8(pdev->dev.of_node,"sysfs_index", &priv->sysfs_index); + + priv->timeleft_cfg_reg = priv->timeout_cfg_reg; + of_property_read_u32(pdev->dev.of_node,"timeleft_cfg_reg", &priv->timeleft_cfg_reg); + } else { + if (pdev->dev.platform_data == NULL) { + dev_err(&pdev->dev, "Failed to get platform data config.\n"); + return -ENXIO; + } + wb_wdt_device = pdev->dev.platform_data; + priv->config_dev_name = wb_wdt_device->config_dev_name; + algo = wb_wdt_device->hw_algo; + priv->config_mode = wb_wdt_device->config_mode; + priv->priv_func_mode = wb_wdt_device->priv_func_mode; + priv->enable_val = wb_wdt_device->enable_val; + priv->disable_val = wb_wdt_device->disable_val; + priv->enable_mask = wb_wdt_device->enable_mask; + priv->enable_reg = wb_wdt_device->enable_reg; + priv->timeout_cfg_reg = wb_wdt_device->timeout_cfg_reg; + priv->hw_margin = wb_wdt_device->hw_margin; + priv->timer_accuracy = wb_wdt_device->timer_accuracy; + priv->feed_wdt_type = wb_wdt_device->feed_wdt_type; + priv->sysfs_index = wb_wdt_device->sysfs_index; + priv->timeleft_cfg_reg = wb_wdt_device->timeleft_cfg_reg; + } + + if (!strcmp(algo, "toggle")) { + priv->hw_algo = HW_ALGO_TOGGLE; + } else if (!strcmp(algo, "level")) { + priv->hw_algo = HW_ALGO_LEVEL; + } else { + dev_err(&pdev->dev, "hw_algo config error.must be toggle or level.\n"); + return -EINVAL; + } + + WDT_VERBOSE("config_dev_name:%s, config_mode:%u, priv_func_mode:%u, enable_reg:0x%x, timeout_cfg_reg:0x%x\n", + priv->config_dev_name, priv->config_mode, priv->priv_func_mode, priv->enable_reg, priv->timeout_cfg_reg); + WDT_VERBOSE("timeout_cfg_reg:0x%x, enable_val:%u, disable_val:%u, enable_mask:%u, hw_margin:%u, feed_wdt_type:%u\n", + priv->timeleft_cfg_reg, priv->enable_val, priv->disable_val, priv->enable_mask, priv->hw_margin, priv->feed_wdt_type); + + priv->dev = &pdev->dev; + if (priv->config_mode == GPIO_FEED_WDT_MODE) { + ret = gpio_wdt_init(priv, wb_wdt_device); + if (ret < 0) { + dev_err(&pdev->dev, "init gpio mode wdt failed.\n"); + return -ENXIO; + } + } else if (priv->config_mode == LOGIC_FEED_WDT_MODE) { + ret = logic_wdt_init(priv, wb_wdt_device); + if (ret < 0) { + dev_err(&pdev->dev, "init func mode wdt failed.\n"); + return -ENXIO; + } + } else { + dev_err(&pdev->dev, "unsupport %u config_mode, dts configure error.\n", + priv->config_mode); + return -ENXIO; + } + + switch (priv->feed_wdt_type) { + case WATCHDOG_DEVICE_TYPE: + ret = watchdog_device_cfg(priv); + break; + case HRTIMER_TYPE: + ret = hrtimer_cfg(priv, wb_wdt_device); + break; + case THREAD_TYPE: + ret = thread_timer_create(priv, wb_wdt_device); + break; + default: + dev_err(&pdev->dev, "timer type %u unsupport.\n", priv->feed_wdt_type); + return -EINVAL; + } + if (ret < 0) { + dev_err(&pdev->dev, "init timer feed_wdt_type %u failed.\n", priv->feed_wdt_type); + return -ENXIO; + } + + dev_info(&pdev->dev, "register %s mode, config_mode %u, func_mode %u, %u ms overtime wdt success\n", + algo, priv->config_mode, priv->priv_func_mode, priv->hw_margin); + + if (priv->sysfs_index != SYSFS_NO_CFG) { + + priv->sysfs_group = wdt_get_attr_group(priv->sysfs_index); + if (priv->sysfs_group) { + ret = sysfs_create_group(&pdev->dev.kobj, priv->sysfs_group); + if (ret != 0) { + dev_err(&pdev->dev, "sysfs_create_group failed. ret:%d.\n", ret); + return -ENOMEM; + } + dev_info(&pdev->dev, "sysfs create group success\n"); + } else { + dev_err(&pdev->dev, "failed to find %u index wdt, return NULL.\n", priv->sysfs_index); + return -ENOMEM; + } + + mutex_init(&priv->update_lock); + + dev_info(&pdev->dev, "register %u index wdt sysfs success." ,priv->sysfs_index); + } + + return 0; +} + +static void unregister_action(struct platform_device *pdev) +{ + wb_wdt_priv_t *priv = platform_get_drvdata(pdev); + gpio_wdt_info_t *gpio_wdt; + logic_wdt_info_t *logic_wdt; + int ret; + + ret = wb_wdt_enable_ctrl(priv, WDT_OFF); + if (ret < 0) { + dev_err(&pdev->dev, "remove disable wdt failed.\n"); + } + + if (priv->sysfs_index != SYSFS_NO_CFG) { + sysfs_remove_group(&pdev->dev.kobj, priv->sysfs_group); + } + + if (priv->feed_wdt_type == HRTIMER_TYPE) { + hrtimer_cancel(&priv->hrtimer); + } else if (priv->feed_wdt_type == THREAD_TYPE) { + kthread_stop(priv->thread); + priv->thread = NULL; + } else { + WDT_VERBOSE("wdd type, do nothing.\n"); + } + + if (priv->config_mode == GPIO_FEED_WDT_MODE) { + gpio_wdt = &priv->gpio_wdt; + gpio_set_value_cansleep(gpio_wdt->gpio, !gpio_wdt->active_low); + + if (priv->hw_algo == HW_ALGO_TOGGLE) { + gpio_direction_input(gpio_wdt->gpio); + } + } else { + logic_wdt = &priv->logic_wdt; + logic_wdt->state_val = !logic_wdt->state_val; + ret = wb_wdt_write(logic_wdt->logic_func_mode, logic_wdt->feed_dev_name, + logic_wdt->feed_reg, &logic_wdt->state_val, ONE_BYTE); + if (ret < 0) { + dev_err(&pdev->dev, "set wdt control reg error.\n"); + } + } + + return; +} + +static int wb_wdt_remove(struct platform_device *pdev) +{ + WDT_VERBOSE("enter remove wdt.\n"); + unregister_action(pdev); + dev_info(&pdev->dev, "remove wdt finish.\n"); + + return 0; +} + +static void wb_wdt_shutdown(struct platform_device *pdev) +{ + WDT_VERBOSE("enter shutdown wdt.\n"); + unregister_action(pdev); + dev_info(&pdev->dev, "shutdown wdt finish.\n"); + + return; +} + +static const struct of_device_id wb_wdt_dt_ids[] = { + { .compatible = "wb_wdt", }, + { } +}; +MODULE_DEVICE_TABLE(of, wb_wdt_dt_ids); + +static struct platform_driver wb_wdt_driver = { + .driver = { + .name = "wb_wdt", + .of_match_table = wb_wdt_dt_ids, + }, + .probe = wb_wdt_probe, + .remove = wb_wdt_remove, + .shutdown = wb_wdt_shutdown, +}; + +#ifdef CONFIG_GPIO_WATCHDOG_ARCH_INITCALL +static int __init wb_wdt_init(void) +{ + return platform_driver_register(&wb_wdt_driver); +} +arch_initcall(wb_wdt_init); +#else +module_platform_driver(wb_wdt_driver); +#endif + +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("watchdog driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h new file mode 100644 index 0000000000..10c30e13f9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_wdt.h @@ -0,0 +1,46 @@ +#ifndef __WB_WDT_H__ +#define __WB_WDT_H__ + +#include + +#define SYSFS_NO_CFG (0xff) + +typedef struct gpio_wdt_info_s { + int gpio; + enum of_gpio_flags flags; + bool active_low; + bool state; +}gpio_wdt_info_t; + +typedef struct logic_wdt_info_s { + const char *feed_dev_name; + uint8_t logic_func_mode; + uint32_t feed_reg; + uint8_t active_val; + uint8_t state_val; +}logic_wdt_info_t; + +typedef struct wb_wdt_device_s { + int device_flag; + const char *config_dev_name; + uint8_t config_mode; + const char *hw_algo; + uint8_t enable_val; + uint8_t disable_val; + uint8_t enable_mask; + uint8_t priv_func_mode; + uint8_t feed_wdt_type; + uint32_t enable_reg; + uint32_t timeout_cfg_reg; + uint32_t timeleft_cfg_reg; + uint32_t hw_margin; + uint32_t feed_time; + uint32_t timer_accuracy; + union { + gpio_wdt_info_t gpio_wdt; + logic_wdt_info_t logic_wdt; + } wdt_config_mode; + uint8_t sysfs_index; +} wb_wdt_device_t; + +#endif diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c new file mode 100644 index 0000000000..edc12d34b6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/modules/wb_xdpe132g5c.c @@ -0,0 +1,574 @@ +/* + * xdpe132g5c_i2c_drv.c + * + * This module create sysfs to set AVS and create hwmon to get out power + * through xdpe132g5c I2C address. + * + * History + * [Version] [Date] [Description] + * * v1.0 2021-09-17 Initial version + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WB_I2C_RETRY_SLEEP_TIME (10000) /* 10ms */ +#define WB_I2C_RETRY_TIME (10) +#define WB_XDPE_I2C_PAGE_ADDR (0xff) +#define WB_XDPE_I2C_VOUT_MODE (0x40) +#define WB_XDPE_I2C_VOUT_COMMAND (0x42) +#define WB_XDPE_I2C_VOUT_PAGE (0x06) +#define WB_XDPE_VOUT_MAX_THRESHOLD ((0xFFFF * 1000L * 1000L) / (256)) +#define WB_XDPE_VOUT_MIN_THRESHOLD (0) + +static int g_wb_xdpe_debug = 0; +static int g_wb_xdpe_error = 0; + +module_param(g_wb_xdpe_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_xdpe_error, int, S_IRUGO | S_IWUSR); + +#define WB_XDPE_VERBOSE(fmt, args...) do { \ + if (g_wb_xdpe_debug) { \ + printk(KERN_INFO "[WB_XDPE][VER][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_XDPE_ERROR(fmt, args...) do { \ + if (g_wb_xdpe_error) { \ + printk(KERN_ERR "[WB_XDPE][ERR][func:%s line:%d]\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +struct xdpe_data { + struct i2c_client *client; + struct device *hwmon_dev; + struct mutex update_lock; + long vout_max; + long vout_min; +}; + +typedef struct xdpe_vout_data_s { + u8 vout_mode; + int vout_precision; +} xdpe_vout_data_t; + +static xdpe_vout_data_t g_xdpe_vout_group[] = { + {.vout_mode = 0x18, .vout_precision = 256}, + {.vout_mode = 0x17, .vout_precision = 512}, + {.vout_mode = 0x16, .vout_precision = 1024}, + {.vout_mode = 0x15, .vout_precision = 2048}, + {.vout_mode = 0x14, .vout_precision = 4096}, +}; + +static s32 wb_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_read_byte_data(client, command); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static s32 wb_i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command, u8 value) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_write_byte_data(client, command, value); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static s32 wb_i2c_smbus_read_word_data(const struct i2c_client *client, u8 command) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_read_word_data(client, command); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static s32 wb_i2c_smbus_write_word_data(const struct i2c_client *client, u8 command, + u16 value) +{ + int i; + s32 ret; + + for (i = 0; i < WB_I2C_RETRY_TIME; i++) { + ret = i2c_smbus_write_word_data(client, command, value); + if (ret >= 0) { + return ret; + } + usleep_range(WB_I2C_RETRY_SLEEP_TIME, WB_I2C_RETRY_SLEEP_TIME + 1); + } + return ret; +} + +static long calc_power_linear11_data(int data) +{ + s16 exponent; + s32 mantissa; + long val; + + exponent = ((s16)data) >> 11; + mantissa = ((s16)((data & 0x7ff) << 5)) >> 5; + val = mantissa; + val = val * 1000L * 1000L; + + if (exponent >= 0) { + val <<= exponent; + } else { + val >>= -exponent; + } + return val; +} + +static int read_xdpe_power_value(const struct i2c_client *client, u8 page, u8 reg, long *value) +{ + int ret, data; + + ret = wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, page); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe page%u failed, ret: %d\n", client->adapter->nr, + client->addr, page, ret); + return ret; + } + data = wb_i2c_smbus_read_word_data(client, reg); + if (data < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe page%u reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, page, reg, data); + return data; + } + *value = calc_power_linear11_data(data); + WB_XDPE_VERBOSE("%d-%04x: page%u reg: 0x%x rd_data: 0x%x, decode linear11 value: %ld\n", + client->adapter->nr, client->addr, page, reg, data, *value); + return 0; +} + +static ssize_t xdpe_power_value_show(struct device *dev, struct device_attribute *da, + char *buf) +{ + int ret, ori_page; + u16 sensor_h, sensor_l; + u8 page, reg; + struct sensor_device_attribute *attr; + struct i2c_client *client; + struct xdpe_data *data; + long value1, value2; + + data = dev_get_drvdata(dev); + client = data->client; + attr = to_sensor_dev_attr(da); + sensor_h = ((attr->index) >> 16) & 0xffff; + sensor_l = (attr->index) & 0xffff; + + mutex_lock(&data->update_lock); + + ori_page = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_PAGE_ADDR); + if (ori_page < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe origin page failed, ret: %d\n", client->adapter->nr, + client->addr, ori_page); + mutex_unlock(&data->update_lock); + return ori_page; + } + value1 = 0; + value2 = 0; + + if (sensor_h) { + page = (sensor_h >> 8) & 0xff; + reg = sensor_h & 0xff; + ret = read_xdpe_power_value(client, page, reg, &value1); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe sensor high sensor page%u reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, page, reg, ret); + goto error; + } + WB_XDPE_VERBOSE("%d-%04x: read xdpe sensor high sensor page%u reg: 0x%x success, value: %ld\n", + client->adapter->nr, client->addr, page, reg, value1); + } + + page = (sensor_l >> 8) & 0xff; + reg = sensor_l & 0xff; + ret = read_xdpe_power_value(client, page, reg, &value2); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe sensor low sensor page%u reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, page, reg, ret); + goto error; + } + WB_XDPE_VERBOSE("%d-%04x: read xdpe sensor low sensor page%u reg: 0x%x success, value: %ld\n", + client->adapter->nr, client->addr, page, reg, value2); + + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return snprintf(buf, PAGE_SIZE, "%ld\n", value1 + value2); +error: + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return ret; +} + +static int xdpe_get_vout_precision(const struct i2c_client *client, int *vout_precision) +{ + int i, vout_mode, a_size; + + vout_mode = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_VOUT_MODE); + if (vout_mode < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe vout mode reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_MODE, vout_mode); + return vout_mode; + } + + a_size = ARRAY_SIZE(g_xdpe_vout_group); + for (i = 0; i < a_size; i++) { + if (g_xdpe_vout_group[i].vout_mode == vout_mode) { + *vout_precision = g_xdpe_vout_group[i].vout_precision; + WB_XDPE_VERBOSE("%d-%04x: match, vout mode: 0x%x, precision: %d\n", + client->adapter->nr, client->addr, vout_mode, *vout_precision); + break; + } + } + if (i == a_size) { + WB_XDPE_ERROR("%d-%04x: invalid vout mode: 0x%x\n",client->adapter->nr, client->addr, + vout_mode); + return -EINVAL; + } + return 0; +} + +static ssize_t xdpe_avs_vout_show(struct device *dev, struct device_attribute *da, char *buf) +{ + int ret, ori_page, vout_cmd, vout_precision; + struct i2c_client *client; + struct xdpe_data *data; + long vout; + + client = to_i2c_client(dev); + data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + ori_page = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_PAGE_ADDR); + if (ori_page < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe origin page failed, ret: %d\n", client->adapter->nr, + client->addr, ori_page); + mutex_unlock(&data->update_lock); + return ori_page; + } + + ret = wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, WB_XDPE_I2C_VOUT_PAGE); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe avs vout page%u failed, ret: %d\n", client->adapter->nr, + client->addr, WB_XDPE_I2C_VOUT_PAGE, ret); + goto error; + } + + ret = xdpe_get_vout_precision(client, &vout_precision); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: get xdpe avs vout precision failed, ret: %d\n", + client->adapter->nr, client->addr, ret); + goto error; + } + + vout_cmd = wb_i2c_smbus_read_word_data(client, WB_XDPE_I2C_VOUT_COMMAND); + if (vout_cmd < 0) { + ret = vout_cmd; + WB_XDPE_ERROR("%d-%04x: read xdpe vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_COMMAND, ret); + goto error; + } + + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + + vout = vout_cmd * 1000L * 1000L / vout_precision; + WB_XDPE_VERBOSE("%d-%04x: vout: %ld, vout_cmd: 0x%x, precision: %d\n", client->adapter->nr, + client->addr, vout, vout_cmd, vout_precision); + return snprintf(buf, PAGE_SIZE, "%ld\n", vout); +error: + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t xdpe_avs_vout_store(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int ret, ori_page, vout_cmd, vout_cmd_set, vout_precision; + struct i2c_client *client; + struct xdpe_data *data; + long vout, vout_max, vout_min; + + client = to_i2c_client(dev); + ret = kstrtol(buf, 10, &vout); + if (ret) { + WB_XDPE_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + + data = i2c_get_clientdata(client); + vout_max = data->vout_max; + vout_min = data->vout_min; + if ((vout > vout_max) || (vout < vout_min)) { + WB_XDPE_ERROR("%d-%04x: vout value: %ld, out of range [%ld, %ld] \n", client->adapter->nr, + client->addr, vout, vout_min, vout_max); + return -EINVAL; + } + + mutex_lock(&data->update_lock); + + ori_page = wb_i2c_smbus_read_byte_data(client, WB_XDPE_I2C_PAGE_ADDR); + if (ori_page < 0) { + WB_XDPE_ERROR("%d-%04x: read xdpe origin page failed, ret: %d\n", client->adapter->nr, + client->addr, ori_page); + mutex_unlock(&data->update_lock); + return ori_page; + } + + ret = wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, WB_XDPE_I2C_VOUT_PAGE); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe avs vout page%u failed, ret: %d\n", client->adapter->nr, + client->addr, WB_XDPE_I2C_VOUT_PAGE, ret); + goto error; + } + + ret = xdpe_get_vout_precision(client, &vout_precision); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: get xdpe avs vout precision failed, ret: %d\n", + client->adapter->nr, client->addr, ret); + goto error; + } + + vout_cmd_set = (vout * vout_precision) / (1000L * 1000L); + if (vout_cmd_set > 0xffff) { + WB_XDPE_ERROR("%d-%04x: invalid value, vout %ld, vout_precision: %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, vout, vout_precision, vout_cmd_set); + ret = -EINVAL; + goto error; + } + ret = wb_i2c_smbus_write_word_data(client, WB_XDPE_I2C_VOUT_COMMAND, vout_cmd_set); + if (ret < 0) { + WB_XDPE_ERROR("%d-%04x: set xdpe vout cmd reg: 0x%x, value: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_COMMAND, vout_cmd_set, ret); + goto error; + } + + vout_cmd = wb_i2c_smbus_read_word_data(client, WB_XDPE_I2C_VOUT_COMMAND); + if (vout_cmd < 0) { + ret = vout_cmd; + WB_XDPE_ERROR("%d-%04x: read xdpe vout command reg: 0x%x failed, ret: %d\n", + client->adapter->nr, client->addr, WB_XDPE_I2C_VOUT_COMMAND, ret); + goto error; + } + if (vout_cmd != vout_cmd_set) { + ret = -EIO; + WB_XDPE_ERROR("%d-%04x: vout cmd value check error, vout cmd read: 0x%x, vout cmd set: 0x%x\n", + client->adapter->nr, client->addr, vout_cmd, vout_cmd_set); + goto error; + + } + + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + WB_XDPE_VERBOSE("%d-%04x: set vout cmd success, vout %ld, vout_precision: %d, vout_cmd_set: 0x%x\n", + client->adapter->nr, client->addr, vout, vout_precision, vout_cmd_set); + return count; +error: + wb_i2c_smbus_write_byte_data(client, WB_XDPE_I2C_PAGE_ADDR, ori_page); + mutex_unlock(&data->update_lock); + return ret; +} + +static ssize_t xdpe_avs_vout_max_show(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client; + struct xdpe_data *data; + long vout_max; + + client = to_i2c_client(dev); + data = i2c_get_clientdata(client); + vout_max = data->vout_max; + return snprintf(buf, PAGE_SIZE, "%ld\n", vout_max); +} + +static ssize_t xdpe_avs_vout_max_store(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int ret; + struct i2c_client *client; + struct xdpe_data *data; + long vout_max; + + client = to_i2c_client(dev); + ret = kstrtol(buf, 10, &vout_max); + if (ret) { + WB_XDPE_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + WB_XDPE_VERBOSE("%d-%04x: vout max threshold: %ld", client->adapter->nr, client->addr, + vout_max); + data = i2c_get_clientdata(client); + data->vout_max = vout_max; + return count; +} + +static ssize_t xdpe_avs_vout_min_show(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client; + struct xdpe_data *data; + long vout_min; + + client = to_i2c_client(dev); + data = i2c_get_clientdata(client); + vout_min = data->vout_min; + return snprintf(buf, PAGE_SIZE, "%ld\n", vout_min); +} + +static ssize_t xdpe_avs_vout_min_store(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int ret; + struct i2c_client *client; + struct xdpe_data *data; + long vout_min; + + client = to_i2c_client(dev); + ret = kstrtol(buf, 10, &vout_min); + if (ret) { + WB_XDPE_ERROR("%d-%04x: invalid value: %s \n", client->adapter->nr, client->addr, buf); + return -EINVAL; + } + WB_XDPE_VERBOSE("%d-%04x: vout min threshold: %ld", client->adapter->nr, client->addr, + vout_min); + data = i2c_get_clientdata(client); + data->vout_min = vout_min; + return count; +} + +/* xdpe hwmon */ +static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO ,xdpe_power_value_show, NULL, 0x072c); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO ,xdpe_power_value_show, NULL, 0x0b2c); +static SENSOR_DEVICE_ATTR(power3_input, S_IRUGO ,xdpe_power_value_show, NULL, 0x072c0b2c); + +static struct attribute *xdpe_hwmon_attrs[] = { + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_power3_input.dev_attr.attr, + NULL +}; +ATTRIBUTE_GROUPS(xdpe_hwmon); + +/* xdpe sysfs */ +static SENSOR_DEVICE_ATTR(avs_vout, S_IRUGO | S_IWUSR, xdpe_avs_vout_show, xdpe_avs_vout_store, 0); +static SENSOR_DEVICE_ATTR(avs_vout_max, S_IRUGO | S_IWUSR, xdpe_avs_vout_max_show, xdpe_avs_vout_max_store, 0); +static SENSOR_DEVICE_ATTR(avs_vout_min, S_IRUGO | S_IWUSR, xdpe_avs_vout_min_show, xdpe_avs_vout_min_store, 0); + +static struct attribute *xdpe132g5c_sysfs_attrs[] = { + &sensor_dev_attr_avs_vout.dev_attr.attr, + &sensor_dev_attr_avs_vout_max.dev_attr.attr, + &sensor_dev_attr_avs_vout_min.dev_attr.attr, + NULL, +}; + +static const struct attribute_group xdpe132g5c_sysfs_attrs_group = { + .attrs = xdpe132g5c_sysfs_attrs, +}; + +static int xdpe132g5c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct xdpe_data *data; + int ret; + + WB_XDPE_VERBOSE("bus: %d, addr: 0x%02x do probe.\n", client->adapter->nr, client->addr); + data = devm_kzalloc(&client->dev, sizeof(struct xdpe_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "devm_kzalloc failed.\n"); + return -ENOMEM; + } + + data->client = client; + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + ret = sysfs_create_group(&client->dev.kobj, &xdpe132g5c_sysfs_attrs_group); + if (ret != 0) { + dev_err(&client->dev, "Create xdpe132g5c sysfs failed, ret: %d\n", ret); + return ret; + } + data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, + xdpe_hwmon_groups); + if (IS_ERR(data->hwmon_dev)) { + ret = PTR_ERR(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &xdpe132g5c_sysfs_attrs_group); + dev_err(&client->dev, "Failed to register xdpe hwmon device, ret: %d\n", ret); + return ret; + } + data->vout_max = WB_XDPE_VOUT_MAX_THRESHOLD; + data->vout_min = WB_XDPE_VOUT_MIN_THRESHOLD; + dev_info(&client->dev, "xdpe132g5c probe success\n"); + return 0; +} + +static int xdpe132g5c_remove(struct i2c_client *client) +{ + struct xdpe_data *data; + + WB_XDPE_VERBOSE("bus: %d, addr: 0x%02x do remove\n", client->adapter->nr, client->addr); + data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &xdpe132g5c_sysfs_attrs_group); + return 0; +} + +static const struct i2c_device_id xdpe132g5c_id[] = { + {"wb_xdpe132g5c", 0}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, xdpe132g5c_id); + +static const struct of_device_id __maybe_unused xdpe132g5c_of_match[] = { + {.compatible = "infineon,wb_xdpe132g5c"}, + {} +}; +MODULE_DEVICE_TABLE(of, xdpe132g5c_of_match); + +static struct i2c_driver wb_xdpe132g5c_driver = { + .driver = { + .name = "wb_xdpe132g5c", + .of_match_table = of_match_ptr(xdpe132g5c_of_match), + }, + .probe = xdpe132g5c_probe, + .remove = xdpe132g5c_remove, + .id_table = xdpe132g5c_id, +}; + +module_i2c_driver(wb_xdpe132g5c_driver); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); +MODULE_DESCRIPTION("I2C driver for Infineon XDPE132 family"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py new file mode 100755 index 0000000000..838e64f6b4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/auto_update.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 + +try: + import os + import json + import logging + import sys + from sonic_py_common import device_info + from sonic_platform.platform import Platform +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + +PLATFORM_COMPONENTS_FILE = "platform_components.json" +CHASSIS_KEY = "chassis" +COMPONENT_KEY = "component" +FIRMWARE_KEY = "firmware" +VERSION_KEY = "version" +chassis_component_map = {} +current_chassis_component_map = {} +current_chassis = Platform().get_chassis() + + +def parse_component_section(section, component): + if not isinstance(component, dict): + logging.error("dictionary is expected: key=%s", COMPONENT_KEY) + return False + + if not component: + return False + + missing_key = None + chassis_component_map[section] = {} + + for key1, value1 in component.items(): + if not isinstance(value1, dict): + logging.error("dictionary is expected: key=%s", key1) + return False + + if value1: + if len(value1) < 1 or len(value1) > 3: + logging.error("unexpected number of records: key=%s", key1) + return False + + if FIRMWARE_KEY not in value1: + missing_key = FIRMWARE_KEY + break + + for key2, value2 in value1.items(): + if not isinstance(value2, str): + logging.error("string is expected: key=%s", key2) + return False + + chassis_component_map[section][key1] = value1 + + if missing_key is not None: + logging.error("\"%s\" key hasn't been found", missing_key) + return False + + return True + + +def parse_chassis_section(chassis): + if not isinstance(chassis, dict): + logging.error("dictionary is expected: key=%s", CHASSIS_KEY) + return False + + if not chassis: + logging.error("dictionary is empty: key=%s", CHASSIS_KEY) + return False + + if len(chassis) != 1: + logging.error("unexpected number of records: key=%s", CHASSIS_KEY) + return False + + for key, value in chassis.items(): + if not isinstance(value, dict): + logging.error("dictionary is expected: key=%s", key) + return False + + if not value: + logging.error("dictionary is empty: key=%s", key) + return False + + if COMPONENT_KEY not in value: + logging.error("\"%s\" key hasn't been found", COMPONENT_KEY) + return False + + if len(value) != 1: + logging.error("unexpected number of records: key=%s", key) + return False + + return parse_component_section(key, value[COMPONENT_KEY]) + + return False + + +def get_platform_components_path(): + PLATFORM_COMPONENTS_PATH_TEMPLATE = "/usr/share/sonic/device/{}/{}" + PLATFORM_COMPONENTS_FILE_PATH = PLATFORM_COMPONENTS_PATH_TEMPLATE.format( + device_info.get_platform(), PLATFORM_COMPONENTS_FILE) + return PLATFORM_COMPONENTS_FILE_PATH + + +def parse_platform_components(): + platform_components_path = get_platform_components_path() + with open(platform_components_path) as platform_components: + data = json.load(platform_components) + + if not isinstance(data, dict): + logging.error("dictionary is expected: key=root") + return False + + if not data: + logging.error("dictionary is empty: key=root") + return False + + if CHASSIS_KEY not in data: + logging.error("\"%s\" key hasn't been found", CHASSIS_KEY) + return False + + return parse_chassis_section(data[CHASSIS_KEY]) + + +def get_current_chassis_component_map(): + chassis_name = current_chassis.get_name() + current_chassis_component_map[chassis_name] = {} + + component_list = current_chassis.get_all_components() + for component in component_list: + component_name = component.get_name() + current_chassis_component_map[chassis_name][component_name] = component + + return current_chassis_component_map + + +def get_upgrade_dict(): + upgrade_dict = {} + firmware_version_current = "" + firmware_version_available = "" + + if not parse_platform_components(): + logging.error("Reading platform_components.json i, ion exception") + sys.exit(1) + + if not get_current_chassis_component_map(): + logging.error("Reading firmware i, ion from the driver is abnormal") + sys.exit(1) + + chassis_name = current_chassis.get_name() + diff_keys = set(chassis_component_map.keys()) ^ set(current_chassis_component_map.keys()) + if diff_keys: + logging.error("%s names mismatch: keys=%s", chassis_name, str(list(diff_keys))) + return None + + for chassis_name, component_map in current_chassis_component_map.items(): + for component_name, component in component_map.items(): + firmware_version_current = component.get_firmware_version() + if component_name in chassis_component_map[chassis_name]: + firmware_version_available = chassis_component_map[chassis_name][component_name][VERSION_KEY] + else: + logging.warning("can't find %s in %s", component_name, PLATFORM_COMPONENTS_FILE) + break + + if not os.path.exists(chassis_component_map[chassis_name][component_name][FIRMWARE_KEY]): + logging.error("%s does not exist", chassis_component_map[chassis_name][component_name][FIRMWARE_KEY]) + break + + if firmware_version_available != firmware_version_current: + upgrade_dict[component_name] = chassis_component_map[chassis_name][component_name][FIRMWARE_KEY] + + return upgrade_dict + + +def auto_upgrade(): + upgrade_result_dict = {} + chassis_name = current_chassis.get_name() + + upgrade_dict = get_upgrade_dict() + if not upgrade_dict: + logging.info("No firmware found for automatic upgrade") + return None + + component_map = current_chassis_component_map[chassis_name] + for value, path in upgrade_dict.items(): + status = component_map[value].install_firmware(path) + if status: + upgrade_result_dict[value] = "success" + logging.info("%s Upgrade Success", value) + else: + upgrade_result_dict[value] = "failed" + logging.error("%s Upgrade Failed", value) + return upgrade_result_dict + + +if __name__ == '__main__': + auto_upgrade() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py index 25874ddb82..a0a2ccaac9 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/avscontrol.py @@ -1,18 +1,22 @@ #!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -import click +import sys +import os import time -import traceback -from ragileutil import wait_docker, STARTMODULE, AVSUTIL -from rgutil.logutil import Logger +import syslog +import glob +import click +from platform_config import MAC_DEFAULT_PARAM +from platform_util import getSdkReg, write_sysfs, get_value, get_format_value -try: - from rest.rest import BMCMessage -except ImportError: - pass -CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) -logger = Logger("AVSCONTROL", syslog=True) +AVSCTROL_DEBUG_FILE = "/etc/.avscontrol_debug_flag" + +AVSCTROLERROR = 1 +AVSCTROLDEBUG = 2 + +debuglevel = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} class AliasedGroup(click.Group): @@ -20,72 +24,180 @@ class AliasedGroup(click.Group): rv = click.Group.get_command(self, ctx, cmd_name) if rv is not None: return rv - matches = [x for x in self.list_commands(ctx) if x.startswith(cmd_name)] + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] if not matches: return None - elif len(matches) == 1: + if len(matches) == 1: return click.Group.get_command(self, ctx, matches[0]) - ctx.fail("Too many matches: %s" % ", ".join(sorted(matches))) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None -def do_avs_ctrl(): - index = 0 - url = "/xyz/openbmc_project/hostchannel/attr/MacRov" - while True: - if ( - "avscontrol_restful" in STARTMODULE - and STARTMODULE["avscontrol_restful"] == 1 - ): - try: - # for alibmc rest.py has define get_macrov_value function - get_macrov_value = getattr(BMCMessage(), "get_macrov_value", None) - if callable(get_macrov_value): - macrov_value = int(get_macrov_value()) - else: - macrov_value = int(BMCMessage().getBmcValue(url)) - if macrov_value >= 0: - break - except Exception as e: - time.sleep(2) - continue +def avscontrol_debug(s): + if AVSCTROLDEBUG & debuglevel: + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def avscontrol_error(s): + if AVSCTROLERROR & debuglevel: + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def avserror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def avsinfo(s): + syslog.openlog("AVSCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def debug_init(): + global debuglevel + if os.path.exists(AVSCTROL_DEBUG_FILE): + debuglevel = debuglevel | AVSCTROLDEBUG | AVSCTROLERROR + else: + debuglevel = debuglevel & ~(AVSCTROLDEBUG | AVSCTROLERROR) + + +def set_avs_value_sysfs(conf, dcdc_value): + msg = "" + formula = conf.get("formula", None) + loc = conf.get("loc") + locations = glob.glob(loc) + if len(locations) == 0: + msg = "avs sysfs loc: %s not found" % loc + avscontrol_error(msg) + return False, msg + sysfs_loc = locations[0] + avscontrol_debug("set_avs_value_sysfs, loc: %s, origin dcdc value: %s, formula: %s" % + (sysfs_loc, dcdc_value, formula)) + if formula is not None: + dcdc_value = get_format_value(formula % (dcdc_value)) + wr_val = str(dcdc_value) + avscontrol_debug("set_avs_value_sysfs, write val: %s" % wr_val) + ret, log = write_sysfs(sysfs_loc, wr_val) + if ret is False: + msg = "set_avs_value_sysfs failed, msg: %s" % log + avscontrol_error(msg) + return ret, msg + + +def set_avs_value(avs_conf, dcdc_value): + set_avs_way = avs_conf.get("set_avs", {}).get("gettype") + if set_avs_way != "sysfs": + msg = "unsupport set avs value type: %s" % set_avs_way + avscontrol_error(msg) + return False, msg + ret, msg = set_avs_value_sysfs(avs_conf["set_avs"], dcdc_value) + return ret, msg + + +def get_dcdc_value(avs_conf, rov_value): + msg = "" + mac_avs_param = avs_conf.get("mac_avs_param", {}) + if rov_value not in mac_avs_param.keys(): + if avs_conf["type"] == 0: + msg = "VID:0x%x out of range, voltage regulate stop" % rov_value + avsinfo(msg) + return False, msg + dcdc_value = mac_avs_param[avs_conf["default"]] + avsinfo("VID:0x%x out of range, use default VID:0x%x" % (rov_value, dcdc_value)) + else: + dcdc_value = mac_avs_param[rov_value] + return True, dcdc_value + + +def get_rov_value_cpld(avs_conf): + cpld_avs_config = avs_conf["cpld_avs"] + return get_value(cpld_avs_config) + + +def get_rov_value_sdk(avs_conf): + name = avs_conf["sdkreg"] + ret, status = getSdkReg(name) + if ret is False: + return False, status + status = int(status, 16) + # shift operation + if avs_conf["sdktype"] != 0: + status = (status >> avs_conf["macregloc"]) & avs_conf["mask"] + macavs = status + return True, macavs + + +def doAvsCtrol_single(avs_conf): + try: + avs_name = avs_conf.get("name") + rov_source = avs_conf["rov_source"] + if rov_source == 0: + ret, rov_value = get_rov_value_cpld(avs_conf) # get rov from cpld reg else: - if AVSUTIL.mac_adj(): - break - - index += 1 - if index >= 10: - logger.error("%%DEV_MONITOR-AVS: MAC Voltage adjust failed.") - exit(-1) - logger.info("%%AVSCONTROL success") - exit(0) + ret, rov_value = get_rov_value_sdk(avs_conf) # get rov from sdk reg + if ret is False: + msg = "%s get rov_value failed, msg: %s" % (avs_name, rov_value) + avscontrol_error(msg) + return False, msg + avscontrol_debug("%s rov_value: 0x%x" % (avs_name, rov_value)) + ret, dcdc_value = get_dcdc_value(avs_conf, rov_value) + if ret is False: + msg = "%s get output voltage value failed, msg: %s" % (avs_name, dcdc_value) + avscontrol_error(msg) + return False, msg + ret, msg = set_avs_value(avs_conf, dcdc_value) + return ret, msg + except Exception as e: + msg = "%s avscontrol raise exception, msg: %s" % (avs_name, str(e)) + avscontrol_error(msg) + return False, msg -def run(interval): - while True: - try: - if wait_docker(timeout=0) == True: - time.sleep(10) # w10s - do_avs_ctrl() - time.sleep(interval) - except Exception as e: - traceback.print_exc() - print(e) +def doAvsCtrol(avs_conf): + retry_time = avs_conf.get("retry", 10) + for i in range(retry_time): + debug_init() + ret, log = doAvsCtrol_single(avs_conf) + if ret is True: + return True, log + time.sleep(1) + return False, log + + +def run(): + # wait 30s for device steady + time.sleep(30) + errcnt = 0 + msg = "" + for item in MAC_DEFAULT_PARAM: + status, log = doAvsCtrol(item) + if status is False: + errcnt += 1 + msg += log + + if errcnt == 0: + avsinfo("%%AVSCONTROL success") + sys.exit(0) + avserror("%%DEV_MONITOR-AVS: MAC Voltage adjust failed.") + avserror("%%DEV_MONITOR-AVS: errmsg: %s" % msg) + sys.exit(1) @click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) def main(): - """device operator""" - pass + '''device operator''' @main.command() def start(): - """start AVS control""" - logger.info("%%AVSCONTROL start") - interval = 5 - run(interval) + '''start AVS control''' + avsinfo("%%AVSCONTROL start") + run() -##device_i2c operation -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py new file mode 100755 index 0000000000..e13377b80f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/dev_monitor.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python3 +import sys +import os +import time +import syslog +import traceback +import click +from platform_config import DEV_MONITOR_PARAM +from platform_util import io_rd, wbi2cget + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +DEVMONITOR_DEBUG_FILE = "/etc/.devmonitor_debug_flag" + +debuglevel = 0 + + +def debug_init(): + global debuglevel + if os.path.exists(DEVMONITOR_DEBUG_FILE): + debuglevel = 1 + else: + debuglevel = 0 + + +def devwarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def devcriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def deverror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def devinfo(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def devdebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if debuglevel == 1: + syslog.openlog("DEVMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class DevMonitor(): + + def getpresentstatus(self, param): + try: + ret = {} + ret["status"] = '' + gettype = param.get('gettype') + presentbit = param.get('presentbit') + okval = param.get('okval') + if gettype == "io": + io_addr = param.get('io_addr') + val = io_rd(io_addr) + if val is None: + ret["status"] = "NOT OK" + return ret + retval = val + else: + bus = param.get('bus') + loc = param.get('loc') + offset = param.get('offset') + ind, val = wbi2cget(bus, loc, offset) + if ind is not True: + ret["status"] = "NOT OK" + return ret + retval = val + val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit + if val_t != okval: + ret["status"] = "ABSENT" + else: + ret["status"] = "PRESENT" + except Exception as e: + ret["status"] = "NOT OK" + deverror("getpresentstatus error") + deverror(str(e)) + return ret + + def removeDev(self, bus, loc): + cmd = "echo 0x%02x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath): + os.system(cmd) + + def addDev(self, name, bus, loc): + if name == "lm75": + time.sleep(0.1) + cmd = "echo %s 0x%02x > /sys/bus/i2c/devices/i2c-%d/new_device" % (name, loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath) is False: + os.system(cmd) + + def checkattr(self, bus, loc, attr): + try: + attrpath = "/sys/bus/i2c/devices/%d-%04x/%s" % (bus, loc, attr) + if os.path.exists(attrpath): + return True + except Exception as e: + deverror("checkattr error") + deverror(str(e)) + return False + + def monitor(self, ret): + totalerr = 0 + for item in ret: + try: + name = item.get('name') + itemattr = '%sattr' % name + val_t = getattr(DevMonitor, itemattr, None) + if val_t == 'OK': + continue + present = item.get('present', None) + devices = item.get('device') + err_t = 0 + for item_dev in devices: + item_devattr = '%s' % (item_dev['id']) + val_t = getattr(DevMonitor, item_devattr, None) + if val_t == 'OK': + continue + devname = item_dev.get('name') + bus = item_dev.get('bus') + loc = item_dev.get('loc') + attr = item_dev.get('attr') + if self.checkattr(bus, loc, attr) is False: + err_t -= 1 + setattr(DevMonitor, item_devattr, 'NOT OK') + if present is not None: + presentstatus = self.getpresentstatus(present) + devdebuglog("%s present status:%s" % (name, presentstatus.get('status'))) + if presentstatus.get('status') == 'PRESENT': + self.removeDev(bus, loc) + time.sleep(0.1) + self.addDev(devname, bus, loc) + else: + self.removeDev(bus, loc) + time.sleep(0.1) + self.addDev(devname, bus, loc) + else: + setattr(DevMonitor, item_devattr, 'OK') + val_t = getattr(DevMonitor, item_devattr, None) + devdebuglog("%s status %s" % (item_devattr, val_t)) + if err_t == 0: + setattr(DevMonitor, itemattr, 'OK') + else: + totalerr -= 1 + setattr(DevMonitor, itemattr, 'NOT OK') + val_t = getattr(DevMonitor, itemattr, None) + devdebuglog("%s status %s" % (itemattr, val_t)) + except Exception as e: + totalerr -= 1 + deverror("monitor error") + deverror(str(e)) + return totalerr + + def psusmonitor(self): + psus_conf = DEV_MONITOR_PARAM.get('psus') + if psus_conf is None: + return 0 + psusattr = 'psusattr' + val_t = getattr(DevMonitor, psusattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(psus_conf) + if ret == 0: + setattr(DevMonitor, psusattr, 'OK') + else: + setattr(DevMonitor, psusattr, 'NOT OK') + val_t = getattr(DevMonitor, psusattr, None) + devdebuglog("psusattr:value:%s" % (val_t)) + return ret + + def fansmonitor(self): + fans_conf = DEV_MONITOR_PARAM.get('fans') + if fans_conf is None: + return 0 + fansattr = 'fansattr' + val_t = getattr(DevMonitor, fansattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(fans_conf) + if ret == 0: + setattr(DevMonitor, fansattr, 'OK') + else: + setattr(DevMonitor, fansattr, 'NOT OK') + val_t = getattr(DevMonitor, fansattr, None) + devdebuglog("fansattr:value:%s" % (val_t)) + return ret + + def slotsmonitor(self): + slots_conf = DEV_MONITOR_PARAM.get('slots') + if slots_conf is None: + return 0 + slotsattr = 'slotsattr' + val_t = getattr(DevMonitor, slotsattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(slots_conf) + if ret == 0: + setattr(DevMonitor, slotsattr, 'OK') + else: + setattr(DevMonitor, slotsattr, 'NOT OK') + val_t = getattr(DevMonitor, slotsattr, None) + devdebuglog("slotsattr:value:%s" % (val_t)) + return ret + + def othersmonitor(self): + others_conf = DEV_MONITOR_PARAM.get('others') + if others_conf is None: + return 0 + othersattr = 'othersattr' + val_t = getattr(DevMonitor, othersattr, None) + if val_t == 'OK': + return 0 + ret = self.monitor(others_conf) + if ret == 0: + setattr(DevMonitor, othersattr, 'OK') + else: + setattr(DevMonitor, othersattr, 'NOT OK') + val_t = getattr(DevMonitor, othersattr, None) + devdebuglog("othersattr:value:%s" % (val_t)) + return ret + + +def doDevMonitor(devMonitor): + ret_t = 0 + ret_t += devMonitor.psusmonitor() + ret_t += devMonitor.fansmonitor() + ret_t += devMonitor.slotsmonitor() + ret_t += devMonitor.othersmonitor() + return ret_t + + +def run(interval, devMonitor): + # devMonitor.devattrinit() + while True: + try: + debug_init() + ret = doDevMonitor(devMonitor) + except Exception as e: + traceback.print_exc() + deverror(str(e)) + ret = -1 + if ret == 0: + time.sleep(5) + devinfo("dev_monitor finished!") + sys.exit(0) + time.sleep(interval) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''device operator''' + + +@main.command() +def start(): + '''start device monitor''' + devinfo("dev_monitor start") + devMonitor = DevMonitor() + interval = DEV_MONITOR_PARAM.get('polling_time', 10) + run(interval, devMonitor) + + +@main.command() +def stop(): + '''stop device monitor ''' + devinfo("stop") + + +# device_i2c operation +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py deleted file mode 100755 index a30dd7d86a..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/device_i2c.py +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- - -import click -import os -import time -import subprocess -from ragileconfig import * -from ragileutil import rgpciwr, rgi2cset, io_wr -from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe - -CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) - -class AliasedGroup(click.Group): - def get_command(self, ctx, cmd_name): - rv = click.Group.get_command(self, ctx, cmd_name) - if rv is not None: - return rv - matches = [x for x in self.list_commands(ctx) - if x.startswith(cmd_name)] - if not matches: - return None - elif len(matches) == 1: - return click.Group.get_command(self, ctx, matches[0]) - ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) - -def log_os_system(cmd): - u'''execute shell command''' - status, output = getstatusoutput_noshell(cmd) - if status: - print(output) - return status, output - -def write_sysfs_value(reg_name, value): - u'''write sysfs file''' - mb_reg_file = "/sys/bus/i2c/devices/" + reg_name - if (not os.path.isfile(mb_reg_file)): - print(mb_reg_file, 'not found !') - return False - try: - with open(mb_reg_file, 'w') as fd: - fd.write(value) - except Exception as error: - return False - return True - -def check_driver(): - u'''whether there is driver start with rg''' - status, output = getstatusoutput_noshell_pipe(["lsmod"], ["grep", "rg"], ["wc", "-l"]) - #System execution error - if status: - return False - if output.isdigit() and int(output) > 0: - return True - else: - return False - -def get_pid(name): - ret = [] - for dirname in os.listdir('/proc'): - if dirname == 'curproc': - continue - try: - with open('/proc/{}/cmdline'.format(dirname), mode='r') as fd: - content = fd.read() - except Exception: - continue - if name in content: - ret.append(dirname) - return ret - -def start_avs_ctrl(): - cmd = ["avscontrol.py", "start"] - rets = get_pid("avscontrol.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def start_fan_ctrl(): - if STARTMODULE['fancontrol'] == 1: - cmd = ["fancontrol.py", "start"] - rets = get_pid("fancontrol.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def starthal_fanctrl(): - if STARTMODULE.get('hal_fanctrl',0) == 1: - cmd = ["hal_fanctrl.py", "start"] - rets = get_pid("hal_fanctrl.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def starthal_ledctrl(): - if STARTMODULE.get('hal_ledctrl',0) == 1: - cmd = ["hal_ledctrl.py", "start"] - rets = get_pid("hal_ledctrl.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def start_slot_monitor(): - if STARTMODULE.get('slot_monitor',0) == 1: - cmd = ["slot_monitor.py", "start"] - rets = get_pid("slot_monitor.py") - if len(rets) == 0: - subprocess.Popen(cmd) - -def stop_fan_ctrl(): - u'''disable fan timer service''' - if STARTMODULE['fancontrol'] == 1: - rets = get_pid("fancontrol.py") # - for ret in rets: - cmd = ["kill", ret] - subprocess.call(cmd) - return True - -def stophal_ledctrl(): - if STARTMODULE.get('hal_ledctrl',0) == 1: - rets = get_pid("hal_ledctrl.py") - for ret in rets: - cmd = ["kill", ret] - subprocess.call(cmd) - return True - -def stop_slot_monitor(): - u'''disable slot timer service''' - if STARTMODULE.get('slot_monitor',0) == 1: - rets = get_pid("slot_monitor.py") # - for ret in rets: - cmd = ["kill", ret] - subprocess.call(cmd) - return True - -def rm_dev(bus, loc): - devpath = "/sys/bus/i2c/devices/%d-%04x"%(bus, loc) - if os.path.exists(devpath): - with open("/sys/bus/i2c/devices/i2c-%d/delete_device" % bus, 'w') as f: - f.write('0x%02x\n' % loc) - -def add_dev(name, bus, loc): - if name == "lm75": - time.sleep(0.1) - pdevpath = "/sys/bus/i2c/devices/i2c-%d/" % (bus) - for i in range(1, 100):#wait for mother-bus generation,maximum wait time is 10s - if os.path.exists(pdevpath) is True: - break - time.sleep(0.1) - if i % 10 == 0: - click.echo("%%DEVICE_I2C-INIT: %s not found, wait 0.1 second ! i %d " % (pdevpath,i)) - - devpath = "/sys/bus/i2c/devices/%d-%04x"%(bus, loc) - if os.path.exists(devpath) is False: - with open("/sys/bus/i2c/devices/i2c-%d/new_device" % bus, 'w') as f: - f.write('%s 0x%02x\n' % (name, loc)) - -def removedevs(): - devs = GLOBALCONFIG["DEVS"] - for index in range(len(devs)-1, -1, -1 ): - rm_dev(devs[index]["bus"] , devs[index]["loc"]) - -def adddevs(): - devs = GLOBALCONFIG["DEVS"] - for dev in range(0, devs.__len__()): - add_dev(devs[dev]["name"], devs[dev]["bus"] , devs[dev]["loc"]) - -def checksignaldriver(name): - status, output = getstatusoutput_noshell_pipe(["lsmod"], ["grep", name], ["wc", "-l"]) - #System execution error - if status: - return False - if output.isdigit() and int(output) > 0: - return True - else: - return False - -def adddriver(name, delay): - cmd = ["modprobe", name] - if delay != 0: - time.sleep(delay) - if not checksignaldriver(name): - getstatusoutput_noshell(cmd) - -def removedriver(name, delay): - realname = name.lstrip().split(" ")[0]; - cmd = ["rmmod", "-f", realname] - if checksignaldriver(realname): - getstatusoutput_noshell(cmd) - -def removedrivers(): - u'''remove all drivers''' - if GLOBALCONFIG is None: - click.echo("%%DEVICE_I2C-INIT: load global config failed.") - return - drivers = GLOBALCONFIG.get("DRIVERLISTS", None) - if drivers is None: - click.echo("%%DEVICE_I2C-INIT: load driver list failed.") - return - for index in range(len(drivers)-1, -1, -1 ): - delay = 0 - name = "" - if type(drivers[index]) == dict and "delay" in drivers[index]: - name = drivers[index].get("name") - delay = drivers[index]["delay"] - else: - name = drivers[index] - removedriver(name, delay) - -def adddrivers(): - u'''add drivers''' - if GLOBALCONFIG is None: - click.echo("%%DEVICE_I2C-INIT: load global config failed.") - return - drivers = GLOBALCONFIG.get("DRIVERLISTS", None) - if drivers is None: - click.echo("%%DEVICE_I2C-INIT: load driver list failed.") - return - for index in range(0 ,len(drivers)): - delay = 0 - name = "" - if type(drivers[index]) == dict and "delay" in drivers[index]: - name = drivers[index].get("name") - delay = drivers[index]["delay"] - else: - name = drivers[index] - adddriver(name, delay) - -def otherinit(): - for index in GLOBALINITPARAM: - index_type = index.get("type", None) - if index_type == "io": - ret = io_wr(index.get("offset"), index.get("val")) - else: - ret, _ = rgi2cset( - index.get("bus"), - index.get("devaddr"), - index.get("offset"), - index.get("val") - ) - if not ret: - click.echo("%%DEVICE_I2C-INIT: init param %s failed." % index.get("name")) - - for index in GLOBALINITCOMMAND: - log_os_system(index) - -def unload_driver(): - u'''remove devices and drivers''' - stop_fan_ctrl() # disable fan-control service - removedevs() # remove other devices - removedrivers() # remove drivers - -def reload_driver(): - u'''reload devices and drivers''' - removedevs() # remove other devices - removedrivers() # remove drivers - time.sleep(1) - adddrivers() - adddevs() - - -def i2c_check(bus,retrytime = 6): - try: - i2cpath = "/sys/bus/i2c/devices/" + bus - while retrytime and not os.path.exists(i2cpath): - click.echo("%%DEVICE_I2C-HA: i2c bus abnormal, last bus %s is not exist." % i2cpath) - reload_driver() - retrytime -= 1 - time.sleep(1) - except Exception as e: - click.echo("%%DEVICE_I2C-HA: %s" % str(e)) - return - -def set_mac_leds(data): - '''write pci register''' - pcibus = MAC_LED_RESET.get("pcibus") - slot = MAC_LED_RESET.get("slot") - fn = MAC_LED_RESET.get("fn") - bar = MAC_LED_RESET.get("bar") - offset = MAC_LED_RESET.get("offset") - val = MAC_LED_RESET.get(data, None) - if val is None: - click.echo("%%DEVICE_I2C-INIT: set_mac_leds wrong input") - return - rgpciwr(pcibus, slot, fn, bar, offset, val) - -def load_driver(): - u'''load devices and drivers''' - adddrivers() - adddevs() - if STARTMODULE.get("i2ccheck",0) == 1: #i2c HA - busend = i2ccheck_params.get("busend") - retrytime = i2ccheck_params.get("retrytime") - i2c_check(busend,retrytime) - start_fan_ctrl() # enable fan - starthal_fanctrl() # enable fan control - starthal_ledctrl() # enable LED control - if STARTMODULE['avscontrol'] == 1: - start_avs_ctrl() # avs voltage-adjustment - start_slot_monitor() # slot insertion and removal initialization monitor - otherinit(); # other initialization, QSFP initialization - if STARTMODULE.get("macledreset", 0) == 1: - set_mac_leds("reset") - -@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) -def main(): - '''device operator''' - pass - - -@main.command() -def start(): - '''load device ''' - if check_driver(): - unload_driver() - load_driver() - -@main.command() -def stop(): - '''stop device ''' - unload_driver() - -@main.command() -def restart(): - '''restart device''' - unload_driver() - load_driver() - -if __name__ == '__main__': - u'''device_i2c operation''' - main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py deleted file mode 100755 index f93e06aa86..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/fancontrol.py +++ /dev/null @@ -1,994 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -import click -import os -import time -import traceback -import glob -import subprocess -from rgutil.logutil import Logger -from ragileutil import wait_docker - -from ragileconfig import ( - MONITOR_CONST, - FANCTROLDEBUG, - MONITOR_FANS_LED, - DEV_LEDS, - MONITOR_PSU_STATUS, - MONITOR_SYS_PSU_LED, - MONITOR_DEV_STATUS, - MONITOR_FAN_STATUS, - MONITOR_DEV_STATUS_DECODE, - MONITOR_SYS_FAN_LED, - MONITOR_SYS_LED, - fanloc, -) - -from ragileutil import ( - rgi2cget, - get_mac_temp_sysfs, - get_mac_temp, - write_sysfs_value, - get_sysfs_value, - strtoint, - rgi2cset, - io_rd, - rgsysset, -) - - -CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) - -DEBUG_COMMON = 0x01 -DEBUG_LEDCONTROL = 0x02 -DEBUG_FANCONTROL = 0x04 - -LOG_PREFIX = "FANCONTROL" -logger = Logger(LOG_PREFIX, syslog=True, dbg_mask=FANCTROLDEBUG) - - -class AliasedGroup(click.Group): - def get_command(self, ctx, cmd_name): - rv = click.Group.get_command(self, ctx, cmd_name) - if rv is not None: - return rv - matches = [x for x in self.list_commands(ctx) if x.startswith(cmd_name)] - if not matches: - return None - elif len(matches) == 1: - return click.Group.get_command(self, ctx, matches[0]) - ctx.fail("Too many matches: %s" % ", ".join(sorted(matches))) - - -class FanControl(object): - critnum = 0 - - def __init__(self): - self._normal_fans = 0 - self._normal_psus = 0 - self._intemp = -100.0 - self._mac_aver = -100.0 - self._mac_max = -100.0 - # previous temperature - self._pre_intemp = -100 - self._outtemp = -100 - self._boardtemp = -100 - self._cputemp = -1000 - - @property - def normal_fans(self): - return self._normal_fans - - @property - def normal_psus(self): - return self._normal_psus - - @property - def cputemp(self): - return self._cputemp - - @property - def intemp(self): - return self._intemp - - @property - def outtemp(self): - return self._outtemp - - @property - def boardtemp(self): - return self._boardtemp - - @property - def mac_aver(self): - return self._mac_aver - - @property - def preIntemp(self): - return self._pre_intemp - - @property - def mac_max(self): - return self._mac_max - - def sortCallback(self, element): - return element["id"] - - def gettemp(self, ret): - u"""get inlet, outlet, hot-point and cpu temperature""" - temp_conf = MONITOR_DEV_STATUS.get("temperature", None) - - if temp_conf is None: - logger.error("gettemp: config error") - return False - for item_temp in temp_conf: - try: - retval = "" - rval = None - name = item_temp.get("name") - location = item_temp.get("location") - if name == "cpu": - L = [] - for dirpath, dirnames, filenames in os.walk(location): - for file in filenames: - if file.endswith("input"): - L.append(os.path.join(dirpath, file)) - L = sorted(L, reverse=False) - for i in range(len(L)): - nameloc = "%s/temp%d_label" % (location, i + 1) - valloc = "%s/temp%d_input" % (location, i + 1) - with open(nameloc, "r") as fd1: - retval2 = fd1.read() - with open(valloc, "r") as fd2: - retval3 = fd2.read() - ret_t = {} - ret_t["name"] = retval2.strip() - ret_t["value"] = float(retval3) / 1000 - ret.append(ret_t) - logger.debug( - DEBUG_COMMON, - "gettemp %s : %f" % (ret_t["name"], ret_t["value"]), - ) - else: - locations = glob.glob(location) - with open(locations[0], "r") as fd1: - retval = fd1.read() - rval = float(retval) / 1000 - ret_t = {} - ret_t["name"] = name - ret_t["value"] = rval - ret.append(ret_t) - logger.debug( - DEBUG_COMMON, - "gettemp %s : %f" % (ret_t["name"], ret_t["value"]), - ) - except Exception as e: - logger.error("gettemp error:name:%s" % name) - logger.error(str(e)) - return True - - def checkslot(self, ret): - u"""get slot present status""" - slots_conf = MONITOR_DEV_STATUS.get("slots", None) - slotpresent = MONITOR_DEV_STATUS_DECODE.get("slotpresent", None) - - if slots_conf is None or slotpresent is None: - return False - for item_slot in slots_conf: - totalerr = 0 - try: - ret_t = {} - ret_t["id"] = item_slot.get("name") - ret_t["status"] = "" - gettype = item_slot.get("gettype") - presentbit = item_slot.get("presentbit") - if gettype == "io": - io_addr = item_slot.get("io_addr") - val = io_rd(io_addr) - if val is not None: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_slot.get("name"), "lpc read failed"), - ) - else: - bus = item_slot.get("bus") - loc = item_slot.get("loc") - offset = item_slot.get("offset") - ind, val = rgi2cget(bus, loc, offset) - if ind is True: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_slot.get("name"), "i2c read failed"), - ) - if totalerr < 0: - ret_t["status"] = "NOT OK" - ret.append(ret_t) - continue - val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit - logger.debug( - DEBUG_COMMON, - "%s present:%s" % (item_slot.get("name"), slotpresent.get(val_t)), - ) - if val_t != slotpresent.get("okval"): - ret_t["status"] = "ABSENT" - else: - ret_t["status"] = "PRESENT" - except Exception as e: - ret_t["status"] = "NOT OK" - totalerr -= 1 - logger.error("checkslot error") - logger.error(str(e)) - ret.append(ret_t) - return True - - def checkpsu(self, ret): - u"""get psu status present, output and warning""" - psus_conf = MONITOR_DEV_STATUS.get("psus", None) - psupresent = MONITOR_DEV_STATUS_DECODE.get("psupresent", None) - psuoutput = MONITOR_DEV_STATUS_DECODE.get("psuoutput", None) - psualert = MONITOR_DEV_STATUS_DECODE.get("psualert", None) - - if psus_conf is None or psupresent is None or psuoutput is None: - logger.error("checkpsu: config error") - return False - for item_psu in psus_conf: - totalerr = 0 - try: - ret_t = {} - ret_t["id"] = item_psu.get("name") - ret_t["status"] = "" - gettype = item_psu.get("gettype") - presentbit = item_psu.get("presentbit") - statusbit = item_psu.get("statusbit") - alertbit = item_psu.get("alertbit") - if gettype == "io": - io_addr = item_psu.get("io_addr") - val = io_rd(io_addr) - if val is not None: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_psu.get("name"), "lpc read failed"), - ) - else: - bus = item_psu.get("bus") - loc = item_psu.get("loc") - offset = item_psu.get("offset") - ind, val = rgi2cget(bus, loc, offset) - if ind is True: - retval = val - else: - totalerr -= 1 - logger.error( - " %s %s" % (item_psu.get("name"), "i2c read failed"), - ) - if totalerr < 0: - ret_t["status"] = "NOT OK" - ret.append(ret_t) - continue - val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit - val_status = (int(retval, 16) & (1 << statusbit)) >> statusbit - val_alert = (int(retval, 16) & (1 << alertbit)) >> alertbit - logger.debug( - DEBUG_COMMON, - "%s present:%s output:%s alert:%s" - % ( - item_psu.get("name"), - psupresent.get(val_t), - psuoutput.get(val_status), - psualert.get(val_alert), - ), - ) - if ( - val_t != psupresent.get("okval") - or val_status != psuoutput.get("okval") - or val_alert != psualert.get("okval") - ): - totalerr -= 1 - except Exception as e: - totalerr -= 1 - logger.error("checkpsu error") - logger.error(str(e)) - if totalerr < 0: - ret_t["status"] = "NOT OK" - else: - ret_t["status"] = "OK" - ret.append(ret_t) - return True - - def checkfan(self, ret): - u"""get fan status present and roll""" - fans_conf = MONITOR_DEV_STATUS.get("fans", None) - fanpresent = MONITOR_DEV_STATUS_DECODE.get("fanpresent", None) - fanroll = MONITOR_DEV_STATUS_DECODE.get("fanroll", None) - - if fans_conf is None or fanpresent is None or fanroll is None: - logger.error("checkfan: config error") - return False - for item_fan in fans_conf: - totalerr = 0 - try: - ret_t = {} - ret_t["id"] = item_fan.get("name") - ret_t["status"] = "" - presentstatus = item_fan.get("presentstatus") - presentbus = presentstatus.get("bus") - presentloc = presentstatus.get("loc") - presentaddr = presentstatus.get("offset") - presentbit = presentstatus.get("bit") - ind, val = rgi2cget(presentbus, presentloc, presentaddr) - if ind is True: - val_t = (int(val, 16) & (1 << presentbit)) >> presentbit - logger.debug( - DEBUG_COMMON, - "checkfan:%s present status:%s" - % (item_fan.get("name"), fanpresent.get(val_t)), - ) - if val_t != fanpresent.get("okval"): - ret_t["status"] = "ABSENT" - ret.append(ret_t) - continue - else: - logger.error( - "checkfan: %s get present status error." % item_fan.get("name"), - ) - motors = item_fan.get("rollstatus") - for motor in motors: - statusbus = motor.get("bus", None) - statusloc = motor.get("loc", None) - statusaddr = motor.get("offset", None) - statusbit = motor.get("bit", None) - ind, val = rgi2cget(statusbus, statusloc, statusaddr) - if ind is True: - val_t = (int(val, 16) & (1 << statusbit)) >> statusbit - logger.debug( - DEBUG_COMMON, - "checkfan:%s roll status:%s" - % (motor.get("name"), fanroll.get(val_t)), - ) - if val_t != fanroll.get("okval"): - totalerr -= 1 - else: - totalerr -= 1 - logger.error("checkfan: %s " % item_fan.get("name")) - logger.error("get %s status error." % motor["name"]) - except Exception as e: - totalerr -= 1 - logger.error("checkfan error") - logger.error(str(e)) - if totalerr < 0: - ret_t["status"] = "NOT OK" - else: - ret_t["status"] = "OK" - ret.append(ret_t) - return True - - def get_curr_speed(self): - try: - loc = fanloc[0].get("location", "") - sped = get_sysfs_value(loc) - value = strtoint(sped) - return value - except Exception as e: - logger.error("%%policy: get current speedlevel error") - logger.error(str(e)) - return None - - # guarantee the speed is lowest when speed lower than lowest value after speed-adjustment - def check_curr_speed(self): - logger.debug( - DEBUG_FANCONTROL, - "%%policy: guarantee the lowest speed after speed-adjustment", - ) - value = self.get_curr_speed() - if value is None or value == 0: - raise Exception("%%policy: get_curr_speed None") - elif value < MONITOR_CONST.MIN_SPEED: - self.set_fan_speed(MONITOR_CONST.MIN_SPEED) - - def set_fan_speed(self, level): - if level >= MONITOR_CONST.MAX_SPEED: - level = MONITOR_CONST.MAX_SPEED - for item in fanloc: - try: - loc = item.get("location", "") - # write_sysfs_value(loc, "0x%02x" % level) - # pddf support dicimal number - write_sysfs_value(loc, "%d" % level) - except Exception as e: - logger.error(str(e)) - logger.error("%%policy: config fan runlevel error") - self.check_curr_speed() # guaranteed minimum - - def set_fan_max_speed(self): - try: - self.set_fan_speed(MONITOR_CONST.MAX_SPEED) - except Exception as e: - logger.error("%%policy:set_fan_max_speed failed") - logger.error(str(e)) - - def detect_fan_status(self): - """ - fan status check , max speed if fan error - """ - if self.normal_fans < MONITOR_CONST.FAN_TOTAL_NUM: - logger.warn( - "%%DEV_MONITOR-FAN: Normal fan number: %d" % (self.normal_fans), - ) - self.set_fan_max_speed() - return False - return True - - def set_fan_attr(self, val): - u"""set status of each fan""" - for item in val: - fanid = item.get("id") - fanattr = fanid + "status" - fanstatus = item.get("status") - setattr(FanControl, fanattr, fanstatus) - logger.debug( - DEBUG_COMMON, "fanattr:%s,fanstatus:%s" % (fanattr, fanstatus), - ) - - def fan_present_num(self, cur_fan_status): - fanoknum = 0 - for item in cur_fan_status: - if item["status"] == "OK": - fanoknum += 1 - self._normal_fans = fanoknum - logger.debug(DEBUG_COMMON, "normal_fans = %d" % self._normal_fans) - - def get_fan_status(self): - try: - cur_fan_status = [] - ret = self.checkfan(cur_fan_status) - if ret is True: - self.set_fan_attr(cur_fan_status) - self.fan_present_num(cur_fan_status) - logger.debug(DEBUG_COMMON, "%%policy:get_fan_status success") - return 0 - except AttributeError as e: - logger.error(str(e)) - except Exception as e: - logger.error(str(e)) - return -1 - - def normal_psu_num(self, curPsuStatus): - psuoknum = 0 - for item in curPsuStatus: - if item.get("status") == "OK": - psuoknum += 1 - self._normal_psus = psuoknum - logger.debug(DEBUG_COMMON, "normal_psus = %d" % self._normal_psus) - - def get_psu_status(self): - try: - curPsuStatus = [] - ret = self.checkpsu(curPsuStatus) - if ret is True: - self.normal_psu_num(curPsuStatus) - logger.debug(DEBUG_COMMON, "%%policy:get_psu_status success") - return 0 - except AttributeError as e: - logger.error(str(e)) - except Exception as e: - logger.error(str(e)) - return -1 - - def get_monitor_temp(self, temp): - for item in temp: - if item.get("name") == "lm75in": - self._intemp = item.get("value", self._intemp) - if item.get("name") == "lm75out": - self._outtemp = item.get("value", self._outtemp) - if item.get("name") == "lm75hot": - self._boardtemp = item.get("value", self._boardtemp) - if item.get("name") == "Physical id 0": - self._cputemp = item.get("value", self._cputemp) - logger.debug( - DEBUG_COMMON, - "intemp:%f, outtemp:%f, boadrtemp:%f, cputemp:%f" - % (self._intemp, self._outtemp, self._boardtemp, self._cputemp), - ) - - def get_temp_status(self): - try: - monitortemp = [] - ret = self.gettemp(monitortemp) - if ret is True: - self.get_monitor_temp(monitortemp) - logger.debug(DEBUG_COMMON, "%%policy:get_temp_status success") - return 0 - except AttributeError as e: - logger.error(str(e)) - except Exception as e: - logger.error(str(e)) - return -1 - - def get_mac_status_bcmcmd(self): - try: - if wait_docker(timeout=0) is True: - sta, ret = get_mac_temp() - if sta is True: - self._mac_aver = float(ret.get("average", self._mac_aver)) - self._mac_max = float(ret.get("maximum", self._mac_max)) - logger.debug( - DEBUG_COMMON, - "mac_aver:%f, mac_max:%f" % (self.mac_aver, self._mac_max), - ) - else: - logger.debug(DEBUG_COMMON, "%%policy:get_mac_status_bcmcmd failed") - else: - logger.debug(DEBUG_COMMON, "%%policy:get_mac_status_bcmcmd SDK not OK") - return 0 - except AttributeError as e: - logger.error(str(e)) - return -1 - - def get_mac_status_sysfs(self, conf): - try: - sta, ret = get_mac_temp_sysfs(conf) - if sta is True: - self._mac_aver = float(ret) / 1000 - self._mac_max = float(ret) / 1000 - logger.debug( - DEBUG_COMMON, - "mac_aver:%f, mac_max:%f" % (self.mac_aver, self._mac_max), - ) - elif conf.get("try_bcmcmd", 0) == 1: - logger.debug( - DEBUG_COMMON, "get sysfs mac temp failed.try to use bcmcmd", - ) - self.get_mac_status_bcmcmd() - else: - logger.debug(DEBUG_COMMON, "%%policy:get_mac_status_sysfs failed") - return 0 - except AttributeError as e: - logger.error(str(e)) - return -1 - - def get_mac_status(self): - try: - mactempconf = MONITOR_DEV_STATUS.get("mac_temp", None) - if mactempconf is not None: - self.get_mac_status_sysfs(mactempconf) - else: - self.get_mac_status_bcmcmd() - return 0 - except AttributeError as e: - logger.error(str(e)) - return -1 - - def set_slot_attr(self, val): - u"""set each slot present status attribute""" - for item in val: - slotid = item.get("id") - slotattr = slotid + "status" - slotstatus = item.get("status") - setattr(FanControl, slotattr, slotstatus) - logger.debug( - DEBUG_COMMON, "slotattr:%s,slotstatus:%s" % (slotattr, slotstatus), - ) - - def get_slot_status(self): - try: - curSlotStatus = [] - ret = self.checkslot(curSlotStatus) - if ret is True: - self.set_slot_attr(curSlotStatus) - logger.debug(DEBUG_COMMON, "%%policy:get_slot_status success") - except AttributeError as e: - logger.error(str(e)) - return 0 - - def fanctrol(self): # fan speed-adjustment - try: - if self.preIntemp <= -1000: - self.preIntemp = self.intemp - logger.debug( - DEBUG_FANCONTROL, - "%%policy:previous temperature[%.2f] , current temperature[%.2f]" - % (self.preIntemp, self.intemp), - ) - if self.intemp < MONITOR_CONST.TEMP_MIN: - logger.debug( - DEBUG_FANCONTROL, - "%%policy:inlet %.2f minimum temperature: %.2f" - % (self.intemp, MONITOR_CONST.TEMP_MIN), - ) - self.set_fan_speed(MONITOR_CONST.DEFAULT_SPEED) # default level - elif self.intemp >= MONITOR_CONST.TEMP_MIN and self.intemp > self.preIntemp: - logger.debug(DEBUG_FANCONTROL, "%%policy:increase temperature") - self.policy_speed(self.intemp) - elif ( - self.intemp >= MONITOR_CONST.TEMP_MIN - and (self.preIntemp - self.intemp) > MONITOR_CONST.MONITOR_FALL_TEMP - ): - logger.debug( - DEBUG_FANCONTROL, - "%%policy:temperature reduce over %d degree" - % MONITOR_CONST.MONITOR_FALL_TEMP, - ) - self.policy_speed(self.intemp) - else: - speed = ( - self.get_curr_speed() - ) # set according to current speed, prevent fan watch-dog - if speed is not None: - self.set_fan_speed(speed) - logger.debug(DEBUG_FANCONTROL, "%%policy:change nothing") - except Exception as e: - logger.error("%%policy: fancontrol error") - - def start_fan_ctrl(self): - """ - start speed-adjustment - """ - self.check_crit() - if ( - self.critnum == 0 - and self.check_warn() is False - and self.detect_fan_status() is True - ): - self.fanctrol() - self.check_dev_err() - logger.debug( - DEBUG_FANCONTROL, - "%%policy: speed after speed-adjustment is %0x" % (self.get_curr_speed()), - ) - - def policy_speed(self, temp): # fan speed-adjustment algorithm - logger.debug(DEBUG_FANCONTROL, "%%policy:fan speed-adjustment algorithm") - sped_level = MONITOR_CONST.DEFAULT_SPEED + MONITOR_CONST.K * ( - temp - MONITOR_CONST.TEMP_MIN - ) - self.set_fan_speed(sped_level) - self.preIntemp = self.intemp - - def board_moni_msg(self, ledcontrol=False): - ret_t = 0 - try: - ret_t += ( - self.get_fan_status() - ) # get fan status, get number of fan which status is OK - ret_t += ( - self.get_temp_status() - ) # get inlet, outlet, hot-point temperature, CPU temperature - ret_t += self.get_mac_status() # get MAC highest and average temperature - if ledcontrol == True: - ret_t += self.get_slot_status() # get slot present status - ret_t += self.get_psu_status() # get psu status - if ret_t == 0: - return True - except Exception as e: - logger.error(str(e)) - return False - - # device error algorithm Tmac-Tin≥50℃, or Tmac-Tin≤-50℃ - def check_dev_err(self): - try: - if (self.mac_aver - self.intemp) >= MONITOR_CONST.MAC_UP_TEMP or ( - self.mac_aver - self.intemp - ) <= MONITOR_CONST.MAC_LOWER_TEMP: - logger.debug( - DEBUG_FANCONTROL, "%%DEV_MONITOR-TEMP: MAC temp get failed.", - ) - value = self.get_curr_speed() - if MONITOR_CONST.MAC_ERROR_SPEED >= value: - self.set_fan_speed(MONITOR_CONST.MAC_ERROR_SPEED) - else: - self.set_fan_max_speed() - else: - pass - except Exception as e: - logger.error("%%policy:check_dev_err failed") - logger.error(str(e)) - - def check_temp_warn(self): - u"""check whether temperature above the normal alarm value""" - try: - if ( - self._mac_aver >= MONITOR_CONST.MAC_WARNING_THRESHOLD - or self._outtemp >= MONITOR_CONST.OUTTEMP_WARNING_THRESHOLD - or self._boardtemp >= MONITOR_CONST.BOARDTEMP_WARNING_THRESHOLD - or self._cputemp >= MONITOR_CONST.CPUTEMP_WARNING_THRESHOLD - or self._intemp >= MONITOR_CONST.INTEMP_WARNING_THRESHOLD - ): - logger.debug( - DEBUG_COMMON, - "check whether temperature above the normal alarm value", - ) - return True - except Exception as e: - logger.error("%%policy: check_temp_warn failed") - logger.error(str(e)) - return False - - def check_temp_crit(self): - u"""check whether temperature above the critical alarm value""" - try: - if self._mac_aver >= MONITOR_CONST.MAC_CRITICAL_THRESHOLD or ( - self._outtemp >= MONITOR_CONST.OUTTEMP_CRITICAL_THRESHOLD - and self._boardtemp >= MONITOR_CONST.BOARDTEMP_CRITICAL_THRESHOLD - and self._cputemp >= MONITOR_CONST.CPUTEMP_CRITICAL_THRESHOLD - and self._intemp >= MONITOR_CONST.INTEMP_CRITICAL_THRESHOLD - ): - logger.debug( - DEBUG_COMMON, "temperature above the critical alarm value", - ) - return True - except Exception as e: - logger.error("%%policy: check_temp_crit failed") - logger.error(str(e)) - return False - - def check_fan_status(self): - u"""check fan status""" - for item in MONITOR_FAN_STATUS: - maxoknum = item.get("maxOkNum") - minoknum = item.get("minOkNum") - status = item.get("status") - if self.normal_fans >= minoknum and self.normal_fans <= maxoknum: - logger.debug( - DEBUG_COMMON, - "check_fan_status:normal_fans:%d,status:%s" - % (self.normal_fans, status), - ) - return status - logger.debug( - DEBUG_COMMON, "check_fan_status Error:normal_fans:%d" % (self.normal_fans), - ) - return None - - def check_psu_status(self): - u"""check psu status""" - for item in MONITOR_PSU_STATUS: - maxoknum = item.get("maxOkNum") - minoknum = item.get("minOkNum") - status = item.get("status") - if self.normal_psus >= minoknum and self.normal_psus <= maxoknum: - logger.debug( - DEBUG_COMMON, - "check_psu_status:normal_psus:%d,status:%s" - % (self.normal_psus, status), - ) - return status - logger.debug( - DEBUG_COMMON, "check_psu_status Error:normal_psus:%d" % (self.normal_psus), - ) - return None - - def deal_sys_led_status(self): - u"""set up SYSLED according to temperature, fan and psu status""" - try: - fanstatus = self.check_fan_status() - psustatus = self.check_psu_status() - if ( - self.check_temp_crit() is True - or fanstatus == "red" - or psustatus == "red" - ): - status = "red" - elif ( - self.check_temp_warn() is True - or fanstatus == "yellow" - or psustatus == "yellow" - ): - status = "yellow" - else: - status = "green" - self.set_sys_leds(status) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:deal_sys_led_status success, status:%s," % status, - ) - except Exception as e: - logger.error(str(e)) - - def deal_sys_fan_led_status(self): - u"""light panel fan led according to status""" - try: - status = self.check_fan_status() - if status is not None: - self.set_sys_fan_leds(status) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:deal_sys_fan_led_status success, status:%s," % status, - ) - except Exception as e: - logger.error("%%ledcontrol:deal_sys_led_status error") - logger.error(str(e)) - - def deal_psu_led_status(self): - u"""set up PSU-LED according to psu status""" - try: - status = self.check_psu_status() - if status is not None: - self.set_sys_psu_leds(status) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:deal_psu_led_status success, status:%s," % status, - ) - except Exception as e: - logger.error("%%ledcontrol:deal_psu_led_status error") - logger.error(str(e)) - - def deal_fan_led_status(self): - u"""light fan led according to fan status""" - for item in MONITOR_FANS_LED: - try: - index = MONITOR_FANS_LED.index(item) + 1 - fanattr = "fan%dstatus" % index - val_t = getattr(FanControl, fanattr, None) - if val_t == "NOT OK": - rgi2cset(item["bus"], item["devno"], item["addr"], item["red"]) - elif val_t == "OK": - rgi2cset(item["bus"], item["devno"], item["addr"], item["green"]) - else: - pass - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:dealLocFanLed success.fanattr:%s, status:%s" - % (fanattr, val_t), - ) - except Exception as e: - logger.error("%%ledcontrol:deal_fan_led_status error") - logger.error(str(e)) - - def dealSlotLedStatus(self): - u"""light slot status led according to slot present status""" - slotLedList = DEV_LEDS.get("SLOTLED", []) - for item in slotLedList: - try: - index = slotLedList.index(item) + 1 - slotattr = "slot%dstatus" % index - val_t = getattr(FanControl, slotattr, None) - if val_t == "PRESENT": - rgi2cset(item["bus"], item["devno"], item["addr"], item["green"]) - logger.debug( - DEBUG_LEDCONTROL, - "%%ledcontrol:dealSlotLedStatus success.slotattr:%s, status:%s" - % (slotattr, val_t), - ) - except Exception as e: - logger.error("%%ledcontrol:dealSlotLedStatus error") - logger.error(str(e)) - - def setled(self, item, color): - if item.get("type", "i2c") == "sysfs": - rgsysset(item["cmdstr"], item.get(color)) - else: - mask = item.get("mask", 0xFF) - ind, val = rgi2cget(item["bus"], item["devno"], item["addr"]) - if ind is True: - setval = (int(val, 16) & ~mask) | item.get(color) - rgi2cset(item["bus"], item["devno"], item["addr"], setval) - else: - logger.error("led %s" % "i2c read failed") - - def set_sys_leds(self, color): - for item in MONITOR_SYS_LED: - self.setled(item, color) - - def set_sys_fan_leds(self, color): - for item in MONITOR_SYS_FAN_LED: - self.setled(item, color) - - def set_sys_psu_leds(self, color): - for item in MONITOR_SYS_PSU_LED: - self.setled(item, color) - - def check_warn(self): - try: - if self.check_temp_warn() is True: - logger.debug(DEBUG_FANCONTROL, "anti-shake start") - time.sleep(MONITOR_CONST.SHAKE_TIME) - logger.debug(DEBUG_FANCONTROL, "anti-shake end") - self.board_moni_msg() # re-read - if self.check_temp_warn() is True: - logger.warn("%%DEV_MONITOR-TEMP:The temperature of device is over warning value.") - self.set_fan_max_speed() # fan full speed - return True - except Exception as e: - logger.error("%%policy: check_warn failed") - logger.error(str(e)) - return False - - def check_crit(self): - try: - if self.check_temp_crit() is True: - logger.debug(DEBUG_FANCONTROL, "anti-shake start") - time.sleep(MONITOR_CONST.SHAKE_TIME) - logger.debug(DEBUG_FANCONTROL, "anti-shake end") - self.board_moni_msg() # re-read - if self.check_temp_crit() is True: - logger.crit( - "%%DEV_MONITOR-TEMP:The temperature of device is over critical value.", - ) - self.set_fan_max_speed() # fan full speed - self.critnum += 1 # anti-shake - if self.critnum >= MONITOR_CONST.CRITICAL_NUM: - subprocess.call(["reboot"]) - logger.debug(DEBUG_FANCONTROL, "crit times:%d" % self.critnum) - else: - self.critnum = 0 - else: - self.critnum = 0 - except Exception as e: - logger.error("%%policy: check_crit failed") - logger.error(str(e)) - - -def callback(): - pass - - -def do_fan_ctrl(fanctrl): - ret = fanctrl.board_moni_msg() - if ret is True: - logger.debug(DEBUG_FANCONTROL, "%%policy:start_fan_ctrl") - fanctrl.start_fan_ctrl() - else: - fanctrl.set_fan_max_speed() - logger.debug(DEBUG_FANCONTROL, "%%policy:board_moni_msg error") - - -def do_led_ctrl(fanctrl): - fanctrl.board_moni_msg(ledcontrol=True) # get status - fanctrl.deal_sys_led_status() # light system led - fanctrl.deal_sys_fan_led_status() # light panel fan led - fanctrl.deal_fan_led_status() # light fan led - fanctrl.deal_psu_led_status() # light psu led - fanctrl.dealSlotLedStatus() # light slot status led - logger.debug(DEBUG_LEDCONTROL, "%%ledcontrol:do_led_ctrl success") - - -def run(interval, fanctrl): - loop = 0 - # waitForDocker() - while True: - try: - if loop % MONITOR_CONST.MONITOR_INTERVAL == 0: # fan speed-adjustment - logger.debug(DEBUG_FANCONTROL, "%%policy:fanctrl") - do_fan_ctrl(fanctrl) - else: - logger.debug( - DEBUG_LEDCONTROL, "%%ledcontrol:start ledctrol" - ) # LED control - do_led_ctrl(fanctrl) - time.sleep(interval) - loop += interval - except Exception as e: - traceback.print_exc() - logger.error(str(e)) - - -@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) -def main(): - """device operator""" - pass - - -@main.command() -def start(): - """start fan control""" - logger.info("FAN CTRL START") - fanctrl = FanControl() - interval = MONITOR_CONST.MONITOR_INTERVAL / 30 - run(interval, fanctrl) - - -@main.command() -def stop(): - """stop fan control """ - logger.info("FAN CTRL STOP") - - -##device_i2c operation -if __name__ == "__main__": - main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py new file mode 100755 index 0000000000..29d18e7b26 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/generate_airflow.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +''' +generate board air flow according to fan and psu air flow +write resulet to AIRFLOW_RESULT_FILE, file format: +{ + "FAN1": { + "model":"M1HFAN I-F", + "airflow":"intake", + }, + "PSU1": { + "model":"CSU550AP-3-500", + "airflow":"intake", + }, + "board":"intake" +} +''' +import os +import syslog +import json +from platform_config import AIR_FLOW_CONF, AIRFLOW_RESULT_FILE +from platform_util import dev_file_read, byteTostr +from eepromutil.fru import ipmifru +from eepromutil.fantlv import fan_tlv + + +AIRFLOW_DEBUG_FILE = "/etc/.airflow_debug_flag" + +AIRFLOWERROR = 1 +AIRFLOWDEBUG = 2 + +debuglevel = 0 + + +def airflow_info(s): + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def airflow_error(s): + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def airflow_debug(s): + if AIRFLOWDEBUG & debuglevel: + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def airflow_debug_error(s): + if AIRFLOWERROR & debuglevel: + syslog.openlog("AIRFLOW", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def debug_init(): + global debuglevel + try: + with open(AIRFLOW_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +def get_model_fru(device, eeprom): + try: + fru = ipmifru() + fru.decodeBin(eeprom) + dev_name = device.get("name") + area = device.get("area") + field = device.get("field") + tmp_area = getattr(fru, area, None) + if tmp_area is None: + msg = "%s fru %s area config error" % (dev_name, area) + return False, msg + model = getattr(tmp_area, field, None) + if model is None: + msg = "%s get model error, area: %s, field: %s" % (dev_name, area, field) + return False, msg + airflow_debug("%s get model success, model: %s" % (dev_name, model)) + return True, model + except Exception as e: + return False, str(e) + + +def get_model_fantlv(device, eeprom): + try: + dev_name = device.get("name") + tlv = fan_tlv() + rets = tlv.decode(eeprom) + if len(rets) == 0: + msg = "%s decode fantlv eeprom info error" % dev_name + return False, msg + + field = device.get("field") + for fantlv_item in rets: + if fantlv_item.get("name") == field: + return True, fantlv_item["value"] + msg = "%s get model error, field: %s not found" % (dev_name, field) + return False, msg + except Exception as e: + return False, str(e) + + +def get_device_modele(device): + e2_type = device.get("e2_type") + dev_name = device.get("name") + support_e2_type = ("fru", "fantlv") + if e2_type not in support_e2_type: + msg = "%s unsupport e2_type: %s" % (dev_name, e2_type) + return False, msg + + e2_path = device.get("e2_path") + e2_size = device.get("e2_size", 256) + ret, binval_bytes = dev_file_read(e2_path, 0, e2_size) + if ret is False: + msg = "%s eeprom read error, eeprom path: %s, msg: %s" % (dev_name, e2_path, binval_bytes) + return False, msg + + binval = byteTostr(binval_bytes) + if e2_type == "fru": + return get_model_fru(device, binval) + return get_model_fantlv(device, binval) + + +def get_board_air_flow(fan_intake_num, fan_exhaust_num, psu_intake_num, psu_exhaust_num): + airflow_debug("fan_intake_num: %d, fan_exhaust_num: %d, psu_intake_num: %d, psu_exhaust_num: %d" % + (fan_intake_num, fan_exhaust_num, psu_intake_num, psu_exhaust_num)) + + if fan_intake_num == 0 and fan_exhaust_num == 0 and psu_intake_num == 0 and psu_exhaust_num == 0: + airflow_error("get all fans and psus air flow failed") + return "N/A" + + if fan_intake_num > fan_exhaust_num: + airflow_debug("fan intake number %d more than fan exhaust number %s, set board air flow: intake") + return "intake" + + if fan_intake_num < fan_exhaust_num: + airflow_debug("fan intake number less than fan exhaust number, set board air flow: exhaust") + return "exhaust" + + airflow_debug("fan intake number equal to exhaust number, check psu air flow") + + if psu_intake_num > psu_exhaust_num: + airflow_debug("psu intake number more than psu exhaust number, set board air flow: intake") + return "intake" + + if psu_intake_num < psu_exhaust_num: + airflow_debug("psu intake number less than psu exhaust number, set board air flow: exhaust") + return "exhaust" + + airflow_debug("fan and psu intake and exhaust number equal, return intake") + return "intake" + + +def generate_airflow(): + fan_intake_list = [] + fan_exhaust_list = [] + psu_intake_list = [] + psu_exhaust_list = [] + ret = {} + fans = AIR_FLOW_CONF.get("fans", []) + psus = AIR_FLOW_CONF.get("psus", []) + + for fan in fans: + dev_name = fan.get("name") + air_flow = "N/A" + status, model = get_device_modele(fan) + if status is False: + ret[dev_name] = {"model": "N/A", "airflow": "N/A"} + airflow_error(model) + continue + model = model.strip() + airflowconifg = AIR_FLOW_CONF[fan["decode"]] + for key, value in airflowconifg.items(): + if model in value: + air_flow = key + ret[dev_name] = {"model": model, "airflow": air_flow} + airflow_debug("%s model: %s, airflow: %s" % (dev_name, model, air_flow)) + if air_flow == "intake": + fan_intake_list.append(fan.get("name")) + elif air_flow == "exhaust": + fan_exhaust_list.append(fan.get("name")) + + airflow_debug("fan_intake_list: %s" % fan_intake_list) + airflow_debug("fan_exhaust_list: %s" % fan_exhaust_list) + + for psu in psus: + dev_name = psu.get("name") + air_flow = "N/A" + status, model = get_device_modele(psu) + if status is False: + ret[dev_name] = {"model": "N/A", "airflow": "N/A"} + airflow_error(model) + continue + model = model.strip() + airflowconifg = AIR_FLOW_CONF[psu["decode"]] + for key, value in airflowconifg.items(): + if model in value: + air_flow = key + ret[dev_name] = {"model": model, "airflow": air_flow} + airflow_debug("%s model: %s, airflow: %s" % (dev_name, model, air_flow)) + if air_flow == "intake": + psu_intake_list.append(psu.get("name")) + elif air_flow == "exhaust": + psu_exhaust_list.append(psu.get("name")) + + airflow_debug("psu_intake_list: %s" % psu_intake_list) + airflow_debug("psu_exhaust_list: %s" % psu_exhaust_list) + + fan_intake_num = len(fan_intake_list) + fan_exhaust_num = len(fan_exhaust_list) + psu_intake_num = len(psu_intake_list) + psu_exhaust_num = len(psu_exhaust_list) + + board_airflow = get_board_air_flow(fan_intake_num, fan_exhaust_num, psu_intake_num, psu_exhaust_num) + airflow_debug("board_airflow: %s" % board_airflow) + ret["board"] = board_airflow + ret_json = json.dumps(ret, ensure_ascii=False, indent=4) + + out_file_dir = os.path.dirname(AIRFLOW_RESULT_FILE) + if len(out_file_dir) != 0: + cmd = "mkdir -p %s" % out_file_dir + os.system(cmd) + os.system("sync") + with open(AIRFLOW_RESULT_FILE, "w") as fd: + fd.write(ret_json) + os.system("sync") + + +if __name__ == '__main__': + debug_init() + airflow_debug("enter main") + generate_airflow() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py new file mode 100755 index 0000000000..7722b111f9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_fanctrl.py @@ -0,0 +1,1135 @@ +#!/usr/bin/env python3 +import os +import subprocess +import time +import syslog +import traceback +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil +from algorithm.pid import pid +from algorithm.openloop import openloop +from algorithm.hysteresis import hysteresis + + +SWITCH_TEMP = "SWITCH_TEMP" +INLET_TEMP = "INLET_TEMP" +BOARD_TEMP = "BOARD_TEMP" +OUTLET_TEMP = "OUTLET_TEMP" +CPU_TEMP = "CPU_TEMP" + +FANCTROL_DEBUG_FILE = "/etc/.fancontrol_debug_flag" +# coordination with REBOOT_CAUSE_PARA +OTP_SWITCH_REBOOT_JUDGE_FILE = "/etc/.otp_reboot_flag" +OTP_OTHER_REBOOT_JUDGE_FILE = OTP_SWITCH_REBOOT_JUDGE_FILE + +FANCTROLERROR = 1 +FANCTROLDEBUG = 2 +FANAIRFLOWDEBUG = 4 + +debuglevel = 0 + +F2B_AIR_FLOW = "intake" +B2F_AIR_FLOW = "exhaust" +ONIE_E2_NAME = "ONIE_E2" + +TEMP_REBOOT_CRIT_SWITCH_FLAG = 1 +TEMP_REBOOT_CRIT_OTHER_FLAG = 2 + + +def fancontrol_debug(s): + if FANCTROLDEBUG & debuglevel: + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def fancontrol_error(s): + if FANCTROLERROR & debuglevel: + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def fanairflow_debug(s): + if FANAIRFLOWDEBUG & debuglevel: + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def fancontrol_warn(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_WARNING, s) + + +def fancontrol_crit(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_CRIT, s) + + +def fancontrol_alert(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_ALERT, s) + + +def fancontrol_emerg(s): + syslog.openlog("FANCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_EMERG, s) + + +def exec_os_cmd(cmd): + status, output = subprocess.getstatusoutput(cmd) + if status: + print(output) + return status, output + + +def debug_init(): + global debuglevel + try: + with open(FANCTROL_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +error_temp = -9999 # get temp error +invalid_temp = -10000 # get temp invalid +PRE_FAN_NOK_UNKNOWN = "UNKNOWN" + + +class DevFan(object): + + def __init__(self, name, hal_interface): + self.__name = name + self.origin_name = None + self.display_name = None + self.air_flow = None + self.air_flow_inconsistent = False + self.int_case = hal_interface + + @property + def name(self): + return self.__name + + def get_fan_rotor_number(self): + return self.int_case.get_fan_rotor_number(self.name) + + def get_fan_presence(self): + return self.int_case.get_fan_presence(self.name) + + def get_fan_rotor_status(self, rotor_name): + return self.int_case.get_fan_rotor_status(self.name, rotor_name) + + def get_fan_fru_info(self): + return self.int_case.get_fan_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def update_fru_info(self): + try: + dic = self.get_fan_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + fanairflow_debug("update %s fru info error, msg: %s" % (self.name, str(e))) + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + +class DevPsu(object): + + def __init__(self, name, hal_interface): + self.__name = name + self.origin_name = None + self.display_name = None + self.air_flow = None + self.air_flow_inconsistent = False + self.int_case = hal_interface + + @property + def name(self): + return self.__name + + def get_psu_fru_info(self): + return self.int_case.get_psu_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def update_fru_info(self): + try: + dic = self.get_psu_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + fanairflow_debug("update %s fru info error, msg: %s" % (self.name, str(e))) + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + +class fancontrol(object): + __int_case = None + + __pwm = 0x80 + + def __init__(self): + self.int_case = interface() + self.__config = baseutil.get_monitor_config() + self.__pid_config = self.__config["pid"] + self.__hyst_config = self.__config.get("hyst", {}) + self.__temps_threshold_config = self.__config["temps_threshold"] + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['temp'] = 0 + temp_threshold['fail_num'] = 0 + temp_threshold['warning_num'] = 0 # temp warning times + temp_threshold['critical_num'] = 0 # temp critical times + temp_threshold['emergency_num'] = 0 # temp emergency times + temp_threshold.setdefault('ignore_threshold', 0) # default temp threshold on + temp_threshold.setdefault('invalid', invalid_temp) + temp_threshold.setdefault('error', error_temp) + + self.__otp_reboot_judge_file_config = self.__config.get("otp_reboot_judge_file", None) + if self.__otp_reboot_judge_file_config is None: + self.__otp_switch_reboot_judge_file = OTP_SWITCH_REBOOT_JUDGE_FILE + self.__otp_other_reboot_judge_file = OTP_OTHER_REBOOT_JUDGE_FILE + else: + self.__otp_switch_reboot_judge_file = self.__otp_reboot_judge_file_config.get( + "otp_switch_reboot_judge_file", OTP_SWITCH_REBOOT_JUDGE_FILE) + self.__otp_other_reboot_judge_file = self.__otp_reboot_judge_file_config.get( + "otp_other_reboot_judge_file", OTP_OTHER_REBOOT_JUDGE_FILE) + + self.__fan_rotor_error_num = {} + self.__fan_present_status = {} # {"FAN1":0, "FAN2":1...} 1:present, 0:absent + self.__fan_rotate_status = {} # {"FAN1":0, "FAN2":1...} 1:OK, 0:NOT OK + self.__fan_repair_flag = {} # {"FAN1":0, "FAN2":1...} 1:repair, 0:give up + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + self.__fan_present_status[fan_name] = 1 # present + self.__fan_rotate_status[fan_name] = 1 # OK + self.__fan_repair_flag[fan_name] = 1 # repair + rotor_num = self.get_rotor_number(fan_name) + tmp_fan = {} + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + tmp_fan[rotor_name] = 0 # not error + self.__fan_rotor_error_num[fan_name] = tmp_fan + + self.__fancontrol_para = self.__config["fancontrol_para"] + self.__interval = self.__fancontrol_para.get("interval", 5) + self.__fan_status_interval = self.__fancontrol_para.get("fan_status_interval", 0) + self.__max_pwm = self.__fancontrol_para.get("max_pwm", 0xff) + self.__min_pwm = self.__fancontrol_para.get("min_pwm", 0x80) + self.__abnormal_pwm = self.__fancontrol_para.get("abnormal_pwm", 0xbb) + self.__warning_pwm = self.__fancontrol_para.get("warning_pwm", 0xff) + self.__temp_invalid_pid_pwm = self.__fancontrol_para.get("temp_invalid_pid_pwm", 0x80) + self.__temp_error_pid_pwm = self.__fancontrol_para.get("temp_error_pid_pwm", 0x80) + self.__temp_fail_num = self.__fancontrol_para.get("temp_fail_num", 3) + self.__check_temp_fail = self.__fancontrol_para.get("check_temp_fail", []) + self.__temp_warning_num = self.__fancontrol_para.get("temp_warning_num", 3) + self.__temp_critical_num = self.__fancontrol_para.get("temp_critical_num", 3) + self.__temp_emergency_num = self.__fancontrol_para.get("temp_emergency_num", 3) + self.__temp_warning_countdown = self.__fancontrol_para.get("temp_warning_countdown", 60) + self.__temp_critical_countdown = self.__fancontrol_para.get("temp_critical_countdown", 60) + self.__temp_emergency_countdown = self.__fancontrol_para.get("temp_emergency_countdown", 60) + self.__rotor_error_count = self.__fancontrol_para.get("rotor_error_count", 6) + self.__inlet_mac_diff = self.__fancontrol_para.get("inlet_mac_diff", 50) + self.__check_crit_reboot_flag = self.__fancontrol_para.get("check_crit_reboot_flag", 1) + self.__check_emerg_reboot_flag = self.__fancontrol_para.get("check_emerg_reboot_flag", 1) + self.__check_crit_reboot_num = self.__fancontrol_para.get("check_crit_reboot_num", 3) + self.__check_crit_sleep_time = self.__fancontrol_para.get("check_crit_sleep_time", 20) + self.__check_emerg_reboot_num = self.__fancontrol_para.get("check_emerg_reboot_num", 3) + self.__check_emerg_sleep_time = self.__fancontrol_para.get("check_emerg_sleep_time", 20) + self.__check_temp_emergency = self.__fancontrol_para.get("check_temp_emergency", 0) + self.__check_temp_critical = self.__fancontrol_para.get("check_temp_critical", 1) + self.__check_temp_warning = self.__fancontrol_para.get("check_temp_warning", 1) + self.__check_temp_emergency_reboot = self.__fancontrol_para.get("check_temp_emergency_reboot", []) + self.__psu_absent_fullspeed_num = self.__fancontrol_para.get("psu_absent_fullspeed_num", 1) + self.__fan_absent_fullspeed_num = self.__fancontrol_para.get("fan_absent_fullspeed_num", 1) + self.__rotor_error_fullspeed_num = self.__fancontrol_para.get("rotor_error_fullspeed_num", 1) + self.__psu_fan_control = self.__fancontrol_para.get("psu_fan_control", 1) # default control psu fan + self.__fan_plug_in_pwm = self.__fancontrol_para.get("fan_plug_in_pwm", 0x80) + self.__fan_plug_in_default_countdown = self.__fancontrol_para.get("fan_plug_in_default_countdown", 0) + self.__deal_fan_error_policy = self.__fancontrol_para.get("deal_fan_error", 0) + self.__deal_fan_error_conf = self.__fancontrol_para.get("deal_fan_error_conf", {}) + self.__deal_fan_error_default_countdown = self.__deal_fan_error_conf.get("countdown", 0) + + self.__warning_countdown = 0 # temp warning flag for normal fancontrol + self.__critical_countdown = 0 # temp critical flag for normal fancontrol + self.__emergency_countdown = 0 # temp emergency flag for normal fancontrol + self.__fan_plug_in_countdown = 0 # fan plug in flag for normal fancontrol + self.__deal_fan_error_countdown = 0 + self.__fan_absent_num = 0 + self.__fan_nok_num = 0 + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + self.openloop = openloop() + self.pid = pid() + self.hyst = hysteresis() + self.__pwm = self.__min_pwm + + self.__board_air_flow = "" + self.__fan_air_flow_monitor = self.__fancontrol_para.get("fan_air_flow_monitor", 0) + self.__psu_air_flow_monitor = self.__fancontrol_para.get("psu_air_flow_monitor", 0) + self.__air_flow_correct_fan_pwm = self.__fancontrol_para.get("air_flow_correct_fan_pwm", 0xff) + self.__air_flow_correct_psu_pwm = self.__fancontrol_para.get("air_flow_correct_psu_pwm", 0xff) + self.__air_flow_error_fan_pwm = self.__fancontrol_para.get("air_flow_error_fan_pwm", 0) + self.__air_flow_error_psu_pwm = self.__fancontrol_para.get("air_flow_error_psu_pwm", 0) + self.fan_air_flow_inconsistent_flag = False + self.psu_air_flow_inconsistent_flag = False + self.air_flow_inconsistent_flag = False + self.fan_obj_list = [] + self.psu_obj_list = [] + + @property + def na_ret(self): + return self.int_case.na_ret + + def get_onie_e2_obj(self, name): + return self.int_case.get_onie_e2_obj(name) + + @property + def board_air_flow(self): + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if self.__board_air_flow not in air_flow_tuple: + self.__board_air_flow = self.int_case.get_device_airflow(ONIE_E2_NAME) + fanairflow_debug("board_air_flow: %s" % self.__board_air_flow) + return self.__board_air_flow + + @property + def fan_air_flow_monitor(self): + return self.__fan_air_flow_monitor + + @property + def psu_air_flow_monitor(self): + return self.__psu_air_flow_monitor + + @property + def air_flow_correct_fan_pwm(self): + return self.__air_flow_correct_fan_pwm + + @property + def air_flow_correct_psu_pwm(self): + return self.__air_flow_correct_psu_pwm + + @property + def air_flow_error_fan_pwm(self): + return self.__air_flow_error_fan_pwm + + @property + def air_flow_error_psu_pwm(self): + return self.__air_flow_error_psu_pwm + + def get_para(self, t): + para = self.__pid_config.get(t) + return para + + def update_over_temp_threshold_num(self): + for temp_threshold in self.__temps_threshold_config.values(): + if temp_threshold['ignore_threshold']: + continue + emergency_threshold = temp_threshold.get('emergency', None) + critical_threshold = temp_threshold.get('critical', None) + warning_threshold = temp_threshold.get('warning', None) + fancontrol_debug("%s warning = %s, critical = %s, emergency = %s" % + (temp_threshold['name'], warning_threshold, critical_threshold, emergency_threshold)) + + if emergency_threshold is not None and temp_threshold['temp'] >= emergency_threshold: + temp_threshold['emergency_num'] += 1 + else: + temp_threshold['emergency_num'] = 0 + + if critical_threshold is not None and temp_threshold['temp'] >= critical_threshold: + temp_threshold['critical_num'] += 1 + else: + temp_threshold['critical_num'] = 0 + + if warning_threshold is not None and temp_threshold['temp'] >= warning_threshold: + temp_threshold['warning_num'] += 1 + else: + temp_threshold['warning_num'] = 0 + + fancontrol_debug("%s warning_num = %d, critical_num = %d, emergency_num = %d" % + (temp_threshold['name'], temp_threshold['warning_num'], temp_threshold['critical_num'], temp_threshold.get("emergency_num"))) + + def get_monitor_temp(self): + sensorlist = self.int_case.get_temp_info() + + for temp_threshold in self.__temps_threshold_config.values(): + sensor = sensorlist.get(temp_threshold['name']) + if sensor["Value"] is None or int(sensor["Value"]) == self.int_case.error_ret: + temp_threshold['fail_num'] += 1 + fancontrol_error("get %s failed, fail_num = %d" % (temp_threshold['name'], temp_threshold['fail_num'])) + else: + temp_threshold['fail_num'] = 0 + temp_threshold.setdefault('fix', 0) + temp_threshold['temp'] = sensor["Value"] + temp_threshold['fix'] + fancontrol_debug("%s = %d" % (temp_threshold['name'], temp_threshold['temp'])) + self.update_over_temp_threshold_num() + + def is_temp_warning(self): + warning_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + if temp_threshold['ignore_threshold']: + continue + if temp_threshold['warning_num'] >= self.__temp_warning_num: + warning_flag = True + fancontrol_warn("%%FANCONTROL-4-TEMP_HIGH: %s temperature %sC is larger than warning threshold %sC." % + (temp_threshold['name'], temp_threshold['temp'], temp_threshold.get('warning'))) + return warning_flag + + def checkTempWarning(self): + try: + if self.is_temp_warning(): + self.__warning_countdown = self.__temp_warning_countdown + fancontrol_debug("temp is over warning") + return True + if self.__warning_countdown > 0: + self.__warning_countdown -= 1 + return False + except Exception as e: + fancontrol_error("%%policy: checkTempWarning failed") + fancontrol_error(str(e)) + return False + + def checkTempWarningCountdown(self): + if self.__warning_countdown > 0: + return True + return False + + def is_temp_critical(self): + critical_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['critical_flag'] = False + if temp_threshold['ignore_threshold']: + continue + if temp_threshold['critical_num'] >= self.__temp_critical_num: + critical_flag = True + temp_threshold['critical_flag'] = True + fancontrol_crit("%%FANCONTROL-2-TEMP_HIGH: %s temperature %sC is larger than critical threshold %sC." % + (temp_threshold['name'], temp_threshold['temp'], temp_threshold.get('critical'))) + return critical_flag + + def checkTempCritical(self): + try: + if self.is_temp_critical(): + self.__critical_countdown = self.__temp_critical_countdown + fancontrol_debug("temp is over critical") + return True + if self.__critical_countdown > 0: + self.__critical_countdown -= 1 + return False + except Exception as e: + fancontrol_error("%%policy: checkTempCrit failed") + fancontrol_error(str(e)) + return False + + def is_temp_emergency(self): + emergency_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['emergency_flag'] = False + if temp_threshold['ignore_threshold']: + continue + if temp_threshold['emergency_num'] >= self.__temp_emergency_num: + emergency_flag = True + temp_threshold['emergency_flag'] = True + fancontrol_alert("%%FANCONTROL-1-TEMP_HIGH: %s temperature %sC is larger than emergency threshold %sC." % + (temp_threshold['name'], temp_threshold['temp'], temp_threshold.get('emergency'))) + return emergency_flag + + def checkTempEmergency(self): + try: + if self.is_temp_emergency(): + self.__emergency_countdown = self.__temp_emergency_countdown + fancontrol_debug("temp is over emergency") + return True + if self.__emergency_countdown > 0: + self.__emergency_countdown -= 1 + return False + except Exception as e: + fancontrol_error("%%policy: checkTempEmergency failed") + fancontrol_error(str(e)) + return False + + def checkTempCriticalCountdown(self): + if self.__critical_countdown > 0: + return True + return False + + def checkTempEmergencyCountdown(self): + if self.__emergency_countdown > 0: + return True + return False + + def checkTempRebootCrit(self): + try: + if self.is_temp_critical(): + temp_dict = dict(self.__temps_threshold_config) + tmp = temp_dict.get(SWITCH_TEMP) + if tmp['critical_flag'] is True: + fancontrol_debug("switch temp is over reboot critical") + return TEMP_REBOOT_CRIT_SWITCH_FLAG + del temp_dict[SWITCH_TEMP] + for temp_items in temp_dict.values(): + if temp_items['ignore_threshold']: + continue + if temp_items['critical_flag'] is False: + return 0 + + fancontrol_debug("other temp is over reboot critical") + return TEMP_REBOOT_CRIT_OTHER_FLAG + except Exception as e: + fancontrol_error("%%policy: checkTempRebootCrit failed") + fancontrol_error(str(e)) + return 0 + + def checkCritReboot(self): + try: + reboot_flag = self.checkTempRebootCrit() + if reboot_flag > 0: + self.set_all_fan_speed_pwm(self.__max_pwm) + for i in range(self.__check_crit_reboot_num): + time.sleep(self.__check_crit_sleep_time) + self.get_monitor_temp() + reboot_flag = self.checkTempRebootCrit() + if reboot_flag > 0: + fancontrol_emerg("%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot critical value lasts for %d seconds." % + (self.__check_crit_sleep_time * (i + 1))) + continue + fancontrol_debug("The temperature of device is not over reboot critical value.") + break + if reboot_flag > 0: + fancontrol_emerg( + "%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot critical value, system is going to reboot now.") + for temp_threshold in self.__temps_threshold_config.values(): + fancontrol_emerg( + "%%FANCONTROL-TEMP_EMERG: %s temperature: %sC." % + (temp_threshold['name'], temp_threshold['temp'])) + if reboot_flag == TEMP_REBOOT_CRIT_SWITCH_FLAG: + create_judge_file = "touch %s" % self.__otp_switch_reboot_judge_file + else: + create_judge_file = "touch %s" % self.__otp_other_reboot_judge_file + exec_os_cmd(create_judge_file) + exec_os_cmd("sync") + time.sleep(3) + os.system("/sbin/reboot") + except Exception as e: + fancontrol_error("%%policy: checkCritReboot failed") + fancontrol_error(str(e)) + + def checkTempRebootEmerg(self): + try: + if self.is_temp_emergency(): + temp_emerg_reboot_flag = False + for temp_list in self.__check_temp_emergency_reboot: + for temp in temp_list: + tmp = self.__temps_threshold_config.get(temp) + if tmp['emergency_flag'] is False: + fancontrol_debug("temp_list %s, temp: %s not emergency" % (temp_list, temp)) + temp_emerg_reboot_flag = False + break + temp_emerg_reboot_flag = True + if temp_emerg_reboot_flag is True: + fancontrol_debug("temp_list %s, all temp is over emergency reboot" % temp_list) + return True + except Exception as e: + fancontrol_error("%%policy: checkTempRebootEmerg failed") + fancontrol_error(str(e)) + return False + + def checkEmergReboot(self): + try: + reboot_flag = False + if self.checkTempRebootEmerg() is True: + self.set_all_fan_speed_pwm(self.__max_pwm) + for i in range(self.__check_emerg_reboot_num): + time.sleep(self.__check_emerg_sleep_time) + self.get_monitor_temp() + if self.checkTempRebootEmerg() is True: + fancontrol_emerg("%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot emergency value lasts for %d seconds." % + (self.__check_emerg_sleep_time * (i + 1))) + reboot_flag = True + continue + fancontrol_debug("The temperature of device is not over reboot emergency value.") + reboot_flag = False + break + if reboot_flag is True: + fancontrol_emerg( + "%%FANCONTROL-0-TEMP_EMERG: The temperature of device over reboot emergency value, system is going to reboot now.") + for temp_threshold in self.__temps_threshold_config.values(): + fancontrol_emerg( + "%%FANCONTROL-0-TEMP_EMERG: %s temperature: %sC." % + (temp_threshold['name'], temp_threshold['temp'])) + create_judge_file = "touch %s" % OTP_SWITCH_REBOOT_JUDGE_FILE + exec_os_cmd(create_judge_file) + exec_os_cmd("sync") + time.sleep(3) + os.system("/sbin/reboot") + except Exception as e: + fancontrol_error("%%policy: checkEmergReboot failed") + fancontrol_error(str(e)) + + def get_fan_total_number(self): + return self.int_case.get_fan_total_number() + + def get_rotor_number(self, fan_name): + return self.int_case.get_fan_rotor_number(fan_name) + + def get_fan_presence(self, fan_name): + return self.int_case.get_fan_presence(fan_name) + + def get_fan_rotor_status(self, fan_name, rotor_name): + return self.int_case.get_fan_rotor_status(fan_name, rotor_name) + + def get_psu_total_number(self): + return self.int_case.get_psu_total_number() + + def get_psu_presence(self, psu_name): + return self.int_case.get_psu_presence(psu_name) + + def get_psu_input_output_status(self, psu_name): + return self.int_case.get_psu_input_output_status(psu_name) + + def checkFanPresence(self): + absent_num = 0 + + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + rotor_num = self.get_rotor_number(fan_name) + tmp_fan = self.__fan_rotor_error_num.get(fan_name) + status = self.get_fan_presence(fan_name) + if status is False: + absent_num = absent_num + 1 + self.__fan_present_status[fan_name] = 0 + fancontrol_debug("%s absent" % fan_name) + else: + if self.__fan_present_status[fan_name] == 0: # absent -> present + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + self.__fan_plug_in_countdown = self.__fan_plug_in_default_countdown + self.__fan_repair_flag[fan_name] = 1 + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + tmp_fan[rotor_name] = 0 + self.__fan_present_status[fan_name] = 1 + fancontrol_debug("%s presence" % fan_name) + return absent_num + + def checkFanRotorStatus(self): + err_num = 0 + self.__fan_nok_num = 0 + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + rotor_num = self.get_rotor_number(fan_name) + tmp_fan = self.__fan_rotor_error_num.get(fan_name) + fan_rotor_err_cnt = 0 + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + status = self.get_fan_rotor_status(fan_name, rotor_name) + if status is True: + tmp_fan[rotor_name] = 0 + fancontrol_debug("%s %s ok" % (fan_name, rotor_name)) + else: + tmp_fan[rotor_name] += 1 + if tmp_fan[rotor_name] >= self.__rotor_error_count: + err_num = err_num + 1 + fan_rotor_err_cnt += 1 + fancontrol_debug("%s %s error" % (fan_name, rotor_name)) + fancontrol_debug("%s %s error %d times" % (fan_name, rotor_name, tmp_fan[rotor_name])) + if fan_rotor_err_cnt == 0: + self.__fan_rotate_status[fan_name] = 1 # FAN is ok + else: + self.__fan_rotate_status[fan_name] = 0 # FAN is not ok + self.__fan_nok_num += 1 + fancontrol_debug("fan not ok number:%d." % self.__fan_nok_num) + return err_num + + def checkPsuPresence(self): + absent_num = 0 + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + status = self.get_psu_presence(psu_name) + if status is False: + absent_num = absent_num + 1 + fancontrol_debug("%s absent" % psu_name) + else: + fancontrol_debug("%s presence" % psu_name) + return absent_num + + def checkPsuStatus(self): + err_num = 0 + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + status = self.get_psu_input_output_status(psu_name) + if status is False: + err_num = err_num + 1 + fancontrol_debug("%s error" % psu_name) + else: + fancontrol_debug("%s ok" % psu_name) + return err_num + + def checkDevError(self): + pwm = self.__min_pwm + switchtemp = self.__temps_threshold_config.get(SWITCH_TEMP)['temp'] + inlettemp = self.__temps_threshold_config.get(INLET_TEMP)['temp'] + temp_diff = abs(switchtemp - inlettemp) + fancontrol_debug("|switchtemp - inlettemp| = %d" % temp_diff) + if temp_diff >= self.__inlet_mac_diff: + fancontrol_debug("temp_diff is over than inlet_mac_diff(%d)" % self.__inlet_mac_diff) + if self.__pwm > self.__abnormal_pwm: + pwm = self.__max_pwm + else: + pwm = self.__abnormal_pwm + return pwm + + def checktempfail(self): + pwm = self.__min_pwm + for temp in self.__check_temp_fail: + temp_name = temp.get("temp_name") + temp_fail_num = self.__temps_threshold_config.get(temp_name)['fail_num'] + if temp_fail_num >= self.__temp_fail_num: + pwm = self.__abnormal_pwm + fancontrol_debug("%s temp_fail_num = %d" % (temp_name, temp_fail_num)) + fancontrol_debug("self.__temp_fail_num = %d" % self.__temp_fail_num) + return pwm + + def abnormal_check(self): + pwm_list = [] + pwm_min = self.__min_pwm + pwm_list.append(pwm_min) + + if self.__check_temp_emergency == 1: + status = self.checkTempEmergency() + if status is True: + over_emerg_pwm = self.__max_pwm + pwm_list.append(over_emerg_pwm) + fancontrol_debug("over_emerg_pwm = 0x%x" % over_emerg_pwm) + # do reset check + if self.__check_emerg_reboot_flag == 1: + self.checkEmergReboot() + else: + if self.checkTempEmergencyCountdown() is True: # temp lower than emergency in 5 min + over_emerg_countdown_pwm = self.__max_pwm + pwm_list.append(over_emerg_countdown_pwm) + fancontrol_debug("TempEmergencyCountdown: %d, over_emerg_countdown_pwm = 0x%x" % + (self.__emergency_countdown, over_emerg_countdown_pwm)) + + if self.__check_temp_critical == 1: + status = self.checkTempCritical() + if status is True: + over_crit_pwm = self.__max_pwm + pwm_list.append(over_crit_pwm) + fancontrol_debug("over_crit_pwm = 0x%x" % over_crit_pwm) + # do reset check + if self.__check_crit_reboot_flag == 1: + self.checkCritReboot() + else: + if self.checkTempCriticalCountdown() is True: # temp lower than critical in 5 min + over_crit_countdown_pwm = self.__max_pwm + pwm_list.append(over_crit_countdown_pwm) + fancontrol_debug("TempCriticalCountdown: %d, over_crit_countdown_pwm = 0x%x" % + (self.__critical_countdown, over_crit_countdown_pwm)) + + if self.__check_temp_warning == 1: + status = self.checkTempWarning() + if status is True: + over_warn_pwm = self.__warning_pwm + pwm_list.append(over_warn_pwm) + fancontrol_debug("over_warn_pwm = 0x%x" % over_warn_pwm) + else: + if self.checkTempWarningCountdown() is True: # temp lower than warning in 5 min + over_warn_countdown_pwm = self.__warning_pwm + pwm_list.append(over_warn_countdown_pwm) + fancontrol_debug("TempWarningCountdown: %d, over_warn_countdown_pwm = 0x%x" % + (self.__warning_countdown, over_warn_countdown_pwm)) + + self.__fan_absent_num = self.checkFanPresence() + if self.__fan_absent_num >= self.__fan_absent_fullspeed_num: + fan_absent_pwm = self.__max_pwm + pwm_list.append(fan_absent_pwm) + fancontrol_debug("fan_absent_pwm = 0x%x" % fan_absent_pwm) + + rotor_err_num = self.checkFanRotorStatus() + if rotor_err_num >= self.__rotor_error_fullspeed_num: + rotor_err_pwm = self.__max_pwm + pwm_list.append(rotor_err_pwm) + fancontrol_debug("rotor_err_pwm = 0x%x" % rotor_err_pwm) + + psu_absent_num = self.checkPsuPresence() + if psu_absent_num >= self.__psu_absent_fullspeed_num: + psu_absent_pwm = self.__max_pwm + pwm_list.append(psu_absent_pwm) + fancontrol_debug("psu_absent_pwm = 0x%x" % psu_absent_pwm) + + dev_err_pwm = self.checkDevError() + pwm_list.append(dev_err_pwm) + fancontrol_debug("dev_err_pwm = 0x%x" % dev_err_pwm) + + temp_fail_pwm = self.checktempfail() + pwm_list.append(temp_fail_pwm) + fancontrol_debug("temp_fail_pwm = 0x%x" % temp_fail_pwm) + + pwm = max(pwm_list) + return pwm + + def get_error_fan(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + if self.__fan_rotate_status[fan_name] == 0: + return fan_name + return None + + def fan_error_update_pwm(self, fan_pwm_dict): + try: + fancontrol_debug("enter deal fan error policy") + ori_fan_pwm_dict = fan_pwm_dict.copy() + + err_fan_name = self.get_error_fan() + if err_fan_name is None: + fancontrol_debug("fan name is None, do nothing.") + return ori_fan_pwm_dict + + if self.__fan_repair_flag[err_fan_name] == 0: + fancontrol_debug("%s already repaired, do nothing." % err_fan_name) + return ori_fan_pwm_dict + + if self.__pre_fan_nok != err_fan_name: + fancontrol_debug( + "not ok fan change from %s to %s, update countdown." % + (self.__pre_fan_nok, err_fan_name)) + self.__deal_fan_error_countdown = self.__deal_fan_error_default_countdown + if self.__pre_fan_nok != PRE_FAN_NOK_UNKNOWN: + fancontrol_debug( + "%s repaire success, %s NOT OK, try to repaire." % + (self.__pre_fan_nok, err_fan_name)) + self.__fan_repair_flag[self.__pre_fan_nok] = 0 + self.__pre_fan_nok = err_fan_name + + if self.__deal_fan_error_countdown > 0: + self.__deal_fan_error_countdown -= 1 + fancontrol_debug("%s repaire, countdown %d." % (err_fan_name, self.__deal_fan_error_countdown)) + + if self.__deal_fan_error_countdown == 0: + self.__fan_repair_flag[err_fan_name] = 0 + fancontrol_debug("%s set repaire fail flag, use origin pwm." % err_fan_name) + return ori_fan_pwm_dict + + fan_err_pwm_conf_list = self.__deal_fan_error_conf[err_fan_name] + for item in fan_err_pwm_conf_list: + fan_pwm_dict[item["name"]] = item["pwm"] + fancontrol_debug("fan pwm update, fan pwm dict:%s" % fan_pwm_dict) + + return fan_pwm_dict + except Exception as e: + fancontrol_error("%%policy: deal_fan_error raise Exception:%s" % str(e)) + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + return ori_fan_pwm_dict + + def get_fan_pwm_dict(self, default_pwm): + fan_pwm_dict = {} + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_pwm_dict[fan_name] = default_pwm + if self.__deal_fan_error_policy: + if self.__fan_absent_num == 0 and self.__fan_nok_num == 1: + fan_pwm_dict = self.fan_error_update_pwm(fan_pwm_dict) + else: + if self.__pre_fan_nok != PRE_FAN_NOK_UNKNOWN and self.__fan_rotate_status[self.__pre_fan_nok] == 1: + fancontrol_debug("%s repaire success." % (self.__pre_fan_nok)) + self.__fan_repair_flag[self.__pre_fan_nok] = 0 + self.__pre_fan_nok = PRE_FAN_NOK_UNKNOWN + return fan_pwm_dict + + def get_psu_pwm_dict(self, default_pwm): + psu_pwm_dict = {} + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_pwm_dict[psu_name] = default_pwm + return psu_pwm_dict + + def check_board_air_flow(self): + board_air_flow = self.board_air_flow + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if board_air_flow not in air_flow_tuple: + fanairflow_debug("get board air flow error, value [%s]" % board_air_flow) + return False + fanairflow_debug("board air flow check ok: %s" % board_air_flow) + return True + + def check_fan_air_flow(self): + if self.fan_air_flow_monitor: + fanairflow_debug("open air flow monitor, check fan air flow") + ret = self.check_board_air_flow() + if ret is False: + fanairflow_debug("get board air flow error, set fan_air_flow_inconsistent_flag False") + self.fan_air_flow_inconsistent_flag = False + return + air_flow_inconsistent_flag_tmp = False + for fan_obj in self.fan_obj_list: + fan_obj.update_fru_info() + fanairflow_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow)) + if fan_obj.air_flow == self.na_ret: + fanairflow_debug("%s get air flow failed, set air_flow_inconsistent flag False" % fan_obj.name) + fan_obj.air_flow_inconsistent = False + continue + if fan_obj.air_flow != self.board_air_flow: + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], fan air flow [%s], board air flow [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + air_flow_inconsistent_flag_tmp = True + fan_obj.air_flow_inconsistent = True + else: + fanairflow_debug("%s air flow check ok, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + fan_obj.air_flow_inconsistent = False + self.fan_air_flow_inconsistent_flag = air_flow_inconsistent_flag_tmp + else: + fanairflow_debug("air flow monitor not open, set fan_air_flow_inconsistent_flag False") + self.fan_air_flow_inconsistent_flag = False + return + + def check_psu_air_flow(self): + if self.psu_air_flow_monitor: + fanairflow_debug("open air flow monitor, check psu air flow") + ret = self.check_board_air_flow() + if ret is False: + fanairflow_debug("get board air flow error, set psu_air_flow_inconsistent_flag False") + self.psu_air_flow_inconsistent_flag = False + return + air_flow_inconsistent_flag_tmp = False + for psu_obj in self.psu_obj_list: + psu_obj.update_fru_info() + fanairflow_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow)) + if psu_obj.air_flow == self.na_ret: + fanairflow_debug("%s get air flow failed, set air_flow_inconsistent flag False" % psu_obj.name) + psu_obj.air_flow_inconsistent = False + continue + if psu_obj.air_flow != self.board_air_flow: + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], psu air flow [%s], board air flow [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + air_flow_inconsistent_flag_tmp = True + psu_obj.air_flow_inconsistent = True + else: + fanairflow_debug("%s air flow check ok, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + psu_obj.air_flow_inconsistent = False + self.psu_air_flow_inconsistent_flag = air_flow_inconsistent_flag_tmp + else: + fanairflow_debug("air flow monitor not open, set psu_air_flow_inconsistent_flag False") + self.psu_air_flow_inconsistent_flag = False + return + + def do_fancontrol(self): + pwm_list = [] + pwm_min = self.__min_pwm + pwm_list.append(pwm_min) + + # first check air flow + self.check_fan_air_flow() + self.check_psu_air_flow() + if self.fan_air_flow_inconsistent_flag is True or self.psu_air_flow_inconsistent_flag is True: + self.air_flow_inconsistent_flag = True + else: + self.air_flow_inconsistent_flag = False + fanairflow_debug("check_air_flow, air_flow_inconsistent_flag: %s" % self.air_flow_inconsistent_flag) + # get_monitor_temp + self.get_monitor_temp() + fancontrol_debug("last_pwm = 0x%x" % self.__pwm) + # openloop + inlettemp = self.__temps_threshold_config.get(INLET_TEMP)['temp'] + linear_value = self.openloop.linear_cacl(inlettemp) + if linear_value is None: + linear_value = self.__min_pwm + pwm_list.append(linear_value) + fancontrol_debug("linear_value = 0x%x" % linear_value) + + curve_value = self.openloop.curve_cacl(inlettemp) + if curve_value is None: + curve_value = self.__min_pwm + pwm_list.append(curve_value) + fancontrol_debug("curve_value = 0x%x" % curve_value) + + # hyst + for hyst_index in self.__hyst_config.values(): + temp_name = hyst_index.get("name") + hyst_flag = hyst_index.get("flag", 0) + if hyst_flag == 0: + fancontrol_debug("%s hyst flag is 0, do nothing" % temp_name) + continue + tmp_temp = int(self.__temps_threshold_config.get(temp_name)['temp']) # make sure temp is int + hyst_value = self.hyst.cacl(temp_name, tmp_temp) + if hyst_value is None: + hyst_value = self.__min_pwm + pwm_list.append(hyst_value) + fancontrol_debug("%s hyst_value = 0x%x" % (temp_name, hyst_value)) + + # pid + for pid_index in self.__pid_config.values(): + temp_name = pid_index.get("name") + pid_flag = pid_index.get("flag", 0) + if pid_flag == 0: + fancontrol_debug("%s pid flag is 0, do nothing" % temp_name) + continue + tmp_temp = self.__temps_threshold_config.get(temp_name)['temp'] + if tmp_temp is not None: + tmp_temp = int(tmp_temp) # make sure temp is int + invalid_temp_val = self.__temps_threshold_config.get(temp_name)['invalid'] + error_temp_val = self.__temps_threshold_config.get(temp_name)['error'] + if tmp_temp == invalid_temp_val: # temp is invalid + temp = None + self.pid.cacl(self.__pwm, temp_name, temp) # temp invalid, PID need to record None + pid_value = self.__temp_invalid_pid_pwm + fancontrol_debug("%s is invalid, pid_value = 0x%x" % (temp_name, pid_value)) + fancontrol_debug("temp = %d, invalid_temp = %d" % (tmp_temp, invalid_temp_val)) + elif tmp_temp == error_temp_val: # temp is error + temp = None + self.pid.cacl(self.__pwm, temp_name, temp) # temp error, PID need to record None + pid_value = self.__temp_error_pid_pwm + fancontrol_debug("%s is error, pid_value = 0x%x" % (temp_name, pid_value)) + fancontrol_debug("temp = %d, error_temp = %d" % (tmp_temp, error_temp_val)) + else: + pid_value = self.pid.cacl(self.__pwm, temp_name, tmp_temp) + else: # temp get failed + pid_value = self.pid.cacl(self.__pwm, temp_name, tmp_temp) + if pid_value is None: + pid_value = self.__min_pwm + pwm_list.append(pid_value) + fancontrol_debug("%s pid_value = 0x%x" % (temp_name, pid_value)) + + # abnormal + abnormal_value = self.abnormal_check() + pwm_list.append(abnormal_value) + fancontrol_debug("abnormal_value = 0x%x" % abnormal_value) + + if self.__fan_plug_in_countdown > 0 and self.__fan_absent_num == 0: + fancontrol_debug("fan plug in countdown %d, set plug in pwm: 0x%x" % + (self.__fan_plug_in_countdown, self.__fan_plug_in_pwm)) + self.__pwm = self.__fan_plug_in_pwm + self.__fan_plug_in_countdown -= 1 + else: + self.__pwm = max(pwm_list) + fancontrol_debug("__pwm = 0x%x\n" % self.__pwm) + if self.air_flow_inconsistent_flag is True: + fanairflow_debug("air flow inconsistent, set all fan speed pwm") + self.set_all_fan_speed_pwm(self.__pwm) + else: + fanairflow_debug("air flow consistent, deal fan error policy") + fan_pwm_dict = self.get_fan_pwm_dict(self.__pwm) + psu_pwm_dict = self.get_psu_pwm_dict(self.__pwm) + self.set_fan_pwm_independent(fan_pwm_dict, psu_pwm_dict) + + def run(self): + start_time = time.time() + while True: + try: + debug_init() + if self.__fan_status_interval > 0 and self.__fan_status_interval < self.__interval: + delta_time = time.time() - start_time + if delta_time >= self.__interval or delta_time < 0: + self.do_fancontrol() + start_time = time.time() + else: + self.checkFanPresence() + time.sleep(self.__fan_status_interval) + else: + self.do_fancontrol() + time.sleep(self.__interval) + except Exception as e: + traceback.print_exc() + fancontrol_error(str(e)) + + def set_all_fan_speed_pwm(self, pwm): + fan_pwm_dict = {} + psu_pwm_dict = {} + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_pwm_dict[fan_name] = pwm + + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_pwm_dict[psu_name] = pwm + self.set_fan_pwm_independent(fan_pwm_dict, psu_pwm_dict) + + def set_fan_pwm_independent(self, fan_pwm_dict, psu_pwm_dict): + if self.air_flow_inconsistent_flag is True: + for psu_obj in self.psu_obj_list: + if psu_obj.air_flow_inconsistent is True: + psu_pwm_dict[psu_obj.name] = self.air_flow_error_psu_pwm + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s], set psu pwm: 0x%x" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow, self.air_flow_error_psu_pwm)) + else: + psu_pwm_dict[psu_obj.name] = self.air_flow_correct_psu_pwm + fanairflow_debug("%s air flow correct, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s], set psu pwm: 0x%x" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow, self.air_flow_correct_psu_pwm)) + + for fan_obj in self.fan_obj_list: + if fan_obj.air_flow_inconsistent is True: + fan_pwm_dict[fan_obj.name] = self.air_flow_error_fan_pwm + fanairflow_debug("%s air flow error, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s], set fan pwm: 0x%x" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow, self.air_flow_error_fan_pwm)) + else: + fan_pwm_dict[fan_obj.name] = self.air_flow_correct_fan_pwm + fanairflow_debug("%s air flow correct, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s], set fan pwm: 0x%x" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow, self.air_flow_correct_fan_pwm)) + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + self.fan_set_speed_pwm_by_name(fan_name, fan_pwm_dict[fan_name]) + if self.__psu_fan_control == 1: + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + self.psu_set_speed_pwm_by_name(psu_name, psu_pwm_dict[psu_name]) + + def fan_set_speed_pwm_by_name(self, fan_name, pwm): + duty = round(pwm * 100 / 255) + rotor_len = self.get_rotor_number(fan_name) + for i in range(rotor_len): + val = self.int_case.set_fan_speed_pwm(fan_name, i + 1, duty) + if val != 0: + fancontrol_error("%s rotor%d: %d" % (fan_name, i + 1, val)) + + def psu_set_speed_pwm_by_name(self, psu_name, pwm): + duty = round(pwm * 100 / 255) + status = self.int_case.set_psu_fan_speed_pwm(psu_name, int(duty)) + if status is not True: + fancontrol_error("set %s speed fail" % psu_name) + + def fan_obj_init(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_obj = DevFan(fan_name, self.int_case) + self.fan_obj_list.append(fan_obj) + fanairflow_debug("fan object initialize success") + + def psu_obj_init(self): + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_obj = DevPsu(psu_name, self.int_case) + self.psu_obj_list.append(psu_obj) + fanairflow_debug("psu object initialize success") + + +if __name__ == '__main__': + debug_init() + fancontrol_debug("enter main") + fan_control = fancontrol() + fan_control.fan_obj_init() + fan_control.psu_obj_init() + fan_control.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py new file mode 100755 index 0000000000..c21fd3c1f5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_ledctrl.py @@ -0,0 +1,830 @@ +#!/usr/bin/env python3 +import time +import syslog +import traceback +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil +try: + import abc +except ImportError as error: + raise ImportError(str(error) + " - required module not found") from error + +SWITCH_TEMP = "SWITCH_TEMP" +F2B_AIR_FLOW = "intake" +B2F_AIR_FLOW = "exhaust" +ONIE_E2_NAME = "ONIE_E2" + +# status +STATUS_PRESENT = "PRESENT" +STATUS_ABSENT = "ABSENT" +STATUS_OK = "OK" +STATUS_NOT_OK = "NOT OK" +STATUS_FAILED = "FAILED" +STATUS_UNKNOWN = "UNKNOWN" + +LEDCTROL_DEBUG_FILE = "/etc/.ledcontrol_debug_flag" + +LEDCTROLERROR = 1 +LEDCTROLDEBUG = 2 + +debuglevel = 0 +# led status defined +COLOR_GREEN = 1 +COLOR_AMBER = 2 +COLOR_RED = 3 +LED_STATUS_DICT = {COLOR_GREEN: "green", COLOR_AMBER: "amber", COLOR_RED: "red"} + + +def ledcontrol_debug(s): + if LEDCTROLDEBUG & debuglevel: + syslog.openlog("LEDCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def ledcontrol_error(s): + if LEDCTROLERROR & debuglevel: + syslog.openlog("LEDCONTROL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def air_flow_warn(s): + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_WARNING, s) + + +def air_flow_error(s): + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_ERR, s) + + +def air_flow_emerg(s): + syslog.openlog("AIR_FLOW_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_EMERG, s) + + +def debug_init(): + global debuglevel + try: + with open(LEDCTROL_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +class DevBase(object): + __metaclass__ = abc.ABCMeta + + def __init__(self, name, air_flow_monitor): + self.__name = name + self.__air_flow_monitor = air_flow_monitor + self.present = STATUS_UNKNOWN + self.status = STATUS_UNKNOWN + self.status_summary = STATUS_UNKNOWN + self.origin_name = STATUS_UNKNOWN + self.display_name = STATUS_UNKNOWN + self.air_flow = STATUS_UNKNOWN + self.led_status = COLOR_GREEN + + @property + def name(self): + return self.__name + + @property + def air_flow_monitor(self): + return self.__air_flow_monitor + + @abc.abstractmethod + def get_present(self): + """ + Gets the present status of PSU/FAN + + Returns: + A string, e.g. 'PRESENT, ABSENT, FAILED' + """ + raise NotImplementedError + + @abc.abstractmethod + def get_status(self): + """ + Gets the status of PSU/FAN + + Returns: + A string, e.g. 'OK, NOT OK, FAILED' + """ + raise NotImplementedError + + @abc.abstractmethod + def update_dev_info(self): + """ + update status and fru info of PSU/FAN + + include present, status, status_summary, part_model_name, product_name, air_flow + """ + raise NotImplementedError + + @abc.abstractmethod + def set_module_led(self, color): + """ + set PSU/FAN module LED status + + Args: + color: A string representing the color with which to set the + PSU/FAN module LED status + + Returns: + bool: True if status LED state is set successfully, False if not + """ + raise NotImplementedError + + +class DevPsu(DevBase): + + def __init__(self, name, air_flow_monitor, hal_interface): + super(DevPsu, self).__init__(name, air_flow_monitor) + self.int_case = hal_interface + + def get_psu_presence(self): + return self.int_case.get_psu_presence(self.name) + + def get_psu_input_output_status(self): + return self.int_case.get_psu_input_output_status(self.name) + + def get_psu_fru_info(self): + return self.int_case.get_psu_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def get_present(self): + try: + status = self.get_psu_presence() + if status is True: + return STATUS_PRESENT + if status is False: + return STATUS_ABSENT + except Exception as e: + ledcontrol_error("get %s present status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def get_status(self): + try: + status = self.get_psu_input_output_status() + if status is True: + return STATUS_OK + if status is False: + return STATUS_NOT_OK + except Exception as e: + ledcontrol_error("get %s status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def update_dev_info(self): + try: + # update status + self.present = self.get_present() + if self.present != STATUS_PRESENT: + self.status = STATUS_UNKNOWN + self.status_summary = self.present + else: + self.status = self.get_status() + self.status_summary = self.status + # update fru info if need air flow monitor + if self.air_flow_monitor: + dic = self.get_psu_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + ledcontrol_error("update %s info error, msg: %s" % (self.name, str(e))) + self.present = STATUS_FAILED + self.status = STATUS_FAILED + self.status_summary = STATUS_FAILED + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + def set_module_led(self, color): + """ + set PSU module LED is not support, always return True + """ + return True + + +class DevFan(DevBase): + + def __init__(self, name, air_flow_monitor, hal_interface): + super(DevFan, self).__init__(name, air_flow_monitor) + self.int_case = hal_interface + + def get_fan_rotor_number(self): + return self.int_case.get_fan_rotor_number(self.name) + + def get_fan_presence(self): + return self.int_case.get_fan_presence(self.name) + + def get_fan_rotor_status(self, rotor_name): + return self.int_case.get_fan_rotor_status(self.name, rotor_name) + + def get_fan_fru_info(self): + return self.int_case.get_fan_fru_info(self.name) + + @property + def na_ret(self): + return self.int_case.na_ret + + def get_present(self): + try: + status = self.get_fan_presence() + if status is True: + return STATUS_PRESENT + if status is False: + return STATUS_ABSENT + except Exception as e: + ledcontrol_error("get %s present status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def get_status(self): + try: + rotor_num = self.get_fan_rotor_number() + err_motor_num = 0 + for j in range(rotor_num): + rotor_name = "Rotor" + str(j + 1) + roll_status = self.get_fan_rotor_status(rotor_name) + if roll_status is not True: + err_motor_num += 1 + ledcontrol_debug("%s %s error, status %s" % (self.name, rotor_name, roll_status)) + else: + ledcontrol_debug("%s %s ok" % (self.name, rotor_name)) + if err_motor_num > 0: + return STATUS_NOT_OK + return STATUS_OK + except Exception as e: + ledcontrol_error("get %s status error, msg: %s" % (self.name, str(e))) + return STATUS_FAILED + + def update_dev_info(self): + try: + # update status + self.present = self.get_present() + if self.present != STATUS_PRESENT: + self.status = STATUS_UNKNOWN + self.status_summary = self.present + else: + self.status = self.get_status() + self.status_summary = self.status + # update fru info if need air flow monitor + if self.air_flow_monitor: + dic = self.get_fan_fru_info() + self.origin_name = dic["PN"] + self.air_flow = dic["AirFlow"] + self.display_name = dic["DisplayName"] + except Exception as e: + ledcontrol_error("update %s fru info error, msg: %s" % (self.name, str(e))) + self.present = STATUS_FAILED + self.status = STATUS_FAILED + self.status_summary = STATUS_FAILED + self.origin_name = self.na_ret + self.air_flow = self.na_ret + self.display_name = self.na_ret + + def set_module_led(self, color): + ret = self.int_case.set_fan_led(self.name, color) + if ret == 0: + return True + return False + + +class ledcontrol(object): + + def __init__(self): + self.fan_obj_list = [] + self.psu_obj_list = [] + self.board_psu_led_status = COLOR_GREEN + self.board_fan_led_status = COLOR_GREEN + self.__board_air_flow = "" + self.int_case = interface() + self.__config = baseutil.get_monitor_config() + self.__temps_threshold_config = self.__config["temps_threshold"] + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['temp'] = 0 + temp_threshold['fail_num'] = 0 + self.__ledcontrol_para = self.__config["ledcontrol_para"] + self.__interval = self.__ledcontrol_para.get("interval", 5) + self.__checkpsu = self.__ledcontrol_para.get("checkpsu", 0) + self.__checkfan = self.__ledcontrol_para.get("checkfan", 0) + self.__psu_amber_num = self.__ledcontrol_para.get("psu_amber_num") + self.__fan_amber_num = self.__ledcontrol_para.get("fan_amber_num") + self.__psu_air_flow_amber_num = self.__ledcontrol_para.get("psu_air_flow_amber_num", 0) + self.__fan_air_flow_amber_num = self.__ledcontrol_para.get("fan_air_flow_amber_num", 0) + self.__board_sys_led = self.__ledcontrol_para.get("board_sys_led", []) + self.__board_psu_led = self.__ledcontrol_para.get("board_psu_led", []) + self.__board_fan_led = self.__ledcontrol_para.get("board_fan_led", []) + self.__psu_air_flow_monitor = self.__ledcontrol_para.get("psu_air_flow_monitor", 0) + self.__fan_air_flow_monitor = self.__ledcontrol_para.get("fan_air_flow_monitor", 0) + self.__fan_mix_list = self.__ledcontrol_para.get("fan_mix_list", []) + + @property + def na_ret(self): + return self.int_case.na_ret + + @property + def checkpsu(self): + return self.__checkpsu + + @property + def checkfan(self): + return self.__checkfan + + @property + def psu_amber_num(self): + return self.__psu_amber_num + + @property + def fan_amber_num(self): + return self.__fan_amber_num + + @property + def psu_air_flow_amber_num(self): + return self.__psu_air_flow_amber_num + + @property + def fan_air_flow_amber_num(self): + return self.__fan_air_flow_amber_num + + @property + def psu_air_flow_monitor(self): + return self.__psu_air_flow_monitor + + @property + def fan_air_flow_monitor(self): + return self.__fan_air_flow_monitor + + @property + def board_sys_led(self): + return self.__board_sys_led + + @property + def board_psu_led(self): + return self.__board_psu_led + + @property + def board_fan_led(self): + return self.__board_fan_led + + @property + def fan_mix_list(self): + return self.__fan_mix_list + + @property + def interval(self): + return self.__interval + + def get_fan_total_number(self): + return self.int_case.get_fan_total_number() + + def get_psu_total_number(self): + return self.int_case.get_psu_total_number() + + def get_onie_e2_obj(self, name): + return self.int_case.get_onie_e2_obj(name) + + def set_led_color(self, led_name, color): + try: + ret = self.int_case.set_led_color(led_name, color) + except Exception as e: + ledcontrol_error("set %s led %s error, msg: %s" % (led_name, color, str(e))) + ret = False + return ret + + def set_sys_led(self, color): + for led in self.board_sys_led: + led_name = led.get("led_name") + ret = self.set_led_color(led_name, color) + if ret is True: + ledcontrol_debug("set %s success, color:%s," % (led_name, color)) + else: + ledcontrol_debug("set %s failed, color:%s," % (led_name, color)) + + def set_psu_led(self, color): + for led in self.board_psu_led: + led_name = led.get("led_name") + ret = self.set_led_color(led_name, color) + if ret is True: + ledcontrol_debug("set %s success, color:%s," % (led_name, color)) + else: + ledcontrol_debug("set %s failed, color:%s," % (led_name, color)) + + def set_fan_led(self, color): + for led in self.board_fan_led: + led_name = led.get("led_name") + ret = self.set_led_color(led_name, color) + if ret is True: + ledcontrol_debug("set %s success, color:%s," % (led_name, color)) + else: + ledcontrol_debug("set %s failed, color:%s," % (led_name, color)) + + def set_fan_module_led(self): + for fan_obj in self.fan_obj_list: + color = LED_STATUS_DICT.get(fan_obj.led_status) + ret = fan_obj.set_module_led(color) + if ret is True: + ledcontrol_debug("set %s module led success, color: %s," % (fan_obj.name, color)) + else: + ledcontrol_debug("set %s module led failed, color: %s," % (fan_obj.name, color)) + + @property + def board_air_flow(self): + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if self.__board_air_flow not in air_flow_tuple: + self.__board_air_flow = self.int_case.get_device_airflow(ONIE_E2_NAME) + ledcontrol_debug("board_air_flow: %s" % self.__board_air_flow) + return self.__board_air_flow + + def update_psu_info(self): + for psu_obj in self.psu_obj_list: + psu_obj.update_dev_info() + ledcontrol_debug("%s present: [%s], status: [%s] status_summary [%s]" % + (psu_obj.name, psu_obj.present, psu_obj.status, psu_obj.status_summary)) + if psu_obj.air_flow_monitor: + ledcontrol_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow)) + + def update_fan_info(self): + for fan_obj in self.fan_obj_list: + fan_obj.update_dev_info() + ledcontrol_debug("%s present: [%s], status: [%s] status_summary [%s]" % + (fan_obj.name, fan_obj.present, fan_obj.status, fan_obj.status_summary)) + if fan_obj.air_flow_monitor: + ledcontrol_debug("%s origin name: [%s], display name: [%s] air flow [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow)) + + def get_monitor_temp(self): + sensorlist = self.int_case.get_temp_info() + + for temp_threshold in self.__temps_threshold_config.values(): + sensor = sensorlist.get(temp_threshold['name']) + if sensor["Value"] is None: + temp_threshold['fail_num'] += 1 + ledcontrol_error("get %s failed, fail_num = %d" % (temp_threshold['name'], temp_threshold['fail_num'])) + else: + temp_threshold['fail_num'] = 0 + temp_threshold.setdefault('fix', 0) + temp_threshold['temp'] = sensor["Value"] + temp_threshold['fix'] + ledcontrol_debug("%s = %d" % (temp_threshold['name'], temp_threshold['temp'])) + ledcontrol_debug("warning = %d, critical = %d" % (temp_threshold['warning'], temp_threshold['critical'])) + + def is_temp_warning(self): + warning_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + if temp_threshold['temp'] >= temp_threshold['warning']: + warning_flag = True + ledcontrol_debug("%s is over warning" % temp_threshold['name']) + ledcontrol_debug( + "%s = %d, warning = %d" % + (temp_threshold['name'], + temp_threshold['temp'], + temp_threshold['warning'])) + return warning_flag + + def checkTempWarning(self): + try: + if self.is_temp_warning(): + ledcontrol_debug("temp is over warning") + return True + except Exception as e: + ledcontrol_error("%%policy: checkTempWarning failed") + ledcontrol_error(str(e)) + return False + + def is_temp_critical(self): + critical_flag = False + for temp_threshold in self.__temps_threshold_config.values(): + temp_threshold['critical_flag'] = False + if temp_threshold['temp'] >= temp_threshold['critical']: + critical_flag = True + temp_threshold['critical_flag'] = True + ledcontrol_debug("%s is over critical" % temp_threshold['name']) + ledcontrol_debug( + "%s = %d, critical = %d" % + (temp_threshold['name'], + temp_threshold['temp'], + temp_threshold['critical'])) + return critical_flag + + def checkTempCrit(self): + try: + if self.is_temp_critical(): + temp_dict = dict(self.__temps_threshold_config) + tmp = temp_dict.get(SWITCH_TEMP) + if tmp['critical_flag'] is True: + ledcontrol_debug("temp is over critical") + return True + + del temp_dict[SWITCH_TEMP] + for temp_items in temp_dict.values(): + if temp_items['critical_flag'] is False: + return False + + ledcontrol_debug("temp is over critical") + return True + except Exception as e: + ledcontrol_error("%%policy: checkTempCrit failed") + ledcontrol_error(str(e)) + return False + + def check_board_air_flow(self): + board_air_flow = self.board_air_flow + air_flow_tuple = (F2B_AIR_FLOW, B2F_AIR_FLOW) + if board_air_flow not in air_flow_tuple: + air_flow_error("%%AIR_FLOW_MONITOR-3-BOARD: Get board air flow failed, value: %s." % board_air_flow) + return False + ledcontrol_debug("board air flow check ok: %s" % board_air_flow) + return True + + def get_monitor_fan_status(self): + fanerrnum = 0 + for fan_obj in self.fan_obj_list: + status = fan_obj.status_summary + ledcontrol_debug("%s status: %s" % (fan_obj.name, status)) + if status != STATUS_OK: + fan_obj.led_status = COLOR_RED + fanerrnum += 1 + else: + fan_obj.led_status = COLOR_GREEN + ledcontrol_debug("fan error number: %d" % fanerrnum) + + if fanerrnum == 0: + fan_led_status = COLOR_GREEN + elif fanerrnum <= self.fan_amber_num: + fan_led_status = COLOR_AMBER + else: + fan_led_status = COLOR_RED + ledcontrol_debug("monitor fan status, set fan led: %s" % LED_STATUS_DICT.get(fan_led_status)) + return fan_led_status + + def get_monitor_psu_status(self): + psuerrnum = 0 + for psu_obj in self.psu_obj_list: + status = psu_obj.status_summary + ledcontrol_debug("%s status: %s" % (psu_obj.name, status)) + if status != STATUS_OK: + psu_obj.led_status = COLOR_RED + psuerrnum += 1 + else: + psu_obj.led_status = COLOR_GREEN + ledcontrol_debug("psu error number: %d" % psuerrnum) + + if psuerrnum == 0: + psu_led_status = COLOR_GREEN + elif psuerrnum <= self.psu_amber_num: + psu_led_status = COLOR_AMBER + else: + psu_led_status = COLOR_RED + ledcontrol_debug("monitor psu status, set psu led: %s" % LED_STATUS_DICT.get(psu_led_status)) + return psu_led_status + + def get_monitor_fan_air_flow(self): + if self.fan_air_flow_monitor == 0: + ledcontrol_debug("fan air flow monitor not open, default green") + return COLOR_GREEN + + ret = self.check_board_air_flow() + if ret is False: + ledcontrol_debug("check board air flow error, skip fan air flow monitor.") + return COLOR_GREEN + + fan_led_status_list = [] + fan_air_flow_ok_obj_list = [] + fan_air_flow_ok_set = set() + fan_module_led_list = [] + fan_air_flow_err_num = 0 + for fan_obj in self.fan_obj_list: + if fan_obj.present != STATUS_PRESENT: + fan_module_led_list.append(COLOR_GREEN) + continue + if fan_obj.air_flow == self.na_ret: + air_flow_warn("%%AIR_FLOW_MONITOR-4-FAN: %s get air flow failed, fan model: %s, air flow: %s." % + (fan_obj.name, fan_obj.display_name, fan_obj.air_flow)) + led_status = COLOR_AMBER + fan_module_led_list.append(led_status) + elif fan_obj.air_flow != self.board_air_flow: + air_flow_emerg("%%AIR_FLOW_MONITOR-0-FAN: %s air flow error, fan model: %s, fan air flow: %s, board air flow: %s." % + (fan_obj.name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + led_status = COLOR_RED + fan_air_flow_err_num += 1 + else: + fan_air_flow_ok_obj_list.append(fan_obj) + fan_air_flow_ok_set.add(fan_obj.origin_name) + ledcontrol_debug("%s air flow check ok, origin name: [%s], display name: [%s], fan air flow: [%s], board air flow: [%s]" % + (fan_obj.name, fan_obj.origin_name, fan_obj.display_name, fan_obj.air_flow, self.board_air_flow)) + led_status = COLOR_GREEN + fan_module_led_list.append(led_status) + if led_status > fan_obj.led_status: + fan_obj.led_status = led_status + if len(fan_module_led_list) != 0: + fan_led_status = max(fan_module_led_list) + fan_led_status_list.append(fan_led_status) + # check fan mixing + if len(fan_air_flow_ok_set) > 1 and fan_air_flow_ok_set not in self.fan_mix_list: + for fan_obj in fan_air_flow_ok_obj_list: + air_flow_warn("%%AIR_FLOW_MONITOR-4-FAN: %s mixing, fan model: %s, air flow: %s." % + (fan_obj.name, fan_obj.origin_name, fan_obj.air_flow)) + fan_led_status = COLOR_AMBER + fan_led_status_list.append(fan_led_status) + # check fan air flow error number + if fan_air_flow_err_num == 0: + fan_led_status = COLOR_GREEN + elif fan_air_flow_err_num <= self.fan_air_flow_amber_num: + fan_led_status = COLOR_AMBER + else: + fan_led_status = COLOR_RED + fan_led_status_list.append(fan_led_status) + + fan_led_status = max(fan_led_status_list) + ledcontrol_debug("monitor fan air flow, set fan led: %s" % LED_STATUS_DICT.get(fan_led_status)) + return fan_led_status + + def get_monitor_psu_air_flow(self): + if self.psu_air_flow_monitor == 0: + ledcontrol_debug("psu air flow monitor not open, default green") + return COLOR_GREEN + + ret = self.check_board_air_flow() + if ret is False: + ledcontrol_debug("check board air flow error, skip psu air flow monitor.") + return COLOR_GREEN + + psu_led_status_list = [] + psu_module_led_list = [] + psu_air_flow_err_num = 0 + for psu_obj in self.psu_obj_list: + if psu_obj.present != STATUS_PRESENT: + psu_module_led_list.append(COLOR_GREEN) + continue + if psu_obj.air_flow == self.na_ret: + air_flow_warn("%%AIR_FLOW_MONITOR-4-PSU: %s get air flow failed, psu model: %s, air flow: %s." % + (psu_obj.name, psu_obj.display_name, psu_obj.air_flow)) + led_status = COLOR_AMBER + psu_module_led_list.append(led_status) + elif psu_obj.air_flow != self.board_air_flow: + air_flow_emerg("%%AIR_FLOW_MONITOR-0-PSU: %s air flow error, psu model: %s, psu air flow: %s, board air flow: %s." % + (psu_obj.name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + led_status = COLOR_RED + psu_air_flow_err_num += 1 + else: + ledcontrol_debug("%s psu air flow check ok, origin name: [%s], display name: [%s], psu air flow: [%s], board air flow: [%s]" % + (psu_obj.name, psu_obj.origin_name, psu_obj.display_name, psu_obj.air_flow, self.board_air_flow)) + led_status = COLOR_GREEN + psu_module_led_list.append(led_status) + if led_status > psu_obj.led_status: + psu_obj.led_status = led_status + + if len(psu_module_led_list) != 0: + psu_led_status = max(psu_module_led_list) + psu_led_status_list.append(psu_led_status) + + # check fan air flow error number + if psu_air_flow_err_num == 0: + psu_led_status = COLOR_GREEN + elif psu_air_flow_err_num <= self.psu_air_flow_amber_num: + psu_led_status = COLOR_AMBER + else: + psu_led_status = COLOR_RED + psu_led_status_list.append(psu_led_status) + + psu_led_status = max(psu_led_status_list) + ledcontrol_debug("monitor psu air flow, set psu led: %s" % LED_STATUS_DICT.get(psu_led_status)) + return psu_led_status + + def get_temp_sys_led_status(self): + if self.checkTempCrit() is True: + sys_led_status = COLOR_RED + elif self.checkTempWarning() is True: + sys_led_status = COLOR_AMBER + else: + sys_led_status = COLOR_GREEN + ledcontrol_debug("monitor temperature, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status)) + return sys_led_status + + def get_sys_led_follow_fan_status(self): + + if self.checkfan: + sys_led_status = self.board_fan_led_status + ledcontrol_debug("sys led follow fan led, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status)) + else: + sys_led_status = COLOR_GREEN + ledcontrol_debug("sys led don't follow fan led, set default green") + return sys_led_status + + def get_sys_led_follow_psu_status(self): + if self.checkpsu: + sys_led_status = self.board_psu_led_status + ledcontrol_debug("sys led follow psu led, set sys led: %s" % LED_STATUS_DICT.get(sys_led_status)) + else: + sys_led_status = COLOR_GREEN + ledcontrol_debug("sys led don't follow psu led, set default green") + return sys_led_status + + def dealSysLedStatus(self): + sys_led_status_list = [] + # get_monitor_temp + self.get_monitor_temp() + + # monitor temp get sys led status + sys_led_status = self.get_temp_sys_led_status() + sys_led_status_list.append(sys_led_status) + + # check sys led follow fan led status + sys_led_status = self.get_sys_led_follow_fan_status() + sys_led_status_list.append(sys_led_status) + + # check sys led follow psu led status + sys_led_status = self.get_sys_led_follow_psu_status() + sys_led_status_list.append(sys_led_status) + + sys_led_status = max(sys_led_status_list) + sys_led_color = LED_STATUS_DICT.get(sys_led_status) + + # set sys led + self.set_sys_led(sys_led_color) + + def dealFanLedStatus(self): + fan_led_status_list = [] + # update fan info + self.update_fan_info() + + # monitor fan status first + fan_led_status = self.get_monitor_fan_status() + fan_led_status_list.append(fan_led_status) + + # monitor fan air flow + fan_led_status = self.get_monitor_fan_air_flow() + fan_led_status_list.append(fan_led_status) + + self.board_fan_led_status = max(fan_led_status_list) + fan_led_color = LED_STATUS_DICT.get(self.board_fan_led_status) + + # set fan led + self.set_fan_led(fan_led_color) + # set fan module led + self.set_fan_module_led() + + def dealPsuLedStatus(self): + psu_led_status_list = [] + # update psu info + self.update_psu_info() + + # monitor psu status first + psu_led_status = self.get_monitor_psu_status() + psu_led_status_list.append(psu_led_status) + + # monitor psu air flow + psu_led_status = self.get_monitor_psu_air_flow() + psu_led_status_list.append(psu_led_status) + + self.board_psu_led_status = max(psu_led_status_list) + psu_led_color = LED_STATUS_DICT.get(self.board_psu_led_status) + + # set psu led + self.set_psu_led(psu_led_color) + + def do_ledcontrol(self): + self.dealPsuLedStatus() + self.dealFanLedStatus() + self.dealSysLedStatus() + + def fan_obj_init(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_obj = DevFan(fan_name, self.fan_air_flow_monitor, self.int_case) + self.fan_obj_list.append(fan_obj) + ledcontrol_debug("fan object initialize success") + + def psu_obj_init(self): + psu_num = self.get_psu_total_number() + for i in range(psu_num): + psu_name = "PSU" + str(i + 1) + psu_obj = DevPsu(psu_name, self.psu_air_flow_monitor, self.int_case) + self.psu_obj_list.append(psu_obj) + ledcontrol_debug("psu object initialize success") + + def run(self): + while True: + try: + debug_init() + self.do_ledcontrol() + time.sleep(self.interval) + except Exception as e: + traceback.print_exc() + ledcontrol_error(str(e)) + + +if __name__ == '__main__': + debug_init() + ledcontrol_debug("enter main") + led_control = ledcontrol() + led_control.fan_obj_init() + led_control.psu_obj_init() + led_control.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py new file mode 100755 index 0000000000..7661522568 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/hal_pltfm.py @@ -0,0 +1,492 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import inspect +import sys +import json +import time +from plat_hal.interface import interface + + +class Command(): + def __init__(self, name, f): + self.name = name + self.f = f + self.paramcount = self.f.__code__.co_argcount + + def dofun(self, args): + fn = self.f.__call__ + fn(*args) + + +class Group(): + def __init__(self, name, f): + self.groups = [] + self.commands = [] + self.name = name + self.f = f + + def add_groups(self, command): + self.groups.append(command) + + def add_commands(self, commnad): + x = Command(commnad.__name__, commnad) + self.commands.append(x) + + def find_valuebyname(self, name): + for item in self.groups: + if name == item.name: + return item + for item in self.commands: + if name == item.name: + return item + return None + + def deal(self, args): + if len(args) <= 0: + return self.print_help() + funclevel = args[0] + val = self.find_valuebyname(funclevel) + if val is None: + return self.print_help() + if isinstance(val, Command): + if len(args) < (val.paramcount + 1): + return self.print_help() + inputargs = args[1: (1 + val.paramcount)] + return val.dofun(inputargs) + if isinstance(val, Group): + args = args[1:] + return val.deal(args) + return self.print_help() + + def get_max(self, arr): + lentmp = 0 + for ar in arr: + lentmp = len(ar) if (len(ar) > lentmp) else lentmp + return lentmp + + def print_help(self): + + namesize = [] + for item in self.groups: + namesize.append(item.name) + for item in self.commands: + namesize.append(item.name) + maxvalue = self.get_max(namesize) + + if len(self.groups) > 0: + print("Groups:") + for item in self.groups: + print(" %-*s %s" % (maxvalue, item.name, item.f.__doc__ or '')) + if len(self.commands) > 0: + print("Commands:") + for item in self.commands: + print(" %-*s %s" % (maxvalue, item.name, item.f.__doc__ or '')) + + +class clival(): + @staticmethod + def Fire(val=None): + group = Group("top", 'mainlevel') + clival.iterGroup(val, group) + # context = {} + # caller = inspect.stack()[1] + # caller_frame = caller[0] + # caller_globals = caller_frame.f_globals + # caller_locals = caller_frame.f_locals + # context.update(caller_globals) + # context.update(caller_locals) + args = sys.argv[1:] + group.deal(args) + + @staticmethod + def iterGroup(val, group): + for key, item in val.items(): + if item is None: # first level + if inspect.isfunction(key): + group.add_commands(key) + else: + group1 = Group(key.__name__, key) + clival.iterGroup(item, group1) + group.add_groups(group1) + + +def psu(): + r'''test psu ''' + + +def fan(): + r'''test fan ''' + + +def sensor(): + r'''test sensor ''' + + +def dcdc(): + r'''test dcdc ''' + + +def led(): + r'''test led ''' + + +def e2(): + r'''test onie eeprom ''' + + +def temps(): + r'''test temps sensor''' + +def cpu(): + r'''test cpu''' + + +int_case = interface() + + +def get_total_number(): + r'''psu get_total_number ''' + print("=================get_total_number======================") + print(int_case.get_psu_total_number()) + + +def get_presence(): + r'''psu get_presence ''' + print("=================get_presence======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(int_case.get_psu_presence(psu_item.name)) + + +def get_fru_info(): + r'''psu get_fru_info ''' + print("=================get_fru_info======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_fru_info(psu_item.name), ensure_ascii=False, indent=4)) + + +def get_status(): + r'''psu get_status ''' + print("=================get_status======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_status(psu_item.name), ensure_ascii=False, indent=4)) + + +def set_psu_fan_speed_pwm(realspeed): + r'''set_psu_fan_speed_pwm''' + print("=================set_psu_fan_speed_pwm======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(int_case.set_psu_fan_speed_pwm(psu_item.name, int(realspeed))) + + +def get_psu_fan_speed_pwm(): + r'''get_psu_fan_speed_pwm''' + print("=================get_psu_fan_speed_pwm======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_fan_speed_pwm(psu_item.name))) + + +def get_psu_power_status(): + r'''psu get_psu_power_status ''' + print("=================get_psu_power_status======================") + psus = int_case.get_psus() + for psu_item in psus: + print(psu_item.name, end=' ') + print(json.dumps(int_case.get_psu_power_status(psu_item.name), ensure_ascii=False, indent=4)) + + +def get_info_all(): + r'''psu get_info_all ''' + print("=================get_info_all======================") + print(json.dumps(int_case.get_psu_info_all(), ensure_ascii=False, indent=4)) + + +def fan_get_total_number(): + print("=================get_info_all======================") + print(json.dumps(int_case.get_fan_total_number(), ensure_ascii=False, indent=4)) + + +def fan_get_rotor_number(): + r'''fan_get_rotor_number''' + print("=================fan_get_rotor_number======================") + fans = int_case.get_fans() + for fan_item in fans: + print(fan_item.name, end=' ') + print(int_case.get_fan_rotor_number(fan_item.name)) + + +def fan_get_speed(): + r'''fan_get_speed''' + print("=================fan_get_speed======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + index = rotors.index(rotor) + print("%s rotor%d" % (fan_item.name, index + 1), end=' ') + print(int_case.get_fan_speed(fan_item.name, index + 1)) + + +def fan_get_speed_pwm(): + r'''fan_get_speed_pwm''' + print("=================fan_get_speed_pwm======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + index = rotors.index(rotor) + print("%s rotor%d" % (fan_item.name, index + 1), end=' ') + print(int_case.get_fan_speed_pwm(fan_item.name, index + 1)) + + +def fan_set_speed_pwm(pwm): + r'''fan_set_speed_pwm''' + print("=================fan_set_speed_pwm======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + index = rotors.index(rotor) + print("%s %s" % (fan_item.name, rotor.name), end=' ') + val = int_case.set_fan_speed_pwm(fan_item.name, index + 1, pwm) + print(val) + + +def fan_get_watchdog_status(): + r'''fan_get_watchdog_status''' + print("=================fan_get_watchdog_status======================") + print(int_case.get_fan_watchdog_status()) + + +def fan_enable_watchdog(): + r'''fan_enable_watchdog''' + print("=================fan_enable_watchdog======================") + print('enable', int_case.enable_fan_watchdog()) + + +def fan_disable_watchdog(): + r'''fan_disable_watchdog''' + print("=================fan_disable_watchdog======================") + print('disable', int_case.enable_fan_watchdog(enable=False)) + + +def fan_get_speed1(): + r'''fan_get_speed''' + print("=================fan_get_speed======================") + fans = int_case.get_fans() + for fan_item in fans: + rotors = fan_item.rotor_list + for rotor in rotors: + print("%s %s" % (fan_item.name, rotor.name), end=' ') + print(int_case.get_fan_speed(fan_item.name, rotor.name)) + + +def fan_feed_watchdog(): + r'''fan_feed_watchdog''' + print("=================fan_feed_watchdog======================") + fan_get_speed() + print(int_case.feed_fan_watchdog()) + time.sleep(2) + fan_get_speed() + + +def fan_set_led(color): + r'''fan_set_led''' + print("=================fan_set_led======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(color, int_case.set_fan_led(fan_item.name, color)) + +def fan_get_led(): + r'''fan_get_led''' + print("=================fan_get_led======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(int_case.get_fan_led(fan_item.name)) + + +def fan_get_presence(): + r'''fan_get_presence''' + print("=================fan_get_presence======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(int_case.get_fan_presence(fan_item.name)) + + +def fan_get_fru_info(): + r'''fan_get_fru_info''' + print("=================fan_get_fru_info======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(json.dumps(int_case.get_fan_info(fan_item.name), ensure_ascii=False, indent=4)) + + +def fan_get_status(): + r'''fan_get_status''' + print("=================fan_get_status======================") + fans = int_case.get_fans() + for fan_item in fans: + print("%s" % fan_item.name) + print(json.dumps(int_case.get_fan_status(fan_item.name), ensure_ascii=False, indent=4)) + + +def fan_get_info_all(): + r'''fan_get_info_all''' + print("=================fan_get_info_all======================") + print(json.dumps(int_case.get_fan_info_all(), ensure_ascii=False, indent=4)) + + +def get_sensor_info(): + r'''get_sensor_info''' + print("=================get_sensor_info======================") + print(json.dumps(int_case.get_sensor_info(), ensure_ascii=False, indent=4)) + + +def get_dcdc_all_info(): + r'''get_dcdc_all_info''' + print("=================get_dcdc_all_info======================") + print(json.dumps(int_case.get_dcdc_all_info(), ensure_ascii=False, indent=4)) + + +def set_all_led_color(color): + r'''set_all_led_color color''' + print("=================set_all_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + print("%s" % led_item.name) + print(color, int_case.set_led_color(led_item.name, color)) + + +def get_all_led_color(): + r'''get_all_led_color''' + print("=================get_all_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + print("%s" % led_item.name) + print(int_case.get_led_color(led_item.name)) + + +def set_single_led_color(led_name, color): + r'''set_single_led_color led_name color''' + print("=================set_single_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + if led_name == led_item.name: + print("%s" % led_item.name) + print(color, int_case.set_led_color(led_item.name, color)) + + +def get_single_led_color(led_name): + r'''get_single_led_color''' + print("=================get_single_led_color======================") + leds = int_case.get_leds() + for led_item in leds: + if led_name == led_item.name: + print("%s" % led_item.name) + print(int_case.get_led_color(led_item.name)) + + +def get_onie_e2_path(): + r'''get_onie_e2_path''' + print("=================get_onie_e2_path======================") + path = int_case.get_onie_e2_path("ONIE_E2") + print("%s" % path) + + +def get_device_airflow(): + r'''get_device_airflow''' + print("=================get_device_airflow======================") + airflow = int_case.get_device_airflow("ONIE_E2") + print("%s" % airflow) + + +def get_temps_sensor(): + r'''get_temps_sensor''' + print("=================get_temps_sensor======================") + temp_list = int_case.get_temps() + for temp in temp_list: + print("id: %s, name: %s, API name: %s, value: %s" % (temp.temp_id, temp.name, temp.api_name, temp.Value)) + +def get_cpu_reset_num(): + r'''get_cpu_reset_num''' + print("=================get_cpu_reset_num======================") + print(int_case.get_cpu_reset_num()) + +def get_cpu_reboot_cause(): + r'''get_cpu_reboot_cause''' + print("=================get_cpu_reboot_cause======================") + print(int_case.get_cpu_reboot_cause()) + + +def run_cli_man(): + clival.Fire( + { + psu: { + get_total_number: None, + get_presence: None, + get_fru_info: None, + set_psu_fan_speed_pwm: None, + get_psu_fan_speed_pwm: None, + get_status: None, + get_psu_power_status: None, + get_info_all: None + }, + fan: { + fan_get_total_number: None, + fan_get_rotor_number: None, + fan_get_speed: None, + fan_get_speed_pwm: None, + fan_set_speed_pwm: None, + fan_get_watchdog_status: None, + fan_enable_watchdog: None, + fan_disable_watchdog: None, + fan_feed_watchdog: None, + fan_set_led: None, + fan_get_led: None, + fan_get_presence: None, + fan_get_fru_info: None, + fan_get_status: None, + fan_get_info_all: None + }, + sensor: { + get_sensor_info: None + }, + dcdc: { + get_dcdc_all_info: None + }, + led: { + set_all_led_color: None, + set_single_led_color: None, + get_all_led_color: None, + get_single_led_color: None, + }, + e2: { + get_onie_e2_path: None, + get_device_airflow: None, + }, + temps: { + get_temps_sensor: None, + }, + cpu: { + get_cpu_reset_num: None, + get_cpu_reboot_cause: None, + } + } + ) + + +if __name__ == '__main__': + run_cli_man() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py new file mode 100755 index 0000000000..33d5bfba64 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor.py @@ -0,0 +1,144 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +import os +import time +import syslog +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil +from platform_util import io_rd, wbi2cget + +INTELLIGENT_MONITOR_DEBUG_FILE = "/etc/.intelligent_monitor_debug" + +debuglevel = 0 + + +def monitor_syslog_debug(s): + if debuglevel: + syslog.openlog("INTELLIGENT_MONITOR_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def monitor_syslog(s): + syslog.openlog("INTELLIGENT_MONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def pmon_syslog_notice(s): + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_NOTICE, s) + + +class IntelligentMonitor(): + def __init__(self): + self.dcdc_dict = {} + self.int_case = interface() + self.__config = baseutil.get_monitor_config() + self.__intelligent_monitor_para = self.__config.get('intelligent_monitor_para', {}) + self.__interval = self.__intelligent_monitor_para.get('interval', 60) + self.__dcdc_whitelist = self.__config.get('dcdc_monitor_whitelist', {}) + self.__error_ret = self.int_case.error_ret + + @property + def error_ret(self): + return self.__error_ret + + @property + def interval(self): + return self.__interval + + def debug_init(self): + global debuglevel + if os.path.exists(INTELLIGENT_MONITOR_DEBUG_FILE): + debuglevel = 1 + else: + debuglevel = 0 + + def dcdc_whitelist_check(self, dcdc_name): + try: + check_item = self.__dcdc_whitelist.get(dcdc_name, {}) + if len(check_item) == 0: + return False + gettype = check_item.get("gettype", None) + checkbit = check_item.get("checkbit", None) + okval = check_item.get("okval", None) + if gettype is None or checkbit is None or okval is None: + monitor_syslog('%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s config error. gettype:%s, checkbit:%s, okval:%s' % + (dcdc_name, gettype, checkbit, okval)) + return False + if gettype == "io": + io_addr = check_item.get('io_addr', None) + val = io_rd(io_addr) + if val is not None: + retval = val + else: + monitor_syslog( + '%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s io_rd error. io_addr:%s' % + (dcdc_name, io_addr)) + return False + elif gettype == "i2c": + bus = check_item.get('bus', None) + addr = check_item.get('addr', None) + offset = check_item.get('offset', None) + ind, val = wbi2cget(bus, addr, offset) + if ind is True: + retval = val + else: + monitor_syslog('%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s i2cget error. bus:%s, addr:%s, offset:%s' % + (dcdc_name, bus, addr, offset)) + return False + else: + monitor_syslog('%%INTELLIGENT_MONITOR-3-DCDC_WHITELIST_FAILED: %s gettype not support' % dcdc_name) + return False + + val_t = (int(retval, 16) & (1 << checkbit)) >> checkbit + if val_t != okval: + return False + return True + except Exception as e: + monitor_syslog('%%WHITELIST_CHECK: %s check error, msg: %s.' % (dcdc_name, str(e))) + return False + + def update_dcdc_status(self): + try: + self.dcdc_dict = self.int_case.get_dcdc_all_info() + for dcdc_name, item in self.dcdc_dict.items(): + ret = self.dcdc_whitelist_check(dcdc_name) + if ret is False: + if item['Value'] == self.error_ret: + monitor_syslog( + '%%INTELLIGENT_MONITOR-3-DCDC_SENSOR_FAILED: The value of %s read failed.' % + (dcdc_name)) + elif float(item['Value']) > float(item['Max']): + pmon_syslog_notice('%%PMON-5-VOLTAGE_HIGH: %s voltage %.3f%s is larger than max threshold %.3f%s.' % + (dcdc_name, float(item['Value']), item['Unit'], float(item['Max']), item['Unit'])) + elif float(item['Value']) < float(item['Min']): + pmon_syslog_notice('%%PMON-5-VOLTAGE_LOW: %s voltage %.3f%s is lower than min threshold %.3f%s.' % + (dcdc_name, float(item['Value']), item['Unit'], float(item['Min']), item['Unit'])) + else: + monitor_syslog_debug('%%INTELLIGENT_MONITOR-6-DCDC_SENSOR_OK: %s normal, value is %.3f%s.' % + (dcdc_name, item['Value'], item['Unit'])) + else: + monitor_syslog_debug( + '%%INTELLIGENT_MONITOR-6-DCDC_WHITELIST_CHECK: %s is in dcdc whitelist, not monitor voltage' % + dcdc_name) + continue + except Exception as e: + monitor_syslog('%%INTELLIGENT_MONITOR-3-EXCEPTION: update dcdc sensors status error, msg: %s.' % (str(e))) + + def doWork(self): + self.update_dcdc_status() + + def run(self): + while True: + try: + self.debug_init() + self.doWork() + time.sleep(self.interval) + except Exception as e: + monitor_syslog('%%INTELLIGENT_MONITOR-3-EXCEPTION: %s.' % (str(e))) + + +if __name__ == '__main__': + intelligent_monitor = IntelligentMonitor() + intelligent_monitor.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py new file mode 100755 index 0000000000..c84319f3b7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/intelligent_monitor/monitor_fan.py @@ -0,0 +1,284 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +import os +import time +import logging +from logging.handlers import RotatingFileHandler + +from plat_hal.interface import interface +from plat_hal.baseutil import baseutil + + +DEBUG_FILE = "/etc/.monitor_fan_debug_flag" + +LOG_FILE = "/var/log/intelligent_monitor/monitor_fan_log" + +E2_NAME = "ONIE_E2" + + +def _init_logger(): + if not os.path.exists(LOG_FILE): + os.system("mkdir -p %s" % os.path.dirname(LOG_FILE)) + os.system("sync") + handler = RotatingFileHandler(filename=LOG_FILE, maxBytes=5 * 1024 * 1024, backupCount=1) + formatter = logging.Formatter("%(asctime)s %(levelname)s %(filename)s[%(funcName)s][%(lineno)s]: %(message)s") + handler.setFormatter(formatter) + logger = logging.getLogger(__name__) + logger.setLevel(logging.INFO) + logger.addHandler(handler) + return logger + + +class Fan(object): + + def __init__(self, name, hal_interface): + self.name = name + self.fan_dict = {} + self.int_case = hal_interface + self.update_time = 0 + self.pre_present = False + self.pre_status = True + self.plugin_cnt = 0 + self.plugout_cnt = 0 + self.status_normal_cnt = 0 + self.status_error_cnt = 0 + + def fan_dict_update(self): + local_time = time.time() + if not self.fan_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.fan_dict = self.int_case.get_fan_info(self.name) + + def get_model(self): + self.fan_dict_update() + return self.fan_dict["NAME"] + + def get_serial(self): + self.fan_dict_update() + return self.fan_dict["SN"] + + def get_presence(self): + return self.int_case.get_fan_presence(self.name) + + def get_rotor_speed(self, rotor_name): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor pwm + value = fan_dir[rotor_name]["Speed"] + max_speed = fan_dir[rotor_name]["SpeedMax"] + + if isinstance(value, str) or value is None: + return 0 + pwm = value * 100 / max_speed + if pwm > 100: + pwm = 100 + elif pwm < 0: + pwm = 0 + return int(pwm) + + def get_rotor_speed_tolerance(self, rotor_name): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + # The default tolerance value is fixed as 30% + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor tolerance + tolerance = fan_dir[rotor_name]["Tolerance"] + + if isinstance(tolerance, str) or tolerance is None: + return 30 + return tolerance + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + pwm = self.int_case.get_fan_speed_pwm(self.name, 0) + return int(pwm) + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + if not self.get_presence(): + return False + + rotor_num = self.int_case.get_fan_rotor_number(self.name) + for i in range(rotor_num): + rotor_name = "Rotor" + str(i + 1) + speed = self.get_rotor_speed(rotor_name) + tolerance = self.get_rotor_speed_tolerance(rotor_name) + target = self.get_target_speed() + if (speed - target) > target * tolerance / 100: + return False + if (target - speed) > target * tolerance / 100: + return False + + return True + + def get_direction(self): + """ + Retrieves the fan airflow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + self.fan_dict_update() + return self.fan_dict["AirFlow"] + + +class MonitorFan(object): + + def __init__(self): + self.int_case = interface() + self.logger = _init_logger() + self.fan_obj_list = [] + self.__config = baseutil.get_monitor_config() + self.__monitor_fan_config = self.__config.get("monitor_fan_para", {}) + self.__present_interval = self.__monitor_fan_config.get("present_interval", 0.5) + self.__status_interval = self.__monitor_fan_config.get("status_interval", 5) + self.__present_check_cnt = self.__monitor_fan_config.get("present_check_cnt", 3) + self.__status_check_cnt = self.__monitor_fan_config.get("status_check_cnt", 3) + + def debug_init(self): + if os.path.exists(DEBUG_FILE): + self.logger.setLevel(logging.DEBUG) + else: + self.logger.setLevel(logging.INFO) + + def get_fan_total_number(self): + return self.int_case.get_fan_total_number() + + def get_device_airflow(self): + return self.int_case.get_device_airflow(E2_NAME) + + def fan_obj_init(self): + fan_num = self.get_fan_total_number() + for i in range(fan_num): + fan_name = "FAN" + str(i + 1) + fan_obj = Fan(fan_name, self.int_case) + self.fan_obj_list.append(fan_obj) + self.logger.info("fan object initialize success") + + def fan_airflow_check(self, fan_obj): + fan_airflow = fan_obj.get_direction() + device_airflow = self.get_device_airflow() + if fan_airflow != device_airflow: + self.logger.error("%s airflow[%s] not match device airflow[%s]", fan_obj.name, fan_airflow, device_airflow) + else: + self.logger.debug("%s airflow[%s] match device airflow[%s]", fan_obj.name, fan_airflow, device_airflow) + + def fan_plug_in_out_check(self, fan_obj): + present = fan_obj.get_presence() + if present is True: + self.logger.debug("%s is present", fan_obj.name) + else: + self.logger.debug("%s is absent", fan_obj.name) + + if present != fan_obj.pre_present: + if present is True: + fan_obj.plugin_cnt += 1 + fan_obj.plugout_cnt = 0 + if fan_obj.plugin_cnt >= self.__present_check_cnt: + fan_obj.pre_present = True + self.logger.info("%s [serial:%s] is plugin", fan_obj.name, fan_obj.get_serial()) + self.fan_airflow_check(fan_obj) + else: + fan_obj.plugin_cnt = 0 + fan_obj.plugout_cnt += 1 + if fan_obj.plugout_cnt >= self.__present_check_cnt: + fan_obj.pre_present = False + self.logger.info("%s is plugout", fan_obj.name) + else: + fan_obj.plugin_cnt = 0 + fan_obj.plugout_cnt = 0 + self.logger.debug("%s present status is not change", fan_obj.name) + + def fan_status_check(self, fan_obj): + status = fan_obj.get_status() + if status is True: + self.logger.debug("%s is normal", fan_obj.name) + else: + self.logger.debug("%s is error", fan_obj.name) + + if status != fan_obj.pre_status: + if status is True: + fan_obj.status_normal_cnt += 1 + fan_obj.status_error_cnt = 0 + if fan_obj.status_normal_cnt >= self.__status_check_cnt: + fan_obj.pre_status = True + self.logger.info( + "%s [serial:%s] is form error change to normal", + fan_obj.name, + fan_obj.get_serial()) + else: + fan_obj.status_normal_cnt = 0 + fan_obj.status_error_cnt += 1 + if fan_obj.status_error_cnt >= self.__status_check_cnt: + fan_obj.pre_status = False + self.logger.info( + "%s [serial:%s] is form normal change to error", + fan_obj.name, + fan_obj.get_serial()) + else: + fan_obj.status_normal_cnt = 0 + fan_obj.status_error_cnt = 0 + self.logger.debug("%s status is not change", fan_obj.name) + + def checkFanPresence(self): + for fan_obj in self.fan_obj_list: + self.fan_plug_in_out_check(fan_obj) + + def checkFanStatus(self): + for fan_obj in self.fan_obj_list: + self.fan_status_check(fan_obj) + + def run(self): + start_time = time.time() + while True: + try: + self.debug_init() + delta_time = time.time() - start_time + if self.__present_interval <= self.__status_interval: + if delta_time >= self.__status_interval or delta_time < 0: + self.checkFanStatus() + start_time = time.time() + else: + self.checkFanPresence() + time.sleep(self.__present_interval) + else: + if delta_time >= self.__present_interval or delta_time < 0: + self.checkFanPresence() + start_time = time.time() + else: + self.checkFanStatus() + time.sleep(self.__status_interval) + except Exception as e: + self.logger.error('EXCEPTION: %s.', str(e)) + + +if __name__ == '__main__': + monitor_fan = MonitorFan() + monitor_fan.fan_obj_init() + monitor_fan.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py new file mode 100755 index 0000000000..4fe0beec44 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_common.py @@ -0,0 +1,178 @@ +#!/usr/bin/python3 + +__all__ = [ + "BLACKLIST_DRIVERS", + "DRIVERLISTS", + "DEVICE", + "STARTMODULE", + "MAC_LED_RESET", + "MAC_DEFAULT_PARAM", + "DEV_MONITOR_PARAM", + "SLOT_MONITOR_PARAM", + "MANUINFO_CONF", + "REBOOT_CTRL_PARAM", + "PMON_SYSLOG_STATUS", + "OPTOE", + "REBOOT_CAUSE_PARA", + "UPGRADE_SUMMARY", + "WARM_UPGRADE_PARAM", + "WARM_UPG_FLAG", + "WARM_UPGRADE_STARTED_FLAG", + "PLATFORM_E2_CONF", + "AIR_FLOW_CONF", + "AIRFLOW_RESULT_FILE", + "INIT_PARAM_PRE", + "INIT_COMMAND_PRE", + "INIT_PARAM", + "INIT_COMMAND", + "MONITOR_TEMP_MIN", + "MONITOR_K", + "MONITOR_MAC_IN", + "MONITOR_DEFAULT_SPEED", + "MONITOR_MAX_SPEED", + "MONITOR_MIN_SPEED", + "MONITOR_MAC_ERROR_SPEED", + "MONITOR_FAN_TOTAL_NUM", + "MONITOR_MAC_UP_TEMP", + "MONITOR_MAC_LOWER_TEMP", + "MONITOR_MAC_MAX_TEMP", + "MONITOR_FALL_TEMP", + "MONITOR_MAC_WARNING_THRESHOLD", + "MONITOR_OUTTEMP_WARNING_THRESHOLD", + "MONITOR_BOARDTEMP_WARNING_THRESHOLD", + "MONITOR_CPUTEMP_WARNING_THRESHOLD", + "MONITOR_INTEMP_WARNING_THRESHOLD", + "MONITOR_MAC_CRITICAL_THRESHOLD", + "MONITOR_OUTTEMP_CRITICAL_THRESHOLD", + "MONITOR_BOARDTEMP_CRITICAL_THRESHOLD", + "MONITOR_CPUTEMP_CRITICAL_THRESHOLD", + "MONITOR_INTEMP_CRITICAL_THRESHOLD", + "MONITOR_CRITICAL_NUM", + "MONITOR_SHAKE_TIME", + "MONITOR_INTERVAL", + "MONITOR_LED_INTERVAL", + "MONITOR_PID_FLAG", + "MONITOR_MAC_SOURCE_SYSFS", + "MONITOR_MAC_SOURCE_PATH", + "MONITOR_PID_MODULE", + "PSU_FAN_FOLLOW", + "MONITOR_SYS_LED", + "MONITOR_SYS_FAN_LED", + "MONITOR_FANS_LED", + "MONITOR_SYS_PSU_LED", + "MONITOR_FAN_STATUS", + "MONITOR_PSU_STATUS", + "MONITOR_DEV_STATUS", + "MONITOR_DEV_STATUS_DECODE", + "DEV_LEDS", + "fanloc" +] + +# driver blacklist parameter +BLACKLIST_DRIVERS = [] + +# driver list parameter +DRIVERLISTS = [] + +# device list parameter +DEVICE = [] + +# start module parameters +STARTMODULE = {} + +# mac led reset parameter +MAC_LED_RESET = {} + +# avscontrol parameter +MAC_DEFAULT_PARAM = [] + +# dev_monitor parameter +DEV_MONITOR_PARAM = {} + +# slot_monitor parameter +SLOT_MONITOR_PARAM = {} + +# platform_manufacturer parameter +MANUINFO_CONF = {} + +# reboot_ctrl parameter +REBOOT_CTRL_PARAM = {} + +# pmon_syslog parameter +PMON_SYSLOG_STATUS = {} + +# sfp optoe device parameter +OPTOE = [] + +# reboot_cause parameter +REBOOT_CAUSE_PARA = [] + +# upgrade parameter +UPGRADE_SUMMARY = {} + +# warm_uprade parameter +WARM_UPGRADE_PARAM = {} +WARM_UPG_FLAG = "/etc/sonic/.warm_upg_flag" +WARM_UPGRADE_STARTED_FLAG = "/etc/sonic/.doing_warm_upg" + +# platform_e2 parameter +PLATFORM_E2_CONF = {} + +# generate_airflow parameter +AIR_FLOW_CONF = {} +AIRFLOW_RESULT_FILE = "/etc/sonic/.airflow" + +# Initialization parameters +INIT_PARAM_PRE = [] +INIT_COMMAND_PRE = [] +INIT_PARAM = [] +INIT_COMMAND = [] + +################################ fancontrol parameter################################### +MONITOR_TEMP_MIN = 38 +MONITOR_K = 11 +MONITOR_MAC_IN = 35 +MONITOR_DEFAULT_SPEED = 0x60 +MONITOR_MAX_SPEED = 0xFF +MONITOR_MIN_SPEED = 0x60 +MONITOR_MAC_ERROR_SPEED = 0XBB +MONITOR_FAN_TOTAL_NUM = 4 +MONITOR_MAC_UP_TEMP = 50 +MONITOR_MAC_LOWER_TEMP = -50 +MONITOR_MAC_MAX_TEMP = 100 # + +MONITOR_FALL_TEMP = 4 +MONITOR_MAC_WARNING_THRESHOLD = 100 +MONITOR_OUTTEMP_WARNING_THRESHOLD = 85 +MONITOR_BOARDTEMP_WARNING_THRESHOLD = 85 +MONITOR_CPUTEMP_WARNING_THRESHOLD = 85 +MONITOR_INTEMP_WARNING_THRESHOLD = 70 + +MONITOR_MAC_CRITICAL_THRESHOLD = 105 +MONITOR_OUTTEMP_CRITICAL_THRESHOLD = 90 +MONITOR_BOARDTEMP_CRITICAL_THRESHOLD = 90 +MONITOR_CPUTEMP_CRITICAL_THRESHOLD = 100 +MONITOR_INTEMP_CRITICAL_THRESHOLD = 80 +MONITOR_CRITICAL_NUM = 3 +MONITOR_SHAKE_TIME = 20 +MONITOR_INTERVAL = 60 +MONITOR_LED_INTERVAL = 2 +MONITOR_PID_FLAG = 0 + +MONITOR_MAC_SOURCE_SYSFS = 0 +MONITOR_MAC_SOURCE_PATH = None + +MONITOR_PID_MODULE = {} + +PSU_FAN_FOLLOW = {} + +MONITOR_SYS_LED = [] +MONITOR_SYS_FAN_LED = [] +MONITOR_FANS_LED = [] +MONITOR_SYS_PSU_LED = [] +MONITOR_FAN_STATUS = [] +MONITOR_PSU_STATUS = [] +MONITOR_DEV_STATUS = {} +MONITOR_DEV_STATUS_DECODE = {} +DEV_LEDS = {} +fanloc = [] diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py new file mode 100755 index 0000000000..004a64c722 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_config.py @@ -0,0 +1,184 @@ +#!/usr/bin/python3 + +import sys +import os +from wbutil.baseutil import get_machine_info +from wbutil.baseutil import get_platform_info +from wbutil.baseutil import get_board_id + +__all__ = [ + "MAILBOX_DIR", + "PLATFORM_GLOBALCONFIG", + "GLOBALCONFIG", + "STARTMODULE", + "MAC_LED_RESET", + "MAC_DEFAULT_PARAM", + "DEV_MONITOR_PARAM", + "SLOT_MONITOR_PARAM", + "MANUINFO_CONF", + "REBOOT_CTRL_PARAM", + "PMON_SYSLOG_STATUS", + "REBOOT_CAUSE_PARA", + "UPGRADE_SUMMARY", + "WARM_UPGRADE_PARAM", + "WARM_UPG_FLAG", + "WARM_UPGRADE_STARTED_FLAG", + "PLATFORM_E2_CONF", + "AIR_FLOW_CONF", + "AIRFLOW_RESULT_FILE", + "GLOBALINITPARAM", + "GLOBALINITCOMMAND", + "GLOBALINITPARAM_PRE", + "GLOBALINITCOMMAND_PRE", + "MONITOR_CONST", + "PSU_FAN_FOLLOW", + "MONITOR_SYS_LED", + "MONITOR_FANS_LED", + "MONITOR_SYS_FAN_LED", + "MONITOR_SYS_PSU_LED", + "MONITOR_FAN_STATUS", + "MONITOR_PSU_STATUS", + "MONITOR_DEV_STATUS", + "MONITOR_DEV_STATUS_DECODE", + "DEV_LEDS", + "fanloc" +] + + +def getdeviceplatform(): + x = get_platform_info(get_machine_info()) + if x is not None: + filepath = "/usr/share/sonic/device/" + x + return filepath + return None + + +platform = get_platform_info(get_machine_info()) +board_id = get_board_id(get_machine_info()) +platformpath = getdeviceplatform() +MAILBOX_DIR = "/sys/bus/i2c/devices/" +grtd_productfile = (platform + "_config").replace("-", "_") +common_productfile = "platform_common" +platform_configfile = (platform + "_" + board_id + "_config").replace("-", "_") # platfrom + board_id +configfile_pre = "/usr/local/bin/" +sys.path.append(platformpath) +sys.path.append(configfile_pre) + +############################################################################################ +if os.path.exists(configfile_pre + platform_configfile + ".py"): + module_product = __import__(platform_configfile, globals(), locals(), [], 0) +elif os.path.exists(configfile_pre + grtd_productfile + ".py"): + module_product = __import__(grtd_productfile, globals(), locals(), [], 0) +elif os.path.exists(configfile_pre + common_productfile + ".py"): + module_product = __import__(common_productfile, globals(), locals(), [], 0) +else: + print("config file not exist") + sys.exit(-1) +############################################################################################ + +PLATFORM_GLOBALCONFIG = { + "DRIVERLISTS": module_product.DRIVERLISTS, + "OPTOE": module_product.OPTOE, + "DEVS": module_product.DEVICE, + "BLACKLIST_DRIVERS": module_product.BLACKLIST_DRIVERS +} +GLOBALCONFIG = PLATFORM_GLOBALCONFIG + +# start module parameters +STARTMODULE = module_product.STARTMODULE + +# mac led reset parameter +MAC_LED_RESET = module_product.MAC_LED_RESET + +# avscontrol parameter +MAC_DEFAULT_PARAM = module_product.MAC_DEFAULT_PARAM + +# dev_monitor parameter +DEV_MONITOR_PARAM = module_product.DEV_MONITOR_PARAM + +# slot_monitor parameter +SLOT_MONITOR_PARAM = module_product.SLOT_MONITOR_PARAM + +# platform_manufacturer parameter +MANUINFO_CONF = module_product.MANUINFO_CONF + +# reboot_ctrl parameter +REBOOT_CTRL_PARAM = module_product.REBOOT_CTRL_PARAM + +# pmon_syslog parameter +PMON_SYSLOG_STATUS = module_product.PMON_SYSLOG_STATUS + +# reboot_cause parameter +REBOOT_CAUSE_PARA = module_product.REBOOT_CAUSE_PARA + +# upgrade parameter +UPGRADE_SUMMARY = module_product.UPGRADE_SUMMARY + +# warm_uprade parameter +WARM_UPGRADE_PARAM = module_product.WARM_UPGRADE_PARAM +WARM_UPG_FLAG = module_product.WARM_UPG_FLAG +WARM_UPGRADE_STARTED_FLAG = module_product.WARM_UPGRADE_STARTED_FLAG + +# platform_e2 parameter +PLATFORM_E2_CONF = module_product.PLATFORM_E2_CONF + +# generate_airflow parameter +AIR_FLOW_CONF = module_product.AIR_FLOW_CONF +AIRFLOW_RESULT_FILE = module_product.AIRFLOW_RESULT_FILE + +# Initialization parameters +GLOBALINITPARAM = module_product.INIT_PARAM +GLOBALINITCOMMAND = module_product.INIT_COMMAND +GLOBALINITPARAM_PRE = module_product.INIT_PARAM_PRE +GLOBALINITCOMMAND_PRE = module_product.INIT_COMMAND_PRE + +################################ fancontrol parameter################################### + + +class MONITOR_CONST: + TEMP_MIN = module_product.MONITOR_TEMP_MIN + K = module_product.MONITOR_K + MAC_IN = module_product.MONITOR_MAC_IN + DEFAULT_SPEED = module_product.MONITOR_DEFAULT_SPEED + MAX_SPEED = module_product.MONITOR_MAX_SPEED + MIN_SPEED = module_product.MONITOR_MIN_SPEED + MAC_ERROR_SPEED = module_product.MONITOR_MAC_ERROR_SPEED + FAN_TOTAL_NUM = module_product.MONITOR_FAN_TOTAL_NUM + MAC_UP_TEMP = module_product.MONITOR_MAC_UP_TEMP + MAC_LOWER_TEMP = module_product.MONITOR_MAC_LOWER_TEMP + MAC_MAX_TEMP = module_product.MONITOR_MAC_MAX_TEMP + + MAC_WARNING_THRESHOLD = module_product.MONITOR_MAC_WARNING_THRESHOLD + OUTTEMP_WARNING_THRESHOLD = module_product.MONITOR_OUTTEMP_WARNING_THRESHOLD + BOARDTEMP_WARNING_THRESHOLD = module_product.MONITOR_BOARDTEMP_WARNING_THRESHOLD + CPUTEMP_WARNING_THRESHOLD = module_product.MONITOR_CPUTEMP_WARNING_THRESHOLD + INTEMP_WARNING_THRESHOLD = module_product.MONITOR_INTEMP_WARNING_THRESHOLD + + MAC_CRITICAL_THRESHOLD = module_product.MONITOR_MAC_CRITICAL_THRESHOLD + OUTTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_OUTTEMP_CRITICAL_THRESHOLD + BOARDTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_BOARDTEMP_CRITICAL_THRESHOLD + CPUTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_CPUTEMP_CRITICAL_THRESHOLD + INTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_INTEMP_CRITICAL_THRESHOLD + CRITICAL_NUM = module_product.MONITOR_CRITICAL_NUM + SHAKE_TIME = module_product.MONITOR_SHAKE_TIME + MONITOR_INTERVAL = module_product.MONITOR_INTERVAL + MONITOR_LED_INTERVAL = module_product.MONITOR_LED_INTERVAL + MONITOR_FALL_TEMP = module_product.MONITOR_FALL_TEMP + MONITOR_PID_FLAG = module_product.MONITOR_PID_FLAG + MONITOR_PID_MODULE = module_product.MONITOR_PID_MODULE + + MONITOR_MAC_SOURCE_SYSFS = module_product.MONITOR_MAC_SOURCE_SYSFS + MONITOR_MAC_SOURCE_PATH = module_product.MONITOR_MAC_SOURCE_PATH + + +PSU_FAN_FOLLOW = module_product.PSU_FAN_FOLLOW +MONITOR_SYS_LED = module_product.MONITOR_SYS_LED +MONITOR_FANS_LED = module_product.MONITOR_FANS_LED +MONITOR_SYS_FAN_LED = module_product.MONITOR_SYS_FAN_LED +MONITOR_SYS_PSU_LED = module_product.MONITOR_SYS_PSU_LED +MONITOR_FAN_STATUS = module_product.MONITOR_FAN_STATUS +MONITOR_PSU_STATUS = module_product.MONITOR_PSU_STATUS +MONITOR_DEV_STATUS = module_product.MONITOR_DEV_STATUS +MONITOR_DEV_STATUS_DECODE = module_product.MONITOR_DEV_STATUS_DECODE +DEV_LEDS = module_product.DEV_LEDS +fanloc = module_product.fanloc diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py new file mode 100755 index 0000000000..6d2c6de653 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_driver.py @@ -0,0 +1,258 @@ +#!/usr/bin/env python3 +import os +import subprocess +import time +import click +from platform_config import GLOBALCONFIG, WARM_UPGRADE_STARTED_FLAG, WARM_UPG_FLAG + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def log_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + if status: + print(output) + return status, output + + +def platform_process_file_check(): + # WARM_UPGRADE_STARTED_FLAG is used as warm_upgrade.py process start flag + if os.path.exists(WARM_UPGRADE_STARTED_FLAG): + os.remove(WARM_UPGRADE_STARTED_FLAG) + + # WARM_UPG_FLAG is used as port related service judgment flag + if os.path.exists(WARM_UPG_FLAG): + os.remove(WARM_UPG_FLAG) + + +def startCommon_operation(): + platform_process_file_check() + + +def check_driver(): + status, output = log_os_system("lsmod | grep wb | wc -l") + if status: + return False + if output.isdigit() and int(output) > 0: + return True + return False + + +def removeDev(bus, loc): + cmd = "echo 0x%02x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath): + log_os_system(cmd) + + +def addDev(name, bus, loc): + if name == "lm75": + time.sleep(0.1) + pdevpath = "/sys/bus/i2c/devices/i2c-%d/" % (bus) + for i in range(1, 100): + if os.path.exists(pdevpath) is True: + break + time.sleep(0.1) + if i % 10 == 0: + click.echo("%%WB_PLATFORM_DRIVER-INIT: %s not found, wait 0.1 second ! i %d " % (pdevpath, i)) + + cmd = "echo %s 0x%02x > /sys/bus/i2c/devices/i2c-%d/new_device" % (name, loc, bus) + devpath = "/sys/bus/i2c/devices/%d-%04x" % (bus, loc) + if os.path.exists(devpath) is False: + os.system(cmd) + + +def removeOPTOE(startbus, endbus): + for bus in range(endbus, startbus - 1, -1): + removeDev(bus, 0x50) + + +def addOPTOE(name, startbus, endbus): + for bus in range(startbus, endbus + 1): + addDev(name, bus, 0x50) + + +def removeoptoes(): + optoes = GLOBALCONFIG["OPTOE"] + for index in range(len(optoes) - 1, -1, -1): + removeOPTOE(optoes[index]["startbus"], optoes[index]["endbus"]) + + +def addoptoes(): + optoes = GLOBALCONFIG["OPTOE"] + for optoe in optoes: + addOPTOE(optoe["name"], optoe["startbus"], optoe["endbus"]) + + +def removedevs(): + devs = GLOBALCONFIG["DEVS"] + for index in range(len(devs) - 1, -1, -1): + removeDev(devs[index]["bus"], devs[index]["loc"]) + + +def adddevs(): + devs = GLOBALCONFIG["DEVS"] + for dev in devs: + addDev(dev["name"], dev["bus"], dev["loc"]) + + +def checksignaldriver(name): + modisexistcmd = "lsmod | grep -w %s | wc -l" % name + status, output = log_os_system(modisexistcmd) + if status: + return False + if output.isdigit() and int(output) > 0: + return True + return False + + +def adddriver(name, delay): + cmd = "modprobe %s" % name + if delay != 0: + time.sleep(delay) + if checksignaldriver(name) is not True: + log_os_system(cmd) + + +def removedriver(name, delay, removeable=1): + realname = name.lstrip().split(" ")[0] + cmd = "rmmod -f %s" % realname + if checksignaldriver(realname) and removeable: + log_os_system(cmd) + if delay > 0: + time.sleep(delay) + + +def removedrivers(): + if GLOBALCONFIG is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load global config failed.") + return + drivers = GLOBALCONFIG.get("DRIVERLISTS", None) + if drivers is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load driver list failed.") + return + for index in range(len(drivers) - 1, -1, -1): + delay = 0 + name = "" + removeable = drivers[index].get("removable", 1) + if isinstance(drivers[index], dict) and "delay" in drivers[index]: + name = drivers[index].get("name") + delay = drivers[index]["delay"] + else: + name = drivers[index] + removedriver(name, delay, removeable) + + +def adddrivers(): + if GLOBALCONFIG is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load global config failed.") + return + drivers = GLOBALCONFIG.get("DRIVERLISTS", None) + if drivers is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load driver list failed.") + return + for driver in drivers: + delay = 0 + name = "" + if isinstance(driver, dict) and "delay" in driver: + name = driver.get("name") + delay = driver["delay"] + else: + name = driver + adddriver(name, delay) + + +def blacklist_driver_remove(): + if GLOBALCONFIG is None: + click.echo("%%WB_PLATFORM_DRIVER-INIT: load global config failed.") + return + blacklist_drivers = GLOBALCONFIG.get("BLACKLIST_DRIVERS", []) + for driver in blacklist_drivers: + delay = 0 + name = "" + if isinstance(driver, dict) and "delay" in driver: + name = driver.get("name") + delay = driver["delay"] + else: + name = driver + removedriver(name, delay) + + +def unload_driver(): + removeoptoes() + removedevs() + removedrivers() + + +def reload_driver(): + removedevs() + removedrivers() + time.sleep(1) + adddrivers() + adddevs() + + +def i2c_check(bus, retrytime=6): + try: + i2cpath = "/sys/bus/i2c/devices/" + bus + while retrytime and not os.path.exists(i2cpath): + click.echo("%%WB_PLATFORM_DRIVER-HA: i2c bus abnormal, last bus %s is not exist." % i2cpath) + reload_driver() + retrytime -= 1 + time.sleep(1) + except Exception as e: + click.echo("%%WB_PLATFORM_DRIVER-HA: %s" % str(e)) + + +def load_driver(): + startCommon_operation() + adddrivers() + adddevs() + addoptoes() + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''device operator''' + + +@main.command() +def start(): + '''load drivers and device ''' + blacklist_driver_remove() + if check_driver(): + unload_driver() + load_driver() + + +@main.command() +def stop(): + '''stop drivers device ''' + unload_driver() + + +@main.command() +def restart(): + '''restart drivers and device''' + unload_driver() + load_driver() + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py new file mode 100755 index 0000000000..808d932162 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_e2.py @@ -0,0 +1,434 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import click + +from eepromutil.fru import ipmifru +from eepromutil.fantlv import fan_tlv +import eepromutil.onietlv as ot +from platform_config import PLATFORM_E2_CONF +from platform_util import byteTostr, dev_file_read + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +class ExtraFunc(object): + @staticmethod + def decode_mac(encodedata): + if encodedata is None: + return None + ret = ":".join("%02x" % ord(data) for data in encodedata) + return ret.upper() + + @staticmethod + def decode_mac_number(encodedata): + if encodedata is None: + return None + return (ord(encodedata[0]) << 8) | (ord(encodedata[1]) & 0x00ff) + + @staticmethod + @staticmethod + def fru_decode_mac_number(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + area_info = getattr(ipmi_fru, area, None) + if area_info is not None: + raw_mac_number = getattr(area_info, field, None) + mac_number = decode_mac_number(raw_mac_number) + ipmi_fru.setValue(area, field, mac_number) + + @staticmethod + def fru_decode_mac(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + area_info = getattr(ipmi_fru, area, None) + if area_info is not None: + raw_mac = getattr(area_info, field, None) + decoded_mac = decode_mac(raw_mac) + ipmi_fru.setValue(area, field, decoded_mac) + + @staticmethod + def fru_decode_hw(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + area_info = getattr(ipmi_fru, area, None) + if area_info is not None: + raw_hw = getattr(area_info, field, None) + decode_hw = str(int(raw_hw, 16)) + ipmi_fru.setValue(area, field, decode_hw) + + +def set_onie_value(params): + onie = params.get("onie") + field = params.get("field") + config_value = params.get("config_value") + for index, onie_item in enumerate(onie): + if onie_item.get("name") == field: + if "value" in onie_item.keys(): + onie[index]["value"] = config_value + + +def onie_eeprom_decode(onie, e2_decode): + for e2_decode_item in e2_decode: + field = e2_decode_item.get("field") + decode_type = e2_decode_item.get("decode_type") + if decode_type == 'func': + params = { + "onie": onie, + "field": field + } + func_name = e2_decode_item.get("func_name") + if func_name is not None: + run_func(func_name, params) + elif decode_type == 'config': + config_value = e2_decode_item.get("config_value") + if config_value is not None: + params = { + "onie": onie, + "field": field, + "config_value": config_value + } + set_onie_value(params) + else: + print("unsupport decode type") + continue + + +def onie_eeprom_show(eeprom, e2_decode=None): + try: + onietlv = ot.onie_tlv() + rets = onietlv.decode(eeprom) + if e2_decode is not None: + onie_eeprom_decode(rets, e2_decode) + print("%-20s %-5s %-5s %-20s" % ("TLV name", "Code", "lens", "Value")) + for item in rets: + if item["code"] == 0xfd: + print("%-20s 0x%-02X %-5s" % (item["name"], item["code"], item["lens"])) + else: + print("%-20s 0x%-02X %-5s %-20s" % (item["name"], item["code"], item["lens"], item["value"])) + except Exception as e: + print(str(e)) + + +def set_fantlv_value(params): + fantlv_dict = params.get("fantlv") + field = params.get("field") + config_value = params.get("config_value") + for index, fantlv_item in enumerate(fantlv_dict): + if fantlv_item.get("name") == field: + if "value" in fantlv_item.keys(): + fantlv_dict[index]["value"] = config_value + + +def fantlv_eeprom_decode(fantlv_dict, e2_decode): + for e2_decode_item in e2_decode: + field = e2_decode_item.get("field") + decode_type = e2_decode_item.get("decode_type") + if decode_type == 'func': + params = { + "fantlv": fantlv_dict, + "field": field + } + func_name = e2_decode_item.get("func_name") + if func_name is not None: + run_func(func_name, params) + elif decode_type == 'config': + config_value = e2_decode_item.get("config_value") + if config_value is not None: + params = { + "fantlv": fantlv_dict, + "field": field, + "config_value": config_value + } + set_fantlv_value(params) + else: + print("unsupport decode type") + continue + + +def fantlv_eeprom_show(eeprom, e2_decode=None): + try: + tlv = fan_tlv() + rets = tlv.decode(eeprom) + if len(rets) == 0: + print("fan tlv eeprom info error.!") + return + if e2_decode is not None: + fantlv_eeprom_decode(rets, e2_decode) + print("%-15s %-5s %-5s %-20s" % ("TLV name", "Code", "lens", "Value")) + for item in rets: + print("%-15s 0x%-02X %-5s %-20s" % (item["name"], item["code"], item["lens"], item["value"])) + except Exception as e: + print(str(e)) + return + + +def run_func(funcname, params): + try: + func = getattr(ExtraFunc, funcname) + func(params) + except Exception as e: + print(str(e)) + +def set_fru_value(params): + ipmi_fru = params.get("fru") + area = params.get("area") + field = params.get("field") + config_value = params.get("config_value") + ipmi_fru.setValue(area, field, config_value) + + +def fru_eeprom_decode(ipmi_fru, e2_decode): + for e2_decode_item in e2_decode: + area = e2_decode_item.get("area") + field = e2_decode_item.get("field") + decode_type = e2_decode_item.get("decode_type") + if decode_type == 'func': + params = { + "fru": ipmi_fru, + "area": area, + "field": field + } + func_name = e2_decode_item.get("func_name") + if func_name is not None: + run_func(func_name, params) + elif decode_type == 'config': + config_value = e2_decode_item.get("config_value") + if config_value is not None: + params = { + "fru": ipmi_fru, + "area": area, + "field": field, + "config_value": config_value + } + set_fru_value(params) + else: + print("unsupport decode type") + continue + + +def fru_eeprom_show(eeprom, e2_decode=None): + try: + ipmi_fru = ipmifru() + ipmi_fru.decodeBin(eeprom) + if e2_decode is not None: + fru_eeprom_decode(ipmi_fru, e2_decode) + print("=================board=================") + print(ipmi_fru.boardInfoArea) + print("=================product=================") + print(ipmi_fru.productInfoArea) + except Exception as e: + print(str(e)) + + +def eeprom_parase(eeprom_conf): + name = eeprom_conf.get("name") + e2_type = eeprom_conf.get("e2_type") + e2_path = eeprom_conf.get("e2_path") + e2_size = eeprom_conf.get("e2_size", 256) + e2_decode = eeprom_conf.get("e2_decode") + print("===================%s===================" % name) + ret, binval_bytes = dev_file_read(e2_path, 0, e2_size) + if ret is False: + print("eeprom read error, eeprom path: %s, msg: %s" % (e2_path, binval_bytes)) + return + binval = byteTostr(binval_bytes) + if e2_type == "onie_tlv": + onie_eeprom_show(binval, e2_decode) + elif e2_type == "fru": + fru_eeprom_show(binval, e2_decode) + elif e2_type == "fantlv": + fantlv_eeprom_show(binval, e2_decode) + else: + print("Unknow eeprom type: %s" % e2_type) + return + + +def get_fans_eeprom_info(param): + fan_eeprom_conf = PLATFORM_E2_CONF.get("fan", []) + fan_num = len(fan_eeprom_conf) + if fan_num == 0: + print("fan number is 0, can't get fan eeprom info") + return + if param == 'all': + for conf in fan_eeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + fan_index = int(param, 10) - 1 + if fan_index < 0 or fan_index >= fan_num: + print("param error, total fan number: %d, fan index: %d" % (fan_num, fan_index + 1)) + return + eeprom_parase(fan_eeprom_conf[fan_index]) + return + + +def get_psus_eeprom_info(param): + psu_eeprom_conf = PLATFORM_E2_CONF.get("psu", []) + psu_num = len(psu_eeprom_conf) + if psu_num == 0: + print("psu number is 0, can't get psu eeprom info") + return + if param == 'all': + for conf in psu_eeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + psu_index = int(param, 10) - 1 + if psu_index < 0 or psu_index >= psu_num: + print("param error, total psu number: %d, psu index: %d" % (psu_num, psu_index + 1)) + return + eeprom_parase(psu_eeprom_conf[psu_index]) + return + + +def get_slots_eeprom_info(param): + slot_eeprom_conf = PLATFORM_E2_CONF.get("slot", []) + slot_num = len(slot_eeprom_conf) + if slot_num == 0: + print("slot number is 0, can't get slot eeprom info") + return + if param == 'all': + for conf in slot_eeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + slot_index = int(param, 10) - 1 + if slot_index < 0 or slot_index >= slot_num: + print("param error, total slot number: %d, slot index: %d" % (slot_num, slot_index + 1)) + return + eeprom_parase(slot_eeprom_conf[slot_index]) + return + + +def get_syseeprom_info(param): + syseeprom_conf = PLATFORM_E2_CONF.get("syseeprom", []) + syseeprom_num = len(syseeprom_conf) + if syseeprom_num == 0: + print("syseeprom number is 0, can't get syseeprom info") + return + if param == 'all': + for conf in syseeprom_conf: + eeprom_parase(conf) + return + if not param.isdigit(): + print("param error, %s is not digital or 'all'" % param) + return + syseeprom_index = int(param, 10) - 1 + if syseeprom_index < 0 or syseeprom_index >= syseeprom_num: + print("param error, total syseeprom number: %d, syseeprom index: %d" % (syseeprom_num, syseeprom_index + 1)) + return + eeprom_parase(syseeprom_conf[syseeprom_index]) + return + + +def decode_eeprom_info(e2_type, e2_path, e2_size): + if not e2_size.isdigit(): + print("param error, e2_size %s is not digital" % e2_size) + return + e2_size = int(e2_size, 10) + eeprom_conf = {} + eeprom_conf["name"] = e2_type + eeprom_conf["e2_type"] = e2_type + eeprom_conf["e2_path"] = e2_path + eeprom_conf["e2_size"] = e2_size + eeprom_parase(eeprom_conf) + return + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''platform eeprom display script''' + +# fan eeprom info display + + +@main.command() +@click.argument('fan_index', required=True) +def fan(fan_index): + '''fan_index(1, 2, 3...)/all''' + get_fans_eeprom_info(fan_index) + +# psu eeprom info display + + +@main.command() +@click.argument('psu_index', required=True) +def psu(psu_index): + '''psu_index(1, 2, 3...)/all''' + get_psus_eeprom_info(psu_index) + +# slot eeprom info display + + +@main.command() +@click.argument('slot_index', required=True) +def slot(slot_index): + '''slot_index(1, 2, 3...)/all''' + get_slots_eeprom_info(slot_index) + +# syseeprom info display + + +@main.command() +@click.argument('syseeprom_index', required=True) +def syseeprom(syseeprom_index): + '''syseeprom_index(1, 2, 3...)/all''' + get_syseeprom_info(syseeprom_index) + +# fru eeprom info decode + + +@main.command() +@click.argument('e2_path', required=True) +@click.argument('e2_size', required=False, default="256") +def fru(e2_path, e2_size): + '''e2_path''' + decode_eeprom_info("fru", e2_path, e2_size) + +# fantlv eeprom info decode + + +@main.command() +@click.argument('e2_path', required=True) +@click.argument('e2_size', required=False, default="256") +def fantlv(e2_path, e2_size): + '''e2_path''' + decode_eeprom_info("fantlv", e2_path, e2_size) + +# onie_tlv eeprom info decode + + +@main.command() +@click.argument('e2_path', required=True) +@click.argument('e2_size', required=False, default="256") +def onie_tlv(e2_path, e2_size): + '''e2_path''' + decode_eeprom_info("onie_tlv", e2_path, e2_size) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py new file mode 100755 index 0000000000..2143b9420c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_intf.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +import os +import syslog +import importlib.machinery +from platform_util import getplatform_name, dev_file_read, dev_file_write, write_sysfs, read_sysfs + +__all__ = [ + "platform_reg_read", + "platform_reg_write", + "platform_set_optoe_type", + "platform_get_optoe_type", + "platform_sfp_read", + "platform_sfp_write", +] + +CPLD = 0 +FPGA = 1 +CPLD_PATH = "/dev/cpld%d" +FPGA_PATH = "/dev/fpga%d" + + +OPTOE_PATH = "/sys/bus/i2c/devices/%d-0050/" +OPTOE_DEV_CLASS = "dev_class" +OPTOE_EEPROM = "eeprom" + + +PLATFORM_INTF_DEBUG_FILE = "/etc/.platform_intf_debug_flag" + + +CONFIG_FILE_LIST = [ + "/usr/local/bin/", + "/usr/local/lib/python3/dist-packages/config/", + "/usr/local/lib/python3.7/dist-packages/config/", + "/usr/local/lib/python3.9/dist-packages/config/"] + + +def platform_intf_debug(s): + if os.path.exists(PLATFORM_INTF_DEBUG_FILE): + syslog.openlog("PLATFORM_INTF_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def platform_intf_error(s): + if os.path.exists(PLATFORM_INTF_DEBUG_FILE): + syslog.openlog("PLATFORM_INTF_ERROR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +class IntfPlatform: + CONFIG_NAME = 'PLATFORM_INTF_OPTOE' + __port_optoe_dict = {} + + def __init__(self): + real_path = None + platform_name = (getplatform_name()).replace("-", "_") + for configfile_path in CONFIG_FILE_LIST: + configfile = configfile_path + platform_name + "_port_config.py" + if os.path.exists(configfile): + real_path = configfile + break + if real_path is None: + raise Exception("get port config error") + config = importlib.machinery.SourceFileLoader(self.CONFIG_NAME, real_path).load_module() + self.__port_optoe_dict = config.PLATFORM_INTF_OPTOE + + def get_dev_path(self, dev_type, dev_id): + if dev_type == CPLD: + path = CPLD_PATH % dev_id + elif dev_type == FPGA: + path = FPGA_PATH % dev_id + else: + msg = "dev_type error!" + return False, msg + platform_intf_debug("path:%s" % path) + return True, path + + def get_port_path(self, port): + port_num = self.__port_optoe_dict.get("port_num", 0) + optoe_start_bus = self.__port_optoe_dict.get("optoe_start_bus", 0) + if port_num <= 0 or optoe_start_bus <= 0: + msg = "PLATFORM_INTF_OPTOE config error!" + return False, msg + if port <= 0 or port > port_num: + msg = "port out of range !" + return False, msg + path = OPTOE_PATH % (port + optoe_start_bus - 1) + platform_intf_debug("path:%s" % path) + return True, path + + ########################################### + # reg_read - read logic device register + # @dev_type: 0: CPLD, 1: FPGA + # @dev_id: device ID, start from 0 + # @offset: register offset + # @size: read length + # return: + # @ret: True if read success, False if not + # @info: The read value list if read success, otherwise the detail error message + ########################################### + def reg_read(self, dev_type, dev_id, offset, size): + ret, path = self.get_dev_path(dev_type, dev_id) + if ret is False: + return False, path + ret, info = dev_file_read(path, offset, size) + return ret, info + + ########################################### + # platform_reg_write - write logic device register + # @dev_type: 0: CPLD, 1: FPGA + # @dev_id: device ID, start from 0 + # @offset: register offset + # @val_list: The write value list + # return: + # @ret: True if write success, False if not + # @info: The write value length if write success, otherwise the detail error message + ########################################### + def reg_write(self, dev_type, dev_id, offset, val_list): + ret, path = self.get_dev_path(dev_type, dev_id) + if ret is False: + return False, path + ret, info = dev_file_write(path, offset, val_list) + return ret, info + + ########################################### + # set_optoe_type - set port optoe type + # @port: port index start from 1 + # @optoe_type: optoe type, including the following values + # 1: OPTOE1 + # 2: OPTOE2 + # 3: OPTOE3 + # return: + # @ret: True if set optoe type success, False if not + # @info: None if set optoe type success, otherwise the detail error message + ########################################### + def set_optoe_type(self, port, optoe_type): + ret, path = self.get_port_path(port) + if ret is False: + return False, path + optoe_type_path = path + OPTOE_DEV_CLASS + ret, info = write_sysfs(optoe_type_path, "%d" % optoe_type) + if ret is False: + return False, info + return True, None + + ########################################### + # get_optoe_type - get port optoe type + # @port: port index start from 1 + # return: + # @ret: True if set optoe type success, False if not + # @info: Optoe type value if get optoe type success, otherwise the detail error message + # optoe type including the following values + # 1: OPTOE1 + # 2: OPTOE2 + # 3: OPTOE3 + ########################################### + def get_optoe_type(self, port): + ret, path = self.get_port_path(port) + if ret is False: + return False, path + optoe_type_path = path + OPTOE_DEV_CLASS + ret, info = read_sysfs(optoe_type_path) + if ret is False: + return False, info + return True, int(info) + + ########################################### + # sfp_read -read sfp eeprom + # @port_id: port index start from 1 + # @offset: sfp eeprom offset + # @size: read sfp eeprom length + # return: + # @ret: True if read success, False if not + # @info: The read value list if read success, otherwise the detail error message + ########################################### + def sfp_read(self, port_id, offset, size): + ret, path = self.get_port_path(port_id) + if ret is False: + return False, path + optoe_eeprom_path = path + OPTOE_EEPROM + ret, info = dev_file_read(optoe_eeprom_path, offset, size) + return ret, info + + ########################################### + # sfp_write -write sfp eeprom + # @port_id: port index start from 1 + # @offset: sfp eeprom offset + # @val_list: The write value list + # return: + # @ret: True if read success, False if not + # @info: The write value length if write success, otherwise the detail error message + ########################################### + def sfp_write(self, port_id, offset, val_list): + ret, path = self.get_port_path(port_id) + if ret is False: + return False, path + optoe_eeprom_path = path + OPTOE_EEPROM + ret, info = dev_file_write(optoe_eeprom_path, offset, val_list) + return ret, info + + +platform = IntfPlatform() + + +########################################### +# platform_reg_read - read logic device register +# @dev_type: 0: CPLD, 1: FPGA +# @dev_id: device ID, start from 0 +# @offset: register offset +# @size: read length +# return: +# @ret: True if read success, False if not +# @info: The read value list if read success, otherwise the detail error message +########################################### +def platform_reg_read(dev_type, dev_id, offset, size): + ret = False + info = None + + # params check + if (isinstance(dev_type, int) is False or isinstance(dev_id, int) is False or + isinstance(offset, int) is False or isinstance(size, int) is False): + info = "params type check fail in platform_reg_read" + return ret, info + if dev_id < 0 or offset < 0 or size <= 0: + info = "params value check fail in platform_reg_read" + return ret, info + support_dev_type = (CPLD, FPGA) + if dev_type not in support_dev_type: + info = "dev_type match erro, fail in platform_reg_read" + return ret, info + + # call the solve func + return platform.reg_read(dev_type, dev_id, offset, size) + + +########################################### +# platform_reg_write - write logic device register +# @dev_type: 0: CPLD, 1: FPGA +# @dev_id: device ID, start from 0 +# @offset: register offset +# @val_list: The write value list +# return: +# @ret: True if write success, False if not +# @info: The write value length if write success, otherwise the detail error message +########################################### +def platform_reg_write(dev_type, dev_id, offset, val_list): + ret = False + info = None + + # params check + if (isinstance(dev_type, int) is False or isinstance(dev_id, int) is False or + isinstance(offset, int) is False or isinstance(val_list, list) is False): + info = "params type check fail in platform_reg_write" + return ret, info + if dev_id < 0 or offset < 0 or len(val_list) <= 0: + info = "params value check fail in platform_reg_write" + return ret, info + support_dev_type = (CPLD, FPGA) + if dev_type not in support_dev_type: + info = "dev_type match erro, fail in platform_reg_write" + return ret, info + + # call the solve func + return platform.reg_write(dev_type, dev_id, offset, val_list) + + +########################################### +# platform_set_optoe_type - set port optoe type +# @port: port index start from 1 +# @optoe_type: optoe type, including the following values +# 1: OPTOE1 +# 2: OPTOE2 +# 3: OPTOE3 +# return: +# @ret: True if set optoe type success, False if not +# @info: None if set optoe type success, otherwise the detail error message +########################################### +def platform_set_optoe_type(port, optoe_type): + ret = False + info = None + + # params check + if isinstance(port, int) is False or isinstance(optoe_type, int) is False: + info = "params type check fail in platform_set_optoe_type" + return ret, info + if port < 0 or optoe_type < 1 or optoe_type > 3: + info = "params value check fail in platform_set_optoe_type" + return ret, info + + # call the solve func + return platform.set_optoe_type(port, optoe_type) + + +########################################### +# platform_get_optoe_type - get port optoe type +# @port: port index start from 1 +# return: +# @ret: True if set optoe type success, False if not +# @info: Optoe type value if get optoe type success, otherwise the detail error message +# optoe type including the following values +# 1: OPTOE1 +# 2: OPTOE2 +# 3: OPTOE3 +########################################### +def platform_get_optoe_type(port): + ret = False + info = None + + # params check + if isinstance(port, int) is False: + info = "params type check fail in platform_get_optoe_type" + return ret, info + if port < 0: + info = "params value check fail in platform_get_optoe_type" + return ret, info + + # call the solve func + return platform.get_optoe_type(port) + + +########################################### +# platform_sfp_read -read sfp eeprom +# @port_id: port index start from 1 +# @offset: sfp eeprom offset +# @size: read sfp eeprom length +# return: +# @ret: True if read success, False if not +# @info: The read value list if read success, otherwise the detail error message +########################################### +def platform_sfp_read(port_id, offset, size): + ret = False + info = None + + # params check + if isinstance(port_id, int) is False or isinstance(offset, int) is False or isinstance(size, int) is False: + info = "params type check fail in platform_sfp_read" + return ret, info + if port_id < 0 or offset < 0 or size <= 0: + info = "params value check fail in platform_sfp_read" + return ret, info + + # call the solve func + return platform.sfp_read(port_id, offset, size) + + +########################################### +# platform_sfp_write -write sfp eeprom +# @port_id: port index start from 1 +# @offset: sfp eeprom offset +# @val_list: The write value list +# return: +# @ret: True if read success, False if not +# @info: The write value length if write success, otherwise the detail error message +########################################### +def platform_sfp_write(port_id, offset, val_list): + ret = False + info = None + + # params check + if isinstance(port_id, int) is False or isinstance(offset, int) is False or isinstance(val_list, list) is False: + info = "params type check fail in platform_sfp_write" + return ret, info + if port_id < 0 or offset < 0 or len(val_list) <= 0: + info = "params value check fail in platform_sfp_write" + return ret, info + + # call the solve func + return platform.sfp_write(port_id, offset, val_list) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py new file mode 100755 index 0000000000..c9b72c99cc --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_ipmi.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +import os +import syslog +import click +from platform_util import exec_os_cmd + + +IPMITOOL_CMD = "ipmitool raw 0x32 0x04" # All products are the same command + +PLATFORM_IPMI_DEBUG_FILE = "/etc/.platform_ipmi_debug_flag" +UPGRADEDEBUG = 1 +debuglevel = 0 + + +def debug_init(): + global debuglevel + if os.path.exists(PLATFORM_IPMI_DEBUG_FILE): + debuglevel = debuglevel | UPGRADEDEBUG + else: + debuglevel = debuglevel & ~(UPGRADEDEBUG) + + +def ipmidebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if UPGRADEDEBUG & debuglevel: + syslog.openlog("PLATFORM_IPMI", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def ipmierror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("PLATFORM_IPMI", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +@click.command() +@click.argument('cmd', required=True) +def platform_ipmi_main(cmd): + '''Send command to BMC through ipmi''' + try: + # Convert string command to ASCII + user_cmd = "" + for ch in cmd: + user_cmd += " " + str(ord(ch)) + + final_cmd = IPMITOOL_CMD + user_cmd + ipmidebuglog("final cmd:%s" % final_cmd) + + # exec ipmitool cmd + status, output = exec_os_cmd(final_cmd) + if status: + ipmierror("exec ipmitool_cmd:%s user_cmd:%s failed" % (IPMITOOL_CMD, cmd)) + ipmierror("failed log: %s" % output) + return False, "exec final_cmd failed" + + # the data read by ipmitool is hex value, needs transformation + data_list = output.replace("\n", "").strip(' ').split(' ') + ipmidebuglog("data_list: %s" % data_list) + result = "" + for data in data_list: + result += chr(int(data, 16)) + + # 'result' string include ret and log, separated by , + result_list = result.split(',', 2) + if len(result_list) != 2: + log = "split failed. len(result) != 2. result:%s" % result + ipmierror(log) + return False, log + if int(result_list[0]) != 0: + ipmierror("finally analy ipmitool_cmd:%s user_cmd:%s exec failed" % (IPMITOOL_CMD, cmd)) + ipmierror("failed return log: %s" % result_list[1]) + print(result_list[1]) + return False, result_list[1] + + ipmidebuglog("finally exec ipmitool_cmd:%s user_cmd:%s success" % (IPMITOOL_CMD, cmd)) + print(result_list[1]) + return True, result_list[1] + + except Exception as e: + log = "An exception occurred, exception log:%s" % str(e) + ipmierror(log) + return False, log + + +if __name__ == '__main__': + debug_init() + ret, msg = platform_ipmi_main() + if ret is False: + sys.exit(1) + sys.exit(0) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py new file mode 100755 index 0000000000..1404692bc9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_manufacturer.py @@ -0,0 +1,591 @@ +#!/usr/bin/env python3 + +import re +import mmap +import fcntl +import subprocess +import shlex +import signal +import os +import time +import sys +from platform_config import MANUINFO_CONF +from monitor import status + + +INDENT = 4 + + +def printerr(vchar): + sys.stderr.write(vchar + '\n') + + +g_extra_cache = {} +g_meminfo_cache = {} +g_exphy_cache = {} + + +def exec_os_cmd(cmd, timeout = None): + status, output = subprocess.getstatusoutput(cmd) + return status, output + + +def exphyfwsplit(): + # improve performance + global g_exphy_cache + if g_exphy_cache: + return + cmd = "bcmcmd -t 1 \"phy control xe,ce fw_get\" |grep fw_version" + ret, output = exec_os_cmd(cmd) + if ret or len(output) == 0: + raise Exception("run cmd: {} error, status: {}, msg: {}".format(cmd, ret, output)) + exphyfwstr = output.strip() + portlist = exphyfwstr.split("\n") + for port in portlist: + phy_addr_str = get_regular_val(port, r"phy_addr\s*=\s*\w+", 0) + if phy_addr_str.startswith("ERR"): + continue + phy_addr_key = phy_addr_str.replace(" ", "") + if phy_addr_key in g_exphy_cache: + continue + + g_exphy_cache[phy_addr_key] = {} + + fw_version_str = get_regular_val(port, r"fw_version\s*=\s*\w+", 0) + if fw_version_str.startswith("ERR"): + del g_exphy_cache[phy_addr_key] + continue + + fw_version = fw_version_str.split("=")[1].strip() + g_exphy_cache[phy_addr_key]["fw_version"] = fw_version + + if "success" in port: + ret = "OK" + else: + ret = "Unexpected" + g_exphy_cache[phy_addr_key]["status"] = ret + return + + +def lshwmemorysplit(): + # improve performance + global g_meminfo_cache + if g_meminfo_cache: + return + cmd = "lshw -c memory" + ret, output = exec_os_cmd(cmd) + if ret or len(output) == 0: + raise Exception("run cmd: {} error, status: {}, msg: {}".format(cmd, ret, output)) + memstr = output.strip() + memlist = memstr.split("*-") + for item in memlist: + if item.strip().startswith("memory") and "System Memory" not in item: + continue + line_index = 0 + for line in item.splitlines(): + line_index += 1 + if line_index == 1: + memdict_key = line + g_meminfo_cache[memdict_key] = {} + else: + if ":" not in line: + continue + key = line.split(":", 1)[0].strip() + value = line.split(":", 1)[1].strip() + g_meminfo_cache[memdict_key][key] = value + if "empty" in item: + break + return + + +def run_extra_func(funcname): + # improve performance + if funcname in g_extra_cache: + return g_extra_cache.get(funcname) + func = getattr(status, funcname) + ret = [] + func(ret) + if ret: + g_extra_cache[funcname] = ret + return ret + + +def get_extra_value(funcname, itemid, key): + for item in run_extra_func(funcname): + if item.get("id") == itemid: + return item.get(key, "NA") + return "NA" + + +def io_wr(reg_addr, reg_data): + try: + regdata = 0 + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + if isinstance(reg_data, int): + regdata = reg_data + else: + regdata = int(reg_data, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + os.write(fd, regdata.to_bytes(1, 'little')) + return True + except ValueError as e: + print(e) + return False + except Exception as e: + print(e) + return False + finally: + os.close(fd) + + +def checksignaldriver(name): + modisexistcmd = "lsmod | grep -w %s | wc -l" % name + ret, output = exec_os_cmd(modisexistcmd) + if ret: + return False + if output.isdigit() and int(output) > 0: + return True + return False + + +def adddriver(name): + cmd = "modprobe %s" % name + if checksignaldriver(name) is not True: + ret, log = exec_os_cmd(cmd) + if ret != 0 or len(log) > 0: + return False + return True + return True + + +def removedriver(name): + cmd = "rmmod %s" % name + if checksignaldriver(name): + exec_os_cmd(cmd) + + +def add_5387_driver(): + errmsg = "" + spi_gpio = "wb_spi_gpio" + ret = adddriver(spi_gpio) + if ret is False: + errmsg = "modprobe wb_spi_gpio driver failed." + return False, errmsg + spi_5387_device = "wb_spi_93xx46 spi_bus_num=0" + ret = adddriver(spi_5387_device) + if ret is False: + errmsg = "modprobe wb_spi_93xx46 driver failed." + return ret, errmsg + return True, "" + + +def remove_5387_driver(): + spi_5387_device = "wb_spi_93xx46" + removedriver(spi_5387_device) + spi_gpio = "wb_spi_gpio" + removedriver(spi_gpio) + + +def deal_itmes(item_list): + for item in item_list: + dealtype = item.get("dealtype") + if dealtype == "shell": + cmd = item.get("cmd") + timeout = item.get("timeout", 10) + exec_os_cmd(cmd, timeout) + elif dealtype == "io_wr": + io_addr = item.get("io_addr") + wr_value = item.get("value") + io_wr(io_addr, wr_value) + + +def get_func_value(funcname, params): + func = getattr(ExtraFunc, funcname) + ret = func(params) + return ret + + +def read_pci_reg(pcibus, slot, fn, resource, offset): + '''read pci register''' + if offset % 4 != 0: + return "ERR offset: %d not 4 bytes align" + filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % (int(pcibus), int(slot), int(fn), int(resource)) + size = os.path.getsize(filename) + with open(filename, "r+") as file: + data = mmap.mmap(file.fileno(), size) + result = data[offset: offset + 4] + s = result[::-1] + val = 0 + for value in s: + val = val << 8 | value + data.close() + return "%08x" % val + + +def devfileread(path, offset, length, bit_width): + ret = "" + val_str = '' + val_list = [] + fd = -1 + if not os.path.exists(path): + return "%s not found !" % path + if length % bit_width != 0: + return "only support read by bit_width" + if length < bit_width: + return "len needs to greater than or equal to bit_width" + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, length) + for item in ret: + val_list.append(item) + + for i in range(0, length, bit_width): + val_str += " 0x" + for j in range(0, bit_width): + val_str += "%02x" % val_list[i + bit_width - j - 1] + except Exception as e: + return str(e) + finally: + if fd > 0: + os.close(fd) + return val_str + + +def read_reg(loc, offset, size): + with open(loc, 'rb') as file: + file.seek(offset) + return ' '.join(["%02x" % item for item in file.read(size)]) + + +def std_match(stdout, pattern): + if pattern is None: + return stdout.strip() + for line in stdout.splitlines(): + if re.match(pattern, line): + return line.strip() + raise EOFError("pattern: {} does not match anything in stdout {}".format( + pattern, stdout)) + + +def i2c_rd(bus, loc, offset): + ''' + read i2c with i2cget command + ''' + cmd = "i2cget -f -y {} {} {}".format(bus, loc, offset) + retrytime = 6 + for i in range(retrytime): + ret, stdout = subprocess.getstatusoutput(cmd) + if ret == 0: + return stdout + time.sleep(0.1) + raise RuntimeError("run cmd: {} error, status {}".format(cmd, ret)) + + +def i2c_rd_bytes(bus, loc, offset, size): + blist = [] + for i in range(size): + ret = i2c_rd(bus, loc, offset + i) + blist.append(ret) + + return blist + + +def get_pair_val(source, separator): + try: + value = source.split(separator, 1)[1] + except (ValueError, IndexError): + return "ERR separator: {} does not match in source: {}".format(separator, source) + return value.strip() + + +def get_regular_val(source, pattern, group): + try: + value = re.findall(pattern, source)[group] + except Exception: + return "ERR pattern: {} does not match in source: {} with group: {}".format(pattern, source, group) + return value.strip() + + +def find_match(file2read, pattern): + with open(file2read, 'r') as file: + for line in file: + if not re.match(pattern, line): + continue + return line.strip() + return "ERR pattern %s not match in %s" % (pattern, file2read) + + +def readaline(file2read): + with open(file2read, 'r') as file: + return file.readline() + + +def sort_key(e): + return e.arrt_index + + +class ExtraFunc(object): + @staticmethod + def get_bcm5387_version(params): + version = "" + try: + ret, msg = add_5387_driver() + if ret is False: + raise Exception(msg) + + before_deal_list = params.get("before", []) + deal_itmes(before_deal_list) + + ret, version = exec_os_cmd(params["get_version"]) + if ret != 0: + version = "ERR " + version + + after_deal_list = params.get("after", []) + deal_itmes(after_deal_list) + + except Exception as e: + version = "ERR %s" % (str(e)) + finally: + finally_deal_list = params.get("finally", []) + deal_itmes(finally_deal_list) + remove_5387_driver() + return version + + @staticmethod + def get_memory_value(params): + root_key = params.get("root_key") + sub_key = params.get("sub_key") + lshwmemorysplit() + return g_meminfo_cache.get(root_key, {}).get(sub_key, "NA") + + @staticmethod + def get_memory_bank_value(params): + lshwmemorysplit() + bank = params.get("bankid") + if g_meminfo_cache.get(bank, {}): + return True + return False + + @staticmethod + def get_exphy_fw(phyid): + exphyfwsplit() + if phyid not in g_exphy_cache: + return "ERR %s not found." % phyid + fw_version = g_exphy_cache.get(phyid).get("fw_version") + ret = g_exphy_cache.get(phyid).get("status") + msg = "%s %s" % (fw_version, ret) + return msg + +class CallbackSet: + def cpld_format(self, blist): + if isinstance(blist, str): + blist = blist.split() + elif not isinstance(blist, list) or len(blist) != 4: + raise ValueError("cpld format: wrong parameter: {}".format(blist)) + + return "{}{}{}{}".format(*blist).replace("0x", "") + + +class VersionHunter: + call = CallbackSet() + + def __init__(self, entires): + self.head = None + self.next = None + self.key = None + self.cmd = None + self.file = None + self.reg = None + self.i2c = None + self.extra = None + self.pattern = None + self.separator = None + self.parent = None + self.ignore = False + self.children = [] + self.level = 0 + self.callback = None + self.delspace = None + self.arrt_index = None + self.config = None + self.precheck = None + self.func = None + self.regular = None + self.group = 0 + self.pci = None + self.devfile = None + self.decode = None + self.timeout = 10 + self.__dict__.update(entires) + + def check_para(self): + if self.pattern is None: + return False + if self.cmd is None or self.file is None: + return False + return True + + def get_version(self): + ret = "NA" + try: + if self.cmd is not None: + ret, output = exec_os_cmd(self.cmd, self.timeout) + if ret or len(output) == 0: + raise RuntimeError("run cmd: {} error, status: {}, msg: {}".format(self.cmd, ret, output)) + ret = std_match(output, self.pattern) + elif self.file is not None: + ret = self.read_file() + elif self.reg is not None: + ret = read_reg(self.reg.get("loc"), self.reg.get("offset"), + self.reg.get("size")) + elif self.extra: + ret = get_extra_value(self.extra.get("funcname"), + self.extra.get("id"), + self.extra.get("key")) + elif self.i2c: + ret = i2c_rd_bytes(self.i2c.get("bus"), self.i2c.get("loc"), + self.i2c.get("offset"), + self.i2c.get("size")) + elif self.config: + ret = self.config + elif self.func: + ret = get_func_value(self.func.get("funcname"), + self.func.get("params")) + elif self.pci: + ret = read_pci_reg(self.pci.get("bus"), self.pci.get("slot"), + self.pci.get("fn"), self.pci.get("bar"), self.pci.get("offset")) + elif self.devfile: + ret = devfileread(self.devfile.get("loc"), self.devfile.get("offset"), + self.devfile.get("len"), self.devfile.get("bit_width")) + + except Exception as e: + # printerr(e.message) + return "ERR %s" % str(e) + return self.exe_callback(ret) + + def exe_callback(self, data): + try: + if self.callback: + method = getattr(self.call, self.callback) + return method(data) + except Exception: + return "ERR run callback method: {} error, data: {}".format(self.callback, data) + return data + + def read_file(self): + if self.pattern is not None: + return find_match(self.file, self.pattern) + return readaline(self.file) + + def hunt(self): + if self.ignore: + return + indent = self.level * INDENT * " " + + if self.precheck: + try: + ret = get_func_value(self.precheck.get("funcname"), self.precheck.get("params")) + if ret is not True: + return + except Exception as e: + err_msg = "ERR %s" % str(e) + format_str = "{}{:<{}}{}".format(indent, self.key + ':', + (30 - len(indent)), err_msg) + print(format_str) + return + # has children + if self.children: + self.children.sort(key=sort_key) + format_str = "{}{}:".format(indent, self.key) + print(format_str) + for child in self.children: + if not isinstance(child, VersionHunter): + continue + child.level = self.level + 1 + child.hunt() + else: + version = self.get_version() or "" + if not version.startswith("ERR"): + version = version.replace("\x00", "").strip() + if self.separator is not None: + version = get_pair_val(version, self.separator) + if self.delspace is not None: + version = version.replace(" ", "") + if self.regular is not None: + version = get_regular_val(version, self.regular, self.group) + if self.decode is not None: + tmp_version = self.decode.get(version) + if tmp_version is None: + version = "ERR decode %s failed" % version + else: + version = tmp_version + format_str = "{}{:<{}}{}".format(indent, self.key + ':', + (30 - len(indent)), version) + print(format_str) + + if self.next: + print("") + self.next.hunt() + + +pidfile = 0 + + +def ApplicationInstance(): + global pidfile + pidfile = open(os.path.realpath(__file__), "r") + try: + fcntl.flock(pidfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + return True + except Exception: + return False + + +def run(): + if os.geteuid() != 0: + print("Root privileges are required for this operation") + sys.exit(1) + + start_time = time.time() + while True: + ret = ApplicationInstance() + if ret is True: + break + if time.time() - start_time > 10: + printerr("manufacturer is running.") + sys.exit(1) + time.sleep(0.5) + + objmap = {} + + try: + target = {} + target.update(MANUINFO_CONF) + for objname, value in target.items(): + objmap[objname] = VersionHunter(value) + except Exception as e: + printerr(str(e)) + sys.exit(1) + + head = None + for objname, obj in objmap.items(): + if head is None and obj.head: + head = obj + if obj.parent: + objmap.get(obj.parent).children.append(obj) + if obj.next: + obj.next = objmap.get(obj.next) + + head.hunt() + + +if __name__ == "__main__": + run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py new file mode 100755 index 0000000000..75bc959755 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_process.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +import os +import subprocess +import glob +import time +import click +from platform_config import STARTMODULE, MAC_LED_RESET, AIRFLOW_RESULT_FILE +from platform_config import GLOBALINITPARAM, GLOBALINITCOMMAND, GLOBALINITPARAM_PRE, GLOBALINITCOMMAND_PRE +from platform_util import wbpciwr + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def log_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + if status: + print(output) + return status, output + + +def write_sysfs_value(reg_name, value): + mb_reg_file = "/sys/bus/i2c/devices/" + reg_name + locations = glob.glob(mb_reg_file) + if len(locations) == 0: + print("%s not found" % mb_reg_file) + return False + sysfs_loc = locations[0] + try: + with open(sysfs_loc, 'w') as fd: + fd.write(value) + except Exception: + return False + return True + + +def getPid(name): + ret = [] + for dirname in os.listdir('/proc'): + if dirname == 'curproc': + continue + try: + with open('/proc/{}/cmdline'.format(dirname), mode='r') as fd: + content = fd.read() + except Exception: + continue + if name in content: + ret.append(dirname) + return ret + + +def startAvscontrol(): + if STARTMODULE.get('avscontrol', 0) == 1: + cmd = "nohup avscontrol.py start >/dev/null 2>&1 &" + rets = getPid("avscontrol.py") + if len(rets) == 0: + os.system(cmd) + + +def startFanctrol(): + if STARTMODULE.get('fancontrol', 0) == 1: + cmd = "nohup fancontrol.py start >/dev/null 2>&1 &" + rets = getPid("fancontrol.py") + if len(rets) == 0: + os.system(cmd) + + +def starthal_fanctrl(): + if STARTMODULE.get('hal_fanctrl', 0) == 1: + cmd = "nohup hal_fanctrl.py start >/dev/null 2>&1 &" + rets = getPid("hal_fanctrl.py") + if len(rets) == 0: + os.system(cmd) + + +def starthal_ledctrl(): + if STARTMODULE.get('hal_ledctrl', 0) == 1: + cmd = "nohup hal_ledctrl.py start >/dev/null 2>&1 &" + rets = getPid("hal_ledctrl.py") + if len(rets) == 0: + os.system(cmd) + + +def startDevmonitor(): + if STARTMODULE.get('dev_monitor', 0) == 1: + cmd = "nohup dev_monitor.py start >/dev/null 2>&1 &" + rets = getPid("dev_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startSlotmonitor(): + if STARTMODULE.get('slot_monitor', 0) == 1: + cmd = "nohup slot_monitor.py start >/dev/null 2>&1 &" + rets = getPid("slot_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startIntelligentmonitor(): + if STARTMODULE.get('intelligent_monitor', 0) == 1: + cmd = "nohup intelligent_monitor.py >/dev/null 2>&1 &" + rets = getPid("intelligent_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startSignalmonitor(): + if STARTMODULE.get('signal_monitor', 0) == 1: + cmd = "nohup signal_monitor.py start >/dev/null 2>&1 &" + rets = getPid("signal_monitor.py") + if len(rets) == 0: + os.system(cmd) + + +def startSff_temp_polling(): + if STARTMODULE.get('sff_temp_polling', 0) == 1: + cmd = "nohup sfp_highest_temperatue.py >/dev/null 2>&1 &" + rets = getPid("sfp_highest_temperatue.py") + if len(rets) == 0: + os.system(cmd) + + +def startRebootCause(): + if STARTMODULE.get('reboot_cause', 0) == 1: + cmd = "nohup reboot_cause.py >/dev/null 2>&1 &" + rets = getPid("reboot_cause.py") + if len(rets) == 0: + os.system(cmd) + + +def startPMON_sys(): + if STARTMODULE.get('pmon_syslog', 0) == 1: + cmd = "nohup pmon_syslog.py >/dev/null 2>&1 &" + rets = getPid("pmon_syslog.py") + if len(rets) == 0: + os.system(cmd) + + +def startSff_polling(): + if STARTMODULE.get('sff_polling', 0) == 1: + cmd = "nohup sff_polling.py start > /dev/null 2>&1 &" + rets = getPid("sff_polling.py") + if len(rets) == 0: + os.system(cmd) + + +def generate_air_flow(): + cmd = "nohup generate_airflow.py > /dev/null 2>&1 &" + rets = getPid("generate_airflow.py") + if len(rets) == 0: + os.system(cmd) + time.sleep(1) + + +def startGenerate_air_flow(): + if STARTMODULE.get('generate_airflow', 0) == 1: + for i in range(10): + generate_air_flow() + if os.path.exists(AIRFLOW_RESULT_FILE): + click.echo("%%WB_PLATFORM_PROCESS: generate air flow success") + return + time.sleep(1) + click.echo("%%WB_PLATFORM_PROCESS: generate air flow,failed, %s not exits" % AIRFLOW_RESULT_FILE) + return + + +def start_tty_console(): + if STARTMODULE.get('tty_console', 0) == 1: + cmd = "nohup tty_console.py > /dev/null 2>&1 &" + rets = getPid("tty_console.py") + if len(rets) == 0: + os.system(cmd) + + +def stopAvscontrol(): + if STARTMODULE.get('avscontrol', 0) == 1: + rets = getPid("avscontrol.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopFanctrol(): + if STARTMODULE.get('fancontrol', 0) == 1: + rets = getPid("fancontrol.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stophal_fanctrl(): + if STARTMODULE.get('hal_fanctrl', 0) == 1: + rets = getPid("hal_fanctrl.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stophal_ledctrl(): + if STARTMODULE.get('hal_ledctrl', 0) == 1: + rets = getPid("hal_ledctrl.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopDevmonitor(): + if STARTMODULE.get('dev_monitor', 0) == 1: + rets = getPid("dev_monitor.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSlotmonitor(): + if STARTMODULE.get('slot_monitor', 0) == 1: + rets = getPid("slot_monitor.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopIntelligentmonitor(): + if STARTMODULE.get('intelligent_monitor', 0) == 1: + rets = getPid("intelligent_monitor.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSignalmonitor(): + if STARTMODULE.get('signal_monitor', 0) == 1: + rets = getPid("signal_monitor.py") # + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSff_temp_polling(): + if STARTMODULE.get('sff_temp_polling', 0) == 1: + rets = getPid("sfp_highest_temperatue.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopPMON_sys(): + if STARTMODULE.get('pmon_syslog', 0) == 1: + rets = getPid("pmon_syslog.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopRebootCause(): + if STARTMODULE.get('reboot_cause', 0) == 1: + rets = getPid("reboot_cause.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopSff_polling(): + if STARTMODULE.get('sff_polling', 0) == 1: + rets = getPid("sff_polling.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stopGenerate_air_flow(): + if STARTMODULE.get('generate_airflow', 0) == 1: + rets = getPid("generate_airflow.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def stop_tty_console(): + if STARTMODULE.get('tty_console', 0) == 1: + rets = getPid("tty_console.py") + for ret in rets: + cmd = "kill " + ret + os.system(cmd) + + +def otherinit(): + for index in GLOBALINITPARAM: + write_sysfs_value(index["loc"], index["value"]) + + for index in GLOBALINITCOMMAND: + log_os_system(index) + + +def otherinit_pre(): + for index in GLOBALINITPARAM_PRE: + write_sysfs_value(index["loc"], index["value"]) + + for index in GLOBALINITCOMMAND_PRE: + log_os_system(index) + + +def unload_apps(): + stopSff_polling() + stopPMON_sys() + stopSignalmonitor() + stopIntelligentmonitor() + stopSlotmonitor() + stopDevmonitor() + stopAvscontrol() + stophal_ledctrl() + stophal_fanctrl() + stopFanctrol() + stopSff_temp_polling() + stopRebootCause() + stop_tty_console() + stopGenerate_air_flow() + + +def MacLedSet(data): + '''write pci register''' + pcibus = MAC_LED_RESET.get("pcibus") + slot = MAC_LED_RESET.get("slot") + fn = MAC_LED_RESET.get("fn") + resource = MAC_LED_RESET.get("bar") + offset = MAC_LED_RESET.get("offset") + val = MAC_LED_RESET.get(data, None) + if val is None: + click.echo("%%WB_PLATFORM_PROCESS-INIT: MacLedSet wrong input") + return + wbpciwr(pcibus, slot, fn, resource, offset, val) + + +def load_apps(): + otherinit_pre() + startGenerate_air_flow() + start_tty_console() + startRebootCause() + startSff_temp_polling() + startFanctrol() + starthal_fanctrl() + starthal_ledctrl() + startAvscontrol() + startDevmonitor() + startSlotmonitor() + startIntelligentmonitor() + startSignalmonitor() + startPMON_sys() + startSff_polling() + otherinit() + if STARTMODULE.get("macledreset", 0) == 1: + MacLedSet("reset") + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''device operator''' + + +@main.command() +def start(): + '''load process ''' + load_apps() + + +@main.command() +def stop(): + '''stop process ''' + unload_apps() + + +@main.command() +def restart(): + '''restart process''' + unload_apps() + load_apps() + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py new file mode 100755 index 0000000000..1727242b74 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_sensors.py @@ -0,0 +1,253 @@ +#!/usr/bin/python3 + +import os +import sys +import importlib.machinery + + +def get_machine_info(): + if not os.path.isfile('/host/machine.conf'): + return None + machine_vars = {} + with open('/host/machine.conf') as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars + + +def get_platform_info(machine_info): + if machine_info is not None: + if 'onie_platform' in machine_info: + return machine_info['onie_platform'] + if 'aboot_platform' in machine_info: + return machine_info['aboot_platform'] + return None + + +PLATFORM_ROOT_PATH = '/usr/share/sonic/device' +PLATFORM_SPECIFIC_MODULE_NAME = 'monitor' +PLATFORM_SPECIFIC_CLASS_NAME = 'status' +platform_status_class = None +platform = None + + +def get_platform_name(): + global platform + platform = get_platform_info(get_machine_info()) + return platform + + +val = get_platform_name() +sys.path.append("/".join([PLATFORM_ROOT_PATH, platform])) + +# Loads platform specific sfputil module from source + + +def load_platform_monitor(): + global platform_status_class + platform_name = get_platform_info(get_machine_info()) + platform_path = "/".join([PLATFORM_ROOT_PATH, platform_name]) + try: + module_file = "/".join([platform_path, PLATFORM_SPECIFIC_MODULE_NAME + ".py"]) + module = importlib.machinery.SourceFileLoader(PLATFORM_SPECIFIC_MODULE_NAME, module_file).load_module() + except IOError: + return -1 + try: + platform_status_class = getattr(module, PLATFORM_SPECIFIC_CLASS_NAME) + except AttributeError: + return -2 + return 0 + + +def printerr(msg): + print("\033[0;31m%s\033[0m" % msg) + + +def print_console(msg): + print(msg) + + +val_t = load_platform_monitor() +if val_t != 0: + raise Exception("load monitor.py error") + + +def print_platform(): + platform_info = get_platform_name() + print_console(platform_info) + print_console("") + + +def print_cputemp_sensors(): + val_ret = get_call_value_by_function("getcputemp") + print_info_str = "" + toptile = "Onboard coretemp Sensors:" + formatstr = " {name:<20} : {temp} C (high = {max} C , crit = {crit} C )" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + print_info_str += formatstr.format(**item) + '\n' + print_console(print_info_str) + + +def print_boardtemp(): + val_ret = get_call_value_by_function("getTemp") + print_info_str = "" + toptile = "Onboard Temperature Sensors:" + errformat = " {id:<20} : {errmsg}" + formatstr = " {id:<20} : {temp1_input} C (high = {temp1_max} C, hyst = {temp1_max_hyst} C)" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def print_mactemp_sensors(): + val_ret = get_call_value_by_function("getmactemp") + print_info_str = "" + toptile = "Onboard MAC Temperature Sensors:" + errformat = " {id:<20} : {errmsg}" + formatstr = " {id:<20} : {temp_input} C" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def print_macpower_sensors(): + val_ret = get_call_value_by_function("getmacpower") + print_info_str = "" + toptile = "Onboard MAC Power Sensors:" + errformat = " {id:<20} : {errmsg}" + formatstr = " {id:<20} : {power_input} W" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def print_fan_sensor(): + val_ret = get_call_value_by_function("checkFan") + print_info_str = "" + toptile = "Onboard fan Sensors:" + errformat = " {id} : {errmsg}\n" # " {id:<20} : {errmsg}" + fan_signle_rotor_format = " {id} : \n" \ + " fan_type :{fan_type}\n" \ + " sn :{sn}\n" \ + " hw_version:{hw_version}\n" \ + " Speed :{Speed} RPM\n" \ + " status :{errmsg} \n" + fan_double_rotor_format = " {id} : \n" \ + " fan_type :{fan_type}\n" \ + " sn :{sn}\n" \ + " hw_version:{hw_version}\n" \ + " Speed :\n" \ + " speed_front :{rotor1_speed:<5} RPM\n" \ + " speed_rear :{rotor2_speed:<5} RPM\n" \ + " status :{errmsg} \n" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + if item.get('Speed', None) is None: + realformat = fan_double_rotor_format if item.get('errcode', 0) == 0 else errformat + else: + realformat = fan_signle_rotor_format if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + print_console(print_info_str) + + +def print_psu_sensor(): + val_ret = get_call_value_by_function("getPsu") + print_info_str = "" + toptile = "Onboard Power Supply Unit Sensors:" + errformat = " {id} : {errmsg}\n" # " {id:<20} : {errmsg}" + psuformat = " {id} : \n" \ + " type :{type1}\n" \ + " sn :{sn}\n" \ + " in_current :{in_current} A\n" \ + " in_voltage :{in_voltage} V\n" \ + " out_current:{out_current} A\n" \ + " out_voltage:{out_voltage} V\n" \ + " temp :{temp} C \n" \ + " fan_speed :{fan_speed} RPM\n" \ + " in_power :{in_power} W\n" \ + " out_power :{out_power} W\n" + + if len(val_ret) != 0: + print_info_str += toptile + '\r\n' + for item in val_ret: + realformat = psuformat if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + print_console(print_info_str) + + +def print_slot_sensor(): + val_ret = get_call_value_by_function("checkSlot") + print_info_str = "" + toptile = "Onboard slot Sensors:" + errformat = " {id} : {errmsg}\n" # " {id:<20} : {errmsg}" + psuformat = " {id} : \n" \ + " slot_type :{slot_type}\n" \ + " sn :{sn}\n" \ + " hw_version :{hw_version} \n" \ + " status :{errmsg}\n" + + if len(val_ret) != 0: + print_info_str += toptile + '\r\n' + for item in val_ret: + realformat = psuformat if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + print_console(print_info_str) + + +def print_boarddcdc(): + val_ret = get_call_value_by_function("getDcdc") + print_info_str = "" + toptile = "Onboard DCDC Sensors:" + errformat = " {id:<26} : {errmsg}" + formatstr = " {id:<26} : {dcdc_input:<6} {dcdc_unit:<1} (Min = {dcdc_min:<6} {dcdc_unit:<1}, Max = {dcdc_max:<6} {dcdc_unit:<1})" + + if len(val_ret) != 0: + print_info_str += toptile + '\n' + for item in val_ret: + realformat = formatstr if item.get('errcode', 0) == 0 else errformat + print_info_str += realformat.format(**item) + '\n' + print_console(print_info_str) + + +def get_call_value_by_function(function_name): + valtemp = [] + if hasattr(platform_status_class, function_name): + test2_func = getattr(platform_status_class, function_name) + test2_func(valtemp) + return valtemp + + +def getsensors(): + print_platform() + print_cputemp_sensors() + print_boardtemp() + print_mactemp_sensors() + print_macpower_sensors() + print_fan_sensor() + print_psu_sensor() + print_slot_sensor() + print_boarddcdc() + + +if __name__ == "__main__": + getsensors() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py new file mode 100755 index 0000000000..da7119a9ce --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_test.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- + +try: + import click + from platform_intf import platform_reg_read, platform_reg_write, platform_get_optoe_type + from platform_intf import platform_set_optoe_type, platform_sfp_read, platform_sfp_write +except ImportError as error: + raise ImportError('%s - required module not found' % str(error)) from error + + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def print_reg(info, offset): + try: + size = len(info) + j = offset % 16 + tmp = j + offset -= j + print_buf = "\n " + + for i in range(16): + print_buf = print_buf + "%2x " % i + print(print_buf) + + print_buf = None + for i in range(size + j): + if i % 16 == 0: + print_buf = "" + print_buf = "0x%08x " % offset + offset = offset + 16 + if tmp: + print_buf = print_buf + " " + tmp = tmp - 1 + else: + print_buf = print_buf + "%02x " % info[i - j] + if (i + 1) % 16 == 0 or i == size + j - 1: + print(print_buf) + except Exception as e: + msg = str(e) + print("i = %d, j = %d," % (i, j)) + print(msg) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''platform_test main''' + + +@main.command() +@click.argument('dev_type', required=True) +@click.argument('dev_id', required=True) +@click.argument('offset', required=True) +@click.argument('size', required=True) +def reg_rd(dev_type, dev_id, offset, size): + '''read cpld/fpga reg''' + ret, info = platform_reg_read(int(dev_type), int(dev_id), int(offset), int(size)) + print(ret) + if ret is True: + print_reg(info, int(offset)) + else: + print(info) + + +@main.command() +@click.argument('dev_type', required=True) +@click.argument('dev_id', required=True) +@click.argument('offset', required=True) +@click.argument('value', required=True) +def reg_wr(dev_type, dev_id, offset, value): + '''write cpld/fpga reg''' + value_list = [] + value_list.append(int(value)) + ret, info = platform_reg_write(int(dev_type), int(dev_id), int(offset), value_list) + print(ret) + print(info) + + +@main.command() +@click.argument('port', required=True) +def get_optoe_type(port): + '''get optoe type''' + ret, info = platform_get_optoe_type(int(port)) + print(ret) + print(info) + + +@main.command() +@click.argument('port', required=True) +@click.argument('optoe_type', required=True) +def set_optoe_type(port, optoe_type): + '''set optoe type''' + ret, info = platform_set_optoe_type(int(port), int(optoe_type)) + print(ret) + print(info) + + +@main.command() +@click.argument('port_id', required=True) +@click.argument('offset', required=True) +@click.argument('size', required=True) +def sfp_rd(port_id, offset, size): + '''read sfp''' + ret, info = platform_sfp_read(int(port_id), int(offset), int(size)) + print(ret) + if ret is True: + print_reg(info, int(offset)) + else: + print(info) + + +@main.command() +@click.argument('port_id', required=True) +@click.argument('offset', required=True) +@click.argument('value', required=True) +def sfp_wr(port_id, offset, value): + '''write sfp''' + value_list = [] + value_list.append(int(value)) + ret, info = platform_sfp_write(int(port_id), int(offset), value_list) + print(ret) + print(info) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py new file mode 100755 index 0000000000..e7e6c8b1d6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/platform_util.py @@ -0,0 +1,845 @@ +#!/usr/bin/python3 + +import sys +import os +import re +import subprocess +import shlex +import time +import mmap +import glob +import logging.handlers +import shutil +import gzip +import ast + + +CONFIG_DB_PATH = "/etc/sonic/config_db.json" +MAILBOX_DIR = "/sys/bus/i2c/devices/" + + +__all__ = [ + "strtoint", + "byteTostr", + "getplatform_name", + "wbi2cget", + "wbi2cset", + "wbpcird", + "wbpciwr", + "wbi2cgetWord", + "wbi2csetWord", + "wbi2cset_pec", + "wbi2cset_wordpec", + "wbsysset", + "dev_file_read", + "dev_file_write", + "wb_os_system", + "io_rd", + "io_wr", + "exec_os_cmd", + "exec_os_cmd_log", + "write_sysfs", + "read_sysfs", + "get_sysfs_value", + "write_sysfs_value", + "get_value", + "set_value", + "getSdkReg", + "getMacTemp", + "getMacTemp_sysfs", + "get_format_value" +] + +class CodeVisitor(ast.NodeVisitor): + + def __init__(self): + self.value = None + + def get_value(self): + return self.value + + def get_op_value(self, node): + if isinstance(node, ast.Call): # node is func call + value = self.visit_Call(node) + elif isinstance(node, ast.BinOp): # node is BinOp + value = self.visit_BinOp(node) + elif isinstance(node, ast.UnaryOp): # node is UnaryOp + value = self.visit_UnaryOp(node) + elif isinstance(node, ast.Num): # node is Num Constant + value = node.n + elif isinstance(node, ast.Str): # node is Str Constant + value = node.s + else: + raise NotImplementedError("Unsupport operand type: %s" % type(node)) + return value + + def visit_UnaryOp(self, node): + ''' + node.op: operand type, only support ast.UAdd/ast.USub + node.operand: only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.UnaryOp + ''' + + operand_value = self.get_op_value(node.operand) + if isinstance(node.op, ast.UAdd): + self.value = operand_value + elif isinstance(node.op, ast.USub): + self.value = 0 - operand_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_BinOp(self, node): + ''' + node.left: left operand, only support ast.Call/ast.Constant(ast.Num)/ast.BinOp + node.op: operand type, only support ast.Add/ast.Sub/ast.Mult/ast.Div + node.right: right operan, only support ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + left_value = self.get_op_value(node.left) + right_value = self.get_op_value(node.right) + + if isinstance(node.op, ast.Add): + self.value = left_value + right_value + elif isinstance(node.op, ast.Sub): + self.value = left_value - right_value + elif isinstance(node.op, ast.Mult): + self.value = left_value * right_value + elif isinstance(node.op, ast.Div): + self.value = left_value / right_value + else: + raise NotImplementedError("Unsupport arithmetic methods %s" % type(node.op)) + return self.value + + def visit_Call(self, node): + ''' + node.func.id: func name, only support 'float', 'int', 'str' + node.args: func args list,only support ast.Constant(ast.Num/ast.Str)/ast.BinOp/ast.Call + str/float only support one parameter, eg: float(XXX), str(xxx) + int support one or two parameters, eg: int(xxx) or int(xxx, 16) + xxx can be ast.Call/ast.Constant(ast.Num/ast.Str)/ast.BinOp + ''' + calc_tuple = ("float", "int", "str") + + if node.func.id not in calc_tuple: + raise NotImplementedError("Unsupport function call type: %s" % node.func.id) + + args_val_list = [] + for item in node.args: + ret = self.get_op_value(item) + args_val_list.append(ret) + + if node.func.id == "str": + if len(args_val_list) != 1: + raise TypeError("str() takes 1 positional argument but %s were given" % len(args_val_list)) + value = str(args_val_list[0]) + self.value = value + return value + + if node.func.id == "float": + if len(args_val_list) != 1: + raise TypeError("float() takes 1 positional argument but %s were given" % len(args_val_list)) + value = float(args_val_list[0]) + self.value = value + return value + # int + if len(args_val_list) == 1: + value = int(args_val_list[0]) + self.value = value + return value + if len(args_val_list) == 2: + value = int(args_val_list[0], args_val_list[1]) + self.value = value + return value + raise TypeError("int() takes 1 or 2 arguments (%s given)" % len(args_val_list)) + +def inttostr(vl, length): + if not isinstance(vl, int): + raise Exception(" type error") + index = 0 + ret_t = "" + while index < length: + ret = 0xff & (vl >> index * 8) + ret_t += chr(ret) + index += 1 + return ret_t + + +def strtoint(str_tmp): + value = 0 + rest_v = str_tmp.replace("0X", "").replace("0x", "") + str_len = len(rest_v) + for index, val in enumerate(rest_v): + value |= int(val, 16) << ((str_len - index - 1) * 4) + return value + + +def inttobytes(val, length): + if not isinstance(val, int): + raise Exception("type error") + data_array = bytearray() + index = 0 + while index < length: + ret = 0xff & (val >> index * 8) + data_array.append(ret) + index += 1 + return data_array + + +def byteTostr(val): + strtmp = '' + for value in val: + strtmp += chr(value) + return strtmp + + +def typeTostr(val): + strtmp = '' + if isinstance(val, bytes): + strtmp = byteTostr(val) + return strtmp + + +def getonieplatform(path): + if not os.path.isfile(path): + return "" + machine_vars = {} + with open(path) as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars.get("onie_platform") + + +def getplatform_config_db(): + if not os.path.isfile(CONFIG_DB_PATH): + return "" + val = os.popen("sonic-cfggen -j %s -v DEVICE_METADATA.localhost.platform" % CONFIG_DB_PATH).read().strip() + if len(val) <= 0: + return "" + return val + + +def getplatform_name(): + if os.path.isfile('/host/machine.conf'): + return getonieplatform('/host/machine.conf') + if os.path.isfile('/usr/share/sonic/hwsku/machine.conf'): + return getonieplatform('/usr/share/sonic/hwsku/machine.conf') + return getplatform_config_db() + + +def wbi2cget(bus, devno, address, word=None): + if word is None: + command_line = "i2cget -f -y %d 0x%02x 0x%02x " % (bus, devno, address) + else: + command_line = "i2cget -f -y %d 0x%02x 0x%02x %s" % (bus, devno, address, word) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + time.sleep(0.1) + return False, ret_t + + +def wbi2cset(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbpcird(pcibus, slot, fn, resource, offset): + '''read pci register''' + if offset % 4 != 0: + return "ERR offset: %d not 4 bytes align" + filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % (int(pcibus), int(slot), int(fn), int(resource)) + with open(filename, "r+") as file: + size = os.path.getsize(filename) + data = mmap.mmap(file.fileno(), size) + result = data[offset: offset + 4] + s = result[::-1] + val = 0 + for value in s: + val = val << 8 | value + data.close() + return "0x%08x" % val + + +def wbpciwr(pcibus, slot, fn, resource, offset, data): + '''write pci register''' + ret = inttobytes(data, 4) + filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % (int(pcibus), int(slot), int(fn), int(resource)) + with open(filename, "r+") as file: + size = os.path.getsize(filename) + data = mmap.mmap(file.fileno(), size) + data[offset: offset + 4] = ret + result = data[offset: offset + 4] + s = result[::-1] + val = 0 + for value in s: + val = val << 8 | value + data.close() + + +def wbi2cgetWord(bus, devno, address): + command_line = "i2cget -f -y %d 0x%02x 0x%02x w" % (bus, devno, address) + retrytime = 3 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbi2csetWord(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%x w" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbi2cset_pec(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x bp" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbi2cset_wordpec(bus, devno, address, byte): + command_line = "i2cset -f -y %d 0x%02x 0x%02x 0x%02x wp" % ( + bus, devno, address, byte) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def wbsysset(location, value): + command_line = "echo 0x%02x > %s" % (value, location) + retrytime = 6 + ret_t = "" + for i in range(retrytime): + ret, ret_t = wb_os_system(command_line) + if ret == 0: + return True, ret_t + return False, ret_t + + +def dev_file_read(path, offset, read_len): + val_list = [] + msg = "" + ret = "" + fd = -1 + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_RDONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.read(fd, read_len) + for item in ret: + val_list.append(item) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + return True, val_list + + +def dev_file_write(path, offset, buf_list): + msg = "" + fd = -1 + + if not isinstance(buf_list, list) or len(buf_list) == 0: + msg = "buf:%s is not list type or is NONE !" % buf_list + return False, msg + + if not os.path.exists(path): + msg = path + " not found !" + return False, msg + + try: + fd = os.open(path, os.O_WRONLY) + os.lseek(fd, offset, os.SEEK_SET) + ret = os.write(fd, bytes(buf_list)) + except Exception as e: + msg = str(e) + return False, msg + finally: + if fd > 0: + os.close(fd) + + return True, ret + + +def wb_os_system(cmd): + status, output = subprocess.getstatusoutput(cmd) + return status, output + + +def io_rd(reg_addr, read_len=1): + try: + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + val = os.read(fd, read_len) + return "".join(["%02x" % item for item in val]) + except ValueError: + return None + except Exception as e: + print(e) + return None + finally: + os.close(fd) + + +def io_wr(reg_addr, reg_data): + try: + regdata = 0 + regaddr = 0 + if isinstance(reg_addr, int): + regaddr = reg_addr + else: + regaddr = int(reg_addr, 16) + if isinstance(reg_data, int): + regdata = reg_data + else: + regdata = int(reg_data, 16) + devfile = "/dev/port" + fd = os.open(devfile, os.O_RDWR | os.O_CREAT) + os.lseek(fd, regaddr, os.SEEK_SET) + os.write(fd, regdata.to_bytes(1, 'little')) + return True + except ValueError as e: + print(e) + return False + except Exception as e: + print(e) + return False + finally: + os.close(fd) + + +def exec_os_cmd(cmd): + cmds = cmd.split('|') + procs = [] + for i, c in enumerate(cmds): + stdin = None if i == 0 else procs[i-1].stdout + p = subprocess.Popen(shlex.split(c), stdin=stdin, stdout=subprocess.PIPE, shell=False, stderr=subprocess.STDOUT) + procs.append(p) + for proc in procs: + proc.wait() + return procs[-1].returncode, typeTostr(procs[-1].communicate()[0]) + + +def exec_os_cmd_log(cmd): + proc = subprocess.Popen(shlex.split(cmd), stdin=subprocess.PIPE, shell=False, stderr=sys.stderr, close_fds=True, + stdout=sys.stdout, universal_newlines=True, bufsize=1) + proc.wait() + stdout = proc.communicate()[0] + stdout = typeTostr(stdout) + return proc.returncode, stdout + + +def write_sysfs(location, value): + try: + if not os.path.isfile(location): + return False, ("location[%s] not found !" % location) + with open(location, 'w') as fd1: + fd1.write(value) + except Exception as e: + return False, (str(e) + " location[%s]" % location) + return True, ("set location[%s] %s success !" % (location, value)) + + +def read_sysfs(location): + try: + locations = glob.glob(location) + with open(locations[0], 'rb') as fd1: + retval = fd1.read() + retval = typeTostr(retval) + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + except Exception as e: + return False, (str(e) + "location[%s]" % location) + return True, retval + + +def get_pmc_register(reg_name): + retval = 'ERR' + mb_reg_file = MAILBOX_DIR + reg_name + filepath = glob.glob(mb_reg_file) + if len(filepath) == 0: + return "%s %s notfound" % (retval, mb_reg_file) + mb_reg_file = filepath[0] + if not os.path.isfile(mb_reg_file): + return "%s %s notfound" % (retval, mb_reg_file) + try: + with open(mb_reg_file, 'r') as fd: + retval = fd.read() + except Exception as error: + retval = retval + str(error) + retval = retval.rstrip('\r\n') + retval = retval.lstrip(" ") + return retval + + +def get_sysfs_value(location): + pos_t = str(location) + name = get_pmc_register(pos_t) + return name + + +def write_sysfs_value(reg_name, value): + fileLoc = MAILBOX_DIR + reg_name + try: + if not os.path.isfile(fileLoc): + print(fileLoc, 'not found !') + return False + with open(fileLoc, 'w') as fd: + fd.write(value) + except Exception: + print("Unable to open " + fileLoc + "file !") + return False + return True + + +def get_value_once(config): + try: + way = config.get("gettype") + int_decode = config.get("int_decode", 16) + if way == 'sysfs': + loc = config.get("loc") + ret, val = read_sysfs(loc) + if ret is True: + return True, int(val, int_decode) + return False, ("sysfs read %s failed. log:%s" % (loc, val)) + if way == "i2c": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset", 0) + ret, val = wbi2cget(bus, addr, offset) + if ret is True: + return True, int(val, int_decode) + return False, ("i2c read failed. bus:%d , addr:0x%x, offset:0x%x" % (bus, addr, offset)) + if way == "io": + io_addr = config.get('io_addr') + val = io_rd(io_addr) + if len(val) != 0: + return True, int(val, int_decode) + return False, ("io_addr read 0x%x failed" % io_addr) + if way == "i2cword": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + ret, val = wbi2cgetWord(bus, addr, offset) + if ret is True: + return True, int(val, int_decode) + return False, ("i2cword read failed. bus:%d, addr:0x%x, offset:0x%x" % (bus, addr, offset)) + if way == "devfile": + path = config.get("path") + offset = config.get("offset") + read_len = config.get("read_len") + ret, val_list = dev_file_read(path, offset, read_len) + if ret is True: + return True, val_list + return False, ("devfile read failed. path:%s, offset:0x%x, read_len:%d" % (path, offset, read_len)) + if way == 'cmd': + cmd = config.get("cmd") + ret, val = exec_os_cmd(cmd) + if ret: + return False, ("cmd read exec %s failed, log: %s" % (cmd, val)) + return True, int(val, int_decode) + if way == 'file_exist': + judge_file = config.get('judge_file', None) + if os.path.exists(judge_file): + return True, True + return True, False + return False, "not support read type" + except Exception as e: + return False, ("get_value_once exception:%s happen" % str(e)) + + +def set_value_once(config): + try: + delay_time = config.get("delay", None) + if delay_time is not None: + time.sleep(delay_time) + + way = config.get("gettype") + if way == 'sysfs': + loc = config.get("loc") + value = config.get("value") + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + ret, read_value = read_sysfs(loc) + if ret is True: + read_value = int(read_value, base=16) + value = (read_value & mask) | value + else: + return False, ("sysfs read %s failed. log:%s" % (loc, read_value)) + ret, log = write_sysfs(loc, "0x%02x" % value) + if ret is not True: + return False, ("sysfs %s write 0x%x failed" % (loc, value)) + return True, ("sysfs write 0x%x success" % value) + if way == "i2c": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get("value") + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + ret, read_value = wbi2cget(bus, addr, offset) + if ret is True: + read_value = int(read_value, base=16) + value = (read_value & mask) | value + else: + return False, ("i2c read failed. bus:%d , addr:0x%x, offset:0x%x" % (bus, addr, offset)) + ret, log = wbi2cset(bus, addr, offset, value) + if ret is not True: + return False, ("i2c write bus:%d, addr:0x%x, offset:0x%x, value:0x%x failed" % + (bus, addr, offset, value)) + return True, ("i2c write bus:%d, addr:0x%x, offset:0x%x, value:0x%x success" % + (bus, addr, offset, value)) + if way == "io": + io_addr = config.get('io_addr') + value = config.get('value') + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + read_value = io_rd(io_addr) + if read_value is None: + return False, ("io_addr 0x%x read failed" % (io_addr)) + read_value = int(read_value, base=16) + value = (read_value & mask) | value + ret = io_wr(io_addr, value) + if ret is not True: + return False, ("io_addr 0x%x write 0x%x failed" % (io_addr, value)) + return True, ("io_addr 0x%x write 0x%x success" % (io_addr, value)) + if way == 'i2cword': + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get("value") + mask = config.get("mask", 0xff) + mask_tuple = (0xff, 0) + if mask not in mask_tuple: + ret, read_value = wbi2cgetWord(bus, addr, offset) + if ret is True: + read_value = int(read_value, base=16) + value = (read_value & mask) | value + else: + return False, ("i2c read word failed. bus:%d , addr:0x%x, offset:0x%x" % (bus, addr, offset)) + ret, log = wbi2csetWord(bus, addr, offset, value) + if ret is not True: + return False, ("i2cword write bus:%d, addr:0x%x, offset:0x%x, value:0x%x failed" % + (bus, addr, offset, value)) + return True, ("i2cword write bus:%d, addr:0x%x, offset:0x%x, value:0x%x success" % + (bus, addr, offset, value)) + if way == "devfile": + path = config.get("path") + offset = config.get("offset") + buf_list = config.get("value") + ret, log = dev_file_write(path, offset, buf_list) + if ret is True: + return True, ("devfile write path:%s, offset:0x%x, buf_list:%s success." % (path, offset, buf_list)) + return False, ("devfile read path:%s, offset:0x%x, buf_list:%s failed.log:%s" % + (path, offset, buf_list, log)) + if way == 'cmd': + cmd = config.get("cmd") + ret, log = exec_os_cmd(cmd) + if ret: + return False, ("cmd write exec %s failed, log: %s" % (cmd, log)) + return True, ("cmd write exec %s success" % cmd) + if way == 'bit_wr': + mask = config.get("mask") + bit_val = config.get("value") + val_config = config.get("val_config") + ret, rd_value = get_value_once(val_config) + if ret is False: + return False, ("bit_wr read failed, log: %s" % rd_value) + wr_val = (rd_value & mask) | bit_val + val_config["value"] = wr_val + ret, log = set_value_once(val_config) + if ret is False: + return False, ("bit_wr failed, log: %s" % log) + return True, ("bit_wr success, log: %s" % log) + if way == 'creat_file': + file_name = config.get("file") + ret, log = exec_os_cmd("touch %s" % file_name) + if ret: + return False, ("creat file %s failed, log: %s" % (file_name, log)) + exec_os_cmd("sync") + return True, ("creat file %s success" % file_name) + if way == 'remove_file': + file_name = config.get("file") + ret, log = exec_os_cmd("rm -rf %s" % file_name) + if ret: + return False, ("remove file %s failed, log: %s" % (file_name, log)) + exec_os_cmd("sync") + return True, ("remove file %s success" % file_name) + return False, "not support write type" + except Exception as e: + return False, ("set_value_once exception:%s happen" % str(e)) + + +def get_value(config): + retrytime = 6 + for i in range(retrytime): + ret, val = get_value_once(config) + if ret is True: + return True, val + time.sleep(0.1) + return False, val + + +def set_value(config): + retrytime = 6 + ignore_result_flag = config.get("ignore_result", 0) + for i in range(retrytime): + ret, log = set_value_once(config) + if ret is True: + return True, log + if ignore_result_flag == 1: + return True, log + time.sleep(0.1) + return False, log + + +class CompressedRotatingFileHandler(logging.handlers.RotatingFileHandler): + def doRollover(self): + """ + Do a rollover, as described in __init__(). + """ + if self.stream: + self.stream.close() + self.stream = None + if self.backupCount > 0: + for i in range(self.backupCount - 1, 0, -1): + sfn = "%s.%d.gz" % (self.baseFilename, i) + dfn = "%s.%d.gz" % (self.baseFilename, i + 1) + if os.path.exists(sfn): + if os.path.exists(dfn): + os.remove(dfn) + os.rename(sfn, dfn) + dfn = self.baseFilename + ".1.gz" + if os.path.exists(dfn): + os.remove(dfn) + # These two lines below are the only new lines. I commented out the os.rename(self.baseFilename, dfn) and + # replaced it with these two lines. + with open(self.baseFilename, 'rb') as f_in, gzip.open(dfn, 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + self.mode = 'w' + self.stream = self._open() + + +def getSdkReg(reg): + try: + cmd = "bcmcmd -t 1 'getr %s ' < /dev/null" % reg + ret, result = wb_os_system(cmd) + result_t = result.strip().replace("\r", "").replace("\n", "") + if ret != 0 or "Error:" in result_t: + return False, result + patt = r"%s.(.*):(.*)>drivshell" % reg + rt = re.findall(patt, result_t, re.S) + test = re.findall("=(.*)", rt[0][0])[0] + except Exception: + return False, 'getsdk register error' + return True, test + + +def getMacTemp(): + result = {} + wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + ret, log = wb_os_system("bcmcmd -t 1 \"show temp\" < /dev/null") + if ret: + return False, result + logs = log.splitlines() + for line in logs: + if "average" in line: + b = re.findall(r'\d+.\d+', line) + result["average"] = b[0] + elif "maximum" in line: + b = re.findall(r'\d+.\d+', line) + result["maximum"] = b[0] + return True, result + + +def getMacTemp_sysfs(mactempconf): + temp = -1000000 + try: + temp_list = [] + mac_temp_loc = mactempconf.get("loc", []) + mac_temp_flag = mactempconf.get("flag", None) + if mac_temp_flag is not None: + gettype = mac_temp_flag.get('gettype') + okbit = mac_temp_flag.get('okbit') + okval = mac_temp_flag.get('okval') + if gettype == "io": + io_addr = mac_temp_flag.get('io_addr') + val = io_rd(io_addr) + if val is None: + raise Exception("get mac_flag by io failed.") + else: + bus = mac_temp_flag.get('bus') + loc = mac_temp_flag.get('loc') + offset = mac_temp_flag.get('offset') + ind, val = wbi2cget(bus, loc, offset) + if ind is not True: + raise Exception("get mac_flag by i2c failed.") + val_t = (int(val, 16) & (1 << okbit)) >> okbit + if val_t != okval: + raise Exception("mac_flag invalid, val_t:%d." % val_t) + for loc in mac_temp_loc: + temp_s = get_sysfs_value(loc) + if isinstance(temp_s, str) and temp_s.startswith("ERR"): + raise Exception("get mac temp error. loc:%s" % loc) + temp_t = int(temp_s) + if temp_t == -1000000: + raise Exception("mac temp invalid.loc:%s" % loc) + temp_list.append(temp_t) + temp_list.sort(reverse=True) + temp = temp_list[0] + except Exception: + return False, temp + return True, temp + +def get_format_value(format_str): + ast_obj = ast.parse(format_str, mode='eval') + visitor = CodeVisitor() + visitor.visit(ast_obj) + ret = visitor.get_value() + return ret + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py new file mode 100755 index 0000000000..8bdceef8c1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/pmon_syslog.py @@ -0,0 +1,519 @@ +#!/usr/bin/python3 +# * onboard interval check +# * FAN trays +# * PSU +# * SFF +import time +import syslog +import traceback +import glob +from platform_config import PMON_SYSLOG_STATUS + +PMON_DEBUG_FILE = "/etc/.pmon_syslog_debug_flag" +debuglevel = 0 +PMONERROR = 1 +PMONDEBUG = 2 + + +def pmon_debug(s): + if PMONDEBUG & debuglevel: + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def pmon_error(s): + if PMONERROR & debuglevel: + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def dev_syslog(s): + syslog.openlog("PMON_SYSLOG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_LOCAL1 | syslog.LOG_NOTICE, s) + + +# status +STATUS_PRESENT = 'PRESENT' +STATUS_ABSENT = 'ABSENT' +STATUS_OK = 'OK' +STATUS_NOT_OK = 'NOT OK' +STATUS_FAILED = 'FAILED' + + +class checkBase(object): + def __init__(self, path, dev_name, display_name, obj_type, config): + self._peroid_syslog = None + self._peroid_failed_syslog = None # exception + self._preDevStatus = None + self._path = path + self._name = dev_name + self._display_name = display_name + self._type = obj_type + self._config = config + + def getCurstatus(self): + # get ok/not ok/absent status + status, log = self.getPresent() + if status == STATUS_PRESENT: + # check status + property_status, log = self.getStatus() + if property_status is not None: + status = property_status + return status, log + + def getPresent(self): + presentFilepath = self.getPath() + try: + # get ok/not ok/absent status + presentConfig = self._config["present"] + mask = presentConfig.get("mask", 0xff) + absent_val = presentConfig.get("ABSENT", None) + absent_val = absent_val & mask + with open(presentFilepath, "r") as fd: + retval = fd.read() + if int(retval) == absent_val: + return STATUS_ABSENT, None + return STATUS_PRESENT, None + except Exception as e: + return STATUS_FAILED, (str(e) + " location[%s]" % presentFilepath) + + def getStatus(self): + if "status" in self._config: + statusConfig = self._config["status"] + for itemConfig in statusConfig: + mask = itemConfig.get("mask", 0xff) + ok_val = itemConfig.get("okval", None) + ok_val = ok_val & mask + Filepath = itemConfig["path"] % self._name + try: + with open(Filepath, "r") as fd1: + retval = fd1.read() + if int(retval) != ok_val: + return STATUS_NOT_OK, None + except Exception as e: + return STATUS_FAILED, (str(e) + " location[%s]" % Filepath) + return STATUS_OK, None + return None, None + + def getPath(self): + return self._path + + def getName(self): + return self._name + + def getType(self): + return self._type + + def getDisplayName(self): + return self._display_name + + def getnochangedMsgFlag(self): + return self._config["nochangedmsgflag"] + + def getnochangedMsgTime(self): + return self._config["nochangedmsgtime"] + + def getnoprintFirstTimeFlag(self): + return self._config["noprintfirsttimeflag"] + + def checkStatus(self): + # syslog msg + dev_type = self.getType() + display_name = self.getDisplayName() + nochangedMsgTime = self.getnochangedMsgTime() + getnochangedMsgFlag = self.getnochangedMsgFlag() + noprintFirstTimeFlag = self.getnoprintFirstTimeFlag() + MSG_IN = '%%PMON-5-' + dev_type + '_PLUG_IN: %s is PRESENT.' + MSG_OUT = '%%PMON-5-' + dev_type + '_PLUG_OUT: %s is ABSENT.' + MSG_OK = '%%PMON-5-' + dev_type + '_OK: %s is OK.' + MSG_NOT_OK = '%%PMON-5-' + dev_type + '_FAILED: %s is NOT OK.' + MSG_ABSENT = '%%PMON-5-' + dev_type + '_ABSENT: %s is ABSENT.' + MSG_UNKNOWN = '%%PMON-5-' + dev_type + '_UNKNOWN: %s is UNKNOWN.%s' + MSG_RECOVER = '%%PMON-5-' + dev_type + '_OK: %s is OK. Recover from ' + dev_type + ' FAILED.' + + curStatus, log = self.getCurstatus() + pmon_debug("%s: current status %s" % (display_name, curStatus)) + pmon_debug("%s: pre status %s" % (display_name, self._preDevStatus)) + pmon_debug("%s: peroid_syslog %s" % (display_name, self._peroid_syslog)) + + if curStatus == STATUS_FAILED: + # get status failed + if self._peroid_failed_syslog is not None: + if getnochangedMsgFlag and time.time() - self._peroid_failed_syslog >= nochangedMsgTime: + # absent as before for some time, notice + dev_syslog(MSG_UNKNOWN % (display_name, log)) + self._peroid_failed_syslog = time.time() + else: # first time failed + dev_syslog(MSG_UNKNOWN % (display_name, log)) + self._peroid_failed_syslog = time.time() + return + self._peroid_failed_syslog = time.time() + + if self._preDevStatus is None: + # 1st time + if noprintFirstTimeFlag == 1: + self._peroid_syslog = time.time() + else: + if curStatus == STATUS_PRESENT: + # present + dev_syslog(MSG_IN % display_name) + elif curStatus == STATUS_OK: + # ok + dev_syslog(MSG_OK % display_name) + elif curStatus == STATUS_NOT_OK: + # not ok + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + else: + # absent + dev_syslog(MSG_ABSENT % display_name) + self._peroid_syslog = time.time() + else: + # from 2nd time... + if self._preDevStatus == curStatus: + # status not changed + if self._preDevStatus == STATUS_ABSENT: + if self._peroid_syslog is not None: + if getnochangedMsgFlag and time.time() - self._peroid_syslog >= nochangedMsgTime: + # absent as before for some time, notice + dev_syslog(MSG_ABSENT % display_name) + self._peroid_syslog = time.time() + elif self._preDevStatus == STATUS_NOT_OK: + if self._peroid_syslog is not None: + if getnochangedMsgFlag and time.time() - self._peroid_syslog >= nochangedMsgTime: + # not ok as before for some time, notice + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + else: + # status changed + if self._preDevStatus == STATUS_ABSENT: + if curStatus == STATUS_NOT_OK: + # absent -> not ok + dev_syslog(MSG_IN % display_name) + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + elif curStatus == STATUS_OK: + # absent -> ok + dev_syslog(MSG_IN % display_name) + dev_syslog(MSG_OK % display_name) + else: + # absent -> prsent + dev_syslog(MSG_IN % display_name) + + elif self._preDevStatus == STATUS_OK: + if curStatus == STATUS_NOT_OK: + # ok -> not ok + dev_syslog(MSG_NOT_OK % display_name) + self._peroid_syslog = time.time() + elif curStatus == STATUS_ABSENT: + # ok -> absent + dev_syslog(MSG_OUT % display_name) + self._peroid_syslog = time.time() + elif self._preDevStatus == STATUS_PRESENT: + # present -> absent + dev_syslog(MSG_OUT % display_name) + self._peroid_syslog = time.time() + else: # not ok + if curStatus == STATUS_OK: + # not ok -> ok + dev_syslog(MSG_RECOVER % display_name) + dev_syslog(MSG_OK % display_name) + else: + # not ok -> absent + dev_syslog(MSG_OUT % display_name) + self._peroid_syslog = time.time() + self._preDevStatus = curStatus + + +class checkSfp(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkSfp, self).__init__(path, dev_name, display_name, 'XCVR', config) + + def getPath(self): + super(checkSfp, self).getPath() + return self._path + + def getName(self): + super(checkSfp, self).getName() + return self._name + + def getType(self): + super(checkSfp, self).getType() + return self._type + + +class checkSlot(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkSlot, self).__init__(path, dev_name, display_name, 'SLOT', config) + + def getPath(self): + super(checkSlot, self).getPath() + return self._path + + def getName(self): + super(checkSlot, self).getName() + return self._name + + def getType(self): + super(checkSlot, self).getType() + return self._type + + +class checkPSU(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkPSU, self).__init__(path, dev_name, display_name, 'PSU', config) + + def getPath(self): + super(checkPSU, self).getPath() + return self._path + + def getName(self): + super(checkPSU, self).getName() + return self._name + + def getType(self): + super(checkPSU, self).getType() + return self._type + + +class checkFAN(checkBase): + def __init__(self, path, dev_name, display_name, config): + super(checkFAN, self).__init__(path, dev_name, display_name, 'FAN', config) + + def getPath(self): + super(checkFAN, self).getPath() + return self._path + + def getName(self): + super(checkFAN, self).getName() + return self._name + + def getType(self): + super(checkFAN, self).getType() + return self._type + + +class platformSyslog(): + def __init__(self): + self.__sfp_checklist = [] + self.__fan_checklist = [] + self.__psu_checklist = [] + self.__slot_checklist = [] + self.__temp_checklist = [] + self.temps_peroid_syslog = {} + self.normal_status = 0 + self.warning_status = 1 + self.critical_status = 2 + self.poweron_flag = 0 + + self.pmon_syslog_config = PMON_SYSLOG_STATUS.copy() + self.__pollingtime = self.pmon_syslog_config.get('polling_time', 3) + + tmpconfig = self.pmon_syslog_config.get('sffs', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("sff location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + # explame:get eth1 from /sys_switch/transceiver/eth1/present + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkSfp(dev_path, dev_name, display_name, tmpconfig) + self.__sfp_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('fans', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("fan location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkFAN(dev_path, dev_name, display_name, tmpconfig) + self.__fan_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('psus', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("psu location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkPSU(dev_path, dev_name, display_name, tmpconfig) + self.__psu_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('slots', None) + if tmpconfig is not None: + preset_item = tmpconfig.get("present", {}) + path = preset_item.get("path", []) + for location in path: + if '*' not in location: + pmon_error("slot location config error: %s" % location) + continue + dev_name_index = 0 + loc_split_list = location.split('/') + for i, item in enumerate(loc_split_list): + if '*' in item: + dev_name_index = i + break + locations = glob.glob(location) + for dev_path in locations: + dev_name_list = dev_path.split('/') + dev_name = dev_name_list[dev_name_index] + dev_name_alias = tmpconfig.get("alias", {}) + display_name = dev_name_alias.get(dev_name, dev_name) + dev = checkSlot(dev_path, dev_name, display_name, tmpconfig) + self.__slot_checklist.append(dev) + + tmpconfig = self.pmon_syslog_config.get('temps', None) + if tmpconfig is not None: + self.__temp_checklist = tmpconfig.get('temps_list', []) + self.__temps_pollingseconds = tmpconfig.get('over_temps_polling_seconds', None) + + def checkTempStaus(self, temp_item): + temp_name = temp_item.get('name', None) + input_path = temp_item.get('input_path', None) + warning_temp = temp_item.get('warning', None) + critical_temp = temp_item.get('critical', None) + input_accuracy = temp_item.get('input_accuracy', None) + if temp_name is None or input_path is None or warning_temp is None or critical_temp is None: + dev_syslog('%%PMON-5-TEMP_NOTICE: get temperature config parament failed.') + return + try: + locations = glob.glob(input_path) + with open(locations[0], "r") as fd: + input_temp = fd.read() + input_temp = float(input_temp) / float(input_accuracy) + + if 'time' not in temp_item: + temp_item['time'] = time.time() + temp_item['status'] = self.normal_status + if float(input_temp) >= float(warning_temp): + if float(input_temp) >= float(critical_temp): + if time.time() - \ + temp_item['time'] >= self.__temps_pollingseconds or temp_item['status'] != self.critical_status: + dev_syslog('%%PMON-5-TEMP_HIGH: %s temperature %sC is larger than max critical threshold %sC.' + % (temp_name, input_temp, critical_temp)) + temp_item['status'] = self.critical_status + temp_item['time'] = time.time() + else: + if time.time() - \ + temp_item['time'] >= self.__temps_pollingseconds or temp_item['status'] != self.warning_status: + dev_syslog('%%PMON-5-TEMP_HIGH: %s temperature %sC is larger than max warning threshold %sC.' + % (temp_name, input_temp, warning_temp)) + temp_item['status'] = self.warning_status + temp_item['time'] = time.time() + else: + pmon_debug( + "%s temperature %sC is in range [%s, %s]" % + (temp_name, input_temp, warning_temp, critical_temp)) + temp_item['status'] = self.normal_status + temp_item['time'] = time.time() + except Exception as e: + dev_syslog('%%PMON-5-TEMP_NOTICE: Cannot get %s temperature. Exception log: %s' % (temp_name, str(e))) + return + + def sysfs_precondition_check(self, check_module, check_project): + try: + tmpconfig = self.pmon_syslog_config.get(check_module, None) + if tmpconfig is not None: + check_list = tmpconfig.get(check_project, []) + for check_item in check_list: + location = check_item.get("path", None) + ok_val = check_item.get("ok_val", None) + mask = check_item.get("mask", 0xff) + ok_val = ok_val & mask + locations = glob.glob(location) + for power_path in locations: + with open(power_path, "r") as fd: + retval = fd.read() + if int(retval) != ok_val: + return + self.poweron_flag = 1 + except Exception as e: + dev_syslog('%%PMON-5-TEMP_NOTICE: Cannot check power status. Exception log: %s' % str(e)) + return + + def updateSysDeviceStatus(self): + if self.poweron_flag == 1: + for dev in self.__sfp_checklist: + dev.checkStatus() + else: + self.sysfs_precondition_check('sffs', 'power') + + for dev in self.__fan_checklist: + dev.checkStatus() + for dev in self.__psu_checklist: + dev.checkStatus() + for dev in self.__slot_checklist: + dev.checkStatus() + for temp_item in self.__temp_checklist: + self.checkTempStaus(temp_item) + + def getPollingtime(self): + return self.__pollingtime + + def debug_init(self): + global debuglevel + try: + with open(PMON_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + def doWork(self): + try: + self.debug_init() + self.updateSysDeviceStatus() + except Exception as e: + MSG_EXCEPTION = '%%PMON-5-NOTICE: Exception happened! info:%s' % str(e) + pmon_error(MSG_EXCEPTION % traceback.format_exc()) + + +def run(): + platform = platformSyslog() + while True: + platform.doWork() + time.sleep(platform.getPollingtime()) + + +if __name__ == '__main__': + run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py deleted file mode 100755 index 0adad9d746..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragilecommon.py +++ /dev/null @@ -1,1365 +0,0 @@ -# -*- coding: UTF-8 -*- -# ------------------------------------------------------------------------------- -# Name: Ragile python common module -# Purpose: called by other modules -# -# Author: support -# -# Created: 02/07/2018 -# Copyright: (c) rd 2018 -# ------------------------------------------------------------------------------- - -################################driver-load-adaption####################################################### -# need to export interface -################################################################################################### - -__all__ = [ - "fancontrol_loc", - "fancontrol_config_loc", - "GLOBALCONFIG", - "MONITOR_CONST", - "RAGILE_PART_NUMBER", - "RAGILE_LABEL_REVISION", - "RAGILE_ONIE_VERSION", - "RAGILE_MAC_SIZE", - "RAGILE_MANUF_NAME", - "RAGILE_MANUF_COUNTRY", - "RAGILE_VENDOR_NAME", - "RAGILE_DIAG_VERSION", - "RAGILE_SERVICE_TAG", - "DEV_LEDS", - "MEM_SLOTS", - "LOCAL_LED_CONTROL", - "FIRMWARE_TOOLS", - "STARTMODULE", - "i2ccheck_params", - "FANS_DEF", - "factest_module", - "MONITOR_TEMP_MIN", - "MONITOR_K", - "MONITOR_MAC_IN", - "MONITOR_DEFAULT_SPEED", - "MONITOR_MAX_SPEED", - "MONITOR_MIN_SPEED", - "MONITOR_MAC_ERROR_SPEED", - "MONITOR_FAN_TOTAL_NUM", - "MONITOR_MAC_UP_TEMP", - "MONITOR_MAC_LOWER_TEMP", - "MONITOR_MAC_MAX_TEMP", - "MONITOR_FALL_TEMP", - "MONITOR_MAC_WARNING_THRESHOLD", - "MONITOR_OUTTEMP_WARNING_THRESHOLD", - "MONITOR_BOARDTEMP_WARNING_THRESHOLD", - "MONITOR_CPUTEMP_WARNING_THRESHOLD", - "MONITOR_INTEMP_WARNING_THRESHOLD", - "MONITOR_MAC_CRITICAL_THRESHOLD", - "MONITOR_OUTTEMP_CRITICAL_THRESHOLD", - "MONITOR_BOARDTEMP_CRITICAL_THRESHOLD", - "MONITOR_CPUTEMP_CRITICAL_THRESHOLD", - "MONITOR_INTEMP_CRITICAL_THRESHOLD", - "MONITOR_CRITICAL_NUM", - "MONITOR_SHAKE_TIME", - "MONITOR_INTERVAL", - "MONITOR_MAC_SOURCE_SYSFS", - "MONITOR_MAC_SOURCE_PATH", - "MAC_AVS_PARAM", - "MAC_DEFAULT_PARAM", - "MONITOR_SYS_LED", - "MONITOR_SYS_FAN_LED", - "MONITOR_FANS_LED", - "MONITOR_SYS_PSU_LED", - "MONITOR_FAN_STATUS", - "MONITOR_PSU_STATUS", - "MONITOR_DEV_STATUS", - "MONITOR_DEV_STATUS_DECODE", - "DEV_MONITOR_PARAM", - "SLOT_MONITOR_PARAM", - "fanloc", - "PCA9548START", - "PCA9548BUSEND", - "RAGILE_CARDID", - "RAGILE_PRODUCTNAME", - "FAN_PROTECT", - "rg_eeprom", - "E2_LOC", - "E2_PROTECT", - "MAC_LED_RESET", - "INIT_PARAM", - "INIT_COMMAND", - "CPLDVERSIONS", - "DRIVERLISTS", - "DEVICE", - "E2TYPE", - "FRULISTS", - "fanlevel_6510", - "fanlevel_6520", - "fanlevel", - "TEMPIDCHANGE", - "FACTESTMODULE", - "item1", - "test_sys_reload_item", - "test_sys_item", - "test_temp_item", - "test_mem_item", - "test_hd_item", - "test_rtc_item", - "test_i2c_item", - "test_cpld_item", - "test_portframe_item", - "test_sysled_item", - "test_fan_item", - "test_power_item", - "test_usb_item", - "test_prbs_item", - "test_portbroadcast_item", - "test_debug_level", - "test_log_level", - "test_setmac", - "test_setrtc", - "log_level_critical", - "log_level_debug", - "log_level_error", - "log_level_info", - "log_level_notset", - "log_level_warning", - "test_e2_setmac_item", - "test_bmc_setmac_item", - "test_fan_setmac_item", - "alltest", - "looptest", - "diagtestall", - "menuList", - "TESTCASE", - "PCIe_DEV_LIST", - "PCIe_SPEED_ITEM", -] - -fancontrol_loc = "/usr/local/bin" -fancontrol_config_loc = "/usr/local/bin" - -GLOBALCONFIG = "GLOBALCONFIG" -MONITOR_CONST = "MONITOR_CONST" - -RAGILE_PART_NUMBER = "RJ000001" -RAGILE_LABEL_REVISION = "R01" -RAGILE_ONIE_VERSION = "2018.02" -RAGILE_MAC_SIZE = 3 -RAGILE_MANUF_NAME = "Ragile" -RAGILE_MANUF_COUNTRY = "CHN" -RAGILE_VENDOR_NAME = "Ragile" -RAGILE_DIAG_VERSION = "0.1.0.15" -RAGILE_SERVICE_TAG = "www.ragile.com" - -DEV_LEDS = {} -MEM_SLOTS = [] - -LOCAL_LED_CONTROL = {"CLOSE": {}, "OPEN": {}} - -FIRMWARE_TOOLS = {} -# start-up module -STARTMODULE = {"fancontrol": 1, "avscontrol": 1} - -i2ccheck_params = {"busend": "i2c-66", "retrytime": 6} - -################################################################################################### -##### fan board ID reference -################################################################################################### -FANS_DEF = { - 0x8100: "M6500-FAN-F", - 0x8101: "M6510-FAN-F", - 0x8102: "M6520-FAN-F", - 0x8103: "M6510-FAN-R", -} - -factest_module = { - "sysinfo_showfanmsg": 1, - "sysinfo_showPsumsg": 1, - "sysinfo_showrestfanmsg": 0, - "sysinfo_showrestpsumsg": 0, -} - -#################fan adjustment parameters ############################## -MONITOR_TEMP_MIN = 38 # temperature before speed-adjustment -MONITOR_K = 11 # adjustment algorithm -MONITOR_MAC_IN = 35 # temperature difference between mac and chip(backup) -MONITOR_DEFAULT_SPEED = 0x60 # default speed -MONITOR_MAX_SPEED = 0xFF # maximum speed -MONITOR_MIN_SPEED = 0x33 # minimum speed -MONITOR_MAC_ERROR_SPEED = 0xBB # MAC abnormal speed -MONITOR_FAN_TOTAL_NUM = 4 # 3+1 redundancy design, report to syslog if there is a error -MONITOR_MAC_UP_TEMP = 50 # MAC compared with inlet up -MONITOR_MAC_LOWER_TEMP = -50 # MAC compared with outlet down -MONITOR_MAC_MAX_TEMP = 100 # - -MONITOR_FALL_TEMP = 4 # adjustment reduced temperature -MONITOR_MAC_WARNING_THRESHOLD = 100 # 100 -MONITOR_OUTTEMP_WARNING_THRESHOLD = 85 -MONITOR_BOARDTEMP_WARNING_THRESHOLD = 85 -MONITOR_CPUTEMP_WARNING_THRESHOLD = 85 -MONITOR_INTEMP_WARNING_THRESHOLD = 70 # 70 - -MONITOR_MAC_CRITICAL_THRESHOLD = 105 # 105 -MONITOR_OUTTEMP_CRITICAL_THRESHOLD = 90 # 90 -MONITOR_BOARDTEMP_CRITICAL_THRESHOLD = 90 # 90 -MONITOR_CPUTEMP_CRITICAL_THRESHOLD = 100 # 100 -MONITOR_INTEMP_CRITICAL_THRESHOLD = 80 # 80 -MONITOR_CRITICAL_NUM = 3 # retry times -MONITOR_SHAKE_TIME = 20 # anti-shake times -MONITOR_INTERVAL = 60 - -# 1 get mac temperature from sysfs ,0 get mac temperature from bcmcmd -MONITOR_MAC_SOURCE_SYSFS = (0) -MONITOR_MAC_SOURCE_PATH = None # sysfs path - - -# default MAC AVS parameters -MAC_AVS_PARAM = { - 0x72: 0x0384, - 0x73: 0x037E, - 0x74: 0x0378, - 0x75: 0x0372, - 0x76: 0x036B, - 0x77: 0x0365, - 0x78: 0x035F, - 0x79: 0x0359, - 0x7A: 0x0352, - 0x7B: 0x034C, - 0x7C: 0x0346, - 0x7D: 0x0340, - 0x7E: 0x0339, - 0x7F: 0x0333, - 0x80: 0x032D, - 0x81: 0x0327, - 0x82: 0x0320, - 0x83: 0x031A, - 0x84: 0x0314, - 0x85: 0x030E, - 0x86: 0x0307, - 0x87: 0x0301, - 0x88: 0x02FB, - 0x89: 0x02F5, - 0x8A: 0x02EE, -} - -# default 6520 configuration -MAC_DEFAULT_PARAM = { - "type": 1, # type 1 represents default if out of range / 0 represents no voltage-adjustment if out of range - "default": 0x74, # should be used with type - "loopaddr": 0x00, # AVS loop address - "loop": 0x00, # AVS loop value - "open": 0x00, # diasble write-protection value - "close": 0x40, # enable write-protection value - "bus": 2, # AVSI2C bus address - "devno": 0x60, # AVS address - "addr": 0x21, # AVS voltage-adjustment address - "protectaddr": 0x10, # AVS write-protection address - "sdkreg": "DMU_PCU_OTP_CONFIG_8", # SDK register name - "sdktype": 1, # type 0 represents no shift operation / 1 represents shift operation - "macregloc": 24, # shift operation - "mask": 0xFF, # mask after shift -} - -MONITOR_SYS_LED = [ - {"bus": 2, "devno": 0x33, "addr": 0xB2, "yellow": 0x06, "red": 0x02, "green": 0x04}, - {"bus": 2, "devno": 0x32, "addr": 0x72, "yellow": 0x06, "red": 0x02, "green": 0x04}, -] - -MONITOR_SYS_FAN_LED = [ - {"bus": 2, "devno": 0x33, "addr": 0xB4, "yellow": 0x06, "red": 0x02, "green": 0x04}, -] - -MONITOR_FANS_LED = [ - {"bus": 2, "devno": 0x32, "addr": 0x23, "green": 0x09, "red": 0x0A}, - {"bus": 2, "devno": 0x32, "addr": 0x24, "green": 0x09, "red": 0x0A}, - {"bus": 2, "devno": 0x32, "addr": 0x25, "green": 0x09, "red": 0x0A}, - {"bus": 2, "devno": 0x32, "addr": 0x26, "green": 0x09, "red": 0x0A}, -] - - -MONITOR_SYS_PSU_LED = [ - {"bus": 2, "devno": 0x33, "addr": 0xB3, "yellow": 0x06, "red": 0x02, "green": 0x04}, -] - -MONITOR_FAN_STATUS = [ - {"status": "green", "minOkNum": 4, "maxOkNum": 4}, - {"status": "yellow", "minOkNum": 3, "maxOkNum": 3}, - {"status": "red", "minOkNum": 0, "maxOkNum": 2}, -] - -MONITOR_PSU_STATUS = [ - {"status": "green", "minOkNum": 2, "maxOkNum": 2}, - {"status": "yellow", "minOkNum": 1, "maxOkNum": 1}, - {"status": "red", "minOkNum": 0, "maxOkNum": 0}, -] - -MONITOR_DEV_STATUS = {} -MONITOR_DEV_STATUS_DECODE = {} -DEV_MONITOR_PARAM = {} -SLOT_MONITOR_PARAM = {} - - -fanloc = {"name": "fanset", "location": "0-0032/fan_speed_set"} -#####################MAC-Voltage-Adjustment-Parameters#################################### - - -####================================Adaption-Area================================ -#### RAGILE_COMMON common configuration head -#### “platform” specific configuration head -#### -PCA9548START = 11 -PCA9548BUSEND = 74 - -RAGILE_CARDID = 0x00004040 -RAGILE_PRODUCTNAME = "ragile_ra-b6510" - -FAN_PROTECT = {"bus": 0, "devno": 0x32, "addr": 0x19, "open": 0x00, "close": 0x0F} -rg_eeprom = "2-0057/eeprom" -E2_LOC = {"bus": 2, "devno": 0x57} -E2_PROTECT = {"bus": 2, "devno": 0x33, "addr": 0xB0, "open": 0, "close": 1} -MAC_LED_RESET = {"pcibus": 8, "slot": 0, "fn": 0, "bar": 0, "offset": 64, "reset": 0x98} - -INIT_PARAM = [ - {"loc": "1-0034/sfp_enable", "value": "01"}, - {"loc": "2-0035/sfp_enable2", "value": "ff"}, - {"loc": "2-0033/mac_led", "value": "ff"}, - {"loc": "1-0034/sfp_txdis1", "value": "00"}, - {"loc": "1-0034/sfp_txdis2", "value": "00"}, - {"loc": "1-0034/sfp_txdis3", "value": "00"}, - {"loc": "1-0036/sfp_txdis4", "value": "00"}, - {"loc": "1-0036/sfp_txdis5", "value": "00"}, - {"loc": "1-0036/sfp_txdis6", "value": "00"}, - {"loc": fanloc["location"], "value": "80"}, -] - -INIT_COMMAND = [] - -CPLDVERSIONS = [ - {"loc": "2-0033/cpld_version", "des": "MAC Board CPLDA"}, - {"loc": "2-0035/cpld_version", "des": "MAC Board CPLDB"}, - {"loc": "2-0037/cpld_version", "des": "CPU Board CPLD"}, -] - -## Driver List -## - -DRIVERLISTS = [] -DEVICE = [] -""" -DRIVERLISTS = [ - "i2c_dev", - "i2c_algo_bit", - "i2c_gpio", - "i2c_mux", - "i2c_mux_pca9641", - "i2c_mux_pca954x", # force_deselect_on_exit=1 - "eeprom", - "at24", - "ragile_platform", - "rg_cpld", - "rg_fan", - "rg_psu", - "csu550", - "rg_gpio_xeon", - #IPMIdriver - "ipmi_msghandler", - "ipmi_devintf", - "ipmi_si", -] - -DEVICE = [ - {"name":"pca9641","bus":0 ,"loc":0x10 }, - {"name":"pca9548","bus":2 ,"loc":0x70 }, - {"name":"lm75","bus": 2, "loc":0x48 }, - {"name":"lm75","bus": 2, "loc":0x49 }, - {"name":"lm75","bus": 2, "loc":0x4a }, - {"name":"24c02","bus":2 , "loc":0x57 }, - {"name":"rg_cpld","bus":2 ,"loc":0x33 }, - {"name":"rg_cpld","bus":2 ,"loc":0x35 }, - {"name":"rg_cpld","bus":2 ,"loc":0x37 }, - {"name":"pca9548","bus":1,"loc":0x70 }, - {"name":"pca9548","bus":1,"loc":0x71 }, - {"name":"pca9548","bus":1,"loc":0x72 }, - {"name":"pca9548","bus":1,"loc":0x73 }, - {"name":"pca9548","bus":1,"loc":0x74 }, - {"name":"pca9548","bus":1,"loc":0x75 }, - {"name":"pca9548","bus":1,"loc":0x76 }, - {"name":"pca9548","bus":1,"loc":0x77 }, - {"name":"rg_fan","bus":3,"loc":0x53 }, - {"name":"rg_fan","bus":4,"loc":0x53 }, - {"name":"rg_fan","bus":5,"loc":0x53 }, - #{"name":"rg_fan","bus":6,"loc":0x53 }, #specific fan - {"name":"rg_psu","bus":7 ,"loc":0x50 }, - {"name":"csu550","bus":7 ,"loc":0x58 }, - {"name":"rg_psu","bus":8 ,"loc":0x53 }, - {"name":"csu550","bus":8 ,"loc":0x5b }, -] -""" - -#####################FRU-Info-Adaption################################# -E2TYPE = { - "1": "tlveeprom", - "2": "x86cpueeprom", - "3": "bmceeprom", - "4": "cpueeprom", - "5": "maceeprom", - "6": "sloteeprom", - "7": "fanconnecteeprom", - "8": "M1HFANI-F", - "9": "M1HFANI-R", - "A": "M2HFANI-F", - "B": "M2HFANI-R", - "C": "psu", -} -FRULISTS = [] -################################Manufacturing-Test-Adaption-Area####################################################### -# need to export interface -fanlevel_6510 = { - "level": [51, 150, 255], - "low_speed": [500, 7500, 17000], - "high_speed": [11000, 22500, 28500], -} - -fanlevel_6520 = { - "level": [75, 150, 255], - "low_speed": [750, 4250, 6750], - "high_speed": [4500, 7500, 10000], -} - -fanlevel = fanlevel_6520 - -TEMPIDCHANGE = { - "lm75in": "inlet", - "lm75out": "outlet", - "lm75hot": "hot-point", - "inlet": "lm75in", - "outlet": "lm75out", - "hot-point": "lm75hot", -} - -# Manufacturing-Test module -FACTESTMODULE = {} - -##################################Manufacturing-Test-Menu -item1 = {"name": "Single Test", "deal": "test_signal", "childid": 1} -test_sys_reload_item = {"name": "reset-system", "deal": "test_sys_reload"} - -test_sys_item = {"name": "Product information test", "deal": "test_sysinfo"} -test_temp_item = {"name": "temperature test", "deal": "test_tempinfo"} -test_mem_item = {"name": "Memory test", "deal": "test_cpumemoryinfo"} -test_hd_item = {"name": "Hard disk test", "deal": "test_hard"} -test_rtc_item = {"name": "RTC test ", "deal": "test_rtc"} -test_i2c_item = {"name": "I2c test ", "deal": "test_i2c"} -test_cpld_item = {"name": "CPLD test", "deal": "test_cpld"} -test_portframe_item = { - "name": "Port transmit-receive frame test", - "deal": "test_portframe", -} -test_sysled_item = {"name": "System led test", "deal": "test_led"} -test_fan_item = {"name": "Fan status test", "deal": "test_fan"} -test_power_item = {"name": "PSU status test", "deal": "test_power"} -test_usb_item = {"name": "USB test", "deal": "test_usb"} -test_prbs_item = {"name": "PRBS test", "deal": "test_prbs"} -test_portbroadcast_item = {"name": "Port broadcast", "deal": "test_portbroadcast"} - -test_debug_level = {"name": "Change debug level", "deal": "test_setdebug"} -test_log_level = {"name": "Log output level", "deal": "test_loginfolevel"} -test_setmac = {"name": "setmac", "deal": "test_setmac"} -test_setrtc = {"name": "Set RTC", "deal": "test_set_rtc"} - -log_level_critical = {"name": "CRITICAL", "deal": "test_log_critical"} -log_level_debug = {"name": "DEBUG", "deal": "test_log_debug"} -log_level_error = {"name": "ERROR", "deal": "test_log_error"} -log_level_info = {"name": "INFO", "deal": "test_log_info"} -log_level_notset = {"name": "NOTSET", "deal": "test_log_notset"} -log_level_warning = {"name": "WARNING", "deal": "test_log_warning"} - - -test_e2_setmac_item = {"name": "E2SETMAC", "deal": "test_e2_setmac"} -test_bmc_setmac_item = {"name": "BMCSETMAC", "deal": "test_bmc_setmac"} -test_fan_setmac_item = {"name": "fan SETMAC", "deal": "test_fan_setmac"} - -alltest = [ - test_sys_item, - test_temp_item, - test_mem_item, - test_hd_item, - test_rtc_item, - test_i2c_item, - test_cpld_item, - test_portframe_item, - test_sysled_item, - test_fan_item, - test_power_item, - test_usb_item, - test_prbs_item, - test_portbroadcast_item, -] - -looptest = [ - test_sys_item, - test_temp_item, - test_mem_item, - test_hd_item, - test_rtc_item, - test_i2c_item, - test_cpld_item, - test_portframe_item, - test_fan_item, - test_power_item, - test_usb_item, - test_prbs_item, - test_portbroadcast_item, -] - -diagtestall = [] - -menuList = [ - { - "menuid": 0, - "value": [ - {"name": "Single test", "deal": "test_signal", "childid": 1}, - {"name": "All test", "deal": "test_all"}, - {"name": "Loop test", "deal": "test_loop"}, - # {"name":"Check loop-test result", "deal" :"test_loop_read"}, - # {"name":"Delete loop-test result", "deal" :"test_loop_delete"}, - # {"name":"Load configuration", "deal" :"test_config"}, - test_sys_reload_item, - {"name": "System Configuration", "deal": "test_sysconfig", "childid": 2}, - ], - }, - { - "menuid": 1, - "parentid": 0, - "value": [ - test_sys_item, - test_temp_item, - test_mem_item, - test_hd_item, - test_rtc_item, - test_i2c_item, - test_cpld_item, - test_portframe_item, - test_sysled_item, - test_fan_item, - test_power_item, - test_usb_item, - test_prbs_item, - test_portbroadcast_item, - ], - }, - { - "menuid": 2, - "parentid": 0, - "value": [test_debug_level, test_log_level, test_setmac, test_setrtc,], - }, - { - "menuid": 3, - "parentid": 2, - "value": [ - log_level_critical, - log_level_debug, - log_level_error, - log_level_info, - log_level_notset, - log_level_warning, - ], - }, - { - "menuid": 4, - "parentid": 2, - "value": [test_e2_setmac_item, test_bmc_setmac_item, test_fan_setmac_item,], - }, -] - - -TESTCASE = { - "CPLD": [ - { - "name": "CONNECT BOARD CPLD-A", - "cases": [ - {"name": "cpld32", "cmd": "grtd_test.py cpld_check 0 0x32 0xAA"}, - {"name": "cpld37", "cmd": "grtd_test.py cpld_check 2 0x37 0xAC"}, - ], - }, - { - "name": "MAC BOARD CPLD-A", - "cases": [ - {"name": "cpld33", "cmd": "grtd_test.py cpld_check 2 0x33 0xAB"}, - {"name": "cpld34", "cmd": "grtd_test.py cpld_check 1 0x34 0xAA"}, - ], - }, - { - "name": "MAC BOARD CPLD-B", - "cases": [ - {"name": "cpld36", "cmd": "grtd_test.py cpld_check 1 0x36 0xAA"}, - {"name": "cpld35", "cmd": "grtd_test.py cpld_check 2 0x35 0xAB"}, - ], - }, - ], - "TEMPERATURE": [ - { - "name": "-->temperature test", - "cases": [ - { - "name": "inlet", - "cmd": "grtd_test.py temp 2-0048/hwmon/hwmon1/temp1_input", - }, - { - "name": "outlet", - "cmd": "grtd_test.py temp 2-0049/hwmon/hwmon2/temp1_input", - }, - { - "name": "hot-point", - "cmd": "grtd_test.py temp 2-004a/hwmon/hwmon3/temp1_input", - }, - ], - } - ], - "MEMTORY": { - "cases": [ - {"name": "->memory test 1M", "cmd": "memtester 1M 1"}, - {"name": "->memory test 2M", "cmd": "memtester 2M 1"}, - {"name": "->memory test 8M", "cmd": "memtester 8M 1"}, - # {"name":"->memory test 16M","cmd":"memtester 16M 1"}, - # {"name":"->memory test 256M","cmd":"memtester 256M 1"}, - ] - }, - "SMARTCTLCMDS": { - "cases": [ - {"name": "->Check Hard Disk Info", "cmd": "smartctl -i /dev/sda"}, - {"name": "->Check Hard Disk Monitor Status", "cmd": "smartctl -H /dev/sda"}, - ] - }, - "LED": [ - { - "name": "Light Port Led test", - "cases": [ - { - "name": "-> Red Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_red,1-0034/sfp_led2_red,1-0034/sfp_led3_red,1-0034/sfp_led8_red,1-0036/sfp_led4_red,1-0036/sfp_led5_red,1-0036/sfp_led6_red,1-0036/sfp_led7_red 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - { - "name": "-> Red Led On", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_red,1-0034/sfp_led2_red,1-0034/sfp_led3_red,1-0034/sfp_led8_red,1-0036/sfp_led4_red,1-0036/sfp_led5_red,1-0036/sfp_led6_red,1-0036/sfp_led7_red 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff", - }, - { - "name": "-> Recovery Red Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_red,1-0034/sfp_led2_red,1-0034/sfp_led3_red,1-0034/sfp_led8_red,1-0036/sfp_led4_red,1-0036/sfp_led5_red,1-0036/sfp_led6_red,1-0036/sfp_led7_red 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - { - "name": "-> Yellow Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_yellow,1-0034/sfp_led2_yellow,1-0034/sfp_led3_yellow,1-0034/sfp_led8_yellow,1-0036/sfp_led4_yellow,1-0036/sfp_led5_yellow,1-0036/sfp_led6_yellow,1-0036/sfp_led7_yellow 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - { - "name": "-> Yellow Led On", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_yellow,1-0034/sfp_led2_yellow,1-0034/sfp_led3_yellow,1-0034/sfp_led8_yellow,1-0036/sfp_led4_yellow,1-0036/sfp_led5_yellow,1-0036/sfp_led6_yellow,1-0036/sfp_led7_yellow 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff", - }, - { - "name": "-> Recovery Yellow Led Off", - "cmd": "grtd_test.py led loc 1-0034/sfp_led1_yellow,1-0034/sfp_led2_yellow,1-0034/sfp_led3_yellow,1-0034/sfp_led8_yellow,1-0036/sfp_led4_yellow,1-0036/sfp_led5_yellow,1-0036/sfp_led6_yellow,1-0036/sfp_led7_yellow 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00", - }, - ], - }, - { - "name": "fan 1 Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0b", - }, - { - "name": "-> Red Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0a", - }, - { - "name": "-> Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x09", - }, - { - "name": "-> Yellow Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x08", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0e", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0d", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x0c", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan0_led 0x09", - }, - ], - }, - { - "name": "fan 2 Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0b", - }, - { - "name": "-> Red Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0a", - }, - { - "name": "-> Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x09", - }, - { - "name": "-> Yellow Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x08", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0e", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0d", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x0c", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan1_led 0x09", - }, - ], - }, - { - "name": "fan 3 Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0b", - }, - { - "name": "-> Red Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0a", - }, - { - "name": "-> Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x09", - }, - { - "name": "-> Yellow Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x08", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0e", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0d", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x0c", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 0-0032/fan2_led 0x09", - }, - ], - }, - { - "name": "Front panel CPU Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x00", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x02", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x03", - }, - { - "name": "-> Green Led 1/4sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x11", - }, - { - "name": "-> Green Led 1/2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x21", - }, - { - "name": "-> Green Led 1sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x41", - }, - { - "name": "-> Green Led 2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x81", - }, - { - "name": "-> Red Led 1/4sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x12", - }, - { - "name": "-> Red Led 1/2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x22", - }, - { - "name": "-> Red Led 1sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x42", - }, - { - "name": "-> Red Led 2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x82", - }, - { - "name": "-> Yellow Led 1/4sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x13", - }, - { - "name": "-> Yellow Led 1/2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x23", - }, - { - "name": "-> Yellow Led 1sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x43", - }, - { - "name": "-> Yellow Led 2sFlashing ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x83", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_cpu 0x01", - }, - ], - }, - { - "name": "Front panel BMC Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x00", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x02", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x03", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x04", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x05", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x06", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_bmc 0x04", - }, - ], - }, - { - "name": "Front panel location Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_lct 0xff", - }, - { - "name": "-> LedOn", - "cmd": "grtd_test.py led loc 2-0035/broad_front_lct 0xfe", - }, - { - "name": "->Recovery LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_lct 0xff", - }, - ], - }, - { - "name": "Front panel pwr Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x00", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x02", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x03", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x04", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x05", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x06", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_pwr 0x04", - }, - ], - }, - { - "name": "Front panel fan Led", - "cases": [ - { - "name": "-> LedOff", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x00", - }, - { - "name": "-> Red Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x01", - }, - { - "name": "-> Red Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x02", - }, - { - "name": "-> Green Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x03", - }, - { - "name": "-> Green Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x04", - }, - { - "name": "-> Yellow Led Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x05", - }, - { - "name": "-> Yellow Led not Flashing", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x06", - }, - { - "name": "-> Recovery Green Led ", - "cmd": "grtd_test.py led loc 2-0035/broad_front_fan 0x04", - }, - ], - }, - ], - "I2C": [ - ####type 1 represents value obtained compated with value - ####type 2 represents return True or False - { - "name": "I2C device test", - "cases": [ - { - "name": " PCA9641 test", - "cmd": "grtd_test.py dev_rd 0 10 0", - "deal_type": 2, - }, - { - "name": " cpld32 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld33 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld34 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld35 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld36 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " cpld37 test", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " inlet LM75", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " outlet LM75", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " hot-point LM75", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " EEPROM", - "cmd": "grtd_test.py dev_rd 0 32 0", - "deal_type": 2, - }, - { - "name": " Port 1", - "cmd": "grtd_test.py dev_rd 11 0050 0", - "deal_type": 2, - }, - { - "name": " Port 2", - "cmd": "grtd_test.py dev_rd 12 0050 0", - "deal_type": 2, - }, - { - "name": " Port 3", - "cmd": "grtd_test.py dev_rd 13 0050 0", - "deal_type": 2, - }, - { - "name": " Port 4", - "cmd": "grtd_test.py dev_rd 14 0050 0", - "deal_type": 2, - }, - { - "name": " Port 5", - "cmd": "grtd_test.py dev_rd 15 0050 0", - "deal_type": 2, - }, - { - "name": " Port 6", - "cmd": "grtd_test.py dev_rd 16 0050 0", - "deal_type": 2, - }, - { - "name": " Port 7", - "cmd": "grtd_test.py dev_rd 17 0050 0", - "deal_type": 2, - }, - { - "name": " Port 8", - "cmd": "grtd_test.py dev_rd 18 0050 0", - "deal_type": 2, - }, - { - "name": " Port 9", - "cmd": "grtd_test.py dev_rd 19 0050 0", - "deal_type": 2, - }, - { - "name": " Port 10", - "cmd": "grtd_test.py dev_rd 20 0050 0", - "deal_type": 2, - }, - { - "name": " Port 11", - "cmd": "grtd_test.py dev_rd 21 0050 0", - "deal_type": 2, - }, - { - "name": " Port 12", - "cmd": "grtd_test.py dev_rd 22 0050 0", - "deal_type": 2, - }, - { - "name": " Port 13", - "cmd": "grtd_test.py dev_rd 23 0050 0", - "deal_type": 2, - }, - { - "name": " Port 14", - "cmd": "grtd_test.py dev_rd 24 0050 0", - "deal_type": 2, - }, - { - "name": " Port 15", - "cmd": "grtd_test.py dev_rd 25 0050 0", - "deal_type": 2, - }, - { - "name": " Port 16", - "cmd": "grtd_test.py dev_rd 26 0050 0", - "deal_type": 2, - }, - { - "name": " Port 17", - "cmd": "grtd_test.py dev_rd 27 0050 0", - "deal_type": 2, - }, - { - "name": " Port 18", - "cmd": "grtd_test.py dev_rd 28 0050 0", - "deal_type": 2, - }, - { - "name": " Port 19", - "cmd": "grtd_test.py dev_rd 29 0050 0", - "deal_type": 2, - }, - { - "name": " Port 20", - "cmd": "grtd_test.py dev_rd 30 0050 0", - "deal_type": 2, - }, - { - "name": " Port 21", - "cmd": "grtd_test.py dev_rd 31 0050 0", - "deal_type": 2, - }, - { - "name": " Port 22", - "cmd": "grtd_test.py dev_rd 32 0050 0", - "deal_type": 2, - }, - { - "name": " Port 23", - "cmd": "grtd_test.py dev_rd 33 0050 0", - "deal_type": 2, - }, - { - "name": " Port 24", - "cmd": "grtd_test.py dev_rd 34 0050 0", - "deal_type": 2, - }, - { - "name": " Port 25", - "cmd": "grtd_test.py dev_rd 35 0050 0", - "deal_type": 2, - }, - { - "name": " Port 26", - "cmd": "grtd_test.py dev_rd 36 0050 0", - "deal_type": 2, - }, - { - "name": " Port 27", - "cmd": "grtd_test.py dev_rd 37 0050 0", - "deal_type": 2, - }, - { - "name": " Port 28", - "cmd": "grtd_test.py dev_rd 38 0050 0", - "deal_type": 2, - }, - { - "name": " Port 29", - "cmd": "grtd_test.py dev_rd 39 0050 0", - "deal_type": 2, - }, - { - "name": " Port 30", - "cmd": "grtd_test.py dev_rd 40 0050 0", - "deal_type": 2, - }, - { - "name": " Port 31", - "cmd": "grtd_test.py dev_rd 41 0050 0", - "deal_type": 2, - }, - { - "name": " Port 32", - "cmd": "grtd_test.py dev_rd 42 0050 0", - "deal_type": 2, - }, - { - "name": " Port 33", - "cmd": "grtd_test.py dev_rd 43 0050 0", - "deal_type": 2, - }, - { - "name": " Port 34", - "cmd": "grtd_test.py dev_rd 44 0050 0", - "deal_type": 2, - }, - { - "name": " Port 35", - "cmd": "grtd_test.py dev_rd 45 0050 0", - "deal_type": 2, - }, - { - "name": " Port 36", - "cmd": "grtd_test.py dev_rd 46 0050 0", - "deal_type": 2, - }, - { - "name": " Port 37", - "cmd": "grtd_test.py dev_rd 47 0050 0", - "deal_type": 2, - }, - { - "name": " Port 38", - "cmd": "grtd_test.py dev_rd 48 0050 0", - "deal_type": 2, - }, - { - "name": " Port 39", - "cmd": "grtd_test.py dev_rd 49 0050 0", - "deal_type": 2, - }, - { - "name": " Port 40", - "cmd": "grtd_test.py dev_rd 50 0050 0", - "deal_type": 2, - }, - { - "name": " Port 41", - "cmd": "grtd_test.py dev_rd 51 0050 0", - "deal_type": 2, - }, - { - "name": " Port 42", - "cmd": "grtd_test.py dev_rd 52 0050 0", - "deal_type": 2, - }, - { - "name": " Port 43", - "cmd": "grtd_test.py dev_rd 53 0050 0", - "deal_type": 2, - }, - { - "name": " Port 44", - "cmd": "grtd_test.py dev_rd 54 0050 0", - "deal_type": 2, - }, - { - "name": " Port 45", - "cmd": "grtd_test.py dev_rd 55 0050 0", - "deal_type": 2, - }, - { - "name": " Port 46", - "cmd": "grtd_test.py dev_rd 56 0050 0", - "deal_type": 2, - }, - { - "name": " Port 47", - "cmd": "grtd_test.py dev_rd 57 0050 0", - "deal_type": 2, - }, - { - "name": " Port 48", - "cmd": "grtd_test.py dev_rd 58 0050 0", - "deal_type": 2, - }, - { - "name": " Port 49", - "cmd": "grtd_test.py dev_rd 59 0050 0", - "deal_type": 2, - }, - { - "name": " Port 50", - "cmd": "grtd_test.py dev_rd 60 0050 0", - "deal_type": 2, - }, - { - "name": " Port 51", - "cmd": "grtd_test.py dev_rd 61 0050 0", - "deal_type": 2, - }, - { - "name": " Port 52", - "cmd": "grtd_test.py dev_rd 62 0050 0", - "deal_type": 2, - }, - { - "name": " Port 53", - "cmd": "grtd_test.py dev_rd 63 0050 0", - "deal_type": 2, - }, - { - "name": " Port 54", - "cmd": "grtd_test.py dev_rd 64 0050 0", - "deal_type": 2, - }, - { - "name": " Port 55", - "cmd": "grtd_test.py dev_rd 65 0050 0", - "deal_type": 2, - }, - { - "name": " Port 56", - "cmd": "grtd_test.py dev_rd 66 0050 0", - "deal_type": 2, - }, - { - "name": " Port 57", - "cmd": "grtd_test.py dev_rd 67 0050 0", - "deal_type": 2, - }, - { - "name": " Port 58", - "cmd": "grtd_test.py dev_rd 68 0050 0", - "deal_type": 2, - }, - { - "name": " Port 59", - "cmd": "grtd_test.py dev_rd 69 0050 0", - "deal_type": 2, - }, - { - "name": " Port 60", - "cmd": "grtd_test.py dev_rd 70 0050 0", - "deal_type": 2, - }, - { - "name": " Port 61", - "cmd": "grtd_test.py dev_rd 71 0050 0", - "deal_type": 2, - }, - { - "name": " Port 62", - "cmd": "grtd_test.py dev_rd 72 0050 0", - "deal_type": 2, - }, - { - "name": " Port 63", - "cmd": "grtd_test.py dev_rd 73 0050 0", - "deal_type": 2, - }, - { - "name": " Port 64", - "cmd": "grtd_test.py dev_rd 74 0050 0", - "deal_type": 2, - }, - ], - }, - ], -} - -PCIe_DEV_LIST = [] -PCIe_SPEED_ITEM = [] - -################################Manufacturing-Test-Adaption-Area####################################################### diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py deleted file mode 100755 index 4a3a321d6e..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileconfig.py +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: UTF-8 -*- -# ------------------------------------------------------------------------------- -# Name: ragileconfig.py -# Purpose: block the difference between various product/onie version for other module -# -# Author: rd -# -# Created: 02/07/2018 -# Copyright: (c) rd 2018 -# ------------------------------------------------------------------------------- -import sys -import os -from rgutil.baseutil import get_machine_info -from rgutil.baseutil import get_platform_info - -__all__ = [ - "getdeviceplatform", - "get_rjconfig_info", - "MONITOR_CONST", - "MAILBOX_DIR", - "DEVICE", - "GLOBALCONFIG", - "GLOBALINITPARAM", - "GLOBALINITCOMMAND", - "MAC_LED_RESET", - "STARTMODULE", - "fanloc", - "RAGILE_CARDID", - "RAGILE_PRODUCTNAME", - "RAGILE_PART_NUMBER", - "RAGILE_LABEL_REVISION", - "RAGILE_MAC_SIZE", - "RAGILE_MANUF_NAME", - "RAGILE_MANUF_COUNTRY", - "RAGILE_VENDOR_NAME", - "RAGILE_DIAG_VERSION", - "RAGILE_SERVICE_TAG", - "E2_PROTECT", - "E2_LOC", - "FAN_PROTECT", - "FANS_DEF", - "MONITOR_FANS_LED", - "MONITOR_SYS_FAN_LED", - "MONITOR_SYS_PSU_LED", - "MONITOR_FAN_STATUS", - "MONITOR_PSU_STATUS", - "MONITOR_DEV_STATUS", - "MONITOR_DEV_STATUS_DECODE", - "DEV_LEDS", - "MAC_AVS_PARAM", - "MAC_DEFAULT_PARAM", - "FRULISTS", - "rg_eeprom", - "i2ccheck_params", - "FANCTROLDEBUG", - "DEVMONITORDEBUG", -] - - -def getdeviceplatform(): - x = get_platform_info(get_machine_info()) - if x != None: - filepath = "/usr/share/sonic/device/" + x - return filepath - - -platform = get_platform_info(get_machine_info()) -platformpath = getdeviceplatform() -MAILBOX_DIR = "/sys/bus/i2c/devices/" -grtd_productfile = (platform + "_config").replace("-", "_") -common_productfile = "ragilecommon" -configfile_pre = "/usr/local/bin/" - -sys.path.append(platformpath) -sys.path.append(configfile_pre) - - -def get_rjconfig_info(attr_key): - rjconf_filename = platformpath + "/plugins" + "/rj.conf" - if not os.path.isfile(rjconf_filename): - return None - with open(rjconf_filename) as rjconf_file: - for line in rjconf_file: - tokens = line.split("=") - if len(tokens) < 2: - continue - if tokens[0] == attr_key: - return tokens[1].strip() - return None - - -#####BMC-Password### -OPENBMC_PASSWORD = get_rjconfig_info("OPENBMC_PASSWORD") -OPENBMC_PASSWORD = OPENBMC_PASSWORD if (OPENBMC_PASSWORD != None) else "0penBmc" - -############################################################################################ -## if there is no specific file, use common file -module_product = None -if os.path.exists(configfile_pre + grtd_productfile + ".py"): - module_product = __import__(grtd_productfile, globals(), locals(), [], 0) -elif os.path.exists(configfile_pre + common_productfile + ".py"): - module_product = __import__(common_productfile, globals(), locals(), [], 0) -else: - print("No Configuration existed, quit") - exit(-1) -############################################################################################ - -DEVICE = module_product.DEVICE - -##########Driver loading needs parameters -# get different product configuration -RAGILE_GLOBALCONFIG = { - "DRIVERLISTS": module_product.DRIVERLISTS, - "QSFP": { - "startbus": module_product.PCA9548START, - "endbus": module_product.PCA9548BUSEND, - }, - "DEVS": DEVICE, -} -GLOBALCONFIG = RAGILE_GLOBALCONFIG -GLOBALINITPARAM = module_product.INIT_PARAM -GLOBALINITCOMMAND = module_product.INIT_COMMAND - -fancontrol_loc = module_product.fancontrol_loc -fancontrol_config_loc = module_product.fancontrol_config_loc -MAC_LED_RESET = module_product.MAC_LED_RESET -###########Stat-up module parameters -STARTMODULE = module_product.STARTMODULE -FIRMWARE_TOOLS = module_product.FIRMWARE_TOOLS - - -##########Manufacturing-Test need parameters -FACTESTMODULE = module_product.FACTESTMODULE -TESTCASE = module_product.TESTCASE -menuList = module_product.menuList -alltest = module_product.alltest -diagtestall = module_product.diagtestall -looptest = module_product.looptest -fanloc = module_product.fanloc -fanlevel = module_product.fanlevel # fan adjustment level -TEMPIDCHANGE = module_product.TEMPIDCHANGE -CPLDVERSIONS = module_product.CPLDVERSIONS -RAGILE_CARDID = module_product.RAGILE_CARDID -RAGILE_PRODUCTNAME = module_product.RAGILE_PRODUCTNAME - -RAGILE_PART_NUMBER = module_product.RAGILE_PART_NUMBER -RAGILE_LABEL_REVISION = module_product.RAGILE_LABEL_REVISION -RAGILE_ONIE_VERSION = module_product.RAGILE_ONIE_VERSION -RAGILE_MAC_SIZE = module_product.RAGILE_MAC_SIZE -RAGILE_MANUF_NAME = module_product.RAGILE_MANUF_NAME -RAGILE_MANUF_COUNTRY = module_product.RAGILE_MANUF_COUNTRY -RAGILE_VENDOR_NAME = module_product.RAGILE_VENDOR_NAME -RAGILE_DIAG_VERSION = module_product.RAGILE_DIAG_VERSION -RAGILE_SERVICE_TAG = module_product.RAGILE_SERVICE_TAG - -E2_PROTECT = module_product.E2_PROTECT -E2_LOC = module_product.E2_LOC -FAN_PROTECT = module_product.FAN_PROTECT - -FANS_DEF = module_product.FANS_DEF -MONITOR_SYS_LED = module_product.MONITOR_SYS_LED -MONITOR_FANS_LED = module_product.MONITOR_FANS_LED -MONITOR_SYS_FAN_LED = module_product.MONITOR_SYS_FAN_LED -MONITOR_SYS_PSU_LED = module_product.MONITOR_SYS_PSU_LED -MONITOR_FAN_STATUS = module_product.MONITOR_FAN_STATUS -MONITOR_PSU_STATUS = module_product.MONITOR_PSU_STATUS -MONITOR_DEV_STATUS = module_product.MONITOR_DEV_STATUS -MONITOR_DEV_STATUS_DECODE = module_product.MONITOR_DEV_STATUS_DECODE -DEV_MONITOR_PARAM = module_product.DEV_MONITOR_PARAM -SLOT_MONITOR_PARAM = module_product.SLOT_MONITOR_PARAM - - -DEV_LEDS = module_product.DEV_LEDS -MEM_SLOTS = module_product.MEM_SLOTS - -MAC_AVS_PARAM = module_product.MAC_AVS_PARAM -MAC_DEFAULT_PARAM = module_product.MAC_DEFAULT_PARAM -E2TYPE = module_product.E2TYPE -FRULISTS = module_product.FRULISTS -rg_eeprom = "%d-%04x/eeprom" % (E2_LOC["bus"], E2_LOC["devno"]) -factest_module = module_product.factest_module - -LOCAL_LED_CONTROL = module_product.LOCAL_LED_CONTROL - -PCIe_DEV_LIST = module_product.PCIe_DEV_LIST -PCIe_SPEED_ITEM = module_product.PCIe_SPEED_ITEM -i2ccheck_params = module_product.i2ccheck_params - - -class MONITOR_CONST: - TEMP_MIN = module_product.MONITOR_TEMP_MIN - K = module_product.MONITOR_K - MAC_IN = module_product.MONITOR_MAC_IN - DEFAULT_SPEED = module_product.MONITOR_DEFAULT_SPEED - MAX_SPEED = module_product.MONITOR_MAX_SPEED - MIN_SPEED = module_product.MONITOR_MIN_SPEED - MAC_ERROR_SPEED = module_product.MONITOR_MAC_ERROR_SPEED - FAN_TOTAL_NUM = module_product.MONITOR_FAN_TOTAL_NUM - MAC_UP_TEMP = module_product.MONITOR_MAC_UP_TEMP - MAC_LOWER_TEMP = module_product.MONITOR_MAC_LOWER_TEMP - MAC_MAX_TEMP = module_product.MONITOR_MAC_MAX_TEMP - - MAC_WARNING_THRESHOLD = module_product.MONITOR_MAC_WARNING_THRESHOLD - OUTTEMP_WARNING_THRESHOLD = module_product.MONITOR_OUTTEMP_WARNING_THRESHOLD - BOARDTEMP_WARNING_THRESHOLD = module_product.MONITOR_BOARDTEMP_WARNING_THRESHOLD - CPUTEMP_WARNING_THRESHOLD = module_product.MONITOR_CPUTEMP_WARNING_THRESHOLD - INTEMP_WARNING_THRESHOLD = module_product.MONITOR_INTEMP_WARNING_THRESHOLD - - MAC_CRITICAL_THRESHOLD = module_product.MONITOR_MAC_CRITICAL_THRESHOLD - OUTTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_OUTTEMP_CRITICAL_THRESHOLD - BOARDTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_BOARDTEMP_CRITICAL_THRESHOLD - CPUTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_CPUTEMP_CRITICAL_THRESHOLD - INTEMP_CRITICAL_THRESHOLD = module_product.MONITOR_INTEMP_CRITICAL_THRESHOLD - CRITICAL_NUM = module_product.MONITOR_CRITICAL_NUM - SHAKE_TIME = module_product.MONITOR_SHAKE_TIME - MONITOR_INTERVAL = module_product.MONITOR_INTERVAL - MONITOR_FALL_TEMP = module_product.MONITOR_FALL_TEMP - - MONITOR_MAC_SOURCE_SYSFS = module_product.MONITOR_MAC_SOURCE_SYSFS - MONITOR_MAC_SOURCE_PATH = module_product.MONITOR_MAC_SOURCE_PATH - - -FANCTROLDEBUG = 0 # 1 means enable -DEVMONITORDEBUG = 0 # 1 means enable diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py deleted file mode 100755 index 72ff74c2da..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/script/ragileutil.py +++ /dev/null @@ -1,2099 +0,0 @@ -# -*- coding: UTF-8 -*- -# ------------------------------------------------------------------------- -# Name: ragileutil -# Purpose: common configuration and api -# -# Author: rd -# -# Created: 02/07/2018 -# Copyright: (c) rd 2018 -# ------------------------------------------------------------------------- -import sys -import os -import re -import syslog -import time -import binascii -import tty -import termios -import threading -import click -import mmap -from ragileconfig import ( - rg_eeprom, - FRULISTS, - MAC_DEFAULT_PARAM, - MAC_AVS_PARAM, - FANS_DEF, - FAN_PROTECT, - E2_LOC, - E2_PROTECT, - RAGILE_SERVICE_TAG, - RAGILE_DIAG_VERSION, - STARTMODULE, - RAGILE_CARDID, - RAGILE_PRODUCTNAME, - RAGILE_PART_NUMBER, - RAGILE_LABEL_REVISION, - RAGILE_MAC_SIZE, - RAGILE_MANUF_NAME, - RAGILE_MANUF_COUNTRY, - RAGILE_VENDOR_NAME, - MAILBOX_DIR, -) - -try: - from eepromutil.fru import ipmifru - from sonic_py_common.general import getstatusoutput_noshell, getstatusoutput_noshell_pipe - -except Exception or SystemExit: - pass - -import logging.handlers -import shutil -import gzip -import glob - -__all__ = [ - "MENUID", - "MENUPARENT", - "MENUVALUE", - "CHILDID", - "MENUITEMNAME", - "MENUITEMDEAL", - "GOBACK", - "GOQUIT", - "file_name", - "CRITICAL", - "FATAL", - "ERROR", - "WARNING", - "WARN", - "INFO", - "DEBUG", - "NOTSET", - "levelNames", - "TLV_INFO_ID_STRING", - "TLV_INFO_VERSION", - "TLV_INFO_LENGTH", - "TLV_INFO_LENGTH_VALUE", - "TLV_CODE_PRODUCT_NAME", - "TLV_CODE_PART_NUMBER", - "TLV_CODE_SERIAL_NUMBER", - "TLV_CODE_MAC_BASE", - "TLV_CODE_MANUF_DATE", - "TLV_CODE_DEVICE_VERSION", - "TLV_CODE_LABEL_REVISION", - "TLV_CODE_PLATFORM_NAME", - "TLV_CODE_ONIE_VERSION", - "TLV_CODE_MAC_SIZE", - "TLV_CODE_MANUF_NAME", - "TLV_CODE_MANUF_COUNTRY", - "TLV_CODE_VENDOR_NAME", - "TLV_CODE_DIAG_VERSION", - "TLV_CODE_SERVICE_TAG", - "TLV_CODE_VENDOR_EXT", - "TLV_CODE_CRC_32", - "_TLV_DISPLAY_VENDOR_EXT", - "TLV_CODE_RJ_CARID", - "_TLV_INFO_HDR_LEN", - "SYSLOG_IDENTIFIER", - "log_info", - "log_debug", - "log_warning", - "log_error", - "CompressedRotatingFileHandler", - "SETMACException", - "checkinput", - "checkinputproduct", - "getInputSetmac", - "fan_tlv", - "AVSUTIL", - "I2CUTIL", - "BMC", - "getSdkReg", - "getfilevalue", - "get_sysfs_value", - "write_sysfs_value", - "RJPRINTERR", - "strtoint", - "inttostr", - "str_to_hex", - "hex_to_str", - "str_to_bin", - "bin_to_str", - "get_mac_temp", - "get_mac_temp_sysfs", - "restartDockerService", - "wait_dhcp", - "wait_sdk", - "wait_docker", - "getTLV_BODY", - "_crc32", - "printvalue", - "generate_value", - "getsyseeprombyId", - "fac_init_cardidcheck", - "isValidMac", - "util_setmac", - "getInputCheck", - "getrawch", - "upper_input", - "changeTypeValue", - "astrcmp", - "generate_ext", - "rgi2cget", - "rgi2cset", - "rgpcird", - "rgpciwr", - "rgsysset", - "rgi2cget_word", - "rgi2cset_word", - "fan_setmac", - "checkfansninput", - "checkfanhwinput", - "util_show_fanse2", - "get_fane2_sysfs", - "util_show_fane2", - "getPid", - "fac_fans_setmac_tlv", - "fac_fan_setmac_fru", - "fac_fans_setmac", - "fac_fan_setmac", - "writeToEEprom", - "get_local_eth0_mac", - "getonieversion", - "createbmcMac", - "fac_board_setmac", - "ipmi_set_mac", - "getInputValue", - "bmc_setmac", - "closeProtocol", - "checkSdkMem", - "getch", - "get_raw_input", - "getsysvalue", - "get_pmc_register", - "decoder", - "decode_eeprom", - "get_sys_eeprom", - "getCardId", - "getsysmeminfo", - "getsysmeminfo_detail", - "getDmiSysByType", - "gethwsys", - "getsysbios", - "searchDirByName", - "getUsbLocation", - "getusbinfo", - "get_cpu_info", - "get_version_config_info", - "io_rd", - "io_wr", -] - -MENUID = "menuid" -MENUPARENT = "parentid" -MENUVALUE = "value" -CHILDID = "childid" -MENUITEMNAME = "name" -MENUITEMDEAL = "deal" -GOBACK = "goBack" -GOQUIT = "quit" - -file_name = "/etc/init.d/opennsl-modules-3.16.0-5-amd64" -########################################################################## -# ERROR LOG LEVEL -########################################################################## -CRITICAL = 50 -FATAL = CRITICAL -ERROR = 40 -WARNING = 30 -WARN = WARNING -INFO = 20 -DEBUG = 10 -NOTSET = 0 - -levelNames = { - CRITICAL: "CRITICAL", - ERROR: "ERROR", - WARNING: "WARNING", - INFO: "INFO", - DEBUG: "DEBUG", - NOTSET: "NOTSET", - "CRITICAL": CRITICAL, - "ERROR": ERROR, - "WARN": WARNING, - "WARNING": WARNING, - "INFO": INFO, - "DEBUG": DEBUG, - "NOTSET": NOTSET, -} - -TLV_INFO_ID_STRING = "TlvInfo\x00" -TLV_INFO_VERSION = 0x01 -TLV_INFO_LENGTH = 0x00 -TLV_INFO_LENGTH_VALUE = 0xBA - -########################################################################## -# eeprom info -########################################################################## -TLV_CODE_PRODUCT_NAME = 0x21 -TLV_CODE_PART_NUMBER = 0x22 -TLV_CODE_SERIAL_NUMBER = 0x23 -TLV_CODE_MAC_BASE = 0x24 -TLV_CODE_MANUF_DATE = 0x25 -TLV_CODE_DEVICE_VERSION = 0x26 -TLV_CODE_LABEL_REVISION = 0x27 -TLV_CODE_PLATFORM_NAME = 0x28 -TLV_CODE_ONIE_VERSION = 0x29 -TLV_CODE_MAC_SIZE = 0x2A -TLV_CODE_MANUF_NAME = 0x2B -TLV_CODE_MANUF_COUNTRY = 0x2C -TLV_CODE_VENDOR_NAME = 0x2D -TLV_CODE_DIAG_VERSION = 0x2E -TLV_CODE_SERVICE_TAG = 0x2F -TLV_CODE_VENDOR_EXT = 0xFD -TLV_CODE_CRC_32 = 0xFE -_TLV_DISPLAY_VENDOR_EXT = 1 -TLV_CODE_RJ_CARID = 0x01 -_TLV_INFO_HDR_LEN = 11 - - -SYSLOG_IDENTIFIER = "UTILTOOL" - -# ========================== Syslog wrappers ========================== - - -def log_info(msg, also_print_to_console=False): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_INFO, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - - -def log_debug(msg, also_print_to_console=False): - try: - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_DEBUG, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - except Exception as e: - pass - - -def log_warning(msg, also_print_to_console=False): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_WARNING, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - - -def log_error(msg, also_print_to_console=False): - syslog.openlog(SYSLOG_IDENTIFIER) - syslog.syslog(syslog.LOG_ERR, msg) - syslog.closelog() - - if also_print_to_console: - click.echo(msg) - - -class CompressedRotatingFileHandler(logging.handlers.RotatingFileHandler): - def doRollover(self): - """ - Do a rollover, as described in __init__(). - """ - if self.stream: - self.stream.close() - self.stream = None - if self.backupCount > 0: - for i in range(self.backupCount - 1, 0, -1): - sfn = "%s.%d.gz" % (self.baseFilename, i) - dfn = "%s.%d.gz" % (self.baseFilename, i + 1) - if os.path.exists(sfn): - if os.path.exists(dfn): - os.remove(dfn) - os.rename(sfn, dfn) - dfn = self.baseFilename + ".1.gz" - if os.path.exists(dfn): - os.remove(dfn) - # These two lines below are the only new lines. I commented out the os.rename(self.baseFilename, dfn) and - # replaced it with these two lines. - with open(self.baseFilename, "rb") as f_in, gzip.open(dfn, "wb") as f_out: - shutil.copyfileobj(f_in, f_out) - self.mode = "w" - self.stream = self._open() - - -class SETMACException(Exception): - def __init__(self, param="ERROR", errno="-1"): - err = "Setmac fail[%s]: %s" % (errno, param) - Exception.__init__(self, err) - self.param = param - self.errno = errno - - -def checkinput(b): - if b.isdigit() is False: - raise Exception("Ivalid Number") - if int(b) > 0xFF or int(b) < 0: - raise Exception("Out of area") - - -def checkinputproduct(b): - if b.isalnum() is False: - raise Exception("Invalid string") - - -def getInputSetmac(val): - bia = val.boardInfoArea - pia = val.productInfoArea - if bia is not None: - a = raw_input("[Board Card]Product Serial Number:") - if len(a) != 13: - raise Exception("Invalid Serial Number length") - checkinputproduct(a) - bia.boardSerialNumber = a - b = raw_input("[Board Card]Product Version:(from 1-255)") - checkinput(b) - b = "%0x" % int(b) - bia.boardextra1 = b.upper() - if pia is not None: - a = raw_input("[Product Area]Product Serial Number:") - if len(a) != 13: - raise Exception("Invalid Serial Number") - checkinputproduct(a) - pia.productSerialNumber = a - b = raw_input("[Product Area]Product Version:(from 1-255)") - checkinput(b) - b = "%0x" % int(b) - pia.productVersion = b.upper() - return val - - -class fan_tlv(object): - VERSION = 0x01 # E2PROM Version,start from 0x01 - FLAG = 0x7E # New E2PROM version flag is 0x7E - HW_VER = 0x01 # compose by master version and fixed version - TYPE = 0xF1 # hw type defination - TLV_LEN = 00 # data length (16bit) - _FAN_TLV_HDR_LEN = 6 - _FAN_TLV_CRC_LEN = 2 - - _FAN_TLV_TYPE_NAME = 0x02 - _FAN_TLV_TYPE_SN = 0x03 - _FAN_TLV_TYPE_HW_INFO = 0x05 - _FAN_TLV_TYPE_DEV_TYPE = 0x06 - - _fandecodetime = 0 - - @property - def dstatus(self): - return self._dstatus - - @property - def typename(self): - return self._typename - - @property - def typesn(self): - return self._typesn - - @property - def typehwinfo(self): - return self._typehwinfo - - @property - def typedevtype(self): - return self._typedevtype - - @property - def fanbus(self): - return self._fanbus - - @property - def fanloc(self): - return self._fanloc - - @property - def fandecodetime(self): - return self._fandecodetime - - def __init__(self): - self._typename = "" - self._typesn = "" - self._typehwinfo = "" - self._typedevtype = "" - self._dstatus = 0 - - def strtoarr(self, str): - s = [] - if str is not None: - for index in range(len(str)): - s.append(str[index]) - return s - - def generate_fan_value(self): - bin_buffer = [chr(0xFF)] * 256 - bin_buffer[0] = chr(self.VERSION) - bin_buffer[1] = chr(self.FLAG) - bin_buffer[2] = chr(self.HW_VER) - bin_buffer[3] = chr(self.TYPE) - - temp_t = "%08x" % self.typedevtype # handle devtype first - typedevtype_t = hex_to_str(temp_t) - total_len = ( - len(self.typename) - + len(self.typesn) - + len(self.typehwinfo) - + len(typedevtype_t) - + 8 - ) - - bin_buffer[4] = chr(total_len >> 8) - bin_buffer[5] = chr(total_len & 0x00FF) - - index_start = 6 - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_NAME) - bin_buffer[index_start + 1] = chr(len(self.typename)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(self.typename) - ] = self.strtoarr(self.typename) - index_start = index_start + 2 + len(self.typename) - - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_SN) - bin_buffer[index_start + 1] = chr(len(self.typesn)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(self.typesn) - ] = self.strtoarr(self.typesn) - index_start = index_start + 2 + len(self.typesn) - - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_HW_INFO) - bin_buffer[index_start + 1] = chr(len(self.typehwinfo)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(self.typehwinfo) - ] = self.strtoarr(self.typehwinfo) - index_start = index_start + 2 + len(self.typehwinfo) - - bin_buffer[index_start] = chr(self._FAN_TLV_TYPE_DEV_TYPE) - bin_buffer[index_start + 1] = chr(len(typedevtype_t)) - bin_buffer[ - index_start + 2 : index_start + 2 + len(typedevtype_t) - ] = self.strtoarr(typedevtype_t) - index_start = index_start + 2 + len(typedevtype_t) - - crcs = fan_tlv.fancrc("".join(bin_buffer[0:index_start])) # check 2bytes - bin_buffer[index_start] = chr(crcs >> 8) - bin_buffer[index_start + 1] = chr(crcs & 0x00FF) - return bin_buffer - - def decode(self, e2): - ret = [] - self.VERSION = ord(e2[0]) - self.FLAG = ord(e2[1]) - self.HW_VER = ord(e2[2]) - self.TYPE = ord(e2[3]) - self.TLV_LEN = (ord(e2[4]) << 8) | ord(e2[5]) - - tlv_index = self._FAN_TLV_HDR_LEN - tlv_end = self._FAN_TLV_HDR_LEN + self.TLV_LEN - - # check checksum - if len(e2) < self._FAN_TLV_HDR_LEN + self.TLV_LEN + 2: - self._dstatus = -2 - return ret - sumcrc = fan_tlv.fancrc(e2[0 : self._FAN_TLV_HDR_LEN + self.TLV_LEN]) - readcrc = ord(e2[self._FAN_TLV_HDR_LEN + self.TLV_LEN]) << 8 | ord( - e2[self._FAN_TLV_HDR_LEN + self.TLV_LEN + 1] - ) - if sumcrc != readcrc: - self._dstatus = -1 - return ret - else: - self._dstatus = 0 - while (tlv_index + 2) < len(e2) and tlv_index < tlv_end: - s = self.decoder(e2[tlv_index : tlv_index + 2 + ord(e2[tlv_index + 1])]) - tlv_index += ord(e2[tlv_index + 1]) + 2 - ret.append(s) - - return ret - - @staticmethod - def fancrc(t): - sum = 0 - for index in range(len(t)): - sum += ord(t[index]) - return sum - - def decoder(self, t): - try: - name = "" - value = "" - if ord(t[0]) == self._FAN_TLV_TYPE_NAME: - name = "Product Name" - value = str(t[2 : 2 + ord(t[1])]) - self._typename = value - elif ord(t[0]) == self._FAN_TLV_TYPE_SN: - name = "serial Number" - value = str(t[2 : 2 + ord(t[1])]) - self._typesn = value - elif ord(t[0]) == self._FAN_TLV_TYPE_HW_INFO: - name = "hardware info" - value = str(t[2 : 2 + ord(t[1])]) - self._typehwinfo = value - elif ord(t[0]) == self._FAN_TLV_TYPE_DEV_TYPE: - name = "dev type" - value = str(t[2 : 2 + ord(t[1])]) - value = str_to_hex(value) - self._typedevtype = value - value = "0x08%x" % value - except Exception as e: - print(e) - return {"name": name, "code": ord(t[0]), "value": value} - - def __str__(self): - formatstr = ( - "VERSION : 0x%02x \n" - " FLAG : 0x%02x \n" - " HW_VER : 0x%02x \n" - " TYPE : 0x%02x \n" - "typename : %s \n" - "typesn : %s \n" - "typehwinfo : %s \n" - ) - return formatstr % ( - self.VERSION, - self.FLAG, - self.HW_VER, - self.TYPE, - self.typename, - self.typesn, - self.typehwinfo, - ) - - -class AVSUTIL: - @staticmethod - def mac_avs_chip(bus, devno, loc, open, close, loop, protectaddr, level, loopaddr): - # disable protection - rgi2cset(bus, devno, protectaddr, open) - rgi2cset(bus, devno, loopaddr, loop) - rgi2cset_word(bus, devno, loc, level) - ret, value = rgi2cget_word(bus, devno, loc) - if strtoint(value) == level: - ret = 0 - # enable protection - rgi2cset(bus, devno, protectaddr, close) - if ret == 0: - return True - return False - - @staticmethod - def macPressure_adj(macavs, avs_param, mac_def_param): - # check whether it within range - max_adj = max(avs_param.keys()) - min_adj = min(avs_param.keys()) - type = mac_def_param["type"] - level = 0 - if type == 0: - if macavs not in range(min_adj, max_adj + 1): - return False - else: - level = macavs - else: - if macavs not in range(min_adj, max_adj + 1): - level = mac_def_param["default"] - else: - level = macavs - ret = AVSUTIL.mac_avs_chip( - mac_def_param["bus"], - mac_def_param["devno"], - mac_def_param["addr"], - mac_def_param["open"], - mac_def_param["close"], - mac_def_param["loop"], - mac_def_param["protectaddr"], - avs_param[level], - mac_def_param["loopaddr"], - ) - return ret - - @staticmethod - def mac_adj(): - macavs = 0 - name = MAC_DEFAULT_PARAM["sdkreg"] - ret, status = getSdkReg(name) - if ret is False: - return False - status = strtoint(status) - # shift operation - if MAC_DEFAULT_PARAM["sdktype"] != 0: - status = (status >> MAC_DEFAULT_PARAM["macregloc"]) & MAC_DEFAULT_PARAM[ - "mask" - ] - macavs = status - ret = AVSUTIL.macPressure_adj(macavs, MAC_AVS_PARAM, MAC_DEFAULT_PARAM) - return ret - - -class I2CUTIL: - @staticmethod - def getvaluefromdevice(name): - ret = [] - for item in DEVICE: - if item["name"] == name: - ret.append(item) - return ret - - @staticmethod - def openFanE2Protect(): - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["open"], - ) - - @staticmethod - def closeFanE2Protect(): - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["close"], - ) - - @staticmethod - def writeToFanE2(bus, loc, rst_arr): - index = 0 - for item in rst_arr: - rgi2cset(bus, loc, index, ord(item)) - index += 1 - - @staticmethod - def writeToE2(bus, loc, rst_arr): - index = 0 - for item in rst_arr: - rgi2cset(bus, loc, index, ord(item)) - index += 1 - - @staticmethod - def getE2File(bus, loc): - return "/sys/bus/i2c/devices/%d-00%02x/eeprom" % (bus, loc) - - -class BMC: - _instance_lock = threading.Lock() - - def __init__(self): - pass - - def __new__(cls, *args, **kwargs): - if not hasattr(Singleton, "_instance"): - with Singleton._instance_lock: - if not hasattr(Singleton, "_instance"): - Singleton._instance = object.__new__(cls) - return Singleton._instance - - -# Internal interface - - -def getSdkReg(reg): - try: - cmd = ["bcmcmd", "-t", "1", 'getr '+str(reg)] - ret, result = getstatusoutput_noshell(cmd) - result_t = result.strip().replace("\r", "").replace("\n", "") - if ret != 0 or "Error:" in result_t: - return False, result - patt = r"%s.(.*):(.*)>drivshell" % reg - rt = re.findall(patt, result_t, re.S) - test = re.findall("=(.*)", rt[0][0])[0] - except Exception as e: - return False, "getsdk register error" - return True, test - - -def getfilevalue(location): - try: - with open(location, "r") as fd: - value = fd.read() - return True, value.strip() - except Exception as e: - return False, "error" - - -def get_sysfs_value(location): - pos_t = str(location) - name = get_pmc_register(pos_t) - return name - - -def write_sysfs_value(reg_name, value): - fileLoc = MAILBOX_DIR + reg_name - try: - if not os.path.isfile(fileLoc): - print(fileLoc, "not found !") - return False - with open(fileLoc, "w") as fd: - fd.write(value) - except Exception as error: - log_error("Unable to open " + fileLoc + "file !") - return False - return True - - -def RJPRINTERR(str): - print("\033[0;31m%s\033[0m" % str) - - -def strtoint(str): # convert Hex string to int such as "4040"/"0x4040"/"0X4040" = 16448 - value = 0 - rest_v = str.replace("0X", "").replace("0x", "") - for index in range(len(rest_v)): - print(rest_v[index]) - value |= int(rest_v[index], 16) << ((len(rest_v) - index - 1) * 4) - return value - - -def inttostr(vl, len): # convert int to string such as 0x3030 = 00 - if type(vl) != int: - raise Exception(" type error") - index = 0 - ret_t = "" - while index < len: - ret = 0xFF & (vl >> index * 8) - ret_t += chr(ret) - index += 1 - return ret_t - - -def str_to_hex(rest_v): - value = 0 - for index in range(len(rest_v)): - value |= ord(rest_v[index]) << ((len(rest_v) - index - 1) * 8) - return value - - -def hex_to_str(s): - len_t = len(s) - if len_t % 2 != 0: - return 0 - ret = "" - for t in range(0, int(len_t / 2)): - ret += chr(int(s[2 * t : 2 * t + 2], 16)) - return ret - - -def str_to_bin(s): - return " ".join([bin(ord(c)).replace("0b", "") for c in s]) - - -def bin_to_str(s): - return "".join([chr(i) for i in [int(b, 2) for b in s.split(" ")]]) - - -def get_mac_temp(): - result = {} - # wait_docker() - # exec twice, get the second result - getstatusoutput_noshell(["bcmcmd", "-t", "1", "show temp"]) - ret, log = getstatusoutput_noshell(["bcmcmd", "-t", "1", "show temp"]) - if ret: - return False, result - else: - # decode obtained info - logs = log.splitlines() - for line in logs: - if "average" in line: - b = re.findall(r"\d+.\d+", line) - result["average"] = b[0] - elif "maximum" in line: - b = re.findall(r"\d+.\d+", line) - result["maximum"] = b[0] - return True, result - - -def get_mac_temp_sysfs(mactempconf): - try: - temp = -1000000 - temp_list = [] - mac_temp_loc = mactempconf.get("loc", []) - mac_temp_flag = mactempconf.get("flag", None) - if mac_temp_flag is not None: # check mac temperature vaild flag - gettype = mac_temp_flag.get("gettype") - okbit = mac_temp_flag.get("okbit") - okval = mac_temp_flag.get("okval") - if gettype == "io": - io_addr = mac_temp_flag.get("io_addr") - val = io_rd(io_addr) - if val is None: - raise Exception("get mac_flag by io failed.") - else: - bus = mac_temp_flag.get("bus") - loc = mac_temp_flag.get("loc") - offset = mac_temp_flag.get("offset") - ind, val = rgi2cget(bus, loc, offset) - if ind is not True: - raise Exception("get mac_flag by i2c failed.") - val_t = (int(val, 16) & (1 << okbit)) >> okbit - if val_t != okval: - raise Exception("mac_flag invalid, val_t:%d." % val_t) - for loc in mac_temp_loc: - temp_s = get_sysfs_value(loc) - if isinstance(temp_s, str) and temp_s.startswith("ERR"): - raise Exception("get mac temp error. loc:%s" % loc) - temp_t = int(temp_s) - if temp_t == -1000000: - raise Exception("mac temp invalid.loc:%s" % loc) - temp_list.append(temp_t) - temp_list.sort(reverse=True) - temp = temp_list[0] - except Exception as e: - return False, temp - return True, temp - - -def restartDockerService(force=False): - container_name = [ - "database", - "snmp", - "syncd", - "swss", - "dhcp_relay", - "radv", - "teamd", - "pmon", - ] - ret, status = getstatusoutput_noshell(["docker", "ps"]) - if ret == 0: - for tmpname in container_name: - if tmpname not in status: - if force == True: - getstatusoutput_noshell(["docker", "restart", tmpname]) - else: - getstatusoutput_noshell(["systemctl", "restart", tmpname]) - - -def wait_dhcp(timeout): - time_cnt = 0 - while True: - try: - ret, status = getstatusoutput_noshell(["systemctl", "status", "dhcp_relay.service"]) - if (ret == 0 and "running" in status) or "SUCCESS" in status: - break - else: - sys.stdout.write(".") - sys.stdout.flush() - time_cnt = time_cnt + 1 - if time_cnt > timeout: - raise Exception("wait_dhcp timeout") - time.sleep(1) - except Exception as e: - return False - return True - - -def wait_sdk(sdk_fpath, timeout): - time_cnt = 0 - while True: - try: - if os.path.exists(sdk_fpath): - break - else: - sys.stdout.write(".") - sys.stdout.flush() - time_cnt = time_cnt + 1 - if time_cnt > timeout: - raise Exception("wait_sdk timeout") - time.sleep(1) - except Exception as e: - return False - return True - - -def wait_docker(need_restart=False, timeout=180): - sdkcheck_params = STARTMODULE.get("sdkcheck", {}) - if sdkcheck_params.get("checktype") == "file": # pass file check - sdk_fpath = sdkcheck_params.get("sdk_fpath") - return wait_sdk(sdk_fpath, timeout) - return wait_dhcp(timeout) - - -def getTLV_BODY(type, productname): - x = [] - temp_t = "" - if type == TLV_CODE_MAC_BASE: - arr = productname.split(":") - for tt in arr: - temp_t += chr(int(tt, 16)) - elif type == TLV_CODE_DEVICE_VERSION: - temp_t = chr(productname) - elif type == TLV_CODE_MAC_SIZE: - temp_t = chr(productname >> 8) + chr(productname & 0x00FF) - else: - temp_t = productname - x.append(chr(type)) - x.append(chr(len(temp_t))) - for i in temp_t: - x.append(i) - return x - - -def _crc32(v): - return "0x%08x" % ( - binascii.crc32(v) & 0xFFFFFFFF - ) # get 8 bytes of crc32 %x return hex - - -def printvalue(b): - index = 0 - for i in range(0, len(b)): - if index % 16 == 0: - print(" ") - print("%02x " % ord(b[i])) - index += 1 - print("\n") - - -def generate_value(_t): - ret = [] - for i in TLV_INFO_ID_STRING: - ret.append(i) - ret.append(chr(TLV_INFO_VERSION)) - ret.append(chr(TLV_INFO_LENGTH)) - ret.append(chr(TLV_INFO_LENGTH_VALUE)) - - total_len = 0 - for key in _t: - x = getTLV_BODY(key, _t[key]) - ret += x - total_len += len(x) - ret[10] = chr(total_len + 6) - - ret.append(chr(0xFE)) - ret.append(chr(0x04)) - s = _crc32("".join(ret)) - for t in range(0, 4): - ret.append(chr(int(s[2 * t + 2 : 2 * t + 4], 16))) - totallen = len(ret) - if totallen < 256: - for left_t in range(0, 256 - totallen): - ret.append(chr(0x00)) - return (ret, True) - - -def getsyseeprombyId(id): - ret = get_sys_eeprom() - for item in ret: - if item["code"] == id: - return item - return None - - -def fac_init_cardidcheck(): - rest = getsyseeprombyId(TLV_CODE_RJ_CARID) # check cardId same or not - if rest is None: - print("need to program write bin file") - return False - else: - rest_v = rest["value"] - value = strtoint(rest_v) - if value == RAGILE_CARDID: - log_debug("check card ID pass") - else: - log_debug("check card ID error") - return False - return True - - -def isValidMac(mac): - if re.match(r"^\s*([0-9a-fA-F]{2,2}:){5,5}[0-9a-fA-F]{2,2}\s*$", mac): - return True - return False - - -# Internet cardsetmac - - -def util_setmac(eth, mac): - rulefile = "/etc/udev/rules.d/70-persistent-net.rules" - if isValidMac(mac) is False: - return False, "MAC invaild" - cmd1 = ["ethtool", "-e", eth] - cmd2 = ["grep", "0x0010"] - cmd3 = ["awk", '{print \"0x\"$13$12$15$14}'] - ret, log = getstatusoutput_noshell_pipe(cmd1, cmd2, cmd3) - log_debug(log) - magic = "" - if ret == 0 and len(log): - magic = log - macs = mac.upper().split(":") - - # chage ETH0 to value after setmac - ifconfigcmd = ["ifconfig", "eth0", "hw", "ether", mac] - log_debug(ifconfigcmd) - ret, status = getstatusoutput_noshell(ifconfigcmd) - if ret: - raise SETMACException("software set Internet card MAC error") - index = 0 - for item in macs: - cmd = ["ethtool", "-E", eth, "magic", magic, "offset", str(offset), "value", "0x"+str(item)] - log_debug(cmd) - index += 1 - ret, log = getstatusoutput_noshell(cmd) - if ret != 0: - raise SETMACException("set hardware Internet card MAC error") - # get value after setting - cmd_t = ["ethtool", "-e", "eth0", "offset", "0", "length", "6"] - ret, log = getstatusoutput_noshell(cmd_t) - m = re.split(":", log)[-1].strip().upper() - mac_result = m.upper().split(" ") - - for ind, s in enumerate(macs): - if s != mac_result[ind]: - RJPRINTERR("MAC comparison error") - if os.path.exists(rulefile): - os.remove(rulefile) - print("MGMT MAC[%s]" % mac) - return True - - -def getInputCheck(tips): - str = raw_input(tips) - if ( - astrcmp(str, "y") - or astrcmp(str, "ye") - or astrcmp(str, "yes") - or astrcmp(str, "") - ): - return True - else: - return False - - -def getrawch(): - fd = sys.stdin.fileno() - old_settings = termios.tcgetattr(fd) - try: - tty.setraw(sys.stdin.fileno()) - ch = sys.stdin.read(1) - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - return ch - - -def upper_input(tips): - sys.stdout.write(tips) - sys.stdout.flush() - passwd = [] - while True: - ch = getrawch().upper() - if ch == "\r" or ch == "\n": - return "".join(passwd) - elif ch == "\b" or ord(ch) == 127: - if passwd: - del passwd[-1] - sys.stdout.write("\b \b") - else: - sys.stdout.write(ch) - passwd.append(ch) - - -def changeTypeValue(_value, type1, tips, example): - if type1 == TLV_CODE_PRODUCT_NAME: - while True: - print( - "please check (1)air from forward to backward/(2)air from backward to forward:" - ) - option = raw_input() - if option == "1": - _value[type1] = example + "-F-RJ" - print( - "check Product is air from forward to backward device,Product Name:%s" - % _value[type1] - ) - break - elif option == "2": - _value[type1] = example + "-R-RJ" - print( - "check Product is air from backward to forward device,Product Name:%s" - % _value[type1] - ) - break - else: - print("input incorrect, check please") - return True - print("Please input[%s]such as(%s):" % (tips, example)) - name = upper_input("") - if type1 == TLV_CODE_MAC_BASE: - if len(name) != 12: - raise SETMACException("MAC address length incorrect, check please") - release_mac = "" - for i in range(int(len(name) / 2)): - if i == 0: - release_mac += name[i * 2 : i * 2 + 2] - else: - release_mac += ":" + name[i * 2 : i * 2 + 2] - if isValidMac(release_mac) is True: - _value[type1] = release_mac - else: - raise SETMACException("MAC address invaild, check please") - elif type1 == TLV_CODE_DEVICE_VERSION: - if name.isdigit(): - _value[type1] = int(name) - else: - raise SETMACException("Version is not number, check please") - elif type1 == TLV_CODE_MAC_SIZE: - if name.isdigit(): - _value[type1] = int(name, 16) - else: - raise SETMACException("Version is not number, check please") - elif type1 == TLV_CODE_SERIAL_NUMBER: - if name.isalnum() is False: - raise SETMACException("Serial Number invaild string, check please") - elif len(name) != 13: - raise SETMACException("Serial Number length incorrect, check please") - else: - _value[type1] = name - elif type1 == TLV_CODE_VENDOR_EXT: - _value[type1] = name - else: - _value[type1] = name - return True - - -def astrcmp(str1, str2): - return str1.lower() == str2.lower() - - -def generate_ext(cardid): - s = "%08x" % cardid - ret = "" - for t in range(0, 4): - ret += chr(int(s[2 * t : 2 * t + 2], 16)) - ret = chr(0x01) + chr(len(ret)) + ret - return ret - - -def rgi2cget(bus, devno, address): - command_line = ["i2cget", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address] - retrytime = 6 - ret_t = "" - for i in range(retrytime): - ret, ret_t = getstatusoutput_noshell(command_line) - if ret == 0: - return True, ret_t - time.sleep(0.1) - return False, ret_t - - -def rgi2cset(bus, devno, address, byte): - command_line = ["i2cset", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address, "0x%02x"%byte] - retrytime = 6 - ret_t = "" - for i in range(retrytime): - ret, ret_t = getstatusoutput_noshell(command_line) - if ret == 0: - return True, ret_t - return False, ret_t - - -def rgpcird(pcibus, slot, fn, bar, offset): - """read pci register""" - if offset % 4 != 0: - return - filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % ( - int(pcibus), - int(slot), - int(fn), - int(bar), - ) - file = open(filename, "r+") - size = os.path.getsize(filename) - data = mmap.mmap(file.fileno(), size) - result = data[offset : offset + 4] - s = result[::-1] - val = 0 - for i in range(0, len(s)): - val = val << 8 | s[i] - return "0x%08x" % val - - -def rgpciwr(pcibus, slot, fn, bar, offset, data): - """write pci register""" - ret = inttostr(data, 4) - ret = str.encode(ret) - ret = ret.strip(b'\xc2') - filename = "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%d" % ( - int(pcibus), - int(slot), - int(fn), - int(bar), - ) - file = open(filename, "r+") - size = os.path.getsize(filename) - data = mmap.mmap(file.fileno(), size) - data[offset : offset + 4] = ret - result = data[offset : offset + 4] - s = result[::-1] - val = 0 - for i in range(0, len(s)): - val = val << 8 | s[i] - data.close() - - -def rgsysset(location, value): - retrytime = 6 - for i in range(retrytime): - try: - with open(location, 'w') as f: - f.write('0x%02x\n' % value) - except (IOError, FileNotFoundError) as e: - return False, str(e) - return True, '' - - -def rgi2cget_word(bus, devno, address): - command_line = ["i2cget", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address, 'w'] - retrytime = 3 - ret_t = "" - for i in range(retrytime): - ret, ret_t = getstatusoutput_noshell(command_line) - if ret == 0: - return True, ret_t - return False, ret_t - - -def rgi2cset_word(bus, devno, address, byte): - command_line = ["i2cset", "-f", "-y", str(bus), "0x%02x"%devno, "0x%02x"%address, "0x%02x"%byte, 'w'] - getstatusoutput_noshell(command_line) - - -def fan_setmac(): - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["open"], - ) - rgi2cset( - FAN_PROTECT["bus"], - FAN_PROTECT["devno"], - FAN_PROTECT["addr"], - FAN_PROTECT["close"], - ) - - -def checkfansninput(fan_sn, fansntemp): - if fan_sn in fansntemp: - RJPRINTERR("exist same Serial Number,please input again") - return False - if len(fan_sn) != 13: - RJPRINTERR("Serial Number length incorrect,please input again") - return False - return True - - -# check hw version -def checkfanhwinput(hw): - if len(hw) != 4: - RJPRINTERR("hardware version length incorrect, please input again") - return False - if hw.find(".") != 1: - RJPRINTERR("hardware version incorrect, please input again") - return False - return True - - -def util_show_fanse2(fans): - formatstr = "%-8s %-20s %-20s %-20s %-20s" - print(formatstr % ("id", "Name", "hardware version", "Serial Number", "Time")) - print( - formatstr - % ("------", "---------------", "---------------", "---------------", "----") - ) - for fan in fans: - # print fan.dstatus - if fan.dstatus < 0: - print("%-8s" % ("FAN%d" % (fans.index(fan) + 1))) - RJPRINTERR(" decode e2 error") - else: - print( - formatstr - % ( - "FAN%d" % (fans.index(fan) + 1), - fan.typename.replace(chr(0x00), ""), - fan.typehwinfo.replace(chr(0x00), ""), - fan.typesn.replace(chr(0x00), ""), - fan.fandecodetime, - ) - ) - - -def get_fane2_sysfs(bus, loc): - rg_fan_e2 = "%d-%04x/fan" % (bus, loc) - eeprom = get_sysfs_value(rg_fan_e2) - return eeprom - - -def util_show_fane2(): - ret = sorted(I2CUTIL.getvaluefromdevice("rg_fan")) - if len(ret) <= 0: - return None - fans = [] - for index in range(len(ret)): - t1 = int(round(time.time() * 1000)) - eeprom = get_fane2_sysfs(ret[index]["bus"], ret[index]["loc"]) - t2 = int(round(time.time() * 1000)) - fane2 = fan_tlv() - fane2.fandecodetime = t2 - t1 - fane2.decode(eeprom) - fans.append(fane2) - util_show_fanse2(fans) - - -def getPid(name): - ret = [] - for dirname in os.listdir("/proc"): - if dirname == "curproc": - continue - try: - with open("/proc/{}/cmdline".format(dirname), mode="rb") as fd: - content = fd.read() - except Exception: - continue - if name in content: - ret.append(dirname) - return ret - - -def fac_fans_setmac_tlv(ret): - if len(ret) <= 0: - return None - fans = [] - fansntemp = [] - for index in range(len(ret)): - item = ret[index] - log_debug(item) - eeprom = get_fane2_sysfs(item["bus"], item["loc"]) - fane2 = fan_tlv() - fane2.decode(eeprom) - fane2.fanbus = item["bus"] - fane2.fanloc = item["loc"] - log_debug("decode eeprom success") - - print("Fan[%d]-[%s]setmac" % ((index + 1), FANS_DEF[fane2.typedevtype])) - while True: - print("Please input[%s]:" % "Serial Number") - fan_sn = raw_input() - if checkfansninput(fan_sn, fansntemp) is False: - continue - fansntemp.append(fan_sn) - fan_sn = fan_sn + chr(0x00) - fane2.typesn = fan_sn + chr(0x00) - break - while True: - print("Please input[%s]:" % "hardware version") - hwinfo = raw_input() - if checkfanhwinput(hwinfo) is False: - continue - fan_hwinfo = hwinfo + chr(0x00) - fane2.typehwinfo = fan_hwinfo + chr(0x00) - break - log_debug(fane2.typedevtype) - fane2.typename = FANS_DEF[fane2.typedevtype] + chr(0x00) - fans.append(fane2) - print("\n") - print("\n*******************************\n") - - util_show_fanse2(fans) - if getInputCheck("check input correctly or not(Yes/No):") is True: - for fan in fans: - log_debug("ouput fan") - fac_fan_setmac(fan) - else: - print("setmac quit") - return False - - -def fac_fan_setmac_fru(ret): - fans = FRULISTS.get("fans") - - fanfrus = {} - newfrus = {} - - # getmsg - try: - for fan in fans: - print("===============%s ================getmessage" % fan.get("name")) - eeprom = getsysvalue(I2CUTIL.getE2File(fan.get("bus"), fan.get("loc"))) - fru = ipmifru() - fru.decodeBin(eeprom) - fanfrus[fan.get("name")] = fru - except Exception as e: - print(str(e)) - return False - - # setmsg - for fan in fans: - print("===============%s ================setmac" % fan.get("name")) - fruold = fanfrus.get(fan.get("name")) - newfru = getInputSetmac(fruold) - newfru.recalcute() - newfrus[fan.get("name")] = newfru - # writemsg - for fan in fans: - print("===============%s ================writeToE2" % fan.get("name")) - ret_t = newfrus.get(fan.get("name")) - I2CUTIL.openFanE2Protect() - I2CUTIL.writeToFanE2(fan.get("bus"), fan.get("loc"), ret_t.bindata) - I2CUTIL.closeFanE2Protect() - # check - try: - for fan in fans: - print("===============%s ================getmessage" % fan.get("name")) - eeprom = getsysvalue(I2CUTIL.getE2File(fan.get("bus"), fan.get("loc"))) - fru = ipmifru() - fru.decodeBin(eeprom) - except Exception as e: - print(str(e)) - return False - return True - - -def fac_fans_setmac(): - ret = I2CUTIL.getvaluefromdevice("rg_fan") - if ret is not None and len(ret) > 0: - return fac_fans_setmac_tlv(ret) - fans = FRULISTS.get("fans", None) - if fans is not None and len(fans) > 0: - return fac_fan_setmac_fru(ret) - return False - - -def fac_fan_setmac(item): - I2CUTIL.openFanE2Protect() - I2CUTIL.writeToFanE2(item.fanbus, item.fanloc, item.generate_fan_value()) - I2CUTIL.closeFanE2Protect() - - -def writeToEEprom(rst_arr): - dealtype = E2_PROTECT.get("gettype", None) - if dealtype is None: - rgi2cset( - E2_PROTECT["bus"], - E2_PROTECT["devno"], - E2_PROTECT["addr"], - E2_PROTECT["open"], - ) - elif dealtype == "io": - io_wr(E2_PROTECT["io_addr"], E2_PROTECT["open"]) - index = 0 - for item in rst_arr: - rgi2cset(E2_LOC["bus"], E2_LOC["devno"], index, ord(item)) - index += 1 - - if dealtype is None: - rgi2cset( - E2_PROTECT["bus"], - E2_PROTECT["devno"], - E2_PROTECT["addr"], - E2_PROTECT["close"], - ) - elif dealtype == "io": - io_wr(E2_PROTECT["io_addr"], E2_PROTECT["close"]) - # deal last drivers - subprocess.call(["rmmod", "at24"]) - subprocess.call(["modprobe", "at24"]) - subprocess.call(["rm", "-f", "/var/cache/sonic/decode-syseeprom/syseeprom_cache"]) - - -def get_local_eth0_mac(): - cmd1 = ["ifconfig", "eth0"] - cmd2 = ["grep", "HWaddr"] - print(getstatusoutput_noshell_pipe(cmd1, cmd2)) - - -def getonieversion(): - if not os.path.isfile("/host/machine.conf"): - return "" - machine_vars = {} - with open("/host/machine.conf") as machine_file: - for line in machine_file: - tokens = line.split("=") - if len(tokens) < 2: - continue - machine_vars[tokens[0]] = tokens[1].strip() - return machine_vars.get("onie_version") - - -def createbmcMac(cpumac, num=2): - bcmvalue = strtoint(cpumac[cpumac.rindex(":") + 1 : len(cpumac)]) + num - # bmcmac = - t = cpumac.split(":") - t[5] = "%02x" % bcmvalue - bmcmac = ":".join(t) - return bmcmac.upper() - - -def fac_board_setmac(): - _value = {} - # default value - _value[TLV_CODE_VENDOR_EXT] = generate_ext(RAGILE_CARDID) # generate id - _value[TLV_CODE_PRODUCT_NAME] = RAGILE_PRODUCTNAME - _value[TLV_CODE_PART_NUMBER] = RAGILE_PART_NUMBER - _value[TLV_CODE_LABEL_REVISION] = RAGILE_LABEL_REVISION - _value[TLV_CODE_PLATFORM_NAME] = platform - _value[TLV_CODE_ONIE_VERSION] = getonieversion() - _value[TLV_CODE_MAC_SIZE] = RAGILE_MAC_SIZE - _value[TLV_CODE_MANUF_NAME] = RAGILE_MANUF_NAME - _value[TLV_CODE_MANUF_COUNTRY] = RAGILE_MANUF_COUNTRY - _value[TLV_CODE_VENDOR_NAME] = RAGILE_VENDOR_NAME - _value[TLV_CODE_DIAG_VERSION] = RAGILE_DIAG_VERSION - _value[TLV_CODE_SERVICE_TAG] = RAGILE_SERVICE_TAG - try: - if 0x00004052 == RAGILE_CARDID: - _value[TLV_CODE_PRODUCT_NAME] = RAGILE_PRODUCTNAME + "-RJ" - elif 0x00004051 == RAGILE_CARDID or 0x00004050 == RAGILE_CARDID: - changeTypeValue( - _value, TLV_CODE_PRODUCT_NAME, "Product name", RAGILE_PRODUCTNAME - ) - - changeTypeValue( - _value, TLV_CODE_SERIAL_NUMBER, "SN", "0000000000000" - ) # add serial number - changeTypeValue( - _value, TLV_CODE_DEVICE_VERSION, "hardware version", "101" - ) # hardware version - changeTypeValue( - _value, TLV_CODE_MAC_BASE, "MAC address", "58696cfb2108" - ) # MAC address - _value[TLV_CODE_MANUF_DATE] = time.strftime( - "%m/%d/%Y %H:%M:%S", time.localtime() - ) # add setmac time - rst, ret = generate_value(_value) - if ( - util_setmac("eth0", _value[TLV_CODE_MAC_BASE]) is True - ): # set Internet cardIP - writeToEEprom(rst) # write to e2 - # set BMC MAC - if "bmcsetmac" in FACTESTMODULE and FACTESTMODULE["bmcsetmac"] == 1: - bmcmac = createbmcMac(_value[TLV_CODE_MAC_BASE]) - if ipmi_set_mac(bmcmac) is True: - print("BMC MAC[%s]" % bmcmac) - else: - print("SET BMC MAC FAILED") - return False - else: - return False - except SETMACException as e: - # print(e) - RJPRINTERR("\n\n%s\n\n" % e) - return False - except ValueError as e: - return False - return True - - -def ipmi_set_mac(mac): - macs = mac.split(":") - cmdinit = ["ipmitool", "raw", "0x0c", "0x01", "0x01", "0xc2", "0x00"] - cmdset = ["ipmitool", "raw", "0x0c", "0x01", "0x01", "0x05"] - for ind in range(len(macs)): - cmdset.append("0x%02x" % int(macs[ind], 16)) - getstatusoutput_noshell(cmdinit) - ret, status = getstatusoutput_noshell(cmdset) - if ret: - RJPRINTERR("\n\n%s\n\n" % status) - return False - return True - - -def getInputValue(title, tips): - print("Please input[%s]such as(%s):" % (title, tips)) - name = raw_input() - - return name - - -def bmc_setmac(): - tips = "BMC MAC" - print("Please input value you want to change[%s]:" % tips) - name = raw_input() - if len(name) != 12: - RJPRINTERR("\nMAC address invaild, try again\n") - return False - release_mac = "" - for i in range(int(len(name) / 2)): - if i == 0: - release_mac += name[i * 2 : i * 2 + 2] - else: - release_mac += ":" + name[i * 2 : i * 2 + 2] - if isValidMac(release_mac) is True: - if ipmi_set_mac(release_mac) is True: - return True - else: - RJPRINTERR("\nMAC address invaild, try again\n") - return False - - -def closeProtocol(): - # disable LLDP - log_info("disable LLDP") - sys.stdout.write(".") - sys.stdout.flush() - getstatusoutput_noshell(["systemctl", "stop", "lldp.service"]) - log_info("disable lldp service") - sys.stdout.write(".") - sys.stdout.flush() - getstatusoutput_noshell(["systemctl", "stop", "bgp.service"]) - log_info("disable bgp service") - sys.stdout.write(".") - sys.stdout.flush() - # ret, status = os_system('bcmcmd "port ce,xe stp=disable"') - - -# check SDK memory must be 256M - - -def checkSdkMem(): - ind = 0 - file_data = "" - with open(file_name, "r") as f: - for line in f: - if "dmasize=16M" in line: - line = line.replace("dmasize=16M", "dmasize=256M") - ind = -1 - file_data += line - if ind == 0: - return - with open(file_name, "w") as f: - f.write(file_data) - print("change SDK memory to 256, reboot required") - getstatusoutput_noshell(["sync"]) - getstatusoutput_noshell(["reboot"]) - - -########################################################################## -# receives a character setting -########################################################################## - - -def getch(msg): - ret = "" - fd = sys.stdin.fileno() - old_ttyinfo = termios.tcgetattr(fd) - new_ttyinfo = old_ttyinfo[:] - new_ttyinfo[3] &= ~termios.ICANON - new_ttyinfo[3] &= ~termios.ECHO - sys.stdout.write(msg) - sys.stdout.flush() - try: - termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo) - ret = os.read(fd, 1) - finally: - # print "try to setting" - termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo) - return ret - - -def get_raw_input(): - ret = "" - fd = sys.stdin.fileno() - old_ttyinfo = termios.tcgetattr(fd) - new_ttyinfo = old_ttyinfo[:] - new_ttyinfo[3] &= ~termios.ICANON - new_ttyinfo[3] &= ~termios.ECHO - try: - termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo) - ret = raw_input("") - except Exception as e: - print(e) - finally: - termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo) - return ret - - -def getsysvalue(location): - retval = None - mb_reg_file = location - if not os.path.isfile(mb_reg_file): - print(mb_reg_file, "not found !") - return retval - try: - if not os.path.isfile(mb_reg_file): - print(mb_reg_file, "not found !") - return retval - with open(mb_reg_file, "r") as fd: - retval = fd.read() - except Exception as error: - log_error("Unable to open " + mb_reg_file + "file !") - retval = retval.rstrip("\r\n") - retval = retval.lstrip(" ") - # log_debug(retval) - return retval - - -# get file value - - -def get_pmc_register(reg_name): - retval = "ERR" - mb_reg_file = MAILBOX_DIR + reg_name - filepath = glob.glob(mb_reg_file) - if len(filepath) == 0: - return "%s %s notfound" % (retval, mb_reg_file) - mb_reg_file = filepath[0] - if not os.path.isfile(mb_reg_file): - return "%s %s notfound" % (retval, mb_reg_file) - try: - with open(mb_reg_file, "r") as fd: - retval = fd.read() - except Exception as error: - pass - retval = retval.rstrip("\r\n") - retval = retval.lstrip(" ") - return retval - - -# decode EEPROM - - -def decoder(s, t): - if ord(t[0]) == TLV_CODE_PRODUCT_NAME: - name = "Product Name" - value = str(t[2 : 2 + ord(t[1])]) - elif ord(t[0]) == TLV_CODE_PART_NUMBER: - name = "Part Number" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_SERIAL_NUMBER: - name = "Serial Number" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_MAC_BASE: - name = "Base MAC Address" - value = ":".join([binascii.b2a_hex(T) for T in t[2:8]]).upper() - elif ord(t[0]) == TLV_CODE_MANUF_DATE: - name = "Manufacture Date" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_DEVICE_VERSION: - name = "Device Version" - value = str(ord(t[2])) - elif ord(t[0]) == TLV_CODE_LABEL_REVISION: - name = "Label Revision" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_PLATFORM_NAME: - name = "Platform Name" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_ONIE_VERSION: - name = "ONIE Version" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_MAC_SIZE: - name = "MAC Addresses" - value = str((ord(t[2]) << 8) | ord(t[3])) - elif ord(t[0]) == TLV_CODE_MANUF_NAME: - name = "Manufacturer" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_MANUF_COUNTRY: - name = "Manufacture Country" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_VENDOR_NAME: - name = "Vendor Name" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_DIAG_VERSION: - name = "Diag Version" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_SERVICE_TAG: - name = "Service Tag" - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_VENDOR_EXT: - name = "Vendor Extension" - value = "" - if _TLV_DISPLAY_VENDOR_EXT: - value = t[2 : 2 + ord(t[1])] - elif ord(t[0]) == TLV_CODE_CRC_32 and len(t) == 6: - name = "CRC-32" - value = "0x%08X" % ( - ((ord(t[2]) << 24) | (ord(t[3]) << 16) | (ord(t[4]) << 8) | ord(t[5])), - ) - elif ord(t[0]) == TLV_CODE_RJ_CARID: - name = "rj_cardid" - value = "" - for c in t[2 : 2 + ord(t[1])]: - value += "%02X" % (ord(c),) - else: - name = "Unknown" - value = "" - for c in t[2 : 2 + ord(t[1])]: - value += "0x%02X " % (ord(c),) - return {"name": name, "code": ord(t[0]), "value": value} - - -def decode_eeprom(e): - total_len = (ord(e[9]) << 8) | ord(e[10]) - tlv_index = _TLV_INFO_HDR_LEN - tlv_end = _TLV_INFO_HDR_LEN + total_len - ret = [] - while (tlv_index + 2) < len(e) and tlv_index < tlv_end: - rt = decoder(None, e[tlv_index : tlv_index + 2 + ord(e[tlv_index + 1])]) - ret.append(rt) - if ord(e[tlv_index]) == TLV_CODE_CRC_32: - break - tlv_index += ord(e[tlv_index + 1]) + 2 - for item in ret: - if item["code"] == TLV_CODE_VENDOR_EXT: - rt = decoder(None, item["value"][0 : 0 + 2 + ord(item["value"][0 + 1])]) - ret.append(rt) - return ret - - -def get_sys_eeprom(): - eeprom = get_sysfs_value(rg_eeprom) - return decode_eeprom(eeprom) - - -# get card ID -def getCardId(): - ret = get_sys_eeprom() - for item in ret: - if item["code"] == TLV_CODE_RJ_CARID: - return item.get("value", None) - return None - - -########################################### -# get memory slot and number via DMI command -########################################### -def getsysmeminfo(): - ret, log = getstatusoutput_noshell(["which", "dmidecode"]) - if ret != 0 or len(log) <= 0: - error = "cmd find dmidecode" - return False, error - cmd1 = [log] - cmd2 = ['grep', '-P', '-A5', "Memory\s+Device"] - cmd3 = ['grep', 'Size'] - cmd4 = ['grep', '-v', 'Range'] - # get total number first - result = [] - ret1, log1 = getstatusoutput_noshell_pipe(cmd1, cmd2, cmd3, cmd4) - if ret1 == 0 and len(log1): - log1 = log1.lstrip() - arr = log1.split("\n") - # total = len(arr) # total slot number - for i in range(len(arr)): - val = re.sub("\D", "", arr[i]) - if val == "": - val = arr[i].lstrip() - val = re.sub("Size:", "", val).lstrip() - # print val - result.append({"slot": i + 1, "size": val}) - return True, result - return False, "error" - - -########################################### -# get memory slot and number via DMI command -# return various arrays -########################################### -def getsysmeminfo_detail(): - ret, log = getstatusoutput_noshell(["which", "dmidecode"]) - if ret != 0 or len(log) <= 0: - error = "cmd find dmidecode" - return False, error - cmd1 = [log] - cmd2 = ['-t', '17'] - cmd3 = ['grep', '-A21', "Memory Device"] # 17 - cmd = ' '.join(cmd1) + ' '.join(cmd2) + ' '.join(cmd3) - # get total number - ret1, log1 = getstatusoutput_noshell_pipe(cmd1, cmd2, cmd3) - if ret1 != 0 or len(log1) <= 0: - return False, "command execution error[%s]" % cmd - result_t = log1.split("--") - mem_rets = [] - for item in result_t: - its = item.replace("\t", "").strip().split("\n") - ret = {} - for it in its: - if ":" in it: - key = it.split(":")[0].lstrip() - value = it.split(":")[1].lstrip() - ret[key] = value - mem_rets.append(ret) - return True, mem_rets - - -########################################### -# get BIOS info via DMI command -########################################### -def getDmiSysByType(type_t): - ret, log = getstatusoutput_noshell(["which", "dmidecode"]) - if ret != 0 or len(log) <= 0: - error = "cmd find dmidecode" - return False, error - cmd = [log] + ["-t", type_t] - # get total number - ret1, log1 = getstatusoutput_noshell(cmd) - if ret1 != 0 or len(log1) <= 0: - return False, "command execution error[%s]" % cmd - its = log1.replace("\t", "").strip().split("\n") - ret = {} - for it in its: - if ":" in it: - key = it.split(":")[0].lstrip() - value = it.split(":")[1].lstrip() - ret[key] = value - return True, ret - - -def gethwsys(): - return getDmiSysByType(1) - - -########################################### -# get BIOS info via DMI command - - -def getsysbios(): - return getDmiSysByType(0) - - -def searchDirByName(name, dir): - result = [] - try: - files = os.listdir(dir) - for file in files: - if name in file: - result.append(os.path.join(dir, file)) - except Exception as e: - pass - return result - - -def getUsbLocation(): - dir = "/sys/block/" - spect = "sd" - usbpath = "" - result = searchDirByName(spect, dir) - if len(result) <= 0: - return False - for item in result: - with open(os.path.join(item, "removable"), "r") as fd: - value = fd.read() - if value.strip() == "1": # U-Disk found - usbpath = item - break - if usbpath == "": # no U-Disk found - log_debug("no usb found") - return False, usbpath - return True, usbpath - - -# judge USB file -def getusbinfo(): - ret, path = getUsbLocation() - if ret is False: - return False, "not usb exists" - str = os.path.join(path, "size") - ret, value = getfilevalue(str) - if ret is True: - return ( - True, - { - "id": os.path.basename(path), - "size": float(value) * 512 / 1024 / 1024 / 1024, - }, - ) - else: - return False, "Err" - - -def get_cpu_info(): - cmd1 = ["cat", "/proc/cpuinfo"] - cmd2 = ["grep", "processor", "-A18"] # 17 - cmd = ' '.join(cmd1) + ' '.join(cmd2) - ret, log1 = getstatusoutput_noshell_pipe(cmd1, cmd2) - if ret != 0 or len(log1) <= 0: - return False, "command execution error[%s]" % cmd - result_t = log1.split("--") - mem_rets = [] - for item in result_t: - its = item.replace("\t", "").strip().split("\n") - ret = {} - for it in its: - if ":" in it: - key = it.split(":")[0].lstrip() - value = it.split(":")[1].lstrip() - ret[key] = value - mem_rets.append(ret) - return True, mem_rets - - -# read file -def get_version_config_info(attr_key, file_name=None): - if file_name is None: - version_conf_filename = "/root/version.json" - else: - version_conf_filename = file_name - if not os.path.isfile(version_conf_filename): - return None - with open(version_conf_filename) as rjconf_file: - for line in rjconf_file: - tokens = line.split("=") - if len(tokens) < 2: - continue - if tokens[0] == attr_key: - return tokens[1].strip() - return None - - -def io_rd(reg_addr, size=1): - path = "/dev/port" - ret = "" - fd = None - try: - reg_addr = int(reg_addr) - fd = os.open(path, os.O_RDWR|os.O_CREAT) - for i in range(size): - os.lseek(fd, reg_addr+i, os.SEEK_SET) - ret+="{:02x}".format(ord(os.read(fd, 1).decode('latin-1'))) - return ret - except Exception as e: - print(str(e)) - return None - finally: - if fd: os.close(fd) - - -def io_wr(reg_addr, reg_data): - u"""io write""" - fd = None - try: - regdata = 0 - regaddr = 0 - if type(reg_addr) == int: - regaddr = reg_addr - else: - regaddr = int(reg_addr, 16) - if type(reg_data) == int: - regdata = reg_data - else: - regdata = int(reg_data, 16) - devfile = "/dev/port" - fd = os.open(devfile, os.O_RDWR | os.O_CREAT) - os.lseek(fd, regaddr, os.SEEK_SET) - os.write(fd, regdata.to_bytes(2, 'little')) - return True - except ValueError as e: - print(e) - return False - except Exception as e: - print(e) - return False - finally: - if fd: os.close(fd) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py new file mode 100755 index 0000000000..2f125c5084 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_cause.py @@ -0,0 +1,183 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- +import sys +import os +import time +import syslog +from platform_util import get_value, set_value, exec_os_cmd, wb_os_system +from platform_config import REBOOT_CAUSE_PARA + +REBOOT_CAUSE_DEBUG_FILE = "/etc/.reboot_cause_debug" +REBOOT_CAUSE_STARTED_FLAG = "/tmp/.reboot_cause_started_flag" + +debuglevel = 0 + + +def record_syslog_debug(s): + if debuglevel: + syslog.openlog("REBOOT_CAUSE_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def record_syslog(s): + syslog.openlog("REBOOT_CAUSE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +class RebootCause(): + def __init__(self): + self.reboot_cause_para = REBOOT_CAUSE_PARA.copy() + self.reboot_cause_list = self.reboot_cause_para.get('reboot_cause_list', None) + self.other_reboot_cause_record = self.reboot_cause_para.get('other_reboot_cause_record', None) + + def debug_init(self): + global debuglevel + if os.path.exists(REBOOT_CAUSE_DEBUG_FILE): + debuglevel = 1 + else: + debuglevel = 0 + + def monitor_point_check(self, item): + try: + gettype = item.get('gettype', None) + okval = item.get('okval', None) + compare_mode = item.get('compare_mode', "equal") + ret, value = get_value(item) + if ret is True: + if compare_mode == "equal": + if value == okval: + return True + elif compare_mode == "great": + if value > okval: + return True + elif compare_mode == "ignore": + return True + else: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: compare_mode %s not match error.' % (compare_mode)) + else: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: base point check type:%s not support.' % gettype) + except Exception as e: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: base point check error. msg: %s.' % (str(e))) + return False + + def reboot_cause_record(self, item_list): + RET = {"RETURN_KEY1": 0} + try: + for item in item_list: + record_type = item.get('record_type', None) + if record_type == 'file': + file_mode = item.get('mode', None) + file_log = item.get('log', None) + file_path = item.get('path', None) + file_max_size = item.get('file_max_size', 0) + + if file_path is None: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: record type is file, but path is none.') + continue + + if file_max_size > 0: + file_size = 0 + if os.path.exists(file_path): + file_size = os.path.getsize(file_path) // file_max_size + if file_size >= 1: + reocrd_cmd = "mv %s %s_bak" % (file_path, file_path) + status, output = exec_os_cmd(reocrd_cmd) + if status: + record_syslog( + '%%REBOOT_CAUSE-3-EXCEPTION: exec cmd %s failed, %s' % + (reocrd_cmd, output)) + + if file_mode == 'cover': + operate_cmd = ">" + elif file_mode == 'add': + operate_cmd = ">>" + else: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: file record mode:%s not support.' % file_mode) + continue + + create_dir = "mkdir -p %s" % os.path.dirname(file_path) + status, ret_t = wb_os_system(create_dir) + if status != 0: + RET["RETURN_KEY1"] = -1 + record_syslog( + '%%REBOOT_CAUSE-3-EXCEPTION: create %s failed, msg: %s' % + (os.path.dirname(file_path), ret_t)) + continue + + status, date = wb_os_system("date") + if status != 0 or len(date) == 0: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: get date failed.') + continue + + reocrd_cmd = "echo %s %s %s %s" % (file_log, date, operate_cmd, file_path) + status, ret_t = wb_os_system(reocrd_cmd) + if status != 0: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: get date failed, msg: %s' % ret_t) + continue + wb_os_system('sync') + else: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: record_type:%s not support.' % record_type) + continue + except Exception as e: + RET["RETURN_KEY1"] = -1 + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: reboot cause record error. msg: %s.' % (str(e))) + if RET["RETURN_KEY1"] == 0: + return True + return False + + def reboot_cause_check(self): + try: + reboot_cause_flag = False + if self.reboot_cause_list is None: + record_syslog_debug('%%REBOOT_CAUSE-6-DEBUG: reboot cause check config not found') + return + for item in self.reboot_cause_list: + name = item.get('name', None) + monitor_point = item.get('monitor_point', None) + record = item.get('record', None) + finish_operation_list = item.get('finish_operation', []) + if name is None or monitor_point is None or record is None: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: reboot cause check get config failed.name:%s, monitor_point:%s, record:%s' % + (name, monitor_point, record)) + return + ret = self.monitor_point_check(monitor_point) + if ret is True: + record_syslog_debug('%%REBOOT_CAUSE-6-DEBUG: %s reboot cause is happen' % name) + self.reboot_cause_record(record) + reboot_cause_flag = True + for finish_operation_item in finish_operation_list: + ret, log = set_value(finish_operation_item) + if ret is False: + log = "%%REBOOT_CAUSE-3-EXCEPTION: " + log + record_syslog(log) + + if reboot_cause_flag is False and self.other_reboot_cause_record is not None: + record_syslog_debug('%%REBOOT_CAUSE-6-DEBUG: other reboot cause is happen') + self.reboot_cause_record(self.other_reboot_cause_record) + except Exception as e: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: reboot cause check error. msg: %s.' % (str(e))) + return + + def run(self): + try: + self.debug_init() + if os.path.exists(REBOOT_CAUSE_STARTED_FLAG): + record_syslog_debug( + '%%REBOOT_CAUSE-6-DEBUG: Reboot cause has been started and will not be started again') + sys.exit(0) + self.reboot_cause_check() + wb_os_system("touch %s" % REBOOT_CAUSE_STARTED_FLAG) + wb_os_system("sync") + time.sleep(5) + sys.exit(0) + except Exception as e: + record_syslog('%%REBOOT_CAUSE-3-EXCEPTION: %s.' % (str(e))) + + +if __name__ == '__main__': + reboot_cause = RebootCause() + reboot_cause.run() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py new file mode 100755 index 0000000000..17d3f5902b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/reboot_ctrl.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import time +import syslog +import click +from platform_util import write_sysfs, wbi2cset, io_wr, wbi2csetWord +from platform_config import REBOOT_CTRL_PARAM + + +REBOOTCTLDEBUG = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def rebootctrlwarning(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def rebootctrlcritical(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def rebootctrlerror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def rebootctrldebug(s): + # s = s.decode('utf-8').encode('gb2312') + if REBOOTCTLDEBUG == 1: + syslog.openlog("REBOOTCTRL", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class RebootCtrl(): + def __init__(self): + self.config = REBOOT_CTRL_PARAM.copy() + + def set_value(self, config, val): + way = config.get("gettype") + if way == 'sysfs': + loc = config.get("loc") + value = config.get(val) + rebootctrldebug("sysfs type.loc:0x%x, value:0x%x" % (loc, value)) + return write_sysfs(loc, "0x%02x" % value) + if way == "i2c": + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get(val) + rebootctrldebug("i2c type.bus:0x%x, addr:0x%x, offset:0x%x, value:0x%x" % (bus, addr, offset, value)) + return wbi2cset(bus, addr, offset, value) + if way == "io": + io_addr = config.get('io_addr') + value = config.get(val) + rebootctrldebug("io type.io_addr:0x%x, value:0x%x" % (io_addr, value)) + ret = io_wr(io_addr, value) + if ret is not True: + return False, ("write 0x%x failed" % io_addr) + return True, ("write 0x%x success" % io_addr) + if way == 'i2cword': + bus = config.get("bus") + addr = config.get("loc") + offset = config.get("offset") + value = config.get(val) + rebootctrldebug("i2cword type.bus:0x%x, addr:0x%x, offset:0x%x, value:0x%x" % (bus, addr, offset, value)) + return wbi2csetWord(bus, addr, offset, value) + return False, "unsupport way: %s" % way + + def reset_operate(self, config): + ret, log = self.set_value(config, "rst_val") + rst_delay = config.get("rst_delay", 0) + time.sleep(rst_delay) + return ret, log + + def unlock_reset_operate(self, config): + ret, log = self.set_value(config, "unlock_rst_val") + unlock_rst_delay = config.get("unlock_rst_delay", 0) + time.sleep(unlock_rst_delay) + return ret, log + + def do_rebootctrl(self, option): + if self.config is None: + rebootctrlerror("Reset failed, REBOOT_CTRL_PARAM cfg get failed.") + return + try: + name_conf = self.config.get(option, None) + if name_conf is None: + print("Reset %s not support" % option) + return + try: + click.confirm("Are you sure you want to reset " + option + "?", + default=False, abort=True, show_default=True) + except Exception as e: + print("Aborted, msg: %s" % str(e)) + return + print("Reset %s start" % option) + ret, log = self.reset_operate(name_conf) + if ret is False: + rebootctrlerror(log) + print("Reset %s failed" % option) + return + if "unlock_rst_val" in name_conf: + ret, log = self.unlock_reset_operate(name_conf) + if ret is False: + rebootctrlerror(log) + print("%s unlock reset failed" % option) + return + print("Reset %s success" % option) + except Exception: + rebootctrlerror("do_rebootctrl Exception error") + return + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''reboot_ctrl reset [option]''' + + +@main.command() +@click.argument('option', required=True) +def reset(option): + '''reset device''' + rebootctrldebug("reboot ctrl option %s" % option) + rebootctrl = RebootCtrl() + rebootctrl.do_rebootctrl(option) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/sensors b/platform/broadcom/sonic-platform-modules-ragile/common/script/sensors new file mode 100755 index 0000000000..a2c72b123a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/sensors @@ -0,0 +1,8 @@ +#!/bin/bash +#docker exec -i pmon sensors "$@" + + +#To probe sensors not part of lm-sensors +if [ -r /usr/local/bin/platform_sensors.py ]; then + python /usr/local/bin/platform_sensors.py +fi diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py new file mode 100755 index 0000000000..4dd98f3a36 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/sfp_highest_temperatue.py @@ -0,0 +1,148 @@ +#!/usr/bin/python3 +import os +import importlib.machinery +import time +import syslog +import subprocess +import fcntl + +sfp_temperature_file = "/tmp/highest_sff_temp" + +SFP_TEMP_DEBUG_FILE = "/etc/.sfp_temp_debug_flag" +SFP_TEMP_RECORD_DEBUG = 1 +SFP_TEMP_RECORD_ERROR = 2 +debuglevel = 0 + + +def sfp_temp_debug(s): + if SFP_TEMP_RECORD_DEBUG & debuglevel: + syslog.openlog("SFP_TEMP_DEBUG", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def sfp_temp_error(s): + if SFP_TEMP_RECORD_ERROR & debuglevel: + syslog.openlog("SFP_TEMP_ERROR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +pidfile = None + + +def file_rw_lock(): + global pidfile + pidfile = open(sfp_temperature_file, "r") + try: + fcntl.flock(pidfile, fcntl.LOCK_EX | fcntl.LOCK_NB) + sfp_temp_debug("file lock success") + return True + except Exception: + if pidfile is not None: + pidfile.close() + pidfile = None + return False + + +def file_rw_unlock(): + try: + global pidfile + + if pidfile is not None: + fcntl.flock(pidfile, fcntl.LOCK_UN) + pidfile.close() + pidfile = None + sfp_temp_debug("file unlock success") + else: + sfp_temp_debug("pidfile is invalid, do nothing") + return True + except Exception as e: + sfp_temp_error("file unlock err, msg:%s" % (str(e))) + return False + + +def get_sfp_highest_temperature(): + highest_temperature = 0 + platform_sfputil = None + + sfputil_dir = "/usr/share/sonic/device/" + try: + if not os.path.exists(sfputil_dir): + sfputil_dir = "/usr/share/sonic/platform/" + sfputil_path = sfputil_dir + "/plugins/sfputil.py" + else: + cmd = "cat /host/machine.conf | grep onie_build_platform" + ret, output = subprocess.getstatusoutput(cmd) + if ret != 0: + sfp_temp_error("cmd: %s execution fail, output: %s" % (cmd, output)) + + onie_platform = output.split("=")[1] + sfputil_path = sfputil_dir + onie_platform + "/plugins/sfputil.py" + + module = importlib.machinery.SourceFileLoader("sfputil", sfputil_path).load_module() + platform_sfputil_class = getattr(module, "SfpUtil") + platform_sfputil = platform_sfputil_class() + + temperature = platform_sfputil.get_highest_temperature() + highest_temperature = int(temperature) * 1000 + except Exception as e: + sfp_temp_error("get sfp temperature error, msg:%s" % str(e)) + highest_temperature = -9999000 + + return highest_temperature + + +def write_sfp_highest_temperature(temperature): + + loop = 1000 + ret = False + try: + if os.path.exists(sfp_temperature_file) is False: + with open(sfp_temperature_file, 'w') as sfp_f: + pass + for i in range(0, loop): + ret = file_rw_lock() + if ret is True: + break + time.sleep(0.001) + + if ret is False: + sfp_temp_error("take file lock timeout") + return + + with open(sfp_temperature_file, 'w') as sfp_f: + sfp_f.write("%s\n" % str(temperature)) + + file_rw_unlock() + return + except Exception as e: + sfp_temp_error("write sfp temperature error, msg:%s" % str(e)) + file_rw_unlock() + return + + +def debug_init(): + global debuglevel + + try: + with open(SFP_TEMP_DEBUG_FILE, "r") as fd: + value = fd.read() + debuglevel = int(value) + except Exception: + debuglevel = 0 + + +def main(): + while True: + debug_init() + temperature = 0 + try: + temperature = get_sfp_highest_temperature() + write_sfp_highest_temperature(temperature) + except Exception as e: + sfp_temp_error("get/write sfp temperature error, msg:%s" % str(e)) + write_sfp_highest_temperature(-9999000) + time.sleep(5) + + +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py new file mode 100755 index 0000000000..b8b774c8b7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/slot_monitor.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import time +import syslog +import traceback +import operator +import click +from platform_config import SLOT_MONITOR_PARAM, MONITOR_DEV_STATUS_DECODE +from platform_util import io_rd, io_wr, wbi2cget, wbi2cset + + +SLOTMONITORDEBUG = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def slotwarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def slotcriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def sloterror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def slotinfo(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_INFO, s) + + +def slotdebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if SLOTMONITORDEBUG == 1: + syslog.openlog("SLOTMONITOR", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +class SlotMonitor(): + def __init__(self): + self.preSlotStatus = [] + + def checkslot(self, ret): + slots_conf = SLOT_MONITOR_PARAM.get('slots', None) + slotpresent = MONITOR_DEV_STATUS_DECODE.get('slotpresent', None) + + if slots_conf is None or slotpresent is None: + return False + for item_slot in slots_conf: + totalerr = 0 + try: + ret_t = {} + ret_t["id"] = item_slot.get('name') + ret_t["status"] = "" + presentattr = item_slot.get('present') + gettype = presentattr.get('gettype') + presentbit = presentattr.get('presentbit') + if gettype == "io": + io_addr = presentattr.get('io_addr') + val = io_rd(io_addr) + if val is not None: + retval = val + else: + totalerr -= 1 + sloterror(" %s %s" % (item_slot.get('name'), "lpc read failed")) + else: + bus = presentattr.get('bus') + loc = presentattr.get('loc') + offset = presentattr.get('offset') + ind, val = wbi2cget(bus, loc, offset) + if ind is True: + retval = val + else: + totalerr -= 1 + sloterror(" %s %s" % (item_slot.get('name'), "i2c read failed")) + if totalerr < 0: + ret_t["status"] = "NOT OK" + ret.append(ret_t) + continue + val_t = (int(retval, 16) & (1 << presentbit)) >> presentbit + slotdebuglog("%s present:%s" % (item_slot.get('name'), slotpresent.get(val_t))) + if val_t != slotpresent.get('okval'): + ret_t["status"] = "ABSENT" + else: + ret_t["status"] = "PRESENT" + except Exception as e: + ret_t["status"] = "NOT OK" + totalerr -= 1 + sloterror("checkslot error") + sloterror(str(e)) + ret.append(ret_t) + return True + + def dealslotplugin(self, name): + slotdebuglog("enter dealslotplugin %s" % name) + # wait for slot stable + time.sleep(5) + slots_conf = SLOT_MONITOR_PARAM.get('slots', None) + if slots_conf is None: + return False + for item_slot in slots_conf: + try: + slotdebuglog("name %s, item_slot.get('name') %s" % (name, item_slot.get('name'))) + if name == item_slot.get('name'): + actattr = item_slot.get('act') + for item_act in actattr: + gettype = item_act.get('gettype') + if gettype == "io": + io_addr = item_act.get('io_addr') + value = item_act.get('value') + mask = item_act.get('mask') + val = io_rd(io_addr) + if val is None: + sloterror(" %s %s" % (name, "lpc read failed")) + continue + set_val = (int(val, 16) & mask) | value + ret = io_wr(io_addr, set_val) + if ret is not True: + sloterror(" %s %s" % (name, "lpc write failed")) + continue + slotdebuglog("io set io_addr:0x%x value:0x%x success" % (io_addr, set_val)) + elif gettype == "i2c": + bus = item_act.get('bus') + loc = item_act.get('loc') + offset = item_act.get('offset') + value = item_act.get('value') + ret, log = wbi2cset(bus, loc, offset, value) + if ret is not True: + sloterror(" %s %s %s" % (name, "i2c write failed", log)) + continue + slotdebuglog( + "i2c set bus:%d loc:0x%x offset:0x%x value:0x%x success" % + (bus, loc, offset, value)) + else: + sloterror("gettype error") + break + except Exception as e: + sloterror("dealslotplugin failed") + sloterror(str(e)) + return False + return True + + def updateSlotStatus(self): + ''' + Only two status: PRESENT and ABSENT + ''' + curSlotStatus = [] + self.checkslot(curSlotStatus) + slotdebuglog('curSlotStatus: {}\n preSlotStatus: {}'.format(curSlotStatus, self.preSlotStatus)) + if operator.eq(self.preSlotStatus, curSlotStatus) is False: + if len(self.preSlotStatus) == 0: + # first time + for i, item in enumerate(curSlotStatus): + if item['status'] == 'PRESENT': + slotdebuglog('SLOT_PLUG_IN: %s' % (item['id'])) + elif item['status'] == 'ABSENT': + slotdebuglog('SLOT_ABSENT: %s' % (item['id'])) + else: + slotdebuglog('SLOT_FAILED: %s status %s not support yet' % (item['id'], item['status'])) + self.preSlotStatus.append(item) + else: + for i, item in enumerate(curSlotStatus): + if item['status'] == self.preSlotStatus[i]['status']: + continue + if item['status'] == 'PRESENT' and self.preSlotStatus[i]['status'] == 'ABSENT': + self.dealslotplugin(item['id']) + slotinfo('SLOT_PLUG_IN: %s' % (item['id'])) + elif item['status'] == 'ABSENT' and self.preSlotStatus[i]['status'] == 'PRESENT': + slotwarninglog('SLOT_PLUG_OUT: %s' % (item['id'])) + else: + slotwarninglog('SLOT_PLUG_OUT: %s status change from %s to %s not support' % + (item['id'], self.preSlotStatus[i]['status'], item['status'])) + self.preSlotStatus.remove(self.preSlotStatus[i]) + self.preSlotStatus.insert(i, item) + + def slotmonitor(self): + self.updateSlotStatus() + return 0 + + +def doSlotMonitor(slotMonitor): + slotMonitor.slotmonitor() + + +def run(interval, slotMonitor): + # slotMonitor.devattrinit() + while True: + try: + doSlotMonitor(slotMonitor) + except Exception as e: + traceback.print_exc() + sloterror(str(e)) + time.sleep(interval) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''slot monitor operator''' + + +@main.command() +def start(): + '''start slot monitor''' + slotinfo("slot_monitor start") + slotMonitor = SlotMonitor() + interval = SLOT_MONITOR_PARAM.get('polling_time', 1) + run(interval, slotMonitor) + + +@main.command() +def stop(): + '''stop slot monitor ''' + slotinfo("stop") + + +# device_i2c operation +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon b/platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon new file mode 100755 index 0000000000..4290b0a687 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/ssdmon @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# +# ssdmon +# +# Command-line utility to check SSD health and parameters +# + +try: + import argparse + import os + import sys + + from sonic_py_common import device_info, logger +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + +DEFAULT_DEVICE = "/dev/sda" +SYSLOG_IDENTIFIER = "ssdmon" + +# Global logger instance +log = logger.Logger(SYSLOG_IDENTIFIER) + +def import_ssd_api(diskdev): + """ + Loads platform specific or generic ssd_mon module from source + Raises an ImportError exception if none of above available + + Returns: + Instance of the class with SSD API implementation (vendor or generic) + """ + + # try to load platform specific module + try: + platform_path, _ = device_info.get_paths_to_platform_and_hwsku_dirs() + platform_plugins_path = os.path.join(platform_path, "plugins") + sys.path.append(os.path.abspath(platform_plugins_path)) + from ssd_util import SsdUtil + except ImportError as e: + log.log_warning("Platform specific SsdMon module not found.") + + return SsdUtil(diskdev) + +def is_number(s): + try: + float(s) + return True + except ValueError: + return False + +# ==================== Entry point ==================== +def ssdmon(): + if os.geteuid() != 0: + print("Root privileges are required for this operation") + sys.exit(1) + + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--device", help="Device name to show health info", default=DEFAULT_DEVICE) + parser.add_argument("-t", "--temperature", action="store_true", default=False, help="Show only temperature") + parser.add_argument("-j", "--health", action="store_true", default=False, help="Show only health") + + args = parser.parse_args() + + ssd = import_ssd_api(args.device) + + if args.temperature: + print(ssd.get_temperature()) + return + + if args.health: + print(ssd.get_health()) + return + + print("Device Model : {}".format(ssd.get_model())) + print("Firmware : {}".format(ssd.get_firmware())) + print("Serial : {}".format(ssd.get_serial())) + print("Health : {}{}".format(ssd.get_health(), "%" if is_number(ssd.get_health()) else "")) + print("Remain Life : {}{}".format(ssd.get_remaining_life(), "%" if is_number(ssd.get_remaining_life()) else "")) + print("Temperature : {}{}".format(ssd.get_temperature(), "C" if is_number(ssd.get_temperature()) else "")) + print("SATA Rate : {}".format(ssd.get_sata_rate())) + +if __name__ == '__main__': + ssdmon() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py new file mode 100755 index 0000000000..4fae02f512 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/tty_console.py @@ -0,0 +1,91 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +import logging.handlers +import subprocess +import shlex +import time +import sys +import os +from platform_util import CompressedRotatingFileHandler, exec_os_cmd + +console_file = "/dev/ttyS1" +console_logfile = "/var/log/bmc-console.log" +MAX_LOG_BYTES = 20 * 1024 * 1024 +BACKUP_COUNT = 9 + +READ_SIZE = 1024 + +logger = logging.getLogger("cpu_monitor_bmc") +logger.setLevel(logging.DEBUG) +fh = CompressedRotatingFileHandler( + console_logfile, + mode='a', + maxBytes=MAX_LOG_BYTES, + backupCount=BACKUP_COUNT, + encoding=None, + delay=0) +fh.setLevel(logging.DEBUG) + +formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") +fh.setFormatter(formatter) +logger.addHandler(fh) + + +def tty_system_cmd(cmd, print_log=True): + if print_log: + logger.debug("command: %s", cmd) + status, output = exec_os_cmd(cmd) + logger.debug("command status %s", status) + logger.debug("command output:\n%s", output) + else: + status, output = exec_os_cmd(cmd) + return status, output + + +if __name__ == '__main__': + try_times = 0 + while try_times < 3: + try_times = try_times + 1 + ret, log = tty_system_cmd("stty -F /dev/ttyS1 | grep 115200", True) + if len(log) != 0 and "115200" in log: + break + tty_system_cmd("stty -F /dev/ttyS1 115200", True) + if try_times > 1: + logger.error("The %d time try to set SONiC /dev/ttyS1 115200", try_times) + + if not os.path.exists(console_file): + logger.error("device %s not exist", console_file) + sys.exit(1) + + nopen = 3 + while nopen > 0: + try: + console_fd = os.open(console_file, os.O_RDONLY) + break + except Exception as e: + logger.error(e) + logger.error("open %s failed", console_file) + nopen = nopen - 1 + time.sleep(1) + if nopen == 0: + sys.exit(1) + + try: + tmp_read = "" + while True: + dev_read = os.read(console_fd, READ_SIZE) + dev_read = str(dev_read, encoding='utf-8') + if len(dev_read) == 1 and dev_read == "\n": + continue + if dev_read[len(dev_read) - 1] == '\n': + tmp_read = tmp_read + dev_read[0:(len(dev_read) - 1)] + logger.info(tmp_read) + tmp_read = "" + else: + tmp_read = tmp_read + dev_read + + except Exception as e: + if console_fd is not None: + os.close(console_fd) + logger.error(e) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py new file mode 100755 index 0000000000..f56712e471 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/upgrade.py @@ -0,0 +1,991 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import sys +import os +import time +import syslog +import signal +import click +from platform_util import get_value, set_value, exec_os_cmd, exec_os_cmd_log +from platform_config import UPGRADE_SUMMARY, WARM_UPGRADE_STARTED_FLAG +from warm_upgrade import WarmBasePlatform + + +############################# Error code defined ############################# +ERR_FW_CHECK_CPLD_UPGRADE = -601 # "Failed to check the device CPLD information" +ERR_FW_CHECK_FPGA_UPGRADE = -602 # "Failed to check the device FPGA information" +ERR_FW_MATCH_CPLD_UPGRADE = -603 # "Not found upgrade CPLD file." +ERR_FW_MATCH_FPGA_UPGRADE = -604 # "Not found upgrade FPGA file." +ERR_FW_SAMEVER_CPLD_UPGRADE = -605 # "The CPLD version in device is same" +ERR_FW_SAMEVER_FPGA_UPGRADE = -606 # "The FPGA version in device is same" +ERR_FW_DO_CPLD_UPGRADE = -607 # "Doing upgrade CPLD is failed." +ERR_FW_DO_FPGA_UPGRADE = -608 # "Doing upgrade FPGA is failed." +ERR_FW_UPGRADE = -609 # "Failed to upgrade firmware" +FIRMWARE_PROGRAM_EXEC_ERR = -610 # "Firmware program run error!" +ERR_FW_FILE_FOUND = -701 # "Failed to find upgrade file" +ERR_FW_HEAD_PARSE = -702 # "Failed to parse upgrade firmware head info" +ERR_FW_CONFIG_FOUND = -703 # "Failed to find config item" +ERR_FW_NOSUPPORT_HOT = -704 # "No support hot upgrade" +ERR_FW_CHECK_SIZE = -705 # "Failed to check file size" +ERR_FW_DEVICE_ACCESS = -706 # "Failed to access device" +ERR_FW_NO_FILE_SUCCESS = -707 # "No files were successfully upgraded" +ERR_FW_CARD_ABSENT = -708 # "The subcard not present" +ERR_FW_HEAD_CHECK = -709 # "Failed to check head info" +ERR_FW_FOOL_PROOF = -710 # "Failed to fool proof verification" +ERR_FW_RAISE_EXCEPTION = -711 # Code raise exception +ERR_FW_INVALID_PARAM = -712 # Invalid parameter +ERR_FW_UNZIP_FAILED = -713 # Unzip firmware failed + +FIRMWARE_SUCCESS = 0 +CHECK_OK = 0 + + +UPGRADE_DEBUG_FILE = "/etc/.upgrade_debug_flag" +UPGRADE_FILE_DIR = "/tmp/firmware/" + +UPGRADEDEBUG = 1 + +debuglevel = 0 + +COLD_UPGRADE = 1 +WARM_UPGRADE = 2 +TEST_UPGRADE = 3 +BMC_UPGRADE = 4 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def debug_init(): + global debuglevel + if os.path.exists(UPGRADE_DEBUG_FILE): + debuglevel = debuglevel | UPGRADEDEBUG + else: + debuglevel = debuglevel & ~(UPGRADEDEBUG) + + +def upgradewarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def upgradecriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def upgradeerror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def upgradedebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if UPGRADEDEBUG & debuglevel: + syslog.openlog("UPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def signal_init(): + signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl+c signal + signal.signal(signal.SIGTERM, signal.SIG_IGN) # ignore kill signal + signal.signal(signal.SIGTSTP, signal.SIG_IGN) # ignore ctrl+z signal + + +class BasePlatform(): + + def __init__(self): + self.upgrade_param = UPGRADE_SUMMARY.copy() + self.devtype = self.upgrade_param.get('devtype', None) + self.max_slot_num = self.upgrade_param.get("max_slot_num", 0) + self.head_info_config = {} + self.slot_config = {} + self.cold_chain_config = {} + self.subtype = None + self.chain = None + self.filetype = None + self.DEVTYPE = None + self.SUBTYPE = '0' + self.TYPE = None + self.CHAIN = None + self.CHIPNAME = None + self.VERSION = None + self.FILETYPE = None + self.CRC = None + self.SUBTYPE_LIST = None + + def save_and_set_value(self, cfg_list): + for config in cfg_list: + ret, val = get_value(config) + if ret: + config["save_value"] = val + else: + upgradeerror(val) + return False, "get save value fail" + + set_val = config.get("set_value", None) + if set_val is None: + log = "save_and_set_value lack of set_val config" + upgradeerror(log) + return log + + gettype = config.get("gettype", None) + set_cmd = config.get("set_cmd", None) + if gettype == "cmd": + if set_cmd is None: + log = "save_and_set_value lack of set_cmd config" + upgradeerror(log) + return False, log + config["cmd"] = set_cmd % set_val + upgradedebuglog("save_and_set_value modify set cmd to %s" % config["cmd"]) + else: + config["value"] = set_val + upgradedebuglog("save_and_set_value modify set val to %s" % config["value"]) + + ret, log = set_value(config) + if ret is False: + upgradeerror(log) + return False, log + return True, "save and set value success" + + def recover_save_value(self, cfg_list): + total_err = 0 + for config in cfg_list: + upgradedebuglog("config: %s, recover save value" % config) + val = config.get("save_value", None) + if val is None: + upgradeerror("recover_save_value lack of save_value config") + total_err -= 1 + continue + gettype = config.get("gettype", None) + set_cmd = config.get("set_cmd", None) + if gettype == "cmd": + config["cmd"] = set_cmd % val + upgradedebuglog("recover_save_value modify set cmd to %s" % config["cmd"]) + else: + config["value"] = val + upgradedebuglog("recover_save_value modify set val to %s" % config["value"]) + + ret, log = set_value(config) + if ret is False: + upgradeerror("recover save value write failed, log: %s" % log) + total_err -= 1 + else: + upgradedebuglog("recover save value success") + if total_err < 0: + return False, "recover save value failed" + return True, "recover save value success" + + def check_slot_present(self, slot_present_config): + presentbit = slot_present_config.get('presentbit') + ret, value = get_value(slot_present_config) + if ret is False: + return "NOT OK" + if isinstance(value, str): + val_t = int(value, 16) + else: + val_t = value + val_t = (val_t & (1 << presentbit)) >> presentbit + if val_t != slot_present_config.get('okval'): + status = "ABSENT" + else: + status = "PRESENT" + return status + + def linecard_present_check(self, slot_present_config): + present_status = self.check_slot_present(slot_present_config) + if present_status == "NOT OK": + return ERR_FW_DEVICE_ACCESS, "get slot present status failed." + if present_status == "ABSENT": + return ERR_FW_CARD_ABSENT, "slot absent" + return CHECK_OK, "slot present" + + def subprocess_warm_upgrade(self, config, file, main_type, sub_type, slot): + dev_name = config.get("name", None) + status, output = self.subprocess_firmware_upgrade(config, file, main_type, sub_type, slot) + if status is False: + upgradeerror("%s warm upgrade failed" % dev_name) + return False, output + command = "warm_upgrade.py %s 0x%x 0x%x %s %s %s" % (file, main_type, sub_type, slot, self.filetype, self.chain) + upgradedebuglog("warm upgrade cmd: %s" % command) + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(command) + else: + status, output = exec_os_cmd(command) + if status: + upgradeerror("%s warm upgrade failed" % dev_name) + return False, output + upgradedebuglog("%s warm upgrade success" % dev_name) + return True, "upgrade success" + + def do_fw_upg_init_cmd(self, dev_name, init_cmd_list): + # pre operation + try: + for init_cmd_config in init_cmd_list: + ret, log = set_value(init_cmd_config) + if ret is False: + upgradeerror("%s do init cmd: %s failed, msg: %s" % (dev_name, init_cmd_config, log)) + return False, log + msg = "%s firmware init cmd all set success" % dev_name + upgradedebuglog(msg) + return True, msg + except Exception as e: + return False, str(e) + + def do_fw_upg_finish_cmd(self, dev_name, finish_cmd_list): + # end operation + ret = 0 + for finish_cmd_config in finish_cmd_list: + ret_t, log = set_value(finish_cmd_config) + if ret_t is False: + upgradeerror("%s do finish cmd: %s failed, msg: %s" % (dev_name, finish_cmd_config, log)) + ret = -1 + if ret != 0: + msg = "%s firmware finish cmd exec failed" % dev_name + upgradeerror(msg) + return False, msg + msg = "%s firmware finish cmd all set success" % dev_name + upgradedebuglog(msg) + return True, msg + + def subprocess_firmware_upgrade(self, config, file, main_type, sub_type, slot): + dev_name = config.get("name", None) + init_cmd_list = config.get("init_cmd", []) + finish_cmd_list = config.get("finish_cmd", []) + try: + ret, log = self.do_fw_upg_init_cmd(dev_name, init_cmd_list) + if ret is False: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + time.sleep(0.5) # delay 0.5s after execute init_cmd + command = "firmware_upgrade %s 0x%x 0x%x %s" % (file, main_type, sub_type, slot) + upgradedebuglog("firmware upgrade cmd: %s" % command) + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(command) + else: + status, output = exec_os_cmd(command) + if status: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + upgradeerror("%s firmware upgrade failed, msg: %s" % (dev_name, output)) + return False, output + upgradedebuglog("%s firmware upgrade success" % dev_name) + ret, log = self.do_fw_upg_finish_cmd(dev_name, init_cmd_list) + if ret is False: + return False, log + return True, "upgrade success" + except Exception as e: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, str(e) + + def subprocess_test_upgrade(self, config, file, main_type, sub_type, slot): + dev_name = config.get("name", None) + init_cmd_list = config.get("init_cmd", []) + finish_cmd_list = config.get("finish_cmd", []) + try: + ret, log = self.do_fw_upg_init_cmd(dev_name, init_cmd_list) + if ret is False: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + time.sleep(0.5) # delay 0.5s after execute init_cmd + command = "firmware_upgrade test %s 0x%x 0x%x %s" % (file, main_type, sub_type, slot) + upgradedebuglog("firmware upgrade cmd: %s" % command) + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(command) + else: + status, output = exec_os_cmd(command) + if status: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + upgradeerror("%s test upgrade failed, msg: %s" % (dev_name, output)) + return False, output + upgradedebuglog("%s test upgrade success" % dev_name) + ret, log = self.do_fw_upg_finish_cmd(dev_name, init_cmd_list) + if ret is False: + return False, log + return True, "upgrade success" + except Exception as e: + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, str(e) + + def subprocess_bmc_upgrade(self, config, file, chip_select, erase_type): + dev_name = config.get("name", None) + init_cmd_list = config.get("init_cmd", []) + finish_cmd_list = config.get("finish_cmd", []) + save_set_reg_list = config.get("save_set_reg", []) + try: + # save and set reg + ret, log = self.save_and_set_value(save_set_reg_list) + if ret is False: + upgradeerror(log) + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + upgradedebuglog("%s save and set cmd all set success" % dev_name) + time.sleep(0.5) # delay 0.5s after execute save and set reg + + # pre operation + ret, log = self.do_fw_upg_init_cmd(dev_name, init_cmd_list) + if ret is False: + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, log + + upgradedebuglog("%s bmc init cmd all set success" % dev_name) + time.sleep(0.5) # delay 0.5s after execute init_cmd + + command = "fw_upgrade upgrade %s %s %s" % (file, chip_select, erase_type) + upgradedebuglog("fw_upgrade upgrade cmd: %s" % command) + status, output = exec_os_cmd_log(command) + if status: + upgradeerror("%s bmc upgrade failed" % dev_name) + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, output + upgradedebuglog("%s bmc upgrade success" % dev_name) + + ret1, log1 = self.recover_save_value(save_set_reg_list) + if ret1 is False: + upgradeerror("bmc upgrade recover save value failed, msg: %s" % log1) + ret2, log2 = self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + if ret2 is False: + upgradeerror("bmc upgrade do finish command failed, msg: %s" % log2) + if ret1 is False or ret2 is False: + return False, "bmc upgrade do recover save value or finish command failed" + return True, "upgrade success" + + except Exception as e: + self.recover_save_value(save_set_reg_list) + self.do_fw_upg_finish_cmd(dev_name, finish_cmd_list) + return False, str(e) + + def file_head_param_check(self, head_info_config): + try: + self.DEVTYPE = head_info_config.get('DEVTYPE', None) + self.SUBTYPE = head_info_config.get('SUBTYPE', '0') + self.TYPE = head_info_config.get('TYPE', None) + self.CHAIN = head_info_config.get('CHAIN', None) + self.CHIPNAME = head_info_config.get('CHIPNAME', None) + self.VERSION = head_info_config.get('VERSION', None) + self.FILETYPE = head_info_config.get('FILETYPE', None) + self.CRC = head_info_config.get('CRC', None) + + if self.devtype != int(self.DEVTYPE, 16): + return ERR_FW_HEAD_CHECK, ("no support %s devtype" % self.DEVTYPE) + + if self.SUBTYPE is not None: + self.SUBTYPE_LIST = self.SUBTYPE.split(',') + self.SUBTYPE_LIST = [int(tmp_subtype, base=16) for tmp_subtype in self.SUBTYPE_LIST] + if len(self.SUBTYPE) != 0 and self.subtype not in self.SUBTYPE_LIST: + return ERR_FW_HEAD_CHECK, ("no support %s SUBTYPE" % self.SUBTYPE) + + if len(self.CHAIN) == 0 or len(self.FILETYPE) == 0: + return ERR_FW_HEAD_CHECK, ("CHAIN:%s, FILETYPE:%s get failed" % (self.CHAIN, self.FILETYPE)) + self.chain = int(self.CHAIN) + self.filetype = self.FILETYPE + upgradedebuglog("file head param: devtype:0x%x, subtype:0x%x, chain:%s, filetype:%s" + % (self.devtype, self.subtype, self.chain, self.filetype)) + return CHECK_OK, "SUCCESS" + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def parse_file_head(self, file): + try: + self.head_info_config = {} + with open(file, 'r', errors='ignore') as fd: + rdbuf = fd.read() + upgradedebuglog("start parse upgrade file head") + file_head_start = rdbuf.index('FILEHEADER(\n') # ponit to F + file_head_start += rdbuf[file_head_start:].index('\n') # ponit to \n + file_head_end = rdbuf.index(')\n') + header_buf = rdbuf[file_head_start + 1: file_head_end - 1] + upgradedebuglog("upgrade file head find FILEHEADER") + for line in header_buf.split('\n'): + head_list = line.split('=', 1) + head_key = head_list[0] + head_val = head_list[1] + self.head_info_config[head_key] = head_val + upgradedebuglog("file: %s head_info_config: %s" % (file, self.head_info_config)) + return CHECK_OK, "SUCCESS" + except Exception as e: + msg = "parse %s head failed, msg: %s" % (file, str(e)) + upgradeerror(msg) + return ERR_FW_RAISE_EXCEPTION, msg + + def get_file_size_k(self, file): + fsize = os.path.getsize(file) + fsize = fsize / float(1024) + return round(fsize, 2) + + def get_device_model(self, conf): + ret, val = get_value(conf) + if ret is False: + msg = "get device model failed, msg: %s" % val + return False, msg + decode_val = conf.get("decode") + if decode_val is None: + return True, val + for k, v in decode_val.items(): + if val == v: + return True, k + msg = "device model decode error, val: %s" % val + return False, msg + + def upgrade_fool_proofing(self, conf): + try: + status, dev_model = self.get_device_model(conf) + if status is False: + msg = "upgrade fool proofing get device model failed, msg: %s" % dev_model + upgradeerror(msg) + return False, msg + upgradedebuglog("get device model success, device model: %s" % dev_model) + if dev_model != self.VERSION: + msg = "upgrade fool proofing failed, device model: %s, upgrade file version: %s" % ( + dev_model, self.VERSION) + upgradedebuglog(msg) + return False, msg + msg = "upgrade fool proofing pass, device model: %s, upgrade file version: %s" % (dev_model, self.VERSION) + upgradedebuglog(msg) + return True, msg + except Exception as e: + upgradeerror(str(e)) + return False, str(e) + + def upgrading(self, config, file, devtype, subtype, slot, option_flag, erase_type=None): + dev_name = config.get("name", None) + if option_flag == COLD_UPGRADE: + status, output = self.subprocess_firmware_upgrade(config, file, devtype, subtype, slot) + elif option_flag == WARM_UPGRADE: + status, output = self.subprocess_warm_upgrade(config, file, devtype, subtype, slot) + elif option_flag == TEST_UPGRADE: + status, output = self.subprocess_test_upgrade(config, file, devtype, subtype, slot) + elif option_flag == BMC_UPGRADE: + status, output = self.subprocess_bmc_upgrade(config, file, slot, erase_type) + else: + log = "%s set error option flag" % dev_name + upgradeerror(log) + return False, log + + if status is False: + upgradeerror("%s upgrade failed" % dev_name) + return False, output + upgradedebuglog("%s upgrade success" % dev_name) + return True, "upgrade success" + + def initial_check(self, file, slot, upg_type): + try: + upgradedebuglog("BasePlatform initial_check, file: %s, slot: %s, upg_type: %s" % + (file, slot, upg_type)) + + upgradedebuglog("do file exist check...") + if not os.path.isfile(file): + msg = "%s not found" % file + upgradedebuglog(msg) + return ERR_FW_FILE_FOUND, msg + upgradedebuglog("file exist check ok") + + slot_name = "slot%d" % slot + slot_config = self.upgrade_param.get(slot_name, {}) + slot_present_config = slot_config.get("present", {}) + if len(slot_present_config) != 0: + upgradedebuglog("do %s present check..." % slot_name) + ret, log = self.linecard_present_check(slot_present_config) + if ret != CHECK_OK: + msg = "check %s present error, msg: %s" % (slot_name, log) + upgradedebuglog(msg) + return ret, msg + upgradedebuglog("%s present check ok" % slot_name) + + upgradedebuglog("do file head parse...") + self.subtype = slot_config.get("subtype", 0) + ret, log = self.parse_file_head(file) + if ret != CHECK_OK: + return ret, log + upgradedebuglog("file head parse success") + + upgradedebuglog("do file head check...") + ret, log = self.file_head_param_check(self.head_info_config) + if ret != CHECK_OK: + msg = "file: %s, head check failed, msg: %s" % (file, log) + upgradedebuglog(msg) + return ret, msg + upgradedebuglog("file head check ok") + + upgradedebuglog("get upgrade chain config...") + filetype_config = slot_config.get(self.filetype, {}) + if len(filetype_config) == 0: + msg = "file: %s filetype: %s no support" % (file, self.filetype) + upgradedebuglog(msg) + return ERR_FW_CONFIG_FOUND, msg + chain_num = "chain%s" % self.chain + chain_config = filetype_config.get(chain_num, {}) + if len(chain_config) == 0: + msg = "file: %s get %s config failed" % (file, chain_num) + upgradedebuglog(msg) + return ERR_FW_CONFIG_FOUND, msg + self.cold_chain_config = chain_config + upgradedebuglog("get %s filetype: %s %s config success" % (slot_name, self.filetype, chain_num)) + + fool_proofing = chain_config.get("fool_proofing") + if fool_proofing is not None: + upgradedebuglog("do fool proofing check...") + status, log = self.upgrade_fool_proofing(fool_proofing) + if status is False: + msg = "upgrade fool proofing check failed, msg: %s" % log + upgradedebuglog(msg) + return ERR_FW_FOOL_PROOF, msg + upgradedebuglog("do fool proofing check ok") + + if upg_type == WARM_UPGRADE: + upgradedebuglog("do support warm upgrade check...") + if chain_config.get("is_support_warm_upg", 0) != 1: + msg = "file: %s %s chain config not support warm upgrade" % (file, slot_name) + upgradedebuglog(msg) + return ERR_FW_NOSUPPORT_HOT, msg + upgradedebuglog("file: %s %s chain config support warm upgrade" % (file, slot_name)) + + filesizecheck = chain_config.get("filesizecheck", 0) + if filesizecheck != 0: + upgradedebuglog("do file size check...") + file_size = self.get_file_size_k(file) + if file_size > filesizecheck: + msg = "file: %s size: %s exceed %s" % (file, file_size, filesizecheck) + upgradedebuglog(msg) + return ERR_FW_CHECK_SIZE, msg + msg = "file: %s size: %s check ok" % (file, file_size) + upgradedebuglog(msg) + + msg = "file: %s slot: %s upgrade type: %s check ok" % (file, slot, upg_type) + upgradedebuglog(msg) + return CHECK_OK, msg + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def do_upgrade(self, file, slot, upg_type): + try: + ret, log = self.initial_check(file, slot, upg_type) + if ret != CHECK_OK: + return ret, log + + # start upgrading + upgradedebuglog("start upgrading") + ret, log = self.upgrading(self.cold_chain_config, file, self.devtype, self.subtype, slot, upg_type) + if ret is False: + upgradeerror("upgrade failed") + return ERR_FW_UPGRADE, log + upgradedebuglog("upgrade success") + return FIRMWARE_SUCCESS, "SUCCESS" + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def do_pre_check(self, conf): + ret, val = get_value(conf) + if ret is False: + msg = "pre check get value failed, msg: %s" % val + return False, msg + ok_val = conf.get("ok_val") + if val == ok_val: + msg = "pre check success, ok_val: %s, get value: %s" % (ok_val, val) + return True, msg + msg = "pre check failed, ok_val: %s, get value: %s" % (ok_val, val) + return False, msg + + def do_test(self, device, slot): + try: + # slot present check + slot_name = "slot%d" % slot + slot_config = self.upgrade_param.get(slot_name, {}) + slot_present_config = slot_config.get("present", {}) + if len(slot_present_config) != 0: + ret, log = self.linecard_present_check(slot_present_config) + if ret != CHECK_OK: + msg = "check %s present error, msg: %s" % (slot_name, log) + upgradedebuglog(msg) + return ret, msg + upgradedebuglog("%s present" % slot_name) + + # get list of devices to be tested + test_config = slot_config.get("TEST", {}) + if len(test_config) == 0: + return ERR_FW_CONFIG_FOUND, "test config no found" + device_list = test_config.get(device, []) + if len(device_list) == 0: + return ERR_FW_CONFIG_FOUND, ("logic device %s test config list not found" % device) + + # test_file existence check + for test_config in device_list: + chain_num = test_config.get("chain", None) + test_file = test_config.get("file", None) + display_name = test_config.get("display_name", None) + if chain_num is None or test_file is None or display_name is None: + log = "test_config:%s lack of config" % test_config + upgradeerror(log) + return ERR_FW_CONFIG_FOUND, log + if not os.path.isfile(test_file): + return ERR_FW_FILE_FOUND, ("%s not found" % test_file) + + # start testing + RET = 0 + pre_check_failed = 0 + pre_check_failed_summary = "" + failed_summary = "chain test failed.\ntest fail chain:" + success_summary = "test success chain:" + for test_config in device_list: + chain_num = test_config.get("chain", None) + test_file = test_config.get("file", None) + display_name = test_config.get("display_name", None) + pre_check_conf = test_config.get("pre_check", None) + if pre_check_conf is not None: + status, msg = self.do_pre_check(pre_check_conf) + if status is False: + pre_check_failed += 1 + log = "\nchain:%d, name:%s, pre check failed, msg: %s" % (chain_num, display_name, msg) + upgradedebuglog(log) + pre_check_failed_summary += log + continue + upgradedebuglog("chain:%d, name:%s, pre check ok, msg: %s" % (chain_num, display_name, msg)) + ret, log = self.do_upgrade(test_file, slot, TEST_UPGRADE) + if ret != FIRMWARE_SUCCESS: + RET = -1 + upgradeerror("chain:%d, name:%s test failed" % (chain_num, display_name)) + failed_summary += "\n chain:%d, name:%s;" % (chain_num, display_name) + else: + upgradedebuglog("chain:%d, name:%s test success" % (chain_num, display_name)) + success_summary += "\n chain:%d, name:%s;" % (chain_num, display_name) + if RET != 0: + return ERR_FW_UPGRADE, failed_summary + if pre_check_failed == len(device_list): + return ERR_FW_NO_FILE_SUCCESS, failed_summary + pre_check_failed_summary + return FIRMWARE_SUCCESS, success_summary + except Exception as e: + return ERR_FW_RAISE_EXCEPTION, str(e) + + def do_test_main(self, device, slot): + print("+================================+") + print("|Doing upgrade test, please wait.|") + ret, log = self.do_test(device, slot) + if ret == FIRMWARE_SUCCESS: + print("| test succeeded! |") + print("+================================+") + print(log) + sys.exit(0) + else: + print("| test failed! |") + print("+================================+") + print("FAILED REASON:") + print(log) + sys.exit(1) + + def do_bmc_upgrade_main(self, file, chip_select, erase_type): + bmc_upgrade_config = self.upgrade_param.get("BMC", {}) + ret, log = self.upgrading(bmc_upgrade_config, file, self.devtype, + self.subtype, chip_select, BMC_UPGRADE, erase_type) + if ret is True: + print("===========upgrade succeeded!============") + sys.exit(0) + else: + print("============upgrade failed!==============") + print("FAILED REASON:") + print("%s" % log) + sys.exit(1) + + +class FileUpg(object): + def __init__(self, config, file, devtype, subtype, slot, filetype, chain, upg_type): + self.config = config + self.file = file + self.devtype = devtype + self.subtype = subtype + self.slot = slot + self.filetype = filetype + self.chain = chain + self.upg_type = upg_type + + def __repr__(self): + return "file:%s slot:%d" % (self.file, self.slot) + + +class FwUpg(object): + def __init__(self): + self.upg_platform = BasePlatform() + self.warm_upg_platform = WarmBasePlatform() + self.max_slot_num = self.upg_platform.max_slot_num + self.file_list = [] + + def do_file_refresh(self, fw_upg_instance): + fw_upg_config = fw_upg_instance.config + fw_upg_file = fw_upg_instance.file + fw_upg_devtype = fw_upg_instance.devtype + fw_upg_subype = fw_upg_instance.subtype + fw_upg_slot = fw_upg_instance.slot + fw_upg_filetype = fw_upg_instance.filetype + fw_upg_chain = fw_upg_instance.chain + dev_name = fw_upg_config.get("name", None) + upgradedebuglog("%s start warm upgrade, file: %s, devtype:0x%x, subype: 0x%x, slot: %d, filetype: %s, chain: %d" % + (dev_name, fw_upg_file, fw_upg_devtype, fw_upg_subype, fw_upg_slot, fw_upg_filetype, fw_upg_chain)) + status, output = self.warm_upg_platform.do_warmupgrade(fw_upg_file, fw_upg_devtype, fw_upg_subype, fw_upg_slot, + fw_upg_filetype, fw_upg_chain) + if status is False: + upgradeerror("%s warm upgrade failed, msg: %s" % (dev_name, output)) + return False, output + upgradedebuglog("%s warm upgrade success" % dev_name) + return True, "upgrade success" + + def do_refresh(self): + try: + exec_os_cmd("touch %s" % WARM_UPGRADE_STARTED_FLAG) + exec_os_cmd("sync") + + # stop upper layer services access + ret, log = self.warm_upg_platform.stop_services_access() + if ret is False: + upgradeerror("stop upper layer services access failed") + upgradeerror(log) + return ERR_FW_UPGRADE, log + upgradedebuglog("stop upper layer services access success") + + for file_instance in self.file_list: + file_info = repr(file_instance) + ret, log = self.do_file_refresh(file_instance) + if ret is False: + msg = "%s refresh failed, ret:%s, \n log:%s." % (file_info, ret, log) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + upgradedebuglog("%s refresh success." % file_info) + msg = "all files refresh success." + return FIRMWARE_SUCCESS, msg + except Exception as e: + msg = "do warm upg exception happend. log:%s" % str(e) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + finally: + self.warm_upg_platform.start_services_access() + if os.path.isfile(WARM_UPGRADE_STARTED_FLAG): + exec_os_cmd("rm -rf %s" % WARM_UPGRADE_STARTED_FLAG) + exec_os_cmd("sync") + + def do_file_cold_upg(self, fw_upg_instance): + try: + upgradedebuglog("start cold upgrade") + fw_upg_config = fw_upg_instance.config + fw_upg_file = fw_upg_instance.file + fw_upg_devtype = fw_upg_instance.devtype + fw_upg_subype = fw_upg_instance.subtype + fw_upg_slot = fw_upg_instance.slot + ret, log = self.upg_platform.upgrading( + fw_upg_config, fw_upg_file, fw_upg_devtype, fw_upg_subype, fw_upg_slot, COLD_UPGRADE) + if ret is False: + upgradeerror("cold upgrade %s slot%d failed, log:%s" % (fw_upg_file, fw_upg_slot, log)) + return ERR_FW_UPGRADE, log + log = "cold upgrade %s slot%d success" % (fw_upg_file, fw_upg_slot) + upgradedebuglog(log) + return FIRMWARE_SUCCESS, log + except Exception as e: + msg = "do cold upg exception happend. log:%s" % str(e) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + + def do_file_init_check(self, file_path, slot, upg_type): + upgradedebuglog("do_file_init_check, file_path: %s, slot: %s, upg_type: %s" % (file_path, slot, upg_type)) + + if slot is None: # traverse all slots + for i in range(0, self.max_slot_num + 1): + ret, log = self.upg_platform.initial_check(file_path, i, upg_type) + if ret != CHECK_OK: + upgradedebuglog( + "file: %s, slot%d initial check not ok, ret: %d, msg: %s" % + (file_path, i, ret, log)) + accept_error = (ERR_FW_CARD_ABSENT, ERR_FW_HEAD_CHECK, ERR_FW_FOOL_PROOF) + if ret in accept_error: + msg = "file: %s, slot%d initial check ret: %d, acceptable error." % (file_path, i, ret) + upgradedebuglog(msg) + continue + return ret, log + file_instance = FileUpg(self.upg_platform.cold_chain_config, file_path, self.upg_platform.devtype, + self.upg_platform.subtype, i, self.upg_platform.filetype, self.upg_platform.chain, upg_type) + self.file_list.append(file_instance) + else: + slot = int(slot, 10) + ret, log = self.upg_platform.initial_check(file_path, slot, upg_type) + if ret != CHECK_OK: + msg = "file: %s, slot%d initial check not ok, ret: %d, msg: %s" % (file_path, slot, ret, log) + return ret, msg + file_instance = FileUpg(self.upg_platform.cold_chain_config, file_path, self.upg_platform.devtype, + self.upg_platform.subtype, slot, self.upg_platform.filetype, self.upg_platform.chain, upg_type) + self.file_list.append(file_instance) + msg = "file: %s all slots init check ok" % file_path + return CHECK_OK, msg + + def do_dir_init_check(self, path, slot, upg_type): + for root, dirs, names in os.walk(path): + # root: directory absolute path + # dirs: folder path collection under directory + # names: file path collection under directory + for filename in names: + # file_path is file absolute path + file_path = os.path.join(root, filename) + ret, log = self.do_file_init_check(file_path, slot, upg_type) + if ret != CHECK_OK: + return ret, log + msg = "all files in dir have been check ok" + upgradedebuglog(msg) + return CHECK_OK, msg + + def do_fw_upg(self, path, slot, upg_type): + match_zip_file_flag = False + try: + upgradedebuglog("do_fw_upg, path: %s, slot: %s, upg_type: %s" % (path, slot, upg_type)) + if slot is not None and not slot.isdigit(): + msg = "invalid slot param: %s" % slot + upgradeerror(msg) + return ERR_FW_INVALID_PARAM, msg + + upgradedebuglog("start init check") + if os.path.isfile(path) and path.endswith(".zip"): + upgradedebuglog("firmware upgrade via compressed package: %s" % path) + # remove origin firmware upgrade file + exec_os_cmd("rm -rf %s" % UPGRADE_FILE_DIR) + cmd = "unzip -o %s -d /tmp/" % path + if os.path.exists(UPGRADE_DEBUG_FILE): + status, output = exec_os_cmd_log(cmd) + else: + status, output = exec_os_cmd(cmd) + if status: + msg = "unzip %s failed, log: %s" % (path, output) + upgradeerror(msg) + return ERR_FW_UNZIP_FAILED, msg + match_zip_file_flag = True + path = UPGRADE_FILE_DIR + + if os.path.isdir(path): + ret, msg = self.do_dir_init_check(path, slot, upg_type) + elif os.path.isfile(path): + ret, msg = self.do_file_init_check(path, slot, upg_type) + else: + ret = ERR_FW_FILE_FOUND + msg = "path: %s not found" % path + upgradeerror(msg) + + if ret != CHECK_OK: + return ret, msg + + # self.file_list is a collection of all check ok files + if len(self.file_list) == 0: + msg = "all file upgrade check not be satisfied." + upgradeerror(msg) + return ERR_FW_NO_FILE_SUCCESS, msg + + SUCCUSS_FILE_SUMMARY = "SUCCESS FILE: \n" + # file cold upgrade + upgradedebuglog("start all files cold upgrade") + for file_instance in self.file_list: + file_info = repr(file_instance) + ret, log = self.do_file_cold_upg(file_instance) + if ret != FIRMWARE_SUCCESS: + msg = "%s cold upgrade failed, ret:%d, \n log:\n%s." % (file_info, ret, log) + upgradeerror(msg) + return ret, msg + SUCCUSS_FILE_SUMMARY += "%s \n" % file_info + upgradedebuglog("%s cold upgrade success." % file_info) + + # file refresh upgrade + if upg_type == WARM_UPGRADE: + upgradedebuglog("start all files refresh upgrade") + ret, log = self.do_refresh() + if ret != FIRMWARE_SUCCESS: + return ret, log + + msg = "all file upgrade success" + upgradedebuglog(msg) + return FIRMWARE_SUCCESS, SUCCUSS_FILE_SUMMARY + except Exception as e: + msg = "do dir upgrade exception happend. log: %s" % str(e) + upgradeerror(msg) + return ERR_FW_UPGRADE, msg + finally: + if match_zip_file_flag is True: + exec_os_cmd("rm -rf %s" % UPGRADE_FILE_DIR) + + def fw_upg(self, path, slot, upg_type): + print("+================================+") + print("| Doing upgrade, please wait... |") + ret, log = self.do_fw_upg(path, slot, upg_type) + if ret == FIRMWARE_SUCCESS: + print("| upgrade succeeded! |") + print("+================================+") + print(log) + sys.exit(0) + else: + print("| upgrade failed! |") + print("+================================+") + print("FAILED REASON:") + print("%s" % log) + sys.exit(1) + + +@click.group(cls=AliasedGroup, context_settings=CONTEXT_SETTINGS) +def main(): + '''upgrade script''' + + +# cold upgrade +@main.command() +@click.argument('file_name', required=True) +@click.argument('slot_num', required=False, default=None) +def cold(file_name, slot_num): + '''cold upgrade''' + fwupg = FwUpg() + fwupg.fw_upg(file_name, slot_num, COLD_UPGRADE) + + +# warm upgrade +@main.command() +@click.argument('file_name', required=True) +@click.argument('slot_num', required=False, default=None) +def warm(file_name, slot_num): + '''warm upgrade''' + fwupg = FwUpg() + fwupg.fw_upg(file_name, slot_num, WARM_UPGRADE) + + +# test upgrade +@main.command() +@click.argument('device', required=True) +@click.argument('slot_num', required=True) +def test(device, slot_num): + '''upgrade test''' + platform = BasePlatform() + platform.do_test_main(device, int(slot_num)) + + +# BMC upgrade +@main.command() +@click.argument('file_name', required=True) +@click.argument('chip_select', required=False, default="2") +@click.argument('erase_type', required=False, default="full") +def bmc(file_name, chip_select, erase_type): + '''BMC upgrade''' + platform = BasePlatform() + platform.do_bmc_upgrade_main(file_name, chip_select, erase_type) + + +if __name__ == '__main__': + signal_init() + debug_init() + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py b/platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py new file mode 100755 index 0000000000..69a310faa6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/script/warm_upgrade.py @@ -0,0 +1,514 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import sys +import os +import time +import syslog +import signal +import click +from platform_util import get_value, set_value, exec_os_cmd, exec_os_cmd_log +from platform_config import WARM_UPGRADE_PARAM + + +WARM_UPGRADE_DEBUG_FILE = "/etc/.warm_upgrade_debug_flag" + +WARMUPGRADEDEBUG = 1 + +debuglevel = 0 + +CONTEXT_SETTINGS = {"help_option_names": ['-h', '--help']} + + +class AliasedGroup(click.Group): + + def get_command(self, ctx, cmd_name): + rv = click.Group.get_command(self, ctx, cmd_name) + if rv is not None: + return rv + matches = [x for x in self.list_commands(ctx) + if x.startswith(cmd_name)] + if not matches: + return None + if len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: %s' % ', '.join(sorted(matches))) + return None + + +def debug_init(): + global debuglevel + if os.path.exists(WARM_UPGRADE_DEBUG_FILE): + debuglevel = debuglevel | WARMUPGRADEDEBUG + else: + debuglevel = debuglevel & ~(WARMUPGRADEDEBUG) + + +def warmupgradewarninglog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_WARNING, s) + + +def warmupgradecriticallog(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_CRIT, s) + + +def warmupgradeerror(s): + # s = s.decode('utf-8').encode('gb2312') + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_ERR, s) + + +def warmupgradedebuglog(s): + # s = s.decode('utf-8').encode('gb2312') + if WARMUPGRADEDEBUG & debuglevel: + syslog.openlog("WARMUPGRADE", syslog.LOG_PID) + syslog.syslog(syslog.LOG_DEBUG, s) + + +def subprocess_warm_upgrade(file, main_type, sub_type, slot): + command = "firmware_upgrade %s 0x%x 0x%x %s" % (file, main_type, sub_type, slot) + warmupgradedebuglog("warm upgrade firmware cmd:%s" % command) + if os.path.exists(WARM_UPGRADE_DEBUG_FILE): + return exec_os_cmd_log(command) + return exec_os_cmd(command) + + +def signal_init(): + signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl+c signal + signal.signal(signal.SIGTERM, signal.SIG_IGN) # ignore kill signal + signal.signal(signal.SIGTSTP, signal.SIG_IGN) # ignore ctrl+z signal + + +class RefreshUpgradeBase(object): + + def __init__(self, config, slot_num, devtype, subtype): + self._config = config + self._slot_num = slot_num + self._devtype = devtype + self._subtype = subtype + self.device_name = self._config.get("name", None) + self.refresh_file = self._config.get("refresh_file", None) + self.init_cmd_list = self._config.get("init_cmd", []) + self.save_set_reg_list = self._config.get("save_set_reg", []) + self.rw_recover_reg_list = self._config.get("rw_recover_reg", []) + self.after_upgrade_delay = self._config.get("after_upgrade_delay", None) + self.after_upgrade_delay_timeout = self._config.get("after_upgrade_delay_timeout", None) + self.refresh_finish_flag_check_config = self._config.get("refresh_finish_flag_check", None) + self.access_check_reg_config = self._config.get("access_check_reg", {}) + self.time_delay = 0 + self.finish_cmd_list = self._config.get("finish_cmd", []) + + def get_config(self): + pass + + def get_slot_num(self): + pass + + def save_value(self, cfg_list): + for config in cfg_list: + ret, val = get_value(config) + if ret: + config["value"] = val + else: + warmupgradeerror(val) + return False, val + return True, "save value success" + + def save_and_set_value(self, cfg_list): + for config in cfg_list: + ret, val = get_value(config) + if ret: + config["save_value"] = val + else: + warmupgradeerror(val) + return False, "get save value fail" + set_val = config.get("set_value", None) + if set_val is not None: + config["value"] = set_val + else: + warmupgradeerror("save_and_set_value lack of set_val config") + return False, "set value is not config" + ret, log = set_value(config) + if ret is False: + warmupgradeerror(log) + return False, log + return True, "save value success" + + def recover_value(self, cfg_list): + fail_flag = 0 + for config in cfg_list: + ret, log = set_value(config) + if ret is False: + fail_flag = -1 + warmupgradeerror("recover_value set_value failed, log: %s" % log) + if fail_flag != 0: + warmupgradeerror("recover_value write failed") + return False, "recover write failed" + return True, "recover write success" + + def recover_save_value(self, cfg_list): + total_err = 0 + for config in cfg_list: + val = config.get("save_value", None) + if val is None: + warmupgradeerror("recover_save_value lack of save_value config") + total_err -= 1 + continue + config["value"] = val + ret, log = set_value(config) + if ret is False: + total_err -= 1 + warmupgradeerror("recover save value write failed, log: %s" % log) + else: + warmupgradedebuglog("recover save value success") + if total_err < 0: + return False, "recover save value failed" + return True, "recover save value success" + + def do_fw_upg_init_cmd(self, init_cmd_list): + # pre operation + try: + for init_cmd_config in init_cmd_list: + ret, log = set_value(init_cmd_config) + if ret is False: + warmupgradeerror("%s do init cmd: %s failed, msg: %s" % (self.device_name, init_cmd_config, log)) + return False, log + msg = "%s warm upgrade init cmd all set success" % self.device_name + warmupgradedebuglog(msg) + return True, msg + except Exception as e: + return False, str(e) + + def do_fw_upg_finish_cmd(self, finish_cmd_list): + # end operation + total_err = 0 + for finish_cmd_config in finish_cmd_list: + ret_t, log = set_value(finish_cmd_config) + if ret_t is False: + warmupgradeerror("%s do finish cmd: %s failed, msg: %s" % (self.device_name, finish_cmd_config, log)) + total_err -= 1 + if total_err < 0: + msg = "%s warm upgrade finish cmd exec failed" % self.device_name + warmupgradeerror(msg) + return False, msg + msg = "%s warm upgrade finish cmd all set success" % self.device_name + warmupgradedebuglog(msg) + return True, msg + + def access_test(self, config): + # polling execute command + polling_cmd_list = config.get("polling_cmd", []) + for polling_cmd_config in polling_cmd_list: + ret, log = set_value(polling_cmd_config) + if ret is False: + warmupgradeerror(log) + return False + polling_delay = config.get("polling_delay", None) + if polling_delay is not None: + time.sleep(polling_delay) + + # record check val + check_val = config.get("value", None) + # write value + ret, log = set_value(config) + if ret is False: + warmupgradeerror(log) + return False + # read value + ret, val = get_value(config) + if ret is False: + warmupgradeerror(val) + return False + + # compare write and read val + warmupgradedebuglog("check_val:%s" % check_val) + warmupgradedebuglog("get_value:%s" % val) + if val != check_val: + warmupgradeerror("check_val:%s != get_value:%s" % (check_val, val)) + return False + return True + + def check_value(self, config): + # record check val + check_val = config.get("value", None) + ret, val = get_value(config) + if ret is False: + warmupgradeerror(val) + return False + # compare write and read val + warmupgradedebuglog("check_val:%s" % check_val) + warmupgradedebuglog("get_value:%s" % val) + if val != check_val: + warmupgradeerror("check_val:%s != get_value:%s" % (check_val, val)) + return False + return True + + def refresh_file_upgrade(self): + try: + warmupgradedebuglog("start %s warm upgrading" % self.device_name) + + # save and set reg + ret, log = self.save_and_set_value(self.save_set_reg_list) + if ret is False: + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s save and set reg cmd all set success" % self.device_name) + time.sleep(0.5) # delay 0.5s after execute save and set reg + + # pre operation + ret, log = self.do_fw_upg_init_cmd(self.init_cmd_list) + if ret is False: + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + time.sleep(0.5) # delay 0.5s after execute init_cmd + + # save reg + ret, log = self.save_value(self.rw_recover_reg_list) + if ret is False: + warmupgradeerror("%s save reg failed" % self.device_name) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s all reg save success" % self.device_name) + + # upgrade refresh file + if self.refresh_file is not None: + status, output = subprocess_warm_upgrade( + self.refresh_file, self._devtype, self._subtype, self._slot_num) + if status: + log = "%s refresh file upg failed, msg: %s" % (self.device_name, output) + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s refresh file upg success" % self.device_name) + + # delay the preset time after the upgrade is complete + if self.after_upgrade_delay is not None: + time.sleep(self.after_upgrade_delay) + + # check something in the timeout period + if self.after_upgrade_delay_timeout is not None: + while self.time_delay < self.after_upgrade_delay_timeout: + + # check refresh finish flag + if self.refresh_finish_flag_check_config is not None: + ret = self.check_value(self.refresh_finish_flag_check_config) + if ret is False: + time.sleep(1) + self.time_delay = self.time_delay + 1 + warmupgradedebuglog("doing refresh_finish_flag_check, time_delay:%s" % self.time_delay) + continue + warmupgradedebuglog("%s upgrade_finish_flag_check success. self.time_delay:%d" + % (self.device_name, self.time_delay)) + + # doing logic device rw access test + ret = self.access_test(self.access_check_reg_config) + if ret: + warmupgradedebuglog( + "%s rw test success. self.time_delay:%d" % + (self.device_name, self.time_delay)) + break + time.sleep(1) + self.time_delay = self.time_delay + 1 + warmupgradedebuglog("doing access_test, self.time_delay:%s" % self.time_delay) + + if self.time_delay >= self.after_upgrade_delay_timeout: + log = "wait %s access test timeout" % self.device_name + warmupgradeerror(log) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("%s access test success" % self.device_name) + + # recover reg + ret, log = self.recover_value(self.rw_recover_reg_list) + if ret is False: + warmupgradeerror("recover %s reg failed" % self.device_name) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + warmupgradedebuglog("recover %s reg success" % self.device_name) + # finally + ret1, log1 = self.recover_save_value(self.save_set_reg_list) + if ret1 is False: + warmupgradeerror("bmc upgrade recover save value failed, msg: %s" % log1) + ret2, log2 = self.do_fw_upg_finish_cmd(self.finish_cmd_list) + if ret2 is False: + warmupgradeerror("bmc upgrade do finish command failed, msg: %s" % log2) + if ret1 is False or ret2 is False: + return False, "upgrading %s recover save value or finish command failed" % self.device_name + return True, "upgrading %s success" % self.device_name + + except Exception as e: + log = "refresh file upgrade Exception happend, error log : %s" % str(e) + self.recover_save_value(self.save_set_reg_list) + self.do_fw_upg_finish_cmd(self.finish_cmd_list) + return False, log + + +class RefreshUpgrade(RefreshUpgradeBase): + + def __init__(self, config, slot_num, devtype, subtype): + super(RefreshUpgrade, self).__init__(config, slot_num, devtype, subtype) + + def get_config(self): + super(RefreshUpgrade, self).get_config() + return self._config + + def get_slot_num(self): + super(RefreshUpgrade, self).get_slot_num() + return self._slot_num + + +class WarmBasePlatform(): + + def __init__(self): + signal_init() + debug_init() + self.warm_upgrade_param = WARM_UPGRADE_PARAM.copy() + self.stop_services_cmd_list = self.warm_upgrade_param.get("stop_services_cmd", []) + self.start_services_cmd_list = self.warm_upgrade_param.get("start_services_cmd", []) + self.__warm_upgrade_config_list = [] + + def execute_command_list(self, cmd_list): + for cmd_item in cmd_list: + warmupgradedebuglog("execute cmd: %s" % cmd_item) + status, output = exec_os_cmd(cmd_item) + if status: + log = "execute %s failed, msg: %s" % (cmd_item, output) + warmupgradeerror(log) + return False, log + return True, "execute success" + + def stop_services_access(self): + return self.execute_command_list(self.stop_services_cmd_list) + + def start_services_access(self): + return self.execute_command_list(self.start_services_cmd_list) + + def check_slot_present(self, slot_present_config): + totalerr = 0 + presentbit = slot_present_config.get('presentbit') + ret, value = get_value(slot_present_config) + if ret is False: + return "NOT OK" + if isinstance(value, str): + val_t = int(value, 16) + else: + val_t = value + val_t = (val_t & (1 << presentbit)) >> presentbit + if val_t != slot_present_config.get('okval'): + status = "ABSENT" + else: + status = "PRESENT" + return status + + def linecard_present_check(self, slot_name, slot_present_config): + present_status = self.check_slot_present(slot_present_config) + present_status_tuple = ("ABSENT", "NOT OK") + if present_status in present_status_tuple: + return False, ("%s not present, warm upgrade exit" % slot_name) + warmupgradedebuglog("%s present" % slot_name) + return True, ("%s present" % slot_name) + + def start_warmupgrade(self): + try: + # start refresh file upgrade process + for dev in self.__warm_upgrade_config_list: + ret, log = dev.refresh_file_upgrade() + if ret is False: + return ret, log + return True, "all success" + except Exception as e: + log = "Exception happend, error log : %s" % str(e) + return False, log + + def do_warmupgrade(self, file, main_type, sub_type, slot, file_type, chain): + try: + # upgrade file existence check + if not os.path.isfile(file): + return False, "%s not found" % file + + # get slot config + slot_name = "slot%d" % slot + slot_config = self.warm_upgrade_param.get(slot_name, {}) + if len(slot_config) == 0: + return False, ("%s config not found" % slot_name) + + # linecard present check + slot_present_config = slot_config.get("present", {}) + if len(slot_present_config) != 0: + ret, log = self.linecard_present_check(slot_name, slot_present_config) + if ret is False: + return False, log + + # match file_type and chain_num get chain_config + file_type_config = slot_config.get(file_type, {}) + chain_name = "chain%d" % chain + chain_list = file_type_config.get(chain_name, []) + self.__warm_upgrade_config_list = [] + for refresh_config in chain_list: + # refresh_file existence check + refresh_file_judge_flag = refresh_config.get("refresh_file_judge_flag", 0) + if refresh_file_judge_flag == 1: + refresh_file = refresh_config.get("refresh_file", None) + if not os.path.isfile(refresh_file): + log = "%s not found" % refresh_file + return False, log + # each refresh_config add as an instance of RefreshUpgrade Class + refresh_instance = RefreshUpgrade(refresh_config, slot, main_type, sub_type) + self.__warm_upgrade_config_list.append(refresh_instance) + + ret, log = self.start_warmupgrade() + if ret is False: + warmupgradeerror("doing warm upgrade failed") + warmupgradeerror(log) + return ret, log + + except Exception as e: + log = "Exception happend, error log : %s" % str(e) + return False, log + return True, "all success" + + def do_warm_upgrade(self, file, main_type, sub_type, slot, file_type, chain): + print("+================================+") + print("|Begin warm upgrade, please wait..|") + ret, log = self.do_warmupgrade(file, main_type, sub_type, slot, file_type, chain) + if ret: + print("| warm upgrade succeeded! |") + print("+================================+") + sys.exit(0) + else: + print("| warm upgrade failed! |") + print("+================================+") + print("FAILED REASON:") + print("%s" % log) + sys.exit(1) + + +@click.group(invoke_without_command=True, context_settings=CONTEXT_SETTINGS) +@click.argument('file', required=True) +@click.argument('main_type', required=True) +@click.argument('sub_type', required=True) +@click.argument('slot', required=True) +@click.argument('file_type', required=True) +@click.argument('chain', required=True) +def main(file, main_type, sub_type, slot, file_type, chain): + '''warm upgrade''' + signal_init() + debug_init() + platform = WarmBasePlatform() + platform.do_warm_upgrade(file, int(main_type, 16), int(sub_type, 16), int(slot), file_type, int(chain)) + + +# warm upgrade +if __name__ == '__main__': + main() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service b/platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service deleted file mode 100755 index 136034900a..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/common/service/device_i2c.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description= ragile Global Initialize I2c drivers. -After=pddf-platform-init.service -Before=pmon.service -DefaultDependencies=no - -[Service] -Type=oneshot -ExecStart=/usr/local/bin/device_i2c.py start -ExecStop=/usr/local/bin/device_i2c.py stop -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target - diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service new file mode 100644 index 0000000000..08a49d695c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_driver.service @@ -0,0 +1,15 @@ +[Unit] +Description= Global Initialize platform drivers. +After=local-fs.target +Before=pmon.service platform_process.service +#DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_driver.py start +ExecStop=/usr/local/bin/platform_driver.py stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service new file mode 100644 index 0000000000..1ef2461563 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/service/platform_process.service @@ -0,0 +1,16 @@ +[Unit] +Description= Global Load process. +After=platform_driver.service +Before=determine-reboot-cause.service +Requires=platform_driver.service +#DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_process.py start +ExecStop=/usr/local/bin/platform_process.py stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py new file mode 100644 index 0000000000..b70995a582 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis", "sfp", "eeprom", "component", "thermal", "psu", "fan", "fan_drawer", "watchdog"] +from . import platform diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py new file mode 100644 index 0000000000..b0ddc8691f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/chassis.py @@ -0,0 +1,530 @@ +#!/usr/bin/env python3 + +############################################################################# +# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import time + import sys + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp + from sonic_platform.psu import Psu + # from sonic_platform.fan import Fan + from sonic_platform.fan_drawer import FanDrawer + from sonic_platform.thermal import Thermal + # from sonic_platform.watchdog import Watchdog + from sonic_platform.component import Component + from sonic_platform.eeprom import Eeprom + from sonic_platform.dcdc import Dcdc + from plat_hal.baseutil import baseutil + + from plat_hal.interface import interface + +except ImportError as error: + raise ImportError(str(error) + "- required module not found")from error + + +class Chassis(ChassisBase): + """ + Platform-specific Chassis class + """ + # List of Dcdc objects representing all dcdc + # available on the chassis + _dcdc_list = None + + STATUS_INSERTED = "1" + STATUS_REMOVED = "0" + STATUS_NORMAL = "0" + STATUS_ABNORMAL = "1" + sfp_present_dict = {} + fan_present_dict = {} + voltage_status_dict = {} + + def __init__(self): + ChassisBase.__init__(self) + self._dcdc_list = [] + self.int_case = interface() + # Initialize SFP list + + # sfp.py will read eeprom contents and retrive the eeprom data. + # It will also provide support sfp controls like reset and setting + # low power mode. + # We pass the eeprom path and sfp control path from chassis.py + # So that sfp.py implementation can be generic to all platforms + try: + self._sfp_list = [] + self.port_num = baseutil.get_config().get("sfps", None).get("port_num", 0) + self.port_start_index = baseutil.get_config().get("sfps", None).get("port_index_start", 0) + # fix problem with first index is 1, we add a fake sfp node + if self.port_start_index == 1: + self._sfp_list.append(Sfp(1)) + + # sfp id always start at 1 + for index in range(1, self.port_num + 1): + self._sfp_list.append(Sfp(index)) + + for i in range(self.port_start_index, self.port_start_index + self.port_num): + self.sfp_present_dict[i] = self.STATUS_REMOVED + + except Exception as err: + print("SFP init error: %s" % str(err)) + + try: + self._eeprom = Eeprom(self.int_case) + except Exception as err: + print("EEPROM INIT ERROR %s" % str(err)) + + # Initialize watchdog + # self._watchdog = Watchdog() + fantray_num = self.int_case.get_fan_total_number() + for index in range(fantray_num): + fandrawer = FanDrawer(self.int_case, index + 1) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) + + psu_num = self.int_case.get_psu_total_number() + for index in range(psu_num): + psuobj = Psu(self.int_case, index + 1) + self._psu_list.append(psuobj) + + thermal_num = self.int_case.get_temp_id_number() + for index in range(thermal_num): + thermalobj = Thermal(self.int_case, index + 1) + self._thermal_list.append(thermalobj) + + component_num = self.int_case.get_cpld_total_number() + for index in range(component_num): + componentobj = Component(self.int_case, index + 1) + self._component_list.append(componentobj) + + dcdc_num = self.int_case.get_dcdc_total_number() + for index in range(dcdc_num): + dcdcobj = Dcdc(self.int_case, index + 1) + self._dcdc_list.append(dcdcobj) + + def get_name(self): + """ + Retrieves the name of the chassis + Returns: + string: The name of the chassis + """ + name = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + name = sys_eeprom.modelstr(e) + if name is None: + return '' + return name + + def get_presence(self): + """ + Retrieves the presence of the chassis + Returns: + bool: True if chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the chassis + Returns: + string: Model/part number of chassis + """ + model = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + model = sys_eeprom.modelnumber(e) + if model is None: + return '' + return model + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + + Returns: + A string containing the hardware serial number for this chassis. + """ + serial_number = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + serial_number = sys_eeprom.serial_number_str(e) + if serial_number is None: + return '' + + return serial_number + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + device_version = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + device_version = sys_eeprom.deviceversion(e) + if device_version is None: + return '' + + return device_version + + def get_serial(self): + """ + Retrieves the serial number of the chassis (Service tag) + Returns: + string: Serial number of chassis + """ + return self.get_serial_number() + + def get_status(self): + """ + Retrieves the operational status of the chassis + Returns: + bool: A boolean value, True if chassis is operating properly + False if not + """ + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def initizalize_system_led(self): + return True + + def set_status_led(self, color): + return False + + def get_status_led(self): + """ + Gets the state of the system LED + + Returns: + A string, one of the valid LED color strings which could be vendor + specified. + """ + ret, color = self.int_case.get_led_color_by_type('SYS_LED') + if ret is True: + return color + return 'N/A' + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + base_mac = '' + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return '' + + e = sys_eeprom.read_eeprom() + base_mac = sys_eeprom.base_mac_addr(e) + if base_mac is None: + return '' + + return base_mac.upper() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + Ex. { '0x21':'AG9064', '0x22':'V1.0', '0x23':'AG9064-0109867821', + '0x24':'001c0f000fcd0a', '0x25':'02/03/2018 16:22:00', + '0x26':'01', '0x27':'REV01', '0x28':'AG9064-C2358-16G'} + """ + sys_eeprom = self.get_eeprom() + if sys_eeprom is None: + return {} + return sys_eeprom.system_eeprom_info() + + def get_thermal_manager(self): + """ + Retrieves thermal manager class on this chassis + :return: A class derived from ThermalManagerBase representing the + specified thermal manager. ThermalManagerBase is returned as default + """ + return False + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + reboot_cause_msg = self.int_case.get_cpu_reboot_cause() + if "Power Loss" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_POWER_LOSS + elif "Watchdog" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_WATCHDOG + elif "BMC reboot" in reboot_cause_msg or "BMC powerdown" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_HARDWARE_OTHER + elif "Thermal Overload: ASIC" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC + elif "Thermal Overload: Other" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_THERMAL_OVERLOAD_OTHER + elif "Other" in reboot_cause_msg: + reboot_cause_type = self.REBOOT_CAUSE_NON_HARDWARE + else: + reboot_cause_type = self.REBOOT_CAUSE_NON_HARDWARE + return (reboot_cause_type, reboot_cause_msg) + + def get_module(self, index): + """ + Retrieves module represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the module to + retrieve + + Returns: + An object dervied from ModuleBase representing the specified + module + """ + module = None + + try: + if self.get_num_modules(): + module = self._module_list[index] + except IndexError: + sys.stderr.write("Module index {} out of range (0-{})\n".format( + index, len(self._module_list) - 1)) + + return module + + def get_fan_drawer(self, index): + """ + Retrieves fan drawers represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the fan drawer to + retrieve + + Returns: + An object dervied from FanDrawerBase representing the specified fan + drawer + """ + fan_drawer = None + + try: + if self.get_num_fan_drawers(): + fan_drawer = self._fan_drawer_list[index] + except IndexError: + sys.stderr.write("Fan drawer index {} out of range (0-{})\n".format( + index, len(self._fan_drawer_list) - 1)) + + return fan_drawer + + def get_change_event(self, timeout=0): + """ + Returns a nested dictionary containing all devices which have + experienced a change at chassis level + + Args: + timeout: Timeout in milliseconds (optional). If timeout == 0, + this method will block until a change is detected. + + Returns: + (bool, dict): + - bool: True if call successful, False if not; + - dict: A nested dictionary where key is a device type, + value is a dictionary with key:value pairs in the format of + {'device_id':'device_event'}, where device_id is the device ID + for this device and device_event. + The known devices's device_id and device_event was defined as table below. + ----------------------------------------------------------------- + device | device_id | device_event | annotate + ----------------------------------------------------------------- + 'fan' '' '0' Fan removed + '1' Fan inserted + + 'sfp' '' '0' Sfp removed + '1' Sfp inserted + '2' I2C bus stuck + '3' Bad eeprom + '4' Unsupported cable + '5' High Temperature + '6' Bad cable + + 'voltage' '' '0' Vout normal + '1' Vout abnormal + -------------------------------------------------------------------- + Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0', '12':'1'}, + 'voltage':{'U20':'0', 'U21':'1'}} + Indicates that: + fan 0 has been removed, fan 2 has been inserted. + sfp 11 has been removed, sfp 12 has been inserted. + monitored voltage U20 became normal, voltage U21 became abnormal. + Note: For sfp, when event 3-6 happened, the module will not be avalaible, + XCVRD shall stop to read eeprom before SFP recovered from error status. + """ + + change_event_dict = {"fan": {}, "sfp": {}, "voltage": {}} + + start_time = time.time() + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print("get_change_event:Invalid timeout value: %s" % timeout) + return False, change_event_dict + + end_time = start_time + timeout + if start_time > end_time: + print("get_change_event:time wrap / invalid timeout value: %s" % timeout) + return False, change_event_dict # Time wrap or possibly incorrect timeout + try: + while timeout >= 0: + # check for sfp + sfp_change_dict = self.get_transceiver_change_event() + # check for fan + fan_change_dict = self.get_fan_change_event() + # check for voltage + voltage_change_dict = self.get_voltage_change_event() + + if sfp_change_dict or fan_change_dict or voltage_change_dict: + change_event_dict["sfp"] = sfp_change_dict + change_event_dict["fan"] = fan_change_dict + change_event_dict["voltage"] = voltage_change_dict + return True, change_event_dict + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, change_event_dict + except Exception as e: + print(e) + print("get_change_event: Should not reach here.") + return False, change_event_dict + + def get_transceiver_change_event(self): + current_sfp_present_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for i in range(self.port_start_index, self.port_start_index + self.port_num): + sfp = self._sfp_list[i] + if sfp.get_presence(): + current_sfp_present_dict[i] = self.STATUS_INSERTED + + else: + current_sfp_present_dict[i] = self.STATUS_REMOVED + + # Update reg value + if current_sfp_present_dict == self.sfp_present_dict: + return ret_dict + + for index, status in current_sfp_present_dict.items(): + if self.sfp_present_dict[index] != status: + ret_dict[index] = status + + self.sfp_present_dict = current_sfp_present_dict + + return ret_dict + + def get_fan_change_event(self): + current_fan_present_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index, fan in enumerate(self._fan_list): + if fan.get_presence() is True: + current_fan_present_dict[index] = self.STATUS_INSERTED + else: + current_fan_present_dict[index] = self.STATUS_REMOVED + + if len(self.fan_present_dict) == 0: # first time + self.fan_present_dict = current_fan_present_dict + return {} + + if current_fan_present_dict == self.fan_present_dict: + return {} + + # updated fan_present_dict + for index, status in current_fan_present_dict.items(): + if self.fan_present_dict[index] != status: + ret_dict[str(index)] = status + self.fan_present_dict = current_fan_present_dict + return ret_dict + + def get_voltage_change_event(self): + current_voltage_status_dict = {} + ret_dict = {} + + # Check for OIR events and return ret_dict + for index, dcdc in enumerate(self._dcdc_list): + name = dcdc.get_name() + value = dcdc.get_value() + high = dcdc.get_high_threshold() + low = dcdc.get_low_threshold() + if (value is None) or (value > high) or (value < low): + current_voltage_status_dict[name] = self.STATUS_ABNORMAL + else: + current_voltage_status_dict[name] = self.STATUS_NORMAL + + if len(self.voltage_status_dict) == 0: # first time + self.voltage_status_dict = current_voltage_status_dict + return {} + + if current_voltage_status_dict == self.voltage_status_dict: + return {} + + # updated voltage_status_dict + for name, status in current_voltage_status_dict.items(): + if self.voltage_status_dict[name] != status: + ret_dict[name] = status + self.voltage_status_dict = current_voltage_status_dict + return ret_dict + + diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py new file mode 100644 index 0000000000..fa674a98a6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/component.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in +# the platform +# +######################################################################## + +try: + import time + import subprocess + import os + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +FIRMWARE_UPDATE_DIR = "/tmp/.firmwareupdate/" + +class Component(ComponentBase): + """Platform-specific Component class""" + + def __init__(self, interface_obj, index): + self.cpld_dict = {} + self.int_case = interface_obj + self.index = index + self.update_time = 0 + self.cpld_id = "CPLD" + str(index) + + def cpld_dict_update(self): + local_time = time.time() + if not self.cpld_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.cpld_dict = self.int_case.get_cpld_version_by_id(self.cpld_id) + + def get_slot(self): + self.cpld_dict_update() + return self.cpld_dict["Slot"] + + def get_warm_upgrade_flag(self): + self.cpld_dict_update() + return self.cpld_dict["Warm"] + + def get_name(self): + """ + Retrieves the name of the component + + Returns: + A string containing the name of the component + """ + self.cpld_dict_update() + return self.cpld_dict["Name"] + + def get_description(self): + """ + Retrieves the description of the component + + Returns: + A string containing the description of the component + """ + self.cpld_dict_update() + return self.cpld_dict["Desc"] + + def get_firmware_version(self): + """ + Retrieves the firmware version of the component + + Note: the firmware version will be read from HW + + Returns: + A string containing the firmware version of the component + """ + self.cpld_dict_update() + return self.cpld_dict["Version"] + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + + Note: the firmware version will be read from image + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the available firmware version of the component + """ + raise NotImplementedError + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + + Args: + image_path: A string, path to firmware image + + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return None + + def install_firmware(self, image_path): + """ + Installs firmware to the component + + This API performs firmware installation only: this may/may not be the same as firmware update. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this must be done manually by user + + Note: in case immediate actions are required to complete the component firmware update + (e.g., reboot, power cycle, etc.) - will be done automatically by API and no return value provided + + Args: + image_path: A string, path to firmware image + + Returns: + A boolean, True if install was successful, False if not + """ + if not os.path.isfile(image_path): + print("ERROR: %s not found" % image_path) + return False + cmdstr = "upgrade.py cold %s %d" % (image_path, self.get_slot()) + status, output = subprocess.getstatusoutput(cmdstr) + if status == 0: + print("INFO: %s firmware install succeeded" % self.get_name()) + return True + print("%s install failed. status:%d, output:\n%s" % (self.get_name(), status, output)) + return False + + def update_firmware(self, image_path): + """ + Updates firmware of the component + + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + + Args: + image_path: A string, path to firmware image + + Raises: + RuntimeError: update failed + """ + if not os.path.isfile(image_path): + raise RuntimeError("ERROR: %s not found" % image_path) + + if self.get_warm_upgrade_flag() == 1: # use warm upgrade + cmdstr = "upgrade.py warm %s %d" % (image_path, self.get_slot()) + else: + cmdstr = "upgrade.py cold %s %d" % (image_path, self.get_slot()) + status, output = subprocess.getstatusoutput(cmdstr) + if status == 0: + if self.get_warm_upgrade_flag() != 1: # not support warm upgrade, need to cold reboot + print("INFO: %s firmware install succeeded" % self.get_name()) + print("INFO: please cold reboot to make the %s firmware up-to-date" % self.get_name()) + else: + print("INFO: %s firmware update succeeded" % self.get_name()) + print("INFO: %s firmware version up-to-date" % self.get_name()) + return None + raise RuntimeError(output) + + def auto_update_firmware(self, image_path, boot_type): + """ + Updates firmware of the component + + This API performs firmware update automatically based on boot_type: it assumes firmware installation + and/or creating a loading task during the reboot, if needed, in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically during the reboot. + The loading task will be created by API. + + Args: + image_path: A string, path to firmware image + boot_type: A string, reboot type following the upgrade + - none/fast/warm/cold + + Returns: + Output: A return code + return_code: An integer number, status of component firmware auto-update + - return code of a positive number indicates successful auto-update + - status_installed = 1 + - status_updated = 2 + - status_scheduled = 3 + - return_code of a negative number indicates failed auto-update + - status_err_boot_type = -1 + - status_err_image = -2 + - status_err_unknown = -3 + + Raises: + RuntimeError: auto-update failure cause + """ + if not os.path.isfile(image_path): + print("ERROR: %s not found" % image_path) + return -2 + + if not os.path.isdir(FIRMWARE_UPDATE_DIR): + os.mkdir(FIRMWARE_UPDATE_DIR) + + warm_upgrade_flag = self.get_warm_upgrade_flag() + file_name = os.path.basename(image_path) + file_path = os.path.join(FIRMWARE_UPDATE_DIR, file_name) + if os.path.exists(file_path): # firmware already update + if warm_upgrade_flag == 1: + print("INFO: %s firmware update succeeded, firmware version up-to-date" % self.get_name()) + return 2 + print("INFO: %s firmware install succeeded, please cold reboot to make it up-to-date" % self.get_name()) + return 1 + + if warm_upgrade_flag == 1: # use warm upgrade + cmdstr = "upgrade.py warm %s %d" % (image_path, self.get_slot()) + else: + cmdstr = "upgrade.py cold %s %d" % (image_path, self.get_slot()) + status, output = subprocess.getstatusoutput(cmdstr) + if status == 0: + os.mknod(file_path) + if warm_upgrade_flag == 1: + print("INFO: %s firmware update succeeded, firmware version up-to-date" % self.get_name()) + return 2 + print("INFO: %s firmware install succeeded, please cold reboot to make it up-to-date" % self.get_name()) + return 1 + print("%s update failed, status:%d, output:\n%s" % (self.get_name(), status, output)) + return -3 diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py new file mode 100644 index 0000000000..494d4aa610 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/dcdc.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## +import time + + +class Dcdc(object): + + def __init__(self, interface_obj, index): + self.dcdc_dict = {} + self.int_case = interface_obj + self.index = index + self.update_time = 0 + self.dcdc_id = "DCDC" + str(index) + + def dcdc_dict_update(self): + local_time = time.time() + if not self.dcdc_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.dcdc_dict = self.int_case.get_dcdc_by_id(self.dcdc_id) + + def get_name(self): + """ + Retrieves the name of the sensor + + Returns: + string: The name of the sensor + """ + self.dcdc_dict_update() + return self.dcdc_dict["Name"] + + def get_value(self): + """ + Retrieves current value reading from sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Value"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["High"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Low"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Max"] + if value is None: + value = 0 + return round(float(value), 3) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of sensor + """ + self.dcdc_dict_update() + value = self.dcdc_dict["Min"] + if value is None: + value = 0 + return round(float(value), 3) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py new file mode 100644 index 0000000000..05fcc3c256 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/eeprom.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +######################################################################## +# +# Module contains platform specific implementation of SONiC Platform +# Base API and provides the EEPROMs' information. +# +# The different EEPROMs available are as follows: +# - System EEPROM : Contains Serial number, Service tag, Base MA +# address, etc. in ONIE TlvInfo EEPROM format. +# - PSU EEPROM : Contains Serial number, Part number, Service Tag, +# PSU type, Revision. +# - Fan EEPROM : Contains Serial number, Part number, Service Tag, +# Fan type, Number of Fans in Fantray, Revision. +######################################################################## + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError as error: + raise ImportError(str(error) + "- required module not found") from error + + +class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, interface_obj): + self.int_case = interface_obj + self.name = "ONIE_E2" + + eeprom_path = self.int_case.get_onie_e2_path(self.name) + if eeprom_path is None: + raise ValueError("get eeprom path failed") + + super().__init__(eeprom_path, 0, "", True) + + def modelnumber(self, e): + ''' + Returns the value field of the model(part) number TLV as a string + ''' + (is_valid, t) = self.get_tlv_field(e, self._TLV_CODE_PART_NUMBER) + if not is_valid: + return super().part_number_str(e) + + return t[2].decode("ascii") + + def deviceversion(self, e): + ''' + Returns the value field of the Device Version as a string + ''' + (is_valid, t) = self.get_tlv_field(e, self._TLV_CODE_DEVICE_VERSION) + if not is_valid: + return "N/A" + + return str(ord(t[2])) + + def system_eeprom_info(self): + ''' + Retrieves the full content of system EEPROM information for the chassis + + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + Ex. { '0x21':'AG9064', '0x22':'V1.0', '0x23':'AG9064-0109867821', + '0x24':'001c0f000fcd0a', '0x25':'02/03/2018 16:22:00', + '0x26':'01', '0x27':'REV01', '0x28':'AG9064-C2358-16G'} + ''' + sys_eeprom_dict = {} + e = self.read_eeprom() + if self._TLV_HDR_ENABLED: + if not self.is_valid_tlvinfo_header(e): + return {} + total_len = (e[9] << 8) | e[10] + tlv_index = self._TLV_INFO_HDR_LEN + tlv_end = self._TLV_INFO_HDR_LEN + total_len + else: + tlv_index = self.eeprom_start + tlv_end = self._TLV_INFO_MAX_LEN + + while (tlv_index + 2) < len(e) and tlv_index < tlv_end: + if not self.is_valid_tlv(e[tlv_index:]): + break + + tlv = e[tlv_index:tlv_index + 2 + e[tlv_index + 1]] + code = "0x%02X" % tlv[0] + name, value = self.decoder(None, tlv) + sys_eeprom_dict[code] = value + + if e[tlv_index] == self._TLV_CODE_QUANTA_CRC or \ + e[tlv_index] == self._TLV_CODE_CRC_32: + break + tlv_index += e[tlv_index + 1] + 2 + + return sys_eeprom_dict diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py new file mode 100644 index 0000000000..9499e721a0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python3 +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fans' information which are available in the platform. +# +######################################################################## + +try: + import time + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, interface_obj, fantray_index, fan_index, psu_fan=False, psu_index=0): + self.fan_dict = {} + self.int_case = interface_obj + self.fantray_index = fantray_index + self.fan_index = fan_index + self.psu_index = psu_index + self.is_psu_fan = psu_fan + self.update_time = 0 + if not self.is_psu_fan: + self.name = "FAN" + str(fantray_index) + else: + self.name = "PSU" + str(psu_index) + + def fan_dict_update(self): + local_time = time.time() + if not self.fan_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + if not self.is_psu_fan: + self.fan_dict = self.int_case.get_fan_info(self.name) + else: + self.fan_dict = self.int_case.get_psu_fru_info(self.name) + + def get_name(self): + """ + Retrieves the fan name + Returns: + string: The name of the device + """ + if not self.is_psu_fan: + return "Fantray{}_{}".format(self.fantray_index, self.fan_index) + return "PSU{}_FAN{}".format(self.psu_index, self.fan_index) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + string: Part number of FAN + """ + if not self.is_psu_fan: + self.fan_dict_update() + return self.fan_dict["NAME"] + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + string: Serial number of FAN + """ + if not self.is_psu_fan: + self.fan_dict_update() + return self.fan_dict["SN"] + return 'N/A' + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + if not self.is_psu_fan: + return self.int_case.get_fan_presence(self.name) + return self.int_case.get_psu_presence(self.name) + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + if not self.get_presence(): + return False + + if not self.is_psu_fan: + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor pwm + rotor_name = "Rotor" + str(self.fan_index) + value = fan_dir[rotor_name]["Speed"] + min_speed = fan_dir[rotor_name]["SpeedMin"] + max_speed = fan_dir[rotor_name]["SpeedMax"] + tolerance = fan_dir[rotor_name]["Tolerance"] + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + value = psu_status_dict["FanSpeed"]["Value"] + min_speed = psu_status_dict["FanSpeed"]["Min"] + max_speed = psu_status_dict["FanSpeed"]["Max"] + tolerance = psu_status_dict["FanSpeed"]["Tolerance"] + + if isinstance(tolerance, str) or tolerance is None: + tolerance = 30 + + if isinstance(value, str) or value is None: + return False + + if value < min_speed: + return False + + speed = int(value * 100 / max_speed) + if speed > 100: + speed = 100 + elif speed < 0: + speed = 0 + target = self.get_target_speed() + + if (speed - target) > target * tolerance / 100: + return False + if (target - speed) > target * tolerance / 100: + return False + + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_direction(self): + """ + Retrieves the fan airflow direction + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + + Notes: + - Forward/Exhaust : Air flows from Port side to Fan side. + - Reverse/Intake : Air flows from Fan side to Port side. + """ + self.fan_dict_update() + air_flow = self.fan_dict["AirFlow"] + if air_flow is not None: + return air_flow + return self.FAN_DIRECTION_NOT_APPLICABLE + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if not self.get_presence(): + return 0 + + if not self.is_psu_fan: + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor pwm + rotor_name = "Rotor" + str(self.fan_index) + value = fan_dir[rotor_name]["Speed"] + max_speed = fan_dir[rotor_name]["SpeedMax"] + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + value = psu_status_dict["FanSpeed"]["Value"] + max_speed = psu_status_dict["FanSpeed"]["Max"] + + if isinstance(value, str) or value is None: + return 0 + pwm = value * 100 / max_speed + if pwm > 100: + pwm = 100 + elif pwm < 0: + pwm = 0 + return int(pwm) + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + # The default tolerance value is fixed as 30% + if not self.is_psu_fan: + fan_dir = {} + fan_dir = self.int_case.get_fan_info_rotor(self.name) + # get fan rotor tolerance + rotor_name = "Rotor" + str(self.fan_index) + tolerance = fan_dir[rotor_name]["Tolerance"] + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + tolerance = psu_status_dict["FanSpeed"]["Tolerance"] + + if isinstance(tolerance, str) or tolerance is None: + return 30 + return tolerance + + def fan_set_speed_pwm(self, pwm): + status = self.int_case.set_fan_speed_pwm(self.name, self.fan_index, pwm) + if status == -1: + return False + return True + + def set_speed(self, speed): + """ + Set fan speed to expected value + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + bool: True if set success, False if fail. + """ + if not self.is_psu_fan: + return self.fan_set_speed_pwm(speed) + return self.int_case.set_psu_fan_speed_pwm(self.name, int(speed)) + + def set_status_led(self, color): + """ + Set led to expected color + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if set success, False if fail. + """ + # not supported + return False + + def get_status_led(self): + """ + Gets the state of the Fan status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + if self.is_psu_fan: + # No LED available for PSU Fan + return 'N/A' + + if not self.get_presence(): + return 'N/A' + + ret, color = self.int_case.get_fan_led(self.name) + if ret is True: + return color + return 'N/A' + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if not self.is_psu_fan: + # get fan rotor pwm + pwm = int(self.int_case.get_fan_speed_pwm(self.name, self.fan_index)) + else: + psu_status_dict = self.int_case.get_psu_status(self.name) + if psu_status_dict["InputStatus"] is False: + pwm = 0 + else: + pwm = self.get_speed() # target equal to real pwm, to avoid alarm + return int(pwm) + + def get_vendor(self): + """ + Retrieves the vendor name of the fan + + Returns: + string: Vendor name of fan + """ + if not self.is_psu_fan: + return "WB" + return 'N/A' + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + if not self.is_psu_fan: + self.fan_dict_update() + return self.fan_dict["HW"] + return 'N/A' diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py new file mode 100644 index 0000000000..f0b0396481 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/fan_drawer.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +# +# fan_drawer_base.py +# +# Abstract base class for implementing a platform-specific class with which +# to interact with a fan drawer module in SONiC +# + +try: + import time + from sonic_platform_base.fan_drawer_base import FanDrawerBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class FanDrawer(FanDrawerBase): + """ + Abstract base class for interfacing with a fan drawer + """ + # Device type definition. Note, this is a constant. + DEVICE_TYPE = "fan_drawer" + + def __init__(self, interface_obj, fantray_index): + FanDrawerBase.__init__(self) + self.fantray_dict = {} + self.fantray_update_time = 0 + self.fantray_index = fantray_index + self.int_case = interface_obj + self.fantrayname = "FAN" + str(fantray_index) + self.num_fans_per_fantray = self.int_case.get_fan_rotor_number(self.fantrayname) + for i in range(self.num_fans_per_fantray): + self._fan_list.append(Fan(interface_obj, fantray_index, i + 1)) + + def fantray_dict_update(self): + local_time = time.time() + # update data every 1 seconds + if not self.fantray_dict or (local_time - self.fantray_update_time) >= 1: + self.fantray_update_time = local_time + self.fantray_dict = self.int_case.get_fan_info(self.fantrayname) + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return "Fantray{}".format(self.fantray_index) + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if fan is present, False if not + """ + return self.int_case.get_fan_presence(self.fantrayname) + + def get_model(self): + """ + Retrieves the part number of the FAN + Returns: + string: Part number of FAN + """ + self.fantray_dict_update() + return self.fantray_dict["NAME"] + + def get_serial(self): + """ + Retrieves the serial number of the FAN + Returns: + string: Serial number of FAN + """ + self.fantray_dict_update() + return self.fantray_dict["SN"] + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + self.fantray_dict_update() + return self.fantray_dict["HW"] + + def get_status(self): + """ + Retrieves the operational status of the FAN + Returns: + bool: True if FAN is operating properly, False if not + """ + for i in range(self.num_fans_per_fantray): + if self._fan_list[i].get_status() is False: + return False + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_num_fans(self): + """ + Retrieves the number of fans available on this fan drawer + Returns: + An integer, the number of fan modules available on this fan drawer + """ + return len(self._fan_list) + + def get_all_fans(self): + """ + Retrieves all fan modules available on this fan drawer + Returns: + A list of objects derived from FanBase representing all fan + modules available on this fan drawer + """ + return self._fan_list + + def set_status_led(self, color): + """ + Sets the state of the fan drawer status LED + Args: + color: A string representing the color with which to set the + fan drawer status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + # not supported + return False + + def get_status_led(self): + """ + Gets the state of the Fan status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + if not self.get_presence(): + return 'N/A' + + ret, color = self.int_case.get_fan_led(self.fantrayname) + if ret is True: + return color + return 'N/A' + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + + Returns: + A float, with value of the maximum consumable power of the + component. + """ + self.fantray_dict_update() + return self.fantray_dict["PowerMax"] diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py new file mode 100644 index 0000000000..8ea66f339e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/pcie.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +######################################################################## +# +# Module contains a platform specific implementation of SONiC Platform +# Base PCIe class +# +######################################################################## + +try: + from sonic_platform_base.sonic_pcie.pcie_common import PcieUtil +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Pcie(PcieUtil): + """Platform-specific Pcie class""" + + def __init__(self, platform_path): + PcieUtil.__init__(self, platform_path) diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/platform.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/platform.py similarity index 50% rename from platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/platform.py rename to platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/platform.py index 6ff9446b95..4d6fe03d93 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/platform.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/platform.py @@ -1,22 +1,24 @@ +#!/usr/bin/env python3 + ############################################################################# -# PDDF +# # Module contains an implementation of SONiC Platform Base API and # provides the platform information # ############################################################################# try: - from sonic_platform_pddf_base.pddf_platform import PddfPlatform + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis except ImportError as e: - raise ImportError(str(e) + "- required module not found") + raise ImportError(str(e) + "- required module not found") from e -class Platform(PddfPlatform): +class Platform(PlatformBase): """ - PDDF Platform-Specific Platform Class + Platform-specific class """ def __init__(self): - PddfPlatform.__init__(self) - - # Provide the functions/variables below for which implementation is to be overwritten + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py new file mode 100644 index 0000000000..a9f7e87d20 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/psu.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python3 +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSUs' information which are available in the platform +# +######################################################################## + + +try: + import time + from sonic_platform_base.psu_base import PsuBase + from sonic_platform.fan import Fan +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Psu(PsuBase): + """Platform-specific PSU class""" + + def __init__(self, interface_obj, index): + self.psu_dict = {} + self.psu_status_dict = {} + self.psu_power_dict = {} + self._fan_list = [] + self._thermal_list = [] + self.int_case = interface_obj + self.index = index + self.name = "PSU" + str(index) + + self.psu_dict_update_time = 0 + self.psu_status_dict_update_time = 0 + self.psu_power_dict_update_time = 0 + + self._fan_list.append(Fan(self.int_case, 1, 1, psu_fan=True, psu_index=index)) + + def psu_dict_update(self): + local_time = time.time() + if not self.psu_dict or (local_time - self.psu_dict_update_time) >= 1: # update data every 1 seconds + self.psu_dict_update_time = local_time + self.psu_dict = self.int_case.get_psu_fru_info(self.name) + + def psu_status_dict_update(self): + local_time = time.time() + if not self.psu_status_dict or ( + local_time - self.psu_status_dict_update_time) >= 1: # update data every 1 seconds + self.psu_status_dict_update_time = local_time + self.psu_status_dict = self.int_case.get_psu_status(self.name) + + def psu_power_dict_update(self): + local_time = time.time() + if not self.psu_power_dict or ( + local_time - self.psu_power_dict_update_time) >= 1: # update data every 1 seconds + self.psu_power_dict_update_time = local_time + self.psu_power_dict = self.int_case.get_psu_power_status(self.name) + + def get_name(self): + """ + Retrieves the name of the device + + Returns: + string: The name of the device + """ + return "Psu{}".format(self.index) + + def get_presence(self): + """ + Retrieves the presence of the Power Supply Unit (PSU) + + Returns: + bool: True if PSU is present, False if not + """ + return self.int_case.get_psu_presence(self.name) + + def get_model(self): + """ + Retrieves the part number of the PSU + + Returns: + string: Part number of PSU + """ + self.psu_dict_update() + return self.psu_dict["DisplayName"] + + def get_serial(self): + """ + Retrieves the serial number of the PSU + + Returns: + string: Serial number of PSU + """ + self.psu_dict_update() + return self.psu_dict["SN"] + + def get_status(self): + """ + Retrieves the operational status of the PSU + + Returns: + bool: True if PSU is operating properly, False if not + """ + return self.int_case.get_psu_input_output_status(self.name) + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_voltage(self): + """ + Retrieves current PSU voltage output + + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Voltage"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + + Returns: + A float number, electric current in amperes, + e.g. 15.4 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Current"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_power(self): + """ + Retrieves current energy supplied by PSU + + Returns: + A float number, the power in watts, + e.g. 302.6 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Power"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + + Returns: + A boolean, True if PSU has stablized its output voltages and + passed all its internal self-tests, False if not. + """ + return self.int_case.get_psu_input_output_status(self.name) + + def get_status_led(self): + """ + Gets the state of the PSU status LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + if not self.get_presence(): + return "N/A" + if self.int_case.get_psu_input_output_status(self.name): + return self.STATUS_LED_COLOR_GREEN + return self.STATUS_LED_COLOR_RED + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the + PSU status LED + Returns: + bool: True if status LED state is set successfully, False if + not + """ + # not supported + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + self.psu_status_dict_update() + value = self.psu_status_dict["Temperature"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.psu_status_dict_update() + value = self.psu_status_dict["Temperature"]["Max"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Voltage"]["HighAlarm"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + self.psu_power_dict_update() + value = self.psu_power_dict["Outputs"]["Voltage"]["LowAlarm"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_input_voltage(self): + """ + Get the input voltage of the PSU + + Returns: + A float number, the input voltage in volts, + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Inputs"]["Voltage"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_input_current(self): + """ + Get the input electric current of the PSU + + Returns: + A float number, the input current in amperes, e.g 220.3 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Inputs"]["Current"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_input_power(self): + """ + Get the input current energy of the PSU + + Returns: + A float number, the input power in watts, e.g. 302.6 + """ + self.psu_status_dict_update() + if self.psu_status_dict["InputStatus"] is False: + value = 0 + else: + self.psu_power_dict_update() + value = self.psu_power_dict["Inputs"]["Power"]["Value"] + if value is None: + value = 0 + return round(float(value), 1) + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + self.psu_dict_update() + return self.psu_dict["HW"] + + def get_vendor(self): + """ + Retrieves the vendor name of the psu + + Returns: + string: Vendor name of psu + """ + self.psu_dict_update() + return self.psu_dict["VENDOR"] + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return False + + def get_thermal(self, index): + """ + Retrieves thermal unit represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the thermal to + retrieve + + Returns: + An object dervied from ThermalBase representing the specified thermal + """ + return False diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/sfp.py similarity index 74% rename from platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp.py rename to platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/sfp.py index c1d4cb998a..4667d3efcd 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp.py +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/sfp.py @@ -27,10 +27,10 @@ # } # } # } -# ver 2.0 - rg_plat: -# "presence_path": "/xx/rg_plat/xx[port_id]/present" +# ver 2.0 - wb_plat: +# "presence_path": "/xx/wb_plat/xx[port_id]/present" # "eeprom_path": "/sys/bus/i2c/devices/i2c-[bus]/[bus]-0050/eeprom" -# "reset_path": "/xx/rg_plat/xx[port_id]/reset" +# "reset_path": "/xx/wb_plat/xx[port_id]/reset" ############################################################################# import sys import time @@ -38,52 +38,21 @@ import syslog import traceback from abc import abstractmethod +configfile_pre = "/usr/local/bin/" +sys.path.append(configfile_pre) + try: - import os + from platform_intf import * from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase - from .sfp_config import * + from plat_hal.baseutil import baseutil -except ImportError as e: - raise ImportError (str(e) + "- required module not found") +except ImportError as error: + raise ImportError(str(error) + "- required module not found") from error -LOG_DEBUG_LEVEL = 1 -LOG_WARNING_LEVEL = 2 -LOG_ERROR_LEVEL = 3 +LOG_DEBUG_LEVEL = 1 +LOG_WARNING_LEVEL = 2 +LOG_ERROR_LEVEL = 3 -CONFIG_DB_PATH = "/etc/sonic/config_db.json" - -def getonieplatform(path): - if not os.path.isfile(path): - return "" - machine_vars = {} - with open(path) as machine_file: - for line in machine_file: - tokens = line.split('=') - if len(tokens) < 2: - continue - machine_vars[tokens[0]] = tokens[1].strip() - return machine_vars.get("onie_platform") - -def getplatform_config_db(): - if not os.path.isfile(CONFIG_DB_PATH): - return "" - val = os.popen("sonic-cfggen -j %s -v DEVICE_METADATA.localhost.platform" % CONFIG_DB_PATH).read().strip() - if len(val) <= 0: - return "" - else: - return val - -def getplatform_name(): - if os.path.isfile('/host/machine.conf'): - return getonieplatform('/host/machine.conf') - elif os.path.isfile('/usr/share/sonic/hwsku/machine.conf'): - return getonieplatform('/usr/share/sonic/hwsku/machine.conf') - else: - return getplatform_config_db() - -def get_sfp_config(): - dev = getplatform_name() - return cust_sfp_cfg.get(dev, None) class Sfp(SfpOptoeBase): @@ -92,10 +61,10 @@ class Sfp(SfpOptoeBase): OPTOE_DRV_TYPE3 = 3 # index must start at 1 - def __init__(self, index, a=None, b=None): + def __init__(self, index): SfpOptoeBase.__init__(self) self.sfp_type = None - sfp_config = get_sfp_config() + sfp_config = baseutil.get_config().get("sfps", None) self.log_level_config = sfp_config.get("log_level", LOG_WARNING_LEVEL) # Init instance of SfpCust ver = sfp_config.get("ver", None) @@ -127,9 +96,10 @@ class Sfp(SfpOptoeBase): try: if transceiver_info["vendor_rev"] is not None: transceiver_info["hardware_rev"] = transceiver_info["vendor_rev"] - return transceiver_info - except Exception as e: + except BaseException: print(traceback.format_exc()) + return None + return transceiver_info def reset(self): if self.get_presence() is False: @@ -161,7 +131,7 @@ class Sfp(SfpOptoeBase): self._sfplog(LOG_WARNING_LEVEL, 'SFP does not support lpmode') return False - #implement in future + # implement in future return False @@ -174,14 +144,12 @@ class Sfp(SfpOptoeBase): if self.sfp_type == 'QSFP-DD': return SfpOptoeBase.set_lpmode(self, lpmode) - elif self.sfp_type == 'QSFP': + if self.sfp_type == 'QSFP': if lpmode: return self._xcvr_api.set_power_override(True, lpmode) - else: - return self._xcvr_api.set_power_override(False, lpmode) - else: - self._sfplog(LOG_WARNING_LEVEL, 'SFP does not support lpmode') - return False + return self._xcvr_api.set_power_override(False, lpmode) + self._sfplog(LOG_WARNING_LEVEL, 'SFP does not support lpmode') + return False def set_optoe_write_max(self, write_max): """ @@ -189,7 +157,6 @@ class Sfp(SfpOptoeBase): so override it as NotImplemented """ self._sfplog(LOG_DEBUG_LEVEL, "set_optoe_write_max NotImplemented") - pass def refresh_xcvr_api(self): """ @@ -199,18 +166,17 @@ class Sfp(SfpOptoeBase): class_name = self._xcvr_api.__class__.__name__ optoe_type = None # set sfp_type - if (class_name == 'CmisApi'): + if 'CmisApi' in class_name: self.sfp_type = 'QSFP-DD' optoe_type = self.OPTOE_DRV_TYPE3 - elif (class_name == 'Sff8472Api'): + elif 'Sff8472Api' in class_name: self.sfp_type = 'SFP' optoe_type = self.OPTOE_DRV_TYPE2 - elif (class_name == 'Sff8636Api' or class_name == 'Sff8436Api'): + elif ('Sff8636Api' in class_name or 'Sff8436Api' in class_name): self.sfp_type = 'QSFP' optoe_type = self.OPTOE_DRV_TYPE1 - + # set optoe driver if optoe_type is not None: - # set optoe driver self._sfp_api.set_optoe_type(optoe_type) def _sfplog(self, log_level, msg): @@ -225,31 +191,22 @@ class Sfp(SfpOptoeBase): syslog.syslog(syslog.LOG_ERR, msg) syslog.closelog() - except Exception as e: + except BaseException: print(traceback.format_exc()) + class SfpCust(): def __init__(self, index): self.eeprom_path = None self._init_config(index) def _init_config(self, index): - sfp_config = get_sfp_config() + sfp_config = baseutil.get_config().get("sfps", None) self.log_level_config = sfp_config.get("log_level", LOG_WARNING_LEVEL) self._port_id = index self.eeprom_retry_times = sfp_config.get("eeprom_retry_times", 0) self.eeprom_retry_break_sec = sfp_config.get("eeprom_retry_break_sec", 0) - def combine_format_str(self, str, key): - count_format = str.count('%') - if count_format > 0: - args_k = [] - for i in range(count_format): - args_k.append(key) - return str % (tuple(args_k)) - else: - return str - def _get_eeprom_path(self): return self.eeprom_path or None @@ -266,18 +223,15 @@ class SfpCust(): # temporary solution for a sonic202111 bug if len(result) < num_bytes: result = result[::-1].zfill(num_bytes)[::-1] - if result != None: + if result is not None: return bytearray(result) - else: - time.sleep(self.eeprom_retry_break_sec) - continue + time.sleep(self.eeprom_retry_break_sec) + continue - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) - return None - def write_eeprom(self, offset, num_bytes, write_buffer): try: for i in range(self.eeprom_retry_times): @@ -288,13 +242,12 @@ class SfpCust(): break return ret - - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) - + return False @abstractmethod - def set_optoe_type(self, class_name): + def set_optoe_type(self, optoe_type): pass @abstractmethod @@ -331,15 +284,15 @@ class SfpCust(): syslog.syslog(syslog.LOG_ERR, msg) syslog.closelog() - except Exception as e: + except BaseException: print(traceback.format_exc()) + class SfpV1(SfpCust): def _init_config(self, index): super()._init_config(index) - sfp_config = get_sfp_config() - # init presence path + sfp_config = baseutil.get_config().get("sfps", None) self.presence_cpld = sfp_config.get("presence_cpld", None) self.presence_val_is_present = sfp_config.get("presence_val_is_present", 0) self._sfplog(LOG_DEBUG_LEVEL, "Done init presence path") @@ -356,16 +309,20 @@ class SfpV1(SfpCust): try: dev_id, offset, offset_bit = self._get_sfp_cpld_info(self.presence_cpld) ret, info = platform_reg_read(0, dev_id, offset, 1) - return (info[0] & (1 << offset_bit) == self.presence_val_is_present) - except Exception as err: + if (ret is False + or info is None): + return False + return info[0] & (1 << offset_bit) == self.presence_val_is_present + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) + return False def read_eeprom(self, offset, num_bytes): try: for i in range(self.eeprom_retry_times): ret, info = platform_sfp_read(self._port_id, offset, num_bytes) if (ret is False - or info is None): + or info is None): time.sleep(self.eeprom_retry_break_sec) continue eeprom_raw = [] @@ -377,7 +334,7 @@ class SfpV1(SfpCust): if len(eeprom_raw) < num_bytes: eeprom_raw = eeprom_raw[::-1].zfill(num_bytes)[::-1] return bytearray(eeprom_raw) - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) return None @@ -391,18 +348,19 @@ class SfpV1(SfpCust): else: val_list.append(write_buffer) ret, info = platform_sfp_write(self._port_id, offset, val_list) - if ret is False: + if (ret is False + or info is None): time.sleep(self.eeprom_retry_break_sec) continue return True - except Exception as e: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) return False def set_optoe_type(self, optoe_type): ret, info = platform_get_optoe_type(self._port_id) - if info != optoe_type: + if ret is True and info != optoe_type: try: ret, _ = platform_set_optoe_type(self._port_id, optoe_type) except Exception as err: @@ -432,7 +390,7 @@ class SfpV1(SfpCust): self._sfplog(LOG_ERROR_LEVEL, "platform_reg_write error!") return False - except Exception as err: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) return False @@ -454,45 +412,39 @@ class SfpV1(SfpCust): return dev_id, offset, offset_bit + class SfpV2(SfpCust): def _init_config(self, index): super()._init_config(index) - sfp_config = get_sfp_config() - # init eeprom path + sfp_config = baseutil.get_config().get("sfps", None) eeprom_path_config = sfp_config.get("eeprom_path", None) eeprom_path_key = sfp_config.get("eeprom_path_key")[self._port_id - 1] - self.eeprom_path = self.combine_format_str(eeprom_path_config, eeprom_path_key) + self.eeprom_path = None if eeprom_path_config is None else eeprom_path_config % ( + eeprom_path_key, eeprom_path_key) self._sfplog(LOG_DEBUG_LEVEL, "Done init eeprom path: %s" % self.eeprom_path) # init presence path - presence_path_config = sfp_config.get("presence_path", None) - presence_path_key = sfp_config.get("presence_path_key")[self._port_id - 1] - self.presence_path = self.combine_format_str(presence_path_config, presence_path_key) + self.presence_path = None if sfp_config.get("presence_path", + None) is None else sfp_config.get("presence_path") % self._port_id self.presence_val_is_present = sfp_config.get("presence_val_is_present", 0) self._sfplog(LOG_DEBUG_LEVEL, "Done init presence path: %s" % self.presence_path) # init optoe driver path - optoe_driver_path_config = sfp_config.get("optoe_driver_path", None) + optoe_driver_path = sfp_config.get("optoe_driver_path", None) optoe_driver_key = sfp_config.get("optoe_driver_key")[self._port_id - 1] - self.dev_class_path = self.combine_format_str(optoe_driver_path_config, optoe_driver_key) + self.dev_class_path = None if optoe_driver_path is None else optoe_driver_path % ( + optoe_driver_key, optoe_driver_key) self._sfplog(LOG_DEBUG_LEVEL, "Done init optoe driver path: %s" % self.dev_class_path) - # init txdisable path - txdisable_path_config = sfp_config.get("txdisable_path", None) - if txdisable_path_config is not None: - txdisable_path_key = sfp_config.get("txdisable_path_key")[self._port_id - 1] - self.txdisable_path = self.combine_format_str(txdisable_path_config, txdisable_path_key) - self.txdisable_val_is_on = sfp_config.get("txdisable_val_is_on", 0) - self._sfplog(LOG_DEBUG_LEVEL, "Done init optoe driver path: %s" % self.dev_class_path) - # init reset path - reset_path_config = sfp_config.get("reset_path", None) - if reset_path_config is not None: - reset_path_key = sfp_config.get("reset_path_key")[self._port_id - 1] - self.reset_path = self.combine_format_str(reset_path_config, reset_path_key) - self.reset_val_is_on = sfp_config.get("reset_val_is_on", 0) - self._sfplog(LOG_DEBUG_LEVEL, "Done init reset path: %s" % self.reset_path) + self.reset_path = None if sfp_config.get( + "reset_path", + None) is None else sfp_config.get( + "reset_path", + None) % self._port_id + self.reset_val_is_reset = sfp_config.get("reset_val_is_reset", 0) + self._sfplog(LOG_DEBUG_LEVEL, "Done init reset path: %s" % self.reset_path) def get_presence(self): if self.presence_path is None: @@ -504,8 +456,9 @@ class SfpV2(SfpCust): if sysfs_data != "": result = int(sysfs_data, 16) return result == self.presence_val_is_present - except Exception as err: + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) + return False def set_reset(self, reset): return True @@ -515,11 +468,13 @@ class SfpV2(SfpCust): self._sfplog(LOG_ERROR_LEVEL, "dev_class_path is None!") return False try: - dc_file = open(self.dev_class_path, "r+") - dc_file_val = dc_file.read(1) - if int(dc_file_val) != optoe_type: - dc_str = "%s" % str(optoe_type) - dc_file.write(dc_str) - dc_file.close() - except Exception as err: + with open(self.dev_class_path, "r+") as dc_file: + dc_file_val = dc_file.read(1) + if int(dc_file_val) != optoe_type: + dc_str = "%s" % str(optoe_type) + dc_file.write(dc_str) + # dc_file.close() + except BaseException: self._sfplog(LOG_ERROR_LEVEL, traceback.format_exc()) + return False + return True diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py new file mode 100644 index 0000000000..4632de3bc1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/thermal.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Thermals' information which are available in the platform +# +######################################################################## + + +try: + import time + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") from e + + +class Thermal(ThermalBase): + + def __init__(self, interface_obj, index): + self.temp_dict = {} + self.temperature_list = [] + self.int_case = interface_obj + self.index = index + self.update_time = 0 + self.temp_id = "TEMP" + str(index) + + def temp_dict_update(self): + local_time = time.time() + if not self.temp_dict or (local_time - self.update_time) >= 1: # update data every 1 seconds + self.update_time = local_time + self.temp_dict = self.int_case.get_monitor_temp_by_id(self.temp_id) + + def get_name(self): + """ + Retrieves the name of the thermal + + Returns: + string: The name of the thermal + """ + self.temp_dict_update() + return self.temp_dict["Api_name"] + + def get_presence(self): + """ + Retrieves the presence of the thermal + + Returns: + bool: True if thermal is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the Thermal + + Returns: + string: Model/part number of Thermal + """ + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the Thermal + + Returns: + string: Serial number of Thermal + """ + return "N/A" + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + return "N/A" + + def get_status(self): + """ + Retrieves the operational status of the thermal + + Returns: + A boolean value, True if thermal is operating properly, + False if not + """ + self.temp_dict_update() + if (self.temp_dict["Value"] >= self.temp_dict["High"]) or (self.temp_dict["Value"] <= self.temp_dict["Low"]): + return False + + return True + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Value"] + if value is None or value == self.int_case.error_ret: + return "N/A" + if len(self.temperature_list) >= 1000: + del self.temperature_list[0] + self.temperature_list.append(float(value)) + return round(float(value), 1) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["High"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + + Returns: + A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Low"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def set_high_threshold(self, temperature): + """ + Sets the high threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + + Returns: + A boolean, True if threshold is set successfully, False if not + """ + # not supported + return False + + def set_low_threshold(self, temperature): + """ + Sets the low threshold temperature of thermal + + Args : + temperature: A float number up to nearest thousandth of one degree Celsius, + e.g. 30.125 + + Returns: + A boolean, True if threshold is set successfully, False if not + """ + # not supported + return False + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + + Returns: + A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Max"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + + Returns: + A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + self.temp_dict_update() + value = self.temp_dict["Min"] + if value is None or value == self.int_case.error_ret: + return "N/A" + return round(float(value), 1) + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if len(self.temperature_list) == 0: + return "N/A" + return round(float(min(self.temperature_list)), 1) + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if len(self.temperature_list) == 0: + return "N/A" + return round(float(max(self.temperature_list)), 1) diff --git a/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py new file mode 100644 index 0000000000..948337f47a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/common/sonic_platform/watchdog.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 + +######################################################################## +# +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +import fcntl +import os +import array + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as error: + raise ImportError(str(error) + "- required module not found") from error + + +# ioctl constants +IO_WRITE = 0x40000000 +IO_READ = 0x80000000 +IO_READ_WRITE = 0xC0000000 +IO_SIZE_INT = 0x00040000 +IO_SIZE_40 = 0x00280000 +IO_TYPE_WATCHDOG = ord('W') << 8 + +WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG +WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG +WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG + +# Watchdog ioctl command +WDIOC_GETSUPPORT = 0 | WDR_40 +WDIOC_GETSTATUS = 1 | WDR_INT +WDIOC_GETBOOTSTATUS = 2 | WDR_INT +WDIOC_GETTEMP = 3 | WDR_INT +WDIOC_SETOPTIONS = 4 | WDR_INT +WDIOC_KEEPALIVE = 5 | WDR_INT +WDIOC_SETTIMEOUT = 6 | WDWR_INT +WDIOC_GETTIMEOUT = 7 | WDR_INT +WDIOC_SETPRETIMEOUT = 8 | WDWR_INT +WDIOC_GETPRETIMEOUT = 9 | WDR_INT +WDIOC_GETTIMELEFT = 10 | WDR_INT + +# Watchdog status constants +WDIOS_DISABLECARD = 0x0001 +WDIOS_ENABLECARD = 0x0002 + +WDT_COMMON_ERROR = -1 +WDT_IDENTITY = "CPLD Watchdog" +WDT_SYSFS_PATH = "/sys/class/watchdog/" + +DEFAULT_TIMEOUT = 180 + + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + self.watchdog, self.wdt_main_dev_name = self._get_wdt() + self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name + self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name + self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name + # Set default value + self._disable() + self.armed = False + self.timeout = self._gettimeout() + + def _is_wd_main(self, dev): + """ + Checks watchdog identity + """ + identity = self._read_file( + "{}/{}/identity".format(WDT_SYSFS_PATH, dev)) + return identity == WDT_IDENTITY + + def _get_wdt(self): + """ + Retrieves watchdog device + """ + wdt_main_dev_list = [dev for dev in os.listdir( + "/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)] + if not wdt_main_dev_list: + return None + wdt_main_dev_name = wdt_main_dev_list[0] + watchdog_device_path = "/dev/{}".format(wdt_main_dev_name) + watchdog = os.open(watchdog_device_path, os.O_RDWR) + return watchdog, wdt_main_dev_name + + def _read_file(self, file_path): + """ + Read text file + """ + try: + with open(file_path, "r") as fd: + txt = fd.read() + except IOError: + return WDT_COMMON_ERROR + return txt.strip() + + def _enable(self): + """ + Turn on the watchdog timer + """ + req = array.array('h', [WDIOS_ENABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _disable(self): + """ + Turn off the watchdog timer + """ + req = array.array('h', [WDIOS_DISABLECARD]) + fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False) + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE) + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + req = array.array('I', [seconds]) + fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True) + return int(req[0]) + + def _gettimeout(self): + """ + Get watchdog timeout + @return watchdog timeout + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True) + + return int(req[0]) + + def _gettimeleft(self): + """ + Get time left before watchdog timer expires + @return time left in seconds + """ + req = array.array('I', [0]) + fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True) + + return int(req[0]) + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* available + value. + + Returns: + An integer specifying the *actual* number of seconds the watchdog + was armed with. On failure returns -1. + """ + ret = WDT_COMMON_ERROR + if seconds < 0: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + if self.armed: + self._keepalive() + else: + self._settimeout(seconds) + self._enable() + self.armed = True + ret = self.timeout + except IOError: + pass + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + if self.is_armed(): + try: + self._disable() + self.armed = False + disarmed = True + except IOError: + pass + + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + + Returns: + A boolean, True if watchdog is armed, False if not + """ + return self.armed + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds remaining on + the watchdog timer + + Returns: + An integer specifying the number of seconds remaining on thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + timeleft = WDT_COMMON_ERROR + + if self.armed: + try: + timeleft = self._gettimeleft() + except IOError: + pass + + return timeleft + + def __del__(self): + """ + Close watchdog + """ + os.close(self.watchdog) diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/compat b/platform/broadcom/sonic-platform-modules-ragile/debian/compat index 45a4fb75db..f599e28b8a 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/compat +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/compat @@ -1 +1 @@ -8 +10 diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/control b/platform/broadcom/sonic-platform-modules-ragile/debian/control index 795c8219a6..ae30aee8c0 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/control +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/control @@ -1,21 +1,21 @@ Source: sonic-ragile-platform-modules Section: main Priority: extra -Maintainer: support +Maintainer: support Standards-Version: 3.9.3 Package: platform-modules-ragile-ra-b6510-48v8c Architecture: amd64 Description: kernel modules for platform devices such as fan, led, sfp -Package: platform-modules-ragile-ra-b6910-64c -Architecture: amd64 -Description: kernel modules for platform devices such as fan, led, sfp - Package: platform-modules-ragile-ra-b6510-32c Architecture: amd64 Description: kernel modules for platform devices such as fan, led, sfp +Package: platform-modules-ragile-ra-b6910-64c +Architecture: amd64 +Description: kernel modules for platform devices such as fan, led, sfp + Package: platform-modules-ragile-ra-b6920-4s Architecture: amd64 Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/copyright b/platform/broadcom/sonic-platform-modules-ragile/debian/copyright index 1e4fc20a16..676cdeec72 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/copyright +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/copyright @@ -1,5 +1,4 @@ Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2018 Ragile Network Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install index 568190dca0..a63d409ace 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.install @@ -1 +1 @@ -ra-b6510-48v8c/scripts/pddf_post_driver_install.sh /usr/local/bin +ra-b6510-48v8c/modules/sonic_platform-1.0-py3-none-any.whl /usr/share/sonic/device/x86_64-ragile_ra-b6510-48v8c-r0 diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst index 0d9d6a34d2..a8132f4f65 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/platform-modules-ragile-ra-b6510-48v8c.postinst @@ -7,11 +7,4 @@ if [ -e /boot/System.map-${kernel_version} ]; then depmod -a -F /boot/System.map-${kernel_version} ${kernel_version} || true fi -# enable platform-service -depmod -a -# systemctl enable platform-modules-ra-b6510-48v8c.service -# systemctl start platform-modules-ra-b6510-48v8c.service -systemctl enable pddf-platform-init.service -systemctl start pddf-platform-init.service - #DEBHELPER# diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk b/platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk deleted file mode 100755 index 6620b8762f..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/rule-ragile.mk +++ /dev/null @@ -1,8 +0,0 @@ -currentdir = $(shell pwd) - -MODULE_DIRS := ra-b6510-48v8c -MODULE_DIRS += ra-b6910-64c -MODULE_DIRS += ra-b6510-32c -MODULE_DIRS += ra-b6920-4s - -export MODULE_DIRS diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk b/platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk new file mode 100644 index 0000000000..912668c199 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/rule.mk @@ -0,0 +1,5 @@ +currentdir = $(shell pwd) + +MODULE_DIRS := ra-b6510-48v8c + +export MODULE_DIRS diff --git a/platform/broadcom/sonic-platform-modules-ragile/debian/rules b/platform/broadcom/sonic-platform-modules-ragile/debian/rules index 7e5aa13b2e..0177d50726 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/debian/rules +++ b/platform/broadcom/sonic-platform-modules-ragile/debian/rules @@ -6,33 +6,27 @@ KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) KBUILD_OUTPUT=$(KERNEL_SRC)/build -LIB_DIR = usr/lib/python3.7/dist-packages +LIB_DIR = usr/lib/python3/dist-packages CUSTOM_RULES_DIR := $(shell pwd)/debian -PLATFORM_PREFIX = "x86_64-ragile" -PLATFORM_VER = "r0" -BDIST_DIR = "dist" -BDIST_TARGET = "bdist_t" +export INSTALL_MOD_DIR top_srcdir KVERSION KERNEL_SRC CC KBUILD_OUTPUT CUSTOM_RULES_DIR -export INSTALL_MOD_DIR top_srcdir KVERSION KERNEL_SRC CC KBUILD_OUTPUT +include $(CUSTOM_RULES_DIR)/rule.mk -include $(CUSTOM_RULES_DIR)/rule-ragile.mk - -#all products need common +#all product need common COMPILE_DIRS = $(MODULE_DIRS) clean_dirs = $(MODULE_DIRS) clean_dirs += common -custom_clean_dirs := $(addprefix _clean_,$(clean_dirs) ) - +complie_clean_dirs := $(addprefix _clean_,$(clean_dirs) ) %: dh $@ -build: $(COMPILE_DIRS) +build: COMPILE_WHL @echo "build success" -$(custom_clean_dirs): +$(complie_clean_dirs): $(MAKE) -C $(patsubst _clean_%,%,$@) clean common_build : @@ -42,29 +36,32 @@ $(COMPILE_DIRS): common_build $(MAKE) -C $(MOD_SRC_DIR)/$@ dh_testdir dh_installdirs - # - # wheel pcakage - @cp -r \ - $(MOD_SRC_DIR)/common/lib/rgutil \ - $(MOD_SRC_DIR)/common/lib/eepromutil \ - $(MOD_SRC_DIR)/$@/; \ - cd $(MOD_SRC_DIR)/$@; \ - python3 setup.py bdist_wheel --bdist-dir $(BDIST_DIR) -d $(BDIST_TARGET); \ - mkdir -p build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER); \ - mkdir -p build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER)/pddf; \ - cp $(BDIST_TARGET)/*.whl build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER); \ - cp $(BDIST_TARGET)/*.whl build/usr/share/sonic/device/$(PLATFORM_PREFIX)_$@-$(PLATFORM_VER)/pddf/; \ - cd $(MOD_SRC_DIR); \ - rm -rf \ - $(MOD_SRC_DIR)/$@/rgutil \ - $(MOD_SRC_DIR)/$@/eepromutil \ - $(MOD_SRC_DIR)/$@/$(BDIST_TARGET) + cp -r $(MOD_SRC_DIR)/common/build/* debian/platform-modules-ragile-$@/; \ + cp -r $(MOD_SRC_DIR)/$@/build/* debian/platform-modules-ragile-$@/; \ - cp -r $(MOD_SRC_DIR)/common/build/* debian/platform-modules-ragile-$@/ - cp -r $(MOD_SRC_DIR)/$@/build/* debian/platform-modules-ragile-$@/ +COMPILE_WHL: $(COMPILE_DIRS) + @(for mod in $(MODULE_DIRS); do \ + cd $(MOD_SRC_DIR)/$${mod}; \ + cp -r $(MOD_SRC_DIR)/common/lib/plat_hal $(MOD_SRC_DIR)/$${mod}/; \ + cp -r $(MOD_SRC_DIR)/common/lib/wbutil $(MOD_SRC_DIR)/$${mod}/; \ + cp -r $(MOD_SRC_DIR)/common/lib/eepromutil $(MOD_SRC_DIR)/$${mod}/; \ + cp -r $(MOD_SRC_DIR)/common/sonic_platform $(MOD_SRC_DIR)/$${mod}/; \ + cp $(MOD_SRC_DIR)/common/script/hal_pltfm.py $(MOD_SRC_DIR)/$${mod}/hal_pltfm.py; \ + cp $(MOD_SRC_DIR)/common/script/platform_util.py $(MOD_SRC_DIR)/$${mod}/platform_util.py; \ + cp $(MOD_SRC_DIR)/common/script/platform_intf.py $(MOD_SRC_DIR)/$${mod}/platform_intf.py; \ + python3 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/plat_hal; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/wbutil; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/eepromutil; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/sonic_platform; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/hal_pltfm.py; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/platform_intf.py; \ + rm -rf $(MOD_SRC_DIR)/$${mod}/platform_util.py; \ + cd $(MOD_SRC_DIR); \ + done) binary: binary-indep - @echo "======================================================" + @echo "=======================================================" binary-indep: # Resuming debhelper scripts @@ -87,7 +84,7 @@ override_dh_usrlocal: override_dh_pysupport: -clean: $(custom_clean_dirs) +clean: $(complie_clean_dirs) dh_testdir dh_testroot dh_clean diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE deleted file mode 100755 index d37122689f..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2018 Ragile Network Corporation -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS deleted file mode 100755 index ec82224050..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/MAINTAINERS +++ /dev/null @@ -1,5 +0,0 @@ -# See the SONiC project governance document for more information - -Name = "support" -Email = "support@ragile.com" -Mailinglist = sonicproject@googlegroups.com diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile old mode 100755 new mode 100644 index bc2010b78e..1b84abef41 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/Makefile @@ -5,13 +5,9 @@ EXTRA_CFLAGS+= -Wall SUB_BUILD_DIR = $(PWD)/build INSTALL_DIR = $(SUB_BUILD_DIR)/$(KERNEL_SRC)/$(INSTALL_MOD_DIR) INSTALL_SCRIPT_DIR = $(SUB_BUILD_DIR)/usr/local/bin -INSTALL_SERVICE_DIR = $(SUB_BUILD_DIR)/lib/systemd/system/ - -KBUILD_EXTRA_SYMBOLS += $(DIR_KERNEL_SRC)/Module.symvers -ifeq "5.10.0" "$(word 1, $(sort 5.10.0 $(KERNEL_VERSION)))" -KBUILD_EXTRA_SYMBOLS += $(PWD)/../../../pddf/i2c/Module.symvers.PDDF -endif -export KBUILD_EXTRA_SYMBOLS +INSTALL_LIB_DIR = $(SUB_BUILD_DIR)/usr/lib/python3/dist-packages +INSTALL_SYSFS_CFG_DIR = $(SUB_BUILD_DIR)/etc/plat_sysfs_cfg +INSTALL_UPGRADE_TEST_DIR = $(SUB_BUILD_DIR)/etc/.upgrade_test all: $(MAKE) -C $(KBUILD_OUTPUT) M=$(DIR_KERNEL_SRC) modules @@ -19,8 +15,12 @@ all: cp -r $(DIR_KERNEL_SRC)/*.ko $(INSTALL_DIR) @if [ ! -d ${INSTALL_SCRIPT_DIR} ]; then mkdir -p ${INSTALL_SCRIPT_DIR} ;fi cp -r $(PWD)/config/* $(INSTALL_SCRIPT_DIR) - @if [ ! -d ${INSTALL_SERVICE_DIR} ]; then mkdir -p ${INSTALL_SERVICE_DIR} ;fi - cp $(PWD)/systemd/*.service $(INSTALL_SERVICE_DIR) + @if [ ! -d ${INSTALL_LIB_DIR} ]; then mkdir -p ${INSTALL_LIB_DIR} ;fi + @if [ -d $(PWD)/hal-config/ ]; then cp -r $(PWD)/hal-config/* ${INSTALL_LIB_DIR} ;fi + @if [ ! -d ${INSTALL_SYSFS_CFG_DIR} ]; then mkdir -p ${INSTALL_SYSFS_CFG_DIR} ;fi + @if [ -d $(PWD)/plat_sysfs_cfg/ ]; then cp -r $(PWD)/plat_sysfs_cfg/* ${INSTALL_SYSFS_CFG_DIR} ;fi + @if [ ! -d ${INSTALL_UPGRADE_TEST_DIR} ]; then mkdir -p ${INSTALL_UPGRADE_TEST_DIR} ;fi + @if [ -d $(PWD)/.upgrade_test/ ]; then cp -r $(PWD)/.upgrade_test/* ${INSTALL_UPGRADE_TEST_DIR} ;fi clean: rm -f ${DIR_KERNEL_SRC}/*.o ${DIR_KERNEL_SRC}/*.ko ${DIR_KERNEL_SRC}/*.mod.c ${DIR_KERNEL_SRC}/.*.cmd rm -f ${DIR_KERNEL_SRC}/Module.markers ${DIR_KERNEL_SRC}/Module.symvers ${DIR_KERNEL_SRC}/modules.order diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md deleted file mode 100755 index 787636c4ad..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/README.md +++ /dev/null @@ -1 +0,0 @@ -Device drivers for support of ragile platform for the SONiC project diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py index 5fe30ea128..66ca2ddb19 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_config.py @@ -1,484 +1,1110 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -from ragilecommon import * -PCA9548START = -1 -PCA9548BUSEND = -2 +from platform_common import * - -RAGILE_CARDID = 0x0000404a -RAGILE_PRODUCTNAME = "RA-B6510-48V8C" - -STARTMODULE = { - "fancontrol":1, - "avscontrol":1, - "dev_monitor":1 +STARTMODULE = { + "hal_fanctrl": 1, + "hal_ledctrl": 1, + "avscontrol": 1, + "dev_monitor": 1, + "pmon_syslog": 1, + "tty_console": 1, + "macledreset": 1, + "sff_temp_polling": 1, + "generate_airflow": 1, + "reboot_cause": 1, } -i2ccheck_params = {"busend":"i2c-66","retrytime":6} +MAC_LED_RESET = {"pcibus": 8, "slot": 0, "fn": 0, "bar": 0, "offset": 64, "reset": 0x98} + +MANUINFO_CONF = { + "bios": { + "key": "BIOS", + "head": True, + "next": "onie" + }, + "bios_vendor": { + "parent": "bios", + "key": "Vendor", + "cmd": "dmidecode -t 0 |grep Vendor", + "pattern": r".*Vendor", + "separator": ":", + "arrt_index": 1, + }, + "bios_version": { + "parent": "bios", + "key": "Version", + "cmd": "dmidecode -t 0 |grep Version", + "pattern": r".*Version", + "separator": ":", + "arrt_index": 2, + }, + "bios_date": { + "parent": "bios", + "key": "Release Date", + "cmd": "dmidecode -t 0 |grep Release", + "pattern": r".*Release Date", + "separator": ":", + "arrt_index": 3, + }, + "onie": { + "key": "ONIE", + "next": "cpu" + }, + "onie_date": { + "parent": "onie", + "key": "Build Date", + "file": "/host/machine.conf", + "pattern": r"^onie_build_date", + "separator": "=", + "arrt_index": 1, + }, + "onie_version": { + "parent": "onie", + "key": "Version", + "file": "/host/machine.conf", + "pattern": r"^onie_version", + "separator": "=", + "arrt_index": 2, + }, + + "cpu": { + "key": "CPU", + "next": "ssd" + }, + "cpu_vendor": { + "parent": "cpu", + "key": "Vendor", + "cmd": "dmidecode --type processor |grep Manufacturer", + "pattern": r".*Manufacturer", + "separator": ":", + "arrt_index": 1, + }, + "cpu_model": { + "parent": "cpu", + "key": "Device Model", + "cmd": "dmidecode --type processor | grep Version", + "pattern": r".*Version", + "separator": ":", + "arrt_index": 2, + }, + "cpu_core": { + "parent": "cpu", + "key": "Core Count", + "cmd": "dmidecode --type processor | grep \"Core Count\"", + "pattern": r".*Core Count", + "separator": ":", + "arrt_index": 3, + }, + "cpu_thread": { + "parent": "cpu", + "key": "Thread Count", + "cmd": "dmidecode --type processor | grep \"Thread Count\"", + "pattern": r".*Thread Count", + "separator": ":", + "arrt_index": 4, + }, + "ssd": { + "key": "SSD", + "next": "cpld" + }, + "ssd_model": { + "parent": "ssd", + "key": "Device Model", + "cmd": "smartctl -i /dev/sda |grep \"Device Model\"", + "pattern": r".*Device Model", + "separator": ":", + "arrt_index": 1, + }, + "ssd_fw": { + "parent": "ssd", + "key": "Firmware Version", + "cmd": "smartctl -i /dev/sda |grep \"Firmware Version\"", + "pattern": r".*Firmware Version", + "separator": ":", + "arrt_index": 2, + }, + "ssd_user_cap": { + "parent": "ssd", + "key": "User Capacity", + "cmd": "smartctl -i /dev/sda |grep \"User Capacity\"", + "pattern": r".*User Capacity", + "separator": ":", + "arrt_index": 3, + }, + + "cpld": { + "key": "CPLD", + "next": "psu" + }, + + "cpld1": { + "key": "CPLD1", + "parent": "cpld", + "arrt_index": 1, + }, + "cpld1_model": { + "key": "Device Model", + "parent": "cpld1", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld1_vender": { + "key": "Vendor", + "parent": "cpld1", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld1_desc": { + "key": "Description", + "parent": "cpld1", + "config": "CPU_CPLD", + "arrt_index": 3, + }, + "cpld1_version": { + "key": "Firmware Version", + "parent": "cpld1", + "reg": { + "loc": "/dev/port", + "offset": 0x700, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld2": { + "key": "CPLD2", + "parent": "cpld", + "arrt_index": 2, + }, + "cpld2_model": { + "key": "Device Model", + "parent": "cpld2", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld2_vender": { + "key": "Vendor", + "parent": "cpld2", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld2_desc": { + "key": "Description", + "parent": "cpld2", + "config": "CONNECT_CPLD", + "arrt_index": 3, + }, + "cpld2_version": { + "key": "Firmware Version", + "parent": "cpld2", + "reg": { + "loc": "/dev/port", + "offset": 0x900, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld3": { + "key": "CPLD3", + "parent": "cpld", + "arrt_index": 3, + }, + "cpld3_model": { + "key": "Device Model", + "parent": "cpld3", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld3_vender": { + "key": "Vendor", + "parent": "cpld3", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld3_desc": { + "key": "Description", + "parent": "cpld3", + "config": "CONNECT_CPLD-FAN", + "arrt_index": 3, + }, + "cpld3_version": { + "key": "Firmware Version", + "parent": "cpld3", + "i2c": { + "bus": "2", + "loc": "0x0d", + "offset": 0, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld4": { + "key": "CPLD4", + "parent": "cpld", + "arrt_index": 4, + }, + "cpld4_model": { + "key": "Device Model", + "parent": "cpld4", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld4_vender": { + "key": "Vendor", + "parent": "cpld4", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld4_desc": { + "key": "Description", + "parent": "cpld4", + "config": "MAC_CPLD1", + "arrt_index": 3, + }, + "cpld4_version": { + "key": "Firmware Version", + "parent": "cpld4", + "i2c": { + "bus": "8", + "loc": "0x30", + "offset": 0, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "cpld5": { + "key": "CPLD5", + "parent": "cpld", + "arrt_index": 5, + }, + "cpld5_model": { + "key": "Device Model", + "parent": "cpld5", + "config": "LCMXO3LF-2100C-5BG256C", + "arrt_index": 1, + }, + "cpld5_vender": { + "key": "Vendor", + "parent": "cpld5", + "config": "LATTICE", + "arrt_index": 2, + }, + "cpld5_desc": { + "key": "Description", + "parent": "cpld5", + "config": "MAC_CPLD2", + "arrt_index": 3, + }, + "cpld5_version": { + "key": "Firmware Version", + "parent": "cpld5", + "i2c": { + "bus": "8", + "loc": "0x31", + "offset": 0, + "size": 4 + }, + "callback": "cpld_format", + "arrt_index": 4, + }, + + "psu": { + "key": "PSU", + "next": "fan" + }, + + "psu1": { + "parent": "psu", + "key": "PSU1", + "arrt_index": 1, + }, + "psu1_hw_version": { + "key": "Hardware Version", + "parent": "psu1", + "extra": { + "funcname": "getPsu", + "id": "psu1", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "psu1_fw_version": { + "key": "Firmware Version", + "parent": "psu1", + "config": "NA", + "arrt_index": 2, + }, + + "psu2": { + "parent": "psu", + "key": "PSU2", + "arrt_index": 2, + }, + "psu2_hw_version": { + "key": "Hardware Version", + "parent": "psu2", + "extra": { + "funcname": "getPsu", + "id": "psu2", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "psu2_fw_version": { + "key": "Firmware Version", + "parent": "psu2", + "config": "NA", + "arrt_index": 2, + }, + + "fan": { + "key": "FAN", + "next": "i210" + }, + + "fan1": { + "key": "FAN1", + "parent": "fan", + "arrt_index": 1, + }, + "fan1_hw_version": { + "key": "Hardware Version", + "parent": "fan1", + "extra": { + "funcname": "checkFan", + "id": "fan1", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan1_fw_version": { + "key": "Firmware Version", + "parent": "fan1", + "config": "NA", + "arrt_index": 2, + }, + + "fan2": { + "key": "FAN2", + "parent": "fan", + "arrt_index": 2, + }, + "fan2_hw_version": { + "key": "Hardware Version", + "parent": "fan2", + "extra": { + "funcname": "checkFan", + "id": "fan2", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan2_fw_version": { + "key": "Firmware Version", + "parent": "fan2", + "config": "NA", + "arrt_index": 2, + }, + + "fan3": { + "key": "FAN3", + "parent": "fan", + "arrt_index": 3, + }, + "fan3_hw_version": { + "key": "Hardware Version", + "parent": "fan3", + "extra": { + "funcname": "checkFan", + "id": "fan3", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan3_fw_version": { + "key": "Firmware Version", + "parent": "fan3", + "config": "NA", + "arrt_index": 2, + }, + + "fan4": { + "key": "FAN4", + "parent": "fan", + "arrt_index": 4, + }, + "fan4_hw_version": { + "key": "Hardware Version", + "parent": "fan4", + "extra": { + "funcname": "checkFan", + "id": "fan4", + "key": "hw_version" + }, + "arrt_index": 1, + }, + "fan4_fw_version": { + "key": "Firmware Version", + "parent": "fan4", + "config": "NA", + "arrt_index": 2, + }, + + "i210": { + "key": "NIC", + "next": "fpga" + }, + "i210_model": { + "parent": "i210", + "config": "NA", + "key": "Device Model", + "arrt_index": 1, + }, + "i210_vendor": { + "parent": "i210", + "config": "INTEL", + "key": "Vendor", + "arrt_index": 2, + }, + "i210_version": { + "parent": "i210", + "cmd": "ethtool -i eth0", + "pattern": r"firmware-version", + "separator": ":", + "key": "Firmware Version", + "arrt_index": 3, + }, + + "fpga": { + "key": "FPGA", + "next": "asic" + }, + "fpga_model": { + "parent": "fpga", + "config": "XC7A15T-2FGG484C", + "key": "Device Model", + "arrt_index": 1, + }, + "fpga_vendor": { + "parent": "fpga", + "config": "XILINX", + "key": "Vendor", + "arrt_index": 2, + }, + "fpga_desc": { + "parent": "fpga", + "config": "NA", + "key": "Description", + "arrt_index": 3, + }, + "fpga_hw_version": { + "parent": "fpga", + "config": "NA", + "key": "Hardware Version", + "arrt_index": 4, + }, + "fpga_fw_version": { + "parent": "fpga", + "pci": { + "bus": 8, + "slot": 0, + "fn": 0, + "bar": 0, + "offset": 0 + }, + "key": "Firmware Version", + "arrt_index": 5, + }, + "fpga_date": { + "parent": "fpga", + "pci": { + "bus": 8, + "slot": 0, + "fn": 0, + "bar": 0, + "offset": 4 + }, + "key": "Build Date", + "arrt_index": 6, + }, + "asic": { + "key": "ASIC", + }, + "sdk_model": { + "parent": "asic", + "cmd": "bcmcmd -t 1 att", + "pattern": r"^Attach", + "regular": r"(?<=\()[^)]*(?=\))", + "key": "Device Model", + "arrt_index": 1, + }, + "sdk_version": { + "parent": "asic", + "cmd": "bcmcmd -t 1 version | grep Release", + "pattern": r".*Release", + "separator": ":", + "key": "SDK Version", + "arrt_index": 2, + }, + "pci_version": { + "parent": "asic", + "cmd": "bcmcmd -t 1 \"pciephy fw version\" |grep \"PCIe FW version\"", + "pattern": r".*PCIe FW version", + "separator": ":", + "key": "PCIe Firmware Version", + "arrt_index": 3, + }, +} + +PMON_SYSLOG_STATUS = { + "polling_time": 3, + "sffs": { + "present": {"path": ["/sys/wb_plat/sff/*/present"], "ABSENT": 0}, + "nochangedmsgflag": 0, + "nochangedmsgtime": 60, + "noprintfirsttimeflag": 1, + "alias": { + "sff1": "Ethernet1", + "sff2": "Ethernet2", + "sff3": "Ethernet3", + "sff4": "Ethernet4", + "sff5": "Ethernet5", + "sff6": "Ethernet6", + "sff7": "Ethernet7", + "sff8": "Ethernet8", + "sff9": "Ethernet9", + "sff10": "Ethernet10", + "sff11": "Ethernet11", + "sff12": "Ethernet12", + "sff13": "Ethernet13", + "sff14": "Ethernet14", + "sff15": "Ethernet15", + "sff16": "Ethernet16", + "sff17": "Ethernet17", + "sff18": "Ethernet18", + "sff19": "Ethernet19", + "sff20": "Ethernet20", + "sff21": "Ethernet21", + "sff22": "Ethernet22", + "sff23": "Ethernet23", + "sff24": "Ethernet24", + "sff25": "Ethernet25", + "sff26": "Ethernet26", + "sff27": "Ethernet27", + "sff28": "Ethernet28", + "sff29": "Ethernet29", + "sff30": "Ethernet30", + "sff31": "Ethernet31", + "sff32": "Ethernet32", + "sff33": "Ethernet33", + "sff34": "Ethernet34", + "sff35": "Ethernet35", + "sff36": "Ethernet36", + "sff37": "Ethernet37", + "sff38": "Ethernet38", + "sff39": "Ethernet39", + "sff40": "Ethernet40", + "sff41": "Ethernet41", + "sff42": "Ethernet42", + "sff43": "Ethernet43", + "sff44": "Ethernet44", + "sff45": "Ethernet45", + "sff46": "Ethernet46", + "sff47": "Ethernet47", + "sff48": "Ethernet48", + "sff49": "Ethernet49", + "sff50": "Ethernet50", + "sff51": "Ethernet51", + "sff52": "Ethernet52", + "sff53": "Ethernet53", + "sff54": "Ethernet54", + "sff55": "Ethernet55", + "sff56": "Ethernet56", + } + }, + "fans": { + "present": {"path": ["/sys/wb_plat/fan/*/present"], "ABSENT": 0}, + "status": [ + {"path": "/sys/wb_plat/fan/%s/motor0/status", 'okval': 1}, + {"path": "/sys/wb_plat/fan/%s/motor1/status", 'okval': 1}, + ], + "nochangedmsgflag": 1, + "nochangedmsgtime": 60, + "noprintfirsttimeflag": 0, + "alias": { + "fan1": "FAN1", + "fan2": "FAN2", + "fan3": "FAN3", + "fan4": "FAN4" + } + }, + "psus": { + "present": {"path": ["/sys/wb_plat/psu/*/present"], "ABSENT": 0}, + "status": [ + {"path": "/sys/wb_plat/psu/%s/output", "okval": 1}, + {"path": "/sys/wb_plat/psu/%s/alert", "okval": 0}, + ], + "nochangedmsgflag": 1, + "nochangedmsgtime": 60, + "noprintfirsttimeflag": 0, + "alias": { + "psu1": "PSU1", + "psu2": "PSU2" + } + } +} + +##################### MAC Voltage adjust#################################### +MAC_DEFAULT_PARAM = [ + { + "name": "mac_core", # AVS name + "type": 1, # 1: used default value, if rov value not in range. 0: do nothing, if rov value not in range + "default": 0x74, # default value, if rov value not in range + "sdkreg": "TOP_AVS_SEL_REG", # SDK register name + "sdktype": 0, # 0: No shift operation required, 1: shift operation required + "macregloc": 24, # Shift right 24 bits + "mask": 0xff, # Use with macregloc + "rov_source": 1, # 0:get rov value from cpld, 1: get rov value from SDK + "cpld_avs": {"bus": 6, "loc": 0x0d, "offset": 0xc3, "gettype": "i2c"}, + "set_avs": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/avs0_vout", + "gettype": "sysfs", "formula": "int((%f)*1000000)" + }, + "mac_avs_param": { + 0x08: 0.888, + 0x72: 0.900, + 0x73: 0.894, + 0x74: 0.888, + 0x75: 0.882, + 0x76: 0.875, + 0x77: 0.869, + 0x78: 0.863, + 0x79: 0.857, + 0x7a: 0.850, + 0x7b: 0.844, + 0x7c: 0.838, + 0x7d: 0.832, + 0x7e: 0.825, + 0x7f: 0.819, + 0x80: 0.813, + 0x81: 0.807, + 0x82: 0.800, + 0x83: 0.794, + 0x84: 0.788, + 0x85: 0.782, + 0x86: 0.775, + 0x87: 0.769, + 0x88: 0.763, + 0x89: 0.757, + 0x8A: 0.750 + } + } +] + +BLACKLIST_DRIVERS = [ + {"name": "i2c_i801", "delay": 0}, +] + +DRIVERLISTS = [ + {"name": "wb_i2c_i801", "delay": 0}, + {"name": "wb_gpio_d1500", "delay": 0}, + {"name": "i2c_dev", "delay": 0}, + {"name": "wb_i2c_algo_bit", "delay": 0}, + {"name": "wb_i2c_gpio", "delay": 0}, + {"name": "i2c_mux", "delay": 0}, + {"name": "wb_gpio_device", "delay": 0}, + {"name": "wb_i2c_gpio_device gpio_sda=17 gpio_scl=1 gpio_udelay=2", "delay": 0}, + {"name": "platform_common dfd_my_type=0x404a", "delay": 0}, + {"name": "wb_lpc_drv", "delay": 0}, + {"name": "wb_lpc_drv_device", "delay": 0}, + {"name": "wb_io_dev", "delay": 0}, + {"name": "wb_io_dev_device", "delay": 0}, + {"name": "wb_fpga_pcie", "delay": 0}, + {"name": "wb_pcie_dev", "delay": 0}, + {"name": "wb_pcie_dev_device", "delay": 0}, + {"name": "wb_i2c_dev", "delay": 0}, + {"name": "wb_i2c_ocores", "delay": 0}, + {"name": "wb_i2c_ocores_device", "delay": 0}, + {"name": "wb_i2c_mux_pca9641", "delay": 0}, + {"name": "wb_i2c_mux_pca954x", "delay": 0}, + {"name": "wb_i2c_mux_pca954x_device", "delay": 0}, + {"name": "wb_i2c_dev_device", "delay": 0}, + {"name": "wb_lm75", "delay": 0}, + {"name": "wb_optoe", "delay": 0}, + {"name": "wb_at24", "delay": 0}, + {"name": "wb_mac_bsc", "delay": 0}, + {"name": "wb_pmbus_core", "delay": 0}, + {"name": "wb_isl68137", "delay": 0}, + {"name": "wb_csu550", "delay": 0}, + {"name": "wb_ina3221", "delay": 0}, + {"name": "wb_tps53622", "delay": 0}, + {"name": "firmware_driver_cpld", "delay": 0}, + {"name": "firmware_driver_ispvme", "delay": 0}, + {"name": "firmware_driver_sysfs", "delay": 0}, + {"name": "wb_firmware_upgrade_device", "delay": 0}, + {"name": "plat_dfd", "delay": 0}, + {"name": "plat_switch", "delay": 0}, + {"name": "plat_fan", "delay": 0}, + {"name": "plat_psu", "delay": 0}, + {"name": "plat_sff", "delay": 0}, +] + +DEVICE = [ + {"name": "wb_24c02", "bus": 0, "loc": 0x56}, + {"name": "wb_mac_bsc_td3", "bus": 3, "loc": 0x44}, + # fan + {"name": "wb_24c02", "bus": 16, "loc": 0x50}, + {"name": "wb_24c02", "bus": 17, "loc": 0x50}, + {"name": "wb_24c02", "bus": 18, "loc": 0x50}, + {"name": "wb_24c02", "bus": 19, "loc": 0x50}, + # psu + {"name": "wb_24c02", "bus": 24, "loc": 0x50}, + {"name": "wb_dps550", "bus": 24, "loc": 0x58}, + {"name": "wb_24c02", "bus": 25, "loc": 0x50}, + {"name": "wb_dps550", "bus": 25, "loc": 0x58}, + # temp + {"name": "wb_lm75", "bus": 3, "loc": 0x48}, + {"name": "wb_lm75", "bus": 3, "loc": 0x49}, + {"name": "wb_lm75", "bus": 3, "loc": 0x4a}, + {"name": "wb_lm75", "bus": 3, "loc": 0x4b}, + {"name": "wb_lm75", "bus": 3, "loc": 0x4c}, + # dcdc + {"name": "wb_ina3221", "bus": 7, "loc": 0x40}, + {"name": "wb_ina3221", "bus": 7, "loc": 0x41}, + {"name": "wb_ina3221", "bus": 7, "loc": 0x42}, + {"name": "wb_ina3221", "bus": 7, "loc": 0x43}, + {"name": "wb_tps53622", "bus": 7, "loc": 0x60}, + {"name": "wb_tps53622", "bus": 7, "loc": 0x6c}, + {"name": "wb_isl68127", "bus": 7, "loc": 0x64}, +] + +OPTOE = [ + {"name": "wb_optoe2", "startbus": 32, "endbus": 79}, + {"name": "wb_optoe1", "startbus": 80, "endbus": 87}, +] DEV_MONITOR_PARAM = { "polling_time": 10, "psus": [ { "name": "psu1", - "present": { - "gettype": "i2c", - "bus": 2, - "loc": 0x37, - "offset": 0x51, - "presentbit": 0, - "okval": 0, - }, + "present": {"gettype": "i2c", "bus": 6, "loc": 0x0d, "offset": 0x51, "presentbit": 0, "okval": 0}, "device": [ - { - "id": "psu1pmbus", - "name": "dps550", - "bus": 7, - "loc": 0x58, - "attr": "hwmon", - }, + {"id": "psu1pmbus", "name": "wb_dps550", "bus": 24, "loc": 0x58, "attr": "hwmon"}, + {"id": "psu1frue2", "name": "wb_24c02", "bus": 24, "loc": 0x50, "attr": "eeprom"}, ], }, { "name": "psu2", - "present": { - "gettype": "i2c", - "bus": 2, - "loc": 0x37, - "offset": 0x51, - "presentbit": 4, - "okval": 0, - }, + "present": {"gettype": "i2c", "bus": 6, "loc": 0x0d, "offset": 0x51, "presentbit": 4, "okval": 0}, "device": [ + {"id": "psu2pmbus", "name": "wb_dps550", "bus": 25, "loc": 0x58, "attr": "hwmon"}, + {"id": "psu2frue2", "name": "wb_24c02", "bus": 25, "loc": 0x50, "attr": "eeprom"}, + ], + }, + ], + "fans": [ + { + "name": "fan1", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 0, "okval": 0}, + "device": [ + {"id": "fan1frue2", "name": "24c02", "bus": 16, "loc": 0x50, "attr": "eeprom"}, + ], + }, + { + "name": "fan2", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 1, "okval": 0}, + "device": [ + {"id": "fan2frue2", "name": "24c02", "bus": 17, "loc": 0x50, "attr": "eeprom"}, + ], + }, + { + "name": "fan3", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 2, "okval": 0}, + "device": [ + {"id": "fan3frue2", "name": "24c02", "bus": 18, "loc": 0x50, "attr": "eeprom"}, + ], + }, + { + "name": "fan4", + "present": {"gettype": "i2c", "bus": 2, "loc": 0x0d, "offset": 0x30, "presentbit": 3, "okval": 0}, + "device": [ + {"id": "fan4frue2", "name": "24c02", "bus": 19, "loc": 0x50, "attr": "eeprom"}, + ], + }, + ], + "others": [ + { + "name": "eeprom", + "device": [ + {"id": "eeprom_1", "name": "wb_24c02", "bus": 0, "loc": 0x56, "attr": "eeprom"}, + ], + }, + { + "name": "lm75", + "device": [ + {"id": "lm75_1", "name": "wb_lm75", "bus": 3, "loc": 0x48, "attr": "hwmon"}, + {"id": "lm75_2", "name": "wb_lm75", "bus": 3, "loc": 0x49, "attr": "hwmon"}, + {"id": "lm75_3", "name": "wb_lm75", "bus": 3, "loc": 0x4a, "attr": "hwmon"}, + {"id": "lm75_4", "name": "wb_lm75", "bus": 3, "loc": 0x4b, "attr": "hwmon"}, + {"id": "lm75_5", "name": "wb_lm75", "bus": 3, "loc": 0x4c, "attr": "hwmon"}, + ], + }, + { + "name": "mac_bsc", + "device": [ + {"id": "mac_bsc_1", "name": "wb_mac_bsc_td3", "bus": 3, "loc": 0x44, "attr": "hwmon"}, + ], + }, + { + "name": "ina3221", + "device": [ + {"id": "ina3221_1", "name": "wb_ina3221", "bus": 7, "loc": 0x40, "attr": "hwmon"}, + {"id": "ina3221_2", "name": "wb_ina3221", "bus": 7, "loc": 0x41, "attr": "hwmon"}, + {"id": "ina3221_3", "name": "wb_ina3221", "bus": 7, "loc": 0x42, "attr": "hwmon"}, + {"id": "ina3221_4", "name": "wb_ina3221", "bus": 7, "loc": 0x43, "attr": "hwmon"}, + ], + }, + { + "name": "tps53622", + "device": [ + {"id": "tps53622_1", "name": "wb_tps53622", "bus": 7, "loc": 0x60, "attr": "hwmon"}, + {"id": "tps53622_2", "name": "wb_tps53622", "bus": 7, "loc": 0x6c, "attr": "hwmon"}, + ], + }, + { + "name": "isl68127", + "device": [ + {"id": "isl68127_1", "name": "wb_isl68127", "bus": 7, "loc": 0x64, "attr": "hwmon"}, + ], + } + ], +} + +INIT_PARAM_PRE = [ + {"loc": "7-0064/hwmon/hwmon*/avs0_vout_max", "value": "900000"}, + {"loc": "7-0064/hwmon/hwmon*/avs0_vout_min", "value": "750000"}, +] +INIT_COMMAND_PRE = [ + "i2cset -y -f 6 0x0d 0x91 0x48", + "i2cset -y -f 6 0x0d 0x92 0x01", # MAC_PWR_EN + "i2cset -y -f 6 0x0d 0x94 0x01", # SFF_PWR_EN + "i2cset -y -f 6 0x0d 0xbf 0x01", # enbale tty_console monitor +] + +INIT_PARAM = [] + +INIT_COMMAND = [ + "i2cset -y -f 8 0x30 0x60 0x00", # enable txdis[1~8] + "i2cset -y -f 8 0x30 0x61 0x00", # enable txdis[9~16] + "i2cset -y -f 8 0x30 0x62 0x00", # enable txdis[17~24] + "i2cset -y -f 8 0x31 0x60 0x00", # enable txdis[24~32] + "i2cset -y -f 8 0x31 0x61 0x00", # enable txdis[33~40] + "i2cset -y -f 8 0x31 0x62 0x00", # enable txdis[41~48] +] + +REBOOT_CAUSE_PARA = { + "reboot_cause_list": [ + { + "name": "otp_switch_reboot", + "monitor_point": {"gettype": "file_exist", "judge_file": "/etc/.otp_switch_reboot_flag", "okval": True}, + "record": [ + {"record_type": "file", "mode": "cover", "log": "Thermal Overload: ASIC, ", + "path": "/etc/sonic/.reboot/.previous-reboot-cause.txt"}, + {"record_type": "file", "mode": "add", "log": "Thermal Overload: ASIC, ", + "path": "/etc/sonic/.reboot/.history-reboot-cause.txt", "file_max_size": 1 * 1024 * 1024} + ], + "finish_operation": [ + {"gettype": "cmd", "cmd": "rm -rf /etc/.otp_switch_reboot_flag"}, + ] + }, + { + "name": "otp_other_reboot", + "monitor_point": {"gettype": "file_exist", "judge_file": "/etc/.otp_other_reboot_flag", "okval": True}, + "record": [ + {"record_type": "file", "mode": "cover", "log": "Thermal Overload: Other, ", + "path": "/etc/sonic/.reboot/.previous-reboot-cause.txt"}, + {"record_type": "file", "mode": "add", "log": "Thermal Overload: Other, ", + "path": "/etc/sonic/.reboot/.history-reboot-cause.txt", "file_max_size": 1 * 1024 * 1024} + ], + "finish_operation": [ + {"gettype": "cmd", "cmd": "rm -rf /etc/.otp_other_reboot_flag"}, + ] + }, + ], + "other_reboot_cause_record": [ + {"record_type": "file", "mode": "cover", "log": "Other, ", "path": "/etc/sonic/.reboot/.previous-reboot-cause.txt"}, + {"record_type": "file", "mode": "add", "log": "Other, ", "path": "/etc/sonic/.reboot/.history-reboot-cause.txt"} + ], +} + +UPGRADE_SUMMARY = { + "devtype": 0x404a, + + "slot0": { + "subtype": 0, + "VME": { + "chain1": { + "name": "VME_CPLD", + "is_support_warm_upg": 0, + }, + }, + + "SPI-LOGIC-DEV": { + "chain3": { + "name": "FPGA", + "is_support_warm_upg": 0, + }, + }, + + "MTD": { + "chain2": { + "name": "BIOS", + "is_support_warm_upg": 0, + "filesizecheck": 10240, # bios check file size, Unit: K + "init_cmd": [ + {"io_addr": 0x722, "value": 0x02, "gettype": "io"}, + {"cmd": "modprobe mtd", "gettype": "cmd"}, + {"cmd": "modprobe spi_nor", "gettype": "cmd"}, + {"cmd": "modprobe ofpart", "gettype": "cmd"}, + {"cmd": "modprobe intel_spi writeable=1", "gettype": "cmd"}, + {"cmd": "modprobe intel_spi_platform writeable=1", "gettype": "cmd"}, + ], + "finish_cmd": [ + {"cmd": "rmmod intel_spi_platform", "gettype": "cmd"}, + {"cmd": "rmmod intel_spi", "gettype": "cmd"}, + {"cmd": "rmmod ofpart", "gettype": "cmd"}, + {"cmd": "rmmod spi_nor", "gettype": "cmd"}, + {"cmd": "rmmod mtd", "gettype": "cmd"}, + ], + }, + }, + + "TEST": { + "cpld": [ + {"chain": 1, "file": "/etc/.upgrade_test/cpld_test_header.vme", "display_name": "CPLD"}, + ], + "fpga": [ { - "id": "psu2pmbus", - "name": "dps550", - "bus": 8, - "loc": 0x5B, - "attr": "hwmon", + "chain": 3, + "file": "/etc/.upgrade_test/fpga_test_header.bin", + "display_name": "FPGA", + }, + ], + }, + }, + + "BMC": { + "name": "BMC", + "init_cmd": [ + ], + "finish_cmd": [], + }, +} + + +PLATFORM_E2_CONF = { + "fan": [ + { + "name": "fan1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/16-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + { + "name": "fan2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/17-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + { + "name": "fan3", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/18-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" + }, + ], + }, + { + "name": "fan4", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/19-0050/eeprom", + "e2_decode": [ + { + "area": "productInfoArea", "field": "productVersion", "decode_type": "func", "func_name": "fru_decode_hw" + }, + { + "area": "boardInfoArea", "field": "boardextra1", "decode_type": "func", "func_name": "fru_decode_hw" }, ], }, ], -} - -fanlevel = { - "tips":["LOW","MEDIUM","HIGH"], - "level":[51,150,255], - "low_speed":[500,7500,17000], - "high_speed":[11000,22500,28500] -} - -# fit with pddf -fanloc = [ - { - "name": "FAN1/FAN2/FAN3/FAN4", - "location": "2-0066/fan1_pwm", - "childfans": [ - {"name": "FAN1", "location": "2-0066/fan1_input"}, - {"name": "FAN2", "location": "2-0066/fan2_input"}, - {"name": "FAN3", "location": "2-0066/fan3_input"}, - {"name": "FAN4", "location": "2-0066/fan4_input"}, - ], - }, -] - - - -MONITOR_TEMP_MIN = 38 -MONITOR_K = 11 -MONITOR_MAC_IN = 35 -MONITOR_DEFAULT_SPEED = 0x60 -MONITOR_MAX_SPEED = 0xFF -MONITOR_MIN_SPEED = 0x33 -MONITOR_MAC_ERROR_SPEED = 0XBB -MONITOR_FAN_TOTAL_NUM = 4 -MONITOR_MAC_UP_TEMP = 50 -MONITOR_MAC_LOWER_TEMP = -50 -MONITOR_MAC_MAX_TEMP = 100 - -MONITOR_FALL_TEMP = 4 -MONITOR_MAC_WARNING_THRESHOLD = 100 -MONITOR_OUTTEMP_WARNING_THRESHOLD = 85 -MONITOR_BOARDTEMP_WARNING_THRESHOLD = 85 -MONITOR_CPUTEMP_WARNING_THRESHOLD = 85 -MONITOR_INTEMP_WARNING_THRESHOLD = 70 - -MONITOR_MAC_CRITICAL_THRESHOLD = 105 -MONITOR_OUTTEMP_CRITICAL_THRESHOLD = 90 -MONITOR_BOARDTEMP_CRITICAL_THRESHOLD = 90 -MONITOR_CPUTEMP_CRITICAL_THRESHOLD = 100 -MONITOR_INTEMP_CRITICAL_THRESHOLD = 80 -MONITOR_CRITICAL_NUM = 3 -MONITOR_SHAKE_TIME = 20 -MONITOR_INTERVAL = 60 - -MONITOR_SYS_LED = [ - {"bus":2,"devno":0x33, "addr":0xb2, "yellow":0x03, "red":0x02,"green":0x01}, - {"bus":2,"devno":0x37, "addr":0xb2, "yellow":0x03, "red":0x02,"green":0x01}] - -MONITOR_SYS_FAN_LED =[ - {"bus":2,"devno":0x33, "addr":0xb4, "yellow":0x06, "red":0x02,"green":0x04}, - ] -MONITOR_FANS_LED = [ - {"bus":2,"devno":0x32, "addr":0x23, "green":0x09, "red":0x0a}, - {"bus":2,"devno":0x32, "addr":0x24, "green":0x09, "red":0x0a}, - {"bus":2,"devno":0x32, "addr":0x25, "green":0x09, "red":0x0a}, - {"bus":2,"devno":0x32, "addr":0x26, "green":0x09, "red":0x0a}] - - -CPLDVERSIONS = [ - {"bus":2, "devno":0x33, "name":"MAC BOARD CPLD-A"}, - {"bus":2, "devno":0x35, "name":"MAC BOARD CPLD-B"}, - {"bus":2, "devno":0x37, "name":"CONNECT BOARD CPLD-A"}, - {"bus":0, "devno":0x0d, "name":"CPU BOARD CPLD"}, -] - -MONITOR_SYS_PSU_LED =[ - {"bus":2,"devno":0x33, "addr":0xb3, "yellow":0x06, "red":0x02,"green":0x04}, - ] - -MONITOR_FAN_STATUS = [ - {'status':'green' , 'minOkNum':4,'maxOkNum':4}, - {'status':'yellow', 'minOkNum':3,'maxOkNum':3}, - {'status':'red' , 'minOkNum':0,'maxOkNum':2}, - ] - -MONITOR_PSU_STATUS = [ - {'status':'green' , 'minOkNum':2,'maxOkNum':2}, - {'status':'yellow', 'minOkNum':1,'maxOkNum':1}, - {'status':'red' , 'minOkNum':0,'maxOkNum':0}, - ] - - -MONITOR_DEV_STATUS = { - "temperature": [ - {"name":"lm75in", "location":"/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_input"}, - {"name":"lm75out", "location":"/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_input"}, - {"name":"lm75hot", "location":"/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_input"}, - {"name":"cpu", "location":"/sys/class/hwmon/hwmon0"}, + "psu": [ + {"name": "psu1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/24-0050/eeprom"}, + {"name": "psu2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/25-0050/eeprom"}, ], + "syseeprom": [ + {"name": "syseeprom", "e2_type": "onie_tlv", "e2_path": "/sys/bus/i2c/devices/0-0056/eeprom"}, + ], +} + +AIR_FLOW_CONF = { + "psu_fan_airflow": { + "intake": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "exhaust": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] + }, + + "fanairflow": { + "intake": ['M1HFAN I-F'], + "exhaust": ['M1HFAN I-R'] + }, + "fans": [ { - "name":"fan1", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':0}, - "rollstatus": [ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':0}, - ] + "name": "FAN1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/16-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" }, { - "name":"fan2", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':1}, - "rollstatus":[ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':1}, - ] + "name": "FAN2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/17-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" }, { - "name":"fan3", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':2}, - "rollstatus":[ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':2}, - ] + "name": "FAN3", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/18-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" }, { - "name":"fan4", - "presentstatus":{"bus":2, "loc":0x37, "offset":0x30, 'bit':3}, - "rollstatus":[ - {"name":"motor1","bus":2, "loc":0x37, "offset":0x31, 'bit':3}, - ] - }, + "name": "FAN4", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/19-0050/eeprom", + "area": "productInfoArea", "field": "productName", "decode": "fanairflow" + } ], - "psus": [ - {"name":"psu1", "bus":2, "loc":0x37, "offset":0x51, "gettype":"i2c", 'presentbit': 0, 'statusbit':1,'alertbit':2}, - {"name":"psu2", "bus":2, "loc":0x37, "offset":0x51, "gettype":"i2c", 'presentbit': 4, 'statusbit':5,'alertbit':6}, - ], - "mac_temp" : { - "flag" : {"bus":2, "loc":0x33, "offset":0xd4, "gettype":"i2c", 'okbit': 0, 'okval':1}, - "loc" : [ - "2-0035/mac_temp_input", - ], - "try_bcmcmd" : 0, - }, + + "psus": [ + { + "name": "PSU1", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/24-0050/eeprom", + "area": "productInfoArea", "field": "productPartModelName", "decode": "psu_fan_airflow" + }, + { + "name": "PSU2", "e2_type": "fru", "e2_path": "/sys/bus/i2c/devices/25-0050/eeprom", + "area": "productInfoArea", "field": "productPartModelName", "decode": "psu_fan_airflow" + } + ] } - -MONITOR_DEV_STATUS_DECODE = { - 'fanpresent': {0:'PRESENT', 1:'ABSENT', 'okval':0}, - 'fanroll' : {0:'STALL' , 1:'ROLL', 'okval':1}, - 'psupresent': {0:'PRESENT', 1:'ABSENT', 'okval':0}, - 'psuoutput' : {0:'FAULT' , 1:'NORMAL', 'okval':1}, - 'psualert' : {0:'FAULT' , 1:'NORMAL', 'okval':1}, -} -################################################################### - - - -MAC_AVS_PARAM ={ - 0x72:0x0384, - 0x73:0x037e, - 0x74:0x0378, - 0x75:0x0372, - 0x76:0x036b, - 0x77:0x0365, - 0x78:0x035f, - 0x79:0x0359, - 0x7a:0x0352, - 0x7b:0x034c, - 0x7c:0x0346, - 0x7d:0x0340, - 0x7e:0x0339, - 0x7f:0x0333, - 0x80:0x032d, - 0x81:0x0327, - 0x82:0x0320, - 0x83:0x031a, - 0x84:0x0314, - 0x85:0x030e, - 0x86:0x0307, - 0x87:0x0301, - 0x88:0x02fb, - 0x89:0x02f5, - 0x8A:0x02ee -} - -MAC_DEFAULT_PARAM = { - "type": 1, - "default":0x74, - "loopaddr":0x00, - "loop":0x00, - "open":0x00, - "close":0x40, - "bus":2, - "devno":0x60, - "addr":0x21, - "protectaddr":0x10, - "sdkreg":"TOP_AVS_SEL_REG", - "sdkcmd": "scdcmd", - "sdkcmdargs": ["-t", 5], - "sdktype": 0, - "macregloc":24 , - "mask": 0xff -} - - - -DEVICE = [] -DRIVERLISTS = [] - -""" -## -DRIVERLISTS = [ - {"name":"i2c_dev", "delay":0}, - {"name":"i2c_algo_bit","delay":0}, - {"name":"i2c_gpio", "delay":0}, - {"name":"i2c_mux", "delay":0}, - {"name":"i2c_mux_pca9641", "delay":0}, - {"name":"i2c_mux_pca954x force_create_bus=1", "delay":0},# force_deselect_on_exit=1 - {"name":"lm75", "delay":0}, - {"name":"optoe", "delay":0}, - {"name":"at24", "delay":0}, - {"name":"rg_sff", "delay":0}, - {"name":"ragile_b6510_platform", "delay":0}, - {"name":"ragile_platform", "delay":0}, - {"name":"rg_avs", "delay":0}, - {"name":"rg_cpld", "delay":0}, - {"name":"rg_fan", "delay":0}, - {"name":"rg_psu", "delay":0}, - {"name":"pmbus_core", "delay":0}, - {"name":"csu550", "delay":0}, - {"name":"rg_gpio_xeon", "delay":0}, - {"name":"firmware_driver", "delay":0}, - {"name":"firmware_bin", "delay":0}, - {"name":"ragile_b6510_sfputil", "delay":0}, - {"name":"ragile_common dfd_my_type=0x404a", "delay":0}, - {"name":"lpc_dbg", "delay":0}, -] - -DEVICE = [ - {"name":"pca9641","bus":0 ,"loc":0x10 }, - {"name":"pca9548","bus":2 ,"loc":0x70 }, - {"name":"lm75","bus": 2, "loc":0x48 }, - {"name":"lm75","bus": 2, "loc":0x49 }, - {"name":"lm75","bus": 2, "loc":0x4a }, - {"name":"24c02","bus":2 , "loc":0x57 }, - {"name":"rg_cpld","bus":0 ,"loc":0x32 }, - {"name":"rg_cpld","bus":1 ,"loc":0x34 }, - {"name":"rg_cpld","bus":1 ,"loc":0x36 }, - {"name":"rg_cpld","bus":2 ,"loc":0x33 }, - {"name":"rg_cpld","bus":2 ,"loc":0x35 }, - {"name":"rg_cpld","bus":2 ,"loc":0x37 }, - {"name":"rg_avs","bus": 2 ,"loc":0x60 }, - {"name":"pca9548","bus":1,"loc":0x70 }, - {"name":"pca9548","bus":1,"loc":0x71 }, - {"name":"pca9548","bus":1,"loc":0x72 }, - {"name":"pca9548","bus":1,"loc":0x73 }, - {"name":"pca9548","bus":1,"loc":0x74 }, - {"name":"pca9548","bus":1,"loc":0x75 }, - {"name":"pca9548","bus":1,"loc":0x76 }, - {"name":"rg_fan","bus":3,"loc":0x53 }, - {"name":"rg_fan","bus":4,"loc":0x53 }, - {"name":"rg_fan","bus":5,"loc":0x53 }, - {"name":"rg_fan","bus":6,"loc":0x53 }, - {"name":"rg_psu","bus":7 ,"loc":0x50 }, - {"name":"dps550","bus":7 ,"loc":0x58 }, - {"name":"rg_psu","bus":8 ,"loc":0x53 }, - {"name":"dps550","bus":8 ,"loc":0x5b }, - {"name": "optoe2", "bus": 11, "loc": 0x50}, - {"name": "optoe2", "bus": 12, "loc": 0x50}, - {"name": "optoe2", "bus": 13, "loc": 0x50}, - {"name": "optoe2", "bus": 14, "loc": 0x50}, - {"name": "optoe2", "bus": 15, "loc": 0x50}, - {"name": "optoe2", "bus": 16, "loc": 0x50}, - {"name": "optoe2", "bus": 17, "loc": 0x50}, - {"name": "optoe2", "bus": 18, "loc": 0x50}, - {"name": "optoe2", "bus": 19, "loc": 0x50}, - {"name": "optoe2", "bus": 20, "loc": 0x50}, - {"name": "optoe2", "bus": 21, "loc": 0x50}, - {"name": "optoe2", "bus": 22, "loc": 0x50}, - {"name": "optoe2", "bus": 23, "loc": 0x50}, - {"name": "optoe2", "bus": 24, "loc": 0x50}, - {"name": "optoe2", "bus": 25, "loc": 0x50}, - {"name": "optoe2", "bus": 26, "loc": 0x50}, - {"name": "optoe2", "bus": 27, "loc": 0x50}, - {"name": "optoe2", "bus": 28, "loc": 0x50}, - {"name": "optoe2", "bus": 29, "loc": 0x50}, - {"name": "optoe2", "bus": 30, "loc": 0x50}, - {"name": "optoe2", "bus": 31, "loc": 0x50}, - {"name": "optoe2", "bus": 32, "loc": 0x50}, - {"name": "optoe2", "bus": 33, "loc": 0x50}, - {"name": "optoe2", "bus": 34, "loc": 0x50}, - {"name": "optoe2", "bus": 35, "loc": 0x50}, - {"name": "optoe2", "bus": 36, "loc": 0x50}, - {"name": "optoe2", "bus": 37, "loc": 0x50}, - {"name": "optoe2", "bus": 38, "loc": 0x50}, - {"name": "optoe2", "bus": 39, "loc": 0x50}, - {"name": "optoe2", "bus": 40, "loc": 0x50}, - {"name": "optoe2", "bus": 41, "loc": 0x50}, - {"name": "optoe2", "bus": 42, "loc": 0x50}, - {"name": "optoe2", "bus": 43, "loc": 0x50}, - {"name": "optoe2", "bus": 44, "loc": 0x50}, - {"name": "optoe2", "bus": 45, "loc": 0x50}, - {"name": "optoe2", "bus": 46, "loc": 0x50}, - {"name": "optoe2", "bus": 47, "loc": 0x50}, - {"name": "optoe2", "bus": 48, "loc": 0x50}, - {"name": "optoe2", "bus": 49, "loc": 0x50}, - {"name": "optoe2", "bus": 50, "loc": 0x50}, - {"name": "optoe2", "bus": 51, "loc": 0x50}, - {"name": "optoe2", "bus": 52, "loc": 0x50}, - {"name": "optoe2", "bus": 53, "loc": 0x50}, - {"name": "optoe2", "bus": 54, "loc": 0x50}, - {"name": "optoe2", "bus": 55, "loc": 0x50}, - {"name": "optoe2", "bus": 56, "loc": 0x50}, - {"name": "optoe2", "bus": 57, "loc": 0x50}, - {"name": "optoe2", "bus": 58, "loc": 0x50}, - {"name": "optoe1", "bus": 59, "loc": 0x50}, - {"name": "optoe1", "bus": 60, "loc": 0x50}, - {"name": "optoe1", "bus": 61, "loc": 0x50}, - {"name": "optoe1", "bus": 62, "loc": 0x50}, - {"name": "optoe1", "bus": 63, "loc": 0x50}, - {"name": "optoe1", "bus": 64, "loc": 0x50}, - {"name": "optoe1", "bus": 65, "loc": 0x50}, - {"name": "optoe1", "bus": 66, "loc": 0x50}, -] - -INIT_PARAM = [ - {"loc":"1-0034/sfp_enable","value": "01"}, - {"loc":"2-0035/sfp_enable2","value":"ff"}, - {"loc":"2-0033/mac_led", "value":"ff"}, - {"loc":"1-0034/sfp_txdis1","value":"00"}, - {"loc":"1-0034/sfp_txdis2","value":"00"}, - {"loc":"1-0034/sfp_txdis3","value":"00"}, - {"loc":"1-0036/sfp_txdis4","value":"00"}, - {"loc":"1-0036/sfp_txdis5","value":"00"}, - {"loc":"1-0036/sfp_txdis6","value":"00"}, - {"loc":fanloc[0]["location"], "value":"80"}, - {"loc":"2-0033/sfp_led1_yellow","value":"ad"}, - {"loc":"2-0035/sfp_led2_yellow","value":"ad"}, -] -""" - -INIT_PARAM = [ - { - "name": "sfp_enable", - "bus": 1, - "devaddr": 0x34, - "offset": 0xa1, - "val": 0x01, - }, - { - "name": "sfp_eanble2", - "bus": 2, - "devaddr": 0x35, - "offset": 0xa0, - "val": 0xff, - }, - { - "name": "mac_led", - "bus": 2, - "devaddr": 0x33, - "offset": 0xa0, - "val": 0xff, - }, - { - "name": "sfp_txdis1", - "bus": 1, - "devaddr": 0x34, - "offset": 0x60, - "val": 0x00, - }, - { - "name": "sfp_txdis2", - "bus": 1, - "devaddr": 0x34, - "offset": 0x61, - "val": 0x00, - }, - { - "name": "sfp_txdis3", - "bus": 1, - "devaddr": 0x34, - "offset": 0x62, - "val": 0x00, - }, - { - "name": "sfp_txdis4", - "bus": 1, - "devaddr": 0x36, - "offset": 0x60, - "val": 0x00, - }, - { - "name": "sfp_txdis5", - "bus": 1, - "devaddr": 0x36, - "offset": 0x61, - "val": 0x00, - }, - { - "name": "sfp_txdis6", - "bus": 1, - "devaddr": 0x36, - "offset": 0x62, - "val": 0x00, - }, - { - "name": "sfp_led1_yellow", - "bus": 2, - "devaddr": 0x33, - "offset": 0xad, - "val": 0xad, - }, - { - "name": "sfp_led2_yellow", - "bus": 2, - "devaddr": 0x35, - "offset": 0xad, - "val": 0xad, - }, - { - "name": "fan_speed_set", - "bus": 0, - "devaddr": 0x32, - "offset": 0x15, - "val": 0x80, - }, -] diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py new file mode 100644 index 0000000000..26f92a77a0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/config/x86_64_ragile_ra_b6510_48v8c_r0_port_config.py @@ -0,0 +1,7 @@ +#!/usr/bin/python3 +# -*- coding: UTF-8 -*- + +PLATFORM_INTF_OPTOE = { + "port_num": 56, + "optoe_start_bus": 32, +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py new file mode 100644 index 0000000000..ba1a8dea0b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_device.py @@ -0,0 +1,1234 @@ +#!/usr/bin/python3 + +psu_fan_airflow = { + "intake": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "exhaust": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +fanairflow = { + "intake": ['M1HFAN I-F'], + "exhaust": ['M1HFAN I-R'], +} + +psu_display_name = { + "PA550II-F": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "PA550II-R": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +psutypedecode = { + 0x00: 'N/A', + 0x01: 'AC', + 0x02: 'DC', +} + + +class Unit: + Temperature = "C" + Voltage = "V" + Current = "A" + Power = "W" + Speed = "RPM" + + +PSU_NOT_PRESENT_PWM = 100 + + +class threshold: + PSU_TEMP_MIN = -20 * 1000 + PSU_TEMP_MAX = 60 * 1000 + + PSU_FAN_SPEED_MIN = 2000 + PSU_FAN_SPEED_MAX = 18000 + + PSU_OUTPUT_VOLTAGE_MIN = 11 * 1000 + PSU_OUTPUT_VOLTAGE_MAX = 14 * 1000 + + PSU_AC_INPUT_VOLTAGE_MIN = 200 * 1000 + PSU_AC_INPUT_VOLTAGE_MAX = 240 * 1000 + + PSU_DC_INPUT_VOLTAGE_MIN = 190 * 1000 + PSU_DC_INPUT_VOLTAGE_MAX = 290 * 1000 + + ERR_VALUE = -9999999 + + PSU_OUTPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_OUTPUT_POWER_MAX = 560 * 1000 * 1000 + + PSU_INPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_INPUT_POWER_MAX = 625 * 1000 * 1000 + + PSU_OUTPUT_CURRENT_MIN = 1 * 1000 + PSU_OUTPUT_CURRENT_MAX = 45 * 1000 + + PSU_INPUT_CURRENT_MIN = 0 * 1000 + PSU_INPUT_CURRENT_MAX = 7 * 1000 + + FRONT_FAN_SPEED_MAX = 24000 + REAR_FAN_SPEED_MAX = 22500 + FAN_SPEED_MIN = 5000 + + +class Description: + CPLD = "Used for managing IO modules, SFP+ modules and system LEDs" + BIOS = "Performs initialization of hardware components during booting" + FPGA = "Platform management controller for on-board temperature monitoring, in-chassis power" + + +devices = { + "onie_e2": [ + { + "name": "ONIE_E2", + "e2loc": {"loc": "/sys/bus/i2c/devices/0-0056/eeprom", "way": "sysfs"}, + "airflow": "intake" + }, + ], + "psus": [ + { + "e2loc": {"loc": "/sys/bus/i2c/devices/24-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 24, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU1", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 24, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + }, + { + "e2loc": {"loc": "/sys/bus/i2c/devices/25-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 25, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU2", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 25, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + } + ], + "temps": [ + { + "name": "SWITCH_TEMP", + "temp_id": "TEMP1", + "api_name": "ASIC_TEMP", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0044/hwmon/hwmon*/temp99_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 105000, + "Max": 110000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "CPU_TEMP", + "temp_id": "TEMP2", + "Temperature": { + "value": {"loc": "/sys/bus/platform/devices/coretemp.0/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -15000, + "Low": 0, + "High": 100000, + "Max": 102000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "INLET_TEMP", + "temp_id": "TEMP3", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0048/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "fix_value": { + "fix_type": "config", + "addend": -3, + } + }, + { + "name": "OUTLET_TEMP", + "temp_id": "TEMP4", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004c/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "BOARD_TEMP", + "temp_id": "TEMP5", + "api_name": "MAC_OUT_TEMP", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004a/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "MAC_IN_TEMP", + "temp_id": "TEMP6", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0049/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU1_TEMP", + "temp_id": "TEMP7", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU2_TEMP", + "temp_id": "TEMP8", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "SFF_TEMP", + "Temperature": { + "value": {"loc": "/tmp/highest_sff_temp", "way": "sysfs", "flock_path": "/tmp/highest_sff_temp"}, + "Min": -30000, + "Low": 0, + "High": 90000, + "Max": 100000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "invalid": -10000, + "error": -9999, + } + ], + "leds": [ + { + "name": "FRONT_SYS_LED", + "led_type": "SYS_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x72, "way": "i2c"}, + "led_attrs": { + "off": 0x00, "red_flash": 0x01, "red": 0x02, + "green_flash": 0x03, "green": 0x04, "amber_flash": 0x05, + "amber": 0x06, "mask": 0x07 + }, + }, + { + "name": "FRONT_PSU_LED", + "led_type": "PSU_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x73, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + { + "name": "FRONT_FAN_LED", + "led_type": "FAN_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x74, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + ], + "fans": [ + { + "name": "FAN1", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-16/16-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3b, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN2", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-17/17-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3c, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN3", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-18/18-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan3/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3d, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + { + "name": "FAN4", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-19/19-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan4/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3e, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + ], + "cplds": [ + { + "name": "CPU_CPLD", + "cpld_id": "CPLD1", + "VersionFile": {"loc": "/dev/cpld0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for system power", + "slot": 0, + "warm": 0, + + }, + { + "name": "CONNECT_CPLD", + "cpld_id": "CPLD2", + "VersionFile": {"loc": "/dev/cpld1", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "warm": 0, + }, + { + "name": "CONNECT_CPLD-FAN", + "cpld_id": "CPLD3", + "VersionFile": {"loc": "/dev/cpld2", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for fan modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD1", + "cpld_id": "CPLD4", + "VersionFile": {"loc": "/dev/cpld3", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD2", + "cpld_id": "CPLD5", + "VersionFile": {"loc": "/dev/cpld4", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "FPGA", + "cpld_id": "CPLD6", + "VersionFile": {"loc": "/dev/fpga0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "format": "little_endian", + "warm": 0, + }, + { + "name": "BIOS", + "cpld_id": "CPLD7", + "VersionFile": {"cmd": "dmidecode -s bios-version", "way": "cmd"}, + "desc": "Performs initialization of hardware components during booting", + "slot": 0, + "type": "str", + "warm": 0, + }, + ], + "dcdc": [ + { + "name": "Switch_ZSFP1_3v3_C", + "dcdc_id": "DCDC1", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_C", + "dcdc_id": "DCDC2", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_C", + "dcdc_id": "DCDC3", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ZSFP1_3v3_V", + "dcdc_id": "DCDC4", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_V", + "dcdc_id": "DCDC5", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_V", + "dcdc_id": "DCDC6", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_C", + "dcdc_id": "DCDC7", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_C", + "dcdc_id": "DCDC8", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_C", + "dcdc_id": "DCDC9", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_V", + "dcdc_id": "DCDC10", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_V", + "dcdc_id": "DCDC11", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_V", + "dcdc_id": "DCDC12", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_C", + "dcdc_id": "DCDC13", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_C", + "dcdc_id": "DCDC14", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2800, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_C", + "dcdc_id": "DCDC15", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4500, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_V", + "dcdc_id": "DCDC16", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_V", + "dcdc_id": "DCDC17", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_V", + "dcdc_id": "DCDC18", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_C", + "dcdc_id": "DCDC19", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4686, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_C", + "dcdc_id": "DCDC20", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_C", + "dcdc_id": "DCDC21", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_V", + "dcdc_id": "DCDC22", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_V", + "dcdc_id": "DCDC23", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_V", + "dcdc_id": "DCDC24", + "Min": 1360, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2040, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_C", + "dcdc_id": "DCDC25", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 47300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_C", + "dcdc_id": "DCDC26", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 15400, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_V", + "dcdc_id": "DCDC27", + "Min": 1456, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2184, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_V", + "dcdc_id": "DCDC28", + "Min": 840, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1260, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_C", + "dcdc_id": "DCDC29", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 220000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_C", + "dcdc_id": "DCDC30", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 18000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_V", + "dcdc_id": "DCDC31", + "Min": 600, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_V", + "dcdc_id": "DCDC32", + "Min": 640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_C", + "dcdc_id": "DCDC33", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 9900, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_C", + "dcdc_id": "DCDC34", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_V", + "dcdc_id": "DCDC35", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_V", + "dcdc_id": "DCDC36", + "Min": 1784, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2676, + "format": "float(float(%s)/1000)", + }, + ], + "cpu": [ + { + "name": "cpu", + "reboot_cause_path": "/etc/sonic/.reboot/.previous-reboot-cause.txt" + } + ], + "sfps": { + "ver": '1.0', + "port_index_start": 1, + "port_num": 56, + "log_level": 2, + "eeprom_retry_times": 5, + "eeprom_retry_break_sec": 0.2, + "presence_cpld": { + "dev_id": { + 3: { + "offset": { + 0x30: "1-8", + 0x31: "9-16", + 0x32: "17-24", + }, + }, + 4: { + "offset": { + 0x30: "25-32", + 0x31: "33-40", + 0x32: "41-48", + 0x33: "49-56", + }, + }, + }, + }, + "presence_val_is_present": 0, + "eeprom_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/eeprom", + "eeprom_path_key": list(range(32, 88)), + "optoe_driver_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/dev_class", + "optoe_driver_key": list(range(32, 88)), + "txdis_cpld": { + "dev_id": { + 3: { + "offset": { + 0x60: "1-8", + 0x61: "9-16", + 0x62: "17-24", + }, + }, + 4: { + "offset": { + 0x60: "25-32", + 0x61: "33-40", + 0x62: "41-48", + }, + }, + }, + }, + "txdisable_val_is_on": 0, + "reset_cpld": { + "dev_id": { + 4: { + "offset": { + 0xb9: "49-56", + }, + }, + }, + }, + "reset_val_is_reset": 0, + } +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py new file mode 100644 index 0000000000..0b5d750dd4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_exhaust_device.py @@ -0,0 +1,1232 @@ +#!/usr/bin/python3 + +psu_fan_airflow = { + "intake": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "exhaust": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +fanairflow = { + "intake": ['M1HFAN I-F'], + "exhaust": ['M1HFAN I-R'], +} + +psu_display_name = { + "PA550II-F": ['CSU550AP-3-500', 'DPS-550AB-39 A', 'GW-CRPS550N2C', 'CSU550AP-3-300', 'DPS-550AB-39 B', 'CSU550AP-3'], + "PA550II-R": ['CSU550AP-3-501', 'DPS-550AB-40 A', 'GW-CRPS550N2RC'] +} + +psutypedecode = { + 0x00: 'N/A', + 0x01: 'AC', + 0x02: 'DC', +} + + +class Unit: + Temperature = "C" + Voltage = "V" + Current = "A" + Power = "W" + Speed = "RPM" + + +PSU_NOT_PRESENT_PWM = 100 + + +class threshold: + PSU_TEMP_MIN = -20 * 1000 + PSU_TEMP_MAX = 60 * 1000 + + PSU_FAN_SPEED_MIN = 2000 + PSU_FAN_SPEED_MAX = 18000 + + PSU_OUTPUT_VOLTAGE_MIN = 11 * 1000 + PSU_OUTPUT_VOLTAGE_MAX = 14 * 1000 + + PSU_AC_INPUT_VOLTAGE_MIN = 200 * 1000 + PSU_AC_INPUT_VOLTAGE_MAX = 240 * 1000 + + PSU_DC_INPUT_VOLTAGE_MIN = 190 * 1000 + PSU_DC_INPUT_VOLTAGE_MAX = 290 * 1000 + + ERR_VALUE = -9999999 + + PSU_OUTPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_OUTPUT_POWER_MAX = 560 * 1000 * 1000 + + PSU_INPUT_POWER_MIN = 10 * 1000 * 1000 + PSU_INPUT_POWER_MAX = 625 * 1000 * 1000 + + PSU_OUTPUT_CURRENT_MIN = 1 * 1000 + PSU_OUTPUT_CURRENT_MAX = 45 * 1000 + + PSU_INPUT_CURRENT_MIN = 0 * 1000 + PSU_INPUT_CURRENT_MAX = 7 * 1000 + + FRONT_FAN_SPEED_MAX = 24000 + REAR_FAN_SPEED_MAX = 22500 + FAN_SPEED_MIN = 5000 + + +class Description: + CPLD = "Used for managing IO modules, SFP+ modules and system LEDs" + BIOS = "Performs initialization of hardware components during booting" + FPGA = "Platform management controller for on-board temperature monitoring, in-chassis power" + + +devices = { + "onie_e2": [ + { + "name": "ONIE_E2", + "e2loc": {"loc": "/sys/bus/i2c/devices/0-0056/eeprom", "way": "sysfs"}, + "airflow": "exhaust" + }, + ], + "psus": [ + { + "e2loc": {"loc": "/sys/bus/i2c/devices/24-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 24, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU1", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 24, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 24, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + }, + { + "e2loc": {"loc": "/sys/bus/i2c/devices/25-0050/eeprom", "way": "sysfs"}, + "pmbusloc": {"bus": 25, "addr": 0x58, "way": "i2c"}, + "present": {"loc": "/sys/wb_plat/psu/psu2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "name": "PSU2", + "psu_display_name": psu_display_name, + "airflow": psu_fan_airflow, + "TempStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0004}, + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": threshold.PSU_TEMP_MIN, + "Max": threshold.PSU_TEMP_MAX, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "FanStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x0400}, + "FanSpeed": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/fan1_input", "way": "sysfs"}, + "Min": threshold.PSU_FAN_SPEED_MIN, + "Max": threshold.PSU_FAN_SPEED_MAX, + "Unit": Unit.Speed + }, + "psu_fan_tolerance": 40, + "InputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x2000}, + "InputsType": {"bus": 25, "addr": 0x58, "offset": 0x80, "way": "i2c", 'psutypedecode': psutypedecode}, + "InputsVoltage": { + 'AC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_AC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_AC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + + }, + 'DC': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.PSU_DC_INPUT_VOLTAGE_MIN, + "Max": threshold.PSU_DC_INPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + 'other': { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in1_input", "way": "sysfs"}, + "Min": threshold.ERR_VALUE, + "Max": threshold.ERR_VALUE, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + } + }, + "InputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_CURRENT_MIN, + "Max": threshold.PSU_INPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "InputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power1_input", "way": "sysfs"}, + "Min": threshold.PSU_INPUT_POWER_MIN, + "Max": threshold.PSU_INPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + "OutputsStatus": {"bus": 25, "addr": 0x58, "offset": 0x79, "way": "i2cword", "mask": 0x8800}, + "OutputsVoltage": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/in2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_VOLTAGE_MIN, + "Max": threshold.PSU_OUTPUT_VOLTAGE_MAX, + "Unit": Unit.Voltage, + "format": "float(float(%s)/1000)" + }, + "OutputsCurrent": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/curr2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_CURRENT_MIN, + "Max": threshold.PSU_OUTPUT_CURRENT_MAX, + "Unit": Unit.Current, + "format": "float(float(%s)/1000)" + }, + "OutputsPower": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/power2_input", "way": "sysfs"}, + "Min": threshold.PSU_OUTPUT_POWER_MIN, + "Max": threshold.PSU_OUTPUT_POWER_MAX, + "Unit": Unit.Power, + "format": "float(float(%s)/1000000)" + }, + } + ], + "temps": [ + { + "name": "SWITCH_TEMP", + "temp_id": "TEMP1", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0044/hwmon/hwmon*/temp99_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 105000, + "Max": 110000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "CPU_TEMP", + "temp_id": "TEMP2", + "Temperature": { + "value": {"loc": "/sys/bus/platform/devices/coretemp.0/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -15000, + "Low": 0, + "High": 100000, + "Max": 102000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "INLET_TEMP", + "temp_id": "TEMP3", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004c/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "fix_value": { + "fix_type": "config", + "addend": -3, + } + }, + { + "name": "OUTLET_TEMP", + "temp_id": "TEMP4", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0048/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "BOARD_TEMP", + "temp_id": "TEMP5", + "api_name": "MAC_OUT_TEMP", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-0049/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "MAC_IN_TEMP", + "temp_id": "TEMP6", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/3-004a/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -30000, + "Low": 0, + "High": 75000, + "Max": 80000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU1_TEMP", + "temp_id": "TEMP7", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-24/24-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "PSU2_TEMP", + "temp_id": "TEMP8", + "Temperature": { + "value": {"loc": "/sys/bus/i2c/devices/i2c-25/25-0058/hwmon/hwmon*/temp1_input", "way": "sysfs"}, + "Min": -20000, + "Low": 0, + "High": 55000, + "Max": 60000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + } + }, + { + "name": "SFF_TEMP", + "Temperature": { + "value": {"loc": "/tmp/highest_sff_temp", "way": "sysfs", "flock_path": "/tmp/highest_sff_temp"}, + "Min": -30000, + "Low": 0, + "High": 90000, + "Max": 100000, + "Unit": Unit.Temperature, + "format": "float(float(%s)/1000)" + }, + "invalid": -10000, + "error": -9999, + } + ], + "leds": [ + { + "name": "FRONT_SYS_LED", + "led_type": "SYS_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x72, "way": "i2c"}, + "led_attrs": { + "off": 0x00, "red_flash": 0x01, "red": 0x02, + "green_flash": 0x03, "green": 0x04, "amber_flash": 0x05, + "amber": 0x06, "mask": 0x07 + }, + }, + { + "name": "FRONT_PSU_LED", + "led_type": "PSU_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x73, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + { + "name": "FRONT_FAN_LED", + "led_type": "FAN_LED", + "led": {"bus": 6, "addr": 0x0d, "offset": 0x74, "way": "i2c"}, + "led_attrs": { + "off": 0x10, "red_flash": 0x11, "red": 0x12, + "green_flash": 0x13, "green": 0x14, "amber_flash": 0x15, + "amber": 0x16, "mask": 0x17 + }, + }, + ], + "fans": [ + { + "name": "FAN1", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-16/16-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan1/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3b, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x14, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan1/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan1/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN2", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-17/17-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan2/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3c, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x15, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan2/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan2/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + { + "name": "FAN3", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-18/18-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan3/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3d, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x16, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan3/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan3/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + { + "name": "FAN4", + "airflow": fanairflow, + "e2loc": {'loc': '/sys/bus/i2c/devices/i2c-19/19-0050/eeprom', 'way': 'sysfs'}, + "present": {"loc": "/sys/wb_plat/fan/fan4/present", "way": "sysfs", "mask": 0x01, "okval": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "led": {"bus": 2, "addr": 0x0d, "offset": 0x3e, "way": "i2c"}, + "led_attrs": { + "off": 0x0b, "red_flash": 0x0e, "red": 0x0a, + "green_flash": 0x0d, "green": 0x09, "amber_flash": 0x07, + "amber": 0x03, "mask": 0x0f + }, + "PowerMax": 38.4, + "Rotor": { + "Rotor1_config": { + "name": "Rotor1", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor1/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.FRONT_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor1/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.FRONT_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + "Rotor2_config": { + "name": "Rotor2", + "Set_speed": {"bus": 2, "addr": 0x0d, "offset": 0x17, "way": "i2c"}, + "Running": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "is_runing": 1}, + "HwAlarm": {"loc": "/sys/wb_plat/fan/fan4/motor0/status", "way": "sysfs", "mask": 0x01, "no_alarm": 1}, + "SpeedMin": threshold.FAN_SPEED_MIN, + "SpeedMax": threshold.REAR_FAN_SPEED_MAX, + "Speed": { + "value": {"loc": "/sys/wb_plat/fan/fan4/motor0/speed", "way": "sysfs"}, + "Min": threshold.FAN_SPEED_MIN, + "Max": threshold.REAR_FAN_SPEED_MAX, + "Unit": Unit.Speed, + }, + }, + }, + }, + + ], + "cplds": [ + { + "name": "CPU_CPLD", + "cpld_id": "CPLD1", + "VersionFile": {"loc": "/dev/cpld0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for system power", + "slot": 0, + "warm": 0, + }, + { + "name": "CONNECT_CPLD", + "cpld_id": "CPLD2", + "VersionFile": {"loc": "/dev/cpld1", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "warm": 0, + }, + { + "name": "CONNECT_CPLD-FAN", + "cpld_id": "CPLD3", + "VersionFile": {"loc": "/dev/cpld2", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for fan modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD1", + "cpld_id": "CPLD4", + "VersionFile": {"loc": "/dev/cpld3", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "MAC_CPLD2", + "cpld_id": "CPLD5", + "VersionFile": {"loc": "/dev/cpld4", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for sff modules", + "slot": 0, + "warm": 0, + }, + { + "name": "FPGA", + "cpld_id": "CPLD6", + "VersionFile": {"loc": "/dev/fpga0", "offset": 0, "len": 4, "way": "devfile_ascii"}, + "desc": "Used for base functions", + "slot": 0, + "format": "little_endian", + "warm": 0, + }, + { + "name": "BIOS", + "cpld_id": "CPLD7", + "VersionFile": {"cmd": "dmidecode -s bios-version", "way": "cmd"}, + "desc": "Performs initialization of hardware components during booting", + "slot": 0, + "type": "str", + "warm": 0, + }, + ], + "dcdc": [ + { + "name": "Switch_ZSFP1_3v3_C", + "dcdc_id": "DCDC1", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_C", + "dcdc_id": "DCDC2", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 22000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_C", + "dcdc_id": "DCDC3", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ZSFP1_3v3_V", + "dcdc_id": "DCDC4", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_QSFP1_3v3_V", + "dcdc_id": "DCDC5", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_5v0_V", + "dcdc_id": "DCDC6", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0040/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_C", + "dcdc_id": "DCDC7", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_C", + "dcdc_id": "DCDC8", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_C", + "dcdc_id": "DCDC9", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_1v2_V", + "dcdc_id": "DCDC10", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_3v3_V", + "dcdc_id": "DCDC11", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_Cpld_3v3_V", + "dcdc_id": "DCDC12", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0041/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_C", + "dcdc_id": "DCDC13", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 1300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_C", + "dcdc_id": "DCDC14", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2800, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_C", + "dcdc_id": "DCDC15", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4500, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_1v2_V", + "dcdc_id": "DCDC16", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_3v3_V", + "dcdc_id": "DCDC17", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Con_SSD_3v3_V", + "dcdc_id": "DCDC18", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0042/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_C", + "dcdc_id": "DCDC19", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 4686, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_C", + "dcdc_id": "DCDC20", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_C", + "dcdc_id": "DCDC21", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_3v3_V", + "dcdc_id": "DCDC22", + "Min": 2640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 3960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_5v_V", + "dcdc_id": "DCDC23", + "Min": 4000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 6000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v7_V", + "dcdc_id": "DCDC24", + "Min": 1360, + "value": { + "loc": "/sys/bus/i2c/devices/7-0043/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2040, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_C", + "dcdc_id": "DCDC25", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 47300, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_C", + "dcdc_id": "DCDC26", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 15400, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_CORE_V", + "dcdc_id": "DCDC27", + "Min": 1456, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2184, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v05_V", + "dcdc_id": "DCDC28", + "Min": 840, + "value": { + "loc": "/sys/bus/i2c/devices/7-0060/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1260, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_C", + "dcdc_id": "DCDC29", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 220000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_C", + "dcdc_id": "DCDC30", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/curr3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 18000, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_CORE_V", + "dcdc_id": "DCDC31", + "Min": 600, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Switch_ANALOG_V", + "dcdc_id": "DCDC32", + "Min": 640, + "value": { + "loc": "/sys/bus/i2c/devices/7-0064/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 960, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_C", + "dcdc_id": "DCDC33", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr1_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 9900, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_C", + "dcdc_id": "DCDC34", + "Min": -1000, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/curr2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "A", + "Max": 2200, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_1v2_V", + "dcdc_id": "DCDC35", + "Min": 960, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in2_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 1440, + "format": "float(float(%s)/1000)", + }, + + { + "name": "Cpu_2v23_V", + "dcdc_id": "DCDC36", + "Min": 1784, + "value": { + "loc": "/sys/bus/i2c/devices/7-006c/hwmon/hwmon*/in3_input", + "way": "sysfs", + }, + "read_times": 5, + "Unit": "V", + "Max": 2676, + "format": "float(float(%s)/1000)", + }, + ], + "cpu": [ + { + "name": "cpu", + "reboot_cause_path": "/etc/sonic/.reboot/.previous-reboot-cause.txt" + } + ], + "sfps": { + "ver": '1.0', + "port_index_start": 1, + "port_num": 56, + "log_level": 2, + "eeprom_retry_times": 5, + "eeprom_retry_break_sec": 0.2, + "presence_cpld": { + "dev_id": { + 3: { + "offset": { + 0x30: "1-8", + 0x31: "9-16", + 0x32: "17-24", + }, + }, + 4: { + "offset": { + 0x30: "25-32", + 0x31: "33-40", + 0x32: "41-48", + 0x33: "49-56", + }, + }, + }, + }, + "presence_val_is_present": 0, + "eeprom_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/eeprom", + "eeprom_path_key": list(range(32, 88)), + "optoe_driver_path": "/sys/bus/i2c/devices/i2c-%d/%d-0050/dev_class", + "optoe_driver_key": list(range(32, 88)), + "txdis_cpld": { + "dev_id": { + 3: { + "offset": { + 0x60: "1-8", + 0x61: "9-16", + 0x62: "17-24", + }, + }, + 4: { + "offset": { + 0x60: "25-32", + 0x61: "33-40", + 0x62: "41-48", + }, + }, + }, + }, + "txdisable_val_is_on": 0, + "reset_cpld": { + "dev_id": { + 4: { + "offset": { + 0xb9: "49-56", + }, + }, + }, + }, + "reset_val_is_reset": 0, + } +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py new file mode 100644 index 0000000000..aab279a21d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/hal-config/x86_64_ragile_ra_b6510_48v8c_r0_monitor.py @@ -0,0 +1,206 @@ +# coding:utf-8 + + +monitor = { + "openloop": { + "linear": { + "name": "linear", + "flag": 0, + "pwm_min": 0x80, + "pwm_max": 0xff, + "K": 11, + "tin_min": 38, + }, + "curve": { + "name": "curve", + "flag": 0, + "pwm_min": 0x5a, + "pwm_max": 0xff, + "a": 0.086, + "b": 0.318, + "c": 28, + "tin_min": 25, + }, + }, + + "pid": { + "CPU_TEMP": { + "name": "CPU_TEMP", + "flag": 1, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 3, + "Ki": 0.5, + "Kd": 0.5, + "target": 89, + "value": [None, None, None], + }, + "SWITCH_TEMP": { + "name": "SWITCH_TEMP", + "flag": 1, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 3, + "Ki": 0.4, + "Kd": 0.4, + "target": 82, + "value": [None, None, None], + }, + "OUTLET_TEMP": { + "name": "OUTLET_TEMP", + "flag": 0, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 2, + "Ki": 0.4, + "Kd": 0.3, + "target": 65, + "value": [None, None, None], + }, + "BOARD_TEMP": { + "name": "BOARD_TEMP", + "flag": 0, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 2, + "Ki": 0.4, + "Kd": 0.3, + "target": 65, + "value": [None, None, None], + }, + "SFF_TEMP": { + "name": "SFF_TEMP", + "flag": 1, + "type": "duty", + "pwm_min": 0x80, + "pwm_max": 0xff, + "Kp": 0.1, + "Ki": 0.4, + "Kd": 0, + "target": 60, + "value": [None, None, None], + }, + }, + + "hyst": { + "INLET_TEMP": { + "name": "INLET_TEMP", + "flag": 1, + "type": "duty", + "hyst_min": 50, # duty + "hyst_max": 100, # duty + "last_hyst_value": 50, # duty + "temp_min": 23, + "temp_max": 40, + "value": [None, None], + "rising": { + 23: 50, + 24: 50, + 25: 50, + 26: 53, + 27: 56, + 28: 59, + 29: 62, + 30: 65, + 31: 68, + 32: 71, + 33: 74, + 34: 77, + 35: 80, + 36: 84, + 37: 88, + 38: 92, + 39: 96, + 40: 100, + }, + "descending": { + 23: 50, + 24: 53, + 25: 56, + 26: 59, + 27: 62, + 28: 65, + 29: 68, + 30: 71, + 31: 74, + 32: 77, + 33: 80, + 34: 84, + 35: 88, + 36: 92, + 37: 96, + 38: 100, + 39: 100, + 40: 100, + }, + } + }, + + "temps_threshold": { + "SWITCH_TEMP": {"name": "SWITCH_TEMP", "warning": 100, "critical": 105}, + "INLET_TEMP": {"name": "INLET_TEMP", "warning": 40, "critical": 50}, + "BOARD_TEMP": {"name": "BOARD_TEMP", "warning": 70, "critical": 80}, + "OUTLET_TEMP": {"name": "OUTLET_TEMP", "warning": 70, "critical": 80}, + "CPU_TEMP": {"name": "CPU_TEMP", "warning": 100, "critical": 102}, + "SFF_TEMP": {"name": "SFF_TEMP", "warning": 999, "critical": 1000, "ignore_threshold": 1, "invalid": -10000, "error": -9999}, + }, + + "fancontrol_para": { + "interval": 5, + "fan_air_flow_monitor": 1, + "psu_air_flow_monitor": 1, + "max_pwm": 0xff, + "min_pwm": 0x80, + "abnormal_pwm": 0xff, + "warning_pwm": 0xff, + "temp_invalid_pid_pwm": 0x80, + "temp_error_pid_pwm": 0x80, + "temp_fail_num": 3, + "check_temp_fail": [ + {"temp_name": "INLET_TEMP"}, + {"temp_name": "SWITCH_TEMP"}, + {"temp_name": "CPU_TEMP"}, + ], + "temp_warning_num": 3, # temp over warning 3 times continuously + "temp_critical_num": 3, # temp over critical 3 times continuously + "temp_warning_countdown": 60, # 5 min warning speed after not warning + "temp_critical_countdown": 60, # 5 min full speed after not critical + "rotor_error_count": 6, # fan rotor error 6 times continuously + "inlet_mac_diff": 999, + "check_crit_reboot_flag": 1, + "check_crit_reboot_num": 3, + "check_crit_sleep_time": 20, + "psu_absent_fullspeed_num": 0xFF, + "fan_absent_fullspeed_num": 1, + "rotor_error_fullspeed_num": 1, + }, + + "ledcontrol_para": { + "interval": 5, + "checkpsu": 0, # 0: sys led don't follow psu led + "checkfan": 0, # 0: sys led don't follow fan led + "psu_amber_num": 1, + "fan_amber_num": 1, + "board_sys_led": [ + {"led_name": "FRONT_SYS_LED"}, + ], + "board_psu_led": [ + {"led_name": "FRONT_PSU_LED"}, + ], + "board_fan_led": [ + {"led_name": "FRONT_FAN_LED"}, + ], + "psu_air_flow_monitor": 1, + "fan_air_flow_monitor": 1, + "psu_air_flow_amber_num": 1, + "fan_air_flow_amber_num": 1, + }, + "otp_reboot_judge_file": { + "otp_switch_reboot_judge_file": "/etc/.otp_switch_reboot_flag", + "otp_other_reboot_judge_file": "/etc/.otp_other_reboot_flag", + }, +} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile index f10216ec4d..e59ffd7ee6 100755 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/Makefile @@ -1 +1,15 @@ -obj-m := rg_cpld.o +MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST))) +MODULES_DIR = $(abspath $(MAKEFILE_FILE_PATH)/../../../../common/modules) +FIRMWARE_UPGRADE_PATH = $(abspath $(MAKEFILE_FILE_PATH)/../../../../common/app/firmware_upgrade/firmware_driver/include) + +EXTRA_CFLAGS+= -I$(MODULES_DIR) +EXTRA_CFLAGS+= -I$(MODULES_DIR)/linux-5.10 +EXTRA_CFLAGS+= -I$(FIRMWARE_UPGRADE_PATH) + +obj-m := wb_pcie_dev_device.o +obj-m += wb_i2c_mux_pca954x_device.o +obj-m += wb_i2c_ocores_device.o +obj-m += wb_lpc_drv_device.o +obj-m += wb_i2c_dev_device.o +obj-m += wb_io_dev_device.o +obj-m += wb_firmware_upgrade_device.o diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c deleted file mode 100755 index 885a727be6..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/rg_cpld.c +++ /dev/null @@ -1,602 +0,0 @@ -/* - * rg_cpld.c - A driver for cpld - * - * Copyright (c) 2019 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* debug level */ -typedef enum { - DBG_START, - DBG_VERBOSE, - DBG_KEY, - DBG_WARN, - DBG_ERROR, - DBG_END, -} dbg_level_t; - -static int debuglevel = 0; -module_param(debuglevel, int, S_IRUGO); - -#define DBG_DEBUG(fmt, arg...) do { \ - if ( debuglevel > DBG_START && debuglevel < DBG_ERROR) { \ - printk(KERN_INFO "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ - } else if ( debuglevel >= DBG_ERROR ) { \ - printk(KERN_ERR "[DEBUG]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ - } else { } \ -} while (0) - -#define DBG_ERROR(fmt, arg...) do { \ - if ( debuglevel > DBG_START) { \ - printk(KERN_ERR "[ERROR]:<%s, %d>:"fmt, __FUNCTION__, __LINE__, ##arg); \ - } \ -} while (0) - -static const unsigned short rg_i2c_cpld[] = { 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, I2C_CLIENT_END }; - -#define CPLD_SIZE 256 -#define CPLD_I2C_RETRY_TIMES 3 -#define READ_TEMP_FAIL 1000000 - -struct cpld_data { - struct i2c_client *client; - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 data[CPLD_SIZE]; /* Register value */ -}; - -static s32 cpld_i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < CPLD_I2C_RETRY_TIMES; try++) { - if ((ret = i2c_smbus_read_byte_data(client, command) ) >= 0 ) - break; - } - return ret; -} - -static s32 cpld_i2c_smbus_read_i2c_block_data(const struct i2c_client *client, - u8 command, u8 length, u8 *values) -{ - int try; - s32 ret; - - ret = -1; - for (try = 0; try < CPLD_I2C_RETRY_TIMES; try++) { - if ((ret = i2c_smbus_read_i2c_block_data(client, command, length, values) ) >= 0 ) - break; - } - return ret; -} - -static ssize_t show_fan_rpm_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct cpld_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - int index = to_sensor_dev_attr_2(da)->index; - uint8_t size; - s32 status; - s32 ret_t; - - ret_t = 0; - status = -1; - size = 0; - mutex_lock(&data->update_lock); - status = cpld_i2c_smbus_read_byte_data(client, index); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - data->data[0] = status; - status = cpld_i2c_smbus_read_byte_data(client, index + 1); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - data->data[1] = status; - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index, data->data[0]); - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index + 1, data->data[1]); - ret_t = (data->data[1] << 8) + data->data[0] ; - if (ret_t == 0 ) { - size = snprintf(buf, CPLD_SIZE, "%d\n", ret_t); - } else if (ret_t == 0xffff) { - size = snprintf(buf, CPLD_SIZE, "%d\n", 0); - } else { - size = snprintf(buf, CPLD_SIZE, "%d\n", 15000000 / ret_t); - } - mutex_unlock(&data->update_lock); - return size; -} - -static ssize_t set_cpld_sysfs_value(struct device *dev, struct device_attribute *da, const char *buf, size_t -count) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct cpld_data *data = i2c_get_clientdata(client); - unsigned long val; - int err; - - err = kstrtoul(buf, 16, &val); - if (err) - return err; - if ((val < 0) || (val > 0xff)) { - DBG_ERROR("please enter 0x00 ~ 0xff\n"); - return -1; - } - mutex_lock(&data->update_lock); - data->data[0] = (u8)val; - DBG_DEBUG("pos: 0x%02x count = %ld, data = 0x%02x\n", attr->index, count, data->data[0]); - i2c_smbus_write_byte_data(client, attr->index, data->data[0]); - mutex_unlock(&data->update_lock); - - return count; -} - -static ssize_t show_cpld_version(struct device *dev, struct device_attribute *da, char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct cpld_data *data = i2c_get_clientdata(client); - s32 status; - - status = -1; - mutex_lock(&data->update_lock); - status = cpld_i2c_smbus_read_i2c_block_data(client, 0, 4, data->data); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - mutex_unlock(&data->update_lock); - return sprintf(buf, "%02x %02x %02x %02x \n", data->data[0], data->data[1], data->data[2], - data->data[3]); -} - -static ssize_t show_cpld_sysfs_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct cpld_data *data = i2c_get_clientdata(client); - s32 status; - - status = -1; - mutex_lock(&data->update_lock); - status = cpld_i2c_smbus_read_byte_data(client, attr->index); - if (status < 0) { - mutex_unlock(&data->update_lock); - return 0; - } - data->data[0] = status; - DBG_DEBUG("cpld reg pos:0x%x value:0x%02x\n", attr->index, data->data[0]); - mutex_unlock(&data->update_lock); - return sprintf(buf, "%02x\n", data->data[0]); -} - -static ssize_t show_mac_temp_value(struct device *dev, struct device_attribute *da, char *buf) -{ - struct cpld_data *data = dev_get_drvdata(dev); - struct i2c_client *client = data->client; - int index = to_sensor_dev_attr_2(da)->index; - int tmp_value, value; - s32 status; - - status = -1; - mutex_lock(&data->update_lock); - - status = cpld_i2c_smbus_read_byte_data(client, index); - if (status < 0) { - mutex_unlock(&data->update_lock); - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - data->data[0] = status; - status = cpld_i2c_smbus_read_byte_data(client, index + 1); - if (status < 0) { - mutex_unlock(&data->update_lock); - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - data->data[1] = status; - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index, data->data[0]); - DBG_DEBUG("cpld reg pos:0x%x value:0x%x\n", index + 1, data->data[1]); - mutex_unlock(&data->update_lock); - - tmp_value = (data->data[1] << 8) + data->data[0]; - if (tmp_value == 0) { - DBG_ERROR("invalid cpld value : %d.\n", tmp_value); - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - - DBG_DEBUG("tmp_value = 0x%x\n", tmp_value); - value = 434100 - (12500000 / (tmp_value * 100 - 1) *535); - if ((value / 1000 < -70) || (value / 1000 > 200)) { - return snprintf(buf, CPLD_SIZE, "%d\n", -READ_TEMP_FAIL); - } - - return snprintf(buf, CPLD_SIZE, "%d\n", value); - -} - -/* common */ -static SENSOR_DEVICE_ATTR(cpld_version, S_IRUGO | S_IWUSR, show_cpld_version, NULL, 0); - -/*0x37 hwmon*/ -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x1B); -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x1D); -static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x1F); -static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO | S_IWUSR ,show_fan_rpm_value, NULL, 0x21); - -/* 0x32 */ -static SENSOR_DEVICE_ATTR(fan_speed_set, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x15); -static SENSOR_DEVICE_ATTR(fan0_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x23); -static SENSOR_DEVICE_ATTR(fan1_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x24); -static SENSOR_DEVICE_ATTR(fan2_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x25); -static SENSOR_DEVICE_ATTR(fan3_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x26); - -/* 0x37 */ -static SENSOR_DEVICE_ATTR(fan_present, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, NULL, 0x30); -static SENSOR_DEVICE_ATTR(fan_status, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, NULL, 0x31); -static SENSOR_DEVICE_ATTR(psu_status, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, NULL, 0x51); -static SENSOR_DEVICE_ATTR(broad_back_lct, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x2a); -static SENSOR_DEVICE_ATTR(broad_back_sys, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb2); - -/* 0x33 */ -static SENSOR_DEVICE_ATTR(mac_led, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa0); -static SENSOR_DEVICE_ATTR(broad_front_lct, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x2a); -static SENSOR_DEVICE_ATTR(broad_front_bmc, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb1); -static SENSOR_DEVICE_ATTR(broad_front_cpu, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb2); -static SENSOR_DEVICE_ATTR(broad_front_pwr, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb3); -static SENSOR_DEVICE_ATTR(broad_front_fan, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xb4); -static SENSOR_DEVICE_ATTR(sfp_led1_yellow, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xad); -static SENSOR_DEVICE_ATTR(mac_temp_flag, S_IRUGO, show_cpld_sysfs_value, NULL, 0xd4); - -/* 0x34 */ -static SENSOR_DEVICE_ATTR(sfp_presence1, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, NULL, 0x30); -static SENSOR_DEVICE_ATTR(sfp_presence2, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, NULL, 0x31); -static SENSOR_DEVICE_ATTR(sfp_presence3, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, NULL, 0x32); - -static SENSOR_DEVICE_ATTR(sfp_enable, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa1); -static SENSOR_DEVICE_ATTR(sfp_led1, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa2); -static SENSOR_DEVICE_ATTR(sfp_led2, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa3); -static SENSOR_DEVICE_ATTR(sfp_led3, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa4); -static SENSOR_DEVICE_ATTR(sfp_led_flash1, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa5); -static SENSOR_DEVICE_ATTR(sfp_led_flash2, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa6); -static SENSOR_DEVICE_ATTR(sfp_led_flash3, S_IRUGO | S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa7); -static SENSOR_DEVICE_ATTR(sfp_txdis1, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x60); -static SENSOR_DEVICE_ATTR(sfp_txdis2, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x61); -static SENSOR_DEVICE_ATTR(sfp_txdis3, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0x62); - -static SENSOR_DEVICE_ATTR(port_speed1, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc0); -static SENSOR_DEVICE_ATTR(port_speed2, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc1); -static SENSOR_DEVICE_ATTR(port_speed3, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc2); -static SENSOR_DEVICE_ATTR(port_speed4, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc3); -static SENSOR_DEVICE_ATTR(port_speed5, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc4); -static SENSOR_DEVICE_ATTR(port_speed6, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc5); - -/* 0x35 */ -static SENSOR_DEVICE_ATTR(sfp_enable2, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa0); -static SENSOR_DEVICE_ATTR(sfp_led2_yellow, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xad); -static SENSOR_DEVICE_ATTR(mac_temp_input, S_IRUGO, show_mac_temp_value, NULL, 0xca); - -/* 0x36 */ -static SENSOR_DEVICE_ATTR(sfp_presence4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x30); -static SENSOR_DEVICE_ATTR(sfp_presence5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x31); -static SENSOR_DEVICE_ATTR(sfp_presence6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x32); -static SENSOR_DEVICE_ATTR(sfp_presence7, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, NULL, 0x33); -static SENSOR_DEVICE_ATTR(sfp_led4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa2); -static SENSOR_DEVICE_ATTR(sfp_led5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa3); -static SENSOR_DEVICE_ATTR(sfp_led6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa4); -static SENSOR_DEVICE_ATTR(sfp_led7, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa5); -static SENSOR_DEVICE_ATTR(sfp_led_flash4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa6); -static SENSOR_DEVICE_ATTR(sfp_led_flash5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa7); -static SENSOR_DEVICE_ATTR(sfp_led_flash6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa8); -static SENSOR_DEVICE_ATTR(sfp_led_flash7, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0xa9); - -static SENSOR_DEVICE_ATTR(sfp_txdis4, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0x60); -static SENSOR_DEVICE_ATTR(sfp_txdis5, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0x61); -static SENSOR_DEVICE_ATTR(sfp_txdis6, S_IRUGO | S_IWUSR ,show_cpld_sysfs_value, set_cpld_sysfs_value, 0x62); - -static SENSOR_DEVICE_ATTR(port_speed7, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc0); -static SENSOR_DEVICE_ATTR(port_speed8, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc1); -static SENSOR_DEVICE_ATTR(port_speed9, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc2); -static SENSOR_DEVICE_ATTR(port_speed10, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc3); -static SENSOR_DEVICE_ATTR(port_speed11, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc4); -static SENSOR_DEVICE_ATTR(port_speed12, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc5); -static SENSOR_DEVICE_ATTR(port_speed13, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc6); -static SENSOR_DEVICE_ATTR(port_speed14, S_IRUGO| S_IWUSR, show_cpld_sysfs_value, set_cpld_sysfs_value, 0xc7); - -static struct attribute *cpld32_sysfs_attrs[] = { - &sensor_dev_attr_fan_speed_set.dev_attr.attr, - &sensor_dev_attr_fan0_led.dev_attr.attr, - &sensor_dev_attr_fan1_led.dev_attr.attr, - &sensor_dev_attr_fan2_led.dev_attr.attr, - &sensor_dev_attr_fan3_led.dev_attr.attr, - NULL -}; - -static struct attribute *cpld37_sysfs_attrs[] = { - &sensor_dev_attr_fan_present.dev_attr.attr, - &sensor_dev_attr_fan_status.dev_attr.attr, - &sensor_dev_attr_psu_status.dev_attr.attr, - &sensor_dev_attr_broad_back_lct.dev_attr.attr, - &sensor_dev_attr_broad_back_sys.dev_attr.attr, - &sensor_dev_attr_cpld_version.dev_attr.attr, - NULL -}; - -static struct attribute *cpld33_sysfs_attrs[] = { - &sensor_dev_attr_mac_led.dev_attr.attr, - &sensor_dev_attr_broad_front_lct.dev_attr.attr, - &sensor_dev_attr_broad_front_bmc.dev_attr.attr, - &sensor_dev_attr_broad_front_cpu.dev_attr.attr, - &sensor_dev_attr_broad_front_pwr.dev_attr.attr, - &sensor_dev_attr_broad_front_fan.dev_attr.attr, - &sensor_dev_attr_sfp_led1_yellow.dev_attr.attr, - &sensor_dev_attr_mac_temp_flag.dev_attr.attr, - &sensor_dev_attr_cpld_version.dev_attr.attr, - NULL -}; - -static struct attribute *cpld34_sysfs_attrs[] = { - &sensor_dev_attr_sfp_presence1.dev_attr.attr, - &sensor_dev_attr_sfp_presence2.dev_attr.attr, - &sensor_dev_attr_sfp_presence3.dev_attr.attr, - &sensor_dev_attr_sfp_enable.dev_attr.attr, - &sensor_dev_attr_sfp_led1.dev_attr.attr, - &sensor_dev_attr_sfp_led2.dev_attr.attr, - &sensor_dev_attr_sfp_led3.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash1.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash2.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash3.dev_attr.attr, - &sensor_dev_attr_sfp_txdis1.dev_attr.attr, - &sensor_dev_attr_sfp_txdis2.dev_attr.attr, - &sensor_dev_attr_sfp_txdis3.dev_attr.attr, - &sensor_dev_attr_port_speed1.dev_attr.attr, - &sensor_dev_attr_port_speed2.dev_attr.attr, - &sensor_dev_attr_port_speed3.dev_attr.attr, - &sensor_dev_attr_port_speed4.dev_attr.attr, - &sensor_dev_attr_port_speed5.dev_attr.attr, - &sensor_dev_attr_port_speed6.dev_attr.attr, - NULL -}; - -static struct attribute *cpld36_sysfs_attrs[] = { - &sensor_dev_attr_sfp_presence4.dev_attr.attr, - &sensor_dev_attr_sfp_presence5.dev_attr.attr, - &sensor_dev_attr_sfp_presence6.dev_attr.attr, - &sensor_dev_attr_sfp_presence7.dev_attr.attr, - &sensor_dev_attr_sfp_led4.dev_attr.attr, - &sensor_dev_attr_sfp_led5.dev_attr.attr, - &sensor_dev_attr_sfp_led6.dev_attr.attr, - &sensor_dev_attr_sfp_led7.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash4.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash5.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash6.dev_attr.attr, - &sensor_dev_attr_sfp_led_flash7.dev_attr.attr, - &sensor_dev_attr_sfp_txdis4.dev_attr.attr, - &sensor_dev_attr_sfp_txdis5.dev_attr.attr, - &sensor_dev_attr_sfp_txdis6.dev_attr.attr, - &sensor_dev_attr_port_speed7.dev_attr.attr, - &sensor_dev_attr_port_speed8.dev_attr.attr, - &sensor_dev_attr_port_speed9.dev_attr.attr, - &sensor_dev_attr_port_speed10.dev_attr.attr, - &sensor_dev_attr_port_speed11.dev_attr.attr, - &sensor_dev_attr_port_speed12.dev_attr.attr, - &sensor_dev_attr_port_speed13.dev_attr.attr, - &sensor_dev_attr_port_speed14.dev_attr.attr, - NULL -}; - -static struct attribute *cpld35_sysfs_attrs[] = { - &sensor_dev_attr_sfp_enable2.dev_attr.attr, - &sensor_dev_attr_broad_front_lct.dev_attr.attr, - &sensor_dev_attr_broad_front_bmc.dev_attr.attr, - &sensor_dev_attr_broad_front_cpu.dev_attr.attr, - &sensor_dev_attr_broad_front_pwr.dev_attr.attr, - &sensor_dev_attr_broad_front_fan.dev_attr.attr, - &sensor_dev_attr_sfp_led2_yellow.dev_attr.attr, - &sensor_dev_attr_mac_temp_input.dev_attr.attr, - &sensor_dev_attr_cpld_version.dev_attr.attr, - NULL -}; - -static const struct attribute_group cpld32_sysfs_group = { - .attrs = cpld32_sysfs_attrs, -}; - -static const struct attribute_group cpld37_sysfs_group = { - .attrs = cpld37_sysfs_attrs, -}; - -static const struct attribute_group cpld33_sysfs_group = { - .attrs = cpld33_sysfs_attrs, -}; - -static const struct attribute_group cpld34_sysfs_group = { - .attrs = cpld34_sysfs_attrs, -}; - -static const struct attribute_group cpld36_sysfs_group = { - .attrs = cpld36_sysfs_attrs, -}; - -static const struct attribute_group cpld35_sysfs_group = { - .attrs = cpld35_sysfs_attrs, -}; - -static struct attribute *cpld_hwmon_attrs[] = { - &sensor_dev_attr_fan1_input.dev_attr.attr, - &sensor_dev_attr_fan2_input.dev_attr.attr, - &sensor_dev_attr_fan3_input.dev_attr.attr, - &sensor_dev_attr_fan4_input.dev_attr.attr, - NULL -}; -ATTRIBUTE_GROUPS(cpld_hwmon); - -struct cpld_attr_match_group { - int bus_nr; /* I2C BUS */ - unsigned short addr; /* slave addr*/ - const struct attribute_group *attr_group_ptr; - const struct attribute_group *attr_hwmon_ptr; -}; - -static struct cpld_attr_match_group g_cpld_attr_match[] = { - {0, 0x32, &cpld32_sysfs_group, NULL}, - {2, 0x37, &cpld37_sysfs_group, (struct attribute_group *)cpld_hwmon_groups}, - {2, 0x33, &cpld33_sysfs_group, NULL}, - {1, 0x34, &cpld34_sysfs_group, NULL}, - {1, 0x36, &cpld36_sysfs_group, NULL}, - {2, 0x35, &cpld35_sysfs_group, NULL}, -}; - -static const struct attribute_group *cpld_get_attr_group(struct i2c_client *client, int is_hwmon) -{ - int i; - struct cpld_attr_match_group *group; - - for (i = 0; i < ARRAY_SIZE(g_cpld_attr_match); i++) { - group = &g_cpld_attr_match[i]; - DBG_DEBUG("is_hwmon %d i %d client(nr:%d,addr:0x%x), group(nr:%d,addr:0x0%x).\n", is_hwmon, - i, client->adapter->nr, client->addr, group->bus_nr, group->addr); - if ((client->addr == group->addr) && (client->adapter->nr == group->bus_nr)) { - DBG_DEBUG("is_hwmon %d i %d nr %d addr %d .\n", is_hwmon, i, client->adapter->nr, client->addr); - return (is_hwmon) ? (group->attr_hwmon_ptr) : (group->attr_group_ptr); - } - } - - DBG_DEBUG("is_hwmon %d nr %d addr %d dismatch, return NULL.\n", is_hwmon, client->adapter->nr, client->addr); - return NULL; -} - -static int cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) -{ - struct cpld_data *data; - int status; - const struct attribute_group *sysfs_group, *hwmon_group; - - status = -1; - DBG_DEBUG("=========cpld_probe(addr:0x%x, nr:%d)===========\n", client->addr, client->adapter->nr); - data = devm_kzalloc(&client->dev, sizeof(struct cpld_data), GFP_KERNEL); - if (!data) { - return -ENOMEM; - } - - data->client = client; - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - sysfs_group = NULL; - sysfs_group = cpld_get_attr_group(client, 0); - if (sysfs_group) { - status = sysfs_create_group(&client->dev.kobj, sysfs_group); - DBG_DEBUG("=========(addr:0x%x, nr:%d) sysfs_create_group status %d===========\n", client->addr, client->adapter->nr, status); - if (status != 0) { - DBG_ERROR("sysfs_create_group status %d.\n", status); - goto error; - } - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no sysfs_create_group \n", client->addr, client->adapter->nr); - } - - hwmon_group = NULL; - hwmon_group = cpld_get_attr_group(client, 1); - if (hwmon_group) { - data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, (const struct attribute_group **)hwmon_group); - if (IS_ERR(data->hwmon_dev)) { - sysfs_remove_group(&client->dev.kobj, (const struct attribute_group *)sysfs_group); - DBG_ERROR("hwmon_device_register_with_groups failed ret %ld.\n", PTR_ERR(data->hwmon_dev)); - return PTR_ERR(data->hwmon_dev); - } - DBG_DEBUG("=========(addr:0x%x, nr:%d) hwmon_device_register_with_groups success===========\n", client->addr, client->adapter->nr); - if (status != 0) { - DBG_ERROR("sysfs_create_group status %d.\n", status); - goto error; - } - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no hwmon_device_register_with_groups \n", client->addr, client->adapter->nr); - } - -error: - return status; - -} - -static int cpld_remove(struct i2c_client *client) -{ - struct cpld_data *data = i2c_get_clientdata(client); - const struct attribute_group *sysfs_group, *hwmon_group; - - DBG_DEBUG("=========cpld_remove(addr:0x%x, nr:%d)===========\n", client->addr, client->adapter->nr); - - sysfs_group = NULL; - sysfs_group = cpld_get_attr_group(client, 0); - if (sysfs_group) { - DBG_DEBUG("=========(addr:0x%x, nr:%d) do sysfs_remove_group \n", client->addr, client->adapter->nr); - sysfs_remove_group(&client->dev.kobj, (const struct attribute_group *)sysfs_group); - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no sysfs_remove_group \n", client->addr, client->adapter->nr); - } - - hwmon_group = NULL; - hwmon_group = cpld_get_attr_group(client, 1); - if (hwmon_group) { - DBG_DEBUG("=========(addr:0x%x, nr:%d) do hwmon_device_unregister \n", client->addr, client->adapter->nr); - hwmon_device_unregister(data->hwmon_dev); - } else { - DBG_DEBUG("=========(addr:0x%x, nr:%d) no hwmon_device_unregister \n", client->addr, client->adapter->nr); - } - - return 0; -} - - -static const struct i2c_device_id cpld_id[] = { - { "rg_cpld", 0 }, - {} -}; - -MODULE_DEVICE_TABLE(i2c, cpld_id); - -static struct i2c_driver rg_cpld_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "rg_cpld", - }, - .probe = cpld_probe, - .remove = cpld_remove, - .id_table = cpld_id, -}; - -module_i2c_driver(rg_cpld_driver); - -MODULE_AUTHOR("support "); -MODULE_DESCRIPTION("ragile CPLD driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c new file mode 100644 index 0000000000..5fcaa8da19 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_firmware_upgrade_device.c @@ -0,0 +1,178 @@ +/* + * wb_firmware_upgrade.c + * Original Author: support 2021-03-17 + * + * ko for firmware device + * History + * [Version] [Author] [Date] [Description] + * v1.0 support 2021-05-07 Initial version + */ +#include +#include +#include +#include +#include +#include + +static int g_wb_firmware_upgrade_debug = 0; +static int g_wb_firmware_upgrade_error = 0; + +module_param(g_wb_firmware_upgrade_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_firmware_upgrade_error, int, S_IRUGO | S_IWUSR); + +#define WB_FIRMWARE_UPGRADE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_firmware_upgrade_debug) { \ + printk(KERN_INFO "[WB_FIRMWARE_UPGRADE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_FIRMWARE_UPGRADE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_firmware_upgrade_error) { \ + printk(KERN_ERR "[WB_FIRMWARE_UPGRADE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +/* cpld */ +static firmware_upgrade_device_t firmware_upgrade_device_data0 = { + .type = "JTAG", + .upg_type.jtag = { + .tdi = 67, + .tck = 65, + .tms = 6, + .tdo = 32, + }, + .en_gpio[0] = 50, + .en_level[0] = 1, + .en_gpio[1] = 48, + .en_level[1] = 1, + .chain = 1, + .chip_index = 1, + + .en_gpio_num = 2, + .en_logic_num = 0, +}; + +/* fpga */ +static firmware_upgrade_device_t firmware_upgrade_device_data1 = { + .type = "SPI_LOGIC", + .chain = 3, + .chip_index = 1, + .upg_type.sysfs = { + .dev_name = "/dev/fpga0", + .ctrl_base = 0xa00, + .flash_base = 0x1A0000, + .test_base = 0x7F0000, + .test_size = 0x10000, + }, + .en_gpio_num = 0, + .en_logic_num = 0, +}; + +static firmware_upgrade_device_t firmware_upgrade_device_data2 = { + .type = "SPI_LOGIC", + .chain = 4, + .chip_index = 1, + .upg_type.sysfs = { + .dev_name = "/dev/fpga0", + .ctrl_base = 0xa00, + .flash_base = 0x0, + .test_base = 0x7F0000, + .test_size = 0x10000, + }, + .en_gpio_num = 0, + .en_logic_num = 0, +}; + +/* bios */ +static firmware_upgrade_device_t firmware_upgrade_device_data3 = { + .type = "MTD_DEV", + .chain = 2, + .chip_index = 1, + .upg_type.sysfs = { + .mtd_name = "BIOS", + .flash_base = 0x800000, + }, + + .en_gpio_num = 0, + .en_logic_num = 0, +}; + +static void firmware_device_release(struct device *dev) +{ + return; +} + +static struct platform_device firmware_upgrade_device[] = { + { + .name = "firmware_cpld_ispvme", + .id = 1, + .dev = { + .platform_data = &firmware_upgrade_device_data0, + .release = firmware_device_release, + }, + }, + { + .name = "firmware_sysfs", + .id = 2, + .dev = { + .platform_data = &firmware_upgrade_device_data1, + .release = firmware_device_release, + }, + }, + { + .name = "firmware_sysfs", + .id = 3, + .dev = { + .platform_data = &firmware_upgrade_device_data2, + .release = firmware_device_release, + }, + }, + { + .name = "firmware_sysfs", + .id = 4, + .dev = { + .platform_data = &firmware_upgrade_device_data3, + .release = firmware_device_release, + }, + }, + }; + + static int __init firmware_upgrade_device_init(void) + { + int i; + int ret = 0; + firmware_upgrade_device_t *firmware_upgrade_device_data; + + WB_FIRMWARE_UPGRADE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(firmware_upgrade_device); i++) { + firmware_upgrade_device_data = firmware_upgrade_device[i].dev.platform_data; + ret = platform_device_register(&firmware_upgrade_device[i]); + if (ret < 0) { + firmware_upgrade_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "firmware_upgrade_device id%d register failed!\n", i + 1); + } else { + firmware_upgrade_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; + } + + static void __exit firmware_upgrade_device_exit(void) + { + int i; + firmware_upgrade_device_t *firmware_upgrade_device_data; + + WB_FIRMWARE_UPGRADE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(firmware_upgrade_device) - 1; i >= 0; i--) { + firmware_upgrade_device_data = firmware_upgrade_device[i].dev.platform_data; + if (firmware_upgrade_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&firmware_upgrade_device[i]); + } + } + } + + module_init(firmware_upgrade_device_init); + module_exit(firmware_upgrade_device_exit); + MODULE_DESCRIPTION("FIRMWARE UPGRADE Devices"); + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c new file mode 100644 index 0000000000..865e7afea4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_dev_device.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include + +#include + +static int g_wb_i2c_dev_device_debug = 0; +static int g_wb_i2c_dev_device_error = 0; + +module_param(g_wb_i2c_dev_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_dev_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_DEV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_dev_device_debug) { \ + printk(KERN_INFO "[WB_I2C_DEV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_DEV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_i2c_dev_device_error) { \ + printk(KERN_ERR "[WB_I2C_DEV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static i2c_dev_device_t i2c_dev_device_data0 = { + .i2c_bus = 2, + .i2c_addr = 0x0d, + .i2c_name = "cpld2", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +static i2c_dev_device_t i2c_dev_device_data1 = { + .i2c_bus = 8, + .i2c_addr = 0x30, + .i2c_name = "cpld3", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +static i2c_dev_device_t i2c_dev_device_data2 = { + .i2c_bus = 8, + .i2c_addr = 0x31, + .i2c_name = "cpld4", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +static i2c_dev_device_t i2c_dev_device_data3 = { + .i2c_bus = 6, + .i2c_addr = 0x0d, + .i2c_name = "cpld5", + .data_bus_width = 1, + .addr_bus_width = 1, + .per_rd_len = 256, + .per_wr_len = 256, + .i2c_len = 256, +}; + +struct i2c_board_info i2c_dev_device_info[] = { + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data0, + }, + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data1, + }, + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data2, + }, + { + .type = "wb-i2c-dev", + .platform_data = &i2c_dev_device_data3, + }, +}; + +static int __init wb_i2c_dev_device_init(void) +{ + int i; + struct i2c_adapter *adap; + struct i2c_client *client; + i2c_dev_device_t *i2c_dev_device_data; + + WB_I2C_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(i2c_dev_device_info); i++) { + i2c_dev_device_data = i2c_dev_device_info[i].platform_data; + i2c_dev_device_info[i].addr = i2c_dev_device_data->i2c_addr; + adap = i2c_get_adapter(i2c_dev_device_data->i2c_bus); + if (adap == NULL) { + i2c_dev_device_data->client = NULL; + printk(KERN_ERR "get i2c bus %d adapter fail.\n", i2c_dev_device_data->i2c_bus); + continue; + } + client = i2c_new_client_device(adap, &i2c_dev_device_info[i]); + if (!client) { + i2c_dev_device_data->client = NULL; + printk(KERN_ERR "Failed to register i2c dev device %d at bus %d!\n", + i2c_dev_device_data->i2c_addr, i2c_dev_device_data->i2c_bus); + } else { + i2c_dev_device_data->client = client; + } + i2c_put_adapter(adap); + } + return 0; +} + +static void __exit wb_i2c_dev_device_exit(void) +{ + int i; + i2c_dev_device_t *i2c_dev_device_data; + + WB_I2C_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(i2c_dev_device_info) - 1; i >= 0; i--) { + i2c_dev_device_data = i2c_dev_device_info[i].platform_data; + if (i2c_dev_device_data->client) { + i2c_unregister_device(i2c_dev_device_data->client); + i2c_dev_device_data->client = NULL; + } + } +} + +module_init(wb_i2c_dev_device_init); +module_exit(wb_i2c_dev_device_exit); +MODULE_DESCRIPTION("I2C DEV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c new file mode 100644 index 0000000000..f12a710134 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_mux_pca954x_device.c @@ -0,0 +1,296 @@ +#include +#include +#include +#include +#include +#include + +#include + +static int g_wb_i2c_mux_pca954x_device_debug = 0; +static int g_wb_i2c_mux_pca954x_device_error = 0; + +module_param(g_wb_i2c_mux_pca954x_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_mux_pca954x_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_MUX_PCA954X_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_mux_pca954x_device_debug) { \ + printk(KERN_INFO "[WB_I2C_MUX_PCA954X_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_MUX_PCA954X_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_i2c_mux_pca954x_device_error) { \ + printk(KERN_ERR "[WB_I2C_MUX_PCA954X_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data0 = { + .i2c_bus = 2, + .i2c_addr = 0x77, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 16, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/cpld5", + .file_attr.offset = 0x60, + .file_attr.mask = 0x02, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x02, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data1 = { + .i2c_bus = 4, + .i2c_addr = 0x77, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 24, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/cpld5", + .file_attr.offset = 0x60, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data2 = { + .i2c_bus = 12, + .i2c_addr = 0x70, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 32, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data3 = { + .i2c_bus = 12, + .i2c_addr = 0x71, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 40, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data4 = { + .i2c_bus = 12, + .i2c_addr = 0x72, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 48, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data5 = { + .i2c_bus = 12, + .i2c_addr = 0x73, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 56, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data6 = { + .i2c_bus = 13, + .i2c_addr = 0x70, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 64, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data7 = { + .i2c_bus = 13, + .i2c_addr = 0x71, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 72, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +static i2c_mux_pca954x_device_t i2c_mux_pca954x_device_data8 = { + .i2c_bus = 13, + .i2c_addr = 0x72, + .probe_disable = 1, + .select_chan_check = 0, + .close_chan_force_reset = 0, + .pca9548_base_nr = 80, + .pca9548_reset_type = PCA9548_RESET_FILE, + .rst_delay_b = 0, + .rst_delay = 1000, + .rst_delay_a = 1000, + .attr = { + .file_attr.dev_name = "/dev/fpga0", + .file_attr.offset = 0x20, + .file_attr.mask = 0x01, + .file_attr.reset_on = 0x00, + .file_attr.reset_off = 0x01, + }, +}; + +struct i2c_board_info i2c_mux_pca954x_device_info[] = { + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data0, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data1, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data2, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data3, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data4, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data5, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data6, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data7, + }, + { + .type = "wb_pca9548", + .platform_data = &i2c_mux_pca954x_device_data8, + }, +}; + +static int __init wb_i2c_mux_pca954x_device_init(void) +{ + int i; + struct i2c_adapter *adap; + struct i2c_client *client; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device_data; + + WB_I2C_MUX_PCA954X_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(i2c_mux_pca954x_device_info); i++) { + i2c_mux_pca954x_device_data = i2c_mux_pca954x_device_info[i].platform_data; + i2c_mux_pca954x_device_info[i].addr = i2c_mux_pca954x_device_data->i2c_addr; + adap = i2c_get_adapter(i2c_mux_pca954x_device_data->i2c_bus); + if (adap == NULL) { + i2c_mux_pca954x_device_data->client = NULL; + printk(KERN_ERR "get i2c bus %d adapter fail.\n", i2c_mux_pca954x_device_data->i2c_bus); + continue; + } + client = i2c_new_client_device(adap, &i2c_mux_pca954x_device_info[i]); + if (!client) { + i2c_mux_pca954x_device_data->client = NULL; + printk(KERN_ERR "Failed to register pca954x device %d at bus %d!\n", + i2c_mux_pca954x_device_data->i2c_addr, i2c_mux_pca954x_device_data->i2c_bus); + } else { + i2c_mux_pca954x_device_data->client = client; + } + i2c_put_adapter(adap); + } + return 0; +} + +static void __exit wb_i2c_mux_pca954x_device_exit(void) +{ + int i; + i2c_mux_pca954x_device_t *i2c_mux_pca954x_device_data; + + WB_I2C_MUX_PCA954X_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(i2c_mux_pca954x_device_info) - 1; i >= 0; i--) { + i2c_mux_pca954x_device_data = i2c_mux_pca954x_device_info[i].platform_data; + if (i2c_mux_pca954x_device_data->client) { + i2c_unregister_device(i2c_mux_pca954x_device_data->client); + i2c_mux_pca954x_device_data->client = NULL; + } + } +} + +module_init(wb_i2c_mux_pca954x_device_init); +module_exit(wb_i2c_mux_pca954x_device_exit); +MODULE_DESCRIPTION("I2C MUX PCA954X Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c new file mode 100644 index 0000000000..ff7ba9d26f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_i2c_ocores_device.c @@ -0,0 +1,423 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_i2c_ocores_device_debug = 0; +static int g_wb_i2c_ocores_device_error = 0; + +module_param(g_wb_i2c_ocores_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_i2c_ocores_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_I2C_OCORE_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_i2c_ocores_device_debug) { \ + printk(KERN_INFO "[WB_I2C_OCORE_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_I2C_OCORE_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_i2c_ocores_device_error) { \ + printk(KERN_ERR "[WB_I2C_OCORE_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static i2c_ocores_device_t i2c_ocores_device_data0 = { + .adap_nr = 2, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0800, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 0, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data1 = { + .adap_nr = 3, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0820, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 1, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data2 = { + .adap_nr = 4, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0840, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 2, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data3 = { + .adap_nr = 5, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0860, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 3, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data4 = { + .adap_nr = 6, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0880, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 4, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data5 = { + .adap_nr = 7, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x08a0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 5, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data6 = { + .adap_nr = 8, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x08c0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 6, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data7 = { + .adap_nr = 9, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x08e0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 7, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data8 = { + .adap_nr = 10, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0900, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 8, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data9 = { + .adap_nr = 11, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0920, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 9, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data10 = { + .adap_nr = 12, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0940, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 10, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data11 = { + .adap_nr = 13, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0960, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 11, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data12 = { + .adap_nr = 14, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x0980, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 12, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static i2c_ocores_device_t i2c_ocores_device_data13 = { + .adap_nr = 15, + .big_endian = 0, + .dev_name = "/dev/fpga0", + .reg_access_mode = 3, + .dev_base = 0x09a0, + .reg_shift = 2, + .reg_io_width = 4, + .ip_clock_khz = 125000, + .bus_clock_khz = 100, + .irq_offset = 13, + .pci_domain = 0, + .pci_bus = 8, + .pci_slot = 0, + .pci_fn = 0, +}; + +static void wb_i2c_ocores_device_release(struct device *dev) +{ + return; +} + +static struct platform_device i2c_ocores_device[] = { + { + .name = "wb-ocores-i2c", + .id = 1, + .dev = { + .platform_data = &i2c_ocores_device_data0, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 2, + .dev = { + .platform_data = &i2c_ocores_device_data1, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 3, + .dev = { + .platform_data = &i2c_ocores_device_data2, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 4, + .dev = { + .platform_data = &i2c_ocores_device_data3, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 5, + .dev = { + .platform_data = &i2c_ocores_device_data4, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 6, + .dev = { + .platform_data = &i2c_ocores_device_data5, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 7, + .dev = { + .platform_data = &i2c_ocores_device_data6, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 8, + .dev = { + .platform_data = &i2c_ocores_device_data7, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 9, + .dev = { + .platform_data = &i2c_ocores_device_data8, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 10, + .dev = { + .platform_data = &i2c_ocores_device_data9, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 11, + .dev = { + .platform_data = &i2c_ocores_device_data10, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 12, + .dev = { + .platform_data = &i2c_ocores_device_data11, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 13, + .dev = { + .platform_data = &i2c_ocores_device_data12, + .release = wb_i2c_ocores_device_release, + }, + }, + { + .name = "wb-ocores-i2c", + .id = 14, + .dev = { + .platform_data = &i2c_ocores_device_data13, + .release = wb_i2c_ocores_device_release, + }, + }, +}; + +static int __init wb_i2c_ocores_device_init(void) +{ + int i; + int ret = 0; + i2c_ocores_device_t *i2c_ocores_device_data; + + WB_I2C_OCORE_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(i2c_ocores_device); i++) { + i2c_ocores_device_data = i2c_ocores_device[i].dev.platform_data; + ret = platform_device_register(&i2c_ocores_device[i]); + if (ret < 0) { + i2c_ocores_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-ocores-i2c.%d register failed!\n", i + 1); + } else { + i2c_ocores_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_i2c_ocores_device_exit(void) +{ + int i; + i2c_ocores_device_t *i2c_ocores_device_data; + + WB_I2C_OCORE_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(i2c_ocores_device) - 1; i >= 0; i--) { + i2c_ocores_device_data = i2c_ocores_device[i].dev.platform_data; + if (i2c_ocores_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&i2c_ocores_device[i]); + } + } +} + +module_init(wb_i2c_ocores_device_init); +module_exit(wb_i2c_ocores_device_exit); +MODULE_DESCRIPTION("I2C OCORES Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c new file mode 100644 index 0000000000..cc84938fff --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_io_dev_device.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_io_dev_device_debug = 0; +static int g_wb_io_dev_device_error = 0; + +module_param(g_wb_io_dev_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_io_dev_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_IO_DEV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_io_dev_device_debug) { \ + printk(KERN_INFO "[WB_IO_DEV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_IO_DEV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_io_dev_device_error) { \ + printk(KERN_ERR "[WB_IO_DEV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static io_dev_device_t io_dev_device_data0 = { + .io_dev_name = "cpld0", + .io_base = 0x700, + .io_len = 0x100, + .indirect_addr = 0, +}; + +static io_dev_device_t io_dev_device_data1 = { + .io_dev_name = "cpld1", + .io_base = 0x900, + .io_len = 0x100, + .indirect_addr = 0, +}; + +static void wb_io_dev_device_release(struct device *dev) +{ + return; +} + +static struct platform_device io_dev_device[] = { + { + .name = "wb-io-dev", + .id = 1, + .dev = { + .platform_data = &io_dev_device_data0, + .release = wb_io_dev_device_release, + }, + }, + { + .name = "wb-io-dev", + .id = 2, + .dev = { + .platform_data = &io_dev_device_data1, + .release = wb_io_dev_device_release, + }, + }, +}; + +static int __init wb_io_dev_device_init(void) +{ + int i; + int ret = 0; + io_dev_device_t *io_dev_device_data; + + WB_IO_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(io_dev_device); i++) { + io_dev_device_data = io_dev_device[i].dev.platform_data; + ret = platform_device_register(&io_dev_device[i]); + if (ret < 0) { + io_dev_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-io-dev.%d register failed!\n", i + 1); + } else { + io_dev_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_io_dev_device_exit(void) +{ + int i; + io_dev_device_t *io_dev_device_data; + + WB_IO_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(io_dev_device) - 1; i >= 0; i--) { + io_dev_device_data = io_dev_device[i].dev.platform_data; + if (io_dev_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&io_dev_device[i]); + } + } +} + +module_init(wb_io_dev_device_init); +module_exit(wb_io_dev_device_exit); +MODULE_DESCRIPTION("IO DEV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c new file mode 100644 index 0000000000..9b6b61a517 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_lpc_drv_device.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_lpc_drv_device_debug = 0; +static int g_wb_lpc_drv_device_error = 0; + +module_param(g_wb_lpc_drv_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_lpc_drv_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_LPC_DRV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_lpc_drv_device_debug) { \ + printk(KERN_INFO "[WB_LPC_DRV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_LPC_DRV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_lpc_drv_device_error) { \ + printk(KERN_ERR "[WB_LPC_DRV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static lpc_drv_device_t lpc_drv_device_data_0 = { + .lpc_io_name = "wb_lpc", + .pci_domain = 0x0000, + .pci_bus = 0x00, + .pci_slot = 0x1f, + .pci_fn = 0, + .lpc_io_base = 0x700, + .lpc_io_size = 0x100, + .lpc_gen_dec = 0x84, +}; + +static lpc_drv_device_t lpc_drv_device_data_1 = { + .lpc_io_name = "wb_lpc", + .pci_domain = 0x0000, + .pci_bus = 0x00, + .pci_slot = 0x1f, + .pci_fn = 0, + .lpc_io_base = 0x900, + .lpc_io_size = 0x100, + .lpc_gen_dec = 0x88, +}; + +static lpc_drv_device_t lpc_drv_device_data_2 = { + .lpc_io_name = "wb_lpc", + .pci_domain = 0x0000, + .pci_bus = 0x00, + .pci_slot = 0x1f, + .pci_fn = 0, + .lpc_io_base = 0xb00, + .lpc_io_size = 0x100, + .lpc_gen_dec = 0x90, +}; + +static void wb_lpc_drv_device_release(struct device *dev) +{ + return; +} + +static struct platform_device lpc_drv_device[] = { + { + .name = "wb-lpc", + .id = 1, + .dev = { + .platform_data = &lpc_drv_device_data_0, + .release = wb_lpc_drv_device_release, + }, + }, + { + .name = "wb-lpc", + .id = 2, + .dev = { + .platform_data = &lpc_drv_device_data_1, + .release = wb_lpc_drv_device_release, + }, + }, + { + .name = "wb-lpc", + .id = 3, + .dev = { + .platform_data = &lpc_drv_device_data_2, + .release = wb_lpc_drv_device_release, + }, + }, +}; + +static int __init wb_lpc_drv_device_init(void) +{ + int i; + int ret = 0; + lpc_drv_device_t *lpc_drv_device_data; + + WB_LPC_DRV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(lpc_drv_device); i++) { + lpc_drv_device_data = lpc_drv_device[i].dev.platform_data; + ret = platform_device_register(&lpc_drv_device[i]); + if (ret < 0) { + lpc_drv_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-lpc.%d register failed!\n", i + 1); + } else { + lpc_drv_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_lpc_drv_device_exit(void) +{ + int i; + lpc_drv_device_t *lpc_drv_device_data; + + WB_LPC_DRV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(lpc_drv_device) - 1; i >= 0; i--) { + lpc_drv_device_data = lpc_drv_device[i].dev.platform_data; + if (lpc_drv_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&lpc_drv_device[i]); + } + } +} + +module_init(wb_lpc_drv_device_init); +module_exit(wb_lpc_drv_device_exit); +MODULE_DESCRIPTION("LPC DRV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c new file mode 100644 index 0000000000..f79b29770d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/modules/driver/wb_pcie_dev_device.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include + +#include + +static int g_wb_pcie_dev_device_debug = 0; +static int g_wb_pcie_dev_device_error = 0; + +module_param(g_wb_pcie_dev_device_debug, int, S_IRUGO | S_IWUSR); +module_param(g_wb_pcie_dev_device_error, int, S_IRUGO | S_IWUSR); + +#define WB_PCIE_DEV_DEVICE_DEBUG_VERBOSE(fmt, args...) do { \ + if (g_wb_pcie_dev_device_debug) { \ + printk(KERN_INFO "[WB_PCIE_DEV_DEVICE][VER][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +#define WB_PCIE_DEV_DEVICE_DEBUG_ERROR(fmt, args...) do { \ + if (g_wb_pcie_dev_device_error) { \ + printk(KERN_ERR "[WB_PCIE_DEV_DEVICE][ERR][func:%s line:%d]\r\n"fmt, __func__, __LINE__, ## args); \ + } \ +} while (0) + +static pci_dev_device_t pcie_dev_device_data0 = { + .pci_dev_name = "fpga0", + .pci_domain = 0x0000, + .pci_bus = 0x08, + .pci_slot = 0x00, + .pci_fn = 0, + .pci_bar = 0, + .bus_width = 4, + .upg_ctrl_base = 0xa00, + .upg_flash_base = 0x1a0000, +}; + +static void wb_pcie_dev_device_release(struct device *dev) +{ + return; +} + +static struct platform_device pcie_dev_device[] = { + { + .name = "wb-pci-dev", + .id = 1, + .dev = { + .platform_data = &pcie_dev_device_data0, + .release = wb_pcie_dev_device_release, + }, + }, +}; + +static int __init wb_pcie_dev_device_init(void) +{ + int i; + int ret = 0; + pci_dev_device_t *pcie_dev_device_data; + + WB_PCIE_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = 0; i < ARRAY_SIZE(pcie_dev_device); i++) { + pcie_dev_device_data = pcie_dev_device[i].dev.platform_data; + ret = platform_device_register(&pcie_dev_device[i]); + if (ret < 0) { + pcie_dev_device_data->device_flag = -1; /* device register failed, set flag -1 */ + printk(KERN_ERR "wb-pci-dev.%d register failed!\n", i + 1); + } else { + pcie_dev_device_data->device_flag = 0; /* device register suucess, set flag 0 */ + } + } + return 0; +} + +static void __exit wb_pcie_dev_device_exit(void) +{ + int i; + pci_dev_device_t *pcie_dev_device_data; + + WB_PCIE_DEV_DEVICE_DEBUG_VERBOSE("enter!\n"); + for (i = ARRAY_SIZE(pcie_dev_device) - 1; i >= 0; i--) { + pcie_dev_device_data = pcie_dev_device[i].dev.platform_data; + if (pcie_dev_device_data->device_flag == 0) { /* device register success, need unregister */ + platform_device_unregister(&pcie_dev_device[i]); + } + } +} + +module_init(wb_pcie_dev_device_init); +module_exit(wb_pcie_dev_device_exit); +MODULE_DESCRIPTION("PCIE DEV Devices"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("support"); diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg new file mode 100644 index 0000000000..98d1da1750 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_CPLD.cfg @@ -0,0 +1,41 @@ +# configuration item: I2C address of CPLD +# format: cpld_i2c_dev.bus_[cpld_slot]_[cpld_id] cpld_i2c_dev.addr_[cpld_slot]_[cpld_id] +# cpld_slot: Main card: 0, linear card: start from 1 +# cpld_id: start from 0 +# bus: I2C bus number of CPLD +# addr: I2C address of CPLD +cpld_i2c_dev.bus_0_2=2 +cpld_i2c_dev.addr_0_2=0x0d +cpld_i2c_dev.bus_0_3=8 +cpld_i2c_dev.addr_0_3=0x30 +cpld_i2c_dev.bus_0_4=8 +cpld_i2c_dev.addr_0_4=0x31 +cpld_i2c_dev.bus_0_5=6 +cpld_i2c_dev.addr_0_5=0x0d + + +# configuration item: LPC address of CPLD +# format: cpld_lpc_addr_[cpld_slot]_[cpld_id] +# cpld_slot: Main card: 0, linear card: start from 1 +# cpld_id: start from 0 +cpld_lpc_dev_0_0=0x700 +cpld_lpc_dev_0_1=0x900 + + +# configuration item: CPLD access method, lpc or i2c +# format: mode_cpld_[cpld_slot][cpld_slot]=lpc/i2c +# cpld_slot: Main card: 0, linear card: start from 1 +# cpld_id: start from 0 +mode_cpld_0_0=lpc +mode_cpld_0_1=lpc +mode_cpld_0_2=i2c +mode_cpld_0_3=i2c +mode_cpld_0_4=i2c +mode_cpld_0_5=i2c + + +# configuration item: the number of CPLD +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: CPLD main_dev is 4 +# minor_dev: CPLD minor_dev not exist +dev_num_4_0=6 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg new file mode 100644 index 0000000000..2350b74eb8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_FAN.cfg @@ -0,0 +1,304 @@ +# configuration item: the number of fans +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: fan main_dev is 1 +# minor_dev: fan minor_dev not exist(0) +dev_num_1_0=4 + + +# configuration item: the number of rotors +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: rotor main_dev is 1 +# minor_dev: rotor minor_dev is 5 +dev_num_1_5=2 + + +# configuration item: fan presence status +# format: dev_present_status_[main_dev_id][fan_index] +# main_dev_id: fan main_dev_id is 1 +# fan_index: start from 1 +dev_present_status.mode_1_1=config +dev_present_status.src_1_1=cpld +dev_present_status.frmt_1_1=bit +dev_present_status.pola_1_1=negative +dev_present_status.addr_1_1=0x00020030 +dev_present_status.len_1_1=1 +dev_present_status.bit_offset_1_1=0 + +dev_present_status.mode_1_2=config +dev_present_status.src_1_2=cpld +dev_present_status.frmt_1_2=bit +dev_present_status.pola_1_2=negative +dev_present_status.addr_1_2=0x00020030 +dev_present_status.len_1_2=1 +dev_present_status.bit_offset_1_2=1 + +dev_present_status.mode_1_3=config +dev_present_status.src_1_3=cpld +dev_present_status.frmt_1_3=bit +dev_present_status.pola_1_3=negative +dev_present_status.addr_1_3=0x00020030 +dev_present_status.len_1_3=1 +dev_present_status.bit_offset_1_3=2 + +dev_present_status.mode_1_4=config +dev_present_status.src_1_4=cpld +dev_present_status.frmt_1_4=bit +dev_present_status.pola_1_4=negative +dev_present_status.addr_1_4=0x00020030 +dev_present_status.len_1_4=1 +dev_present_status.bit_offset_1_4=3 + + +# configuration item: fan rotor status +# format: fan_roll_status_[fan_id]_[motor_id] +# fan_id: start from 1 +# motor_id: start from 0 +fan_roll_status.mode_1_0=config +fan_roll_status.int_cons_1_0= +fan_roll_status.src_1_0=cpld +fan_roll_status.frmt_1_0=bit +fan_roll_status.pola_1_0=positive +fan_roll_status.fpath_1_0= +fan_roll_status.addr_1_0=0x00020031 +fan_roll_status.len_1_0=1 +fan_roll_status.bit_offset_1_0=0 + +fan_roll_status.mode_1_1=config +fan_roll_status.int_cons_1_1= +fan_roll_status.src_1_1=cpld +fan_roll_status.frmt_1_1=bit +fan_roll_status.pola_1_1=positive +fan_roll_status.fpath_1_1= +fan_roll_status.addr_1_1=0x00020034 +fan_roll_status.len_1_1=1 +fan_roll_status.bit_offset_1_1=0 + +fan_roll_status.mode_2_0=config +fan_roll_status.int_cons_2_0= +fan_roll_status.src_2_0=cpld +fan_roll_status.frmt_2_0=bit +fan_roll_status.pola_2_0=positive +fan_roll_status.fpath_2_0= +fan_roll_status.addr_2_0=0x00020031 +fan_roll_status.len_2_0=1 +fan_roll_status.bit_offset_2_0=1 + +fan_roll_status.mode_2_1=config +fan_roll_status.int_cons_2_1= +fan_roll_status.src_2_1=cpld +fan_roll_status.frmt_2_1=bit +fan_roll_status.pola_2_1=positive +fan_roll_status.fpath_2_1= +fan_roll_status.addr_2_1=0x00020034 +fan_roll_status.len_2_1=1 +fan_roll_status.bit_offset_2_1=1 + +fan_roll_status.mode_3_0=config +fan_roll_status.int_cons_3_0= +fan_roll_status.src_3_0=cpld +fan_roll_status.frmt_3_0=bit +fan_roll_status.pola_3_0=positive +fan_roll_status.fpath_3_0= +fan_roll_status.addr_3_0=0x00020031 +fan_roll_status.len_3_0=1 +fan_roll_status.bit_offset_3_0=2 + +fan_roll_status.mode_3_1=config +fan_roll_status.int_cons_3_1= +fan_roll_status.src_3_1=cpld +fan_roll_status.frmt_3_1=bit +fan_roll_status.pola_3_1=positive +fan_roll_status.fpath_3_1= +fan_roll_status.addr_3_1=0x00020034 +fan_roll_status.len_3_1=1 +fan_roll_status.bit_offset_3_1=2 + +fan_roll_status.mode_4_0=config +fan_roll_status.int_cons_4_0= +fan_roll_status.src_4_0=cpld +fan_roll_status.frmt_4_0=bit +fan_roll_status.pola_4_0=positive +fan_roll_status.fpath_4_0= +fan_roll_status.addr_4_0=0x00020031 +fan_roll_status.len_4_0=1 +fan_roll_status.bit_offset_4_0=3 + +fan_roll_status.mode_4_1=config +fan_roll_status.int_cons_4_1= +fan_roll_status.src_4_1=cpld +fan_roll_status.frmt_4_1=bit +fan_roll_status.pola_4_1=positive +fan_roll_status.fpath_4_1= +fan_roll_status.addr_4_1=0x00020034 +fan_roll_status.len_4_1=1 +fan_roll_status.bit_offset_4_1=3 + + +# configuration item: fan speed +# format: fan_speed_[fan_id]_[motor_id] +# fan_id: start from 1 +# motor_id: start from 0 +fan_speed.mode_1_0=config +fan_speed.int_cons_1_0= +fan_speed.src_1_0=cpld +fan_speed.frmt_1_0=num_bytes +fan_speed.pola_1_0=negative +fan_speed.fpath_1_0= +fan_speed.addr_1_0=0x0002001b +fan_speed.len_1_0=2 +fan_speed.bit_offset_1_0= + +fan_speed.mode_1_1=config +fan_speed.int_cons_1_1= +fan_speed.src_1_1=cpld +fan_speed.frmt_1_1=num_bytes +fan_speed.pola_1_1=negative +fan_speed.fpath_1_1= +fan_speed.addr_1_1=0x00020025 +fan_speed.len_1_1=2 +fan_speed.bit_offset_1_1= + +fan_speed.mode_2_0=config +fan_speed.int_cons_2_0= +fan_speed.src_2_0=cpld +fan_speed.frmt_2_0=num_bytes +fan_speed.pola_2_0=negative +fan_speed.fpath_2_0= +fan_speed.addr_2_0=0x0002001d +fan_speed.len_2_0=2 +fan_speed.bit_offset_2_0= + +fan_speed.mode_2_1=config +fan_speed.int_cons_2_1= +fan_speed.src_2_1=cpld +fan_speed.frmt_2_1=num_bytes +fan_speed.pola_2_1=negative +fan_speed.fpath_2_1= +fan_speed.addr_2_1=0x00020027 +fan_speed.len_2_1=2 +fan_speed.bit_offset_2_1= + +fan_speed.mode_3_0=config +fan_speed.int_cons_3_0= +fan_speed.src_3_0=cpld +fan_speed.frmt_3_0=num_bytes +fan_speed.pola_3_0=negative +fan_speed.fpath_3_0= +fan_speed.addr_3_0=0x0002001f +fan_speed.len_3_0=2 +fan_speed.bit_offset_3_0= + +fan_speed.mode_3_1=config +fan_speed.int_cons_3_1= +fan_speed.src_3_1=cpld +fan_speed.frmt_3_1=num_bytes +fan_speed.pola_3_1=negative +fan_speed.fpath_3_1= +fan_speed.addr_3_1=0x00020029 +fan_speed.len_3_1=2 +fan_speed.bit_offset_3_1= + +fan_speed.mode_4_0=config +fan_speed.int_cons_4_0= +fan_speed.src_4_0=cpld +fan_speed.frmt_4_0=num_bytes +fan_speed.pola_4_0=negative +fan_speed.fpath_4_0= +fan_speed.addr_4_0=0x00020021 +fan_speed.len_4_0=2 +fan_speed.bit_offset_4_0= + +fan_speed.mode_4_1=config +fan_speed.int_cons_4_1= +fan_speed.src_4_1=cpld +fan_speed.frmt_4_1=num_bytes +fan_speed.pola_4_1=negative +fan_speed.fpath_4_1= +fan_speed.addr_4_1=0x0002002b +fan_speed.len_4_1=2 +fan_speed.bit_offset_4_1= + + +# configuration item: fan pwm +# format: fan_ratio_[fan_id]_[motor_id] +# fan_id: start from 1 +# motor_id: start from 0 +fan_ratio.mode_1_0=config +fan_ratio.int_cons_1_0= +fan_ratio.src_1_0=cpld +fan_ratio.frmt_1_0=byte +fan_ratio.pola_1_0= +fan_ratio.fpath_1_0= +fan_ratio.addr_1_0=0x00020014 +fan_ratio.len_1_0=1 +fan_ratio.bit_offset_1_0= + +fan_ratio.mode_1_1=config +fan_ratio.int_cons_1_1= +fan_ratio.src_1_1=cpld +fan_ratio.frmt_1_1=byte +fan_ratio.pola_1_1= +fan_ratio.fpath_1_1= +fan_ratio.addr_1_1=0x00020014 +fan_ratio.len_1_1=1 +fan_ratio.bit_offset_1_1= + +fan_ratio.mode_2_0=config +fan_ratio.int_cons_2_0= +fan_ratio.src_2_0=cpld +fan_ratio.frmt_2_0=byte +fan_ratio.pola_2_0= +fan_ratio.fpath_2_0= +fan_ratio.addr_2_0=0x00020015 +fan_ratio.len_2_0=1 +fan_ratio.bit_offset_2_0= + +fan_ratio.mode_2_1=config +fan_ratio.int_cons_2_1= +fan_ratio.src_2_1=cpld +fan_ratio.frmt_2_1=byte +fan_ratio.pola_2_1= +fan_ratio.fpath_2_1= +fan_ratio.addr_2_1=0x00020015 +fan_ratio.len_2_1=1 +fan_ratio.bit_offset_2_1= + +fan_ratio.mode_3_0=config +fan_ratio.int_cons_3_0= +fan_ratio.src_3_0=cpld +fan_ratio.frmt_3_0=byte +fan_ratio.pola_3_0= +fan_ratio.fpath_3_0= +fan_ratio.addr_3_0=0x00020016 +fan_ratio.len_3_0=1 +fan_ratio.bit_offset_3_0= + +fan_ratio.mode_3_1=config +fan_ratio.int_cons_3_1= +fan_ratio.src_3_1=cpld +fan_ratio.frmt_3_1=byte +fan_ratio.pola_3_1= +fan_ratio.fpath_3_1= +fan_ratio.addr_3_1=0x00020016 +fan_ratio.len_3_1=1 +fan_ratio.bit_offset_3_1= + +fan_ratio.mode_4_0=config +fan_ratio.int_cons_4_0= +fan_ratio.src_4_0=cpld +fan_ratio.frmt_4_0=byte +fan_ratio.pola_4_0= +fan_ratio.fpath_4_0= +fan_ratio.addr_4_0=0x00020017 +fan_ratio.len_4_0=1 +fan_ratio.bit_offset_4_0= + +fan_ratio.mode_4_1=config +fan_ratio.int_cons_4_1= +fan_ratio.src_4_1=cpld +fan_ratio.frmt_4_1=byte +fan_ratio.pola_4_1= +fan_ratio.fpath_4_1= +fan_ratio.addr_4_1=0x00020017 +fan_ratio.len_4_1=1 +fan_ratio.bit_offset_4_1= diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg new file mode 100644 index 0000000000..082ef20fe9 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_PSU.cfg @@ -0,0 +1,64 @@ +# configuration item: the number of psus +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: psu main_dev is 2 +# minor_dev: psu minor_dev not exist(0) +dev_num_2_0=2 + + +# configuration item: psu status +# format: psu_status_[psu_index]_[status_id] +# psu_index: start from 1 +# status_id: 0: presence 1: output 2: alert +# psu1 presence status +psu_status.mode_1_0=config +psu_status.src_1_0=cpld +psu_status.frmt_1_0=bit +psu_status.pola_1_0=negative +psu_status.addr_1_0=0x00050051 +psu_status.len_1_0=1 +psu_status.bit_offset_1_0=0 + +# psu1 output status +psu_status.mode_1_1=config +psu_status.src_1_1=cpld +psu_status.frmt_1_1=bit +psu_status.pola_1_1=positive +psu_status.addr_1_1=0x00050051 +psu_status.len_1_1=1 +psu_status.bit_offset_1_1=1 + +# psu1 alert status +psu_status.mode_1_2=config +psu_status.src_1_2=cpld +psu_status.frmt_1_2=bit +psu_status.pola_1_2=negative +psu_status.addr_1_2=0x00050051 +psu_status.len_1_2=1 +psu_status.bit_offset_1_2=2 + +# psu2 presence status +psu_status.mode_2_0=config +psu_status.src_2_0=cpld +psu_status.frmt_2_0=bit +psu_status.pola_2_0=negative +psu_status.addr_2_0=0x00050051 +psu_status.len_2_0=1 +psu_status.bit_offset_2_0=4 + +# psu2 output status +psu_status.mode_2_1=config +psu_status.src_2_1=cpld +psu_status.frmt_2_1=bit +psu_status.pola_2_1=positive +psu_status.addr_2_1=0x00050051 +psu_status.len_2_1=1 +psu_status.bit_offset_2_1=5 + +# psu2 alert status +psu_status.mode_2_2=config +psu_status.src_2_2=cpld +psu_status.frmt_2_2=bit +psu_status.pola_2_2=negative +psu_status.addr_2_2=0x00050051 +psu_status.len_2_2=1 +psu_status.bit_offset_2_2=6 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg new file mode 100644 index 0000000000..7f57dfd93c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/WB_PLAT_SFF.cfg @@ -0,0 +1,521 @@ +# configuration item: the number of sffs +# format: dev_num_[main_dev]_[minor_dev] +# main_dev: sff main_dev is 3 +# minor_dev: sff minor_dev not exist(0) +dev_num_3_0=56 + +# configuration item: The directory name of sff sysfs +# format: sff_dir_name_[sff_index] +# sff_index: start from 1 +sff_dir_name_1 =sff1 +sff_dir_name_2 =sff2 +sff_dir_name_3 =sff3 +sff_dir_name_4 =sff4 +sff_dir_name_5 =sff5 +sff_dir_name_6 =sff6 +sff_dir_name_7 =sff7 +sff_dir_name_8 =sff8 +sff_dir_name_9 =sff9 +sff_dir_name_10 =sff10 +sff_dir_name_11 =sff11 +sff_dir_name_12 =sff12 +sff_dir_name_13 =sff13 +sff_dir_name_14 =sff14 +sff_dir_name_15 =sff15 +sff_dir_name_16 =sff16 +sff_dir_name_17 =sff17 +sff_dir_name_18 =sff18 +sff_dir_name_19 =sff19 +sff_dir_name_20 =sff20 +sff_dir_name_21 =sff21 +sff_dir_name_22 =sff22 +sff_dir_name_23 =sff23 +sff_dir_name_24 =sff24 +sff_dir_name_25 =sff25 +sff_dir_name_26 =sff26 +sff_dir_name_27 =sff27 +sff_dir_name_28 =sff28 +sff_dir_name_29 =sff29 +sff_dir_name_30 =sff30 +sff_dir_name_31 =sff31 +sff_dir_name_32 =sff32 +sff_dir_name_33 =sff33 +sff_dir_name_34 =sff34 +sff_dir_name_35 =sff35 +sff_dir_name_36 =sff36 +sff_dir_name_37 =sff37 +sff_dir_name_38 =sff38 +sff_dir_name_39 =sff39 +sff_dir_name_40 =sff40 +sff_dir_name_41 =sff41 +sff_dir_name_42 =sff42 +sff_dir_name_43 =sff43 +sff_dir_name_44 =sff44 +sff_dir_name_45 =sff45 +sff_dir_name_46 =sff46 +sff_dir_name_47 =sff47 +sff_dir_name_48 =sff48 +sff_dir_name_49 =sff49 +sff_dir_name_50 =sff50 +sff_dir_name_51 =sff51 +sff_dir_name_52 =sff52 +sff_dir_name_53 =sff53 +sff_dir_name_54 =sff54 +sff_dir_name_55 =sff55 +sff_dir_name_56 =sff56 + + +# configuration item: sff cpld register status +# format: sff_cpld_reg_[sff_index]_[cpld_reg] +# sff_index: start from 1 +# cpld_reg: 1: power_on, 2: tx_fault, 3: tx_dis, 4:pre_n, 5:rx_los +# 6: reset, 7: lpmode, 8: module_present, 9: interrupt + +# sff cpld presence status +sff_cpld_reg.mode_1_8=config +sff_cpld_reg.src_1_8=cpld +sff_cpld_reg.frmt_1_8=bit +sff_cpld_reg.pola_1_8=negative +sff_cpld_reg.addr_1_8=0x00030030 +sff_cpld_reg.len_1_8=1 +sff_cpld_reg.bit_offset_1_8=0 + +sff_cpld_reg.mode_2_8=config +sff_cpld_reg.src_2_8=cpld +sff_cpld_reg.frmt_2_8=bit +sff_cpld_reg.pola_2_8=negative +sff_cpld_reg.addr_2_8=0x00030030 +sff_cpld_reg.len_2_8=1 +sff_cpld_reg.bit_offset_2_8=1 + +sff_cpld_reg.mode_3_8=config +sff_cpld_reg.src_3_8=cpld +sff_cpld_reg.frmt_3_8=bit +sff_cpld_reg.pola_3_8=negative +sff_cpld_reg.addr_3_8=0x00030030 +sff_cpld_reg.len_3_8=1 +sff_cpld_reg.bit_offset_3_8=2 + +sff_cpld_reg.mode_4_8=config +sff_cpld_reg.src_4_8=cpld +sff_cpld_reg.frmt_4_8=bit +sff_cpld_reg.pola_4_8=negative +sff_cpld_reg.addr_4_8=0x00030030 +sff_cpld_reg.len_4_8=1 +sff_cpld_reg.bit_offset_4_8=3 + +sff_cpld_reg.mode_5_8=config +sff_cpld_reg.src_5_8=cpld +sff_cpld_reg.frmt_5_8=bit +sff_cpld_reg.pola_5_8=negative +sff_cpld_reg.addr_5_8=0x00030030 +sff_cpld_reg.len_5_8=1 +sff_cpld_reg.bit_offset_5_8=4 + +sff_cpld_reg.mode_6_8=config +sff_cpld_reg.src_6_8=cpld +sff_cpld_reg.frmt_6_8=bit +sff_cpld_reg.pola_6_8=negative +sff_cpld_reg.addr_6_8=0x00030030 +sff_cpld_reg.len_6_8=1 +sff_cpld_reg.bit_offset_6_8=5 + +sff_cpld_reg.mode_7_8=config +sff_cpld_reg.src_7_8=cpld +sff_cpld_reg.frmt_7_8=bit +sff_cpld_reg.pola_7_8=negative +sff_cpld_reg.addr_7_8=0x00030030 +sff_cpld_reg.len_7_8=1 +sff_cpld_reg.bit_offset_7_8=6 + +sff_cpld_reg.mode_8_8=config +sff_cpld_reg.src_8_8=cpld +sff_cpld_reg.frmt_8_8=bit +sff_cpld_reg.pola_8_8=negative +sff_cpld_reg.addr_8_8=0x00030030 +sff_cpld_reg.len_8_8=1 +sff_cpld_reg.bit_offset_8_8=7 + +sff_cpld_reg.mode_9_8=config +sff_cpld_reg.src_9_8=cpld +sff_cpld_reg.frmt_9_8=bit +sff_cpld_reg.pola_9_8=negative +sff_cpld_reg.addr_9_8=0x00030031 +sff_cpld_reg.len_9_8=1 +sff_cpld_reg.bit_offset_9_8=0 + +sff_cpld_reg.mode_10_8=config +sff_cpld_reg.src_10_8=cpld +sff_cpld_reg.frmt_10_8=bit +sff_cpld_reg.pola_10_8=negative +sff_cpld_reg.addr_10_8=0x00030031 +sff_cpld_reg.len_10_8=1 +sff_cpld_reg.bit_offset_10_8=1 + +sff_cpld_reg.mode_11_8=config +sff_cpld_reg.src_11_8=cpld +sff_cpld_reg.frmt_11_8=bit +sff_cpld_reg.pola_11_8=negative +sff_cpld_reg.addr_11_8=0x00030031 +sff_cpld_reg.len_11_8=1 +sff_cpld_reg.bit_offset_11_8=2 + +sff_cpld_reg.mode_12_8=config +sff_cpld_reg.src_12_8=cpld +sff_cpld_reg.frmt_12_8=bit +sff_cpld_reg.pola_12_8=negative +sff_cpld_reg.addr_12_8=0x00030031 +sff_cpld_reg.len_12_8=1 +sff_cpld_reg.bit_offset_12_8=3 + +sff_cpld_reg.mode_13_8=config +sff_cpld_reg.src_13_8=cpld +sff_cpld_reg.frmt_13_8=bit +sff_cpld_reg.pola_13_8=negative +sff_cpld_reg.addr_13_8=0x00030031 +sff_cpld_reg.len_13_8=1 +sff_cpld_reg.bit_offset_13_8=4 + +sff_cpld_reg.mode_14_8=config +sff_cpld_reg.src_14_8=cpld +sff_cpld_reg.frmt_14_8=bit +sff_cpld_reg.pola_14_8=negative +sff_cpld_reg.addr_14_8=0x00030031 +sff_cpld_reg.len_14_8=1 +sff_cpld_reg.bit_offset_14_8=5 + +sff_cpld_reg.mode_15_8=config +sff_cpld_reg.src_15_8=cpld +sff_cpld_reg.frmt_15_8=bit +sff_cpld_reg.pola_15_8=negative +sff_cpld_reg.addr_15_8=0x00030031 +sff_cpld_reg.len_15_8=1 +sff_cpld_reg.bit_offset_15_8=6 + +sff_cpld_reg.mode_16_8=config +sff_cpld_reg.src_16_8=cpld +sff_cpld_reg.frmt_16_8=bit +sff_cpld_reg.pola_16_8=negative +sff_cpld_reg.addr_16_8=0x00030031 +sff_cpld_reg.len_16_8=1 +sff_cpld_reg.bit_offset_16_8=7 + +sff_cpld_reg.mode_17_8=config +sff_cpld_reg.src_17_8=cpld +sff_cpld_reg.frmt_17_8=bit +sff_cpld_reg.pola_17_8=negative +sff_cpld_reg.addr_17_8=0x00030032 +sff_cpld_reg.len_17_8=1 +sff_cpld_reg.bit_offset_17_8=0 + +sff_cpld_reg.mode_18_8=config +sff_cpld_reg.src_18_8=cpld +sff_cpld_reg.frmt_18_8=bit +sff_cpld_reg.pola_18_8=negative +sff_cpld_reg.addr_18_8=0x00030032 +sff_cpld_reg.len_18_8=1 +sff_cpld_reg.bit_offset_18_8=1 + +sff_cpld_reg.mode_19_8=config +sff_cpld_reg.src_19_8=cpld +sff_cpld_reg.frmt_19_8=bit +sff_cpld_reg.pola_19_8=negative +sff_cpld_reg.addr_19_8=0x00030032 +sff_cpld_reg.len_19_8=1 +sff_cpld_reg.bit_offset_19_8=2 + +sff_cpld_reg.mode_20_8=config +sff_cpld_reg.src_20_8=cpld +sff_cpld_reg.frmt_20_8=bit +sff_cpld_reg.pola_20_8=negative +sff_cpld_reg.addr_20_8=0x00030032 +sff_cpld_reg.len_20_8=1 +sff_cpld_reg.bit_offset_20_8=3 + +sff_cpld_reg.mode_21_8=config +sff_cpld_reg.src_21_8=cpld +sff_cpld_reg.frmt_21_8=bit +sff_cpld_reg.pola_21_8=negative +sff_cpld_reg.addr_21_8=0x00030032 +sff_cpld_reg.len_21_8=1 +sff_cpld_reg.bit_offset_21_8=4 + +sff_cpld_reg.mode_22_8=config +sff_cpld_reg.src_22_8=cpld +sff_cpld_reg.frmt_22_8=bit +sff_cpld_reg.pola_22_8=negative +sff_cpld_reg.addr_22_8=0x00030032 +sff_cpld_reg.len_22_8=1 +sff_cpld_reg.bit_offset_22_8=5 + +sff_cpld_reg.mode_23_8=config +sff_cpld_reg.src_23_8=cpld +sff_cpld_reg.frmt_23_8=bit +sff_cpld_reg.pola_23_8=negative +sff_cpld_reg.addr_23_8=0x00030032 +sff_cpld_reg.len_23_8=1 +sff_cpld_reg.bit_offset_23_8=6 + +sff_cpld_reg.mode_24_8=config +sff_cpld_reg.src_24_8=cpld +sff_cpld_reg.frmt_24_8=bit +sff_cpld_reg.pola_24_8=negative +sff_cpld_reg.addr_24_8=0x00030032 +sff_cpld_reg.len_24_8=1 +sff_cpld_reg.bit_offset_24_8=7 + +sff_cpld_reg.mode_25_8=config +sff_cpld_reg.src_25_8=cpld +sff_cpld_reg.frmt_25_8=bit +sff_cpld_reg.pola_25_8=negative +sff_cpld_reg.addr_25_8=0x00040030 +sff_cpld_reg.len_25_8=1 +sff_cpld_reg.bit_offset_25_8=0 + +sff_cpld_reg.mode_26_8=config +sff_cpld_reg.src_26_8=cpld +sff_cpld_reg.frmt_26_8=bit +sff_cpld_reg.pola_26_8=negative +sff_cpld_reg.addr_26_8=0x00040030 +sff_cpld_reg.len_26_8=1 +sff_cpld_reg.bit_offset_26_8=1 + +sff_cpld_reg.mode_27_8=config +sff_cpld_reg.src_27_8=cpld +sff_cpld_reg.frmt_27_8=bit +sff_cpld_reg.pola_27_8=negative +sff_cpld_reg.addr_27_8=0x00040030 +sff_cpld_reg.len_27_8=1 +sff_cpld_reg.bit_offset_27_8=2 + +sff_cpld_reg.mode_28_8=config +sff_cpld_reg.src_28_8=cpld +sff_cpld_reg.frmt_28_8=bit +sff_cpld_reg.pola_28_8=negative +sff_cpld_reg.addr_28_8=0x00040030 +sff_cpld_reg.len_28_8=1 +sff_cpld_reg.bit_offset_28_8=3 + +sff_cpld_reg.mode_29_8=config +sff_cpld_reg.src_29_8=cpld +sff_cpld_reg.frmt_29_8=bit +sff_cpld_reg.pola_29_8=negative +sff_cpld_reg.addr_29_8=0x00040030 +sff_cpld_reg.len_29_8=1 +sff_cpld_reg.bit_offset_29_8=4 + +sff_cpld_reg.mode_30_8=config +sff_cpld_reg.src_30_8=cpld +sff_cpld_reg.frmt_30_8=bit +sff_cpld_reg.pola_30_8=negative +sff_cpld_reg.addr_30_8=0x00040030 +sff_cpld_reg.len_30_8=1 +sff_cpld_reg.bit_offset_30_8=5 + +sff_cpld_reg.mode_31_8=config +sff_cpld_reg.src_31_8=cpld +sff_cpld_reg.frmt_31_8=bit +sff_cpld_reg.pola_31_8=negative +sff_cpld_reg.addr_31_8=0x00040030 +sff_cpld_reg.len_31_8=1 +sff_cpld_reg.bit_offset_31_8=6 + +sff_cpld_reg.mode_32_8=config +sff_cpld_reg.src_32_8=cpld +sff_cpld_reg.frmt_32_8=bit +sff_cpld_reg.pola_32_8=negative +sff_cpld_reg.addr_32_8=0x00040030 +sff_cpld_reg.len_32_8=1 +sff_cpld_reg.bit_offset_32_8=7 + +sff_cpld_reg.mode_33_8=config +sff_cpld_reg.src_33_8=cpld +sff_cpld_reg.frmt_33_8=bit +sff_cpld_reg.pola_33_8=negative +sff_cpld_reg.addr_33_8=0x00040031 +sff_cpld_reg.len_33_8=1 +sff_cpld_reg.bit_offset_33_8=0 + +sff_cpld_reg.mode_34_8=config +sff_cpld_reg.src_34_8=cpld +sff_cpld_reg.frmt_34_8=bit +sff_cpld_reg.pola_34_8=negative +sff_cpld_reg.addr_34_8=0x00040031 +sff_cpld_reg.len_34_8=1 +sff_cpld_reg.bit_offset_34_8=1 + +sff_cpld_reg.mode_35_8=config +sff_cpld_reg.src_35_8=cpld +sff_cpld_reg.frmt_35_8=bit +sff_cpld_reg.pola_35_8=negative +sff_cpld_reg.addr_35_8=0x00040031 +sff_cpld_reg.len_35_8=1 +sff_cpld_reg.bit_offset_35_8=2 + +sff_cpld_reg.mode_36_8=config +sff_cpld_reg.src_36_8=cpld +sff_cpld_reg.frmt_36_8=bit +sff_cpld_reg.pola_36_8=negative +sff_cpld_reg.addr_36_8=0x00040031 +sff_cpld_reg.len_36_8=1 +sff_cpld_reg.bit_offset_36_8=3 + +sff_cpld_reg.mode_37_8=config +sff_cpld_reg.src_37_8=cpld +sff_cpld_reg.frmt_37_8=bit +sff_cpld_reg.pola_37_8=negative +sff_cpld_reg.addr_37_8=0x00040031 +sff_cpld_reg.len_37_8=1 +sff_cpld_reg.bit_offset_37_8=4 + +sff_cpld_reg.mode_38_8=config +sff_cpld_reg.src_38_8=cpld +sff_cpld_reg.frmt_38_8=bit +sff_cpld_reg.pola_38_8=negative +sff_cpld_reg.addr_38_8=0x00040031 +sff_cpld_reg.len_38_8=1 +sff_cpld_reg.bit_offset_38_8=5 + +sff_cpld_reg.mode_39_8=config +sff_cpld_reg.src_39_8=cpld +sff_cpld_reg.frmt_39_8=bit +sff_cpld_reg.pola_39_8=negative +sff_cpld_reg.addr_39_8=0x00040031 +sff_cpld_reg.len_39_8=1 +sff_cpld_reg.bit_offset_39_8=6 + +sff_cpld_reg.mode_40_8=config +sff_cpld_reg.src_40_8=cpld +sff_cpld_reg.frmt_40_8=bit +sff_cpld_reg.pola_40_8=negative +sff_cpld_reg.addr_40_8=0x00040031 +sff_cpld_reg.len_40_8=1 +sff_cpld_reg.bit_offset_40_8=7 + +sff_cpld_reg.mode_41_8=config +sff_cpld_reg.src_41_8=cpld +sff_cpld_reg.frmt_41_8=bit +sff_cpld_reg.pola_41_8=negative +sff_cpld_reg.addr_41_8=0x00040032 +sff_cpld_reg.len_41_8=1 +sff_cpld_reg.bit_offset_41_8=0 + +sff_cpld_reg.mode_42_8=config +sff_cpld_reg.src_42_8=cpld +sff_cpld_reg.frmt_42_8=bit +sff_cpld_reg.pola_42_8=negative +sff_cpld_reg.addr_42_8=0x00040032 +sff_cpld_reg.len_42_8=1 +sff_cpld_reg.bit_offset_42_8=1 + +sff_cpld_reg.mode_43_8=config +sff_cpld_reg.src_43_8=cpld +sff_cpld_reg.frmt_43_8=bit +sff_cpld_reg.pola_43_8=negative +sff_cpld_reg.addr_43_8=0x00040032 +sff_cpld_reg.len_43_8=1 +sff_cpld_reg.bit_offset_43_8=2 + +sff_cpld_reg.mode_44_8=config +sff_cpld_reg.src_44_8=cpld +sff_cpld_reg.frmt_44_8=bit +sff_cpld_reg.pola_44_8=negative +sff_cpld_reg.addr_44_8=0x00040032 +sff_cpld_reg.len_44_8=1 +sff_cpld_reg.bit_offset_44_8=3 + +sff_cpld_reg.mode_45_8=config +sff_cpld_reg.src_45_8=cpld +sff_cpld_reg.frmt_45_8=bit +sff_cpld_reg.pola_45_8=negative +sff_cpld_reg.addr_45_8=0x00040032 +sff_cpld_reg.len_45_8=1 +sff_cpld_reg.bit_offset_45_8=4 + +sff_cpld_reg.mode_46_8=config +sff_cpld_reg.src_46_8=cpld +sff_cpld_reg.frmt_46_8=bit +sff_cpld_reg.pola_46_8=negative +sff_cpld_reg.addr_46_8=0x00040032 +sff_cpld_reg.len_46_8=1 +sff_cpld_reg.bit_offset_46_8=5 + +sff_cpld_reg.mode_47_8=config +sff_cpld_reg.src_47_8=cpld +sff_cpld_reg.frmt_47_8=bit +sff_cpld_reg.pola_47_8=negative +sff_cpld_reg.addr_47_8=0x00040032 +sff_cpld_reg.len_47_8=1 +sff_cpld_reg.bit_offset_47_8=6 + +sff_cpld_reg.mode_48_8=config +sff_cpld_reg.src_48_8=cpld +sff_cpld_reg.frmt_48_8=bit +sff_cpld_reg.pola_48_8=negative +sff_cpld_reg.addr_48_8=0x00040032 +sff_cpld_reg.len_48_8=1 +sff_cpld_reg.bit_offset_48_8=7 + +sff_cpld_reg.mode_49_8=config +sff_cpld_reg.src_49_8=cpld +sff_cpld_reg.frmt_49_8=bit +sff_cpld_reg.pola_49_8=negative +sff_cpld_reg.addr_49_8=0x00040033 +sff_cpld_reg.len_49_8=1 +sff_cpld_reg.bit_offset_49_8=0 + +sff_cpld_reg.mode_50_8=config +sff_cpld_reg.src_50_8=cpld +sff_cpld_reg.frmt_50_8=bit +sff_cpld_reg.pola_50_8=negative +sff_cpld_reg.addr_50_8=0x00040033 +sff_cpld_reg.len_50_8=1 +sff_cpld_reg.bit_offset_50_8=1 + +sff_cpld_reg.mode_51_8=config +sff_cpld_reg.src_51_8=cpld +sff_cpld_reg.frmt_51_8=bit +sff_cpld_reg.pola_51_8=negative +sff_cpld_reg.addr_51_8=0x00040033 +sff_cpld_reg.len_51_8=1 +sff_cpld_reg.bit_offset_51_8=2 + +sff_cpld_reg.mode_52_8=config +sff_cpld_reg.src_52_8=cpld +sff_cpld_reg.frmt_52_8=bit +sff_cpld_reg.pola_52_8=negative +sff_cpld_reg.addr_52_8=0x00040033 +sff_cpld_reg.len_52_8=1 +sff_cpld_reg.bit_offset_52_8=3 + +sff_cpld_reg.mode_53_8=config +sff_cpld_reg.src_53_8=cpld +sff_cpld_reg.frmt_53_8=bit +sff_cpld_reg.pola_53_8=negative +sff_cpld_reg.addr_53_8=0x00040033 +sff_cpld_reg.len_53_8=1 +sff_cpld_reg.bit_offset_53_8=4 + +sff_cpld_reg.mode_54_8=config +sff_cpld_reg.src_54_8=cpld +sff_cpld_reg.frmt_54_8=bit +sff_cpld_reg.pola_54_8=negative +sff_cpld_reg.addr_54_8=0x00040033 +sff_cpld_reg.len_54_8=1 +sff_cpld_reg.bit_offset_54_8=5 + +sff_cpld_reg.mode_55_8=config +sff_cpld_reg.src_55_8=cpld +sff_cpld_reg.frmt_55_8=bit +sff_cpld_reg.pola_55_8=negative +sff_cpld_reg.addr_55_8=0x00040033 +sff_cpld_reg.len_55_8=1 +sff_cpld_reg.bit_offset_55_8=6 + +sff_cpld_reg.mode_56_8=config +sff_cpld_reg.src_56_8=cpld +sff_cpld_reg.frmt_56_8=bit +sff_cpld_reg.pola_56_8=negative +sff_cpld_reg.addr_56_8=0x00040033 +sff_cpld_reg.len_56_8=1 +sff_cpld_reg.bit_offset_56_8=7 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name new file mode 100644 index 0000000000..5f49420441 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/plat_sysfs_cfg/cfg_file_name @@ -0,0 +1,4 @@ +WB_PLAT_CPLD +WB_PLAT_FAN +WB_PLAT_PSU +WB_PLAT_SFF diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh deleted file mode 100755 index badbce2558..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/scripts/pddf_post_driver_install.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -count=10 -while [ $count -gt 0 ] -do - lsmod | grep 9641 >/dev/null 2>&1 - if [ $? -eq 0 ] - then - break - fi - count=$(( count - 1 )) - sleep 1 -done - -if [ $count -eq 0 ] -then - # mod not loaded - exit 1 -fi - -if [ ! -d "/sys/bus/i2c/devices/i2c-2" ] -then - echo pca9541 0x10 > /sys/bus/i2c/devices/i2c-0/new_device - if [ $? -ne 0 ] - then - exit $? - fi -fi - -exit 0 - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py index f36055fb4e..6c3916921a 100644 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py +++ b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/setup.py @@ -3,18 +3,25 @@ from setuptools import setup setup( name='sonic-platform', version='1.0', - description='SONiC platform API implementation on RAGILE Platforms', + description='SONiC platform API implementation', license='Apache 2.0', author='SONiC Team', - author_email='support@ragile.com', + author_email='support', url='', - maintainer='RAGILE SUPPORT TEAM', + maintainer='support', maintainer_email='', packages=[ 'sonic_platform', - 'rgutil', + 'plat_hal', + 'wbutil', 'eepromutil', - 'sonic_pcie', + 'hal-config', + 'config', + ], + py_modules=[ + 'hal_pltfm', + 'platform_util', + 'platform_intf', ], classifiers=[ 'Development Status :: 3 - Alpha', @@ -30,4 +37,3 @@ setup( ], keywords='sonic SONiC platform PLATFORM', ) - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py deleted file mode 100644 index 73e2a89c8d..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ["pcie_common"] \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py deleted file mode 100644 index 12f1cc8ed7..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_pcie/pcie_common.py +++ /dev/null @@ -1,107 +0,0 @@ -# pcie_common.py -# Common PCIE check interfaces for SONIC -# - -import os -import yaml -import subprocess -import re -import sys -from copy import deepcopy -try: - from .pcie import PcieBase -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class PcieUtil(PcieBase): - """Platform-specific PCIEutil class""" - # got the config file path - def __init__(self, path): - self.config_path = path - - # load the config file - def load_config_file(self): - config_file = self.config_path + "/" + "pcie.yaml" - try: - with open(config_file) as conf_file: - self.confInfo = yaml.load(conf_file) - except IOError as e: - print("Error: {}".format(str(e))) - print("Not found config file, please add a config file manually, or generate it by running [pcieutil pcie_generate]") - sys.exit() - - # load current PCIe device - def get_pcie_device(self): - pciDict = {} - pciList = [] - p1 = "^(\w+):(\w+)\.(\w)\s(.*)\s*\(*.*\)*" - p2 = "^.*:.*:.*:(\w+)\s*\(*.*\)*" - command1 = ["sudo", "lspci"] - command2 = ["sudo", "lspci", "-n"] - # run command 1 - proc1 = subprocess.Popen(command1, universal_newlines=True, stdout=subprocess.PIPE) - output1 = proc1.stdout.readlines() - proc1.communicate() - # run command 2 - proc2 = subprocess.Popen(command2, universal_newlines=True, stdout=subprocess.PIPE) - output2 = proc2.stdout.readlines() - proc2.communicate() - - if proc1.returncode > 0: - for line1 in output1: - print(line1.strip()) - return - elif proc2.returncode > 0: - for line2 in output2: - print(line2.strip()) - return - else: - for (line1, line2) in zip(output1, output2): - pciDict.clear() - match1 = re.search(p1, line1.strip()) - match2 = re.search(p2, line2.strip()) - if match1 and match2: - Bus = match1.group(1) - Dev = match1.group(2) - Fn = match1.group(3) - Name = match1.group(4) - Id = match2.group(1) - pciDict["name"] = Name - pciDict["bus"] = Bus - pciDict["dev"] = Dev - pciDict["fn"] = Fn - pciDict["id"] = Id - pciList.append(pciDict) - pciDict = deepcopy(pciDict) - else: - print("CAN NOT MATCH PCIe DEVICE") - return pciList - - # check the sysfs tree for each PCIe device - def check_pcie_sysfs(self, domain=0, bus=0, device=0, func=0): - dev_path = os.path.join('/sys/bus/pci/devices', '%04x:%02x:%02x.%d' % (domain, bus, device, func)) - if os.path.exists(dev_path): - return True - return False - - # check the current PCIe device with config file and return the result - def get_pcie_check(self): - self.load_config_file() - for item_conf in self.confInfo: - bus_conf = item_conf["bus"] - dev_conf = item_conf["dev"] - fn_conf = item_conf["fn"] - if self.check_pcie_sysfs(bus=int(bus_conf, base=16), device=int(dev_conf, base=16), func=int(fn_conf, base=16)): - item_conf["result"] = "Passed" - else: - item_conf["result"] = "Failed" - return self.confInfo - - # generate the config file with current pci device - def dump_conf_yaml(self): - curInfo = self.get_pcie_device() - with open(self.config_path + "/" + "pcie.yaml", "w") as conf_file: - yaml.dump(curInfo, conf_file, default_flow_style=False) - return - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py deleted file mode 100644 index 593867d31c..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# All the derived classes for PDDF -__all__ = ["platform", "chassis", "sfp", "psu", "thermal", "fan"] -from . import platform - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py deleted file mode 100644 index f179b279cc..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/chassis.py +++ /dev/null @@ -1,134 +0,0 @@ -############################################################################# -# PDDF -# Module contains an implementation of SONiC Chassis API -# -############################################################################# - -try: - import time - from sonic_platform_pddf_base.pddf_chassis import PddfChassis - from .component import Component - from sonic_platform.sfp import * - from .sfp_config import * -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -class Chassis(PddfChassis): - """ - PDDF Platform-specific Chassis class - """ - - STATUS_INSERTED = "1" - STATUS_REMOVED = "0" - sfp_present_dict = {} - - def __init__(self, pddf_data=None, pddf_plugin_data=None): - PddfChassis.__init__(self, pddf_data, pddf_plugin_data) - for i in range(0,3): - self._component_list.append(Component(i)) - - try: - self._sfp_list = [] - sfp_config = get_sfp_config() - self.port_start_index = sfp_config.get("port_index_start", 0) - self.port_num = sfp_config.get("port_num", 0) - # fix problem with first index is 1, we add a fake sfp node - if self.port_start_index == 1: - self._sfp_list.append(Sfp(1)) - - # sfp id always start at 1 - for index in range(1, self.port_num + 1): - self._sfp_list.append(Sfp(index)) - - for i in range(self.port_start_index, self.port_start_index + self.port_num): - self.sfp_present_dict[i] = self.STATUS_REMOVED - - except Exception as err: - print("SFP init error: %s" % str(err)) - - def get_revision(self): - val = ord(self._eeprom.revision_str()) - test = "{}".format(val) - return test - - def get_reboot_cause(self): - """ - Retrieves the cause of the previous reboot - Returns: - A tuple (string, string) where the first element is a string - containing the cause of the previous reboot. This string must be - one of the predefined strings in this class. If the first string - is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used - to pass a description of the reboot cause. - """ - - return (self.REBOOT_CAUSE_NON_HARDWARE, None) - - def get_change_event(self, timeout=0): - change_event_dict = {"sfp": {}} - - start_time = time.time() - forever = False - - if timeout == 0: - forever = True - elif timeout > 0: - timeout = timeout / float(1000) # Convert to secs - else: - print("get_change_event:Invalid timeout value", timeout) - return False, change_event_dict - - end_time = start_time + timeout - if start_time > end_time: - print( - "get_change_event:" "time wrap / invalid timeout value", - timeout, - ) - return False, change_event_dict # Time wrap or possibly incorrect timeout - try: - while timeout >= 0: - # check for sfp - sfp_change_dict = self.get_transceiver_change_event() - if sfp_change_dict : - change_event_dict["sfp"] = sfp_change_dict - return True, change_event_dict - if forever: - time.sleep(1) - else: - timeout = end_time - time.time() - if timeout >= 1: - time.sleep(1) # We poll at 1 second granularity - else: - if timeout > 0: - time.sleep(timeout) - return True, change_event_dict - except Exception as e: - print(e) - print("get_change_event: Should not reach here.") - return False, change_event_dict - - def get_transceiver_change_event(self): - cur_sfp_present_dict = {} - ret_dict = {} - - # Check for OIR events and return ret_dict - for i in range(self.port_start_index, self.port_start_index + self.port_num): - sfp = self._sfp_list[i] - if sfp.get_presence(): - cur_sfp_present_dict[i] = self.STATUS_INSERTED - - else: - cur_sfp_present_dict[i] = self.STATUS_REMOVED - - # Update reg value - if cur_sfp_present_dict == self.sfp_present_dict: - return ret_dict - - for index, status in cur_sfp_present_dict.items(): - if self.sfp_present_dict[index] != status: - ret_dict[index] = status - - self.sfp_present_dict = cur_sfp_present_dict - - return ret_dict - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py deleted file mode 100644 index e1bef19c24..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/common.py +++ /dev/null @@ -1,44 +0,0 @@ -import os -import yaml -import subprocess -from sonic_py_common import device_info - - -class Common: - - DEVICE_PATH = '/usr/share/sonic/device/' - PMON_PLATFORM_PATH = '/usr/share/sonic/platform/' - CONFIG_DIR = 'sonic_platform_config' - - HOST_CHK_CMD = ["docker"] - - def __init__(self): - (self.platform, self.hwsku) = device_info.get_platform_and_hwsku() - - def is_host(self): - return subprocess.call(self.HOST_CHK_CMD) == 0 - - def load_json_file(self, path): - """ - Retrieves the json object from json file path - - Returns: - A json object - """ - with open(path, 'r') as f: - json_data = yaml.safe_load(f) - - return json_data - - def get_config_path(self, config_name): - """ - Retrieves the path to platform api config directory - - Args: - config_name: A string containing the name of config file. - - Returns: - A string containing the path to json file - """ - return os.path.join(self.DEVICE_PATH, self.platform, self.CONFIG_DIR, config_name) if self.is_host() else os.path.join(self.PMON_PLATFORM_PATH, self.CONFIG_DIR, config_name) - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py deleted file mode 100644 index 0fd19ccf99..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/component.py +++ /dev/null @@ -1,110 +0,0 @@ -######################################################################## -# Ragile RA-B6510-48v8c -# -# Module contains an implementation of SONiC Platform Base API and -# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in -# the platform -# -######################################################################## - -try: - from sonic_platform_base.component_base import ComponentBase - from sonic_py_common.general import getstatusoutput_noshell - import sonic_platform.hwaccess as hwaccess -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -def get_cpld_version(bus, i2caddr): - return '{}{}{}{}'.format(hwaccess.i2c_get(bus, i2caddr, 1), - hwaccess.i2c_get(bus, i2caddr, 2), - hwaccess.i2c_get(bus, i2caddr, 3), - hwaccess.i2c_get(bus, i2caddr, 0) - ) - -def get_cpu_cpld_version(): - return get_cpld_version(0, 0x0d) - -def get_cpld1_version(): - return get_cpld_version(2, 0x33) - -def get_cpld2_version(): - return get_cpld_version(2, 0x35) - -COMPONENT_LIST= [ - ['CPU CPLD', - 'cpu board', - get_cpu_cpld_version - ], - - ['MAC1 CPLD', - 'mac1 board', - get_cpld1_version - ], - - ['MAC2 CPLD', - 'mac2 board', - get_cpld2_version - ] - ] - - - -class Component(ComponentBase): - """ Ragile Platform-specific Component class""" - - def __init__(self, component_index=0): - ComponentBase.__init__(self) - self.index = component_index - - def get_name(self): - """ - Retrieves the name of the component - - Returns: - A string containing the name of the component - """ - return COMPONENT_LIST[self.index][0] - - def get_description(self): - """ - Retrieves the description of the component - - Returns: - A string containing the description of the component - """ - return COMPONENT_LIST[self.index][1] - - def get_firmware_version(self): - """ - Retrieves the firmware version of the component - - Returns: - A string containing the firmware version of the component - """ - return COMPONENT_LIST[self.index][2]() - - def install_firmware(self, image_path): - """ - Installs firmware to the component - - Args: - image_path: A string, path to firmware image - - Returns: - A boolean, True if install was successful, False if not - """ - try: - successtips = "CPLD Upgrade succeeded!" - status, output = getstatusoutput_noshell(["which", "firmware_upgrade"]) - if status or len(output) <= 0: - logger.error("no upgrade tool.") - return False - cmdstr = [output, image_path, "cpld", str(self.slot), "cpld"] - ret, log = getstatusoutput_noshell(cmdstr) - if ret == 0 and successtips in log: - return True - logger.error("upgrade failed. ret:%d, log:\n%s" % (ret, log)) - except Exception as e: - logger.error(str(e)) - return False - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py deleted file mode 100644 index 162f01680a..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/config.py +++ /dev/null @@ -1,558 +0,0 @@ -# -*- coding: utf-8 -*- - -PSU_FAN_AIRFLOW = { - "CSU550AP-3-300": "F2B", - "AS-40FAN-01-F-RJ": "F2B", - "CSU550AP-3-500": "F2B", - "DPS-550AB-39 A": "F2B", - "DPS-1300AB-6 S": "F2B", - "FSP1200-20ERM": "F2B", - "CSU800AP-3-300": "F2B", - "CSU550AP-3-501": "B2F", - "DPS-550AB-40 A": "B2F", -} - -FAN_AIRFLOW = { - "AS-80FAN-01-F-RJ": "F2B", - "AS-40FAN-01-F-RJ": "F2B", - "AS-80FAN-01-R-RJ": "B2F", - "AS-40FAN-01-R-RJ": "B2F", -} - -psutypedecode = { - 0x00: "N/A", - 0x01: "AC", - 0x02: "DC", -} - - -class Unit: - Temperature = "C" - Voltage = "V" - Current = "A" - Power = "W" - Speed = "RPM" - - -class Threshold: - PSU_TEMP_MIN = -10 * 1000 - PSU_TEMP_MAX = 60 * 1000 - - PSU_FAN_SPEED_MIN = 2000 - PSU_FAN_SPEED_MAX = 28000 - - PSU_OUTPUT_VOLTAGE_MIN = 11 * 1000 - PSU_OUTPUT_VOLTAGE_MAX = 14 * 1000 - - PSU_AC_INPUT_VOLTAGE_MIN = 200 * 1000 - PSU_AC_INPUT_VOLTAGE_MAX = 240 * 1000 - - PSU_DC_INPUT_VOLTAGE_MIN = 190 * 1000 - PSU_DC_INPUT_VOLTAGE_MAX = 290 * 1000 - - ERR_VALUE = -9999999 - - PSU_OUTPUT_POWER_MIN = 10 * 1000 - PSU_OUTPUT_POWER_MAX = 1300 * 1000 - - PSU_INPUT_POWER_MIN = 10 * 1000 - PSU_INPUT_POWER_MAX = 1444 * 1000 - - PSU_OUTPUT_CURRENT_MIN = 2 * 1000 - PSU_OUTPUT_CURRENT_MAX = 107 * 1000 - - PSU_INPUT_CURRENT_MIN = 0.2 * 1000 - PSU_INPUT_CURRENT_MAX = 7 * 1000 - - FAN_SPEED_MAX = 23000 - FAN_SPEED_MIN = 500 - - -class DecodeFormat: - TEXT = 0 - DECIMAL = 1 - ONE_BIT_HEX = 2 - HUNDREDTH = 3 - THOUSANDTH = 4 - MILLIONTH = 5 - AND = 6 - JOIN = 7 - - -class DecodeMethod: - SYSFS = 0 - I2C = 1 - I2C_WORD = 2 - DEVMEM = 3 - SDK = 4 - - -class Description: - CPLD = "Used for managing IO modules, SFP+ modules and system LEDs" - BIOS = "Performs initialization of hardware components during booting" - FPGA = "Platform management controller for on-board temperature monitoring, in-chassis power, Fan and LED control" - - -FAN_LED_COLORS = { - "green": 0b1001, - "red": 0b1010, - "amber": 0b0011, -} - - -DEVICE_CONF = { - "eeprom": {"bus": 2, "loc": "0057"}, - "components": [ - { - "name": "CPLD1 (MAC Board A)", - "firmware_version": { - "bus": 2, - "addr": 0x33, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 0, - }, - { - "name": "CPLD2 (MAC Board B)", - "firmware_version": { - "bus": 2, - "addr": 0x35, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 0, - }, - { - "name": "CPLD3 (CONNECT Board A)", - "firmware_version": { - "bus": 2, - "addr": 0x37, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 0, - }, - { - "name": "CPLD4 (CPU Board)", - "firmware_version": { - "bus": 0, - "addr": 0x0D, - "offset": 0, - "size": 4, - "way": DecodeMethod.I2C, - "format": DecodeFormat.JOIN, - "sep": "/", - }, - "desc": Description.CPLD, - "slot": 1, - }, - ], - "thermals": [ - { - "name": "INLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": None, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "OUTLET TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": None, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-0049/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "BOARD TEMP", - "high": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": None, - "temperature": { - "loc": "/sys/bus/i2c/devices/2-004a/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "PHYSICAL ID 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp1_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 0", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp2_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp2_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 1", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp3_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp3_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 2", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp4_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp4_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - { - "name": "CPU CORE 3", - "high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_max", - "format": DecodeFormat.THOUSANDTH, - }, - "low": None, - "crit_low": None, - "crit_high": { - "loc": "/sys/class/hwmon/hwmon0/temp5_crit", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/class/hwmon/hwmon0/temp5_input", - "format": DecodeFormat.THOUSANDTH, - }, - }, - ], - "fans": [ - { - "name": "fan1", - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 0, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 0, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/3-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/3-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan0_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan1_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - { - "name": "fan2", - "e2loc": {"bus": 4, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/4-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/4-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan1_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan2_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - { - "name": "fan3", - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 2, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 2, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/5-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/5-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan2_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan3_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - { - "name": "fan4", - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c", "size": "256"}, - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_present", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 3, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/fan_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 3, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/6-0053/fan_hw_version"}, - "sn": {"loc": "/sys/bus/i2c/devices/6-0053/fan_sn"}, - "led": { - "loc": "/sys/bus/i2c/devices/0-0032/fan3_led", - "format": DecodeFormat.AND, - "mask": 0b1011, - }, - "led_colors": FAN_LED_COLORS, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/2-0037/hwmon/*/fan4_input" - }, - "speed_setter": { - "loc": "/sys/bus/i2c/devices/0-0032/fan_speed_set" - }, - "speed_max": Threshold.FAN_SPEED_MAX, - } - ], - }, - ], - "psus": [ - { - "name": "psu1", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 0, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "sn": {"loc": "/sys/bus/i2c/devices/7-0050/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/in2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/curr2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/7-0050/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/7-0050/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_fault", - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 1, - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/fan1_input" - }, - "speed_max": Threshold.PSU_FAN_SPEED_MAX, - } - ], - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power1_input", - "format": DecodeFormat.MILLIONTH, - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/7-0058/hwmon/*/power2_input", - "format": DecodeFormat.MILLIONTH, - }, - }, - { - "name": "psu2", - "present": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 4, - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 5, - }, - "sn": {"loc": "/sys/bus/i2c/devices/8-0053/psu_sn"}, - "in_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "in_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_voltage": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/in2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "out_current": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/curr2_input", - "format": DecodeFormat.THOUSANDTH, - }, - "temperature": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/temp1_input", - "format": DecodeFormat.THOUSANDTH, - }, - "hw_version": {"loc": "/sys/bus/i2c/devices/8-0053/psu_hw"}, - "psu_type": {"loc": "/sys/bus/i2c/devices/8-0053/psu_type"}, - "fans": [ - { - "name": "psu_fan1", - "present": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_fault", - }, - "status": { - "loc": "/sys/bus/i2c/devices/2-0037/psu_status", - "format": DecodeFormat.ONE_BIT_HEX, - "bit": 5, - }, - "rotors": [ - { - "speed_getter": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/fan1_input" - }, - "speed_max": Threshold.PSU_FAN_SPEED_MAX, - } - ], - } - ], - "in_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power1_input", - "format": DecodeFormat.MILLIONTH, - }, - "out_power": { - "loc": "/sys/bus/i2c/devices/8-005b/hwmon/*/power2_input", - "format": DecodeFormat.MILLIONTH, - }, - }, - ], -} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py deleted file mode 100644 index c25d711354..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/eeprom.py +++ /dev/null @@ -1,12 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_eeprom import PddfEeprom -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Eeprom(PddfEeprom): - - def __init__(self, pddf_data=None, pddf_plugin_data=None): - PddfEeprom.__init__(self, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py deleted file mode 100644 index 47b5a9629c..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan.py +++ /dev/null @@ -1,36 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_fan import PddfFan -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class Fan(PddfFan): - """PDDF Platform-Specific Fan class""" - - def __init__(self, tray_idx, fan_idx=0, pddf_data=None, pddf_plugin_data=None, is_psu_fan=False, psu_index=0): - # idx is 0-based - PddfFan.__init__(self, tray_idx, fan_idx, pddf_data, pddf_plugin_data, is_psu_fan, psu_index) - - # Provide the functions/variables below for which implementation is to be overwritten - # Since psu_fan airflow direction cant be read from sysfs, it is fixed as 'F2B' or 'intake' - def get_direction(self): - """ - Retrieves the direction of fan - - Returns: - A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST - depending on fan direction - """ - return self.FAN_DIRECTION_EXHAUST - - def get_speed_rpm(self): - if self.is_psu_fan: - return super().get_speed_rpm() - else: - divisor = 15000000 - mask_low = 0xff - ret = super().get_speed_rpm() - # revert ret - ret = (ret >> 8) + ((ret & mask_low) << 8) - return int(divisor/ret) - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py deleted file mode 100644 index d03fd656f4..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/fan_drawer.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - - -try: - from sonic_platform_pddf_base.pddf_fan_drawer import PddfFanDrawer -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - -class FanDrawer(PddfFanDrawer): - """PDDF Platform-Specific Fan-Drawer class""" - - def __init__(self, tray_idx, pddf_data=None, pddf_plugin_data=None): - # idx is 0-based - PddfFanDrawer.__init__(self, tray_idx, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py deleted file mode 100755 index c604d9c611..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/hwaccess.py +++ /dev/null @@ -1,47 +0,0 @@ -# Helper functions to access hardware - -import os -import struct -import mmap -import subprocess - -# Read PCI device - -def pci_mem_read(mm, offset): - mm.seek(offset) - read_data_stream = mm.read(4) - return struct.unpack('I',read_data_stream)[0] - -def pci_get_value(resource, offset): - with open(resource, 'r+b') as fd: - mm = mmap.mmap(fd.fileno(), 0) - val = pci_mem_read(mm, offset) - mm.close() - return val - -def pci_mem_write(memmap, offset, data): - """ Write PCI device """ - memmap.seek(offset) - memmap.write(struct.pack('I', data)) - -def pci_set_value(resource, val, offset): - """ Set a value to PCI device """ - with open(resource, 'w+b') as filed: - memmap = None - try: - memmap = mmap.mmap(filed.fileno(), 0) - pci_mem_write(memmap, offset, val) - except EnvironmentError: - pass - if memmap is not None: - memmap.close() - -# Read I2C device - -def i2c_get(bus, i2caddr, ofs): - try: - valx = int(subprocess.check_output(['/usr/sbin/i2cget','-f', '-y', str(bus), str(i2caddr), str(ofs)]), 16) - return "{:02x}".format(valx) - except (FileNotFoundError, subprocess.CalledProcessError): - return -1 - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py deleted file mode 100644 index 5969781bf9..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/logger.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -import logging - - -def _init_logger(): - formatter = logging.Formatter( - "%(asctime)s %(levelname)s %(filename)s[%(funcName)s][%(lineno)s]: %(message)s" - ) - handler = logging.FileHandler("/var/log/syslog") - handler.setFormatter(formatter) - - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(handler) - return logger - - -logger = _init_logger() diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py deleted file mode 100644 index 5a66997d33..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/pcie.py +++ /dev/null @@ -1,43 +0,0 @@ -# -# pcie_base.py -# -# Abstract base class for implementing platform-specific -# PCIE functionality for SONiC -# - -try: - import abc - from sonic_pcie import PcieUtil -except ImportError as e: - raise ImportError (str(e) + " - required module not found") - -class PcieBase(object): - def __init__(self, path): - """ - Constructor - Args: - pcieutil file and config file path - """ - self.pcie_util = PcieUtil(path) - - - @abc.abstractmethod - def get_pcie_device(self): - """ - get current device pcie info - - Returns: - A list including pcie device info - """ - return self.pcie_util.get_pcie_device() - - - @abc.abstractmethod - def get_pcie_check(self): - """ - Check Pcie device with config file - Returns: - A list including pcie device and test result info - """ - return self.pcie_util.get_pcie_check() - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py deleted file mode 100644 index 71eacf763f..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/psu.py +++ /dev/null @@ -1,104 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_psu import PddfPsu - from sonic_py_common.general import getstatusoutput_noshell - import time -except ImportError as e: - raise ImportError (str(e) + "- required module not found") - - -class Psu(PddfPsu): - """PDDF Platform-Specific PSU class""" - - PLATFORM_PSU_CAPACITY = 1200 - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None): - PddfPsu.__init__(self, index, pddf_data, pddf_plugin_data) - - # Provide the functions/variables below for which implementation is to be overwritten - def get_maximum_supplied_power(self): - """ - Retrieves the maximum supplied power by PSU (or PSU capacity) - Returns: - A float number, the maximum power output in Watts. - e.g. 1200.1 - """ - return float(self.PLATFORM_PSU_CAPACITY) - - def get_type(self): - """ - Gets the type of the PSU - Returns: - A string, the type of PSU (AC/DC) - """ - return "DC" - - def runcmd(self, cmd): - time_retry = 6 - result_msg = "" - time_delay = 0.01 - while time_retry: - try: - val, result_msg = getstatusoutput_noshell(cmd.split(" ")) - if val is False: - time_retry -=1 - time.sleep(time_delay) - continue - else: - return val, result_msg - except Exception as e: - time_retry -= 1 - result_msg = str(e) - time.sleep(time_delay) - - return False, result_msg - - def get_voltage(self): - """ - Retrieves current PSU voltage output - - Returns: - A float number, the output voltage in volts, - e.g. 12.1 - """ - - v_out = 0 - label_t = "psu_v_out" - device = "PSU{}".format(self.psu_index) - #print(device) - pddf_obj_data = self.pddf_obj.data - - if device in pddf_obj_data.keys(): - pmbusloc = pddf_obj_data[device]['i2c']['interface'] - - for val in pmbusloc: - dev_name = val['dev'] - pmbus_loc = pddf_obj_data[dev_name] - i2cloc = pmbus_loc['i2c']['attr_list'] - parentbus = pmbus_loc['i2c']['topo_info'] - - for item_t in i2cloc: - if item_t['attr_name'] == label_t: - parentbus_id = int(parentbus['parent_bus'], 16) - vout_mode_cmd = "i2cget -f -y {} {} 0x20 bp".format(parentbus_id, parentbus['dev_addr']) - ret_t, val_voutmode = self.runcmd(vout_mode_cmd) - if ret_t is False: - return 0.0 - v_out_cmd = "i2cget -f -y {} {} {} wp".format(parentbus_id, parentbus['dev_addr'], item_t['attr_offset']) - ret_t, val_p_out = self.runcmd(v_out_cmd) - if ret_t is False: - return 0.0 - val_voutmode_t = int(val_voutmode, 16) - val_p_out_t = int(val_p_out, 16) * 1000 - - import ctypes - val_voutmode_t_t = ctypes.c_int8(val_voutmode_t << 3).value >>3 - - if (val_voutmode_t_t) < 0: - val_p_out_t_f = val_p_out_t>> (-val_voutmode_t_t) - else: - val_p_out_t_f = val_p_out_t << val_voutmode_t_t - - return float(val_p_out_t_f)/1000 - - return float(v_out)/1000 - diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py deleted file mode 100644 index bff2bd41ea..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/regutil.py +++ /dev/null @@ -1,245 +0,0 @@ -# -*- coding: utf-8 -*- -from glob import glob -from plat_hal.osutil import osutil - -try: - from sonic_platform.config import DecodeFormat, DecodeMethod - - DECODE_FORMAT = DecodeFormat - DECODE_METHOD = DecodeMethod -except ImportError: - raise ImportError(str(e) + "- required module not found") - -ERR_CODE = "ERR" - - -class Reg(object): - """ - "e2loc": {"bus": 3, "addr": 0x53, "way": "i2c"} - "value": { - "loc": "/sys/bus/i2c/devices/2-0048/hwmon/hwmon*/temp1_input", - "way": "sysfs", - - "InputsStatus": { - "bus": 8, - "addr": 0x5B, - "offset": 0x79, - "way": "i2cword", - "mask": 0x0200, - }, - """ - - def __new__(cls, *args): - if args[0] is None or not isinstance(args[0], dict): - return None - return super(Reg, cls).__new__(cls) - - def __init__(self, data): - - self.loc = None - self.way = DECODE_METHOD.SYSFS - self.addr = None - self.bus = None - self.offset = None - self.size = 1 - self.bit = None - self.mask = None - self.digit = None - self.sdk_type = None - self.sep = None - self.format = DECODE_FORMAT.TEXT - self.__dict__.update(data) - - def _read_reg_val(self): - ret = None - try: - if self.way == DECODE_METHOD.SYSFS: - ret = self.get_sysfs() - elif self.way == DECODE_METHOD.I2C: - ret = self.get_i2c() - elif self.way == DECODE_METHOD.I2C_WORD: - ret = self.get_i2cword() - elif self.way == DECODE_METHOD.DEVMEM: - ret = self.get_devmem() - elif self.way == DECODE_METHOD.SDK: - # TODO - pass - else: - pass - except Exception as e: - raise e - - return ret - - def _write_reg_val(self, val): - try: - if self.way == DECODE_METHOD.SYSFS: - return self._write_sysfs(val) - except Exception as e: - raise e - - return False - - def _write_sysfs(self, val): - try: - with open(glob(self.loc)[0], "w") as f: - f.write(val) - f.flush() - return True - except Exception as e: - raise e - - def _format_val(self, val): - try: - if isinstance(val, str): - val = val.strip() - if self.format == DECODE_FORMAT.THOUSANDTH: - return float("%.1f" % (float(val) / 1000)) - elif self.format == DECODE_FORMAT.HUNDREDTH: - return float("%.1f" % (float(val) / 100)) - elif self.format == DECODE_FORMAT.ONE_BIT_HEX: - return (int(val, 16) & (1 << self.bit)) >> self.bit - elif self.format == DECODE_FORMAT.DECIMAL: - return int(val, 10) - elif self.format == DECODE_FORMAT.MILLIONTH: - return float("%.1f" % (float(val) / 1000 / 1000)) - elif self.format == DECODE_FORMAT.AND: - return (int(val, 16)) & self.mask - elif isinstance(val, list): - if self.format == DECODE_FORMAT.JOIN: - return self.sep.join(val) - except Exception as e: - raise e - else: - return val - - def decode(self): - """ - get value by config way - way i2c/sysfs/lpc - """ - if self.way is None: - raise ValueError("cannot found way to deal") - - ret = self._read_reg_val() - - ret = self._format_val(ret) - return ret - - def encode(self, val): - if self.way is None: - raise ValueError("cannot found way to deal") - - return self._write_reg_val(val) - - def get_sdk(self): - # TODO - pass - - def get_sysfs(self): - if self.loc is None: - raise ValueError("Not Enough Attr: loc: {}".format(self.loc)) - - ret, val = osutil.readsysfs(self.loc) - - if not ret: - raise IOError(val) - - return val - - def get_devmem(self): - if self.addr is None or self.digit is None or self.mask is None: - raise ValueError( - "Not Enough Attr: addr: {}, digit: {}, mask: {}".format( - self.addr, self.digit, self.mask - ) - ) - - ret, val = osutil.getdevmem(self.addr, self.digit, self.mask) - - if not ret: - raise IOError(val) - - return val - - def get_i2cword(self): - if self.bus is None or self.addr is None or self.offset is None: - raise ValueError( - "Not Enough Attr: bus: {}, addr: {}, offset: {}".format( - self.bus, self.addr, self.offset - ) - ) - - ret, val = osutil.geti2cword(self.bus, self.addr, self.offset) - - if not ret: - raise IOError(val) - - return val - - def get_i2c(self): - if ( - self.bus is None - or self.addr is None - or self.offset is None - or self.size is None - ): - raise ValueError( - "Not Enough Attr: bus: {}, addr: {}, offset: {}".format( - self.bus, self.addr, self.offset - ) - ) - - value = [] - for i in range(self.size): - ofs = self.offset + i - ret, val = osutil.rji2cget(self.bus, self.addr, ofs) - - if not ret: - raise IOError(val) - else: - value.append(repr(chr(val)).translate(None, r"\\x").replace("'", "")) - - return value - - def set_i2cword(self, bus, addr, offset, byte): - return self.seti2cword(bus, addr, offset, byte) - - def seti2cword(self, bus, addr, offset, byte): - return osutil.seti2cword(bus, addr, offset, byte) - - def set_i2c(self, bus, addr, offset, byte): - return self.seti2c(bus, addr, offset, byte) - - def seti2c(self, bus, addr, offset, byte): - ret, val = osutil.rji2cset(bus, addr, offset, byte) - return ret, val - - def getbcmtemp(self): - try: - sta, ret = osutil.getmactemp() - if sta == True: - mac_aver = float(ret.get("average", self.__error_ret)) - #mac_max = float(ret.get("maximum", self.__error_ret)) - mac_aver = mac_aver * 1000 - #mac_max = mac_max * 1000 - else: - return False, ret - except AttributeError as e: - return False, str(e) - return True, mac_aver - - def getbcmreg(self, reg): - ret, val = osutil.getsdkreg(reg) - return ret, val - - def logger_debug(self, msg): - baseutil.logger_debug(msg) - - def command(self, cmd): - ret, output = osutil.command(cmd) - return ret, output - - def set_val(self, val): - # TODO - pass diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py deleted file mode 100644 index 3e5bcc5b9b..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/rotor.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -try: - from sonic_platform.regutil import Reg - from sonic_platform.logger import logger -except ImportError: - raise ImportError(str(e) + "- required module not found") - -class Rotor: - def __init__(self, config): - if config is not None and isinstance(config, dict): - self.__reg_speed_getter = Reg(config.get("speed_getter")) - self.__reg_speed_setter = Reg(config.get("speed_setter")) - self.__speed_max = config.get("speed_max") - else: - raise ValueError("init rotor Error: {}".format(config)) - - def get_speed(self): - try: - return int(self.__reg_speed_getter.decode()) - except Exception as e: - logger.error(str(e)) - - return 0 - - def set_speed(self, speed): - try: - return self.__reg_speed_setter.encode(speed) - except Exception as e: - logger.error(str(e)) - - return False - - def get_speed_percentage(self): - try: - speed = self.get_speed() - return (100 * speed) / self.__speed_max - except Exception as e: - logger.error(str(e)) - - return 0 diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py deleted file mode 100644 index d468912fdd..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/sfp_config.py +++ /dev/null @@ -1,23 +0,0 @@ -cust_sfp_cfg = { - 'x86_64-ragile_ra-b6510-48v8c-r0': { - "ver": '2.1', - "port_index_start": 0, - "port_num": 56, - "log_level": 2, - "eeprom_retry_times": 5, - "eeprom_retry_break_sec": 0.2, - "presence_path": "/sys/bus/i2c/devices/%d-0053/xcvr_present", - "presence_path_key": list(range(11, 67)), - "presence_val_is_present": 1, - "eeprom_path": "/sys/bus/i2c/devices/%d-0050/eeprom", - "eeprom_path_key": list(range(11, 67)), - "optoe_driver_path": "/sys/bus/i2c/devices/%d-0050/dev_class", - "optoe_driver_key": list(range(11, 67)), - "txdisable_path": "/sys/bus/i2c/devices/%d-0053/xcvr_txdisable", - "txdisable_path_key": list(range(11, 59)) + [0] * 8, - "txdisable_val_is_on": 0, - "reset_path": "/sys/bus/i2c/devices/%d-0053/xcvr_reset", - "reset_path_key": [0]* 48 + list(range(59, 67)), - "reset_val_is_on": 0, - }, -} diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py deleted file mode 100644 index f2a73e5f5d..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/thermal.py +++ /dev/null @@ -1,14 +0,0 @@ -try: - from sonic_platform_pddf_base.pddf_thermal import PddfThermal -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - - - -class Thermal(PddfThermal): - """PDDF Platform-Specific Thermal class""" - - def __init__(self, index, pddf_data=None, pddf_plugin_data=None, is_psu_thermal=False, psu_index=0): - PddfThermal.__init__(self, index, pddf_data, pddf_plugin_data, is_psu_thermal, psu_index) - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py deleted file mode 100644 index 37788c2c82..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/sonic_platform/watchdog.py +++ /dev/null @@ -1,21 +0,0 @@ -############################################################################# -# -# Module contains an implementation of platform specific watchdog API's -# -############################################################################# - -try: - from sonic_platform_pddf_base.pddf_watchdog import PddfWatchdog -except ImportError as e: - raise ImportError(str(e) + "- required module not found") - -class Watchdog(PddfWatchdog): - """ - PDDF Platform-specific Chassis class - """ - - def __init__(self): - PddfWatchdog.__init__(self) - self.timeout= 180 - - # Provide the functions/variables below for which implementation is to be overwritten diff --git a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service b/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service deleted file mode 120000 index 0fd9f25b6c..0000000000 --- a/platform/broadcom/sonic-platform-modules-ragile/ra-b6510-48v8c/systemd/pddf-platform-init.service +++ /dev/null @@ -1 +0,0 @@ -../../../../pddf/i2c/service/pddf-platform-init.service \ No newline at end of file diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 82c92126e6..cb99b99fd3 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -168,6 +168,7 @@ ifp_inports_support_enable port_flex_enable pdma_descriptor_prefetch_enable pktdma_poll_mode_channel_bitmap +warmboot_knet_shutdown_mode num_queues_pci num_queues_uc0 num_queues_uc1 @@ -333,3 +334,8 @@ cmic_dma_abort_in_cold_boot hybrid_pfc_deadlock_enable sai_pfc_dlr_init_capability appl_param_nof_ports_per_modid +sai_fdb_entry_l2_discard_src_enable +svi_my_station_optimization +sai_nbr_bcast_ifp_optimized +sai_pfc_defaults_disable +sai_optimized_mmu

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 z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1=)8OK z-f?ARJm}Iw9heAtp^`L}<|&t#l*`Msi-!l2GJy`lt$Y4vJXlWSHt2fo@_W;|JxN`c z7mTY#lnF4FcoFNM+&G(Ov+=mn$-I+w2$FgJ=s&5pL%2rGIL%-0xL}hCS@|_)U&#*B zdKX<(Nm_HF)n#Ne%<7$@aX6FCIGbO#oVLftUo*?DjJuNZm3R_W&EjeHx<}{q))Y;b zRg+RTX|mWF<+5VgIIFkrakkCbIGs_m`l>rE;6^63Nyd$Jl*`Rhr9!oQ5|d$4sybzo zNjGf2yv#*@Bp5f$rm8VX>HB&XPnK1UNv;Hw{>XHFFg4NI>DndM6j8P&vYzra#cQ@f zQtNBimOK5^`m`@1_o36ih%>(cv%XcZYZYsp&sy=d=9lId8_J#gPMhw(*5$aNag*u5 zrPL-gOlN2HZ0xdYD%GXe*ERLg6)~5O`dPVbyrST9nb0VB>X$wIw{D&rSP(AFT*$^Q zqLVZkR?|&2vDwrr>rt)WtkRn4tITz^I%c&*Ny{?Q`MAqINpGBQV}4do%C-;&Zm%w~ zQmt`Wm5lZ#vTex5mAN!5C(F;qm2J+-W#h^WR-33E_ZHdmBf+|1HdT#DP7!@zBrO?cu_QfA^O8|@{!(_e@>vO~Eg`(ojkFA{4ANk;2{*2fWm&bUwbS);!ZOkd z*;t~hl}EmoyxMXSmtd7~<78lKrk~5n%HHA@sw<1m(v$IQB^?t{ZDf7Z`QKe%xeb)c zR=8#st0dLrt~P00Vp1(TJb9OT@~kKCU7oz7p1cP=dGGP$z1NfXkSFhbp1k*a z@_yNq_W@7d!=Aif_2hl1d0toG$t!yD20VF#p1gBCc|)GOVNc#xPu_W+yltMm^F4W< zW3$V1Y(|Hg&olDu*O6zxjy(Hy`U1dvcz0Pj0)%`XW!>#h$!NJbBua zH{!|jT)*Tz*DpEG^+e8d-p$Q>*5xgpyai9*TRnLXc=F!n$t!vC-tNge?8$qFC+~Hl(`{x9e0|8k!GFX!w3 zJlBIc&-GyL5lEB~d{~mk#_t?|F$DaN@_Vn+ur+<$<{d?@`-(yez9((%t z*weqqp8h@d^zX5!e~&%=d+h1oV^9Acd;0g-)4#`_{yp~e@3E(Uk3Ic+?CIZQPyZf! z`uEt=zsH{bJ@)kPv8R8JJ^g#^>EB~d{~mk#_t?|F$DaN@_Vn+ur+<$<{d?@`-(yez z9((%t*weqqp8h@d^zX5!e~&%=d+h1oV^9Acd;0g-)4#`_{yp~e@3E(Uk3Ic+?CIZQ zPygQI=^uJL{X>tZf9Ub_4?Uj#p~urd^mzJ*9#8+!tIo^9c$9u2mc<=Qb?*pFwdcd<^ z4|w+L0ndIt;MuPSJp1*4XTKis?AHUH{d&N&Uk`Zp>jBSxJ?QC+&-L{EL%uxEb-|G5 zx?sq&E<>K^nx^13{E zp3iE-p3iE-p3iE-p3iE-p3iE-p3iE-p3iE-p3iE-p3iE-p3iE-p3iE-p3iE-o^#f) z=bSa{IcE)f&RN5rbJnouoHgt@XAOJKS;L-l*0ATCHSFm(hduq~u&3V~_MDf7J?Eui z&v|Lsb6y(ud|ny$d|ny$d|ny$d|ny$d|ny$d|ny$d|ny$d|ny$d|ny$d|ny$oUeyH z=j&n5^~Uxq!`FTdp@rW zdp@rWdp@rWdp@rWd-}LxUmy1oPk(gGllPb>@A1|1tlS+OXbjSOK?}+BiR8-IFz6 z^Tz8_zJWTOV>Zqfki{3X1R1xndP85Uox#d!y)voQl+_+1ar0YrGv-dg$oxwoHt zdY9X4+h4QxYc|`aEIk{yzXa4=*OSAoEx~t8nwnW<<+5>2);cERYu7Av8n!K4X131R zI7>g<#?96*OV7rqX1y;s+;l#xw8ci3-EMuUXPU0)Y0l8;{MRvd$9H47wEFr-#kqBt z&6c(93TeTt-YFQLnr&`%1D@;h{r5iCOFR|JYpcJ}r((&i&7-aLRO%Czr8KT{W4uyu z;}gx+HA`?o zGL@-hqA}i(?TfmvJ8J5;8u!h6WnTZ?m9&~=y0o?8m5OUmw7LzgmT$5KYn>&VRBK4C zzUwWSU#szk*{vPz{!~qw)wiK>9cn79YqGKasg8SB!ZzeK#v8JmM0F+Ix~W#fvZeyzrnr8J-aiu~T~>5A2?vzx5O z-8v*2mTaS|vHoSWx(%(CU$IT;7IAdO1y(t)9nx5Z=zw4atr1hU|u@QK!57a>Ejp%CE6VyQ0SG6;@A`%B$zBp4z;; zd9wus$OH=!e>_&SgX#;8l9BlKIfj%4chjtGqZSmW)^!^EOo6`k8fDHnzePz z%50{bW`W*4tt`N{Qur(>+qlk+@y6Ax&$p^R-dMUZzFPU}mr#wR)v9yPy?tdlNohVG zyK05iQ>AG09LcQ>$?<7xlh!f4u#Pg-BDy+x+NWyIH?1tJ_p18R?arruF6)TZ{0^h8 zbd<)jab0Fzq;6FsU6*%ON1APVw$j^vGn?Z0Y!SHVkI(#?=rg|xEv>=nUf<$7);>wJ zw89%M+<0U+#_LX5EidhKd$znnt5i7W3#%j|sqyQ_)k~e4RGrQy8=soFp82^n+n%+K zg6^-^muNPhWD89)Iu*ml-9MXWmY$8X^vZbk<0RIV0-QK&1XlUZ_}$V_A(-^O;gHEQJ=2r@G;!FvwatwV?V`Xp*{jX?n2d9u35}F2N_jUWu{4-$ zqG8;ap2f3qL-7^StXwv3C~zQ4&&FAPW4tjv{hj8(KO>`A*{n|EI4hrxz4?K5*?O1O zMyam7E`~v%56IA9Y%rlQ#yYt;qH0P85_YNsGAbqG@W?J#FFc-(OM#Z`YIzsi(7?1< z+t{>1W5p)%N^&~U81H?nssz)dOkT{GR%WZM;2TZ(pP)YWrVOKnUGRqy}Nn6_$MXQ^(Y5=(lbEN}Id$qMUA z6X9^E3(u>IRU=wgr)#F7%8Y6f+nKcORPxnnoZ(vWCi6P?Z|gD|=YmX~7RbhFv@&Xz zUMaA~gia5Vw3zEm>XVwyAaog8hE@h`ht)rhuYY!?w&+G@rtEq3*O9t*?lseu1-Xez zZ1opmn3{^!62(gEBD-b|u5f*oY)5D;mCQHHW)viG8EP3c7Ppe<3C5GRk*vn`$mZ27 zJT^(scE|v zd8;MZ)e=2vZI@3gR_dn{g_{1vHYw9sN2LMjF3Szlw7QYYh)i9Y5T=JrBpE>_hL}}y zMVmH~WV#Y+K_;bvl12)wii1c+K~$8w-6}$QQc?opY%Wu-cp6LEE6dv4vbv{iESvD0gl)h3oGivIM7j){E>5T8 z%Bc1*kaJPieliZxcGY~bNgnh_8cGGovy~Zb{)ybj*1ru^mi5<>lCi}=eh}jH1+I~m zm<#SvjmTOR&g0`c@C$Vdl9qHuBsElFtgY)|EasWCG7=*WG!vS4{YUocL-oj_Lp6{6920gPN5j08G%W)OavZpT0`6FGM~YR-AT=!EsB+=8 zN%JO=%|AT%Cr|e_#8%E-*-nN@7wUI&92W-uR_RzpI<7q+i*mNZw=o*kp03ac+{ndBY`dJnieAeBOZf%W+Q1`V;s|I{t;p_&rz;*RLl>P0d;*3G>pb0sh4@ z3~{6sk%89xL)C-m+jUKiO+Fd^_;axVI0o<^yL0Uht~=b!HF2xA-~xVj5)K^3UJ z%Hl#fP7uNaMLB%1vlpWXtp;*Ls{tPp&I6CIY7_>^YNx~gibQlH7>Nvoi5I8f%@jk7>Avsr7+X$tM zatBzfLp3{{8^ry%VKJH?*A`d9@nePA58w!V^t5lsbGCrK|8cq(RZv3(bl-6y+F1y5 z)ur{!?hEz4cuWoL3&&I(_wGYH#Do;7Hi?=ogy=&|a914e!)4jID$ecOw?o~yeP;i~ za)#JCyF1jgL&;HCo&6b`(r(Ec=}&ThdAe7=cL;5=H5YH0zI#g{H&!`N-f`Dm;o|v(h z>qVRB{e74AK6F>%(i<-yL%cAyU&jSGchwwFZ|DsVsIl3(yW+xKgL?LrxeG47Yv0b< zxnH~Q?niRbmdl>J_247BZ@K!Tl^LJuiLxqhY!wDudj7esWzDM3;xfvr`|r7@yYP)~ z)XpOex+SX7O}oy!3%}7t?=f3jX2o>>T)#`xY8l@`p1_Ij%Y$EYXS@|f&q%_C+obES zPy2eGz%Ap_CgpOuP*_~dmN%=kO{cYtjggNZGU0}64oZ*dXHn?HvQo!aeyCZq`spjM z@itjJeJhvF`P=Gh*CuF`0zzeZvqj^k7m^FzB7%z-*EmipGf>NzJYihCqmGlu-6oyR z!Tz*OO1IrsC>%aqyQnZw-3o0oGLqiD(uH$Z(lWKh>ZZ%txl2{sWbop+R99$IN47r~ zePgEVzPf7Qiqd%FxKeCN9gT{S8l6((*?1_8XTN>K{A<2QuGHML6Yo9UYyKL!pDPVP zHi7Z&YI$fTQaf%}M^}t%ipgOkU+3f3EXnwd;}2|;_#2gVZJf-1C~KeEs%K_e`jZXy zDO=w5+^zVoU2QGPB(wrhQ*`_lpJd#Ba@TadN1iEOn$YK+T{9d+fM(u%{Iw;nzT`B&wsMcpLl*5$4Mu( z$(DDV{ytA1MkGX;0H$?8SFoW(2r3qJFKF@e0d(P2S?ubGEyIbE3U0bCtvW_oCOto@|uTdn5rfD8bZB|m=rRdu9)t1{( zpuYH79lON3uK-(GN7J;lZkkhgH6bC^g*uVqxVM`^oQ$SI%G)rwrkD4=o1yt&?$e0*q`j>EamJ zY$6*Q+@^SKdYY1tdlq+e8Og-JSotmtUj@7UB0XG;N^aJYA<9@c#J#Bo`6#dO5TjI( zpJ@!`o>e#LMjbKezPZKC5DSPHH(F&-w}VT`^s>tIBu(+Ew2n!}MK`CSO=4*7oNET9 zrj$ILm6V!MN+-!S`JKziQIs#>@Y&{WYYnuP0-X{r{H->dpeRjfI!xcDlA^zlQy z#zrGoqY)OWrKEl`rz~wDiri$Z#sb`hA6nO_HOs*-C|v=QwpkdULXzatH~rwe%l(^R z{MnKlSqv(n@i=iA+Nzmx(A!%7ggMAKElS#?Ib`U5QIBzGD@_)fbh2-uIGWu5*p1(c zC1KU&rg@uebP3*j)l#rhS_bpDZx^GAa%E43XgX~r-^Co}?ld_bP14gL-U5Z0RBmL< z<|B`lrfrap((;eRR;eS0;zb)CvD)JPVXTi%Gdp24w2|lI0e}WrC1kEOStczzR+EOw zYJHnz#M8;S3nwJG-`?dfq~(kh2_l4IG%VB6wfIglaD_VPI0=r(wlxoCWft~YJ8zYh z^9pk1#~0ki>S0yF4cDmYsz`C0*3oiRtI^dY?I`ojvMPm=`zlIOL%Tb|M?X9oh6Oy7 zw_9uJZ)Dgxp)1+m);7oigz33UMRk?k!z8sS+QtQq1g&<OP*# zYX|Zk2z5@%;F6$j0T$<~d5hce<7G7;PM|mT40vRBL5Rs7V z=OR=I7E|*mct}!;Irq6kE`FCKZczc+fepK47PwPb3QNC&W2KUIi96}hvxJ3dw-A?JjCSDY!95Z9KNH8-#nF^HpkCo$ zi_MgqzozB2l{-ij=ne~}{P+VtcdLg`%o@E7d$taWXi90CNRAX2+<0)*ymqSCh0-XD zp~~S0<5(HBSM_X9TQj@@X~noF#HYudefXtgG1BAd-FnH~HvKUFjg~jTTA)QiP}I1I zWOB{w)}68fWye2KK!?&3OQ#S6y6vJoYwd!@?+&HNi--PW@dN6?UobBn>UqG7DE3;01mA!&9M zASq$_m`sS=#csVE(aFvv^>+OY)OiCNZ5W?%NvsJ$hi8HZ?c@PZyu4tQ&r(* z*zY6L)u%m0T@zG3yt{rSDP6ye-S~(y=vp+%MQ7r!7d&&`Tv=QGqSf^cZ&FbSZw?rW z)rD}2)~Y|!b@#r7U1k7}Ga8h=43|rx%1Jewvdc8Ct)_B=(RI_ITy!PZUFhWT89nM6 z8`tv9C5lP93HI&7p*F0;zHlgilhPN=UO97Ru?sWlkZ|F>t!_wP_b(LGzOk{caM6ZE zoQc*5U)vt9(>b3fA%*2T5P7=mOsan6UAFD9+Y#}>+iYm-h&5U zdc8d27$TI15B}Go3t#c%!CNl>_^tQf`*U|+bN9hF-F@}_-j&!?nW6iBwUt%Q_uq4m zQs4PbQs?iEuUU7mMv<}_C@d}g-Ep}rkZ0WxLiGk2mDR+AjBPwWc~n`A>*hs?&(2P` z=N7H8@zEYhUy@{{`f<6nnD39RvgO-e`qFt^6DReO?9D$se{Iu-jf~Y?`IZyQ%i3Mv z9$&kDTHr0S86jNQ&0kEFV1Bf_8<9ChhQqXdz(X40Z)w+S_g-!&%rt!~O$T0Z~!R#&XQ zU#vd)Nt|s^bscT;cQ`+xM$#tO-Lqy1PrN}QS(|9t(~rvjK07Pvx80Vsi7rZxI}Y5* zs~=%;vEQB7T${}6qB<(aQKy8q{uY({WyPf0_9`e$tu0Y><+Unq!$E+9#?@0=sVmaD z4W2Jdzwb%vRp&oqWO@?w!3bXlAI+X?bk8|TUT1_0Z*O-ylIIE6K99d9d+xAgrA>ya z@k8UuvTZ|~43#7uWwS0PUBw|Q6X|n|Lq*IN4P1H7F)h>qqu~#=z7fee<;$+(^z>Tw z$Dg$JNnEKuh=LQYhiF>ks9KP`emBpbFQ@Zf7{QrqvaZsSI~ywe2FLw0v}s+@O&A&c ztJYUKX%l>?Kv+kc?6FpA{1=o?YPyOm2B7azBlE!Tci+2L+GIqHpyx;WQgY$tYGO{) zMWc(Rh;}LBm4>q`X1IA19&dfsuX20)ad#QCjyAzD^5p$m9Vr!YoRs9s*!9ni%U!_D zjSI@Pi92_d)8k|TsaDUUc-AHwpH#|wq)pO!=+0`B!S6QOtQ}9<1fLhsHtT4UC*}CC z>O+uDj+64LZ6cpeM%=>tM`e_?3DOo!QAwk?VBB>=`I$5(=PjK~pXy=QWQNVsv*Mx6 zrrI0d{A}}jt1r7?q(=0aqyx_B&>*VR@2BZq$vqA^o#ba7brh!g=N7J$3emCT`}If{ zjFgPtUbsF@cZaurfsnNAJ`LG$50v8WVlCGXc`Z6wu;+;aR!al?;CQ7@;B(AQ<-)Y3C>p0R8 zB^RCvfPGOdH5yZ35KZ7Zg z#cHPNk}LViglUNDq+VlkL#ZUXTun9UWHzqmBvaar4DP5);wBlnVPDPk*)pkDTamCa zan({ag+kSRuqL{J$pCc^;78*p8OTK4WRkFAs9j1|Z6%~6sgh-6P!~*H43X1)Eo>VW zSdCYw8j5Tr8l0MU7OZ>SqBd66RO`rcDtlgKqMHBQOqt4JbY-e`;%H4IsF`+?Ywkd{ z>j#Z>))j9$W0z5r>n4x-=9v}7xTai|+E7#1#w(j^Yg5nMbdz;%d4;xrrsXQDRM1Fs zw~AKs(ETPs4h-3$Lw7nd^7|8=z!CHGSIr8ap>cKPs#92% zx(MP~$m6cjnoOIe%eXF5&FDtP0r`+HfE_hb(}5XLcSot7N=!MDTJw$l=ijFpiDnF&VGzCeoNMoWWH=Y;Sp?Q9F4 zE|F&}X@Qvb&72NnI|I!*AFgovtTHXl!j=Wk&m?VmOfzs!75iydI zd>@915I=IfxW7PSWLiRyGzOBbWV!NkZ>7=hL11ZyYS5U>7Ao~Ht&NJT8aC?oqgJb} z=~9rl`9tqtx4I1)6*TZH#yFJ&Nc<{>8mx#{0{Bok4RYR}c1y5 zNl`ga@RT)jdoYZw%v@qF7}S^LD?K7{q;Ercxyim$!r&)b+!6sQNgcF@)5W9(`;DPX z&dyK*9=TZ$S~o(iQA~t#RM@b1C~2yBpo%7pLycRxw3{^ZYNtgiyrtDmx}ao!?v?gd zYS{1q<|->uT@^$&eHebrhBhIFllxPOZZ}19fe|6mOD6+mG1Z+NN-nP`NfM%@O)wRh zq@ElUc$GnRoS^Y=Bp^FVXKGL&!f#HDdOqfg_L`hlaW`HS*)idQCg0KeH*jnoY}iHR zcHt8CSlP+lSQWIzel1~M(h){WQdX-%Nex&$2zfxuKCVh*l8Bl(cZC)ck+t^G5QXCq z_XcUZh%}U}90E8V@E<9onBO9;wq~<}s4)KDNMgpH1SUkD;Z40DmD92^M)8fB#aWlb8xLVk*k!8z2(mB3KR` zn;b=$Qt@Nj-Kkm_n;O;U?85;#fNQ|c3FkcC;zs;mYBUOs992bpJ`W8F#0Ar3l)M@BB&iNv(T zchwS`eQL|GmbYM=94C1CN}Hn6<2e1x1u>pflrLOLS7_HDhzIC6s<2uv1Y$L?tOsH= zX|CH$Ym~<+Ef`UOMi!18;G%|>zj+4mEL5km6sd^A?b4Y*tK8APz%C5qdZA-NzRI@F zZR&N`Q80TH`uMfEm3k3cX-R&=K9Bav5VO{C=QYI3|ZldZfscplTd;t`Pp5Z(JzOMmJrFJM2}U-&4F|@dM~Z{`r5qI{5snXI{0e zt~ABsvC|CT`rmJQ4+UxqK4(xnGDW~Ltxo{skroCf#Hm$JfGP>W}>MHkc9V$dP zPU4UL)5YQJQ1`t1ZY7NM?l>{XV`^d|SND+;rvMc>ZHg&+hGc zc{F?H<;sj4zV?cq!TFoUM&A0-OGoFUpZlXok3Bky&gn)uA|ynCvTh&4exp5LVG}?#OO^g>OU-h>o2z@ zzPfz>-4zVn$o?z^)1Hz&V;WdF&pedix*ifr=93qRlL2JE?JJK7|dd*W|TJ`wJ}CXY73 z31my@>hHbznk~0Ixd&|$iQ!P%CRc`qE5rC`@QD|1fBh}jy!uriKY8-r8-C~&Z~NZ& zuDRl0fA80>z2XP|_QcKq@Pj`-`Tvgo&UJ78`n7lc@1Nbd^~%4xF?-BAI#hq0+`adK z{V(|PYo9oHr2OrJTgSfo^9L`!_rBM^7HM9IZV@r;atjb?v`5f$Bh z@lA0$A2%}$q7UGrBGRh(Vi~8Y**Gh-iO1cKx4QDLNuN&ym}?WnogMCLkgwS#IK!gB z=ZGY@_!~`Ix$T}?-NtQP>^qSJ47Z>poirdq_ z^O!8E6NcyhNUK}%?6b)ShjFFu$2q-PeOcZQA%82eAMcq!2OX$V!&fiOEkE;cdFh0kha1$K z4iW#}i9P*z8fnismOieQ@J8FCxT*DMwfLr=I{yz_-Gs$OF)mBrUKjMU(k9Xeq`%@1 zv%X~+P920Z_MoQRSD^SW~vQtx-|AldR>78z%)l(mUPnw+~% z^y4@=wsiH!ZvNs+p1$hWU)_J=sS{|Et0#`{8Gl$U)wIc6%|hgN$b0blQZ0`^nfzwb zMD8f*pp(}{-w?NULSa&BMd{yN%>B25k$6rQjCB3EZ%V8-gvQ0*mz0Y}q!j9hg A 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

9M1 z)}&Y5h!&NezzYke?B%yuNn|%}m^M_$mM=9=U=bt#pZQ0Sbj-!m$!;8&Q1S^@U77Wt z_{d)?s6-Mp|6>!{SW}<<5UXEVyog^GqJqCMvE&xEdR6u}@ll-3_sS$|eSXlSMU0oR zcN2e~@!x2@_cE^5=WA(+`)RCi#Mc>rP)QiS)=kCg0rpF7Bx_?D-&IM%ZeX_^ducl` zg-JZdLky+epuQZxjwayW;@=2SiPdlPWimurGm;MS$5j&buW5t%WQZnX;^XfWvo-v2%;p*Zp_3YM*O3YF!??Mo(n7INJ2ZjW&(CbrcQ}}06TQabw-U! zqH_ImFoA0$jMaezZnk=>|nqeYAcG=P+2JWnN2xqgZDjhyVHMKrtl7JnDQ%e+Ln z+G%cH3`2y&ASod#VK)lN5XI5#rjwrzQIXxiI>6jq|3oCEw}u#6cH;snau$|!`~luz zF%~)?0$*z7#Jy(Zm418APuh`Q;M+KGvPjAQbdxp z8#q%@n*Lv`qC7FsL$M^%!v8%xo(CVUMNPJ4@ORY|g3y;$|g zcoqx(Q>XFmDoNT69PD2)>C;%`Fn`F%z)A^4xdyQ6IPu%CQPbZIC0TYO2aPT1bxiit zZ*%OhsL0=_$*8^pOI67|sLJ#|^9NOuv>SOWE6aZaH_Zw685gT0wBDNZ>JQVB>1sYZ zXTpE*8?7YEZqP_HWeP7X&UP8p%|Gkp+0t%Q48kl=@$v=pvu_hrA_+SPKh7Fj3~fw* zku9mn3-CQ5DzY0D*PvX}UtvoY=k69~DnKRn=-2E)n}<_zCCZhQii1szE#gRmgxCRZ zq(#DhY;!05h;E0K-bsAAl|*&}JNxMQL>{3(@0<(i9A1bK7( zIn+e&;y0)yS*~ulH7W6Y-rNa|{3|Mn%2j~V5f>DuzJ&$<%+376DhcfnXAk<(aMS)D zb?*WfWtIPrpJ!&68D_viMCGC~C@6SA1v3>5xeS7d+`Z(55C%aJ5N5noeB-78Bc)xo z+-)msFV)tzZiQL9C1~EVyku=5Pnx{-BMHL_x_yoJOe7zwtaVB|JR?F&NI*R zIiGVr=X3v@=RD8+6ComSinL7u(Yz*L6>I90fcGKl;1G#Io1l=-YXes20#4KFT#&Ru z2ElK*j!psAqzQg!i5p}14im!Seq;2E<=~;o7d#x4g*|qnL-HHh)9Vv)%VE$iN)Ni& zKBYtQ8>2ztEwTPbG1idp*q;;-<`oc!-A9&$!H*)O2fxXlRX}84kz*@pY4J5A9f7A= zn*w6`^F!k57qQHFfwgR2>hQyI6RBrY~>&^uQZr($n%sQbg@BhEIzMBjFW9;MX z&k9J)s}6TrLLWsIGv)w0DTBywG>?WxA!cmB;%D$-)hPu;>!M-E93aIgX~MYR2c=w@ zLdrLwy;EsLY$m+uaDSD%Ls;eB&>0UR`x;`9CQlq*A(>??@*D3=sGrM{6C*xji3yXo zNMB*BFZ9x2@*Dd`#{7)Uu|%9?DV9k|QUI_xNN|2W%bFkcGMhi|mNC*7ZYyegjyZ{6>UlzY*ctZve}a z-vE{;zX2>yegjyZ{06W*`3+!s@*5GJ{YHdmzX2>huYUXnusrz{riqvPF4e_4t@_1ouVptR{h&=4i85eJ9&!i(1U= zYiHKs5jYtHd1<|7Tw;a!5!Gx({`8mm76^f*eG6C@S?%59a@jrW<2SOkZY=Hj{hGvK zQc2O6HEd|wu6~O2@(b~|u@`=|d>MO60ZE$9gWBu@skLcZE^BRCyoEiifSC5B zL)!W(spE~LY3vWL6y~sp6p*AnI!C+WW$Cep;?mip4=%68wkbizG^Tp%kXQZ7(#a!> zX0Q*BIaaWj0h;P%^q&R_o4l&7NYDNvGn2i#bMwzR76*YsZ(aRf$$7fq7WT#I$ClyI zK?O_Gd7pO01l1pRElObr_CBooAF14%02|BMs1{3 zeOIG?u1?C%2z!WSXG}cF_A4Oh;eFoq-!OY+)N-isw0qfG3J6kuTc0>u%3nJA9=3eR zEj#i2sN5mb9&Pfjm!!ITCgic24YR8F7IZO|wsXIJ?lkCO)LQ7_jAs~aoFEXSOcYwA zyVp;#vb)!(ZsqGXC$#`^3bSpJb;aanR${fBWS;?xgFvCyyFOdmav$pHmd#oB;(<^Z z#3`J+L$a^EwTi8`&ELt6C?KYN3luJqe*Wm}bhiEB#Z~MB1tf6_pO@-tW)`!Cdlx*z z=!P}MqE(U3}Nr0hRq4@-y-ejTYJLQ|vyA}I&d|B)@o z4sBq$S>tvxvjT#Y)&4ObLv2PpiS>=BKQmhH;~j#BoBZpKAp07*ku6ym{WSAcK)8q4 zI56ffEHmBw2+No^{wQNIh@`w}2;{Y;{*ZcARs9^Sh69`=a>;uOyPrBr)Q z!dg~av*1PchyoH6E|s2r`u248izio9u-_{nLE&$uElnv_wxwzLldM9326I~utA8Er z9q|Cz8?}f10U(>kIG9U$*o=KFDPcIa;v|gmk{(w;;Gt$j{b3}^aOMkhC%nj0eSrmA z9tL^Mzuo)xyCOyH~E3mZZ_l3lqWjUFn9)?v$A7RDv zSR`f3sQPQHx;z@sP?r(6z{3u`5qU4wuycnyfWyhU17Jn?SW*R1E63uEyP!NY^2>jz2qH{Y7WS~jJuW`1rgNO{!U z`BHU7Y$cpS;^XWi8H=P03e%+rTILk8*5*Y`>=|G!A7~uRZ8<{@jfii~GZCEH8Vc1MX|$LB8XTKqO^Q=q(i$jJ<~y6~z6Hd4atSFMv3O+0lq8 zk}g*7E(`~eEqm7oN>$~P%1CW~&b|N{0*fe|n~j(EqS&c zPf`Y!Cn*EVla%SMnFlHJyJm>X{YV*Do}>&cPf`Y!Cn*EVlaxn!mhvdiQU;bMDFe%s zl!4_*%E0m@<#0JJKa8c1p}&I>nJ=(gp@;KT#&8jr6Mu!(9_)d>C3ZxLM9b+ML>_xk z{SKCr6ubjVAEQ2IbZbmt@woguIESEpxPdd$4-bATSUfKO3gLg)!-(6X5AZBSU}?`I zF290xnUGyb1j1c-bBDkpDI@9~M06NgN73O0b^smTr7>cKlgH&xumThM3if!8Wjv;E z5O|2Ve2f*{IU1?{^2v{}pSrPlT)v3FFzPX+juSs*8x;_Eh`9VQt5_Aal9jET+Qjck ziLrQG)=GCQ80|pC5xb8qk+De1pwK9-DUG=sAv@s(<_j-+LT?NwDI+dVlI~bI=~=d9 zaXgb=2NnmBl!wA9?_NJ`HQQ)UdyIXcfFNbBA#)c(`#5&MfyI}C>)Dwz0Ssd<1*EHJ*s}=GO#?wWng)V%fRv! zmx1LeE>nf*Audye=pilx%TrtimZ!K3EKhM6Sf1i?1WCF7xE#T4x!<@9EKXrRaT!=d zVSjNMSe(Ls;xe#2#AQ`7R?IrH2Gx(CCuj~zgZ#C(s3@t(VgN~+qZ$5JBABm_1`iS& zz5b*wg^F?zcKCb5(t5_ycb*tjABKB~UXNgpwDzC;Mn(=FOMi6Wpetk8fB~A9RldGn zHZ?8Jau74Tl{2Uwd!z%krS!DUo6=*TFppyyj-K$xOPTQSTBT~h0Iy+cN|p$O9YI9l zNQ|X>MH)QV`xezkfSw_cq6u3k!n{uS;~7={tY&bK;Z12c zK+kh5!%O%39gd?%je_y0k@p9xDgm;Pyxs|cyzo5U91yQPqzYHlW1cDt$?I@1cyW?~WjN{x{(3at!=njT`}k->G;hfuk{2i(NmCwAQ$D2n6NoR6 zR2InV$)>=sr!$jDJ49_7pbyXt(8wS$ul}*Lp0W76!l3hdvubdF;eOQ#kg=4HrGK(H z=*m>)=chXZ_IjUGzpH@6yzunmQ2l$-kRiq*6%jA63{N%(emM^QQNQhLmDpgIv_aS$_f!oDKu!Nx?~0oQMlehv!rIhLXGg#XtQ z>B+kZq-^_CLxDvg$cre9!`*hH0XMmPb0sT4Z%P2czP5z^G(*|a>@!BSNdbv@^^c|X zjK%G196eKf2X4e0{wQUl!`(!NME3RiZS>@wpK8z`?|mvNd^ia6f_+8fHaDKj#)ERW zJwjw~EV8fPC$J$y^rzv742|450HoMg7(LtWjfV}j8&!DY0~Tlig6};Xd^U>wVK(V} zq~=ovB=oR z(sii({Jfu1kAQt~keFBhSXj98gvI9-L3>61MjJv>RDT8;_wljxFEt09h=V`WJqY$1 zR;vG`fW*AU&;!wr)3Y$4s&^ESWO%7L@Gx15J`GYf#;Kp?ASs!V9zKJ;SYt*T8Sa0X zvLqF>_aXyG*w;+xq2Wc^TE7_YO_4#Qhn}#wef5u}KRWmQTI_-g^|fM;*+5^_XGl1| z;A83EYR>*@3Lca32~-6R^{ZCDt$>)}=!3t+lU$Q04mgH;asC6OQveAH0gAXXo0&s> zir^ef=iDINL4cX#J}fp)oWs_S!CBH=5PwvXl5qzCmhyDE*w1DT9W+W6tAH>sk62`1 z9uiET!%L=-zt5$e7~^Q~!2yZ3#}G*58`u$q*AT3MxAD0k{RJIXf`?>Z z8UA0=1Gf6*Fb6}v`mYKIdYCoH1D4h^7W`pO-Dt?mIES_vwMiZ5a4jE8-?`QQ%6OQA z_ZWl#A1#*`2a!L_!HxwyCpB6MGn+O`ZNRc|EJNo&|0@&eVW@AQ*uJl;Xswb!WM9Wl z;EAU&v(EzPhTjD#4pYYSm2$pucm}YH-yuCPsnxXifP*kEk64s%c);TRknbak#TFy~ zHYpGtV*iZd4`*Q;iSG%xO20Q$c%)T;gg=}>4^Rxo#tCdO(gK9%iGW4^@cG%;i80^> zdRXHgyhw>a#$@EZE`3OS6K?EcVLUl8{0y&d?o$IKY0qyCtbc<|yEX6=JSHCAo~5Qt9K+wgk;BI_bnY8a^$R?Q82T}bziq-#rGJ9+ z1VY~Hnmeq%6$^Kv&9r{l&QfJEkoTU~2iL!e;&9j=EcuKXFO60}pb%ty%L?y|+Q{x) zcI)rh34p%QqC-i4GFk=wh7QGMyP-o& zZ>kq6Ag1?>rT2_wcq`S6eX!WgQV5;*zsh$Kim?oD9r(-TTi``~164sm1DC3&%VUv` zG8ACH4K}(g#@63}U-KHjvOPiBH(`PxC^u6=o&rKHnmXe7xd=Cd8$kT9 z2UO(rh#fRM9e7?PpGh?PF?s{bZ~$VY7nfsYz7%($8MVg;yZ znT4>B10ZwwnqHV=u)`nvKBE3#Hx?0(>IToC{u)?*<*HAB^#r7h=jbU1mse)a<{5StSnCZ&3;C$Tz&mc0N>@&Qkd+i?gh)*a2tFz)2v{4|&Ax}Nx95Gp_hJbw z!_khRz$!1B)e85O<1ek|ShNnHz2+FQEf9r|W}ez)Qa7p%0A->YrT00s1ndZg_GYv@l;!|5N^@D|27!ksLz?|*9pIX3 zNPs3m&D>)d&Tn1t+)#QC%xlP_ye_C@5ZTwY0}(rdklbnxsj*IQSxwy7%BxZB`IM16 zhtbPJGS!%Ytrr9e4~}mhO!G2mQ2or(d7Oc~r4Mbj3NOdnrgDQ2iQXGmFoa%J^g4mQRGq_E0!#mv@u|8{dK<}d72Z}--wOhT z$1BzjMz*Z|9fAIeH_j z#w%Yew7yzOWreOC^3r{xa)ZFb{qdziRAk+yMuGmM`uD&ZChFy*n>IFwp(xgU2@jyt z^nyU)zW9wp2`g9wtZAC(+*pRAd+*&ooUrU_U^&zRMD?=v>N|r=i9*fSq-^1Ma~xxL z@M=`+I+VT9j1Dz-tDtdD;AMF-i0Q9AFk~$$n^y-Z+Z9!S0>T~`-<-PPq*2ABQCoXK z%y8|&Ku{PQq)X7|Y#!6cFj*)&1dXX$3~JLJbAkq7DV; zpXOB?c5&w;1YqgoATn5V=mvqp`^Idm4<>$x_MYz`&jB{kOJ!g@iV zuyJf%5Gh-pX5c`tdo(7DC9n*x{NC8QU~ofQP8zjc73Ic4HTv`pGq|CPRt*c*X7++e z56ia&DaxjML^a!uWjO!dubvx$^jkMUg?EqTDIn5AXjC(aQg?xr%}+fGC1*0P5VhyM zUVDyS6Q{e6H0lYJ8^rZ++i+Ub3sw&qqMNCX0#>}JE6;DL*+~IW{|boLzo&A8xE^i~ zrfT##D4TvCFK-2w;r!lvcZU*Iv>I56GKlIF?N#I8wZn*qJBWvexw4fbTZTV$rTN!| zfrq*U;Gu3^F9=dL4OtrmgVi;H4BabS*#wsUe5-%+2n1h!Dy&jp(F=l<{R8U)>9u2a zfOOAuWfNEi*Uk!*Li?Yo9nNAIHEZmMX#|Ok5CyOkS4mv(w~1g zWP22fVxK%Idc04S0>W6Zl+ks=NXnDd@J0){IlRKhLed_#%}nxopQL<&dr^Qemf_mR z;oC;ykpZ7o(xeGKtx~yrEW`On%{xZp9ST^bik*xnHe?XSf_+6b2SLiZ_i3z)+=#?j zu&;3VC=9clbYqe-Q^z3=loAb?u@_<=>b;h)+xT56%fYq zxz;hRnS7M~F3sS<`mGvoV7RU!y(5HD$8%~dAYWB0Ajs>QYR1}d78vNg7s}>+ zR5cVjpC_t-&iaXv7v2w$54AC@>;=J6>TiQ1!eZHZ6_UiOs$e&kzB4fvoX4*FRuw*e z(hK620%wk^pA+b^YP1{6(7AUita4(4VNima5%cW)RvGkn}PHvxoS5)}LN>gL~ZdX7U zi=z4V5u`R92yKQ=?kY3+So-spnY%~95g9j=0z9FBFqWa`qxhZS*t+3ok)}=cTOobw z9?Q`A!HnZ$aXWb6R4H!yz)S^%u_yeUwpe6WBGi8v3$H0 z5XSOxeH7n5k~&-<&7AIMlm6iz%ct{^+s;I?q}l#+r1+Tw3l$K?^6BY_e=dl|dP5x& zVmz$&2UZTBm(Tf*_(Sl$!+na?_^5J&XwPj&{Pswy9l}+3E6#Y;1U+L9iE8v{NBr(s zdV=OWDn!43N^THxwvKqX6kMIJ!pB0@Ep9A5untY6wXYx*KFqx!Waj&bhf$FOmk?-` zD&36*`-=Z~JiWzetZLj?|66-O;KtkW?W1Vv@J=I`{KLC($gQYD!f=G zNd^s~_|>x|uz=E3%|9uRij?yxfS^&{Idwdbs-ryWS3El0!3L34b{?``HY50I?|?Jc z-o+LB6#}77X#Ce$(OCMBBV!cdysJjh%s9nJgR*a=TYJB=~808z|DBqap2Ek*ab|@GOOYwT1I{ZRT z%xEk_rzsDCW5h5mEG5`$vl|3G>@=;q9Ky_@c+o1)iz!PHV;MT<{|aP;nK4%A2wgV! z002?c>(ND(22-ZDk}|yqOQKInx_Nw%obtf50fjuNRTe>ke{* zO_l%x4>#?;OfLh}Jw&<93vLkc@Zflom%rD~C_g+TCxJAUzH@&Vg>@#$Sv&`^Dsoc7RI`p&oS0U7YEFHx*K=mrrF-=0`HgtE#zG`NviD`%B7mf?J3 zc=K?|D(|OU^w)A$N%O)IT>NDo5a&@qTp=e*G#0e?UXX#YA_+882B{T2976S12Gx~K za`6ZdxZynr@~6y7HP_JOTs?A>|QdL}O7dY3BBV zguHlN=}mRzOu4QkEG{pam)AlN?{$}4SJGIV^SrM7Gu4%PxvnHELnk=TtI-}cv>;fn zE7gis@>Kt67_8TRxp)K!ySQPMymq*sbmOI7kg%^{=!UidmZE(@E*=Ss+ZSr0AZ-P7 zL;FZCNLWfB!i~0$tnwwfcqA;tQCLa{*;fTw<ai zDDCGez*#RyXfMz7Mp5>aC>M`}r9TSo4J9MeP=#pj1qnS2#?rlRCt)3ui$}tuy7Dsb z&_P%`WRO_Lemi={QtbE{`WaSehJMNN;YBB^`8sxI@|gBD*rFHo9<~?-zTXRi$37Cj z^LDm$QOKv*`yJfHUh`J444sB)#}~80<-^})%kLQWQ7;G{`$+t53%hgauycfZh5gNq z<*H*;a>ejZvBhY(QvuN`ma9Gfxn+2-+;CqhIdQm2y2FpL0en45+u0s}Xe}Pu z4!uAhUokfb6e38aV?8P?L7F!=EJfPx#xitv#DBaLn+QjalyWjhM)ZO}VMly>D$C9o znImP*AGugM8d3W!$Pdk#`SoH0GvB2B+FC`bAuuu}NyxAy#j z_>b{=$(bQB(##pbw<#bCt$lUGAD_-<&K$8wni)4@sq~5&KV8LFv1neGliBR}&?G7T zw$Ky>gt1`D6cDj1c(`hDR`=z9Wu;bE$?y-Cj%`Z>Is^Z8OrIh56Z8C`J6wOt`(7K6~ z!EUAc>sh79qWhKS(*m~LLiJaPg!=1lHwY{3J%`6`=Wo)OPg!NYk~-4ez|OSr-Eovv z-a=VrvKxeT?5mD}Yeyn*XeYxtXmi|UAnvuf(oA)ca1Oe!aZgI;>jq(!xMyw{sy1Zi zf1~{X%$?j~mH2#W$a8oZ`!Me}u@vlmQlfPJgh@O)|_BDyJuY*|dHy!Owv2bSuiam?6ug59-dfE-bysjM>zA=KT z(YvS`eN-tq;YBsB%|Xp$5n=V?s2WXhgJ@pbTes1>oeg6s$DYN5ugI}A=ii>N6E7_f zFOwu+Umv9bL$jKdm%BKi`Gt3R3xj@dJKuqP*P2 zbdsGeO7em6GjFLPE6c@HQVBmWe$Y~PKwx9&V33w1Cc2nf%Hs#d4;r>2EzQNe*!;LS z7t^!(1oM_*(mgbgmvm1}jSDvi!_YN;7(*Ob0G;Wj`72kt@ary9=uDEL`GN6+w=@M^ z=rXd+0$k9PQiB>Zqj9KqD0iJI}28Wy)`kqbW=l0Yy$3m8A%gNZU~yFn$RzCVEpj? z`c)26pkLy^R??YUzs7@h=vThbuSG(?_(8++K@s#TOXydc(61~yXrvmUUo}F%hNDmD zmpHH?bf%ZGgnq@+nIwq=8&7B6QY^ZLevRh`7IB?^=|EDie({!S##_4eE0OT@%ygZ8 zWq~BGrj1B_9txv(h!K6=NVPWL2!~wZv0CWcE=*)}puJz&ovUE^D zjg*?2O8#p8{Q2asQd1L1pXefT`#9i1pYrnZ$Y0Uu(5ERF9d8+l2D#8Deo@8efM2iS z7v25}UX=8SMu)!=2R4Oz5hTH1#ZhPQS0JAJl}^X~)qIRjB&CwS8sqCr{wkR1$X^AM zVBtdJ5=fuo!p4w3C4grta0&c`zv5>qX-aSy+!mXHuHmovMIBoLTHvoZo*GR6Q?s}* z91v+SY4|G!0^zTw@XiDt{FM$wcu5Hu5B`d{3x7rYR5Q*`wI0%(LjEd@nnEQ@!C#SZ;IBw3@K?lg_$!X?B`XnW z)Dkj77L88`0-uNt_++XIx~@uvQ&6d*V`D)<0L+5%m?lZ7h>wUj)ThL+t0_22YTjNQ z%+=c$=7&9tWc%D7s8|}l!#BVUFjYD4KaKaF#`_<_`zMDbNol-)Zfp|2F87~E?bWfo ze-rhu;wq@h%bO26^QM3v6-`mFS>j5ll9nWZ1$^pEP39x1NjX(&lB-(HZGeSA@ZbZ< zk3|OrlZc=+j7jwv5;k=YWdstdK*R*VP6w4l(}hh@4gme1f-_Qew1lcB@QaMcYp6QG zRE$D8sU>L(#0^eB1Ea|oF>$~tm;nupCWnDOIg6z!#36~Lat0zeA|R=xF`R9TB0K1G z5P@o`hDd_Lx7&&8MnN?XB6#|gU}{!Q2pXJ`oTZhEDBQ4envs_jOL$&vC7NJHLx^g% z#9g&U8qX&trXq>lfw5RhA=He=3k^#o>8W_k!)$pJ@RG(;FJ5d2B#ya{r}?S5BSlD$ zqccg06P%!+1y0b6U}2;Ru&^{@5BNe&R9v6PM-!eGA01qZB`&GqPrw(@NqiA~f@jnx zgvoUYR!e8-lemlQgcM1|66wrKBI02;u{eOAal!DcFfGz1+2JAWf_^{?xGyEshZjVe zK+abq4l1E$D(tlOC4PpHgB7-jC?1B+z}6*8mJnO{K_e|8M=4a5)Q0>X@^`wZ<~9t! zCzM>cTR10DVK0I1C0c5^7X)`x$*F-87zo_WBZnt({Rab=kgI~l!y3TdJUVEAzJ$0d z`@JQE;3dw`HJxd>`va4?BSF_>G#ZKM1e3*qQw=7ICc^Uws>y!^bN|I*B4mKc{7fr2 zNS4OkKV$!uygzA8QBp;@t*WAoC;o-Dvdq#sRTcO(?XX$q^n^wEN$JT+x%2YpWM|}M zCd{KZurH4+E-6^E##&VrMbxqX3aOH_(sK&zj87%mwH{T$p5Da?6wnQ)8EL0G}okbci3Xzm9@z>lzTp$DTo? zioe_n8-A2MVp5D9=L-{izvr!}*wA~1W=Sh5de1YhRejGbdcaQI$Y{?&LXoU0@N!G!C^`#;WqW$8L=xiWn*Zz5eVM{uCZT4YDP zZMKzIA!gLw=G>Cfsv;rSl?A2c)#eDhtP3P(K`tqQxwM)v=;>kp_x=4>SFHJA1IQYA z^9cR-Ur=Q=mqTS%l&&;e%PZ_FOU$+kbHTcb(jw^PMtM%88lV;PbWesWHqE+szBkSz zhiLB0EE=p}T|sGC!HO~~jU%|nnMXqqOT~!js+ZpH8@-pGGL#G6E_mOGI&d(!x?}x$QbvdXx67saOYnDl6k6 z5aw7~4z21#S~MIu*C;b2C7KjhR0)|SRzwrsk$r_PvoV${hIyt3RUouJ^ZmEzrI}wJ zHU3SC6+VgCRFfV<@6d^@q{?dLj;EStTTRLwVINN>OP(jf&dGMueKY?0ikq-yO!N9u zTM7Kc^{iCvhI7k2vwySs55{R)=gg`srTd(kc@!ahULqTpY5RN9elnG?z=@8QW(E;)Pv(X+@*fav5zhJTrmZL-hGV^m9C+Xg7=|@WfntiRb6Nr#I_`Jb4`4Be};h zn-hvw*{f}`VF<~rAU44YvaN8eiumXvi_EpIspMnbCe(|*(|m;9kvHdpLK(eMw# z1)v0kM}UE&)eJNB4L2TBL|^dtZ;w-HtwJ6_)w4W|=W%%dp6bp2Ui~ZPX_>eT7NiyN z))f^te$rbLf`|#`1@plHZVLz*3Vr zM-c#)QO&^2*;s9}t}&+;ltC!ScZm;{@|85H3AfEFEnhvaqM&F=CQ74nTOUG~Ey;u! zCoQAZzeyl8lArRk4Jj$eT@2=AYe5mk@zv%OlBgK3e_EoiCj+{HG|-%h|1@bcUR`R4 zyWxs?!flk;5}nk7d{pe z8r0q8g&WNx<4h}GS5StP41C(TqGn~L!Ru7nNNLL0&f~u7; zB!MHw1`E(N6o@+H`a`;B&MZI*OR2UTxA;XQ-)Jth2@L*MUj#0CCuH*QT+&LPD2(ZP zwQ`k@O}>pMgjA*qaAuXYno4n)JYVjS{ROlDdNt2lP)ue+sx?1v9xasg)zLneVF%yq zPQ+vs1tepRh5=vO|}=5P59Rc97mxmt=wj< zT4OCLB?ai$=Uq=EcR74ugJ(C|XWl=kf6@kp3u1ul=EZdpYtH4?LS9+*VFzK#{J>Xk zU(nB+oTa;S@+DY7se-Zeb>p(@q3 z!&)e+RLK(M`hKH>cX#;xG{cHKx_e<;xJiQ21hIf@%-t(dEyk^^EZaz+d6UfxCnivA zktYq_lJDReC7Ao4yZ_KCFX%>R9`UH6$S9_I4iHHT7zt>+D3Yf>+q{^>8s^6kqTIKmARUS_-eCo%%nGb zsuV^kY!(#5G|ZJH8z+!Au$c=Gs=yM&fN0S$2c6ri&9k6+lsf>wmvJ)FkZ6O2*_OQA z{LIw+q}*)t`l?b;G-*S`26>>f+3W*PDmH&voOP(B;0E^sq@Nl@cl%n29{2UK{L9K@{I9%W`V;lsUN&Aja+O!p(nPJM@9^_$7A^swrPr=8Tbh znM(4TL16yJZPWu}zMmhxUO0lb7*yFJXw9X!KY36^(PZ{;xG30hh4TZ)@8M%#yXfV@ zk7J}vUvD=zF!Or&%?y>{5zvLW6gzJ134G);<<+I!I4OiyDdI+R7MBBI;&!so%<+h^ zZc*U2JkNz>Txu=&H<^-6w|R@OKq~_i3aL0H<%rCjH_x0+PGuIn$E27IQLyyPLMnAQ zXE@Wj(;-hl(ERJ%29`! z<_q=1`SRnt;qy&L0aaRAX5GN!I_)h%$D&UNkcgWcJw5tXQqjrL)9~dcdWD>Nr$Dzy zW|)&I?W9IYYbv4p<54qTe`>SxZ3POL0s~K`lnWvx_3eS8c<(u#^V?GPivlJ>8a2uq>ah;HI?R>*7Bm;I0U|ybgsO(0#l$+%Fn6OQgEXX z%e^)NAeo?cdF7?3>&**LXi@UZG3a^@RDWemW3JqfY z6#~HS$OP2wjTdW@y<^x%f|n;%#P1$oF}1OIgV90mH{`H6|$9hgSi#g?EKfi z=y~%>z!R|Zwg^YUBgtPsj_9WtW2|J80GrPy0s}kTfkS_>=vN$9$j1VHjFI6nGCYO} zcnlNp$@2MR`JDR3qli|rh+JBWg6wE7G71x* zDKK~k+meW)W#i4sbeNGspJrU=`C>BeqlHna$h^Jz1*{WcDTh+aBJ&(;c|?(bGRC1| zZ7CA8k>9DL+`l?9q9}^rr7eX1@eNBwVj&2<@H@1$m`fpx&J7HtS_-PlHe&t0uNX2* z3b4b2k_8a+y=@{kaC*^ZPFcl@f--X76K=!l0{Rx6xh9c%nia9Zz~<*BGRqoT(gkUm zISDAUsB*sU8m7*2QKZo^y|id{dcg*BVg+rboL5n?8tmZC_ePl95pb?=g?0tySmVd_ zf|d620&|9P!-e`!h3p}Jq^Cs%xW10=^ZXzDgu*6LVeACLZJnjW6>E7ce1jpPnu7$2oY)_NL!-^H z+MoyAwkTM5CXJa9O@t>eET}A4QHni>*cy!O@K8-yrnL&U4@tMh9FhtsC*(J}5;D`0 zF*|V`wy*%Z-XkVWAqQwq?(-eWKuXG^C)fip6Tx!^w;~Fg;@cd{{8+eLvA`|XqN`~o z8!IK;3Kbe?L^)Hl_BXNdSnq`Tk{6J_#^P%fCLw6$x5~_lMTs0jAs!YklOAo(t0pHU zXoV@n5vBYHTYxuPL*MbJOJ?q(S+L*n{9hEV;DvPaue-)|fUf_T@l$d@eB8Vg`n++h z?;j_Lykz9fGmGK@jR$CiZtU0KCW_Ry468(ZeGT`?%2)RCDYdi5rGUVdICB_`v!&s3B_=8VjjoQd;N%;{-4>E!ycFh}Q@ z_C&%;R~GIf%L>X-VHDw(XD{4MtMDoCRGe)Xj5;7PWZnyza{Y+qMLTz@z2f6d<+el> zJZu@1_s6Ll%M&-8OX04osxnKdsz9kiw+!G|@z-Biq3cM?c&MPrVn)%Ez$He^EycEa z5lxgf@U9Rd(Ry=B8sw&SlP98a3>tG$qhgr{h6*ddKpyFuLCwfwMW0DL)yyqjW2IZ- z8QJD}iAj9@lx|bfttIM-uJIZG4u)>hL)p;D41_c+Thhuc8iBsF>S{YTwZ!b+N)xnj zVn8L`tsy2%nLcgmlu1(sjRxK`&?Zt9i6ePuGvWhMu^c&j@1y8$o@0Y3#!tro6#UPK z*iZs_5G|mW2h}87nUyPuydWT0gK)hhV#6}fYo52F5DU6#6?Tf1v<`!{=nd{p`oQJK zwr*;|vaJ&e5o=cPMW%AP3q}6KiW0NjjDf%)kr>E9gv$hMXPFdI<)mKDk|WpM8a*ir zy!f|zG)I!3Mae*hWccCz%3E(dk*UZ^CQ(kGvym0@`Xi!1p2?5RwUJ&=uw*Kk_Jm{$ zR6!Xtdl8tx({-+F)uONv4u)jD0W#kJnQyp3<{t48KM6aHXXjSr=GW)sbFvfW=gzY% zCb_t5;d=V-9EBh9UA(w!JPyv=09d7RW%@mHF09M7ICjt89rR_>9=p*wQh_br+cGcQ zCw7k`H(c{gyV;c7VM@*o*PDLX@&4((d5&{gt(L2q&M4fUbXcw~KD5{Abm8w#zo%xu zaN6~(Wb>-MEZO{@RnZrf&HGu6ZDQ?ZwSBC!ictJkv65%s>vXLm3jMM&UD=Bq2kBQA zpK90_`0Ym_dq%bIeGLyj*6teuJlXxfA(06iHWr}Mpe}j!hd~yALP_t zWV=AtT#u}bGOxGc#(o=Ol!gushViO;I)C|+LwmEba`H@VW#It}92XY0&WvukFBC7} zC`oNS<7!F{4|0yo&|$us+Izx>X-o~9(Z8u}^C&cFKONw^s8Y|iXJujEt0{2ySp+(%3T$s-%~`Iy@F0Cs_3D>#h!0@x@wOmjbA zDSSj9hCszZ8#ljYCGJ1#>?1lYPpAE0OAmp0Y{>98Q+9UK%a zH??Bq3^6jbD0UotO$>gpB{_VA4~@U4*hqs@KS~ET3~SnT2xK`==JFYTDF*EB)Bc75 z|1yD3m0DasU})a~sh^t$#5jV*7&CwQvL!h0T8eS$`{Ko9g$lfwtG)+b1}yVU^K-hGvs8o!1W0pic<_LE>;c0Ih* z5HMn>vmgf^u5pj4k$$ce+V3x!>UZL+scpW?)TTDI-PV5E%W=HnY$ypt?f6rJ%p>2Y z(TezN(L4V(9tgXRIXc>%8W7%aI^I6gksKbdFiX8Rvt$~P+i|;&m1NSl*YK@jUqJW# z;)Y9-EfAk7n?F7^HXnTIZCZT#*(cqAUk@zPt`5h+hBGFNl7%rcOYWrpN_c<6dN99+ z{d$^$(NrGg_FdD%lb!&q@sw@&x{%uMRO|d}ztgVs zuKmui-sfd?x8Y?~xAtYJTNQJv_Oiy*cnS`u_Ojm8_%Qmdz3gY&G>{K@IL%g+W=ly+ zvyEx!(%5wHc(I4NOF+R$6KD2bn{GF~=At`yH@yR+JN*U_T6Is~eSttRH-O@CZN%=Y z1RB~0wA*zr!j#wU9sr7)=UL8m36Fm`&D3}tBc<6^uTtGH?yzYSy&^ipHhtU`+b#I- zgZ~r8T`_H<_nr0WuQl0n&Su!nKuH(Jk}cJ=Z=83Hrv`VgSq>?*z;>8BA55#RMHwLufs^(?;i zKLq_UXg@=MH(k|)&U)~zw4X*a#JyeF)CNsh7v5+I-68J1MBFoNq91~7a2ZVZMRUjl z?a!QXxx!m_;&9`D)R(%8euD^Ke7dfogZ`RK>iP_j-FxuS^_7lJeBhURvW z7rU_|G@1m^Pk5s}__hV#IGvmE#nkq|p9P)o_CqK9l3v$cfX@NlOK$9#fR)|JyHBH= z?in{ib-VEzA=W)|H-ou!hui?(O{>CCMh4_!Z#|4y*l+q(vfs_Gz+PdOR}e#Y(brw+ z=Mbygzwk01plB<*mFB0?dGjNp z`BBmQg2(1Bi00=+yRUgWQ`?*8aZVI{p`%fHd#^$Be57ElY3$VoT0*h5wJ?|E}v{h<-@h92OtP!G-Nz`Ygx6_AbAyc4uJb0%!0Y6wrKK z_5m)tX@S#-Q&U^|08`sBQ=7%~?I$585WpJFgi>0Q?hE?r&iavZQs}Phcnb0Yt#xNz zFkNHEDn?1((9zUK&4Ar6fk31yK-7Qxamb;DGqaVH#bTmfzW_hckb1po)=$nu@^=hk zcm6VyvYYXU>SHl5)ZH>!V^&+vIQipSa ze9YKW3!0X>nk|qH7HZYPd4q)bIaGeoL&R_Z_!{RTX5_NBsY(Aw4c?- z=3T5i3w>jb4oBX_*kj*xm~ElgH69pyh#I%IpV7u1hOlFgJMN=IUcKLO*tu&iV_+@u z)l~lnu$rn0k(Qx6TKL96#Niz0sYGODH9p9^kdQ5O`k>w7g(wFo3_zsOYM02UPqtA z`m8L{YW0DZCMuNnTdqkcnyb}K>DOACs7l&z>Cx0)_M$62Ewxk|!R9nG>4L?T6GO&u zIrf{zQ|snX@-mu|mqC=gOhdOYuEx!Izdr5i4#rszomuFNjQ1MOQj&0%>9SvjjX3_~ z+)1)r+_N_YUDkeQta@J2j&su*tWK6gc^F)noPI5Aee+ewsd?FvCd;S$Ef-mH%`r;P zj&Rfeh)n-v%baVgB$xeUljWMr{!z=E9+&-7$A?XptIp%7g=E9~1R<}s<|1tE7``EM zQ!jI>|5E!#urReEhIQcD3;5i)cA^mr5o@nEEHOP*_g1GVzSl?mdjPt!wOD>nZFGD0JtnUYQ4xW}e} z)$8^*kOmlmS6kD=>{vhOQP*CfwT>$q`@|N@MQS`#jmA2=xrr0dxM!WV>7lnV$V_P+ zI^U0PO%ENwC!F%9rnbC~Adiy`XG5uQJx)I2tlD_2{j5)O-sg4cpFfT%VX?&iIgB6% z2GpE)x-R|n1^Mb}ctQYz0Du?2h5`VcT_vx6nR@y{ZM@X}g^%Na?;b|okdM6@N^Rj` z_XRdw^0~LdHY3&4NKPfyHas=eHYnA!iHfbd^hj*oLyqxa~e4a%1RFLgBSaigyTxH<)EXz-RXk>p6O_( zib{0V-ZcaP(@8(C?MQbwY1lWczgBqrH#CXNq9@fhG}Y#vY9HQUy>zB~DCXC2x~t)! zzT2CBJ>PI}0CAizjv!p9EuYsNVrE3hB^Iv6lFbLothQ@HiNBkw}E ziP!$^r}c>X7tqGo(e3N7T!?Ue3st5>O<<9nfD%k7IvIr$g$Fo_XhWU|Z35ig)}5s? zgt|0Rm*3)~;h>Hh%d=^Bq+f70BvUNu!F*cMduBAzluY$8DA!6}!IYe~RLrC1*y0|` zMVH0NgZV`xT!g9q0X+P^_ z>}bxrYHEAsp4rBNUWBG4QDJ|M|{$(8(V_P;dDtdxLWcNf=S7wt%xW+aj3!D zj%Ak|c?4${a0W8~5$&f{UmL8?;^QukT>g?5+mo!C9-DPX^;tzIO)50a-OG+5?Y9WpJxFvN9R zPIiYU5jTyFyh~69qr<=bOI2J))$aV*Jt9K?rx|q#(ewsJRbJ1i4`%db)B&9Rf5#{? zd6`ic6Mh7vT8AO{IewHz9Sy#TQRFT9Xw(bS`!ebYoc&8inKn1WM!1$}u=YYq(o#!0 zVrt{7RHWv65C!1Dc_64ee8lbaCW0U+cx{c(0LMZ5fI8Hqr(Ezs`0dMXe_S=$ed^A{ zUw(+Ld2eO1$#yv3m@OEWE;P)$y-O9>ZmQo1J#T5?6#Pt3a14>iNEGb7j)G}$&8rx> z-4}z%MTw3v{JlMhBzlYn1yXl7b1;ruZ5z%7aI0=<>=B9ixA;cpYic{y@-SbDD+%GcIsF_Dq$<;0OQ00(rg@P;V79*dfYS;K>D|^ zPE#8e_+XeYqVL+zaQ?waed-SFK_|kc_8_jj{uMd6Q60q%2c;YR+Hc|+f-M%zTrT^! z3!L>7hET2U3kPpiHj`;H1+CiYAgum-2-`q}J$S1i4Ai*Db^Hs;iionW-IS?rq-@~z zlsSizA`n^X@2BMjqDA}f(ee>GfBheBTGThvvgx+#xU^Kz61yi~snr^+SGm-37F7FU z{(48iCN4XzV=xJiE@dJ?&(112P2{bdirWHPrt?B_3hL3`<@}G^Kl3u~#oC{#?Fq&4 z%e8;Q!9X=HZd#7_bU2M5Nk)_x|GCG#h$@*pF5LoXI2a@&9Cm&>>jyLsb~k^KH~*yl zvjE55?b*#1C(5?wWtW=s&N*Kg0$#bmE7<*Rir>X?9j3-#LpvJq>qd^f4F{)C;&s6J zAR59{5PrJXuVUYHNcKUFj#2H#y#y>4!0zd-iIQ>+zof~OKo1ERL~GHR1u)05O9VzD zU2L=%OuP0pTl6#iY#CU`ZvRs6vRtjZ04be#cR)$NHt_r(Q+UzV z?G<~XIS&p+?`IoaGLs-50}^`z1zlp-%ZRP5iR01nD)y|}9-xr+>|j2ZX3N#?3gz1G zaSi0)8VbJIbXAc0Q*j;HiZ=%}>`?(|xg?`v!nXk6SZK_r3(Q8 zij+bnO8@dcEla57Qn}@_fK8`tw>a|jv3nZMnr64ob-jNYZr5`4xO3FOZ`$v*X_^Oh zYY*UkyfDSs5*y)~Ij%nT#J@BI*>YkIIp0Sq{V$u#c7x`>_#w?@yFqh$f7fzHhn&UG zDwN~+>J!Es6q4`(J}r+=CYx6uYk4^4S){lNYpv&IurTReH1mYq)CPkYev-I z-hkGs?stwJo#87A}wY zD2+&RRdD586T=BalnZrd-hxp%@1h=N`>L6<7CkKP`T)eEA~bFK1$)@NiS)OC z&>dNOMQs~GwW)2u=$M&6ba#2LXr$7Qf7F ztP(UYJDF3mhp5N_6{rAWl{?rEPcn%#zq#gIbIrx(n$MeSE;QHR7QBl&0|#Oe)Hxg; zB3!C{b17;X$sSz$CYA8aKCt%9i}<3l<33W4M5R0xU-Ci*bn-j6V3n zTaMBFL(_eKr$TNMZfyP)UutXoNKQ2YYMUQEy=(?rfiN{DAsua5rpLAptgtnG<8rlH zj%2o4F5v&?D29Dn-f{FeS6-rZ)xcO+?4H)969~Y?j;x;IxV+EpImHg|;<)q+_PH%h z9{^B$*=5tuxPJ&FYQME*>xXpdip%EXNIw~SD(U^t8b7g_O}n;!gzLL0=oQBux8*z1 zPjjGY*Wpbc+cO*X_|KU&6De!egO0qy8o7o16bhJcMV zoVkV}zK$hZ2r!s7{TZ4M6e1?5PfL^{0HEbTwB+lFr&p;##{R}wsxMS97U!KA<8TQod91^bL!3HJrpR?3jDlsrZX__wh-wn|%a8U480P9TYOo;^TGRXEMXW%+!%<#SX06b$dEIkyRx z`zxd!)HQ4v-_X;-l256hC(sX8lAutrr*cR#_adq*Y62OeV7%sXK{(@Lu-B9tEWe?_ zAqK~a1_m@};cKvc)?Z53^#K&h$DOSK`qr5S$H#Fs=c=Uy@IZY$BkoUjX}06o zxcA2$kITDQt(u*dg8+J!xbRq%4nOH8tNyINlj;w{nPWe#TmJ(-dNKCib@_8u*(2`< z@x^`+DYL{z_=|wgZ8AV@Uk?>`*)M=oQ~Hprwp@UogHz74leozZgvptNf0M_3`+vE~ zkztz}ABCr-*nuT-@y*NB*ucNJBwLM}wuPLwt_;YO`=}20;Jc6kD7?bpBuX*<3L1Y` zzTUL!UajN6xV_sO&Z^be`3)}sKJBZ@6`E=!zM&-fZ z$yp1}dK_d8@@-x@&D*^Pv>Mw*f)oc*-VnvF6pb~H782M6f<#4$8Y~Jb5^Q4#8Z{S#5*iF7L0oTf zT(S80A3kjJ-Q&OB=39#ol*i_)#RBLttv|oILSTzsrp&$VCcD=T?K>*OLWp^=VS#+a zuIro4Cg4hxxqRK2Ccos!HRs{{eo=jE@?za?3wZ_HqQ8Bc3JxJf2)=@5lGHl<-bHN-mIEs-pj1%d^Ik> z;t#jT|KT|OhJOq2=TZQh%mjLa_f7#eEGz9LQF*$Xe+X?Nj-bEQ5@Je6A^{)TM=3%{ zbZ^pJG6k3ugekJtjoKB~v}L)M#KTP0KSGSzaE1DjbPcSncu8oA7MPl!L8b-4WgJCqJ3wX_r|% zE%KMlZ`m|hnwAM%XO-yvffXfYSl3#3=8P1_-=vH!2N zpQ0Uz40%#@YDGW)M6#miW=s3Bt*UU2VYWy65#L@ipfuw_D2xbZbBwlOCVI`_v#60r*NebADbE)Q&Yo)pCXi`JgmHS<8~8FcSqE(Jb+5`oxQ`C zGKizEnKUrvHHTNP&6~~|nVsAPAUM)kPKaDnzp2DNUe?d#w}~;P&651wfGr?m1P;u--(ib(nX<`kbOgR+vf}=P zf9Dso$*E^BQ*ltRMyktrZ)TF2qbw910`iZ7b$KXl1Xez<+}o0~{jK|e8tl$SHhFur zwEkJMWE2@GTiRjCNCv1IDJzxxZH^A(#}o`4C|x(&-tUnw$xz^G18QK&k51RowdRiA zMU+@`hw0}d%wYr>nk$J6oY~yXp_D$XPl1193VhXmJcW$+^GABG<3cSxm-eru@8;ql z9$U#)DZ@n8URwVm#R3Obsazt}y@R-!%*6&c9pJ_Axb_soXdAW?XHDb9bxdn7)52`>jH+|npehc^db!K;*`ZdUH ziT1a0MmzE<0%G)_*%iDbaMTX$B^1G0M?1*Jf9?Umn9C$i^5ZO};{DwhdjEM!CUTC)7e*aYnCW-d9a{_xy6luto{ACuBWW(t>4SHDZ z*&hG^P8tcJxYq-Fo!=LVlLGYe&&z$kX?3Olk@bRu_V0EwLbozEcS+kE2!Z(%$J zBllU`s}%F4ZCvuGs}q z40IUJU6jN@nqDP^%4E7(MD*&1qy1K+Frer&hjI^6E^uH;%G~@>N@fNt*qzPJrT(!2||qdlhACzHC?Vfms&x0CIZx@KwegVAA2L??p#rMAVOf`$%%dt*gyTt zqy1Yr_((BbYI)ec>(YMnEh3mIR zJF+^hIof6PpcqeL%i>B8D|d<#n-QWYT+BJj#k!2GWAn=_m0iR2#vNoHgXJ}2>RC@Y z3|XILkY}O_eK^Y+A?h^pq#k-~OBvC!lzOBFn{<;QN!W@R(!b#s7JYfA3xdzuZ?fSo zW2zK6Xm&if*TJq~ukjm|G0s z-%IZH{+oG|&_57~{ylt1j4f<|5G8RkZ~jj{v3nhmxiPw#{UBvCi=Xu$DgrO}!!D)f z8_>srY_+)3n+cvFXu$3fY2@AMaHPG*(?w(x9(>N2thV-qC&tk0bQn*N#q3Fnwsj6`!+@H^LTP3-zZe4mo&0GkSWRg;qD9|M$EGv8j+s71 zA?>|LP_X5-gDFAE?<}MoyiCcJ;(5Ocu{n7}?OXVzsiS;1n~6=`zA18?cp~a{-#Gs% z_OdtA;ABfj7vZFX?x!hnE6d`0f@Z-nrzZCBtZ@96Lwxpd2a=s|QhIsggqjW}iua0~ znOrYJG$y&y+>=}{@AU7iR|`@#dly7g&biqBjT$*oJ5uB4MnPu6(ONR4Uw+GvZM z6=D2`0;avUc}k^mZ;Vv`Yr7kXONWJx2%d9 z*uVvhLq+E4->953N*evelrvWtl^SGqu+8`>04Rmp(L}w(EC+fH5m$ zr;$k+@|r87SoHoGxg`5`2<#{OW>&;fMMV!$k=gt)YNhqy6nSuDu3^X$??N@#lD4b^ zf$r^~H#ytxlNv@vY*#O_kIInpbCX0Q zYu+ob@m84AOoaFc^VJU+e(Nm9pU%`T4;)x4P_6CoO#(G_=K7HokTT!H z_v>tG`eJgB|A(a|`eERJVAfRX|3x}Ay0RpO6SDsUaA2==%w!$AQZiYh&YMDbUnHM3 zdGv~ZK>>jSn^U^CvQZT+V@yXt|II>95#E4q=DEQ&@8Gzs=7==H8~t zinu;f2+Ogs6e*YV2J#rU|LcmBh;Q*A${L@bh^!y_v{ZRv?Zrx7fLGwpdnSR%zH9f$ z_*_hTlY=PpwcAgt8K3{{c0DV1UpwimMQ#+4Dx?cK*AeM7G%j7yNp5rC)d+!lk4eRA%C-Jvqt)LO9~v551FFk z$tki6+obY|4&&mKd}?VKR#*TDX%N#Maz`5vj~qr_jW`$CxOtq~2uAWs(?WEd_Q_7ORw>29|%&zCB)e-+p?H|Oj(yNHM`+xxWEJq$GHSV%>ei(Ea1Ki z;~sO-W-qIx>4t3YB-zV;9r!ghqjKp=TH#V^q8(SCFZ5R(##_7TTEz`n^2{Tau_kqz zT|Ah&wBtv9)RRDl#UYi$SLJ8}jfm{VBpQOjuy7d5a=&m!fBZCBA>B;gJSq5!kc_GrsR!$4Dyj???j?S1@dc* zk8%o!xq@dbb1eF5@^Eih+dbiX^hqg$!sUm8r7%khjHb;m1`C80DISY<(Zpa<$RO{D=$^oMfD_g47v}?lW5!oIOYg@xB zo=fP@iE?(U@ymA!o1%$DN&K>!Kcqt@g~V>n>eBjwXM6STemtJ=QRBFj4I7<9>kD*$ z)ov>>3MUC`pWq}BXP3u2@mmXPPls1L!CpBuldh-T-Nr^tX=eB6k?MyS0gU@dmXnGJ?S$ZS zLG2#*rav%2{f!^ld<~;5lwmYtE?T%n8pP3arsMA50X#Nk^7?uc3CnxQ5(uK@2bs2) z0p2`yd=(5MS^q)P-IDL)|n3WcjaQ= zjKw}rMg4K9^Bz^FE1uW7`MW)dmr6i#Jg4>G_jq0|&n|C8>#QI2B<_$fN4e3CDx=1P zDZ5osh%|{p1klRBKLLYeyKx~jibF|~<(!WOe_H)|fT-3TqkNSCGo!DT!DyFo0?=g! zYU#^CgXPUBI8-z6zPK?xMLVLp2bB~@41*61x_uW!%U#h$gE41&>Is%mIW~&HIF6P> z8J*f-CPo@L0?KJ%EG5~-@7ds3Y~@CQn8As@x5Q^2`?@V$enMY~MJz+V&EGg^)0Zst zm)a)#w1sQ=(Z>ZIawcW~=$eI_^GUvP;STxwiG|Kv`N>;&;wFC1UARdSCokM|3qM&4 z*Yo3UeqCWpPQEm9uBA3RT;3mjnT>)(f|-%ESNxT5u48w|BL}RdJ!})R_PV!K4HdNA z;=AM)pXZia^eZr}+_ud4**g%$g*;=)GJe4e-kb4>*89)pU0m{A(JJR92T}G7WmUP# zd{>qEa?8r}BC=Tq7ZD{dW&Gloj!nB<(k7>*MfMt3k%n_D?ppoTmG#bVK{MB+tN9-6 z%t@5@xts4{{v}rubAbx>=j;A}_M?EUV80ux#3X z?-bZBIrS?{%3OD3eL2qhBJ*at924c7WYBQBn?FZ+*nuZLp1-a*zO^4YBTdS$TLlAn zQ=JHYLzbRD%F<)}5)njg^2PWpE6X2cWqBi^ziGUnws~sVkq8HTirmaxd?T{PQHAZx z$UxB$yt|(z?nAh{_E7=Bjk3jxSGQn~JNQR)oZsZ^(&$dG{B(+}7lrYk2)ryTI8c5< z*mIZGM{}S*Tp|eL(b(_$Rdz$#uiU07rTw_bNa|S8_+a;zUW8*|0_sxe zLDzx9F+NO9&#U)@P27+Z4skLY$eL zC4NE#G^iO3FO&}xhUKs^;gC^%NN}2&COGvd{0&NcA=~$^4Iog@d52W87x62( z#fc6^j|2_~iUTjN=dUT-hzQAcDZJvCxyU*s9vnE|Ob#oh%N&J=NHNj}$0i-&DkgwGFSa zg5wxB-o4>I#v^`(433Owf7Hf#KN(SaI4pvqHLPtitaC92in^MD4YSTJGMYR0QF5oL z+#YyXk`DTv!8Sz)jHi3U<&Z-CmJ-K!nZhp1j(yn|)o7-e-)=HFr%f-K*#_np`azn0 zC2LEzvO&92Y(yI%#FQ;ouzN1@%hj2dGTPL#rxBR2xfvKN8?pI?9CH)9iZZbVx<&7r z)Z1SJFlLN@=kH}+Mi2T#^&vF1^N*6?a|HJ$%^tG0?1j1ccfO`RU6yLz?lR(Us%9lE zJt*lN9jou?eT)(qn?yY7%VqhGiZaJ#MOYz{OH}_ymB>I{MpUeLrj4McMju~A(%(=& z$H&X(H;sMtu*S;zbLN%x_+|EOrinyN50Px)Dq@kE%i#V)?Y~M=3>Br)%v6I0y{BXE zqw*${<3FNrfFvB711}eg;Y8W+x(xT3eanDH@1%&o^)u`qY`)8*Qe<}^X*=#Rj=gaP zI`SwIrATa}XaY<*y`S|D9$J=&th7rk4p*ckP53E37^gzDhG-&QPw4-^kIy)PBxNyx z8`Oq{?U-+j;_Sx^n~4b&nx7_&AZqGpCu~#cs#WBM5nXjIi$jtG=1EJF7r2)7Dq{nmQ*019W>khC%dlLB9`Z+c}_?0F&9u-LgYdoXGIziR z#V#J&gr$n?>cC;z>AXMBy^XIiXTZOGJfApr9Px{ER#ckr(j8mv9rN07*H-|R=eq=0 zd!#8%EI9a!5qVQ0NM~&PdNQ z)9cRqkZFDhomt?$0R<>(I|I<`W_n#zj^>^5?IrVDM8$84L_~WqudS(DzqVOczj92X z_V|n-=cvpVPkeGPk>+mxZ$W%HHfdS23l6cnZ2BHaTkW+S=wRH<-{d9mqL}=|;#Z}A zCaPxxaYFQW!ME)N-C28m`c}JuRVf~oa+jo}>7MBC%&=f8aj7IatVFP@60em+r#>(6 zj<7e9_Qx+~Z>}o9-_u@jGHbst$EqOswkNt*n&`s;F&XkLN9IpeL0iE||4T|^QmtQD zpVQEjsJ|28YUiCiZTGW1GydzO!fAX$eMqFPP3qNIe^_1~=7qH$57~1?%0bcMof|6u za74{8NBBW!KCx!dyGt!d$I+!jGQ)@%L@-i)Vh~Gkdhk@5#9m6+*#!naB%k~F>li7K zXyqiPKE7_jV0>!uls$fg_jH}uh6%Q&{8iSJX5vH_5DqaWF$RfgEQDd!_ZU!!ZQJ$m3!Ptz{>dfG1H zxw~nl$Ytty=2G<}5o}A<6Grl;BA%jEJ?-zh{cq0*tvD^+6Xh9Wwy2Li^Q*?w=v_0( zMHq_Ww1%|dJxaGWerv`rGs&DCpDDs(c8CANjE0GkfI3YO7FHC`j;LdR5p|#q_Cm-- zq&UtGq(={k<_2^4NQkNEq8=4*h)`4FRKMttWxk8bd~VbfS8%AV!`S^ABHeT`7IYY0 zJd2)VLdvUBbBL?`(&LwupAZ09OPytCanP%Yen6ic4JyymUB*IDq)i`rT_mp)MqVp; zW%~;!{E%&MAIBvIg;;JokztFhIE_{lZY9#ayG6wZ?3|lmpV|BecvF4OV`RLHjF8eA zymjlMEkW>52Xm{Wz10<#7@ydTNE#h{iHdABmz++?My_P0KalB?j+&YUgX=QHgl$XA z?z*Q<9DWN9y>J?^1Me>=&Cg!fj!$R(_Wf@rj7K4tNX6=4TW$@$(azA<<=kv!^DfGU zz8+Q29qM_LdKN`g=g=!{8 zR%VxkYR;k5?;|bwf*~N@`LHnwZ#hOi*fSj7D8zz0 zz1ni2NbUEVQPR7Nu0xgr9%j=s98W7~3vb*=W(#B)AdNkEpS`GpWf4mzyzyszZtiaM z)=TWh`llJTYU53u7`*FZ8&%S*`(z~dkpxY5Zgfk7IyZXEpGo}KJ2y@=-zJ-HQ_PIxd_8UXrnYH(!7QKg;a|o&HF)GXrnYM(tJQYOWPvN2i3DQ zFw*>rdX`p3ny*zbrKzjUpfHgY(C#h>R*|_Yv^X`L{?Eyz?8FGaSpPeUa+yLw zgOiG1VKE>y-E;6ke%_?N{K&LvI^=Ht3bXRrMB$TVWFjnIi~KrbEfxF}=IV}4o4xSK zCDu3jb&71}D(di^$0{9bk*d9Eu}5A;OL4m~7ho`uh=O8fJ9i|TnW^BAF+Q0~;Ee(+ zIAnq|^WA9tiLU@d?bq3|5AgQRmb??>E5C&`t~)|i?My{l{nebn^*Zgt2h3g zGL2EUcBHDc=XD5B3Cwf_M4zaBNQpr~9Uy>mAelg9X-IdYeoS$i+wS6V-n z-?Li(PiV~X&uDBPc>33^m03NuwTfWRZ0W;hHft;*En?J884j_GcD9IZ+m1#6Q@3v% zV)T}_;kI~Dq@|6_h}M_7pZ}JyEaK_>^~b=o`?5M)-lI&~)-=Mpt4Bwi18lzcfS0{h z&Tv#1?=cB#WL>C={=MMP?7#aSTI#!Csk`|VAg~W`+4b?AH>BA+OVaGCJ3FKc+0|HG_?qw`qX zw%XPDme6z9IwW+D?8&~ZHb~iQn$l`JjK49MC{d=)Yb(^U^@)X=M;}+H<>=1gw%QKL zMKlVz2;^d1O}Uzd9QC!;Knk^~?GOPn*$xpS&uWL+VE4Ao(n|L>zcl;~`-?@&b?!3pWMU}pphKhEB>h~%-s(9ZK>5|d-ks2@bE`z`Z-Yoh zHfT-msVb{8aA%n>yG*}*r|Zi-32#L_bLT!5W^eII%icNfXmi`T;)3pbyK@}- zBa@0&xO{|nP3U=%W%i;K*?MkdSz6HwkM4;qo>KHRS+0E3By7s$VaVm>1$!Dgw~Ova zCP{P!N76g)ZObA4a#>b*e6-9RU6Culj_8W%(UMFa%k#qag0}cU+PZ8RqTgWXW;u+J&o1vx>H|`bEir{~Cf2Dn1uU6q zEDRL1z;JioY)|XNq4rLT< zyEOmZC*G4>cb{nW-~GWUf%^$EiX=8-^YYN3qXliD+J3V|SWW%gWk4L^+9ABeiH)aU zQCREIXQ{S+j$TV!&%3sE$Tt<>0Ie%%Gd3U*VdVZM2kz!2fiGKT>;g+sS8T=LZH$4f ze*J+rIX=EDPXq&cj_HQPJ?sMN=d%f^U}Tz+OA{QBoWrF^%@k&SIHQ<}C7)FoYek3b z6r%P^P>XPmvQDm9`m6Z^BXPYaG`q}LWYs;yEL%2LE?VNICHM2L7sV(9>#bX`-*+ze ztkeZhIenAe&zIrH&u8^Pf488`Jg;$la9Ne{j9_gl{3Eu=W&8#mKb&Kd`}sv_D35-^ zw`hO!Nxdi9x!Sr}WSP-TCh7PPyRmG#OB3d!wQFu`bP5&F8g&BGJJ;(lUIs!9NcCM! z4dJp}f@X!wrW5BZT$V?;g>YGZv^+OlHY-{_JzO@2ZJF0oVVplblQ_Rj4?4`=slw|t zf)*S!J_1vaxawJ1LQJxjux@fvMY>T=Jjqf~O2A%onOEu4~BP3s0Z=X2Z|Bf;~Kavgpvax`M}f z>ed|>cLfcezWvvaF7FEV@#KE@C--*+`+0hD!&CKLLD9xO|BWx-XMFiQoOWoiBiUAG zg|P;uQt+->Y`*A3j_OXXdOk0zS{ZxR1&{LPR)ufM@49KuPgb<}jmv-&+&#B0d|g4? zMZs*ouc-?MMWXKH@*HH2PE7Bt3%^y3T#+i(aTZ009rMy>GZI|s)UAQzquX_6> zOW5bgF1)KWKmUr|{dJOld1q<TYW@^lWE?~3 zP!sKcVLxbd&kGV*mg=p~FqaXT8gYUq=xDKFM7-zvz zcKXqb7|}15RaVwN4U?!!ROB%&W1Sq=HY!MYqnYy0%#>qhs`W&IG7*CN z9nk|sI?oL5cZQebPcKM-?_8M9y8P;@dgayO%g?VgO0F{J5Ffe4DYr-!Za5~6FRs|~ ze9vw5QmNM|%!ixZ^6>16`SR!fkpGzN_r*%{eIj|y68>Sx9Wvm&PFUh&-ZH!BW z@vQog?ahrff&DSti*p@7i;Jn<+g+>}3y6rwjVrrb~95s7At z^D@$g+qp96eKHoAc^Z0pSCT0?)C5(qXT2O|D15|XN<;P1bScgwj_ht5(qf}ASjk}Jm|$7C_T@BJ%8pg3E0C2LR>$Jn;h37h+S%W(eu zQ(D+A7JM5I=dMgXjU-J{S=ALYLX&XuU{8N|#h~&L@?E4{gM8;1?|zNu?B|LSCG_GF zyS0Mb;M(Kkje~qi9|C^FR_t7j3~5DmG#)1{xn9U(u>=&3SuBhP$ib*3SHtb8t08Lu zqmW&2XyAPr9oNA7w=3@5=wX_J z!J@XzsG#-1-LBfy666o`Z9bG?tKY;QFG`sEt~iDE<#+7(X`n2Fv7U<4iP$$K{Wjw< z)>JljobO@+Q!(X7;BRFiQ}9(=aXmrN4r4Hb__07}ef%4&=xTXdRwi3|8dfM7c4G?r zK;#g)OU9Y+W{D0z(ngk0%WnP#PJL-E!nLQfWxEvXY}v!lsH1jDXq{3;s0V0V>Z}~%@4ta#jVG9zmdiqfp6j3i%$u{VA}dQ z^?SG*(fd&So&407${!JptBiGT2-51`Q!lZv3U2b-9`OYUw>b0CP_!QjJ@KiVF2yUL_IRl2Q&;eGZ(@3VQ;E2P zR8~2LjTy4ugsk`Q#`V}PjV#iFyUPfTU}g(%d{B~4+zROOo*`9OP@pO~L_^2m8@`HqlEC}{KV6lxHgTG>n*pOL<`#O7j?L50^* zVQ?_v-qJqYees@{Hq5vuDk`f&k32__&K3#A0GTXoRzKOp>gVV>u0JyBt5^iJEHWG8 zRtiey$n}_a;9lIAaCWwM-Bc<1o)-XQi&vTt!1|I2@;Vdb1QX;j0U5v2YH3UrGGRD7 zA?T@9{57`FSeyub=s6U0LUo%d>?T!8s73Ao5#5sfI-@NYGXs%R&y78jKP%0)V2{sT z{~zb1*(#P9MIwCd&aN_EyI7PP-5sbX5i+Z*j0<6H(UzY;@G}!{!W&wenC#J(pOX-7 z3GtkY(1N2WD2)zQSAvaq7sH*mDFiYz7W?Kc_Fb}gv0nXSPQP)KqDui3H}ZIC;70=7 zX1o5n_|@jK6OW(x95btESZS;RI_(x|Z%%xYmF>>!T7y55)(qE|`L8OW+RJ3l^z+PN zW09Nc!YzX`4JN6XM$ni3HQ|;Mq~PyU8C{j{S`qzxz6ZH=Gci6|X@tMZYg^ug%2?6xmjHmX3n6>Im>)GQ8rS{O!$+TAU8n@Z&xbdsNz-Ig-KOE zYi|{%^rCPiMkaf~0iSchUcG9;9v$aZ;b!)A=Pfvpd`Vk3fv;KS7v}@q&NrHo3zJ4O zI(#V^({(a()1Tu+{3B)Bpe5qOt>cqg^eD?(%QI9|aI~g~Rr@$d$W9BXBqr1st3w2< ztsQDzRg#8X7q?)XI-3=5@oCk##H(dX@12 z#(eKY6|}L+n72-9&!uni*);eQRmMs_S9))({{?kd89o0^W;4QLm65J8=aJd+kudQ9 z#d~&2=KIn7R~d()gev1b1m!B@>*{&F`dfs=QZMTed@apIphqY!Naw4JYD(9?L4Ea) zsY<`COQTAvjEneCQ~0DHSgttxV8_U-@50tnpeVxLv54$F@0nD7wL)ipm9hC(0(u*M zr&UHaePXIwkTT7l)KnRvUylIPN&QIRR~dU>lrmFkZk6#_wCSY=!;E!s1;BKiIV@730~i9AoR6%;Tlt(1o(_wKTkq5QuPn!34{ zNtPp%ET^ivQ!Y5&NySr`9F;4uCQB){*Xw1H&8jcui~4XC;Fx5EYC@VbjqK;DN@S+- z60yoMLCu7(kYGWG4py#^6S;89yHvJ3H21(T4H{(U~SmiqxfrrV)=ZGgVv1CyZQ&?sCEBcDs4yIImP^KiYmPFCXrz zMQ+q{FvE|g-SV=aYr4O2I-7J~5x;i10T{8ZJP%JpPi%gG(+0*aiq_QNY><0T_uuKM zd)tz0?Xm23HFL*htd4V`n<^8`4kW}x75jYt6M?=x2v&FrCG`6e`sa-wDj;4bajvzU zw{vxHL830aez-1N7;JMc*5AKHkH?yyfW9iM0$(B^f;Ug5M5VVRrtQEgr#^cf5}?_~ zj8|~CKVi4EGB9+cq)S_32iM`o(opU4aP6I8y`=C$chf1pc4=kir;1SR%0TDiv@M~p zOz6ukFxS&Ok@~daQ0*!TwS0p@)Uj$zuJ|L8D;KrTJ#=|hw7mG9Ho-`&)P+vp(>V!@%h@bcIW^FY~9l;oAAeQ+vdrV5h1IAA*{2W4^oT+b$s~ZT&rMCxVz9pO`!MN~Gte z7LtRF52owmy0rNsqsJ%kI!(uWd;U3s^JW8f3bm}SGH$|v71La_I8<97uALj!=7bxU z>=d$yYD)@p-A%9Yn9%FV4ec0L(T->%Iy45nFshM%C1ugP{4`X%_9qE_?P%6ZC975l zZG>v?EX-Z^00_EsOpf1eN)p9Vx^ZW;d}XW{6-ZsUsc}8SBfs_FI@Z+a67m-6eK53Y z;gQNJ=Ga(JU#$?d&j~%TuuP5hozxsDzq82I5FXan2DO#WfL3UZ{#r)AQe~d zgW4QNP@Bss=z6DngOhLGJah6i8^jJ^{wRcbu{$R8`E)~}Vm(tKs^tfF&+pW3wJY?k z4A&NhYfHjfDZ?zt+ry@WZmIbmDPPmnjt>?|Ac<7qY~@^%?@*6RTNBb|8;3dtAK76o z7i8krvzAT}>6CF;mF{vk|0Ye1>olDkj?-O~OhNVw6ul=Q9V7y6RLhN(W}*ZZ%rh}* zNlS>rXAQuLs5JoY=I=1fFe>o2Bvu@VH7PuXwLHo;LtOOK7x7m>=`e_pc6nj#w>rql`_95 zJ-OkRiauwI>Cw;jgWmEyIw6~f;kJ-{7!uKn)u_5R%w?3+%^(qN_Q`{J+8P?}wS_=b ztaRa#2;@0;CD)svA;8{psP4vCsf}%QUY+|FEAr~@J(M1EULV_(uE@-eCVCPtLTh!= zrgR~;WnK@&R_EAd(i+hQ$22Y*m#S#_+=v~Tlct4gZ!I3bj!>k@dGf<8GRmVg>YeGm zTISE;-9o1*ejg%O^nSSQC-|m*-C|1K;A!GZD8lNRH ze4v_MI@)8KH0fKcH2p}pd4?3wW?6jKwn#$I0&(JG3xJAKulJGx?SWU`pNijgpv zxSt;fo`BN(GFR|+@!PbEK!qkSgTOuR#D_~ zZ}8D7W~9GSrlCYk>-~YEJZ-H*D^vv7n2Y~rO8Y~#bIdM;Ym0+j49lERH1Fz=PC(`r zg)`PIG5eVESq~-qcquE6%%*m#r~tk&V=f&Cn`n}u92Z)WeuSn9GBO*U8`kC|wBkUQ z$us6S8a57V^$ED0R^ke1r6$`bbeJq-BK)+l_EvY(?$ffW;U z`y|g*GRuQWp6lF_mTiJ-W~L~)l^8lVnnuuIE-7{o|R|D$~j!sm}c_``e@ zgo|}aEmZE7Hp-pFD=!1hN`i4Wi@V7vP8IKB@+r)&v~aqYJ_t^wFCT+bYZ8q`=<|ye zLgNK6P)12xsid4u=>h{mr_>U3O5M*lr3-w7m3&KB$yb=4Z(+V9iTU}Xn0JvTT!+YO zt>vZeRxSVInw8GnuB7WpQq4D;1nIMcLiZ)3L)JtKRM(M$d}E}b^%X{qqK#}7m^S#E z&lCT%6vb;ulnVo|a1`9;x9R7dELof8!!{jyaU9#i^ko&sAP0Du8HnL$6(}(aI7bUi zqd?ba0d0-cZCLW>DvAg;f$#(iPE$A6u@QyZ`;x0+BUk-i94q)Po*N)Zw8?mk`AiCM(*WNR@?-MlM|{!u2Q}_}LRPO}TjB{C{zUl^{pTDT4YZ4ppC~`52Zyx* zf8zj5zY0o>>KvCpEhkD$+4^Q8a3EZBVE%Hx#+rY?!oYGx_rLcg!F@J+wDe!v(HIWz z$sce|=3?)d_FDuD)^t|{Uy-T%(9^HuhT_Cx=zb`h+8SW3D|Et;B-nn?WVh^o)}?t#lU$YZLEGzhhK0iX?aC@N3#>i58QF)@_(WtgtMk6Q(nuAgw^l=(#t%q1r z{z7P@Lvb*3`1YVXpw}|CvGpGR!~J~U%y<98%Qy|&qH>Omb&!Y%jJ3!LpC9|>`wEPQ zaVN4xr*<4m&n@H-O#x>`M*u7hjIcIwJBxxH&?b#)nZP?+u4uUt#-5p=nmo@7uJ zvc?Ot+)ZrmVB{z15e;qG$D4TQ%R;19qJEd}GycZ@Nj?HkYTU(h?2NsiOO~VkY6G}s zf(%RDf-Mt-upYWx?fh_(Q#tCwTVj%|_JEw;nC$2*=w=OXmNLVfjMMrT6=^3Mn&PnI z)QXnKCKHZ|-;|O>g$Af2T}c0-JoA%~?-n%~tak-jat1Y59t7=fmQ!iN9A?sv7iGFP zY*TLoNfALvyHX{chVYpXu*)8kU7luFaSopp2^@q3j#y)V%-U!jQv@J1k(|F>XpKx6 zL1=*4ij}~>UdTX{1OD|w20M958N~-7Ad3usF!sw60Fx!o;4?Lugy1L7nS`LRVp?k) z`zhuNx9=VlT8OxqS%k1?xt8Qedq{gd%AsAY&m@Omok0%Y8$%8s$k)4jxSBbYAikgo z;&U=iV?>iaC7SeD%cvS{mQfkt)b$F>z#b&E#K|ulPt&rz(^0v=oSBFSD*Z5y5z@Yk z5Dy}wE8<9KJ&=ccLjyb}4mUruYO7MA3R$~l?Ek$=t5U1%zrm_9E23ouwZ6O}?REEt zLy9ycctNE6xCp|2l`s&{40Dkd`kAKEpr3<5?FjU9Y?OXpha)O3Q(*@@jEbl|`gFys z&Y|C(!79jyO$vPI*iF)aY`H2;`N(iIkG_H+?19o{0m|X_d%8tyz@!j$Lr%4~EVjws zdR3b34zDBHxyI|fy_0ckE4xJ>__Y51qFZ(2qT2pY?Eu%J!XOmEwlT5_*RVjPDl5QY z1ZyQR_%-96wgc5NmdZ1;l}?dhxG({OYDc9UKt z_{{YWTu<{)%S~RRo6KB$%y|%3wtL&k`wke1k$gaZ}5 zL+gunm_2lKimkM!rqjQXj;43|L*`G|{E3)9zwoPXTh)&y{!1q~XX!6?F{9P?8ffNl zoaoeCHXPGsDCE9ttsh+b@Pcxg@k^?V-)>U~72lxP`k69^2UETVO!EqwHeBlxZqvh# z$22#tLV+$>kBMyJZ0JHm9MJmBUb`F(-y%?dKs#Yl+z=eAW(*ce5pIaI4&%zZ|FyBvaHvCgskuI8`9H=Dms-%S3VBkHKZX;dG-0D?81%SV{O zct&u6!D}QH_0(WG4-u{KpmFjG^AXAR)D8R|=21M&2U0berU_Z5OnB9jBL?85pC|PZ#Ny(@3snU z{|-}SWS84_B4@HA;Hv+U$20d0DM8$ zSkUtcDq?ZApw^S-Z=6p>)i6Gk=ng%dbtO(Ph3QUtJRBd#BS+_0hFEQ`ZR~S570RGo z+i2)FRvFLj%s^ECIe%FT#%puDc?mhk--fvtX|{ zKKG1L5+!KX$ClWnO3be^Zlo?Dnv)mF=7CA3X!*R06)o$Y5o-C28kS|jyN_YaSJW75 z+~Hp!NB_%@C23F!v(-j!_lS!vfZ3YDWgHFCzPw=#TpbH^$dtSp<~85h@atp+z6(?Z z(^US2r&-EzPod}qkK_HcJ16*sBmRJPSme)ucF>j&>DOi#z*P;0#uPFhTfj8hv>&yF zbmlVY4B}(65WFPZl1yN&8Jz(*#STt$H~ke_j%wBn%VFB{qGlN8FJ@SdrRHVKXB%KSR+xXJ>>Y1*ypi^^BT~pw*)8 zFQ!uW?dk=D=LEEUCKD9G%p)<|)XHNuZX( z@z3Hju_6a)3X3hD!W=8#<>JVS>NDO`_7rpw9+{pXB?^DtHT+#K}S#z`2 zV+wSI8wSJwF;w`tEP}FaUCBwhG7o-T;|q?))57OP$7dbL+CQ%Rgxs;L4N8-PZ8;pI z;9#QuBi`a3X1=T-`MCNI%h*?~41~O{ zG+s;1!PHhcI6|T2+|#BOqX*}%w&`UYANJkEabe$e!Ne5bwH%uD&FAE?@2chmi%Q}g z-=)Dsy6>W3BEvU5n8@`_qdIr^M4OO$sZVIF)4@fdV<)+#}&LSboCl zf?C#l6=qnqg(RwsX_&yljQI3^Xcg=thY%=!{Uh0S-9NG%{1>0+9Wv{%R8AizWo2&4 z@IPpuV_R3}->JkTAIBPoZR-}CYzdDON0&S1br+TouOkG0d!#hIr#Rtr7ai1dL?c2^ zpSAnO4YwDS4>!CSpYm)PSg^;lM!#K1mxs-0IFm!m(|ddqxB$k@1wXp_P)X`#l3&y4^$ZF zd+-i9Kgp7N!aG`p?7&vI7rCPSJMya)W~o-xLmH`z8hl&(UY#Bd>%I#El^lH#)V0Jnkt`j{|A3 z<|cZ;L22Qys6Zqb$a8xPvnaTL1zV9a@rY)Q32bSf=B zV68k_7hZ`zBsX2y@M64IBuK<={kJ!Yc4UW&6LC!csTrc7CxvyKe2cAO`C)hKiXL}s zyF=tzrICfN&n^d3Kj43&pvec;=Y}{jf7kV^Ca?Jm-MU8r$e84-$n&;b5bi>=w!*ptW zHXLggrAX|^9(^v~W&EAwyCkOlKq--7#R8%)75r~7PpaKnUqtJZo%@T!?2j~~2tvAF zQPuH4hbf^RC+U+aX>hynI=gnvF6xLu2vBsJqi7tmn)r(z*>NA9t@X%)*f^96cN4jBl&(Ot9K-M{E8IJ%&t5g%^H zUPt#=(guG2_yGCZ>K1e`ff`){L>z77DZ;I(`oV)nNIO6@=VW&)M8CTSGKWObvMXvw z)Yb;P1VZK*IueqFKqt|^Od^YF+m)FUBCD0CsR-doI=hPYMs-w@$C;MT`5zKGOD9cf zm{@_;s&GDX0KAVaAQRK1wYTUE6(NtJiAv`C%@-|lb2mS0e)o*|ej_eHsZ{4~*+e!L z*c9SJcuwOR@K!GfrQECv3ZLhPhpmTb^gF7P92s|`! z%DYyv|9jikGCSR^gHZ-`E$KBX`LWqu!NGaV?g!HcPL;&d22Qaoc+%(QxC8d!-f)z413g4SJ1iQmQBJSyRy2Y8kaKS)+zH8wjD z@LU&cwX9+Xd1KwEHlF#uc+a6iDEv+n$a6Ps<4dS^D9p_{p<31q{+GqR+IWeaj6QB` zeT*HUh1h46Ns(1GD-;SnIvSpk z%PTb(qV15gVG}x*OGSxwgaySGznIrgs8^{nKBb_IgvsL59_)z++s+YfRPzrkS+d&r z!*X%Tv%HF=8LYkPt2bS=DMw_{tv2$B#!6%?bR9}tUy?4uopf0gfqi1t~QYK3dxCMNGg9OM{oM*)2- zRC}1Le9Net&8-L`PWXPAlC z#gp9T8rBbo^&??|n`#HS_}fo733rp1kE7ELFQBGeQ6qP0#u_lq?D#I7G4;llQSoo2 zkBoPv(I8DiP!ogU@lk7@SXEMTU3m8hRghn5>?ba>CFA%+p32~A98tf^e#ql>#IghK z)~~0rUvjtJfG`qHV@KrJg=kS@O0L&xhULj%a4(&#s(MbW^p%n%0C%giCFXkt_oN&p zJb2u#^MA#8cKw*+{bWM+uS|FaCuOa>R_n9;I{QrHkC^P{tFc52Ztf`%(l`8r;lU#U z?XuRFYV7HW5kAkG<4vzpr-dLZaXOUQRcTC|Wl`0TTE~u|M?WHa5_7;MBJwZ+b2VZU zpMZd_=Dqh#1SiHC6~${jjjAY|u(W6+Iy2mhp=MKy&8~$o^rmqDqh9KeYKN`Cw1yTZ zqLg8^)ZNNXcs&K#a-ku#rhBE~_#6G_Y`-=o*^>>ZZy0HWd7RQv;+aG4R7J;*`Q>+w zjJa$rL)wW#ZHl{P56{87b4HAN7QKFlWRqU;c>f;=JWn_59X^v~^Y;YO6JOz*?y^bU=sh2->x2F(4xvURAzzvb+~&mb7m*uj@; zYtJ5h_s0zW6`vUy{5Mku|J9Eld{O$EgZ~sy!X2y~SNU=Gw&gB6`eNi{VGWE=EW0IE z`k^_|b7IRs%#*2Zj_4f>=eO`uX`RIGXW+DO5a>gO^oY=k;wFpJgivY_h#zxwBo!s- z8Br;z3Cy5y#4kZR)WVR;#mZRk6t7RE0|`(9zZj*1_dkXXzNylX4E8be)o7xf7heBq z8O{?Rkbw&~9$^GixpNyIK88ET?lXr^KW6TpgJe^Nq>*`hE35g~q1*ePG9a_mhT7uO z_*#k`Cbfs_;QGkBqS?>m>)2%=IfJqCLVahfH{T`E9KuJfAv~MG!=n^~@3OeNn!96$ z<#Dg$> zY$p>l6-75)ENed8Z%%=XJ02vm%0Fifx^-SaR`_G?4YlU5Cp6~q;juhlj`ygg;a6{o z%$mHAo#Pz1^l!dEjl1QhFX3MseFaB}vmLH2Equ}xhfl!+3ZFE^;lJ{X17o%EQw}iU zg&fvO)az#MiczX8)3v{pAx&}ZFIBGnA;jIU!vpBQtwQZSLnZwuBZ>TJA-W* ziSkwY&l2S;_3y@-kD2aT>&4mfeOv~Ug04DyqCT2uPf8KGRHkAi6&yD?c~X!FbeckL zJ+81}y*R9|!uwT3T~WzLwN=W8eYx^Jt+$H53{{4;vM9$hM0#CI?iTT}1w0+f>X32eZlb;7mu?y=@uZq1*8yN|(h$6_q5XN|Hf|YZ6?&b@_kq z0Lp*wy!T`VFuWh$F>uEpTa?l8sC3nur_xgiAZ5{qojQyn87#^2*A5srn3${v+xLaRt{vZ(oQG)tUaIhUj7o?L{3;N&XfiVy56 zln=*y|4w$hiA5O9gODl51W})Y5#=L$!HC^lN4x@3|;93KR%a zxp9Vq1a9IZjKG?XlQ-kSd-6nAQFKD4XXoT+T_q`-2X4QreQ z>xUMsX~6oy2rQy@II$oPicNDF{g-p)l?6v;Scepkrp}r zO^mMlhW8L4WUcw_eEBx7@JacW%zv4rT?m}CI5(ZDVzWDZ*OvL_nq?$3ZvDYCLJC~+ zWQMJ>UOe8aj0FpXg!1F#ly%J!swHN60*@@LtwavON*>+M@!gFQ8bH6wgn8T9FsqFN z-&SD?1ZcJKPLTrYKRwQOiU0IO--Z6u9v=b7+`b(D>B&B~|MVo^cp|`DCt(Cu6AP^A zIte47T$YzDBieFggLEd6i#_MJ1=}X}w(%?njwctp?g z+r7d+lO1<7WYJWb=q`5LKSO%e=IS+oA@xXF7F{sBxxKFnT!}bQ|B^IvEikwbI9;$d z!Qbey-=FDq_nr?Yl7iWVihKB7fRpU3z1 zkYHAFp_G!yHbjY$3(e*)_Dx>wyVCr)SUye{kZlB6P~&lfB#l$~H4pR@Y;(si!^up_ zUbr}!t3Y!7Ntrk#mm}CVCGPM}SxKCm-skzI2-e-S1*$J1e)=YUrG4uQ%X8M{6t2ke zecG%|)R?_>{GkD62$Fg=1B7K%BB;BJlaC9jp;d4h?oSD&!65VFxO$X(+I!RP?VcEH z_i+2-Xb1KP$SM3`0rj*SX}zBsp_<>xrz-?k_};C%n|8R>4N4YjE?20@H(T}t$!k}6 zaejE#OngET<+eJiPk<43lUP+pu=0p}{;m3~d0sJk|1^sBVg>t?CK#Eby+0(MxGf}6 zdY>e2whGg3g?mr$PZSJQo9}{=nm#L;?;5Fz5r}62- zYWk{VAZ}zJ+%1o(Cgh|)kUxq(iRIKgE(J0aFsV0x1maxz{v6|JR`5xA{R8SqK`F-Z zB*YR6r&DI{O?FUX&-DI6Wlh*0@D#2PPDrGswrRc3j=+-;W4#eFnc#7Tu*DZMKXPCV zNkBIUpgQt+XY>xR%E_&PzZJMd=U0cz%(5b;_g+5&YB{fJDKhEm$wx=%>iPL1$qhnR z!ND2pE;mcxF*f^`Mze>=PF_kVBg`dB-cH9-R*E8b4r!L#H|{`&;)U*-Kj`Nu-7yl^5<$_j)tsd2-gBD(D0DVCfn zkmTO>^#@lVkLG`~f*;{JN7c$RLE>y)RGjM$enaIN4E!aN$>$DN@cQZCfx(-57xCmj z&Fx`d=Aqc_4&GzteC55~**rzcJzLWRTG5_{?4l$3tRik~lQOJ?5+w7Uwx<~`7EMpZ z;Wve?#EL_`e}~2t%nQgU1@KWLk4Ay*gJkP{g$&77I#?fR<@qcKvrV8c-_vaZ-7%@2 z+&DLKS+-g*m}$Ux!SmXi3GO&;jsPYo*O)c&pw{Ew2Y6DkJEy9Hi{#$XUMN+rHmigS z|87hz{vDI{@IB#cCFXuHn}KTt=zFf-E2O{~y}wvGQ>LmoqxW}89ddh#>bI!&C99kb zvHIVI0wDAt7o&VA^GWk2+WgjP}hg-}O`@wf{K>0ps<-J9Ie2Z@JT@`#cL%$KSp1t2U zWwFk2+m~gyo}aJffvEVZ(f1>-^1cMY416Z@te3Px7}k7~jrOYmCKRx>4DXDAU==)}QXE!b_U%A+K zW3boZV@;d3*xf8HX`>le&gf0VzcKp0M`{R;zE|+Q_r5Vj$|R|FOi~-AdT${K{@W}D zpiuz#NpA6YlO2aTIT3v$+Swk@Z8tn(=EPVR(sBkmZGQGOQ>&_txe#Wwzoy;DCIUom zer8AxX&3_^00JE^=jg;gaH!h2gY6uzr^@xR6qCwrf*jK!GadJ?5 zMLr(8s}cF+)~}C@DQ};-QVnT*Qgm*7g1VokA1fccp`Qq@sVzutz-aZm%&BTtzhtqm zgzB#`X{wH6j~`S0zRe>OR9f@a6{>ztl@iv~B^Pd#=Mq|@yCYJb8{$W%kAJ&NA7t*6 zeucs0P)L@%`G(8fM#xcDn__xb;4B7ctb^`w%GIt5dG&6*B(;+>R`WzgJl`bgWkSw2F z7?ScIQ=GJqEe_cdla{NxR5-ms!mIUHpp4XpZYnrgfhQGy%7n!fsbNTN3Putos$XGk zwq9n%@^cn-+&|5V-{-dC_hr_HX4(Al^!ms6u|nouJx2y9+lrd!;B5l9bHo?@Q#ef~ zoXw+fdS|D?d5O1~Ob22S3$ZI?_$Bh5XaJZi!M`I=%*=7r-dg*xwYJx`dizSNCa5W4 zf(2r%=2eZxUWuml#Gw_H0w&1(zH6T|1E{_C{(gV`^7)WCXP>>-eyzRs+H0@J;@DNz zNaa{6Hdy7DmOUJ|`p=Ad_8!F|5~JBHbhS$kE!qE8>uZ6WC#?J4%6V-(Gn^mtjv+7| z3cP^UXQ($@DP=!lZE!^Q<4SQ&)EOj%kTK!>9ICi7FtBz_@E9JugguzW)SVdY=)ywT z9>6fev&CAvcsUtOi!S%J8VQbgb;+&{I#PiG#uY?-Xs}*grEfff-g%|yowF~ZqOC2^ zZgapvZwufB_3A1J(lm0gMZ35qxp~(b`)(##vPPc%CW3;sk>B6N&zeZfCVnE{Zs-5& z0(lDbht#1!yCT-eO7LH)Rii_cPh4*SA$DW|hjtQS3TrSqBO2&7Z$5P>^^ce0{ioP> zM!ww$#Flsy|4WfrRWdSTZNL`E>;OBCuUTMiIz3`doWib+|4M8;*ATBSEM=0RN2Czy z!lpJiVgU&mSL4z8;u<>nE7M|uB{=VSb#HHI@M z_g06^zH5I!T@vT#rm0-M80iXKcSSJc5f$;49`4Cl5BjhL)7K1$16r(5df&m{;8xOk zU3Hy)?mhV6?BbQ@LY}ouL|x^}9Dy5szcx~HB-N{=En*;rJvUMzWY|L}>I2t*HmAQb z?>G^yGqJz^x1K( zMvpCh*ov4tREV~}LaknzT>^4%WHqK{c!;!d(pHd$@m6Rj)a(e|!(xtv)LoZG)G(K* z*gAuU?fmXqC-*A3aZVk6Her0zahKlrJ}nbezl4 zBx8acC-9+Kqhf?uvMbgehdPEZjm%z*AGFYi?#B1|FL1K&In~=*{d-}<81deZ$cPV1 zAt^#GXjbS=J6^Uq^9eU45vh32kM}!scSc(86}Y&9JNm@1V)E*bo;#u*D3A6Yq_zK& zct2x)Np8G0-tP$Y*{V8A7dtW;@Kno>QFPMldR~QJ)ANl$cCza@hc}B6N|q|B?3Sf) zoxVur^*m+`444%bNQH+p88|9W)vPK;r_rdhP7kYMdAP~zK6=V67O}3t_>5=?Q2F7I zs>$8P6^*5Chvia7Ch{k#u3CTbU(z(H^MA`H3g%c3ql2CP{5w9wU5&9QSut>{9g+zL zW{t~0CmQIfl3}g#U5~bXgSA>eYcp$FN!#4Wg?$#1eFHKfe9PopgU$B_t*F+gK`XGq z8}<@&p-t4Is%vD?dFp&cTZBN=>aVmz53Vo5!Ildjk5=UZS3lioFMbLWa@cThP1N}M zrEUuRf&wJYH$8-6=+{VYR6Cc})%d<|W@;gm7^($xKdRdyVDXzs&gBYjRl4$P$wtM- z$H$GEoVGs&-erKzcwd5sKEpLHBgwhZ$n;pD|8(Cf>4KwH&yy~AJv|m|8QGFuFcpb) zk9qtv+0uKgSb4#w+whBPO;pVzpyj3e-)!3xz%Yl?P~%_%<9kooNlA*y`RH6<1#o>s zw0`oy*6P1$V_>bm*ZF`=ByuW{O}R5vXB0s;<=3}?jmtIfP+jRyg!>Gf(BsXWssEXS z2ncXCteGV-gQR@@nRHSTSLCIYxlN0r-;*NYnxxrCziqr*2t}YExI;Xn0!_Bw;P$d- zc*Be{c-*;RmRK0&Hoib-!zZg{Cf0%c>BW@7g0CR1+vVU$H#r1QM`)msC^vb6f_1^;j>dC+ z`tQMv3z&$hnDL#E!VFn*wfYa$wONsS>+w3@9`b{sV!eF}d4L@3JOiyxt|Vj|Dt-7& zQSrn?E{QfDCrDq1Q9xfjHTTJ8&KY&S2h1F27&(j`4U^~kA(^&JcJaJgeGN`yCk>;! zwL;q5RgwCBG2ea5%~x%dOI8w4V^!kh=^Ak)+zT`PCmzkFn4AOLi})|o-S#1DnQuiJ z%m{avs5TKciJqZ#yhCUZK^_|C_->Vvx;`~hbvWYIzrKl4$~M=JU)h)x`BtTY{g=83 z6=Q2G-*WAVFF$Sp=hTZWQ3Dbo>6S0n#B#x?q8h9 zpRIw#+I~r^(bFmC!P3~VZG0;$wzP!_tvsT6U>YQz)NcE(mN%`?jNIo#yQ~rC(cjSp z5IS06C4`foU{1O2wlHZD&?$o`Hwm2VVC&k?CG&qARIZ9wFR1Tt`hw4g2VEgCgS9$N zWQC|ahE#JiMb*xNb8Mf*vILvF`u@g!Ak|=%PnWgM&)Gj}MLQA()gH_Zq%_lm0$HdC0EGqWBJ&$<0P`;z_lX&Q%&Y zPVK%gFnU@%uAhu9rktzB=5GERNvKWz7MwVzS)Uuny=+`RCF~_!>bNDg?P@+pDvuCC zqw>hG)fy;-)CHdw?*vwVUeD6g1}ywHB>xRsl#nwjab!P|lYg#!h7L<-PnECl4~(|0PQUAJv6m;NDPF_IL*66VOHhs${{2GOxp}+h9TEy4Mvsbn zjjp<2(02U=1GW_x3|VTD%i#S238K%J)sJn&ue5U`p}vxaSC58irj8Z$R#UIfXV&PV zMiwzenr0HL(>t(Qd|KEEkXUhfV2H|{M*7f{blM1LjTPjr{pxH!<9i;3kCgd=m~K!k#5-hx=o(A>R}-XC>bH2n3~#Y=x?)G=@P>j%S* z5(YWyC?5X$0j<8DSH>wXfR~)YXnhjAc@L;2d=*AFH@NU(i$7yLbG-5+`j3ToaN$Yf zgu#2n-ZO3)uN+6#JrkJ0g-9W?HE+L4-i>N-kE7V8pl@aSB;u_#TJsUs+4i`_d>gm- z8jo6_fHBTTotyzXG;iPBm(FPxcA989YY1XiKW@v{nmx8W+*giA35QglWCZnRg=td+ zvs3nsvYIh}k#9LO>3fsmsfJ?8-n*b#mL~kCQ@>PkK1DK(g+!Q#o2{*@Zm=ml^9i*@)m9IZmG$G^x{@uDO<&o6 zIQgi(zyI%{xIMQ=#4qm?{z+J3*_a}Tdh+Ezj{dPwK6{-yD!Vw9#lGW1%wQtFaXNRm zde~kJPb}^>(T;X+yL4RpCO(Mg32I!LIkz`)tA2C-jYPP9wlby$Zt z@3Ldk(U5h`{{E3YvwOAXvHfpLyRZiy2!LAok{mPK)c) z091@rMZ=Ce4Tu6`4O#p9*BU?uM_!pdk~^5J)B}GPKB_nxQqsjPJk>v|50GVR7%W&!AM|W*lzV-A6o+X8-oz3qw)acP3zr{{pL`KoX5{=u)|%+ ze#0r(sULw&0PLWz@ChMulJvcAD&`w4sGf>tIFFUqI-qo8w#F^W1dVnN*hAg87{MLR zJ(C;lF-0}iwIwVYL5f=!no`0gb>KuR+KKIgUtW)Pdx@;5*3wfZl;A`>6kKGA zBD8KbK67Y=4fxt55yCvl1tvJd|j!mdsWuF=zgFo zAmP-PZ7Corkx)-QXzp&iUJm7D`vaHD0mUb|YjsWK#bv$lc!3O@93)Jggnx>_KYdIi z>kVYBR)@4&-KRJoIZLEOI7DDq`a%e5v=IbMfkD&eYDp{p!vB*oktMdwl$T0cP{wJx z7T>EEWyw>$Dl#fR95mBfrf}bIG+j>R^%P1MM9^@DU^uXOFu5BjI zf1$df4tCxMe2_3{39O7N-7k@15&U~Ar&fQiHi7{fpIoxfR%FDNw z1IOoiN|3u&-@Z}tHAm(07M4U&w93>>z=&uy$gxlCkKK9V5h^99wtw+rq}6FDw$qSe z7e#!57h1j;gw>G8Du^)3`CTX2~+bA#nIwB1Fy2!jjtewAkwDv)a2m~55>O_T*wxI? zTFohwc?!atLhVBBzeOxLohVr9p*Ub0--&qcs=%vUZZw%!QYr*XXuw4?^UO{b)cu=I zUc)|abh6iPc5)xi0F6%0k=Bn%>sP0ztW6p1>0IX13#S1IDyYAmxMU zY`ap~4j9=KQi6Hlq#`5pV6w8oK}58BVtL=zR?V~G{vEsPofi1ZKzP<-E@;KOf_lo)RwDNH<-@mPGvhKolPxHwd&qWXVY&p z$KeBAjf3i-#0EsO;Dk{B-5O5IR}>Ma7h>~ypNpo*#QuR&2CW%RLwYy`>2U?A*pylR zFP*E9&V3_0h0&{1KyEaeLuu9OD#>7j-e{uQ?n$#LvfEIzi`xLMeUp}t9fJc! zzOYQxebNl`419rV2*(bmezDnNxpOb_-7Y!rpOiCqB4?hFv%yiaYYoSYsKW~S)pK|~ zR^~Xv;Dj8F|4d|=z8Du@$=2DNbg!KVb{QJDCUnzdv{S^t!fuyz#hQPOt1=0l;_a%9 zHShdYgLU1n)cIH`64uqBUj(ZnEFGNAvr0l0I3d^xHv*IPU9|Svppq7Z0!!xM_191i zk(i4I_&Zo7{8Fv{BJ4oS+eJzr!oQPyxDY_<!c3^&RM6mF9Ezb zFp9?ydvfEUn>uh?-uJ6txwo~K@daN%s&&Hot_$7i?Xv_HbXe5sI#oonH{|>(C044{ z$KFD$RPn6A@ICc4C00^EV1sE_q!M#z<*N&ZO(b$0fsM|h0pYZAk>&MdS5)A;Jn-Kw z&105Ai>2vY-yGoiZil&>%B$4^9_gbYJg=u>C<-ox@c7m$qqem&*N_sne}T@-Z5LS~ z!ol+RhSjwcJ47BC_qWhw^$k2@kZU_2eOt_z;hR&mJM@XVU*j85yi7Q?x>)nE1#7A< zyQ)i^25j}_#`{lRpi(znGr8KYQJ@4Qq^`@@gQHT{DqeWLD_!q>Q|jf@SBz@wRO>na z8MVp;p^4GcT72VY%#%u#U>PKJ9nKiv6~3qVCeqDZ_8wfE$U7&FF)>jKuQNY#2fQNV z0HvOhamU}y^Xo3hdv~$OTijc(uxhyFT7w59mCzDD#K{!pkzNPNm0jZ%=-*2X0%M4L z@xwD(j#?490N@({h*tAyXVTyHnAS%{OEU&3tKD3$hIp z4MFLD@ca(XP(y}0*51JQLZ(7Dp_JrxMw&5ze_ht{G;?&}qZJk|Kh|>i49>=PWLzHF z)xX$3&o}rq3;E3{NG(iK4B!n`b#|hv@4O-HB;-|5B15I&SM&Jdsi5Zi9uZJ)eFD^_ z3KUQ((@+R}Ken!X`M5i@Nyx&sT`h-`XV5C=y}ZsG zox`kFW5z}*JXCcFRoyOSL;-wi=YEzd^P6-TZF#;?l@yyJ#oqlyv71xHn$pFRx8e_P z`FOH;rA#o!h0Bk-w^kfm34QSR4zj_^1%CaI$^Nhp5mu1eiZ6{N+GNc!s#Lz*(k9glAB zXFx=8%-#AFNGHO@dq^{MxgG|R(nd30?~~W6^w*%OXAUY;!sYny(0WRgkI}%HqCgct z>f&N>WgXI5N~m)wu8Dn4UJ~;-tR9RfT$1aA&|B{6(BZpRYOZ@F(JAkS_LWiSYG0S^ z(n`5(nyQl9CWM_e2s3g{i9^Ccn9gIoZ4k2Dlj>Dyyeav>S!iRjWef4EzJ!Vsdv zZ632Wv(pGiBjK)1MFTt1W$neiM^R+zI_%J1*3h(i#~FOnorA{VenejcwHQ^Okz|u& zyjuc8caL`yQ|d^%qQFCFMKqb3&f{eG%g%XZa{h2S|79wFeoACLe={iLZu{vtjTD8%UZl?h?zYQ$Pig$E6bxgF zat)w|&ZUo`8ZI2GB>uw)hA!&ctBOQu;rgfX$dS?YuBbVrT+VCl&O%`kc5~yOOvVp8 zl`a$J%eeYt!ObyM*V)bL0A5 z5}cr?^?VilnS^MK$4CqR==@vJTuSGu4L@-HZ6xR&kK-g;;!Css5tIL^*2=Pzr=Qk| znp#2H%W#o#pDb>E(NV;=#Ajg8D^RU8jeY$yP`(}q%rTg9HdRmtSGuB^DDHF{_k@1= z2>Q%u1Li7?K!Jm!%3}f}Z7}R^)j^8T4#|m?)4zB@a+-|4Ws8O$Ify;cjK=(hCvL=g zqfcA<)a#+6GxqD;#<%`KGHwg~j4TyK3zEMPW@g}NK5Wr;&W?jw<#BggL_w^~jkUb= z85KVK=B|QB%}})FSU9iLs6(q6ip^gTZvQ!L;8H%){umFD2Y)S1GOIA_cu4AK-=aQ0 zIq^BvWjEUJExxnik9%_??H%$Rwl?zMcFDh4dYJY!JOpxqf1HQ#t0X3fX-q@eZB$)7 zpfv2}Qf@R-!xh)4Rx_rQ#GUG(j4y0=@gxQMvK2+nfIAu#4W=@XE@0nc?Ve}Eo-$PQ zKb~X5|C*!8%mEVIfXt~FqUtXy)uy|DCT|gWn;$t{(juZxx-fFmm*_P)NiKaDA( zkwE_%u`Om;#bODbn3jGOb8t>0K3$uawNcZB>gqqk63zb4hQYCVCyBRs3{ZAv|yzU8aFajhVlo!j$O*Fs_u zqwO`i#`%S=9WAi$yxhO^a(^k7CT7=8mMtYch*agHDzj_V`rXte6%kK3FXBv0M+Y(w z3lq9mnHP34VTQh{Qsk6N%Gfq>8=uG!!jd4g8wN>8xX0qdc8hZ3z5<0}O&`~*hcAN_5tXJ;3UZw*nfcRCAZ-Ja>u=wr%WH>8v0~=p7xRe*R z-f&iJ&*r}rP(a_dQhcF9oJzmf4V-xbP_`IwLj8HQ69=| zOU#Uh^G{jN6J zBi?B3eF^SWE05p2>&DbfNU=!!M*!0Q<2t45gG-_^bjlY95X3z=S?B1-q7lcYcAs2J z5DK^yq?7P*BdXdvRkek|dnI1FE!ZhPXsoaeB~F6A%j6sFv#gT#xr|Fl6MyI3gTXMr`}uo~zr+0L{JqQHFn=HM=O9lme>3?znLl^{X(lw?ST3=9 zoH94j8IO1ly^##p;L?8MBGfgb!iGgRIY}(*^PdKrwZT=^*W@gVW|P$DL0R>9cH^O_ z*PWOajVHKa?2ZQI6YE%%{$+b`7;gV->yXTK#U7Y(Ar&E_3zmTdCCSV7zn$B=xMinI z@0Edf)+%-Xs5d_}aJ?uA)Gc)Szq-)lzh+^f|B8hb{)-HH_7bS#^Dw^?)~4V$?l$#f ztL2*deFk1QJ&#gtD@v3^>ic@V&#}(g`iGo}*^D+1jzk_o6ReVk8EA*tit=d16SPFb zK`mW8d=hD;+pWU_fx2nM!sd-Gqnj`q$?7)L4rZd(^{pLV$r^G&D@1@*)fREYkRrcMBz-2DwxV6I5P>{keokC#d5etf>!{d4~< z%qiVJeG1SKRAJSas@;R`i$#J{|5^&@D}0~Q{eLs4efLc6{!b040WKEv8?qF{Q-BE5 zisBC{QRUtN_okn7kQLN{3-s#c-Xrc!n@Pbzkh0P1O^mRR)nZxoKP;9^wuAF&d`^&f`oPc5x4aJOGTX$;(kSS~Uwk@_RD z4Am;pN9M^)9;wp5yl~Ru7&I2g_D?L18qFB;*F(>NabKW}n#iN9Sfd7GdHgg5)kO}q zJO(k`1c|qQIwFrpCxd+je?$uGf26@03*?I_uuqZW-+)D?2;7N-;(41Fb0oI z0ego57N-JgN#rPygXbwqG44Gz>OHm0Tj1Wbn=?aFnZ7B)5#sez$iy}O1DSXX&h*pB z#E|}rt0$9*?Mn4a?Wx;)z3iWAPxYksROiH=>X_J537)>4I4TC27!+a#nW&+xNhSu9 zf$hmahyI&iGNi{K5fQEknjsITCWz=0vFC!7=APU439>TYuFm${;3>NDGERoj)kjE!`$S8fx#zA(!Q94YRBHvE zA}W391vLfrAD;@e#RM8yR%hdl^oOhD(3s+_o>WR! zMTxV}exrybaWW6!kR`!Yp|UZR$b&-=b1|509$liQI$@J&X`>ua7pep5oaO%0m;3XU z`<=@J7vS18;Rsb8Ofq?i&vFTvOeRk0zzigrIH6;Ze+gH|3;auDbo>|p&^1T<8yPLJ z?S$RxLy23gHJ$Q8>szpzM_ay1KNV(6=DV)CI#!v_ zL?7U9Y$d#0nk3C=GgkQ#HP`RJo~&+5y4!vW5>mA}*=th(pXa*(^X4+YZrSNGI zz^>NG0Dq7ISZ@L}_KxW(fOkv=_}r%gyk!c&n!qcY! z9DyxSU4E9Slr9?^#@A8+U*UTi;HS6n&!Nd({)GWh;?s?q%+whvU{St(%J@xLDR)nS zc8v+GP@oyx!`{!Cj1-tLTJ9Zkw+q{(yvUf==yT+bUz-%vyu#haJfj@?Uv!ew^zFRh z@UW--DLI}kcz6px?lwX)BIDW40WdV0VRUBag@3dNMCjt?E?O}GbaJHS{$OHB6FGEros4Y= z6%jfA47dM^2dh>;=I1cc;9OaU1noQw?T|nk-)#OFeBh&eIdSqAhx$^85e;9CE6X&q zj8lE7Xt2wd!;`;w_+n{rHaO%<@8mCqe6jH*L%zJGOe0Ka6@GU^MMI{fA5{inc}B~E zDm_cmUp*!*&ZE~0?v?Hb>~xeXm354<>hGo#QVMAM$S_?yniw~vrX3`MnL@wc71T&UIOwe(!a%=3ElaH&ekSDzvT$a>)Z zJ>+l5jeL86-`LZG{J%ODDE#2($)HrX_Bz9!8Y$YRtdm6`B}=0&{IINz)Y8Cx?EkVf z#u!btG(^g&mc~0gq?g8Dc`=p-F1EtpbnnMk#!hmiR>oGIS@7n+Pq%6yiYQZw_35oIpCwa+qRBH|Gn<%0W#6w#LswXg#VqblxA z81ekpU52Q|-dFl<5u5r8OTR6iul@P5DaN+QbXA2<(vL2Yk?P5`5?{xVw<1IK)WX^- ziNd3tOxdouMM|YSNecW|zV_bwVcGueJ>1I(!Kv#}+ou^}l5m1fOlW$RX1VZ1?;H+R zA`!Iv&kue8>y@uu6S%5$uK`~CF_ETfTtyPrSBzXi&(bqo*3|8TIMfl#B(7;(>xV_) z3o-P>T2B`l5@osUt=9jgPJ+!Iz^zZpJgT-2vg=~eOnga^WvaYG_FjoInIA3|?rkjQ zxQLf;UW{W~D5(Blj}YiX`dBlzewTDIHh)HVnbo~blkhn*r=bsX{U_k*HMo7&H3ec1 zda@)1Kqivh1E*2Ok9W{~+lJGk;`a@9Wc21;Sz(+UZoLv?GCa0qg;!Z2!ue5YTOMYp zw9w|2VF)j?5f_m*V24AH?byN@5TWogd+=_Ljkpp`RR64s;}bXuQ8{P+=-xfLZC}pL z@UpC^_k_d=REd|S;9)C?&xfzf5`p@%Oft4~i(nQSg_Y@*jzo@)xM1OB4!#K8vgPav z*JcnaCV2O))+X-va{AVWuXKuhLGDbP(M)ks?1{R|;u~$zINE=CZM*!==!~*GO}6OH zaAr7b?HW>SVXG)ja&8 z1UbH{d3<&KA(=)IZWom1aeL%Hv(;PRKc)1+52z!6a%UiK{jidBzgN2IVpqT>I*X~0 zrWM9zW1a3?3uU-zkLB6Ey&om#zF}NQpbK}D*K?X*UoBDhB7qk;cObBGw~D*Z;9V#4 zB+>xQ`#NjorUT$xS8Umtv3nnbN=jfywo>9DVywbGor(@}AqDIQBlRMAB<@SUfx58* zC-dZPbqKi1=j?rU!kd{fonj9x5M=hx0BM3x>k0!iqF2m7-S7%exKeq!+(nII4Rl+Q zXgcWy3~u(vmRfUTPo8u-+Zmj+$gPv>mW$*Xb1!8`rq}5?5LFPdt;^kp|87Cf(iW-5 ze@dzi0nhM~K%t+YMW_XA7MmKlaiI;Fa&ws2n9hgC;w3ZP+ZKqeBROV&L`XfEQ@V@%D+-jVUe(DUP$`ZL$<{rYI)l*gR@ld$ZZ zd{ghwSQr2Ls4cqWmewwRe(>p9mZ~k_rh8pz#-Zybe9S19=HqA*OzEqp?xym3mJOmc zX#~yk7s>>62n=h05G+aihAdXKy(^I`I-!|~EX5W?GS@|x*+S3CrUYgYnPnmu7tw?vkVEjKpL-163P^_zm|Ur3R42!^Ex@i1zu1=G=|Jz zD*J@3tw-#P*&nlY=MAtI-UG8ZKNCUDbV}cEr3=ji92oB-H*w^W-aQ>cOXnW66G};U z$dNhlf_u|KKG*3FR@o&av-0q8w0J4uWgokg|GJm(UjeTiA<=#Cy5Ine{aKb{thHE3 zavhr_Y^gR%oFo6)VnZk-SZ$Up)e3d3ncvzK$dNmD?(MU2OYe0qnYi3(>|y^%QUCv2 zHRT_#=2bO~QcdBc%C`}=2iYn(@$W0&GO6;GffpG0&`m?4wj67l&mv)6&=<8~jn5Ny z%Ugi4D@LU1iu^ebE+6N^~hph;8pDS0U$O_z>ZWK1wjAqTG zh6aj4H|g~Fb?GrxijD~`zAUky2oDikk{P`HFm&j*f{;Rxe$E3fzaVA(5EEJPjm9lk zo&IHxnBZWK7v)O{f`mbv#lI9{7<;m`(M9=-Dfxk=>3o^H50XUiRo7#6`e};!X72nT z@CQ-v2LvKGl)zD&E?V0tyNr9^ZSfuvq8)60*WUQ(xc7LAw_kSsVDoWMyiqz;se@np z`&+%qfSpUlaqmdds}pcYR8v~I1@(i?BV?XKW?5UPfPdF?02dm#Gv;lbG}8}3m1U;E zooXB$)#CV!J{_oI_ZUXp!1Z-9Fl_IMx?l)h;mTuRM6`fsE~EPOYdM;tj=~|2OeX61 zNW<9+Dkp*i!tpT9ZF}9V*VrMQ_>un)!2#j(^Rzps-J|)Z-Jg5swANhzv@ntjLX%-y z-?~pI=c;KBaK|?7ySaNKHG_#P@s0)O05>w+qQY>y+cE%|`*Q9p?$+b%9%2rUP8Lrk z!^17Yo8kL-9cY8kg=|nYt>7&plKo%D+EBOn*Rq!$(`p8cJK^A+GuBxA7Y-w6@}H;_ zmhi%>IKmfWtE}e+a|-!1=>Hr?5tN=%-}+*!a?VY-ClXX<(KpE-+S2@8gaQ|CWf>Y36ERh4SS>x2H!M@98&e=wfCexEdw zZBXhJ~ zo!TIz(a$aeWk)8dUr(2zJb+DwVi~hHzHWT;l$(03X%lj(F7&J%53SHCoVK(c6Q(g_ z%B$S130~E~`%NBF2a3AD9ct5hqEN{EvkUnYylX@}Pu}IR_%D|RUBZ4IC=)jVkiyaR zU5eh`S&UzeS>juYqcAP5*1vbPkbU;pK&}z!)6w`+!rp_TL}sCPNE`+95>m#Xzr_9g zL4xHzWXEqwNUB~FtsDwFGvxD?fe&IK*>zCpz~drnK!HJR6fzpT`)!t{IO(QE?pC=# zfYGA{c8n88mfXN1Cyw}dAIB1J?$Hl<)h^Q)`6AhtyEA$+XC}V6$m7dV&z{6L7J2?= zJi8NLUbN-5T$MgOQM*Wg)_9(l_~Ih{DVIujB`#j%shX~ya}x6weZS75o}G!$EZQ^k z1ofPmIAzfdZ=Ix`;p-Na{;0s>{z=z(Uy&`0we;6*{stMtP;aL2M^~xKQDfv3y z(N?dHUU3UH4X3)dUQ961FP0y>D>J%x{Q2-n(xiX`^M~oBnN2h?npx&WnTMg%nhEYW z*3v7JA)Xx^NYCAy?qboRN<)?FyF^za);##D6n16%KPw{9vp_HZY2u1zF!qF~l&sz% zFruFDNfq{y%LBuSg?!|Et2CI_sE@(hk6Zj_1aHr?_)m`Jlsf$&w6_wRG>N#&k|j)x4M z*R%~U=?Zp=w-1{ffAgPx5>ID;d=#&Cf!WnnSSh^wb6giTSn6ug$eXVp<}H^8qy%TP zVv!pd0imcu6W_K2$6cpT{n%5~U!vUCN&9Bqz$V$GmRV!2uOW?#>*evyRLHesyEr;pa z&O+{P5DzH=cLjp=vmsN-T(1Y0wr1)EQfaUu5?r~`Cnd~Jr>IXZbV3aelARB*B2(o) z+GMj#0ra_#0g}unpuOakTR#&Jf*(0nlysFY!)wC<=D#|O#R@{3_B(MWjmrM$4rzwS z@r2cDYZpai!{a9+BCKkH07MF^bn2Zb*lK%2Z{AG}<*#kPNygpbN>{XxUvrWJ=LI_r zcYB`+cAksG-WE6w3!o7u5gIr%cvr0@06XhCIr!np8}ZWxgI>vq4V@ii8$(^%sPl`| zX*}6fcM7RD(!LxM~kjsIV<%ekSCA;&o05HK5u_iyr(1a|kPrLR)m1WA(xt zn~04(G>bvN-LPC44EY|bu;8{4uDMpf=|7XnXMfE*xJClr&6L^R?A}_qeEl-Mra!2( zBYFvG^LB}fzny)v?8*$pXs6;OapcwVJ*Vy)d997;D{_)WYL$ueiqMDF#!G#-f@Wro zAN-6OZ{R%z*ke}q8XrRaV-;1#hg$s#YEt$k^Aj1WM9D6E#St?|Vmj+QbhY*Q7x-?U zfc-r{d>m}Z1Ums&T7X4ls+upWR}cN+T7(_yIBamV5`RzP7B+nU5l|x>*7;vV_R9Gc zk$)>>?`RjdE$mkwY|fNGxb0yTHfol{jS!|S>UEa3i_1QDo5b%-4?GwqF@JqB@G>k; zWvfv;`wjgsBo}4Q+r^40>pK;fNh1f#EA>-%jl9|x_kYbNc1kVb};nTn7v-F zp8O$C^{0p-vIb5`k33c0p-RLPFbG=xdk;t8@LEo^#<>MI%gRt^P%%3aeLhn5KPAj`D;4jb>Zr z`Q`=nL;iK*kWng7)7!G!LW^tTZ#nhupCprKbB7JxubRk!2S(~NY7AB;ZD>WC6`rOl zlzXUDDV6Xe<6=sY63%9#37cTp(-5HrtEnl{UIe-#-(uzfnCWa61yfTaK%Mi?6swU)EY8f5n6}}#GK`!8U&<@sugkqGTpZOt^AU>;RA8$M4 zcMW%2{dQ~@_9n!Y9VS)IXnk&JeX=Q&U!uN!j=*or3d*{XLmz}KDLdHc81IW7M5dux z+PeJH@i>s#dZ;OLeD_{G@V@WK3afIXNY&>*oJ=ZzVSOWesqV~5Y&>Bp6KCKX?u@pb z{u8z4Aq|&X0axzx5x4gI$llp;puE%875FPRolj57{1TbjU2JV}GRGq}Ee_yOG9PVA z2L6hHMUun6SLclDz?w%{qPRCb#=Ob+P7GYM^4KQ^u33iGn;y7t@XC0V9O4={SFb^{ zl{aRnR)5xb#z?DH|0~ZvVN}5DW7_EK<|Ftb)%8n$EJEJFxPJQZ9gDjqJ~)nT zbr&O4tDko~f%nTgH2g?78z4sjJ-IVb`)aZqoW-Bku(dZYRKn?BKNejru^e)5TE%=N zvJ8!F2bZI!5`pp$WtbVXZ-E;@QJ?tnETV@W;cbWb?L^o&i9zv~_pHe&ei%@@0QI~MxOZ5Q*q{18_v-)RMW8X6A>P6;!*QbEbf1%1f@9e6WcEl zRI1<;qPb|8+2O_=tg-05FG%k^!``t%|Ai>dF<&=4&CQ9$Jx>b^L^30_jxP;+k68UD z&)dbX1K+)IHtw?Ji~U)_un-VOs5q0x^xi%ucI}$hT}{a5c0n$owwR{kIW%Qc7#b*^hfxD&h9hC`hcKjJ@1C%C zZ`k{{u=i~cL<@ESqR0D>ydLjAbCCBUH6G09@xF)K-uLI zqqt|DM$WmKDMxJX(OwIUR|L3!_Ilv>^Td;Vys82B)9Scno0{!Bteo7Q^pWPs$|*o* zpvGsGd!8=?(bsHE4<#v>513(B0W{j|ARkuJbave+T#CQ z!<8!ihekS{n{bV^`)Up!GC#(*?dlsMIiod=KTA=tlx-L%^AlMPwQPk%%UefVQHqcY z4L1KNw8heYd-qUn@D>gQLeS%43jshsgw zk#?grK>|cam#qY67P1${`wLVZ@8*uyHDr?KUsn+M&;aockFd8>K%AKZVNf#TDrJ-z zS3_1!umHTnc0NEa3{gTswf@fsq$i=5Y;{IbakXBrpcI)=5dvq7^jbs+GAmu?8OqSo z$0gZ+6xiLhoic7lhCE~xdHRErr~jiWBW(_8b99FRSP3jvR?FQ~$)VD<*Z8a9gwTN- z>s+dKT2mCD0{{9yC+aNDI(-@Nrb&fWX2LcS%*W5E_8@we!?|E=<1=d{VuDav5L7Cv z)8A)qR0ZJ4s8&D9v=emsJJORpA`W=fPBw{in!|m^LOhZ5FpPkV-VABx#KY zDE~M~{757~1|%^f)aQ{Nla#O8M7#;J9kK%&R%^NV3#io(JxufUX1F}+4|N*C-oSMI z%W%_3n)rWpVx#^x--i|B?^qqUi;x}YY^zP#k4f9ItE&>rjOF_W8^pw8Dcc!XRQjM| z^QL3TmH}&jugF>ar}1TWiseIdLPR5hndZlw1`iwUKc#cE`p=Ng^K(AOB(@;>RjYq{ zOd9D*Z|J6sLw|(n45Q)DJcx!~t$r~dk%Ho2|saM36ceqVHg_sx4gxY8?ROs{)00M zv`$rXm}gc4s>T*u+d+5h{XDcSyTRSMnFp2QC*+_Zv`HHBd)`v|o5@dYQNFb31f&eL zVWsD(+ij{<$R?+@X)gptHR~hQEHii2q{b~Z8aLrUH8p~3KoYqXgLpgn^}5!vGZ_(J z+}jRfD3GTekH7879gQlx{JOB$)sUr_gA)NM1tQzq_vCU+RNuj*vUZ8}6_{2V=@gd$ z`qxX*0+5Xk(*I*jdI`cO!n5wcTr)9DA}I+%51h_yo2iW|l@PifPQ`x%iIsYpEF^bf z*EEK-!hKek+xc`-j-K<*PJ*WH;-~x7oBNqTtGk&0E$-spEb>~84JF3bDhQ#0DqL95 z{lPlO=Zg>UahgaiLN8VH!fNxdXv^zw;D7sIuXjwIdc1CS3GVZg#rg$tP!lX@+joZx zuZ0#1G3$brZmUERBS)yz5_nn5GCV18 z8}iNtHLj-RCbW9jTmr?_4~33<8to09>q>T&zt)t`&W=(Vep|J?`y!sjc>OHj-S~k5 z;%Tx)PO{cxkv~@Mbv1TSYlBDYo%_;St-u<|R}Mn|m1!7!Xs!-beZLN15yer^)~RImv)UU%o>oduh?R%(mN{ZBA~j z*<6Z+{^VFtZwVa4AwXU&!AopTn%>hsK%=bsPwoYa9mI1{srvo$ilTB&t=`5X5p~q_ z2!2i=RqURFzGb~{CR0%K8z%DCsQhzO{@#iFCbWyx*F5$0@rkc#K;KQJaq=>noo=dr zoNp$WL6yy@w5cQ=*BT=(`aEh?;FR3kWll!@U} zL9&>N1#$E_Qqj_)Vh8`t$HPosaz)X(fkS35bNDKt?4T3hDDGJ#^|?3Q20d5JxoM&~ zW}&~Rlssk8PhpSdXqS3X=PgwwN+wFsigVN5|1s%OnF;}Atx|a-D({>mU|LXvl)4*# zrM~<_OAmtt!ZEPsTC)2VfALgfq*fS($3bTR%)#|*9!&A+AHjdqpS5ANV7LJaJy)c7 z4n^K!ZH#5oRA+EE#**MLu1GXG{!{Ke{Ac@qpk_vq>ep1GKrZ$6#dH(@If=)4(r|!n zZOYqWvGSuY8@*pV>ET-D z3;}k(xXa^Zwq*FexR;CN-J5oR*YcL7E17KRwiF_L`Qdev$F(35y;&YqWW-3cT%Lo< zFWsiOJnLn2xK>|x4%i0**XowJf(7^yz0NqB%T{L$Td-3NTi{9&%|tr)xkUp6*VF0g zGx*fAxU+}ti$YT2(`OKEnIA6!|Mcs})l#gzl7Wze^ z06H7#e48Kc43$za{8{D61g_O@T5jjEQ>Z%f9&I#`g#fY`&VdMFr(i2qtH;kUl@yGE zwfeQB*Xo;fG|>UV3)FN?H-qWWFX3%;@ z--R#}j-9I$k>y!>9YvPI|H`OhpVxo*4Otlr#raOVYWL2_gB9vc+TYSMhyU>>31%5g zGo;9&-Csaz+dlssEttb^{MskrUu1DGjnMy)>TOAfl zO^1d5DPbn-v8P36r+ZqEibP0RtAC3W5H#(LhHG04C6uI<$zZgYGyhj)O&CG>9Dy1n zleJa)qoBLE0n;DiLFsxkVd%V|$I@6e_be!wbCwvxBmS}Ih-g-n1Nz1GrFr65R$UV*@AZpI+C2rTgkrlUEEo>N zk@wV6mR5&$sPk3yzGqND2v?4|ThV2J$fXRxZWnEb4QOAOmMXo$4zasHYcAL!hZT#z zwmL%;W4YLM!kl(Ky42zlt^3*Z1|>lp+H^eTuu!QbDA(;q(ld`cKvU$sPQyS*t=U~F z_j9YHLu;@gq08zr$A!`llCEx37gy1r)>5fcU7vZ!I-QqUTp+U?OTHqgEF)^jiCtBg zNu5izTrUf@LWl0^7N1k2XLs@bbQft%0($&`a|FWe8MZ*7G?R=L+RZsV)Mr%Kt|TZTaIQ)*cr^3Ibxe)aYEFT|(T6I0!Z{k)2Qaaj(Mq}$=NP%uPIHPS4U%fgpODYItXcgF$^JoiXY89dn!m40A zF>GsjDM;(ZfG<1MazEFWgCl#+Bt)@s0f&yMyX}2iJ&YMZ;B4~#;aY)?tD$^zEOCj` z4^x54mOb1e&D$ZeC5RoFkGDWHEBm7nNoUfKHWF-Fg1*=jGbF$`PqsuB*Q0h>7Dl1v zYRn9Ij!^WGphQhqY9(`qGn|(F$d|K+GX|ae$8COh54x)GT0KFf^VDs;su0|vfl^uN zYTqZ&AO_OwlcHIL6%*J*83vli&lW6?9~QlrN%; z*fAZs%+X-umSrNxF3f8h?CQopUFs>)aK>|V37~=LA~p_BlS};x<8id%aeHdDvoJxq zt*y>$3q(k%UsFjbWVnW%iV|lP1Um{>Fckij!!Q@I%PGFCLZlM3GxoO4Y-dP!5JfrO zpOY;{!A6@i8^j&pM4L~PHY3_$vzX#=Rla*x~ug2&H@VMxRlNl!;Q$n~76E zJw+lzl@oeyRYS&uE((Zz!jC)-zUVWS)H?3p_m6eQ(^VtW8Ez#^>-zDY( z!R^K0;P?TBGqwmt2)_GMP`%G-uJE7yOd)=)ezzO`Rc&`7Kvt_&wqrqmVte@zopApWu`nQDHcagmv5Ds@&`%DkW$x}DUV3S&sF&>M{VS*e(JqN)uWgh@6coe40wZ112Q{M ztX-fQRp`(DsKR1reY#tJ%DNFYtm_;V!pu7uynUEt5k;66${MS9D3H}sIV9>fGSqO8 zKK)V~y9YtcaPoGA@Gu?_Wt8K{T4`NcZk}QQasn%Yo#n9N7XK38&_vk?WzB*!ej)`6 zMNU6C$5*F7w;IrmG0iq)6pRm-$3(=7qo1qHj3p`>JhFS!c?`Kvwil%&`r~gwko$K) zQd23@?i3PTG~BLCH3DBv-J!1ub~d<0MezdP9${N*_5Y+|m`JCkDwX13*sJ*xktWe- zc^*{FD@}o!C28x`cc=QkM}0>62jkBOdYviPK*A=U zB~1u2@9JVmQsx*9V6f4OXz5mq6-;jIP%BWpa$-RRkB?QBu$QuNnkUti{N5?Y)l;rR zM>*K}6re5s%S3~|ZpRSU>BjEu{HEL9 zO0qDwDjC+FJ{lVNMg@u~Xtm0QN)7~c(hirg(PA@{&MdX;lg#$MSZj`KsVX}FX|~Z$ z$&LZFYP`y>wqeOGTda(#TqUHP2-@Q)vYIC#cPsmeC4KlYRLM}Zfv12h=!+Hif&R=8 zyXSRs+Z|gz16{x19q(eT9-Yy;uW4rNHryB-L&G~DY6;7(3JkTxkFrK39^)&*&cMS4 zD{QXVt+#Uu5Ct)@Cm)=sr2ZjUvs{cOY}&=KWe=ckAf9Nv1JPw+*yov82bEpa#p6mo5Og&>LJ8+dGGv zWa9JiAED8#jkEEydfDMOlTX+Zr##_Eob*IyV&)Tge0{=|$a!LVBJ&AP!uCWC{y-qo zJAWw)$HhRq(q|gm6V5f!Zm5QqEC5VCe|h{B^5@~t#h;Tu2Y(3d<$j$LrAPkst7#P4 zHU&z%3MHy=4r{8g=n`6qmAcxT>(H4YM19F2B&7-?Pp1sugUud1+KmOOYmGbKYLTSs zRz5xr6%cen(eDhdW0a@tywKrGTHfr!_ek#Z#3TUY2_cclP+B|OH>&_+2sf8QE zX^(=(Y;da5eMmCdBnep*v{-UKs1;z+_W+O}c`3ez6`v;^F^tpc4x~lU#qM<)088SZwAg{8X66K4*2vH4HQ(nXfwF{|0~J=tR_guqWq{JyN< zBBYc)2YgFvg4HD7O#!9@jYdV@J0-)UqBroFcIJuj=aTs0(>bh6`dSBId@vZWWq0Vb zOf7zxjnXfYl=pB0V4CX6o9p&hgJr!DZx|s$^6kQ>Reri~D36%|Qx8D0j;o&c1 z+9rBfdQ4${gMEjLhclyvA%8jyq%zRa>Mvj29`N z>0&UZR0NNhB1}c6Yn)V#_bpCc(jvK}d{TL1jWly290k3Vqvf+=%azNNmx2pth@X*X z3%&Xc@pux(OzaV%fxO_;av8@# z%_+N>yY+eMtwunmF7;729#pK~k4aTl!LF712_Lea2N6=SScFcTgD15$I2n`37DVtI zwD@m?S&&_%={km9teQ=$)NVUQ{;lV~K)zT<#SE*9VZ{-zLhOsbs}QKQ>khnmcZK>Z zLVcHr)F<`5Tb-LfcYZ7PddSSqTjZ zM{hDAQ;FR4|m518o;htDUaPJe}Jr&&%n76P*SGG?F8b^7li z)q=3d{)~kLM`N%u7$f5_$2s9JCnbhlpAtjfAdC$h%GWB8=)$qo>bEHy15tkz8Po3* zA_w7N&M4B6Wj9u!y(#Il-g6+>k8QuG7iEE-ENigyPoRl4;AXYc7ssNljFjw9~Y-+`3D z?d3`m%VB~ypRLfsmB?_Nek-%TF49{583tYJF_;`sE4aN>o%awX`Y-R4Q;y<5De%a5 z6uJa=7$*9NcpRpe2v-1#UtzH*b%truX@g0nQ0M`LL#at7WmHo7-=MV6BNDEqA$9uU ze;^QVEteI+F~iWkhv{$%C+_t*5aFubocx>r!+~ikp*JjbEiayl2wVRJb_57fQN_z_ zdC?N&c5X_6n^nWXV|I3@fv-eE_)l{-+-*nLwn95(kvrXOukd2FBX&>uOE8hW-u^x? z?;LNxv?{hmTyaJ!4+J|UmF0Uc?-D%S`#wi8M2Q2z+r@lZWQjChyra0=`*;y5r6&XL zr}{CE>6QzKE_d7a`3!~95f2&Snb?n{{hPEt|6e z+aF9R6NXIW-OB8O*{In%*Rn?j8P z;^0HrxGNbonZ7i}&gnGwU!(K$?pG%~kJ^2Wr1{?#)GcCOj%oErWYZAbi9Mij6yHc} zRPNUAa|~MFC1)DDcaMEHLwpYh8|FQB&jLAt$katD5yc5|yxw#h(1;d)5C;mAo!j_7 zpWJXeI7F~KX;pekeow2Ij^MY}Sp4{aIABEX!?yT+q+ij>_sg7(zg6OA`~VO?#OJ%z znqDRWqih<>QCxv=+-J!7@Y;mJaZ*I(?u0nHK%IQ(1jzsonxel zh_Om6aL3g+^MLN}Ed>vG1tnOe0yEQl;k^SWuk8X~q-=za=sC!6Q zht66S?U!yuH}6bmk)FV>q~8^0Z|+XNORu7vpG&{vO9uhmI|u=w0WuFMV&`s)@rK~J z!Jg5{)9PTyrO-?+JfE?!b+21c#U|Bj2|iK0FW9k$FNN;!?i_zU_-0|a%8?;N_42?A z(e}l_XRuCMn6+_cu=7&h>>IO#J6eEfCDbi`(6_cK8W;^e@TJ4auqyEX5cl@sQI%%` z_e>@qlVo59h!`|Nkf2!60--iSDnS_x$hg6fAeAUpNMoce#X0yzWWpqx$&l7=ZMU{= z+wHcyc5An`YX!xc1lSPJN)&3bVhu{=#6vZ;DFnpK`@5g#oXI3=yMMgz^>ST9&Uw!B z{dIrech>`wk$?*F$3^f6^$sv_F3g;b=LxxqI>aM#4txO2?5+nN1Q~T(gqo0tw0O-K zs4&36#c#ksQ%@7mI8XBjg#s+HF`MvIE!56}?XX=ik-B3G-9BCBR9xL$_1?N((i{+T zl+?P1gpjde&dyeK$J$dFKO8<614+-F<08+AgSoV@7b`;kTA5l;)G6k9SM@)-4rPGy z4G2A17+hmL#9|2AY?n4}^FOsPAvL7C%FDwO`Hew55Jua<^3{7_T&3M;c~BRj%`~Q0 zuP1h19eAOMzT*l{UK;iUcF;F%< zOaCQFAgwFSXa7Y8K9{X=;YoE_r-digrTfcVbw^V2->YU-5FQQuvLGMy!f#gPS$Kcb zH<>7bh|hViar<_%uLJ`*Qc z#d3rqR*T5WUhqG)?MextgFKj4gx24e7JsR6uLRKPeAAbEZtm{J{oZH}pM0^jTt8%N z<36tkF&v%`9ZqTV#9ZN7+A7|_D8KNphFR8QY|pO#=C?RDbRH4;3pU^IVdaerQ6P?i zgsHBE0Jr9L(0n#N)^nTi@{lMA4vDu1Jm@Gh-i?QatA^nxX17&GR!V@5TO40X&A~wU zhR8FrE%6EB)OWA0Z>OSN2f@+QM#Q(pr1-UWLwRo*k_fjf9JQUpDYr?nF!ovscG>8l_7 zyF&V9s$U|YP*UO(wpUiAbg|9hMk(Qszxi8?9^?|C&@>P*j$0E6yiJ$4FcxUoGn#BG zv0GMNVauKV%KXj877G7UF|H@b)v#Pf2(|<-M(0IO(w#sS@c*IUfF?F04FjHyL@_>W z&(dyI7AFmY~l7ntTHp<_R5Ym{;B4fe1(U6CD<>fDUuy%vCIvzSk zNVifI3nhpSx4O|l6eR-DWynW82ihK` zyJCz9;{LR3FL&s$=hZ~$knuE}Q6+aFIHbRMBNvXnsfrV_3Z;>q3XX+~MRD!`D2m!y z(_0sP&g5ucaFWYRyaej?dGxOt5MR}1;59i&1XlB2o1&xh3$;y{dltc&`_OJakNV zDAk+ZPo2fXQ_6GV1r)GYpV9Xi1?vV_o@(=2Dxwq7b%!}`M}(NCJJG#aku9fP;V-fR zbOmKXI`a9Hvvy?USzFLL#a0Bck9t&2oZnU#z%c8h8Us3GPm_XwYI7eZhUdAC0~;|O zyN9KcvHti~;Y~PJw@R)$tnb7P>FL592>$(juJ*Is<#H6@T&z)j_?kq)@;?>xnY|d( z`}-5bFXIBJLs z+1OOH3+%Al>))CV10XS!aB3K!1G)xcTT{dDRS#X)x{u#SI za{Zht#PmreSYua8+9P%vtqA|-2UH3Mg7jL|`D>|jWOY|2tGk(^=qWP9$kS8Q1;r*% zqQr0(GA)pv3}KF9yCxm5KCRljj=t*wXhA_`_1Uxz~~rCHDRyu~hOZXa%RMiT8EjNFq*GjjY-Wfv2B zGpktnUXcZFqP|A0c$QM_Z}hrFzwWGCnRA|uD_B82cY5Cl;HRF8X)M~EA}T_Zk3+}<@g3o-G?!l?I~abe9IiIQY%c@{WV{5h z6#mW(X-Z}MSp?66w7v`5&beY8KLKEKXwgzknuywuP1iMk$D zk562Yto$}r2@{UER_W)dz?g{P52g%BP!2~v%Ir9t%PyOv2pYlyiIxyOCzKIW#})#LmMD(ZJjB7`9yW;564+vVdPkizF`>8&s*cu7|7+z+16JVeq&^ zplfJX^9qb)^>Rg|4}+>{3YTHIzv(Q;fTtWPtHf4wC?RjS_?g99J8J0%K)7Ajh4QApMfjG-+ZOd!CeDC(TQCH>c8xcjEgBG5 z@>yAp>jn~u_Y#fA%VZZFD6>9qeGjdNsVR)=s@1b3hGoFnHt!zrWRZ8n(qcq(p&@MrkCzmVJx zk+4jAB5`2lh%J_Rzq-wm`|(^Uz?SsmNksC$$E`Tz#u;qGKwX}u0C&iGF)Q%{_`c|_ z_CFjU$lFGnw& zUXGnXz4yl5^*(-M`T1`YF`}dSr1hf*E0jYnR*u#C5M*|6!@FZ??I92V zVIC`>;Q-@l%bQhgenIsl6hN=i=9@k`u7n%0l^Z7?_19%9+wR7LD?xjFku9h^%xd+Q zgc5g7Y`u0xkq0~aoYre^KG_F}X5nls(YU2wTn`#KC$IIak^AjKw?jkujP_e1&nRl7 zRRLUl#fQl;A)6cYeB2f>SCFViAh{9nu8>Row$=ycK%sK$ilrnRfqNK=9~GQCI>sQt z{hFBZTgh)Y;u{NDbu=!c;3(^{74d2wD-j&Ok4 ziN=)H@~nBe___~GC@J@fi>*XSdCo>}YgzWZU|tv*r8wp0KZ1yCY_zId7k^1QI^2)e zMc!O%JmX-doW79;S%aUO->lTM_mt$oaI8H674OJ=rZ3X)Ap{Kz=WPuR*{0N}FDUI< zNB`YfTQ>`;*L6^>>tmP8trbvP^AYGE5$3{^)N82(r&Wl$g%I<+*!pmeEUPT)%bSYS zn(lJeG^aHSLR$#z#PDkUDf0BkEf(fYECVw!=#PpCGLb!G!~-K&V@+#$`n<2nx*1hS zAi>*heWDvPZ%-&Kofqdl>X-R9K2uVWWz4dte1^RQg{{|r3GHMYIp-$Amqt#z<&mRP zNUVUS@@xa#Ah{%i{;hX258|S8$aNF5Xd508dR%nuko0=Z55PNYN%N{z8{e@l5(>31 znj|9Of9kLZCv6J_kAq5}vm+N*Q(hKo+XVZr5<_zvOWwDhVLrTraOQmNvsk`*# zHSRQ6*YRJnDI%xyHsZo@#-?%3&J1TwPrSiYA|>QIv}8Y%N8y+6QkShL<6;FhHvGsPA14&GDH=+w+F!V?66J^LXj5qF4LR~s)KGGyJ0*ec! zNH77&Zs$fVsWwZQ1DWBA@gSfd!xst{qT0OGDMk==^Sk!9%xGw!jDTG02HL4>3++dD zF9W9o*%f`vVNFY%B2=34u#mG1up91GUmU3GaiDT1ZYds*s$Nw2$OE>4m6%ssp+}x{&}m ztQbzah8()Osj9m2F{0-xddXpBW1+uYKrVI=oPKpOg62*!Uts?U@Sg&jBB$-2AX28g zuv}0qNfIhmjl%dt6I@Q4wzJ~PU$7cd2%oyDVSF`JgDg77+235wo18?n7o+R?S#?+@ zyVD}~30*WK%f3^G;+Pqk?=dc}D_A5V0O`Z?8{L-E{LRlw4GrG3 zjTdph;VDQC?D>kxRu=6XI@pVOa&B-yJe`Rdl|}3i_-`<2bYisEkMlEhQeDb|Lt3q; z0TN~=6IQ7fXVgVl5#6zh-z5@h9g5dAEy#-d5XE}0cIOJ?iyCJ0S!kF&KJk6~-xRM~ z^T8X5y8bh7;Q2w&ILWp3h%hf_F`-1T9o{egt#5J*ajMZct9On0A)S_5Zp~0vxAyU2 zuF!8gw{f*&4CPl&c3ZDkSs-T{*MZ(9hE6SB>x!_MpmreD$`rN3hj#mpLuncNiGLb# zN@HAG`aaB7m2AP0n<^aE4S!&Jt<-pCdkZuKls&PK z6ssT8pCA#5H^>%0CipePn6MAf5j5}kD*J2ip#4^^^0*>X#vFQLQpCw~t>oELUe}~Z z6Dd_lJ}{pEvLIW*?ZJkM=-NqrBf zmkA{kAnwBP#FQaOfjqClfs__LcaZGsI68ZLQ8NO}#dU`O*{5B&eX0fdoG2P+va>sT z$L8)8Vh(BP@zzjDyX#CbfPEV7#l#_~&z5M@L#r~(Zinz7xkxO^IG#Kq& zFvhhONjE~SaYEF&UAcRKd@}W}1{u2#HI#@*EVWg=3O3!w0{@ zG1``#@LzmcPAMaZ_b`Sc-06q|dbF2$o5&kMJVeSAkhobeF+7sg>mTEacwFMJ;4Odd zZuxuMpS!p5O}dfD-Njr}Jm4q4ZvM6uMQg{n@MJL09WE&Gpsy_+J!F}Dxj}Dn(92HnyJibDnAf;h%&q7} z`oy&slU`{LO!0e@8n#Z3Y3UlEZ>4!HN)haB?Qq=HdbnkBxBwSeOY}WEU$CK-=G1%DLa_Hgl~gh+q`H&4)55ut zlJvU*k-HOVcjcVi?G2;VmX4}ZrpUjL>b?!9UtQ7Rl_xXP!Z$eW793FNA7K)Q#tVRZ+!)L=E$FKg$gTv4b}j2DnSXt3*)<^{qD9!83V0>w(tc5 zIO*RXo_Vqp!F$U@Yud?O^5C`3JK57`< z&N3=_mBc_85UK<>{=!wvD@_lJRTJBYCHmcInJQ8H)o@pP8tbtZ#Q!1+#g|0d_ptmf zWw7FpwC}cG(oh26RyvD8+Bb)5P@26;eR#Ly4lR13R9M`tQPF8_jZfxcYYCndGey`F zPrKMG)wrJ`x?4v@eV{l|C&m<&*r*Ee7;ES;%YLnRB_}b<)Bp@^Fb`hv12$h-BFHz1 z&ku(-YkrR!Bv6{NG^;dkDc8FV%Kn7Q|6n^`ISD6_x>uT+^>T3V7Ygl$IPHuJFR`WU zURYXuHC|A=s3ds8I8Orx5Lp2^&sP!3=N_7$rrViiHQE;*;ziB#GeR!;7Ih8;Q(>2#+`E&t!D{+a^ zx9;v&RCl3wPB0d?HrVJ(tztF9GnQ-RpJPAso{!UoOF@PPQ3) zeo|Tc6Z1kYZ#o}0OeK^=W74aybJ3XmvY>LJjcUhj5(UM1q@fFGGy3HyDqG|iY0nvP z+&JTJK8LLq*{N8x{${zPB0E*6h43|%=FLI9M-+WlX@1>MQy}DSrTI1c+r2{WR+@J@ z-@><7n%~sljGJK~w7N^v?i%C7(py&Q-c*ji0>QSbnbpENKsIewC@?N5VK#(B+N?CQ?M_t6_)5|?U3W5~qtj(ac4&&>%DRAE=!dn;Al`wq zuoYr%8aw5XDa)ZP@^^VM<2F@$QJu>!_(cj%r^JU4O0INlMeX#pI-iaY;|ky51n%&L z*I@VTZ$<~kb?TZmN)tu}`HHSP_J)u)k)2B8Su`TO-tY|m9~ZtbVH~rqEWznHp5rww zDiiPl9Z>YVD3xSy?6B5~46f2l-07?bK5$ON7qYqDz(GN5A2~r8sHrsXQ+=4l!M^KcRLerYTvuYx&}Ebqm+*S2c|l5X zGKjBJ0wnZUi{n*2c8%TYU7{KkJ%gSGAPC@Gry4Bw#fM8fGp-1L#YLnE4Gm4$V zy~r*7%iB=4>e37zo$@3DQ7j()`jC?W4v$XxrW&c{@#vKGb{=8z=#;NWCBo#pA3bzB(CMRAP# z{RC6EiB|OCLw8IP8dM`QP%9S!<;I^s*Hq^6U{}DWr8;k+G8y3g2C@QFG+%}Aw8H-s z=74xB=+(9|b$3%*6&^$3*0}gYXLre&$LdlT=v6qfTXpIF&Z7mz-Ig{lEXc(WrYaGC zzw_;Lb|ex%NL<<_&w=(tVlZ*(P<{H%m%cyUYBB5wk#}w^8OC0AXI~M zsGMCVwj&xk?%JdFstriu#A)m?5S6I_yFTM`ftrFgO{_1Jt4l*hD&D(V5MhFez3)Wh zdf&706{+49x2=d9Jx*bic(DtFGv`u}J2 z-n>lqX7GiGvKJy?y7{BuVZstLMf@*zw%+H&2GzbqE@ul0KCpa^eQU^>&%o}ccL?UV zcHSf37k|ONv{R4$#%EG6u-C8B3u9wohnP&(Q=>FZ)E>u!2+&@kVY(wn6ds1EKD*br z+_|9sv`fwX{|O%>W}|acZromJo+n-S{|YTTtY&B!Ez4n=oeg@911xjGIRHyBTN-2B z26iI@ZS1O=>_X}GXB-n(_^QOFvvo6pD9(6K+=Bhq6?FwENv}%MCU4!Wl(hdP4UKtO zY#aXu75y(8S{wEW5tl_;%S1FwIB}0+(}dlYd46ZIv#Y|v;oi=pqj(Io(L>P`*QQ9a zsVV-#%`}Q53vJ_6X&zFYDC)~4qsox?I`RX3{zU)p*DShoO#IFN$(ua~(JpLSlv;>B zW2*3K=@fM1Rj&A;oQh2%?t5Pwet7l@h`Y{K<}1J7D2v>UGT*$m;Gv4T0Q{m9bo4JZ za_sU?1rNDE2gBL&K#uSjIBdY7nFvN`hEvlTe4lus-yJcB{;jvMkj`cDDSI%+R5?LA z6n{6I~{zgj~Bt{4d?lcqwmIA|Hm-Lk7>fude&Vv_5M{@QU7@ITO4>_ z+%>J!x>`NpxYfc2h9q!w3j-zf3`aYFJ*-o>7;{PpC>mNEp-?C{bpWlW2X7c+CzXklt`Pu!BccOXo zD}NXbb$@x-TaJKu*C0L5rRQVlIZ>%q&;1WdxF-NtQS+ff`oFy)Us|0-s|SxyBZg}6 zE73RoeLd{&k>5JsOrQ2j=kavO(fDRR-}`>{F`2xQ$*VH~U|oF=d`u>vWb)aWsLEP9 zx~+iZ5bp%EC4kzxdUTFF$&u&e=yzF#qjTg-j(jJF%U}FTEMQGlxzI+*R3q+uvtU|} zLMb|r7m&3lHc^~KvR|HIZeQW|0lz|K>S}&#`8~kzael41n84AMFWwzFlNI(y&Un$w zIui(IM9z#eCPK|X&Opt8*(z$rmEf=Jmh|TD{H8bI=`6;-6!TNuxf_3}UM3s28OC`0 zCUf@+8cLA2j_%+(ZRK0Oc-|82S~g~sc@heNui+EIG^lc3eJ>*vyJoX z$66QHkGH1P=UY>vgJZ+_(ZTUye{?WEoGJNhsKCmsp9xE3_KnKGRw;u3b z#X~b-$c68T_W8m!(Y^`cg-gPdm-w4!vj5aBkf{ms3+ zs`b^n=vNa z=g=$7SzVZS(EE0JH1{-*Ho|LReZ{^&?dQ2U-mCfe=9MSp&#e3i@&}6oz7pm zzG*5W^&kEAxYAQo($iJwkShGG2dYT8O?_SiO?B&sW2o$*VL!ybqM> z?Kf1~Vmqx*()N_9D5jFJ6^XZq2|rll;EflPN#@Wxmxrxn zBX^<-V4Ib=QO(xI_)fB zE+68Kskt&~e#u(sYGom8=Xwfsn`zXq_GFGx4nC3z7m+^w~J7 zRF0Io26ulH8(Dw(sGPkw$mI%+MI>kx*w5l44cRx*cO-VPtza?;Qw%*X$Ct+XB5&k3 zLbMXiTF#p6C|Df39nF&&%3XuDLS>J2piLsKyQ<9o<>{`fc)$7Zr)7-d=t8*jevpqB zWiJSKzGtkw^^8S24c|V|Uad>MNH2wH?<%tsextfQLz<7oUld_L*n6r=&VWHwCuuB7 zV@zbc-}=Lds-k+pDA?ER?wkC&n;zjAP}n2ThhB5qlY%GIYUM3-+8gq zS2fB?H4z~H1YuWwiP?Rb?lh~i&HR{bQe|sUyuK@)$I8~4yvPUXcjl+mFAI3&dbKO8 zNhuXd`W~Ggv7m>Z?>y=`Xlidh(G#ncs)xvKVbTE;PF7;u)E^5z88e=Z867w_G2i>8 z?3s|<18~n}q{^FusN(vcI%sR-hI((`r<}Fz_3UbEa*Mk*sj1uSrZjL>Irhwp$+5?^ z`T*as8ZmmzpCDg>kBRGGTtq+1PfXutB#fe!=IeuUj>;kp1q`7pSm1hMyp_=!EEpmZ zbrUCpa%f5Ca#M|mXIT;~@JD|+ftlC-QZUwQDBwDJ6FC=8$)HBP1Mz90kDM?&2$w!QlE`$Vx}-ZZZJ)PCEb2fp>O*=e`)O&*Ah*c zzv6E0IGXmdStJ^<9iW4KZ=jrlDI!(m+bDYIh{lz{-U>Y3t+>UbRB7PO94S&8?eJTB z=T5QO|6U<-Hs$;a#jHnF-y^E;YozaUb>Hu&?{%(rMzKhS!mdDMp0^V_L|2{keWiKn zjj}RDeGBPe>Hv-W+fNF@CS&UMyw9lK;H^(lbqsTimcdi*cRZ`=5$BRm%Mvn_Klah(G(dzg%N{#I_*xiZF`_4z~cJGp#q_~Tuv9-njYvL&!_$IbT0>J zz`Vfj4tK*!^Mj>w(NPyHm_20moKH)FMa~w?{i!aK|K}My> z0uBI7at;6n|NiF7cqC|9Cl0jVTF_U(Tk@n0F*!I@QM005xP^|zpKSaQcLiyOVVn4y z{);^2;k(Mii>T`;FHG>^wxG#6S7@h25R8pSJE*s|vp2I=e7_BFp?1DIrn7JSr7uQ1 zFTh0}ssVk^oE43@)YAX{XST^Fm-boEo2mKl{QLPct%pYDzvl1d?*kD-n|hGIurfQ@ zI9Ol|Q1f)J}qLQ$HQM-8ZKWNzIdteW&ierjl14j zfQyDV$4qziCK8^W&NnlPs|JL(cGfk!YQS3hl1VP5+KAzBTT_~A)({7oD8v08mvu>} znH4`6?ZqEiCf_=^#^hUvoaZr}=9soc`EQYc;vhP?@q;_$oJ{MHVbsP}gnn$?Ri7@s z4gL7@(7#xJ>=Ez=hhxveg-eYSaHaOdf={#sf80{FgGBBaHq@oTCve_4n8``pkvxfh zi|a4A2Xkd?(sx7}cBF57sd3#PmU?iGpU7n%Lyya>$|h%4nda#XJ91A(d9=HOpk!0- zzdG9I3eR2=zHmu+0{ox{DcKkrbh!#$efK%f0axEwoM*4A?>6T--PN~}=aDsFG?kzW ziNqU;zAK&Q_Y!@VInSpOeN&z14-$Rn@EkYx#19r%4Kj6&Z>qjl4FX(G;LVGve4Ban zyuu1|l-kn2(YEayYr(_(Px)qhp7$W7)FWCF-Pf_u|I|ab@r}F3bFlMhX5*Xs+tTR% zj;od9O)}g{hL3*rKNb0cloaorp52rkF;Tq>asj3)#p~2)eJC6(_>KL5D5bpP>*)4PRUBGuWPwk05Q3gmBY-6nyCe(D1?0pA85>G@L zL2Bnv$7}Qj{+dFjLuT86UqXXa!Hlju$Fl4Z;DJmd&MCF4cu#6KZ7i-#8 zSKc&S`9@uNJlHdTQE?7tbIgLjshjCa7(F)qTOe4&W25RQv+HPFhvw)TnDUz!>#F+V z6qe3PH|cG>YEZgK`~jJF&x`XPZj|oY6Y&M;=@ES`8`aL?YZM)U5x_?< z2Dw&n#wNp%GHnmH$UtHRbBxP`Q@E`~mN}L;+o}27cxVqyQ9h`BmN%QI3bAFga)yG3 z=?=8}%mLBvDu6PWhtHa=Xa9=s?qlGviX!*{4=~0HV#X7r2!oA$(S$)APZ~1b$5yBF z8ohs;VJhhOYaYtOn*~L_R-?#$a9citBLC$VDJZfRHUlU!z?=HuBurA^LxJ&M3K;K7 zAqr|7qTn@~D0tN-3OoW}`@T!_%pja{tY6;e#U=*2JlqVB4sJ~Z_@m$An?ndFmm8m4 zN+H++C;K84VwBM}Eige2o_XVk0q!V7j@&Q48ef*WF58p6iBj0sGBjf5gf4CqOvlqX^ zgU0F+7eIMx_7`<_>k8UE0S3-7YV*xX?ml~iwLPjfV7y?0R5zxrNo~M*I#lj}Mi_+i zHePVs%LQWW?ljK@E?D!O4SH#^MnY>ez9k?xzU>LY1;hlUZ_K5g(T)o!k-OWvTW-F<4zC5Ce<>8ZvXa9utX&!_{YfHU)B7jB6AvrUZ;>bF5Bc@ll`M4 zJ+a{9vJ!eTd3LF71kEm+4XE83fKT)CJF(CcHb&>Bj*<9W0DLac*Qcq!PuQ2j1fW8N z%}oTG6GU!1C2U0QaUMbMEK~1^kK5UvP6w6S;*`^<+y-79RPMiNqdYuWR_9MVegvKC zJ3y+vQku{jzC;NN103DB-+xm5j$e;k1R6Y2?nj+0`{9n zy%q8XdDu6G3ZePpyHoI~=!#H z_m9R*zAvXhfp+Z4N1Sp8zJ#7+4(Au-;EbW_NhU@i6IBEAF%Qy6%ST}7SqyGc;r+v< z3Wkn`p1&KF?Mq~{LFY~1P&h}Q!kbhOBCa99J#1_4m%uwbUGukXRiNC)8va@4$_D4w zch#UmQU(mb2L7RA6#577e^jRq&;NVye^ln5>C6uNe@NgzS5zQ;wF2p-A3xElz+6ps zjLAj@l``3}JS=nsP%j1?D_~v6f=bo?ra!2)6doJ;tI6XXBegudMBQb(^cu5%-3S|P zNGJfQZQD563Gu34TPj+0q<(x`Q$Q}Xn_B~AE#nqmZ=CAe`gh6;sQO5Gxxa?XTS0YI zeN5v5!ah=1fa`E!jb4cP8ly$NBcgZF^K?)};gckKVKH>oaG@Fm=ksUSrV+^68|`6==ZWYXCPkvD%hIla3LVQ^EReA z+EE7gOH`>S0;a}~O*RVsr|WdN^q zGUVwD0hd*xGGs~y!9$%46Lbcz%R0BXMpsHJ17LWwYox7oa*De#&<)ex$J_Ki4))Ja zA7^7cpQ#veoPBS|$VE0EP^bRK#R`!*#GL=9qb_Q#YX&&H3Ca4xIltIzMd51WTye{MPFuhklt|ed9Xp z>fcB(`+0V4H74^M2*Yb+VM9k0PS`J@DD@2IO>*vtDI5&@evSFqv;?jk^z2oS$6|}7 zPTmZyhwZ4tsa{!MOJB*@SvB0Hx4zW8ZPi{744Qe$jR z-`7a7*ofbLQiRKK+j3Jo=kW}+Jvm>*${-tpAb9o*=r;OMqM>z9XLYRVaND!9B&?WO zamt3_Jqmue1&^_*H4Jb0gUt3^B~%^;;p3PQ1;rK5Xb&h9eJqF@M}!AZ<8=(uY?1Od zzH83WR-QC!w}`#3ptJ~vqpY%k19&Q*jha_GLg8;9rdC)eHHX2yOm~`C9^N3O7qNRiUnkyM@<|8jA214 z*zAoJ=g`;CA#erMT@eg`JcNUyYAOPTbC!g2mn<mp4t|rnfdWtM3*YW+ER6Pk{7s!&w4o;zFY8 z1q4BKD>Ld?6lnKJnqN2nHlwe`emw{Y^q2@#iu9M<%sAd|y(=b-o}KsxH;OG8u-5*2d{( zhg{Z!>ODujpLM(X!h&{5mVCQsS$$t12?)t;#oTui)$Oe<;$tEQo{0zk0iz%6E7Qe9 zCXMVviEQv9fb)x|ZGDa@WJm?lfM_lIV8!~<_$aauV3t0&e-W0Rhz05HUt^1fFDo!oVj4bY zgtRnaOG~+X)MYhNxdhmc&c!I%#te4(im!2uyPwl4cXU^TpXuO8to41}s6 zI;(h6t`Y4O4)X5op(C|jO7k#Z4dNgKVWU3r9|%A&ttMtMS#|qdG=Pu zf(03JGo}!g)n?y~5?HuE=c>q%8`GLUs&JuQSehD9`0>=jvoijT@0BAm#K{1DsCGQT zXSX=a5r31qa+Q|Qk0_-lHViI!rJ7JVk3^uRAEGHO*QlPB`fS)2a*x_mIm|P#ZvNQ( z4Y?{gp<0nkjq~j zmwFwEjUtcnm#4^M@g<_5#8l7#AjBa0KZlYKVx@WbVg(@x!YL4myDk*aKqARKi$B}= z(79~y&`?RJ&>ww8wt8^pr$U8_pcBF_fMzR&h2Vp}bIAi%Lj3~M7nFxTRgP7Xv50H? zqWCEzqw`&#HMjHK0_)SmDPHSBAc}Rta7wxr=zKTN%GD`hPv^UV=-UX?G%coJ$^~?U zk)_)j9bG9J9VbT6StpR(o1)Qy8c?WTq~Kp&5)Lg1UxFMx!Wv5(6h^PJ*C$?#gcQEL zv$voTMqk38JBae*a1O8J5VHANxr%vaA*}f+8PZ9l2A6dao^w!Ke;#`5)VpA+Cx$92e2xPr3G0;5gfHLJSp{>Y(Q(xQ|K&5^UErsQ~+% zw%}n7%Q1CmG&Tx0b3n#5D-|2f9d9|ESDO;)Gu$K zsH5=H3n-!S(+SR5nJ2Ko$fv8IXt<7504X>K`nAY=l~uythGa<01(lYe;Gv>OaeO#L zXeLn-A23o9xvkt>9=qgRur>={gg|T*6BVlpe7RHrkIR@7X(&vDFQ#CjoSVtz;k@#2 zPB}hNPRY>-$e)0fEq}aFm8ZbC1WY9{tZ~k1xETE=7z<{tM^1!u5Vol8&p|l032Tzz zF~yOPCXEZ@_-WrF@*8ii{;%``nk}XRPa3%R)IeS1t)(BPj59s$TklE_ptKQio2=cm%570{SX*E5UQXzb49Mr0bMVnyRxT~1laRe8% zw|lU~EwIe`9AY@I1AQ40jl|PEACm$tf|$x_UYVE+e?qUqg{%T&JB%lfz&+{&FhhZG znQC)}T9T?0!V6d6#A%z=X{C9vgqCH2xz_km>k})rnearhjs^$P=Mj=@E5<7dAu>X; z2FA4tP0*bJbf#+T|K zw>s)(EzB50HcB6vs<&;wg$L%{*mF5L-?KKuYixZ`Jh$NN_l6cZmcx zL;j2d>9o%0gD>(yn*QR|UvP{&6ONorO_->pN{WAweL_My(L$<_+m82dZ#Y})0c+po zZ||A^dv>bYp=TMZc-h^AttsqETdb?yL!}uP)7k`SZLC6gvq5NGc(8*<2>LrtM1_L( zTGLaqEx@T^t@N!fTAl&)NHFVm$DJOC|5zgt8XlFbLmpo6d z(QM1#+9?!vVqUjDdIMkCRpLJ^P>t{tJ=ei@ao7sd>afJ2we!6GCZAN)kOx~lji-~r ze0O*^!qLJdY-o-y~rNpVRtq5N3y=TfGR2=$dxElidMxl zt_YFg-WOlh;yND_j0fahVnScZv@x-m15qSBT&S%3L^4lAGcoP!z_bq{e9*tii@k(g zK9GAIT%w)5xy4=6U3Vh{mN|5;#liVuZ?&vMzBhcK90EolVD4X@mubg`tv#QgE|h`f zkuMOQKy|5A#Ha!fcQC4$?`TIlvnK55tzCdRECY%=Y_KLF!F*yo>NSg@$7Fd5;v#%y zf&35NV=qm1OHIK?R%W$cnS$i1418o&M5(?|t%@ksPgJWSG&^Hb{H*`opG3y0&Fdz^ z$*)2|w-8GeK&WFS!5tNUGVnHQ0JSa_(?tRr{P90_TIX=)_=EbeM-H3~5Ayr|**S2m zg{|*8YArmhg-5N0E815S9>2tx%$f+ll?8FFK|@l#o~vFXZdsp{{><0?u}{mzvPO(Y zCh@QP^cv}FSyE!ouvjQA54Q}7A4HFVv}xHin6#V7+<( zuK+LNMw`K_I+g)qx19AiJA9__#JYU0J;xne_yTqDS!1A`xe{@q6<_2PzC?D6NIHUs zo@bQE?eL(O*H(1Ciw9f)Zgu^67GV)pV%!LjKFLncHt%VcyWudKbHp+Tl|zC$5-fv& zbw*a-QQEqWCFx@pMJn(>pV{OSqKn1x16KAUr7%C_P^2>FV63AZy$N4aGBtAO@i4C`}keS8F-bbL|W#7q2Zu{MEAP923ud&%H18h6`_~FRRZK5-%0XSDUR%6m@T%FQ199 zn<8XJBv>vV3;$v7j^PidXhCYnen)rMyhRJ7Gt%AgOs6N)me*H+aD1dEF5MGlbRjuL zcjkKC8D%)j3g$Wm zJ3&jA)r)HNFd|irOCmQ$%PFmX`@sx67!5)y)Nd&6P+okJJ(_Z@iX_OHIjg1l%)e)E zSCjXD*+#BDvB!XX$%huY<7N6i==puy>PlpP6PS)zLm@M=uU(J(_sS$YR~EqE^zRh5 z7r@{2ZC->1BAAF)v4}i7?*cgO@IFhkH+pAgr*#Yg5z_$hg%+NG3hT2Ux#d)%rK+$# zQ%z9r0W8Z4M~<@eJ0s?1)Yr*;Rnx;RV|qq?b@7#PS~sNDpE`vamUO*-fQ0xT+sm=ZhOEKIHW)VoG@rhIN~K7)|Z8f zlz`7eA^uKO#9z7nWuX(>g8d9^M%%MFLMn1k5THQX!7#4ji1|jRFeVXv&pKHq>mkb7 zksa!2ViCcM5Ly0aQO;K6;{|dKXNXcla^F;#NA?YI@8sKNb6{T%yX9iFE6_(6P^?pJ zz^m9Sr&(&zLimeXau{>UqlBgyIiGEt^U*cQ(i{~}m!}h0;Krei|EU(acr33x)$=4k z1BQ6m3jpUVSsN747^{)xTF*=V?fb!oL$j1KfSP_`jvpkyAkE@Lp$3izDI!M>oyd@? z{Z9pIiOQ>qk}1n&xCJc`ti!7=konRxa?=*ZYkFxf5C#Zk(d*&vwyJKns4jx}ieSiV z{?8rEwShmY(F}t(0NUc$YKIUGX$H=TEBb!R)YY%GPO`M<1k42Q700Tx^b9G=Oy*!w zeuY&bf82TkRS$&TZpu{iG*{&ut8XF6U$WRL)OF|rs%%OrnN#kUlbypP$nRMqar2s- z)E=l0hs5x2H<;9(`LFo5_sFEedfbkMNBge%T{5ZAjS!)V51@K7nT4glS+(vzYXT0gaTHz&JTeA2VK?e2=bL7!BsIxNU> z{M7*SY1{YSa(K$FFa+D!rtKcR=l~h$UdRpT*eFsl+@Oj9yg2vlM~r}^us2eQU!tZ*)MiX#pAvjx z0Ji=t2_@5ZcObH*pG;pMQ)J6>V$($%0vOA}li|Pw+{Sq*uBu2dG;@9fiF*R#FLSoq zr2$#`R|SN$rIe(e!QV=z3$N1y+JLB=oV_e4s;10`zxska$j2v_9! z1Td#1XcG5#(`^oAk6TwfSS;cHap7x3rw0#bv>s5bC2+WrRjxmqNT8@R=x^`D+8mzJ z{GR*MTG7y|O3d$RkYH6qM1l&M$i6oID|a$b_<2vKcAwu6Aig_L88w(Anl*7=#A*(Kec&EQq+&HfJ3xbw*@;AasH9*Pp|+n>;UN7@^U0wN>bn)Uxqd=D$`24U zto+GOrSr|KAT7Ic<;qG}1^PoeVnc9I``dXVzFo($wml8#%;B-3pm)OdGH^E5C@vLL z{h!xgVvXXlK=~CNKpVmn?4fQ?S6j;g_G*SGX|&Yz$3lnMO(m=Pwa~StX0T+E|AE`s zkn{@Nimj)cyZegdwwl9NMvuhTHibw3CG^7bwovzSP7Kc5GTK7s^7;wUj?1{Cb@B5r z(PM@YN`~}$Px8yuLdGG!ok}vgz`iGrwkEx$KMmF;hpQ)hkh|-G~ zAVR~Wg;Mz zY8q3$Kx|=>s%~3fw5{>PkD0pYI-d$z!xgvL3G<0PSO)~QCZboimClN^pNkiA_=Goc zy@35z_?!07c%moSsPhHGv?17NJU1V$~R7NEBJCtIa=BOvvU7ZV!%NU2SH9bojEa#CE1b|Yi)c-Gt43j1XC|n~SUaf5BHeXz5>I52 z(Dhzd&wE+1P4CIxeb&1nn zV#6f6rJA1g~$p^F}X^Hg0Hi;g8 z!w#BdOw@TZoV>=&=<#;zQ`P4G9M`i_pk{?ArRLFdor%e9JP@HC+|wQ?6K|W2M9?Ma3o@stL z*<^Y&G_$bX4^zD>SSJ@+T|Bf|Bh>=yjohJNU8JEded95!P}7NZY^ZyP-v$LAJ)YHh zJd+dGctC2HvoF@Lw)0DCGh0GiaQt+zcUo}mV_D&xp-vJar#&0r!AY}nU0Q8^HBSv% zW{Hmf;I>^d*0HXu&4Ux2*%-@*Eh^+I{K8Kck5u5;9cw98GWFN-Z%>0D16*r%9mtMiNRVI-TEpzM3D zcqui|=H5U&Z9*$q{%B}JrpVq%_<+#L6qLAj8&2yDx>ncT)Io;uM5l}4vgwIWpXG*{ zLI0OJsm4@icl)L%F8+|ug}95obb2C7o*An(B_+cbC2nQdNFMCeVr~LyZTBJ>W8rP7)B>A-vQ<@0L|!?c)kxp){zK-KA04czg$>P2+*b z3YnKLH6H&1*{W43pG#)?lzP!CKi?`*C$J<%*#sj}7J zGN|5g)6%fET}G$pZau?G7;E*+-oi^=p)>N*44I0O_+aDl1*T}VHy&8Prgm1E&1_t5 zmQP4Mia+=pJ#j&^s5Ykz$QxIRYPrn1#yoFC?)HB9{zFDF&Dj&u@sX7*P*oOY$Q6J+ zo&4`Vqbfua*HF|h-PJ?+H~I@nsE6_}FLhDjRP6Xx)6$nx; znvIFk<3ETVm}2E6ZwrBz??jLPGJ0S()hCSdc9{!3Pxmkxr098C&r5ru*Ok7quE?IP zSi@Yiiex)Qj@)83e-$<)A;uK7{F} zw9?OSOfP+UQ`(#kzKw+i)lqv#M~-T1O*}}Wp`whX5MTc7gF9v!E_!p?za7eCHCcl& z(tm+&)b{T9UeaU1%{wGq>81LmXovKu_R8RzO`ey&wAsJ?0cjRtsZV-1xA4aM(ybZ1 z=Ax<*s)#%-<5DA;TiAVNx-~|90=~>GoG~Un9$a1g@+o68Q7-OGk9XrLatogJRa#N> z=$6i-INaT`k<=UOW~$lNA|qr+x!nY*3vD*{V!&KiuD;2w6Khy+K1q@tVO?;^s)h=Io6J9dxBjqX_K93!UB8URF5E1&&u% zNYq)maEA0%W8KL1U0!WY`lCL-=V(k|hTgS;Z`EIcN71qyrza4^jB%Bfxt%HvAHd9& zDX1%mqaXvPB!SR%qBe;9p<<;{3dsPWcS^H?c;&cDHTm8MVnR-L_lZZgA709t0rzI%bQ#{9<61`sI$ zs)O8lt5%g}ZZw9EL~b}w9gJH?+%qcx#sTYkkb~)&V_bfLfA8jlY~JLG~Ngm++;_+;l5u&1t+{j)`&fU7Ls*$m-x?K@OKlHu*8FxSL~YO}eC zP2)84Tbi+7W!FE)YkO(3|KI&kI-#)2_2zTA(()p~($*UlY%y;V6}!M`-T*1v^7Fs( z@h5rK%rUOWsma!KCg{HRNV*#Cs(t55w)Z4N(o|Gm$u>LFnR4Iset5=X`q|7NZBKxR zjCrCO8LpZ$CfGcmE>@c_zNTb3a?RTVHm2KENcX6vNoovS|&ORq-XpfV?(!O z_<-lv4GtghF+WW`;Qy)fe)ND3(<>G5N;JvR*r{prS)NXuB*%hfM5V>ZL~kMlmv#PT zkyYp|=b zg!ekvtdP4dV5jUKPLa4w+Au&>&T|6W6*IhqQ5R_z^Gm#KKa^vN|r?pAX18n9pQ zQ-x>LyJ6n`6P(gQyP4}x%YM)=a*nU!eMJ8^NdGs;qNzU}9{bvLmdt0^Ox+wE`=oK* zdUg#&Z1Pm+a*^u~1%| zyb;M5qg=2=*OzOIkwE1f^e~q~-Wv&{q%L3&+~)j}LsHttJI68EZetN%`MX1q4KH=2qN5@bXu_387VpTI5`4!qUC7k$V|!cBPYj* zsX6vhemmsRzNep)za$@4cE3KCGQHSHrzOZ`YuA2keanECF>3{15yI zh%B-}#7=W%-)%3DDT74yH$Tm%Y2N(<=*VXBeaL~aHZa(r^)$Lh>oT-8dH1m;{ZHNK_S7)IipZ`qjh(bSoGao!0uHp5Ulj|n zG1q7_thN>7d~G*Y#6o4Usni_w`s znlTYvPhL^Th*zz>`sze*St3-*3iz9w1m~$aQEes;0E>(Fv1?dt|F=5jqFJcdITk8q zvh39cwt@i*atBb>=Bk?k<)z;rKBtG@m%Co&;h>UDY|J?EWIHD%+b>6FD@$g3_g{x= zYaNlT&bzhH@h&YD?n%kHhMY8LW5U`YN^)2Kr<#8{wG_pg;AW*K!?DEEVb3I{C0L>8 zS5J3i_Itm{VoGlyTWB+`NkyxLY~PSdiGWo(v+f9s3yJ5%N& ztdydsy+$^-;+t;>Kfod8u5%V#C@eT?ad<04tSf3)7>;JUoPF0uawICd@L|Lo9kdN? zH3m0p_i<`&IL7>n9xBzXegqjpksufL|6a!|3Z2Y#*iBmupyIpHk$ zXkSftt+G!%4$y40&>KF7GlKb${q8dem8kc@6b}Vf)%)q;jL(V=s?XUaHfsa1K$iKH z7JyQQ`S_y*V1&1~e@MlFEgDKsUj?zM$a1A5%A^S-Z)=h3SOIncZNarE)Aj2UFcjj0 zX72OOEZAbW-=2{K$Q|Qi&5ir6lMv3WHh0n{B65SrM*WD*%<%-?V>xUJU-&J%417T& z3!dQWuHY6|YtyW4APU^#5B#@$u38(HP&pB?xETr($Y^b2r<|N}0}Y!kWNUhmY^82v zvcrbUD7iX-HT&_uL=U*F4bkI&iyp|Z>Oi3uJ30KVR|hB&DA{_Nnk4UEqX#_JBJzx} z(=wt5{8llU&WSuDnbL4sd;Ejwfm~}cJatN(iXO)j*Z7w~f<^hTD@qWg((wV#1 zj_-r%uud(^AO~NtAzM#ktvgtzw_t0qZeH*v|JFEHrLs1S{%_c}%n?HopYm|hA!;!Y z5~3Fr0FK2_iIK<~dxIzF9Fs^~c_P`13(|ou%upi@L+(wPnB}?e`c!>+@xIUdpDOV* z3>Lq3N21(wx;9quoKE!3i^gOop*`mu}Ho+wOK-tL@fS3%*cD2u*@mjmWlG_-Rn8Hzr$S zr4S@${@>@Ed*>zK%kF>ssbucC=bU@abDp>Joaa1`dYpSxZD`r9RNvuYBbp{Wmv*lD zox{d(qj6kwsbOdRe{eU&-DnI5+lZF-`@(T|CB}H1X-X=fst#ia?8naphn7rnnajCF zNx~V2i}4F_tWEQucHH~9x^y+B=}zDAa6{JW6Y0+P=ib!ex<1AC?r^&v!)aIjOZb-1 z$XWlNQ;TwpNGdsSeN zJRkQ`#6oZzwv?nT8b0_^Z=W|E1!qdc)rIN#G^XdYCA~L%hN`E?tTnpt)xh8suJP&Q ze^(Pm|5ICzt~=4Y7ge@yOz-db!}!pBn1Z_UB`)KBJiNUZ68vSeq91QY(eyQ=Yq!;& zJk)n?-KoAAylK{NCiCW!+HFjTNmby0E|bF7?MlLuyuzGnL#~_p^6Ew>&pKhor0dGO z0jGtIlc{iYhtsbcc%grZjGzd z52q(6;VoESPq0$`IL~*zOj0kavqOO}$G`5fiS@3I;>#{P35Y#Ts|ZDqL1T#&|w@=y6%yL3R&vxNo`Z_qp80k$642C-BMoayAf6l zkP977xh2gWlch!TQ?djyJRGYbD zk<4b#jzvu7!?7DK@a*>CZo4O7I%jt@j1TN#YJ0ekm@u_;X8i%n*Kn@5^s&9MPUwisWfAqEX|Rib+$9?%ewmHR2q&oCKF4LlCQp{Q);tW@m-&Qlie9s7Sjx z_kKAU>Z@Bzh_bCLJ{!|s;?z0TP$Fx(D?`x0(x3B%PZ!B`1b_$q^({Q_fE z%VLj}f%3Hyrd038*_i3w@4b&WHI3di+&P3bb7x$l)~lO59VZSqZxf!}+${XJuMBQ^ z#(QCt&CS9R`=*ODx;QZC)@EOC}E+M-bFn zFdf13a`8v9o#<~g4r$@t&lV$Fm6-u!02$t+RezJZzaO&vj!B8@YVixs%-C0n)|STY zU+>tkH$M~qNq-T!6EeheGQIw-8LfA;Kk2wbC1qPgYBBD=M}4Da9DdT(=W1ymZfz;e zvhH$6F%Ws&eQxo(#=FeZQjzT^!!)YiNj1|en{o;BCBlzOh<=Exx9Xem8^R_TN_6C=6TuRfgatl_>+o3p*8X2KPCc<*ni z$#Lft-{?EJ;3nUH1v=c((m~&IwwAJJQAYn7G&WsQBHEXDsMzXJ8eIVUgfuwD7?rEu*aK$U0?Jsa2sm#1=eVSlMVj($s+xun9E``N+3v`_z|hdy{#^DQQxD1Q`01lO z`L@V17|T>FF>++)me361ydNP0V_mMk-6y<^!R>knq`xh>vQ%Ogu?bxIE(0f=Bxdr@ z)aUWPNc}0|z+vWWk^Nk_GYPg5T|y*^0x0*DupN zUP^41bQFPyJ(~e2I#i0YL$0@V)?&WN*I|QIjfD@VdNy~QQRT8;!Pg?B$KxXhw0W-F zn3x6>h|Qd(BP-UW-%;ld|G8y<>b_KXjgj}z$zdWDh6k$ok=iz^YYo7f9`*syhJ5Fr zuV{nt;YYZohe_x<8riA>(+Nc>{dQm79Tk78y6Tp-IrHKI?80dy!}miW$Uu;X?^LqssiN;sJ$yrAZ%1 z9?OeINA@Bt${Kd^Sbj`ZPAl0;c5c=Lr;}?2`nfEfRbFtovWn|BMeIeJYqC&G;xWCm zbs?Sp5R{rEnkxm z5yWj_>@|5{qS#7Bq?6(lO-7vmjE@S9Y){}vREJKnBUEHsX<*2oen9l$D~xQh3%hBa zVq|lxSZ>*HZK%Zc0>7iv*xZ*1I-_Fwf)%#El z&0y|1-dumf^c3%T98b#K7i18pa&Geg=d5U{jU7V$(b555yS@%3W`u7K8(GXKVC18i z49YB2{EJzl0uF<5Ek^OIcHhNeIln0?teNIbFOhgGD|uC18=9NiyOdvWH5@jk2uliA zs9IyFAoXBzQ{}JISDM76)?9~G3NgyfcX)z)=G+_aI-r@=yi^Fc z0$$hMw|4HCg}n!uRFTW~m81?YrNczPSqzho*a?u3K!L1~fP^hZ9$yT)aOBAKG(Dge zOa*9Q5RAy{y-`fkMX_MyXf5?*TsiiPit zV)(wSmI{=m20l*IAF;Ri3W=%o>RYXEI#XW>=3eVNAFkwYmZXkVE#ggefJnk752e(ghkz&qe}D(XaAMcr6L8{Y z-w`6!kWhD)@lpK`G)901^(}FBm<1cu`G4gaW4YNpn_PA$kn4jpedL2kXH{zh&ufR( zsbYkJ6Ng`Vl}%w*Q=6B#8be64a&r~U(77-y&6jIR^{)wsmFkV1)mZ0H=274aPRxJx z?WO^5y{$v(wo`s693Y!pjm^e@*9{GKn-C^fTFsuHDD88YwE2W!)K$aAX@A4%^!h*aR?+2H3vu-j@Kby-14x8*qJ7$s7%?ukrhT4z6lN_X*&V0G)x;4)0}w z)8~0Fnf(UghfZgEa{{N+h?IQ#e2k>0oj8`BMzgB-fpucEz)VHQ%bhK}7%jlLa|51k~c?F?R%xCi8tS3oL(@?;Hv2?tcEbNIBT0`1zR}*uMy2k7FCofK>`?w z`PHjwP;*tdAy*=r<#Tm7xX;sc0BpNNa5l+fSom3V#l?W)h*o*Ukh9t0Y_)C!JzuTn3Nu>=<2EsZgd; z{%0|Z7Zvsw>#@q1PpdIwR!#LyKn>#lyM(>_DB*>Z0D}$rE-&`2{50Qr36+qS&BkdJ zh`yk;!#Iih)}zDDfIHl`_7@>~f^ULPn9kJ3q=|En;42icH^DmUwgOWTZ8Yc>pPrV| zXmhDKtMnsJ;0aah)Ll`rAvp&TdY<4$%9Q1iWmRW8MOTUZKaCh_EG7wC-8+2O&Y@(a`)$S6XBUZN7}{apk@FCk~b4OfNt zLyb;MX0w1Ynn^(#@OuRtZb~G(Qa{#4agRw6apszjlDKeoTf?Z6hi12}zld8wum+pW z+atO2s{*xL=GbT)k;#3@-ypNQl8GyV@MF1X`Ysa?)NbexHxz1gFaw=#g@a+k6z_m? z!Ed?q$&9`8!wUw%fs6%1{%4h~80?1d!Q~8zVP)YmrW$s!XKs!fuCtdZ;z2mVv`Y|m9C#oM#Ptz`j8LlZT!1+)x_84`oAs$of(#U&R zmzVV@eMzw2&y>SA4~8q;88;7scK+w=k!PrpS7awB=np(gVysTGI0C-^7@Ni#Y%T|Ssacm^H6gXlrpa8E#i0SxymXuz)&FD9J}mR?EJ}kF={K@WOchWk{(hk6kVu#JAV)G8yEQrp_~w>{C7N?t9lG_vNH8Abf|6#7 z^rF7xY-0`Rge4f+&ogqgF=?=h)MNv$bWxT^cK2Pn1K8n)gN=LrRPHNHu&StWo;f@j zc^T0fWc22wjxv_|jA33!ziPDy04pw$4X_K1&jG`<4dvjoAOP9GJR9?=(0d>5I{s6b zmJEJacq}=?M6Xty_n79q6716Eyy4QkrZ!K|NfE&3u#4!>t%|i8$L`uE8*<63>5e?@ zkbU@!!zzrFMuc?#={cUwLN>&8z0`j?&wGylbg^uBO{{m}d2V;#xv}3autJx+Bm`MY zd#mYWw<6fFxK_TsUz@AI5zAtwmdR#g>Qu0fU_kSJ0}CiV@FvR@$t2)2i|=xWWfj^lW2-KRuKFEdD(^6I(C?1RmW4oz z=2y;*M$65{!Ze73*vPjK;sQcAVJst8N644u9o1n>bo7m*0K3h^)D9!l;X{qcqJhz}!~L(?oT?wZ*K`=gDgNtIycb!VDrk6pIK?RO&nG5TpdIWb(?aor#ttowig9OX zF(wuonV!H4<9OXrJ;h4`m}7 zkwlud!c2u5mz$UJEJseIZjMB!sBPBDJamd;SSy>q>52<|2c-vFg5vxwrQTqhr)dL4 z_GmwtD#TjcY`_utv@uQKlM`sYqr)ho8^jShT(Nq0vw8=Z@Z-J5ft(>rb;9dm5--pc z9lYs;VszC}-{QmyX)OX6E@yd~{)-BUuU_~zeE+}=Y+u7&EylW6-wbwpnx3Rm#K~SAUh32b9rF_(y9PQ-Yteq4iICY zVF_H3^}lnQ{wu`DNJz9uW}8|#ILOKFOYq4UhlYXC~`1Dl69V7->;i>cGnBN0I=IQdYs0Y|_vlLBOm%grl}#gL1a ziEpxaqX!J(rzm~xPGSu@+geJ8+yn@}mJs0A;_tbR;S3vv+S2E5C`4@j30xgEiW-f4 zeHvNBY2@RotT@W9%*cb!PPb{qv$2F%z0DaS^j6^V#lH^UErFHO5l^69aZ1G3B@?|2 zmsSN9p*-THY4rTTRq8~opfxmqC^RZG-vtFmjp^E)66k=BLx!lzMbdlfXYbeejQtj3 zu%80!$rIKiqYe9tMF}nh36MV!*OC8@QOKp>wl1un0uh%^fdJK%uupM5!NfdG!}OEf z!S~}G9Ob1Zhr}=Z+ol+awW5<@dianK^KR+rcjGkOTnc`#R=6CI~iE7PU z<~F**iYGSebQ{&vN0CO!m1BxXM&_B71`d;;x=5rjv<14l5u z6V$Sqo`NOE0WnzG2vgc0TaFF|2hAS@WOkL?nqu($cU2|!=6Z%MzzX}OSbLuJax6Al zPP00ktq6eH!1}aciuY@*l4nOSO}LOS1-)GM2gbcErPbymDDXJv0_3d1^weFD9=_<8{0(0d*`5+Y96 zqW~*c%tYGQup}By7F;;6GJm8T`5Pd&K?*7;sJ^bs@=m_e)Wz142OC}O>Am}I48#&1 zF%eq+{Cl}8s`TX z^&`QntyT-oX|D_9<}vtOiWT*#>J%%Q#4eScZseT-*>m)wNZnh%sJN*{rvUL$!KF;} zt=+<{9SzepTD<|o<_2uTL28Qd(Qmq>bC{q*a4*^Gc=SJk;f z25QOeVtctH{B)YYBi);}m!Hq*pI!VEosiNOoiAf?xyg4xsN?JZtXF2TJZ!Zda%@uZ zH2o`hB;?|0+9JQeWyL2@i7Y-LF_)BbBpM^wWD65d(=RA!;`B_#G)`ayw@$LjJ^%j? zxlepk;8kt@5=X2Aa_{ExGm$%DFBz-U`s6nn(_~o!#&nC^a}~~1n}*e~Qef-!gLet$ zPRs#HBn{SK=U@{DA2{T8h%8XQ7kz;s(mqxxPZ+BxyXPk2Ub#7)3h)U&pP=LZNv3w- zK{Xd#m*guq$$o;)e{-`;7^^5{*T~xVrrYb~z0Ci-4kJ$N`Nb)|^Hqc8@qx`@V0`Ng zY`ujYiMW(NLzY%-Y0N4ab5lMr;N3Erg9PpFSh3+ zlc|!a=!-Z^FdzN2Y8B~QkYDXLbC3yf1`S;ew@5Rq-~9(0R6 zNJne$&~?xWOjO$olJo39`5l%~x!f z8nH(69kgMM0dK~hb{1~LP`c6PfC{#&{Gm&!HCnIHm)H5RUlQw5R z1tWz)dzzXs!1x>Pk!T&>bD^UZ!snn^)_5Uo2bhU<#yVeU_dlb;WI^;Em7+&WX5~<{ zaxv03OIR2LF;$HdJ3c3Ndc|kM12&>~dt~86 zjk_Bj>+;n$8-?@h&L63q`tGw9(02_d$=tpdwa!>9o@Q;e;l-Pe;2O6%p)BIsTpKQX zo!l7NwV|?9Uw6`GxBgMJ(Onkb=;A^y6do`ZyRC~q(;OIOls%1)S9p+3^AJ89C8A--sddX4SZQWQ{tmkZ4>E zigS&KT5;RBmH5YtJ=?jQzp6Hz+3c)Xj4R56QcfYSq#(SoITZ!?!PH)Ht`T^9n%WqI zz9N1tHU_&FYAX-&Wy-Uh6;++uJ?bxwsDoj_9sk1G+r`46(aC#@(ju@$ep2@fn^{CX z;hJNIt{lG0pfcT6Fy56Ufr@vvnx_Qn z*4P;d=Ew8EtwjGI~=$nAL#aMxs6cqPOaohSg`RnqP z7VKjw#;c`>QL0cSvtQ5UP-cGrC7NIh4rnq?reM5PH>V2y`gZkgz@O@yszbfDy2BD; zM1O3Dyi8;X>M`Eo7xb6y=4{<%JUHA+&jP?qi$@uEaCD}$J zC$1h`$2*bsccSdX)PsOT|6Nfz?I<|hY^(@1%qx84S_$Ut3En~-9wdabCpeb}9kmxuaupBdby=%+ zu;`T?n_kW!(wO<}kC?r0MWy*YxWD>wFIN6Y6G$c+KQF%A$=UR#pSxt*(`L1MJ?f^n zSOQuJ;iRH9fuLx)%{5E$yeRSn9`j%fCL-LtNbp*@VA=d=d1`7($EMr(*U?-f(H=rI z%R)vOcV?SwR)vhkVPkP~&D~rx=Jv9KWOfaAJ3O0zMz`F9R$_ix!9Eh!Vd72WqE1x( zWqU7wbL_v+uzI%NThH50>+*-K@`tVZ7utWVdKcR7t>=enSNP~=X69X|;PCrBpob_} zcM+Gz+3DXo{Q<%+;NPMrmRk6z%x^9C$*m!Kwm%>xjJx1KZD?!SHhdP;Upa=6XZA+& z_hGC2VXORM$^)kVMqd}ZF=bz36?$?7{wj3<`wdu=j&J4(Hu7YR^S)0U*wT+57`mt$ z&?)OLo>=Ocjg=ap_5NY&{lnJ#hs7OL2KvmfaW@y?wIXyk4E1V&sV>Ja)(m(R+q4{2 zb|>U#i|~6KMw!3iPU?RE&`-|4lPJM*a-;EZ`~5Ow>rQrtZ-rn=&3YRi=6JYZ>H5fe z2RrLbkf(6s+Am-@Q6K|e*Aup_ZcKT3Ik{uh@*N&6+VgZq+G5;2YqW};$e8W%)&I0E zPbx>Zb2OC#{xe#3pNb6XoV#UYRdrL?=+k#AMtqDeGT;;f2~A6GxsAERTUOOwts8}P zqY-sMvc$U6blv5;ZqtT4!woCEnRO0sC;V)K0*Bpxn;s=d9B)tTtnF8L3uVk%_CRT?Ve?QV1LbGa8$?P*!|Y zt6VHr9dW_bVogXGlv-MK;y0=Vj(GPo$XSZX zkqsX9$=Yeo7dBwe(?xT){cCOFJc6M@$gbfENp%SZuR!^b?m8JTmnQ;-RZsWG zB@zxq(4yuoi3F$1vHcPyB#1?I4@#6I-f;!G|-x*f>PY0EP?Kf|((>_FV`|ZJyhHK2n?Oa@jpa7a_H_k_HQ_nONt zm3r#eBq>w9TqtGg*XQif%O_-@C;r@AmdkIMKy%qe469{4A)6qlvWuHbCc?s5@0QZL zB^t~Hbb+L?a%z-0lnQ~gd6%}s2GS6$ z+u1DUVaSNlpMKWnv>^(hJB#crs;enhp~x2F6jLZ!XTJlrXyRLwA=A!O#0R~W*u=L? z5uc$oeT6eIKC;ZBOWD~b(dGE=7+nst772`BI3lAXiXG?UL8Wdr8@J-T z3S%g&xz(3mSaZK;^HbDHB4$!#v!`}DOYgxsw>G?WtWvyYZyhU&)&}B*S+A5{Y3dA7_D)~IlM znT6Z`H9P{h*;9)qB@s>(ZWr5{)MAIhr4!Ml=J76u+p_0NfTuV%B2u*EjN|TW&&7GV zR(_I^J|<6D*54l$nC_HV)6^_nG*L1c>45 zpJVvi?iS$!rj{ukk)1|~B~Y~cplH{OD|k)}S2x9RwK~hQ>E4mZy7CV(WF-q~B5>sx z{nL?EFq|Q@6tB#85+z4taBmEQOKd0Dkr*r*xL_53&%{Noo~xJ1xF~wMwBqlXt+W!a zUM9B^Eniyk_smv$3!q*mx01brwBqlXcrP!(e|dQ(-V=yC0q;w)JR3tvh+pCmW0D~L zoUy^Mx; zjBI%Ir#3`Gqv2%TFqy<0F%la#mWsEZ-luQ89k0#ErjB$hR)r3&|9i(5KH3blykjam zunyopl%g{<#)BzwUx54Gc2XAAeKG})L74i`SGtq@lT#XhW!5Et{CsQ)4Qs)}q> zvElE;U%9$=cGrfn;lZh=YD2r^WnYGmXhyXmRg(rBzL4NDUPqo|b>x9MnDCS8$aAcY zJWxmNmlOJt=U5$ipbp2mN&U!ktd2ZTN8<7%jz^wjb>x9M!eXV4Yie7ci|G&&Zs*H42dbuO2k|~Mj2y`-YQs|X9ouKT4 zP{ScUPcl626{r!EZ2_TVD5Kcsun{Kj89C1oKDQ|eHbihMy{#UCW~Wm|9>8J4mR0=@ zeCQk8R2RGiFg8e-w#u~k5`(aLzYizb*r+9cn;yZ2-D+;UleJ-AUKW4%W!~{Z7KFWb z!iyXA3t0|yx4LPG@4mo0pbos$3Yhr*l5p)>`Vj=-wnM}?A|OE<0()VEfU%aZ}LteZP~sm;(Y`L zi`Q^OT0!)XhOD+X-5GxhZS7dc>u^Ojzt;0Bs;Y-K<&2V%4nF4a;<(FQtWx*P2h7Qs zq~<~MrJ4LwkyYDv)LonLN@P<%FUmbT3TtP7=$#mTt#QBb$lBSbxf*G>xgcL$JbRZk zu0JeJkI|H+oK#MmUgWrUOp7ttZRR_;VPkujlaB80OtFDxaq9@5N#&PM;kSM+n3`!t zRKPVYJ~^4zB$-y#$a#gfBur{K&Xrjl%U7Bie8B!aN%fmc>QEw-5fdIC@322JPmJb+ z>UWm-d?}AHGQ+n4e zaikFY#XWmoe&*TfJW)g^ggD*&~Cr2PkLKvy=5x;awP5xF~G`Ao^vwNM8D-k ztu&{t$DP4ewKUiMk*9t@&jKZ>y#q0bomPS7?ESTk`JePB`84hRG~X9AYc*2^10Y7X z`P^!%SgUlms-2}*MqM=KFj}I5th&l@WL8#{o4@|Pli8H!vi3QFqfRaraN9KF1^!OX zha%MMvU!owRu*gX&yVQH@;O!?8`X3Es$A>2o@Zi*b5~jEmYLaO^-)c3-VQF3Pas*R-#?+epb|<+AMm%%O+n16hJ@mAi_0i^qfw@E+bVp=^njPg+MgWN{$y%3*Gx@KG z|Los4@Ouvb$zN_2qnPt6d7D4tMMm>SR-#Z9b;zWGB^G z5$i|S30ig3JY6>=&2#V}HBaIKWJfYv_*!6QiZ38h;*#^b=v9rYWX|@0a`iOq;1qchHl)gYbFB)-sU3IZN^@qFX$(nN-@{m~ zj;s5Shz?KCg9@qyG8JZ10Y->qm1L_wlZz$Zpa*tt1W|IO$AgM;YiIg~){=SLH$>`D6-9So zmRkZr_H$)Ki>Q8Q{Z_f`QampFQsYrS1Ak8bk+komOzC+)<=IvqC%s=g`+Z;9UpNv%{f%6w4~N}Rgm4%H9 zD3N`nRQiw*t2)!^1$O@Ko6>?0tpsG<61i!=@*liLgI^l*7e(6JQ?+pGu z$2$#NbNHNUjIFN7{YiDkoTASBqO4D<({h|TmloyuCV%|5 z4iM{|%Mc+)O?yHmJ^0dG1_aaEfkeaQH$QV~8~3IsI`^~&wR!E-Vs;DrBi+t(0pD zCRiBMcGn3x_LK`$5|K39`4XRWc7Z&REi=V-?Chutl@3K7Dg5U3sVU~~mSHV;`ubdK z@8b4&eI`Py!^plda?Es=$YHB;zrI6lAM1-&M#LizyKc!%=Rg z4Gu?R%#avgR3|RS))D;BSR+KA`@i9bivYFeazr*5$q$#-#1VepzbQtgkiE@SEQ`T7 zvn%~vZg;B%FDE>GyIR#%k9{e1thM$f#Yt=b;=hodp)@Bf`gG&lvbquk?pz|Q)}=p0 z0-$ggmbq8|8hG2&mlk;2@#@>;foB-doLl}gkDq{{a%Ts;)1==Lbi8{}N{T`bVe^@a z7yp53;;>W|9xzw^SVo==OT4K({5p4acDWX$Wcp{Pc&~u745<~knqdh$3G@sHjyklU z)^DZ*Y{WD{LmJzK)kwsU`aMhSSYWgk4F45wTlwnvn@FF=5Vzrn)GhuoYcq(xJo!T; zRiJB(W@kFg=JTr%D6nS1fJ*bX|LjbOd@D=DlwRdZ^WP|vA&Dxir`os@qt#GU2N!a_ z&U$*+7RnlRUt@alI5zq00naChUI zDJ0Bm+#|IMC@mm7W)^KkbcJ|)t1S^La!vOHU?Kv7TCpL(7}XR4@*>6n%jBC zzf9e}2HWZ^auINwAIht&f&&-@W;XVG^hVU18EEs|(0J;1sG#+Ife+Wz=fyuRUq!)^ zmQP|4aV}9Y1pQ5ESq^74OEI+3E0)B8x}L z-7o_|Heor?e@@%msnPBIywXc4-}vY|GLhWq_Q9m$w<%^mC_j9SuWU@oOX)0jfm5o( zk;?r=)$HK6cX1iC?dW+0LY<9AQLi0Wy7lG;s^xyGa6E}(rg=tWXO0+AI!Foae_mg0 z<$9Of?X8peL=p%5gy1l;#@P{`S6G=b*HvaEVMIj$cR(96(dSoP1Un1We#=a!eR z5*;!T^p)n8Z%N~6O5sl$j%;%5u_zG7!=eJ>Yc(4s(6IvXyuvXVjs$q&cQ9g5fBbgR zpomMS7B+0;MDKA~lOZvNV3aedsgyjV8(W(>#e-gZU$aJADT;a>HcYH;cFsx!i*$2a zLN~UOEag9;uh@1*f-|TucpeazRFRE-a@PS-5TT@y!@qvkKc@Ib!zohyAxHGeggwp& zGyv|_%+A;#?T$$90=+*{+XR~HFFmIk%I3&g0pWxi+chstT#J^iGerah4|swq8U7qcyBf%@h$`*dviqh8B_{=UD@>A0f_%8K71M5o3^IfoN(2sElEicBF zRw_^G+&Z}ckXXJSi*oEnwD5XS51H zV74b>7P$T=9ewYrsY;aQ(o6||>dUSQ4_m=O8r=MhZP(pet!wn4J7m?`zzJkyvF=^i%4*jbYVA?U_ZtCr-XN(cjL_cf)wuz7bzMbY9!h(Uh}T zwN3jP#$*2=Ow{PkR5&Bj3^`3KZupyQmnsSK%no+USCx&xmse>%RjYn_twbNAz9(xT z7dBif`g5_0{!ENg7?{K+b)y#v&4J$y+~Gs}Ar%Fll?Hz~7$D3HMoq%b5U5O|VEjt2 zr?r?)gTt8pb`T7r>dgvX`7+GV6WB~Wu6?h%(ND%svBXJoup-uS)#HypPJTtJQOv1pa#NXfv!K#DSyNvlzm5WQ136oZ@;zTa#&6qB5kydfp3p;+XkXTqhk!mcMV0ExM^ zVDx0w?`TrtB#-u8X*?QSKpJWtY^9Q?s1(hIfT-xCeL z+;-HH(U#GfXinQouk1}ePQ0$L8z;6|q1))sE?Oj9B~$EIl~v}pUNBM_s}w>RgPd~| zl&{KXncx^y$fs@jswuJOZ1p@X_Uux9vykysWV5tgQ4$}*Zqo9=bLqlp+N^6U9h?hp z)8~T18Vk4SbHOA0ZhrIws`{UqEga4hWVeEcwCw;5XYn*`r$`*2Vah}qD$d#Omy zHL+I8UI`3wT+~%Lc>)^;F?ZEJ)q5_zS~-L~O;5@98suZLx-w@HMd)avGI1!dAKB*pM(k4_ zdR8A7mDT$EAD)oU%QdAN_2;|ZPX7FwD?Qs6kV4}4>Q*9UZ%I2iBnN(j+#g8m*7shH zuihtb#{Q8vQhbQ5W#*j-jPMT3DUzjUt>>r9~_ zdPzgSUN|(kK_#2zmR4-MH#0mn2Ua##=(Z<8P!~Xujv=~FPMte4H<{S%yb<9RRz)^B7WsxSCoI2<;HGnfELmdb*Qxq1W2iD~YU#l(DboN^IzX{2~|!c(2+_L z=GZUU-29ZHy;-NWvdyXNvQO2@@hkfIT=!-4eS^oyIQzT~np6~;TMZWT+<3yXwcWH3` zonAXJdZupzZ9L&yR-An0WSdxOe5sZ)3@fVKCE!TdyItxR0h_IPhm?orqByF3U@p+o zM^|TS*n7WfsKJ@s@Gbh(4b`2=s_=TuE)rFvV*xpD7o?|1bdBZ085fasL2ZJvsyw?J zvcnySR}>v*Cm~q z!HzOe9SKwXR?}f$mVcJRmrx;{Xty~9t+TtDjR_kjMXoAr9F~nv!`PM!iD&5SbQ(j= zxm*mGz@khbc;Nq2qD)rOzb-w+^WE0=05eGOohwV-;+NcgMGo)iqExSwBv~Bdp&+35 zg*)zQJp}SNIUiUhKae?Q_yR8f&&$u{Vl|_C6IOUfdKLv)zi}LR(_Q9vm!<2?Z)s-1 zfy$W`ZZg#wxhhdiN#8}D-2`YwimGl2YMD*2iQL+-4?tX10w78NMEO$=3l2*Q%iP{{ zzC_r~1HOw@<5%uFpc+?X`HRjYIk|lH#DToBbbIe%r5qC!RW{Z8j&kJT%Mt#&1fejL z5oXL~8bO{}hs0Li{lqO{B)$ zC5Lnpx@ZPyC)*OKcDowEt!SrhM=utnoRiTdM@shlTQ?}2r5zdzq zyFqn!VW-F;G45NRgx&0x`D#|~Ed*M2$4A#YQ!-H?T7{>?3K>nbAmQ`f6a@Ab#&sq} zp=`{*v~lgMh$UyaF4R%tiwbvgw)vlt;Mys^O#d_eY%5cI76w8~!fCRfm*ne~DMG;V zB}S)Cv+z}!?>1Mqh?L}-wKu)-7B}tl`mSlL#oio!qiVNGFs>A91q3%uUc0Q&O@vHRpM6k$0BfBxt7f6mtCL#JwdHJE{xknck3pGTV9NG;~k!I54zlI7COU zep9&OfE@0z7rSx9grr6Xvjpoc3(ok1%J{CUh8B z*-yZjLrQ-&HA4ZSyEHKkh}gb?pr~<>dKJ~sICP&)S3*Vvim60WEGX; zY?V?GT}_kL4{d%Tgi*CyC_`}B!l=vXKY=oC-W;b4O%Q#fEfN9M6WWbZpR|pg@F_4z z`l&MAsteiMf624GCTrKwm+*LLd@B{|f+FFP+t(?P34c6cWH}JDgnH;1CfQ}r>9R_x zLQ$3Z9}Emy^6!?ssHwioRbTFrebv#IZd7HiQ7zaYF12=<))fDfD{wY)X2r;FIxWE& z@#C<_Ptjglc(Cogi?I{UKINUH7%0SO`LcwFny$z&U5^dZn9?cK=K}p$;{cErAG7$T zq>>vDTT;Pce~~lA`%nIzPBGo4c)wz$UCH!uxQF3Q$LriLq^CIT(=(Ovw)D93C5dE| z@4s;#gPS|AE{oH9r7kNk2RTgr4`I=AzNmPrm0gnzmwPY)*=Km9C*1f=z;7c$@=(A1 z=l|28{^Pul&OX#R|C^zL^x7Mu_ch@X6`4!)fuO+6a)%(W=T3DhniAPML*VA+*0jVQ z6`Ors7CD{g`Q0d*@Dc?($XSq|dwoAqds@pTVSmW~KlsqKF_ZS0pUivjET5d6_(?f6 zi_zgcaBa9%$Er;z{vFO>=#UD-lIqJj!Z4P8iBpZn|lm=TJO`y3i^(n_4E$tRHqGDEsueU6!))CDGmn0pR|G+DZ zAqQj*Iesqo)U}ydXcbe;=nRb#sdo}>RP3v3QBrYXM1w?M478;ytEXs?XK3~%bSeWx zDHC%3sO{(l$*yTdK4CP(>(Yn-I9K_V*;fpZBEHw;DVsTfwwY$SYJ%a652B^T1pPeO zz5(+AKrStB=2^}w*}ca%I+69$Q-!gKY2i4#{Z>GQ`$f%h1V9*pC96ObbAr}jpw;=q zlrxe2@f_(C7t;-#XB+JO22t9XW>^(kryxQ>=uwxrTmigu2T-$?80C8xI`l$F36twDP6456JYJuv<^$Bt=R!FmiIt|pp%{t$q zSBk>~yW*Q%5sG7>M44{h0T?~o{oDD|cGQ*8r5wZ%Q7kHcG4ZBXdW8#2*(Y8XE;FMH zW{5g*9yi=lDakZv66qRx3AR3&=1avpQB^y3tFCr&tlD_Hns*FHiPKElE2ijRYWExH z&o8eeMKSJ9#*yl}G5mSGx-Nr1J=JyN`159U-B|t{tFF6%KW|spUC1A^y6$t3FTdWc zuDh5&{nh;Q*Mio%)M6`L_)-c6>YQPcu^E4>t|R@IalE>Y{9ncismoR&>hWEKDZkDm zKXKl^y*50(Hgu)4J<#U9$@jOu`^wqaSKM#S(L1TqbX#*HWDH4w@Bx0MHk38oMs5SL zHq^h@w}3MzUB&mgO7qXRXh>X%mwcu953!CenbFD@vvA(V;7%vq;rCzpYihf5KhZ8u z7Uk9VE+-Mt9pY3-n24>7{XYVI6ntJ}+%NH8H~G$Qk2D;peImSv$AjP>fBsnKToNW? zhHm>nMjMr6hj}*UY6(3VYZ}ZZW;&&;QrlMx?=dbEvK;Hb#dUITT>V$g1 z9xu}Hq4i>j`osLk5bIo#hSb_81iUWY(I{0P0*N$?sePi(C9g77SypYRVw`R=UN>PI z%iHrPE2|Ba=0qAUEUSG&4(QFha7SJxP>2{WmJ$EZtRF3llJn%4<$>SdjmI`yApbK; z8Dc9w+@&!Kq|fB+QO-!iVoiYo$PP)VW0((u4iSiAABx-q#~|wa9QaCyk(ILc8qp)5 zAKAa4NNoL{`Wjl>gv8>tuLUghgQ+a@PMsH@^DMQVR$7r8Vun zN3Q1kasXuEsF&lPrx$80IY;QF()`PM3*UTz@D5mlef~2&Cht$ZG91MK++(i9%mx0m z5@v(vZu7^&b#wrT%Te|N4Os+EpUAJ6A$2?tmF8<-#G2dG>S=QFSWdbkjt7O|s+j5o zI`7drdS4c^bL`mBDGYT$?$rt0z%qicCnUa=`1ucr&9-3xN7W#|Bn1m|N~^M5D+bg} z5g=M=&bVC$O8S%Z?edzq;hZ6O(&R8;4 zGCAz4o!u5HJ<>3WgLMAZ&0aFK3$3BQ!4+6}L}tx&)tPF;K|O1NFDA}$@!d9HCqLtP3yQqV?H8fTViGFrL37U$*IuxBed()`*K%3 zXuo&OG*|PI8(XWk+GU%9(q^&rvn^KEEM>(~_DHO3ihMYi!MYgf-)b+1LJ;E$`Eu&<#&&tMrh zU8LkSI^Fe?d05=_^V8H2J<)Ghc!ml@8P&_8>pW=HNww>2r4CMgsOt7UR(~CZPR{gY z0J`Ps5nr26PqLWz+dbVR6$DSL;Y_9iU$+)qcXF8;k$5TV<+enxkMo6RbW*?x7$mus z=OE3xd+n$|>mV+DqS`X5TybHjZ0k!S*anP}Jq-d(`+v;ts-Gcy0nt`fI5AdRr4ujB z)gB;c_2;lm8Z?p<6U#%Eq&52ZRCW*9mFyYBJ`*WA4{j9x;I0#DJJ&(*v0#??OWj6< zZS%+fr6e`l|9$@5;!i7kqnt?gLoM@Co!;|Wg4de}KCU&9Unq5rEC1TQ)connL?ZhN z=L-@mV9}W8AOW?HYAVt^oLQ;RRk&p)PVbEADK2lc)^K z&fQx(d)c`i8}MRQr3Hs;L(9Iq*LsrQ9avBans_I^;v86x-CH}eVxh>|1EGqA9BYon ztpI6Twt=F3q0+M9R`j&Uu)(;r++K{_zJqy4%<-AVGHKeXqXF<(EzNkWMo2D0SXMhZ zP+jrR)IF~ZzS3J8npa9vdJYCxMU52!<4$xxQ7^fL?gC(*jZBjbubOh|Ir`*4J@ovi zY^t(>Zo!G=;f`0#$ULKjd!s;ql~wuGvS&}EnCXkW^vU zop_npwI882wH^!fw3bOBzn?+eSDM?X1BM&hL5Vst`JQ^SAF!h=*d}GmOTZI6 z#r(rHL-a!P_6{YBI}8)XjAy)C9mMaU3dz)TmG`NFz6*EZG+jI*B0HyxLxk2wJB)*9 zW$KPGO%BFd-4T|KQd2RM0c@1H-o;g^Yj%^`5=j; zwC^D|U)*D!6|YRR5%J3u>sI`0r6FmQJ8T?mF%F6a;_ECO+1nZox5ji6Outx_;gh30 z7PKM$9TqX%04~U-W-gvL975OB%D2|WD{UnoU+Y1)cS?A4plgNgEG{|Uzplb9WicE~ z2S9W*E2Z{DgMm)W?1Sm`zmtsvv4$--X|7-mxV=}(PQg1Bh|6Zoc$&S8+Ai3h*aLE3 zP50=$MX7Trb9n9zjIZC0-i)TmijR+<(=l?-M(&v4s;@(5`P_9Am-b2s4z>T@@^!V) z!B$UDvVnwajtEA|sb#55H1e$x6P+3!J$3~ZV^bAR$G}(_NqnxK`|`-SJ}1WJ_yv(4 zGKN(-V7;j90O!9}fb@f*hMj?Th5|3UsuJJ5^pDOIs{m^{m48P;;AKZrrJqaL-i1l^ zzAI(#3@6oV9NF1DXX$L2>Z~lOvl3O7-8TW#yrN(9$M%~8Z}kP*=YS}YFZFa8PbYcyKKd3 zG@@U#CxIEs-A=`f#Cu(3cGQ&$sKj1DisZyb7Y=Namg3y>H91cs4cYTkcJ+)Pxp`_L z*Nc}Ew|~@*kZhFJUigUYg)=6vdFfPi?3$O-Q_863ME#1<^%s|0tHhS7UmZ?EibP?C z$5@v{g~u$gd5qg$K+i^qhLmzg0xORxDL_aB$j%eY7c%_Tn8tUa(TT&2FS}E+QbP@U z&w@NviO7>OCV2_B-I0tuigF%IM{qeRP480z76O)w{24?)>AxodDjGL$!h0+_-3H`U zHDYLYhYtb$NRd0-j_S)fnwgU|tZXf{ClA$zf(;`32>K@iGTg8i<3FPWdLhCW0wMO+b5RRy|a-n-8 zOO%9kyKfhy>%kEcuBs3&l6y{Br08?zkH=bQ=L}w_aPE+xN}Grt(GoOdW@IZ0wp?&UyJuIc($-VkYque^YMWXcoF#pZ;+C4h zknv)(qtob0rB|D=+oq&)QN}b|4H+`KY5w-~Xla-4kATd&JFt$iTPg?;Ot(@iYL$ur zFI-LOG~8_a$OV3T-B-wjaVXs0_EuI#dt~R>s}4q^Pdt%OO4-v-U{Yv*qOnbs^P8UV z?T?naeeIW2bYD_&=xkK}-&FeyRQ?;PC5Vo}=g&grzg5RGhz?H^dMRN4IPtMWi4S(v zw>sEgtJw1B)Q2KlT9h@l;z&62oIuaSaCh6AX&L$-xv4l1mFE{SIFVi8TomS-MqH*G zu09L-hepbjf6%~2myOGm_rM-h0ii)9R2%jxg`h%Yiq=DrDf>mHoCSlEw2@yqlQDRK zJtm72DAJ!pB_aJuzqABOKc5{ypd3pSC|Y0mrh=0f0TLH0|Bp=dkO^<_UUaW@wf&Qu z%i&Obzq7kw-(8Z$ht9eLV=(!@+B3;;|6Bx*cO3N54auG>Sksps*?F#@N^M}ySA3)O ztI>0BxIwV96G5cxo&87)1d!M~zXIeM-})FKlmvyJOfN%Jdp0&J z8t#r7hp^>$PxL%c2Kfm?6fBZ;Vem0c=U*WW}*0ns_ zi=FYB(W}m3OBoJ{a+pYnw^dlnZSNmfE1EOy0}fH`aB*gBd(gnUhK&p$fbY!RAb>Wq z2aH1&(&Y*L0 zEzuqK02u4`wA$a)MAZ_WLS(*6q zMm3Bw>A`+~P2&5@M>M`5@nxoN93SLnC^^mw`eUp>6Hdc%ouEJr0E%WtSYe(|rkuNe zJJJsGNX!m18{86FYCa1s9aKjuVu@L9kIXlD_TEDHou4wU6ypD`NcMq-4+`i+-?ZhxN!R` zZ1FIUMZMQOwo2@3HhcK@MYxE1uX{4dUiJWm$`ZDB%9qGm&(?XDTJQE@u@tMH>m&@( zlI2S|T2?VA8v9qA#fEq)%eEoD$1lr<*lcu#Yr5o`-hFJUY$M_`k)~D%1=yLte@9sb zr^_QY#O*wa4RIUXKx~LVwVv@JQPuxdSMRYNH}i-UQThE~Bny{5!-=*&u}1*FEg|Vp z!;79^DMMl|jKi%qceraQdk>+Lj(M6?IvvaGc&7y&satcaI=eX@Zs_jredWE>ecI^w zNX+QiT>1;{z?nCdaVb$lTAE!(Gc1i;#p-Ak|3Yk)yvm~{_C|hvg{W1CE3q?jL29HC zaX=6D7hJK`M#QeO8WDREjEFtz@KnBk!M(N^NH!wU$Hy2Et}fH2;zmSn*jPqHxnXlLSR8J6G0<75^)7rFV(gsAN}o@%4-!&|t7JrL(o9{Z zWZq)2^dZIPh^VwHS*=HjLM&Xxzvp=W0XZUe3b7FW$hHvLdOFSlqNz)#N4d+ZIJ(l$ z$Jak)Aw`B50jqn(;HP=zrlm1n`5~+VLygQLc?y@0u>7e>gia++V$vCt*lAhv$}3U) zC(^a~?m{v3CENMr;@%PSFQsuqAA|oRj|pZzO7==g+{j1CZ=@t{;-ln8$(?-Xj85)X zoy3fLH2Eh=V0Ua0vF^3Ttb45`fu6oV>zqhQPoOnVDNa~FUJS1rqfSlSVxSSD-bgrI zYD;bfpjCs307_LK$2mp^&FT;?D;^LBd%up3d$t9?Of7g`#5kzLw(T`CsJuoP{P4B* z5>s(J7o3b^n%+z<(z*CBqpp{j7#E`HGum*Vdc3DQJBCBPbiOc%MQ>3xtdmkdy6SJ3kH1 zDJK)*{P4}z*DN?QfUOeph^@-HAE}DA`0X^z#H|XOXQ&n1mnoYR8ThQ5#0b&NmITGo zwnJcqILFNW=%Ym2m#}QC4w0QI>_2nO8y#-g$x@45&@j;gA?ldz>yxo&27`_Bh8G!v zf?W)2K5>mNXEUZPp|LeKzajnoU#;=k>{bG*e0!V;=Dv?#V}+dGkUh=1m^Q38rk@O( z^ZuR)n>uuYe zF6U5BT+3>)JIQ)S9=S*aw`F&-FhJRzMBc~kPC2&G>EP;p>CRHKIXG6dW6Sn*P;5`4 zFDPU&we4w$Pz+@;YCy*jf{2@+J{d-T`ydfUTbNQJ{zQ#~?2!**UOMD?V6((#QHJ1= zU9LeZ5J3}7cQ$CVxFENT8-tPzx5aZsTg;f$mTXLF9*sX5H&W|Tn~leo+w3bYqaL$m z)O7`9kTV`5n%%TpeScCA;AX4L{%bP(((b$V<&EL;Tj|qCkny6&iruI?yr=EWtc*R_ zi1OlgBV9__kHl`Y$Fdt?GkU_e&)#Ay?H(*~J}w9D))}K<@7}LjG~#KJ)l~vugwvskW_$1l*f%W!cJkDoyJbF)gTJg zWy(nv?vs0Ldrc{p*DYzXTG(s0rpXf324*RHjl3EIn=CGlmhSYmvDrf?i0vm}?3FVE zOg3Ky8SHa|k%*csaZd~+&0h^RE^+aD(`K1tm}Le)VlZ3=A6U6J<*wE&b&~dshQ}dW z|FHs&{sOEJV2}w=;fEaCWQaFR25awZ)5aH>pCtH|>4l7^w}mQpVt}!%FW6e1{)*Bh z4qE1ygB0zw%r6JeW_~%AWPaf(!TfS8W_~%Q%rD2Z`Q;>lV{>LH!%m}B6as52sS=PV z)nJ`ClRiz=m{$G%Pem7hnq`#LEo63Q*S^2MS^z8?$FK4k)aa)zugZ#6@uRowF#VQw z#rbmF2y@If!f2Y|ibKo@6TNC?xO8u#1xASCz?Uqd=wVbXr9G0jMjzoPs|{1Z4k7TE z0j3tNtStG6-a{pEG`gJfWRlVbm`_HjfB$PDN?m6U$`;2B@W_0@8Q7z!<2K%C0{RC< zKvO)s;fOzp7(W@|pBYouufm>dDeGcQA7B3r`w1cTGfr_uLrF5PC{1(tzY_nqn?JdXm?MDEt~@eK9GqB%zs^l)ew2r#=G}>J+vV-vviK-(VU$G9>IxgJ zXV^@VHk}grA%^JJ{$%8)GZ?d&Xtak6Je%Z3l1Pi5Si>K$vN3q2Hb( zBY{&(%!c&(m&2XQLk0HDOcm~Jw|Jf=+$jCw^|)y&uhS0Yb=vl}C!<4MySBRg7uBT- z0EFu$HwS71&x$K%ri3QIS4@TX5g*9Rg2R=~HBs}o#6p!g6NNQ7_huHV^#lf;-Z6ne7Z+6r2_7)B zCfDcUc8lC4(w?!EW=X7{#nu{Tcy9_c=&p9wmot z0!0oVI;{9yO2@PI`^NfrNn$^T{*rZ3?_xsPn|nRnY+%6WSOZQRPoDWx{nj@@s_wTQ zMgR-S1rs*`-AGJ`K4N zt3(BVl4_mCA-S|y8LByE9^k?&I!K%8&L7PONRmLjXPH{Gx#olBnv=Laos9ZE(7orZ zvkV)K1dP~DAVM4>qZAL=)^af)G8 zKJSdmk5De-~%wgj+9~xgD7&cD&8%|>Pm&4*=;{$)g2i9H|_{?e#)%0&T z@7eblC|;Mx?#*xwv%{7^8hv?1QO^T^;l;CG=TY8z{y)~<1w6{?TKt|{k|7zG08t`F z86+qQY9Ocqf=11R*b)p4NuUzYDrp$C<-{4JJwyg4!DPniv0hqjJyuWE+Sayem77#D zKtr%rxmZQ9H7LivIJ8EM5Flp0-`ejxw}AckJkQ7T44K*Yz4qE`uf6uV-18Pc2fHcZ z=gZ9P_)T+T56-bN+yrk0h@vB5y2YIq>B^rLmsOvZ0BW7~D4=8~od#|_H^&KB!%&zZ z8U<#v6&MP{_2&?nJp|P;GEarkDl!8*7RCYcv;mOjyA!}@R*>mg>wZsvOXvYwAHjZs zDZjL_y+E1IK7ub5PZFH_tzwWfpBw~lhP#-<@4Og`9scO0SWI?qa_iP* zG^m`#y)V>&QD~lF-~$plygdKJZBG5G%{Q66W5Zw90>?++Im)@dWB1jEVuTjx<`0EY ztc@2XO6pBWS-s~4PL5rDPT=I(cjX06o^#jez{zoUWd}}9yK7kBBOIy4bOPiCV&2iG^xzgqt(k5L@zbl7^ec3c@Qei|Glla;< z+7N5cS5zy$V(H-$YCvyJo(;V@InFoy=(0)Q^sI@mzHGt zCL8Vk8#5LrQ{VmJ>r6i^I~03}4{=?=WHbN3UiIB%V!e{)0OviS_D;j$pZyGs7rO{Z zv!ijA`7TUE%*vBF3ArS+NP_Zht~`0fQ&Nj7y9$pDOT$IQdpoN8JE{jdas!=?>wKRH zeFq(6hVOIHVV~z}AH8f$HR#Usj+H24`1&g}+cF!r<8-^T$KpR|wnQ4X^UWd=&hsoj zi*3*_+AUSa0}wcl$S^G`nPvADX;CppyP0udSuY=5pNrrsy@{8dACQUQVEZN$q@$5o z9Vn`L9C|=$%^etIYY9sWkq7WcTiiLAv$dOLO1ixe>0v*cv84&h zyOx^4b%s-)nK<>i9JbZuyWQ~gmXO7Zqc|L6_(qGYInmI6PlNtl=@}l4f<~Ak_ZZGZ zw_G7E=N*J1%-&?CVzc>bJVH4)px_IDk^^aO5IjOEFZu`&lUhY!uwyzRn!Vf~#jyv` z5+KAVJg30-i_HoNV0%$d5!V}r`wN5)G&2WM!XmuHy96&n%G^{ewo8?Lh9&|3I7pqX zzX9Ze5AyKie*};i3ojlVlm>0;;@_OMK2Iu?$xW>9baIETuZy(g`i@Gg|K_Iu)B67M z|F*ubG{jGc#>Co=V{Ok?Yx@oSn<$>xz=r)rEaJ?sUckXGWdW~i9DkYxeEx>?1@wOP z0v4q$;B){0E+;YmH~O~ziWO~UMU%#Cc+C&wFu_;%q&nAU%h`-X`xEm6cxG zv;)yG{;Mp`2e%LY$^W4xnk_#b+8$nfHrh9RrtmA`V^p_qyq~%da@l;zi-&>i#&8Q4 z$5-Z?iG5&XjXVjL980g~Q+yL!2C&52dL=6f9=q!#Cqe3H(W zUZ)}(o*x(W>76%hZA zl}gL}C7FtyRZwb%omCJLcGiH7&dwe|lAh3xIl}32vEpbSdCcHwU5H8yj@I;j;b_;8 zgQkG`-_m5^`|W&Z-z5Xt1&$QO84WpHCOp6t;V9%8U4*mQ|L%(DF zcI3#7&R44NoAA4PD`a(?8zRbYL1ItsmOb@r!h5JqBNi%VXa#WPif^Z1ijoRSsHIm~Q8 z5458aw;g#+?MuZN2a9@*DN^oYDR+sKyHv^*Nx7-P=WIC$)!d2=mwgX>n?*3Qg78`28IRZA`2%KQp@$?s7 zJbOoA0-;e&-a7@YK!jYiDh@ez7uUv@g>#H*m<-P51+0AbTeuSUSgifAD|T9GR`D4u zrK6uf^Csvo-9P z+>qbV&=<9aaK_V;FUY2j>zJNdCIWXSP3yrG_A;8+cLtF3vTF^c}T1ArpMQpkIf$pg**$T0j(Yo`^x-f7}q zl#}L4=hm^#t+C1Pw;fnx7en4F8#`t?w~lgdy?pXpffJMNnj9|A*usgJ?;#4Ex?aSg zeUp0l5ooIg3r6v4lte@hS$=c*4GT8J>)fiC-$Y2AbW+^q-f!-5zr*KUJ_q=`$LFtn z{$|!zhY7vrE-(xK-{WlkBlzpFiPFm<7nrP-)U!=clHK7b){UK7h*HV(}DXV>Jllh54n%k5FwNYGs>Z66IpNQ+LOkGdI`nAq-xGR`L`5e}28m zq=%&$hPbZ4a4jw-(Y>LvY-Osi9Fio>B=pyiv2bA{y?JsHfL8jr&i{$fQzXA~$_{HL zE*T3Y1HSkL$;d5+6iaaJ^NRuijdBft;gU@sl1i z?~WQ-Bv>z&(N#Q8%=gl?4ihY6S|2w z)Al5XN;QS5Dz%4a$_iCh*K2d0L_R{$$~^)YND0+YCY*#NL3K3SbK%0B?rQO8j&SV8 z!&!2xJKEv9Mfna`Ed0Q&cwC_REp#7pmqQPAB<^xI5p1wT%*U0zzm)kFWr8Ev{;j)K z;>&YaSx41e=XyJC4aB9yf-nvb3d}I4&Ksb+#T*)5@Y@?IbtJui=5H&l(>-V{A&zQ4$p;pF}xYnYxQ#zG~iLPA;Jrd zn|rzVC9+#z*Fk%w?v{SXKrA*%l_Mv#r!h1)yyMorXcgUiMmJep>{vI(RG+wMNeE(F|bbx;Rzd)*??j*yHS2;5}Ma&t&85QsW|aF|O{ z_$8TAhkI4Xy-M(6yqa#E&*s5HYSI_I;K2imZNghA&974XzpE2aNDs}CdTq)N;iT)e zmtI$#biMZD+r-W9nWRFtmMkTbgmMuf8|2BgM;=rxZV4=I*gdJfT6^$+gyc4be7DqT z8{1fuWo4#txSMHrxTmv)LhjWaRSQB@t0r@uDrGB#-7c2?LN~hT3t<^^Lk(qt3q*FY zxWNVA15ztw5koXt^A$1QZTiZi5dF2pn!iqVJb5AAvfXbB)~<-VGj_~eU?#fIGpZC8 zQ{d)pq1sYvSP9J3v`HS#@a>+v$qayTo`kdSj}+Mr^gDdM8Zl__?i8oX3B2Pmg-4;6 zgJM0ksF2A0jmy+BFZ0cYzpPA>y~0XW&K z!|u7&FmOI^e47y7ahC9w1u|BZDuC3kJ7sJycB_+^j*Y&We;aCPs;|?YLMBzi-=C?o zrMp_&`*$H>-OTDXNuR;O<1;2D<)PoiV#6c_W6?6f12w{i*C3KY4?xn}fe2N9!6;6* zV0Tm%ch0zWz&Cb=)pzEMYi+)fct@FQb(eLuW(Y=^qR#XLSc*y2;Wo)b>J#(L)!RSk zaal_^*M$N10^CHG$*KjmbLa>tMgInpxe=PDF%&$Z|*_YC)3=e^HCKvOo+ zc-ddTTy0q!GpC`Ldv2n_>JL*k$?H1S0m$M`ec8&{41v`dxh8LYcy)#;yg0)G-QjlC zUtM3*B;7+a;zT0eP5T$ZCaVh|Q6{n)XIaJTYhwo<;h=<-FqIju#tW^D7iIx&x?k&F zpiiU{*{WJp)~&fc)UujmVDipzm8!Nc^)}7Eh z=hiX!;hVgtZSR_F33H+M8gfs!?i@-;7F{9Q{iVi+;{MJB9=v`MzANy@#d^ru`GJP< z@|29kUE6aP#Mt*a?^GlWnzV5rsyoofu+Hso48{;ulVP8|s&nGZH#gKX)KHZ=5Usbd*(qrTG zQ~kj;t7LrAnB(T^&vWQl^&DEGU5@e|{8N{kN0{~Q6TG1s59bm*>4KQ=1f#Ff#xo7U z$4_FuXgtk)t<)?8(u7Pp;cq!%YyQLG$KgW#EuU~x6H8mZ5iRRpzR7(i?0!~>RC%)d zn1mBdIlyT=R>{|u=4cw`xc`&v6_hLX%Adu^yX|k1jg`gQfj@!G1zJ8w75S( zeCLP3W-%sP zcCc=Pwz%f(04YWWU@Tl5vwh2lYA zm4XlB=oqy7Wce<+B!tF=%gul)*IIjs)WOIHHtU{S_c}TrJ>yx>UC+S3+GShfIgMmJ zmzK37HR}bH#cTPYP=g)JwnjkPTRR<`_p*OwoS)?7A*hIn( z54t~L(*&zN5guEDJ%xOLF{V&bKshZA%E|x9kyb@~BZox1@S>R&?P@g(D4DmuG4gbM zj&z7__Or-??x^2=9FAhY&b%KRfr){1)}q!d{E~n{M2lzCd2-{;t(qq4; zc5Ay#nX;2usXc0Uyo2OJI5n2&zuSaM;LC%25#4Ih-w~(HB48HcuO0_OhHExaG4667 zwBU8O{kE*QQDwV$73;*-M!&#XySmm%tUI%Rqq@X)xVJc4ucWkpqlCi)@uudt`z!Lr(J%NY?nS!E=Q)oq@KN6Zp(nuCDNsE%Zmxwp|?y(U|&L#X1Y>H zlDvXKC#3}z1%f5QrGLC9C@x&R{94|nXqOUd8xk>Hu>A{k$bslV$aZmO$vUxNR9fy2 zbylKk`DH9a)cHHy&(b{k?i|`j3LU6=6RnAGxe1>7Ic=Z}VoA?^oH68!=IL)gmYusB z@`?sDa!ZkR>yx>UXDY^|X&dsd`>ev18tAi+GuW%qiyE zU#HDpC9oR6o#ksWAFR3-Ui{y0YF)Gdxcfr2n!fdM{Xfzi_%>?rj)=Om0HkBP$6L9& zDgQ(W2758PvBZhnPH3Av7Ko#W!-e3Oj5j`tHurnpLb*7IEq&Pi98yOQ2fu*zTbEkV zX>va&f;+Q37|^aT9EiRnWaoB@#(~?vDBRM+8uHLh)3j|kg)l_G(*D(nb*skV1;DYC z4;M=fi;Cr&y5wgZP=`ixX}_^umR2ktkanuBpY{+9NJo&zY zd}j#E&fNyWY(S8mhi_K@>g-K^W`U3DyWnLGsdjX5O57fOJ#h-|yc->6;u*YW^4Vkq z1X|uy;@@z~lg>7YGo%n+;}KnuSb0xR4xw&le5an%cx+r8o9dIOH0EN(*wHV#Odq*S zCIgS2HLkB8g-py-6Yi0!l4bK=N=pR(a*L(0|5;yp^uri^C+YU%b7mPI^6Lic&M zgj5Bq`sCDE!7WrjlhE{-$qzMp=D#IF)KnA}xS5Q2g7nS<+`>O4u=FLbOh?|O*&7;(&pQa`WvTB^m#qPTor&)MXyqkC*LOL*PDd}&??^&c~87}CN1i5 zTaB=-P-uDT=0b#~bv_I(Xap3%7_k)X#hU^nI1&QkdIJ5$zH&)K?#4okW1$a@hSCOpWm_@=yvNw6paJGATo z`wg<>gYfD-e6~Wr;=sY|PbB{CG8u;$4$sv~{fbhl-(8SMsDlK`;s(SS4={8c$paUg{PayN7LgIL5e33KKR`s6RA~^VfV+y@OCAJ7apQVpBEzZEsS2h zI`lP$>ido9k}lH~89dBf$Z1Tr<6bq{)6cY=nPOcFEikn0aPuL%7gkJX%?BXDt4Tw9 zM9hI>Rc|`mZsNDHv5K;fnZeC}5hBgOo2ORw4>G!hVz0Nb-ZPe0ZkNzEneSX!ljMH5 zIV1orQlnFDZ`bbhE1sSx!>`oTb*+=&&}Qw8?}9MnW5ExTU^Et57Dl4n*xc-3uOMwz}x2 z64_DUmdik2k>|C6y)uav2p>hJSfh z1so}I*wIdP(HLohm8|I~zYGo+J%!5(ZyfzWr&TtnwTLWx&m2@>59yw&yim+qtPItM^ zIF&2uosX?q-j?YdB}|%EpI{S1Q7qg-qo?KrOndK35H_uJl}!Tmx|-y%PSwx>Q$&f{ zsUU_nmJ)JqXz%Zii@YWC4=;ZSdQ3q`hJTj8vT|qvFBrl!&&AKT0`-%pfcke+4NyDV z?jchj-qW`wz?~4R%8SJv-$nplF@U*KrY~bgh0ROUh_Y~1?tGbASvV{(MR9gvwRUY# zCWyXF4QmjptqePI*B%!;s}^(-%B_2>-PWqgVCxxD1N9d9Gw8;}p1TH{s@1Qnl_;0; zYu$781u>-K(^!x|%M{Q?o7kWMS|0NW=x<`WHQL=I=_BIs`F{-RilKv=_HPa9 z($fwq;4T9vD{UJEVuFv(d*=&#>YE-1$uvaFl9|5GUbr+48RXLfncsLM!NF^*?=P|j zT>^V0PTj2U7MvUsZPb-t*#&-uXaM|QlE8;+v-NsHssGQtvp{muzvB?n`6%Wa5 z1SRI>Nr5dd=?l2 z;e{Q(5;gj&^We!&EyB$(QRLe3!nT!xL)z5+f<7V?zTnhK6i}@$R1Np3S}v(|@xNc| zZI{6!@`^NvDa;sSH{quJs(dX;MRm*>(QLILXnACXaMEF$!-fR zD6}^QHmd*@-g82qZWgi=`KM*Vs}nvWyuifR+Z6mXr`NfmYsvN?4b}wr?EW|yDKrP) zm6%Qr|A%HvXEw0_b@$^-Ztyz%2W^&J{ts-~uVzP-1%+d2pv(-0Cw4l_XzFDKAN=K+~wy3>y)SWhJ zWO%X_lK>x`i{@RO*4qp%9U;^yk@Q!RILvfEU`kdMA9=mA^#wo`ulvNe)m{(_%us)` zm}lkbk@$k;CB8yyspXDL|FZmnsEz*zgFFs{paq^R|H<6uDgF<8`MKSY2I*QI@Ogcsm89=U{Dt-Z`;BsA%2U{-F6+oPvi@^^*byAd3$iZ7rG#7%ko+ zh7%8m*b05wAxo4OT|TYzs5{?G1Rb9Xy=Lz@C0C#ACA6Ye zD2$S+-npSy^YE2>DcOFptQ|gmVC_*swn8UK9<-#pIOGQe1CsEs*Zy{wFgW$vTz#-h zma2PF>L}o;v=>$gi7!ZuOwt}B4Sre8E$DXD1RDxFdony_vg{K&qqc0Y9N$H#X zl?-g-i0vI`*h%`%ln|K)_>Y#GeYsxSbLJ)6r*$ro9ht-K}Piwo6t8}oTfF?X6PT#{`N_d=};jH%1$}rHLdTOpOSM_HBlmwO<9t_k-R`vKP)H=Xdm%!j-Y<2-Z3XSohH-p=h(pYB=?Fs zGAJic3V?|f0O^S9j^1n|YD1C3j`pfS3G*gS(EJBwZ-m{k>Lx$+!@eW!RbS4Z9~yW{ z>NP&4HTmUa$(KlZXR@kc_aHba1t=OXQ=Tj%PcLEjm#3C-CCi9Dj0(3|Hl&?_HHp6D z7MmE=kYfK}GRBZNFDQ2M)b4i0%lK{%yHA{&|I0-FwPE-1Q}a6#`4i+x*fVsf%Mk`HnN~o}Qc(p84LFz)WK5WK( z){Dhr$tqbPXX{9A8&+cLh4FrxyF5C9&j@crnYV#a>Pp`-xtx?9@U(N*3}_2tx0fdsuvn zD0s*N?2x%GOIDD}oZ15RA!V*kmT{>vz+-5cbCP8S=tYk>JEWcCtiOTV!t;jQE@m*a zp*NF-eorBpLFHjtNHv32z6@#g=gA6pt75FEZAh6l@iM+|snr~szci75jT-sT{HqfA z=gEM|hcxd>WV2!Vu^Ukjg(?teJqJ~ud=PdoL6X?daW$=T+TOS}w2wCfL#fC5h6Fqx z7wnLEAC1_(His>mdo+^e%{v<5GVZWPEe^}zHvb80^Q#hlJ-FNdfyHZohLX=&qE*7w z5N7NdyRWQum-ouny-`HGX>E_x+iu;pie~Lzr^BYVwm+KbQ1RReQs+K2AXPfBk%VAlgpOY#Q>!0+K)7pL1?XrYhvzH-|!NvxL z3qGaOn-i)kukOr6(UfO3||Pv=2z5C{xJw+UX23+0J7jf(aRa%r~i8s~M1spyP(a^8G;lEayUzSA9?^^yPa^9GZU9Ej!+=}$H z6{LZ2ik(T%sUxRJ9L=RCU!_-2P@fn_(I~egIMh@$e88?qa~uuzV}Abpz_Nbj902w& ziHnL5$h9>=13sqT(<5YfOLn7{2g%|MF#wrUI5OnGw3eBNj9}$}3ckGhIMK^g3>NYOx6a+&5n+eq@>Q=8^qR&U} zie3pdXWY|i<81Fa5S4oEbF}Rk9~Z`Ytps;h>c;3|kNddxx}J!4Vd zhDFajy1UTq$d2at*Nn8`W(=K}VFCt`aHO{Xm}=jk58=|H;5{PV0w%h2%aM?7!D1NF zEk{DSzk`Gm@Fy!Rp>33y z9C^f(x9HgMO{O2?Ou+5n>e@J?@-APde^o)YH{Vk<1Y);|nhF*HC^;BtF?Fd3V2mI6 zYGa7*=TdRq8g|=7Knr0{l!*1qb4XmFS7lF0$-Y+cCFuXBm6()L;>U`~Nih#~L9jd- z#1L@2(#;i%!yCn(&!2iyyS+y3>rk(ngI)9TTY2Wo)sZP&Q1qO6=Cu~ju(6$m12zZr z84B9b(w~63QSnX$`r`Y}h|P=R#3DIE{A4M8-;EDmp{g0P~NRo6F83})#^du&xj1fFvb$)5q4wdwB*jc zLkF#qy(-?Y_l9Y^LJhqAM#6cB86O<`7#%oYDbMJcwcB^qV8nksulaqDMQ-Y1)wZc< zG+$;#?%-ZMP~9}KNQfv+GrcSbq0#)y>P$%}6Q*_Dh%qe8Fl4*2ZI^d4jCDSYwMP30 zUhDjSvcc7T-k9UHWDf{_m-dN-Hx5Co= zSDt=3Xz_b6ty8$!=giT5;b=KAa_fYN6~>!`j1DENF_&h+dp+?eTXsm&hiVs>wsnfO zO8mI9B61k$SoaE3RmGvpMhh=eoI{$^xP9F=vZGUURyH3I(h$z9Ui-rh>P)iNYj5{U zXo^H=?ZA-&HC%PTFJQ}-e-akdGg=-(;>9OZ1A$PX9?|3)E7na*`*@SDv(B2L5wHmItxdpIdac%b-# z%X;cm^+;C62{R-kUy56Yrdo{R&Y>BH*$?7J`F!-in=bMLtXkfzQ+vu+i(TH74PVeS zb#Hp+N!o3)OU|fYr{^3bhsilN_=TQEdPX&!LF>hPHWwAz1bqzX5;VH{G0wERI;N=GXx4YPmYH}OQ?40tl!dNvFFTGfhJf>=8RnF2wp#O zuxh~4IWy9H?0GZ6y|2$*nG>wfwd^A5_N&eP%GKO}hd{VPAsD1BS~@z%=ki{s))&q@ zxs11x-DKlTRo9x-oPFd-gF-};ucZoJ*wru6pp*4{T zmgtLkyiR_gOOgxS8?LAQ^lZ7wIG`)}R$=Ar;qrDXI(-xhnhLXyUTtV|uyZobevJ$9(EuyNi6u%uz!aiYYg$-1B6^I8Il)OwR`=WCBBLpQmysNbM1) zt8LNqS>w~yK7`Uya1KXrS)tQor|rb~sV~6}J)ae|o~G}o$)zg1GDtZZRW*qU7pxjh zv<=vYJ(|_s+g{b@clTMt<+&5l1r3^T(b!&PC4`CMEqc?42B#rnpS0?vq_;80BG$t#fgYMBYx$xZm zHO{Z#J(wJuo-w2KW1K~aWkk3G-WsRR@3HYis~K)L+-iT2Dhe4vi4lqNiL&=dS;0J6 zoJ^1NG!VQ+nG8a2fF8pRJ4|a2a&G&-mvLQSSMSy63tG1U&2Ve343CRu(1Z$(J<(T3 z)uBXp`FdLb!|I(J#5rQ8z?PSaAiLXsn$G`@=@>hl3R&W6)b0c({K(O*RKxe+yhy@s zM1XE1GUjZ%19`4`jIrqNKoJhP%(FI ztg6@daGZT8+Usn4nSOQN!R2iGEkE=lxoF6d+ynshBiS|NNS-G-XZoqQmD;HzT&7^K zpvjR72T~|>&{*iXWHh}<75%Pmq+U*{5p*I+CVuvTz;U6FJ!v4Bu})>U^r`I3FGF&C z3;b*F9$|yH>ex%o&bG}N2Je%0K75_3O)D&tmD-{JwCOy-P;YATchoEvHi=xi>8C@c zIA7|VFFDd}YPBmQXOiRy3!R#Cj%sj0(_YEEW>I>kNvgdmIk$5ONUipfjQaJ{)p<>U zVnLI*Sv{rN@1)vWlCy^YQX70oa`uy$4u-po)_SGR4~C5WCaLq8g7HU25{ zz1V2*sAP)g$kajPO0}{aau&evrRE$xNX|8q6MQl~=RI;@?3zkXS8c0QyYh6^o|2pr z$q{3#)UHBCgEPrY2gZL$9WSWT^sCzRI`xt>s)!u_5J=26TFY0Nx29KfNwvQTB-ZAp z=VX!t|E5GKa{k+$ZR-R_Van1^&U@dd358ih=dqoOc9Q~g(U2Mbk{q^?fg(eCzE`Tr z+?#?!xb$Yp(XnwzorS8w1;zpmsWwZhWlDoX@n^i`jF6n)4S`yg(cqbq`TCH|k7df| zN{)DsNL{+!lJhmmnJ^c!}gplbkE7({u8S1}~S)ISbM=kNu5muL$Pd#nF)3;9n(2 zVV(#|Q**YHBU9Ef4^c;I=F?K`T<{|O&huX+qwo%Ml_P9PmtPzx+v~dga;ePG&Y2^8 z;@s2sSEK5JvIWL%Q?>6qJH3aCrDGH9xaX?qS?Qejs6-axj3jM8`B#}oNh)n`2NL=* z1);B(S;)06jjVg$qn~X0X>tOX)b@T&drj|Asp*4}={Y|nXQOF~2yPZO&bUVus(lUm zVAHtO<&;ZYs%=f9XiJHw@?edI@WkJhVaPMlko0=eWpUIJ3`-rJLxyJ>!SITiWopi6 z(w0SX{&&by?>Acej$jCOhiTPbR@DR&Wsj!kJRv!X{8)xS;vT)hRG15`)?uFOY!jv7 zQ((zMD-!;SYzP9u}P`TmV^JGJ;Kn??bu zbOQdIw2~*u7z8IV>=8*m^OWSfNoI}wYgSmei^#1CxmU8*C=7C7>eOSrQZbqYW62!~ zbwQ<#Ns#mSTVPG`0qd(oHz;{T)CZld2LNBmBje?J+Z*!z(cFm)+S#^^A8`$>Z)lCm zN|mdchSyf{cDQ0>$&ydJH*zbo7`|9@*`;uLS{s&nl8m{5vTci}->xk9xbNWXCOxNy z9Nut=<#d4{ysInAj1R;+tSCoegf(Yvmk5`{FL-lEJi2M6C^;`u=4>&u49C}BGS2%o zIVgCSGCU+MVb@2D?jtZ#KNZlEK(cTcM_Q0(^T9 zL3A*K6+nG_v5>HQTK5f`h0WvL7sfy#pXRYn+l9K)Qu@lo!I|ZGv)*di^}ZuZmk?Lv zqT~#3a}35d3c0O@DHlk?&rX%be^M$aF)9AOiB_Yi;T0rxH<6~|Osv1XVVu@cD#3No zPugC5fV=nP?cOK zpGb6Q<;q{>ELS!M{(+TQ zYnKgRHxesp$nl<6vP3qzPgADnB50nf!dLGjo7wE~1B3h9z2#Mx>Cvw;tIG7cP*AQsQ_jZw+~f@i_SdT4nzfNS0F|sm}xBEoi$=y;duW%fPMQH}TkD~W8=-n=omt^nz zC`a$2q`yvhdR-=KPsn8L37M=tA(OSI%4Ai0BIZqW?WakW!+0(8Zz(FFU9)Ext_H%k zHcZoyy;32q&RjK&lB4U?Iq4lE!m`vhr|84H!BCx5`WT^>T!?81@?|!D2D$CCVKcH){UdDk*H42R(YeKoDlJ3$r}(6C6QIHJwmOl5FC6)$m#}m zlnTx9QjKnmJ{qo3%I$~c=Aegga<=`P@9LCDc5niDg!CHcH1#eHktz}plowFgl0$spYMDuX9NtLPsxaV0 zZ+xR3f@{MrUslso#k@CVG}ZD4v6NKSH$t_x2ucsI4K?Td#M=_#-W(Vw$KF^a9#Dl? zDpv)qMIx+MR^9z3|CTGnGZ8XHOl{Zwh;K0eBK1b`0TCDyEiq!R7bXf6>Q|HnB-nOB zsF8TjC}lNMb2$G5A6Yn&b71~WF=Uh0uJ(u5^DxkQz?R4Y%NhGn%Sy`=DgcOlVS_*KB5OI>Br);oU}OK6?7Mt=3+zA;xeIGDE1CK_>@xEl=HX;3dhLyd)Y_&0(nROSG1MLv8;;x+HeZ80b}&5xpk0 z%X;mQdK%ZY_<^0VZQ?}jV&(c{&GKCW9D=Bb1qX^|5ItGc&|Ay*3P@zM zG+=!LU!<+s;@7sOUKH5bn_3~(yrC*=%ld=7w&1?niM4L6bEYlZck!SbGi~Rv=70KI zCdGWZS%FJ`F{L@&Y-tL!T!+QUIKaW;Futx4|Ej6B4!46>;3Q3_#%xZ&klVqci?b#F zsv>MsJPt#QCm2ha`}J1g+KspRUZv&IIHTe&+&#Ur4ZJb?@aXK{Vg#QW?S&@8_K4k;hR`Bx<00p zvpB+GOCYEMpR8{yT{*BWyhZISZO3f3^RhmZijfl7Y4NWagyVmPX~nnCe@#;~6k~VZ zYxS+yLALB0#L%H`-B#3JI@08AL;}9NQ&t(9>E*j**=3cL_hNZ85ABz!ura{^PJQ;~ z`N!gW^K9n^o*Y5>)a+Z7o+L8){iz?r`FB@BqXeM{6-G+U2pWs|Fe2MPSR9(8DT)9a+^KRRh{1Sja9vDl-tIhPp7{ywGla zcAbz+-PWBFFSRPa0|Zn$2;tUD!E-{)Y_fx#p-5v#CMs1c z8Bstpg&&;RUIdM+?e(5l=^b0?EvT&Yxq@@uqT`Jwq+N}}GLOx<(Zv1Qn}>dYf1?W4Hi*Ye#3?`p|o)T(#8X1K*5uU=->o& z=*l4V+HfwdkR9kBMaQTgXil(Ggc4mC{|%2QzbpAIXcpR|>%@eoTX=xoC>W;jE6!$t zyVh;a_4mypBe3lx9*_ek>~~%jD}1PsN2|?JK6?3PR9;QdOE=qjbcjycY|rA)_|0}$ zvgp{&cHVWOqc_`!^T)B-KAt}ro9zhx8avL6d-u6d7QZo+S9>`Ry^X`p4AnZ2A>dVH z!*wGXJLXyZ8LyoVuoM!Z&KQeE3c={+7FJ)f_Btdg4a#&s6{@( zv%PQw!3Spw6Y6K^7@F$liq>7x(f$*TJ8ioUN3ETQ(OJx7y>~U{R5_%}#=ty_*|}jJ zw+=Nr`gX2wzl?EyZPu$kP|y+BWsgD~Rc>J0AgS3ZHCL)1Ei=2k=cJ9*zj~x#*CvHs z!{%9n?SfnW<0I}EMaK~^Y?#6@P$*icXObMyMm!?pn!IgKf8*rt#=zlhv9zQQ8&qgh zryyNUWp?ARc{Xu+IS>2jc|5sdHy{)DZad$vh^|3Esh#h<|a1cGG2o$S_qXDYJE{T1_4~bk;xItS;MfghB%X zJz0^S>|rXa_6i#+SrxpLr|p;3qUS19DM8j~=G!Ey<9UH6Q*BMD0-Z=4vK2-xQj$At z>gk#)AdzmfWkX85xnyyRo|Eb%Up7}1-BFbMbpV#>8bC8=}hky|)g>a~wAQp>@n z2DplhkDP3zaB%7=mym+%wEPe#B&Q|^kM1wFBQxyI!N`3O5EvXe3w)Ujs!U9Q#HuJI z=NWQ>Rd|bZ)7&2GHr5+Y)GZm$J1(k<`6C2J%^87(A>6Dx=U8+!<#Ghq1NR8y7DAKJb+XNTV4~pOFIYSSHAFJe{ zD6*DRngHj4D@)B1J;v}in$)M0arMZWMX%0W+c50v%!J&%LC@k}2DG_fX_1e$b5TZLKg5N~y#iR-tZ$ulS zC^aKbif3~#O-+ocGgP$8vy_xL(ac9=H1&XNy1Y4&{<={im)I?-4Xu~*y;9!X^gMr3 z^L~=ji8VE2Eg2jAl*X(lMG{q~H5oNX_ne(t<9ae=uxWkIG)f!9K`mOzG}(!HN*PxN z@%Q22{9Cuv8z8=2{g4|6PZ~G!BMsgsr|R%-dW{09-S7UC?yG^-gw)i{r0O8g^4y-9 z@q`p-v`v2=(oVaop}>AhAGgK(I4`xSI-|yobS|n}i3OScRecoxi$3h}KE|gu^;xgX zqYTu^@<{N&L?7>vaoTxw8Z~5&Lt*u#R1#Q;Kr+$P55B4oye*!-kH!C@k20f=Q#!vO zrJE~K`ycUD-F(5}C6hnhRNj$uFcrJry%YrDMl^2>daa!-uJQbmnC353Ym24KMU+{z z2mpy}AayAFP@3cFGP_2X!nQ9hjT4yVa*(c{b0vEFV(zC33)-|kkT2t!0#!7`MmEKX6-eKIKoV>+E3ANnk5JSAa5z0qFU+QdL zlH++8BJ0$|$4Qjyz7j%NyF?gasHK**H`q%vSBgrMxzw)yT1vCkUu&sD{k4^jP=B%7 zpv|;)D`{8h@I%Ly8viikebPIZ?ixc%D>%){BGtr#?_yx#xsfM_PEX$C$f8G%9Zv&+ zrqsh-JcXwbnmr^NuThDW{sU>8)`&<@4@W;xuc1x=;TKra_Qm!hMU(DVMdy@za?=6+ zebO0r;vOegUhx)(5+LDHhGvQp3q8VVUWunGHhe}}-NWh}bxAazrM!P+LLZqT4rq;wrm~UuxDY&8iTTl= z@h}sG*)cdlo&M@Q=p~u{K*kfN78gC1 zy+KmIT}bchwGR`LwWDrA2%eFiy;}+Q#hoxJtE|sVd-E%XTy2h}dEH^LVr3jF=cSFo z8sV|IsAS>FDq;vKy{m)73`jC2S6zTq@panzoLgo?!3%(>H$c?5AYs{-dhV^h9XqQh= zvQE8w=eqjNQp+O6CS5^#Jk(r5+o=fNrR#Zjw zNnNwqmmANXEK0vDN@Z^I<^=R~_1pN^geg4T*qp6D(R026Pu2_>)sqL~c(O1Fztll} z556lp!?|Idyzk(DAV(OZ)B?X|$3*kVaSTPWvCvAj{z)WTn=+l*NNpa0UmbuH7gvgrd9an^^L&Fy+2;4CN%`uc@2h;|%)8d@B$w2uVhalIS_v6S_lCqu?C&XgYcG36Ds)4h29ebxWg2EEd zkLhSt{f;69ibBOV!{Z4kI`6&%7{%qNVw{g9wi4)vy5jGL{pzvFcoLJB3u3rc5nL8O zp>6J5?-V~FT`ve%WZv3&qZOmGQXUV71-5Ph01hvB0}(+=-mk0#39W69i5uqrF>ALA zc~^dkpO5z+I5H)$td{}E!>p3iTyqwq@3atM*Y~ExBEgHborN$3t*xCal|H-&Cu}X% z>Rm!_GSFp>RoQ)iHQYIg6Kpkt!&4Md@^2Mg7nEH@oi6^~=WLVnTAoTJo^Pn3r^|g3 zkM?OnM@8@3|DW=#^FzMHd?!__8}s#6XMyF12=8KAxsvCQW5k{o04m9BM4nUYHtBY! znDBlb6JD3kElN~PxnOzBcP!r897SjIML~)&dWXpuN_g{mp|y4qZ|KcI+`eWs!#l?a zIg&#Vjbnr*nQ4^=)RTC$4^S=+*^{_nEn#)lD;G6#fHu(!+WyYrD@MR-sy<_?#0WCh z^XvY*22EZ9ROu6Zn>)-j(N$u8CFicZI3(dgwx_*UjmBum+U+Mkt;w5JuWdZfW?D43 zedf8%`_!Q9YEXtZ%#*g}`_+KN1dC8~zuPLP?Fejr4uvs3==|0 zOd&e%X>_8l1hENkSjM-mOfw-IU-^WiUiyD?BJnAfc4a1gcn6LYCgeQD2kC-?alapruE*QPWj&9Jfgaev3+j4cJg>URPTe}(zm`*r85S5nFXLyE#ca-Oav3QT^a6#(&pg#jb<-2P z4mLTA#MtxH`h+vFDc4B(hot=GZ=~cIDF;YFJ0?jq3k10*IX7fh60`Ag=Dx_efhWM@ z<5mun_XeJ^qM3n+i-*r(ZC-I_>t0{hMijhF(Ng~jvv;KbghdkkBuvH+l+RY&89mQ` z!lp`az3uLPMWR?yP8}a%=v0Az?HKtIk#P~aPxfofIn@gNsW?Z$DerKhUCx;) zChx2!6CjMYyXJR*vD;jop7@+BB05|s9P8a*t;kL(8?hkN(vP>Iq1}-~XYW#xM_jO( z$61De-;^b%FZmoLDdulMPvZQh-B%|^^pD?KOtxHEGGQoYxu>rbXG{41R%)lXBAih* zeI*RYbmxXD9Lw7y2kph(*z7~hiX*`)-Z<@8ojTi|hB#%&66xc3Yoy!~Ix}WpF~M|e zXZ4~*5~!IWU!aC8P7NvSG7A4vFRaRC0&{kqPc2@&F@ zOxTlyib36|7LU}C zp5cmC@ETnl3C-gHIA0EkbFZ7P*(gj|R7{H9`HLos(ce^vGCuBxM-JMgmLwHp>^txL zKu<4^-Z|Z&ih_?xhy}ED@!FsJxXAV#b%aco+UQmTMbh_=C2?nT&x(_7OKR!85--+#tpnmE9Kh7XWY zoszSPdd>}@KJJwp#ij{X5Vb#UB^%3zTjdvbF3^Tr3T@*5p$VmLo;R`+*wAK565;V` z(0QSjfkAfx0m<-$&An+28k!M6+um3Pas3^SdCw^og@B-#L ztX(E^`(uyr+XyolIKpJ$7pw9Z#aGVAL#Wx5IZ;&Oqb9@Op>s)@1oNN2uZMXs1BR~x zH#3{JnN3H-{<_pTbTnWQGoZ~xH&K@xi8z+wTf3IDKP)5e^2N?In}CoC$}Ri@q7T@gw6|MFprb`4?&vK!E?0W?6z0 zp1gz&!vv#+hf-RoRz#c@4nJ+s8oKaO07?*NKyhKGz3`M|=TBV2j$&ykbbU%Iicghd zKi6BC)_HgbTLw7f6%*z~)OcZ&^LD!X;9U_!E3neUNj4 zD@x3r7pv;?9bo%#L+P#8{+@N3`OcyrTF28KVHel`iS^XgqV&l#X%tNFovMU&RcNP< zL1AT#>Jzza+a7(FIyd}4mt7ur_=e*(!M`O}{A!uJ%eiahkW@vI{RnbF#2wVf0iM5Q zOvXyf^Jvs@huf9VRKq3hWzG#h(px*>@Qn&y=kXsO>7C|3p6i|NKkgKDviU2V>#y_d z`FQfH0aDKm9Cvy#`x--&T*(>$E7Cqur-VNdbxL>~QKytAe)PYKIg7H2<+K3uf5}Wj zB(Z)MvOp?#1G)O*=?65c^2N^uT3knWOc9FMf1OhF%2$Uv?X{(}m#Fj3lSX^rPPCU; z<)>(mw&aE*j4n-FlhQ<@*pFx;*pSa^v=RpX*AxzJFSHi#D#d&5N=xys`AsE?j^?tP z>a;g$G`O9@of?h?J6Mq6-rYo{G19~%SjMa!T&m~_&>DPX)FIn zMpro8a*pEUckL5(sa_vw-P?&imxu^1yg>W{~Hmo6ov>(5Nar>s}K7Q34LzSLS2(jPDbw7#|D*q zq&aLW4%s_Kgeq+v4uV<8Sqj9s@K!p12NwsYy3!WAT>Dj{jLgxI*->Xh0uku4%RYSt zf0NF?U2nM;_0`4kM_v17GyDlrr^8Ya_QH1B@U9@lU81V z{-Jf(jH-U`FuWwWCpCW(WdJUua$)Zu5zg5p+O9E(nv_8tRiTi#dox3G|ENW6{C}v! z$;j6plv|c^i86R~;JDd$F0I9zGTQm;vgBkG(dkz)Q)0Qq$YqBNx(Cs43+5X=lQB)X74as$DmS;I z0$;;{M!UQ_(9vpK>tfr@j{)s|zUxFn5fEM4SFgQBMahSk>ZovOwP}Us zO4=V6ka3qL0)uvcN*Q&1(#srDlb}o?WxkVAX09BxdYR66nMsuST1pv3I`uM-#>?bU z=KN$Cow?V`tcsV(r;H_~jAHHeG7I8mrcmZ@c(#qt>$c>0iu5vZIwi7U2{oXfpAH0h zt<(b}+uff8Guz!Kf)zMF>JL`n-uHO00{^dH1S@crb~IR#(T?=Jf-)EaX0_u8r~)5Z zp9d>&X?ikPk=^bd6Ra5CBor5VMZEA}#fWzIm%$2WeGS0Z1|May4T=sMOV39n#UR-n z(WJa9DP?*Kynm3=O$ukz;Ka^YY)$0gxE$0l-ou>}3bE>nR2}b-vd{mwu-Y2Mztpc! zk?MGduXPN z3K0%G=T*MXMil_`sa=YG4-((x6NO^-tq?r6H}5w&N>ji1eiO zm1@B5V~hakKst|77|9{P(>@(k!-)&I7^T#h!gx4%>Glg5&Ot{`l{OKo8{?vv6Ujje zZ_MU}^y)|@^aiYI&ajqaV%}v&*>!qZ5o9R=nO-vTQw7a2r|*a9#k-o5s2&$e=?y%r z#tP%(?rSoEuB1kK@{v&1*L1k^w3}!jMi9v$M1Vjg&p`0qF|U>DCnAH~NKdW;@8^nD z(ZL%zm^pFlf2muuahrn(Xphnm`#Ob0=q|aFRCs{UVNhXR-YQRg|A9?N3I%rm1f)!( zz{Qf1MuEpmN-71;CE=?n@Mn)mZju7?)S%8xATN=ozsr%5GGMh3>iFM3pq`JKa;Gg= zNviIOLpwxj9DfW-oNMq4kEvng?b=@ViU3)~{*kyp+T#KiM7NUSl8}+>+|&*LG*?9?p0bD_)KE zBF4pY2A32HgkIm*BTpW%2tKVf;%s}0vc}5y8l$~U2g@@VzK_C=%RQFjqf0CHeYEfI z9@~V^C!D;&W8e4T!hJmx8geJ_D&{`YWK(!^0{#Mh0M+Fq4=cd79rb31c1J$W#qendsE6{R;hqQ<`y3l;yZk`B)t<-|s_V(D_vDUrbM+kM# zfg=&_op(FZR|fwAaY)ZTiR4@@3CB#GR?W{8dO<-ozMvXkVd9=tr(Hn7_~NO}A1`{R z0!E%5&meFFb^hW5^;{vjNUF6=#n|ihvsX^Mm(X5vuJ4CF3(()#*8{{`xBD)p**;?s z88V3O4Awr8luc*PnL}^vrFdcXejOi`7utuDi1_ahqUirU2>*{|5SG+Iv@x!KJqQBO zIYQ-y*jjjU1KVs%Hz`5H47+zM(dKXtf9<{x`I38V-`Wp#5k-D`cAzseur2F)-@c_c z7&wf1Nbz1_!*XH6^1=-o7L4t+T6^u`_S%ozYolH6Bj)znf3(;Bv%U6{_F688pYrI0> zBGT9IM;{AxbBZweV5X4d>jz=SMQ9ocU4J6dlPBccj99yR$Xle14v+~`8A&t}Nh;vy zfy#CSl@_V~}#Ev&e+VLOYE%Nc8>7x@~tt&M*nMTJ8UXUa^uPAkCt6;dOS0r)jh{Yo*~ zxLjGs7D|W%UNO9v$nxsC8UEGzxC$rCfr~INKLAX=0_TSP#1`N?$5FexfDo7sE*0Zo zOpW%PL=o+FzAjo6?1q?%;eL^G!@l;)j9}HIj@8h~hvQ|oMr_{fqh&Ut_mFHp8X+_{KP_JCp!@8j5wrSb zR=+|;fn|lbqMS5R*1f8*I5ubB-`fUNUd&w>tD59H>|DPhqnI$@g`$095Yo0TRb)=A zs?c}D!|1njK0$Lh**<8C}=duIjqRYP!MjTaYW46RPR* zOJ%-k-5G2bv7a2Ph)LW3Ya#E1LBGfY+wZC8dlw2w;SG!U2EJhK^H!g%J&ZTUi9`FC zUn!>yNfbH%eqo*ZIx5N;xX}MXb+x>o%|lJ8_WMLNgI$nnpZrkuAx6Ru?T3jH#syGH z{FxF4Lv813Ny#JjYMq-u>{FN)U1X-Nx%}IE#ls2ZxMGWe4{S%L}wssVhjC|JWEb<@o)(Q+X`$o{@(=6N>DpT6&XfBAei z&-0u)^Y6^enKNh3ocRQZBsI?j<^kLekkw;kWa|~UBUTJ6Q@#e z9?&=_Kh@$95Gb#Kf}M*>iSlH}W+$=K@=;?&%!K9%%C$)pwR+Sj^(M-ELCH#@sKuj3 znU#{)Lc#jDCr1Hxoif}lo1ohen3iUF! zhai&&;0*wc%^x850vRU|z4rrTIgn8T(fdA*))soR948%kQa7>Q`2pUf;fH}6yFLJe z8u*?7^`;NNCp7Ra0qQ*;fKO}S%SN(#*9Z7B8Xgg3y{!ZAISqVJfO=zxqIxOSGJ)uQ z9njcmk)qBv($qUSz+cqxDZpD>UgATUO6K_2J@4nkTda0&G|_$wj_L^y3SDP?VYZIi zh0!PhmHfoknX8nAAkMwyEP%fFJ{N-`b7sbh=vHeY)BqF{aT$Os{*qYPZDe^ru8f%s zh(?M=1k!7AA0U5HkUo?90C@q3tm0Q5H5m}VphD|684!?_3Nm1FA0SH=BsJC?GpUJ2 zLGL|s21`+^Xc;wcD@1BE$v~W;5#cLCYhXcq#zZVM5HAJMY?T!Da<7SZy@B`T--qy0 z7)-f|S8U*IPr*y!GGk1unk&^*R& zvqTIl$h{`R0rHT7EH}9gkh{&Kye78+I7gv9h=H5zPfJo|3Np`RGC;0XkX0s!0W!u& zYOU}Ilg|LR3+7tkfW~&QBzPpm@Dm&Ci6&#YDY0^X3UB$2N{tqQ^D7F*dWU*K3WF)p zc;|ALznx0uF2)&g(u#GGkeEYr$KL|ny7a?N4Btr3Chhq+2gNk1QmK1vH`s`1-0v&0 zTf}Q+8)}%%HE>T`rmd4RT_|a)(nRZoKCFr`i+Y!T7#j%tH4{4BD$9V>s2Ri_t?`v9%b&*HY_?GJbz?^L zcE!!=iAggnX#XnfB3dTT`AqxqE;dR;HXJCEs*iaA4CJ?5OXT&Nj+$@?>_9)o= zT;tr`T{tXm!^+p#0R0VO=zuTCngIJfYou9nh70FVftuKItf)}I`8R6a|3gIyc2_6M zZoMc3ba7mg*SOH;E^e_Xb@*-!zjsEa^{nU8P`1P`^q+G0^3a3WOZKqlaOEEFDsttH z7sG?=T)BgrXZcTFASVQJjghEJFd?WohdGbUo-K>VY}xg|E8@bxNmuLV*t$$BVqQO_ zdz&ie^*1I>Nd`dw=y7F@F;NXW0c_KNNlCyu09ayZt%Ye1&J8-hP1RkLhg{quw3B7~ zU--St?>&B9{C4r%&2JCC4NP@!^V`U86TdcoQGT2Gwe#DO+2MMJUkATVep~r%%e$2|=!HG)e+TnzE-xFe7%Zk)xdL>H4E`_xZg0%*%VgYcK^EB_O7?~Y(=8D zK`eNx6hj5M)wMTvTZ`gRH;DZW7X37W3V1&@*$5C5oGQg$RX|_t5(4l{s`#tqn8~-& ztiP|gtALJC2(ecd-YVapsX|SZ%~NOd>ryDufLEq(aju=0zJalxz7sV8jNv?XOcMXM z#FyvqK0nQ-)=4y7Cu48(e#T?tCR% zOvzZg{a!MaK9RteTyMhF9dPZ>^f&aPj2zF_7b$gqT^Wb)wnrUhM2U=_FP2EM(3+_Z zCUOwvF#cb;JYgpNr^I#4`Pdt*BN?8P+tfv%`1_)d=c_p{SvP=gjB zwusl-8rjEL%^Tx$k}zTk%ZW{)q?^RnSoYjtKe+)ZITqtbs|?7+U~qY2xB&^2+qTr9 zutpArE1SjEhTaZWpBxg)_FWyWRz@nyyC&|O4E4ciz2ZkTi~3+Vm&XL%ed&H+mRi5bZH6iXpGUs04QVnQ$G9HDn>N@cdJOqU(;rs# zfqleaTi~uS=rD4$4r7cqnE5~g64-UQb9{drvR}bTD5^%2miQyq!~vJhs(hVLzRY5H z(bLM1lgWhgNoZ~LvHvSl0lS7LBCezQ6bLt0=&rC@^~f=J-y3#61erLD#+Zn*u*zdM zCi0rt$wr1-!vLN2vcqSLP_6B%C74Yuj~o#a4m2@#lyjqJj601uQ?)^^CtV@N-aS87 zK3GLmdK=+_*mVou(`BUAl3dzp!L~!PvALq9k zCv{Hp1n%0KdKIXQ^4Lv8SL(gFHLVR>V=ncHIrDxQ(KWGJ^Beh3zE^7WR#!J4Z*W>P zh{xx(?f0~e2{#o6$4mLk{2SMeg(~bE`f%cVI03^D$AdMopGVZvkaMsXiq_E>N2`j{ zF;$egfGrlKY9;A!KFalDvCHY@_-;H<3USXhNY-$jvz3PfMZp}E!ZR*zDBeUA4#)}nC2g=4Q?>m1MMS{f)N@# zMCbPew2J*3)j>KRTI7NZ@i8ep*-0H?F4YbWh$(NNhCEz3%GT5`> zQ5t`3Zzd8?CC2SiHm$i?U3d}X6iB$b+vAxoYm*!-t1;7Tt?rJ!KxOa^?x{$&V;D%p zwT6NET-CC0hKP?$Xn3>}H(gcc#T&ZrOGXUf2?jl&eP}kA>l&s zBCZV}{T7E_k|sVx`p!!18!E9SX5QMDlJu2_7=WI18cHz*o%5#+G=lqRIu?>@mntXW z>y4fIcc4?IjhQx@-k^Lv)86?ApM~3Klj;URaT0cB<9rU;0$YaYsXU1aJ-^B&UC`5-O3!Ckorj)( z`0IJ;c^X`f{F0JGU1XClL~!pqjn#CY6@PH&t%&vf6}g#0o?Q{^SrxhbpH*bZr{`8= z=fmfz$ia`#TaoLN6`95^lu`@#glcbr?sw>{dOs4@*y$a=F5GS^sv-lc)N-j~@#i*Z_pQ!`2$rDCii ztBF*1k@>Y(zP`biJR9~S*2$cJHBT(?xRkRTapv1<1`vdAK6D2EU(cu#{*OIB{J%u_ zzbdw%jt2Go%-=+5b-f=;Q{^wvV}_|mmfH1cwrD-`)K+oWqW$zrf;az8Z0t;#Gq#oV zkuOfg{>CxUl!gNY@&rN=+O@y{2-Edg6vQ(azeXKR5!8V=$)xTn)IeqnIx=up;rLVjY0xErW*n$|E!W zm?Q4C*%9}vvxNx@&yWSiH2nucW!GO;w_%`9<^b~d{} zXOavnN*eapeVUfg_4sa~qs@XLuKOrE$yr@<4DwP|$h#HtR`+qjCbsSYVOT@7eT8q) zp*0lb+&@;FX8SG?5*5TRQ?u+mMuVDV8+pOCwsxq^iVq}l#c9`Gt&zCQ29k+S)^S~_ zl)szOnT->6?bkRX>w!4y*n>{KNB- zd!eeYkofNX245Q;aCN68TrqCk%XB{WQ^W^NRY)g0@J}TSSz#;mqVt~BVM)nL?x{3f z%6GENs`}@2&}E9LA|0I3LC@~SWne{IZS>(+r4LhmkL9dB{1uhZ5Q&UF`Rz~6?vwBN zME8L4U!mBqC=z}C!FfqEMO8;gRL%`I3iE9+&tVoPxav&t`C=vD)6HYgoeFTi!dz={wD;1*O{B}{!**Omr>N#^DD-t7OuVo1*N8;<*hYb z;4e`NY2_togYpuD^KMblt(+xYe?Xlx7V+YhUr6jcCNagk>#b-%u8bUh? z6|{2VSSe%0n_3YoY#t@7ZADPDJBxkXIaCunvQ-L=>N|OE2i3GFBbdc#!>grEMZ1;0 z5MdWte!b`$QWS^Irs2X&T;j~%*)&L1kGpckB;Pl|So{pRf$=yl=uU9ofQLu?O3!nn zcwA5 zBF&o~=sp#<8C^<{FT9_AQC-c7Dw~4q1grupDgu_1g#8zZdYo82qd+t9J_LroOnI|H ziDrT~3+k0uf+}b7b&~(CP$w4cHgusbrT5lWh3~=?hPuu5bQxs^%+cr_@1Mp5c#L!; zaSDSmdR`E-+lTpITd2Z|$i6>{(j~8i6139biY+B2V z0lOXYjpN^tC%(REm|yT8RUVBbLUtZPF*_O-almg9tJevbTP$Xi)FU5?aj5;HeVv%85*?Tq+8BA1O~R+|i;HI#VW zP~xYD61V#wvi{T5GtWrO#%W6-RxeDxfzO=L&+_ir zbC5Mq;B#m6^9yff+GWdkPj}YI=;yWy%5SAN?2i|P`;=Wy;Wb|n?{*zSVyDFTGWwYj zy(`_;C$=^%Lj8X(Gk&U*EBL;l*~B4fd6Ti~O%n9S-Ts9m^7a)Sa(E1 z@i!B!`vOfY!q`9f9Ywus+E&Ihf_49m9@cO~BCciR$butScbr*^s3(GTCxdmTd+BsIs#K9cty6_~**$ z8_q|H+RO{jXu6#7G_jvVA4=!i;=wZ1n`vy#td}NXUr^cslTac4Mv4ZL`!@KIr%vGf zK0GRNr?vHxqJ3y4o^3DM#%y+5;~~qRUbQr~TdJxpwvQwrdQ0PhS8)Q-7_CmnyBIF< zafRrf7&u@H%aN-r{cn8Y(YC%376yj7F`h#wuZ{iw-v1vR49P%6zL&^mCz};+AJ?Hb zf6QPv!8ra9ur}k-v2Il0egW&_+ZsGpC007_uOgoq`|GkRkuj8tw&oGwm-k50Dh<8G zF2Iigp11FbB*RwHPP6xIYo`@#&gS=N<9|YG-@y4uy)FdvIEUW-J$MSzj?@daBm#A6 zV!!$eGhV|Oj3fhi&RW2VCl~SltFGP!k)Rv}Wvaa9lWRJ~Hog@G$m*|-?c%-KCcY+? zC(+$8b`s8*Fy$gTx)t&aZbuD&a<(WpT^Y0H#}b}&rI+nvJLFzUmz+c2CR}ZYIGK3N ziS-qLYF1_MNtJzMy*aODnDc6A%v6r^FwKSR#hYZNV~m~T=#IjF`+c>gtRwIG7wJ>( z!L%J|?u0r&Bg?u2k7h+>nzPGvc2dQ9oLDlynYpeZSL((s?1QojRQn4o_2g^;lhPe1 z0+@AB#}~CR^_1PZr(4fHStoG}Wwk`+CzylAePl{!+)&OQk-N|T5Kg$89d!d+zk33;FZSvOanr=U(Bhw#{%3>7P`go5kN8xUTXF zfo}(KnA5mTrXFUOlgPe5W8OlazDXt(@Q(p{!(&b<24Ewk3Up31zMdm^{K12XQzO#S zELRAfB+}2p2{-Hy*LAT`Ci9Li*DJ6x1ao!bAjXAJGV{!mlLvGr=VNPGu9|a>9*<&* z@mIzEWW32&jbg`nVo{9L&PfmR7wd!-(J<}Rk$VfCYwYc#+2CN|hUG>3BCZPB>%k7! zt*C;%!MY008Qjw0x{bZ;N?e7xgLStD>+T5FRdu*#!+Ylh>*faQ<^}7jJ6ts|?%G7K zZhq{SkY=Oo>M*lDNHVpt?7OLYqVJ0YUBs$pTn*2JBy-h`Gga&Qot6xx|9H!eAUNku zxSfBtocx$sgM(*r?xo{2az9bng>2vr^k2|gw|G=@3LC;YF<(&+AV#Yfe^z7%o!*zFB&mIFvPCcEx z2l}sdKJ_Fo&ZfuYGd9}mt?+s(ybCM5RTW~BZgVyT38`>4|CC3EYgt;4;A>m+|CP(z znJ0d0V^_Ryv&>b;eQRS=?voW8TMTzw<9ABQC~bVUy!g45r9xiHc$p?I`MliN;aX&k z7Y1U5-m5CSm&AQpjmJO}LWRhPVdkFAcwFcAQ|DwKS{iVMbsBc+#>F--qGF6^Y zs4)zGXp+oi1=c6c0`GXXwTBanFZ?udDEHIECZ4rC7xTM^-vj&t{GQ_X3x2=j_Zq)V z{C4pBfS-)h7aM!a5XEb1>+=@WFORsM_5_{XiH-gIi!@lO{_%2b*PzX!1Dl_QJ$UAi zBz!CXB5yBeiV&24A41`%XTlR4AxZEr@^+Vj5*|XymsHl#TpK4UltLjjsdzvM`xtH#|}sX;w9i zsEV5zeYAs&&IqW_sqK*y9+75MTaMIArHx$wpwLqS;-0h0)hZZ9W#DX{*t!$|Y18rv z-@Ov>XC;f2#!Dm3ifEB$p{1GAbd^(TKz$AzIvLxmVozGk`Mbb7OO#PYWA7xmN<@h? zB%}EIWe=zW%}C2iHzO(>Nu{6VzuG5LNW;|TmuP4%OUBk1D%iSLW&%uf#R;N)#U^d5 zYg_SW(;MQ;Nt+NH10Z@c*%a-g03EKsGeIDPn-cvwB0St!iS0vjI-(F$#3`nTf!L~c zS@oeddZS??QxQTtt4~;b9xG7PTiPOIXl9!=F_HMQRTN=ccOP`F-7MuW$nYW3!Q6F; zM-hG3_1i4Ys@fV+qKnMWq(PD<;w?v|uJg6XKLl?1wuqJaWI6=<;sZgQI3()_dh-=` z5m$(`vm^Fa`)Rq(IP99V(ZaAS+BXgdDp2JhlOkSV4s^Hn}rop;n=kM9S=6L#$usK&&ow@{t>)5%n z-wBmO=^)~cQ;9os-n3F%Bptdecf7E}s;KmH+-3*1cvQD@#9mqteUtN-Bi6M@=C6X( z9*Q?nQIpnBu8IBOwbSfo)FpRHt?;wTvO0CR{$-P@ zlxT0}swzox?32AAwh7#)6xb+d7qgttwnfS<*744?ZX`VfAe^ny0oEnPCP(L7#OJ(q z*DPsjWb4}|AT=IYfxHPGlR3Wv2%6In~`YQeOH=b1N8HS|09*G z2>S@(jdiFWA6a- z5dNs7zXj{MA`QEi{oz%dXJyHuCm;{8vH1-}drBP~DnH!+)5- zhSvqs7ist+2{|g!t5o#asnO>d(Q_gVqyC_B8ICnJ8AC$P?}|kbRs>E>E~B424`N9>5yPv4gxk3z)u1TY- zSndB)jTLQE>I$7rT~NckY`oJYs}l?Apuy;#yDFyCRRrC6!MalClX6-pQhvi4a*Z_I zAk}Mid=s*$4ZKrn3LRR1cpRU&)c$N0B9qz? zm^ZvTMJITc9`RfuWJpO^r3<7tVdyUfW|ij~DKBc~S|>A?eCfHXi@D2~6>j;Xn!AP=d1LQ9#sOQ^ zR^M3FRw54#i6(vOsZ~Rg%2?(x)ys0aK4I=r1 z@q7~FkEpRz7X%#ZP#8Z*VvIR!J@ABqF&_-38YUk-g9=X;`H;EBln$A0&>sAcr<+Ac z6GqdpNW&S3Ql>-6xwGFCHNk9|IM<1qplY3{30VBmI-(@d^T8raot3#knOaZ(mS*)n zG_~FN#B7=~(9b$W+BMLBsds9i|1$5$K>y|5>jM2_oz1e?kGP(orwc*h5<>mhQ=5dX zB%$@!_k1eDZU|!F-F+5bQP10g*Q_W-l6n!Kk}MU})Bxr0Hqc+_e1aZ9*{*wJNuYnS zx5)YA^XmJCN2&t-H#wWtVt*pbKGmFDtE8(u4Y7lP*duj~G^@soG)tSBb=a{{GE51G zfA8E1{8o@st2Kt30ndaba}=3?qZaXRM4DA^(w)rAZlTI9H6R)B85MC->TKORZ)mp0 z(uxgK_D-$dbT&|ZdhgVjsP|T%JyCZEb%C5QQU4mqITLk6(2@&xnW!IDXu^Yv z#1>v_$3$%-jw5TCn>$?j7MY)~_=lc8J6z~_`L-s%yVduBv z`Ju`SyWtYwRbB#^s$CUW?#~m;{dqW;sl3o~yV}vbkbO&-WmX^Jm8GnH_?~VtU0s^o zo)k;+d9fe;QCP-&IZwhJE)~qsD1Xrbqxw}UV0^{eEm{GLk~ra;S2Jf$6|$_9?#b7r zbo0#pMXAsq=a{NsY9N5ugeDymjjss7DXL%t`jnzuMVtd0lI+WHL8Ss-nsCi;bX98k zU@2nG{6R5-L(~H6q_U;WQ4=ScCj3LF6IO)#6I4{Orm`T*2Io3R7%A7*UfeFfLaZ#R8v!K9R8NC z8KP1}Aj(J7ijS^2FeCMj_3tG_i>>$5^kD1NgH5DjhFh?1zl?^DjnNaVdtN?YNPZ5; z=jr6<82S8)`T4>sQU~&O15XoJR~l)!$rODz2>#nDh;HOX|E;Co$o0jM77=?}T?->E zBKo2S57ylutXtArH^0@j)Epve96Fm?DYPi0u?|(T?h>W)F5wuS^Nq)4UBswVM_Oiu zT?<1NE&JYY%DzimT~(c~N_uFD?0bKz?0bLMRb|M&l_2}}8p-N?9?~p+?pa2o95cBe z9~VpLErwjY)aqL3Z&*T)xdkFNekt>tkcZbX{08_v&u>5D3uXPUCrgnhHg=4w zl&UXm^_2(fmO`SXMceSoUA!=TY-?Q=VsFuI3XVi$u^|5EROTjH&cRHhHi=HK(PBjxE*hlPwEgjQ9Va!e;hy47EQ z!5*6B$8pyxktn@%U~VMY0J=#K6Y-h`>EdH(E61Q4epP{wojPuYTN-jLRr2b8QQAS8 z)3va~b-%M^AD`wBWS_+z`|q!bozk}A@&X5x3PsyJ&y}TdLNmDu^ZC_ENPflY{Z!5g zWx;MrDhnLG55o8_YPI6}g{Xn87y@Kf4aLnRes1h**GSx4jRV36Ya61_*;p9{7PlIC z3$g?6qFc*48|T})6v*$NE^5c0QZ|SBlLgh8wJDU`cF*%?R$u~f%8F5E4#lNh*+UpQ zW{VLMo+N4(xSUctK1(o=uCS*Tm4K5@Xuj^SO(r8k^Ek6bvNZ21pS8iw7xKr+?`{@`eds&B&J=(kG zHfQroAaj~I{Ez70?KnFNd}h0*!|KYF^Go1|F#>T!kL1MUoD7jBZ!2nJMmx&ct-)x5 zi*mRdK038yWjxFVenDAj87s8LLz@KofK}We?FdJk6VAtl(-rNTQkUz^z$!q-`o?FV zruc4DW%_8Ms{KuVLVP`Qlkjq=qA%B=a~Z25$dRjjuTd>1Q&THWRXbd#`HB1Fob~UW z5ZP3fU({^@q)x2i!drLs;Eah%+~VaBSpT^8=m9+E1-jo;nwp+WsP}s{DzKAfLwP?q zQ{B0~_oa6Z!#x@|b(4cNewhS2o7M~AjGz)O`EHVxXj9umR|L=`QylBcvvV279@lR` z8lN};eZX3o8Q5AF_+Gy~UcjeiC5JEiZ&9B20|yF=qH-`eK79Opr|^j`%A~NbpK~eE z&vLT*!X44rFga*8c)Y_xy1pu*NO&-M#2)zEHVctBM<@_``%{|*Ww^B=#~^ey#1K_s zK3P%!aqU^rqHWNi*qxy1rejtSJ&=jRsy>5&fzQ|h=cMh?*eA%+5YOLmn##XG3vcpM zm)iBxj&o%)Rt@>%tJKIG0$3CvXKJT69`0C7$6iFwHk(qb>_RR7Yb=Zw2bnGJ@Irfv zOFi+3OS`HtOG!(`H|qD(ayz)bB9epR+~N-S=c-yc;%;|k34>`6Z+i81QJ4_eK%jgam5=3oaFmCxR27Y} ze2u;Eswg)K6YgH$Ur^eC;x-aPw3rZC%$h7RLnOTZnplyfBzMp8eiiQ_I$}Ns2g-%3 zqp?$LP4#*FYsjTXmO#Yb=p6?=a9~FpV$MoDx%`sd#w^Q}u`92qXia}z1qyi({#VIE zKo2HCI{=Z$0YfUBPK-JjPySG48-DEhLv;3LPmLN&G_L=g7%(tcD_wFDFDN z-YAJ%8$0gTdzx^JG}23p_V+xzIXwL z6UYs*#trmb80Q|C?OYp_+B?_!g)Xz{urK{yY2#86&qcaR_3G@9D`{YX%K}!PqFmP_ zl@6I@jLS_j`fD-cuZdkePOlOrF~rOGHs`sHIh43MS`R}Ww& zx>#2Zdnbd%YZnQQ&}v}|l7OSixmK};sv0BT*r9$}2Il_bxv~${uTxH9wN?+rx`fGY zDF~`mjFi<5fsyVokCa_8E+f&J*#ExLEHUg1v7IC&!(va6zydS6 ztbuUsI2UK02S z4#+~k!@Ci{uAZVc? z1bu}=E9&KPE{Na-TP8FUnKiNfeDFs1*)4CG^%*s>t@386%Rl(#YUSv9fOHEeuM z>{Z@$^sh6=2-sR*SQGm(Z?*L|)Wkv>bX`r%uP_T`qr82MRTsJ@_Ctu*)V3_#(oa8G z7HBI*XjniSjlTUfas-Q8&bp?C5tK&|onVof#O_2FwbOV_!`gWSSBvb}*&-J|H1P|r zen&w&)c;QYceZThKeF8+74?Bc(*qvbjEn7J~&W99>7>66-SQV3!rMVY=I zT=YH0zMutXF7Ier%bTNh^)oy=XD-<~>w=uvZ!hO)@3N(dBMEv>c;-^rNi&f<<`V%NDqO)n@QtQ21`6cQctik ztKv&c9mMq=Iw)~E1!y;cr&549Ch$lK&|w0Ps|?x`6h7-63Nk){3L>SDWx9}?OxV}h zWBrOz$PVR!&l(?FTc1`FTcbK*HsZ{)Z9x?h9~NBQ1O*yzUm`$3h;5ui#6R!>E2j}TTfLCr3*(vV#Ew8PJ7(DvgJ1_bFP4PuE1tz{D1q~1 zXY&I{36Lo8?$ML&zs^*X;&pT~hs3XrtD%$;K8RXq{mt$9T_O9Jit8-R3oNs;4VY#L{=U`8O zyP~}5s1RCnIAn(tnrwU-R~Fc_6V2NmwM}ko-_Fz;Sz|lE zmUGHn>+spwtS^amNBBQ|pGYkFNvEaIN57O^rI#9en`j}CEtf`Im1th8_|4-tzi3|- zcZF58)>VqCxo%$UqE3;9a*->VWI8IYTjgw)CFYd6`CiCe6>@uu9lnB)+pA7ZH&t1^ z7l+)-)kmlzt!bCn5vs72xbOAO4YZ94d~g0JQ6X=eQa8_A9ClTP93^g#@5vM>^mySGESpua8!f8 zt5BcNuz%CAr3&WNu%7`7wJcMy3*WpKAoFngn@f3NvEIhTiyH4f9rtb(_j(Ph)3AS0 zuzU@>MZ@Y9EL+2F(6D<{CgoM0{&rRC%Qg63g&Nba;lMmw^!wmTHmEd-#rEp&fm7#P zYpe2X&|wEvSk4T$_yTXaPbKl94(cQb*a`)ELc?CuFt38G(y(7@m`}l$YFJpqRszGu zfy-+&*sH-0DAb7>wgi|bTffiaJ<{@^iZ$tqdkgYgkvEVz@|cq?>+K-1R?ZhE0#}0> z27$?r@LWU_QI=Z*-PS74z-C333{VJmAuQzj4kpS$Cbi*w=K0on_G+YqzZuFgJFv7M z-(qB$D_NSkZ2)U1w>&eqU9r^sehQM2U!Jc!HNRZnTF(ZZ-wKuA4^$2Rd484W<`-;dxPKXZs&z_wldKsUF!yV{!{kGRJiwQ9U!qzn+=n>z*c^ z;}1cLwEW*Hc+Wq{k@MvEOfwpA=Km$fyKG5Rv;l4h?xoK}7!Z9F3~}c{dPFyNNidc-USIuF_zU zEUP?QG^|u$YgsSyh&kQ}A{y79c$ zcz#Wuo>-eA!gn<8Oe4%?Jj;#e428QvieZ4Mw)^x(Xjm*W>c^#4cn?=b_FZeu-7##9hf3Pz6QUb z!NU}4wuZH8ScZc2cdD#?8s<>2ZVmgkhGnWG%c?wEHTYJ*p_btansdJCd3I{R z2LPC?P)O?4L5RIqME)jJ5IS%)cv|Qey)9cc+HX~))E2p8*zCwGxyTsN5zXjD7Ylxl;m89Owr#kmuybmB z&e+GfrxR=o5?o-5UmSZk`T2_7XD`Tz+Y4-VTX5F!U{ldsj74=G+!Nf!NU*a#_B^z8 zWk<@NyPzsEYougY6T5@lBD1d4AC5fvn4mvO_z2CKKvJ*6G9t6C*5E3@=q>}D*UA=T zP3%#=)&6a^zu3-U-Hjpw$hA_gY!lsLTOo^4|=D_u&tBBj?+wARO; z7@uZ|eTxF7)Hily^yvh6WxD*WkBfiD*o`2Ozvt*MsM28bZ25Bdsx!9u%aX=){WJ zk~(cDAubN)Vx)kM#?}`pwT5Pmlr7Npa!9gd=1A{!`pz26J2`uR)>yS$EdK)W?m;_o zagh9DkAi==>&n?d$>nHL>}r+Q^`eIf&APH==9OL-V9AWc9I1)z8Kn}tQWBGY$;7(0 zn~8n=bD@Hf*o2aq6H*hirzX~-6PqB3$-iV`PbU+5IyJGYOJ-i3npk>jVpDWtS4(2@ zFPT_HGO-z{iKUgyOkXzToCr8`gQ+HRd;QOXN+0N(a zyIPrZp>-xstZ(RR-sR%}z#!Z2_7w-?GjRAG?zpFIn17W6U-{3p%dNz}40m>vRaiZ1 zq&SV_LLzbyC;aZ8t-B9~-=jj-;hW`s_+~us;+Mqg9nDp>Y@M=$E0!k$;(n*Kt`k+B zRiq;JP>$H}=iqn^>>%aDr+OBeV7baHcI2ljD4u_edZbC4pR~p=@|1%lmK{3&c94)M z()JCnJ5`@9kK>bf%j4uC`G2}-8N*mlf{dV6M8)FPlF4psY)3YHtP#Z}| zn;srOwOr%r{daTJ-AxFm3WO0ziSHc=f0PmzVufM#P0>oXj#;-@I{a-{(O)L-E~({a zC;t_L^=Xmm)S9VSeAu!O;5+=C_Vg!hu-y3xM$V%MOT3zc*6qF~z|p}K)9 z2IyP>a4cZgej$CdN#n<++m9|d1v z_zqEZE@}vL>dOD2r-yzj1Jc>74mRJFgME(be=v>{Nxqn)%|JT6w?^)_cDmH+U1d`! zc3gC$qTSppe>3dm1K(Hf*_LT@XUi>@!^qfw(AheSGqRD&Mrj91k-&^=bNmATI2jf* ztP7G8%+XG z1ag3ZNl1CnO2riiVnQn8YFQ>3H48CIQ9%Yhwa`bW!}zImEpc{q42Au=f&+2w3zCd2Q9Re(nK7c+N)=!RxhayF~9Gt z)Cy%7G1WPnXTsPGRs;)k=Q3+B%{XQU+J@iLmR@gPY>S4Eha55p9M%10xBLEqT-|?# zT-=e34-v+To{9GOav3pnj0)?W(p{qVTYbmlUyUqJcDswh+lvxv?v>l|PWjRU2M1d( zGWyj4=|gR*5B(7XuH<0S1Ie)NR?E(u$@|cQ=a$SD4n3g{i;$U|U8st!e@khB2ipT3 znbNI35{q!P$uc+eoM?rc_W3gX>)zxo%{#(>D$RFg@pJO!yR^eEYgD+uEK7OFO4QOL zc5tDfjAOL*IZfO2F_IjK`BmrITN(7D($akyMq~kBV1P&Ft~9}NzbHoN_Q)EMZWq61 zZMxJuDHK%Y+2*}cb{sDX1-D4?w)q^#k&SXJzO0fR_nQd>HfIJp#@ylST)e3GIVq+u z(7!N+AKE-4xdjVf-9&yaP}SSJ4FHt%H;X6x`j zI3Z1cW;)m+ zt4%4ZJT3lBLI5i?SLLWT-xK42pPf@jo)% z;+pAbr;ca_xW?9F~n`tuL zoHT)yJq-!`ad|0eXUcx0f<98x{y?T#IFe>E-KaVy=MYqU-Iempu1M#S(IOY!%)DKd z_jasMW{{C2%L<(jY&XjBoSEjk)NGVdI#yzZqhsbbB^Z23IL%j?QqyUwrqggzltW*4 z<**eC^FL;HSiP4Ht%Yl2>+MQ=puGwpgkkoYV_)$XA=5N$8dOK}FdD5_(FF zs%?x4RRin&_BFVooZJ?CT$D9Z+!`HX@wr8oq!2~>jt#SVCl9UHYh%;Qyx|nyyt$q} zk+>bTvA`1|M(1=qE($6uWtt&;P|CGIanCwaX~+H~x6sV8szi(SVRmM0n&rd}*-Xs` z>gf2$*q)T{jL?%pVE+lb@9T0aaK_|)J#tfno^+}(UP%=&YhwQh%e2$;k__7uHs9s- zY2V`HWb-IPSXP1?{^|zXd&IRWwRbi>!HaWktu-{SBu)C>qyCdN?+>JN-6uI_>#Ra# z6)%;mi1UhPmHIMX8`-mgh&u3T2^`yub@D5c>ZA1TjMtn!zepnd^qhj;Dh0Kw#R2!$ zrm49${=L_7;{PI{zV$HCiYfHHDqvcrD`|Pkg*gNj_wd2h`IJ! zXY-$xSOtfF&>Hx`2>W#E4MWIWFXstUcXWIHYU3-;~;_5vHmm3qV z?sKlanVW1bxMp)17l@6uZI1S*SM2G|#ID)Zn;F1yZXjw)xcB;YhFe4j&rBbUrDeH} zVxW|mhEtN_1=D>w#jB-PcpZ?{f-H2@zfrSj1@H^tp&3@rUcP7bzo`^e@}9=P64y@s zt?vEYV&g(mtX7yeWuI|Oo-nLyy8h91W+KhoQB}5?F z>-&iNA#E(n67Cqu`PO1oEk*5iWKA#flxxD^FfaCH*t23kDdx`>O!5+mzC>1MRSGx?m|Q%SNyI-X$X-uH67m8Nw4_)_3pJHjoYi83 zdw6bDY}B6z(B_ddo-{Bs=p*w@U1e4)Hu#jhWV+SaB#y&$ft*cpmYCvjND%ACBCOYG zRn!j6;yBFHM?78F3FJt0=h|DW$hP5K(SvL%wPkf>?V6K=sHyXQfgL7EE<@ulQZq)jh@4>suId_X`2ic6V>u3ju1C zFJ^Sf^pEgqS@UzQ!m~t5ipAG&TTJP`VdUA2HbfZ8^!hY*Tz*7Mx>d4;Hc4N`JF+y> zSZQ2ZV-Oq}!k?&S1@NVcRFK*{JB811D~I$#cXn&tei@c^M3cgGajZ}5TqQH8Aj@ zRP-F%_MvWj0Rb{x=Mhh%S_GBpy{t(3s-I2sWYDJrW)O#x320XTld^S~7HBJ|xT@jY#eB29(!VE0wAcmHju z1N28Wu7Pi}KqX)40pnA;asR0Sg!jt|oRKF*oFeaFMhWi2gEC}faj5(9JLb7snS|!a z>Gd2AI?8gZlAM^5YSxKyca=w`Tdtgly?0X4PxysmVwh`)C;VC#aHr*4|IQ)GcnF4 z;T@aG@+}!*%PWPx1)@8_waiifT}M?a^lm4qP?Er*jC=N#ho8@qg2E=pLw-p;tKI*m zme+=lPXLM@a%8nvaTG(1l@F*5R#WCeeUkI+!8an1T&i*E#*Fy;D>V}ee zfp$eq=VLzAued`h%hK~BRGMMzto9#^7CM`6<15r6vpeQBUoTDbUcv;kx~sswiLWu6Vtr z@lXb(;5^HBi7X=$=dbE4%zVDJN|Dttc6dJYc3oh>3$8kF!&f%K<# z#gsc`!ExrpKiz!%u$1fqCCJ20jnx>UrzH}bqgJWn#(9!w(q8Uz5Vl7Jrq z5Vs*ql8_%r8t$Ad3dAP#LpO_ryfw`bmAB@bof%+RYP1TXtq+olIBS8o74aSVi7YGO zvaHC{@qHY(alb+|2KQhgtz_}=R@7Y^MYCh|;!!njtGCT(dF8v%0Q$0%`C&7TM%(`b znvpfR^Z<)5O%Ar&xRFEok&kv~7@Ov30Nw959(a^fxLHxjcqF$e41IUu7ep2E$Nw$# z>PvW={|HMmso0>PTyKDHr&FrmUhRBr8T}Sixnx$fwotg-!D76dIqdMJr^_tE=*PlP zo8&+f1G2XugFL!vG1_W^q)0Et(s$QAyGPlo_bVQs)%0VLuR=eO+6c8z+U`$Rte$JF z{0~=Hyu&#R8g;NAnAJ{vrI|mzr}2=?Ys?NO?f1i5)oJ3!1AV}XqO_d

E)=<=?6tpa3?5~ifd$;`JGY0d2^?aE8GN5_L~=Eqw~g^S zrJrg^E>X0=cZSNz*Ab}0>CJ*7fa+~OB4(eFQ}mPB?-tg$&~Hb9C1te|%=WH{wKQuq zk3G*r9_q%bZfHULISft0!(A@;!yF(tObu(pmFjD|s_XNT_H$E2Cu2zEt?&e&M`VoF z_S7Z>1x&hN=DwgzA)LBtipP!Ur9RNN|9klEJQjgm2@D!c%@tq8CPeh zS^9M%fZgrEWLwq##t?cw!U%F4f!Hv1saHu*C6Ukw7< zT^rP!+;1N;*S6TuA!qOKEBf;f%D5Jxjc>~HE2qL(Sa z84HgO;MyFp@m(w_pce+z`FOVL!mN%A6j6isBeYWv?$S?{fexuZYk*sjzkbWkiMgiV zpQa)@0T7D4qIi#QA?}7DQw3_r=L*fa$z36G&Rwi_!vVQb%-^z!Ljk2*qAHs}aR68T zL4N}C$mfWA4~f4@6*sjW^@sxC4bntOwrlR|lD%1_MnR6bAtLUU76t2EF_N7xziLEAOJ`1 z={pM7K_I;t4!?3G&PLF_mY~HJKndhulcATC617D^hp|ov^tGHS^VgN=b*exkBDNyZ zRg!WAdwTuTA}E*-y?RC^Xeqja^Ejpe8o`iy1f^$)E`sEOGGGq3i(Pea?s2qh)n4g-|D1Jbnvk%tp}`^4JwZ6!RzA!4uUC zyIYi~jh9Pca8Un@KJ{o@S=>eJ{&;gj-mM_av1*bI150{T0k&HX>{&ZefM+&wE?Zz8 zTf=(3e885MsF~O6w+2I5jXtz--rPM}s!Njzhk@X#J5r&iWJ(FV0Brln<2UhV7A(ot$zZ*OH0 zm;eRFt|-=6)b;3Or7l^QW6Z1_hnZ#N5N@KO^~}jO5ic^fs$f}aFYBtUN%pBOb17N@ z8p6Jvf&N7q{(v)>4-3olUWD65cau9ut<7BS2WI^~xbMA65ubt4!nwF*%8+Y?u+u$^ z0n+Sr8rPka?c9RNG0GV?z4+8ts#*mp?xmvn;{U}jI2NPkNM&OM zyGSG{aHSTOe@hSrT;UV;Qf9u*gx_T>nttQFefh3lpx4Ld2|WzuWmZ2iox?A5Z5LVR zEQoPLM7wXM&3{P)lMm8`HJa~CapmDLac+BiL_F8?x}Gkps?yO*&>W(-K@s(ZFw}R` zs~7vNHo_I;3RyM3+f>E?O4ChK07eB)wWo|zUFa1)^R)DxoT>|Mpvp+B!yAw5-!uus zrHKh|Cy#8757yh%W_a~bUIYgba+bkqCg8cjVd*s7bTXE1F``37_0N~=4TGye*D7Dg z?1>;U!@ZqAZOKSS(e5ss&Zj1`)0^50J$y?`Y5cV5?5T^PTLlMxzEu9meOBQylXQ!r z4U;d_p=`g&8idOFN%(LE?EDq4qWf92wyFfce zgTx-$0r^wb`%*s9`*EF4+oVDxeg|VXL_O5Txkdw@MbxHirvy&H=H5%J!s+$|tv8v< zcHwzm^Ifu3RFY#aA~FQtJ)%PJwr{<9i(gY1^!3n66zDydx{L6(IP|sJ?-X5d&buF? zwu?Ei#_6?7#ew-Y5hkZ;ol(E`?}1?KE-~7rL!0-Sis)8Zgg$XyW+#SjohG4S<0;M(vQ3n?n^;(BB(qh5_;K0G%t z(v?xl#aSQH*M&q+*p5C!(Z!d> zVPzRJr2qBhW(qJk{?1q_WgSrWCEW87kz6yrh#u8(kM;*;FD zoQm_5L?zL{}PtjC=tPmvO;{3!|Z;FHm~NEOCqAKi7O;outhis2U2C~+i}@; zn;C&8O)Pj^1P9pfAe%6k9c$tL4$S_FqK-5AMXL(pELB!M97DNGxdHsa6qAq;y2VU0 zbW{D!atiOtH|K2#uT_J0{c2W-=-M!d7*Kdpc`30 zMe?!?K*QP`$230+Qf=uucd)yfNbSG^4YI&#!pg(j%=l3<5wUtAfNnSq4c8#zoDV5r zQLtQqrFh;oIoX#*8Cm+{rlSmiE8WA}t_uN|K<5h^aS*@`ATc@)7|7ilvsxUMg-$X; zT`xsl?7au_Hq!BPc&65Vcp(?^kC?;ee=0^*E8oXHFbdMsuqkF`*MgoR?n z4oB$A=#svSL(ht%c%;5ORumB;yq2k7C-@8aTmoZ6z&^ne$K9bwt!J#72MWS;LJyFL zuY^-R%(%kDlL#(%u`9Y&D)KOL_F&%Z%hSJwKI?c3Fsx3HOod0*Q&8DB%%t(enMd5@ z(Dv%7^d6#48a3|}&mHON)jlI$TRf0<;> zd*g|%Zvi{MIJ|M;_(Dr`Pop1-ZhjY0^;4r`Uwq0qG5Sc%3P3#fu!~hMU)K>XqQ`2fUObh@qLsgeO${_Co*ba4jfq>CUb@!IKP+mq>a!cFC<@q@1T&JY!;pA=r=O z%;wO_Gl(xYyyJ|5XyVn;n^3hHH|fmRw6)_Rqkde$U5ir2=S~W)WNVgAyeEp{IC-|K z<79F_x{7S%zpD|qhIZQILb&Z!5T(fG%dFZ;qu?JV-} zc=z`D4*TJcwq9jgE@AKAm;aEemnYhz7v5c3sqnpc9y0_=F$rrOa4_OXN=Pf$1m}N} z0x#-d_Xry~K``z==WdMGrynHyij+i{aRb+XppE(M_!(kg^MRL|Qqn+$GVec}?D_#f z{y%D!*uk0JfHVLTD>(43hjq*u9+)27-+z(gCEb>TXfwR4603;duVj!TD41ge@zY@2 z4J0W$bdQ_E<#Ua3@#DKEW3mHJ1G(XVb7v$4-v2dMG|Y)mqxsi}zm;kxY1+C@^~~t{wmTG)d$SqSD+ zd&)QiSoIceT^ctpg)2*^S4OcVq6VDRZajgD9F8CA3aau=}O0seCD&Jze&eqMXw_S3}`4VFcFS>Rg zSLoff4Y!d#ZBXLtzUd0`c#FH$TX3nV7U##q;m*yLp*6D6nfM#SG~ z_d_{jTxZ@_AESw;3#*4JU4^0pbXphuPh0SF7KnONaF~BJS!j8%b*SIyoer12Mv82b zsDtp|w)Tht@AdAR((k-Laz%H6@An*K$SOawUdF>n+mkWvw`W6=LbI~o>~zi@{ug9X zBHdQ!_$c95a9M^UgVuR;P_7u*Ll0jF{YOPFnO0_M|c=-M^-RM*Z8!=#J*KF^&qfwjB!9bT>(`%}L?V-}txuI&I{_eeTbMLLA zNN5UIpRCC1#WQuHT@e`|Uq=+~Y~p6}yUl$qbrKLR!yJxq3GsY~X=eU^JKbaBgo`C- zWsLT~*efh+oVohnT~W~6dp}Y0pg6i=U5I1Dpdny%MlD=l4j}}6-F5s;r^O&o)JO-A z2?AD(w&&$GD0`+w!-zzuBoxNcGoq$i2pkkok;>{n(&IZ(L+%)J+#HuU+S|A^iRqJ5 z-xM(#y;0R@Jev_QTE-)WVaF+6!Yuy5#%Vi6eL#g|2#z=*+tbW3novofZt3^QxALoy zaJyHY1UeRA0oR(GVq>^oG9KHQm{kxVNc8 z)YE`6@K_HB1hTIbUrO}p^XS+rDko*%4PZwFdZT8z`)SgosgquJD`;d-LT{ufd#N@2 zfXvLlq0Ecbp8Xaf{Ia6KCSXM(H7Y^rayaR#w1sF9_O)xRi^M9&BtQ0GXDGsg*RY()T8t#j%;r!$Z%w8(>HMC|_c z(ZpIJcXaYGT@F|JLw`T{=Gw857>0+SVOuyd9xhu<8Q`>e&JcG{RS6gyj-7bC5N2mu zekm1SA{WCsAU{%XXnqV9)~w&MsgTFQm*>>tB`23=1!`PERYG_>;i;&II`0Odp;M<= zcLVo)|3#MXKbwIU!)xwa!U`<&GD7R(ciVGu*ol z)q|Os5kW>AX#6@AW{0Y0fn^-W>y(32_NNLdAV&a_?lSr*~zInFoNyGWkb>^Tu{(4FxEXI}QUP@{Zu0Uxetx zMH$v=C`t4*GP!_fzR$q9_znG1O8?%qZD;&(lf@C~DPcyLM%OD84_xp%UOSk2e_A4) zZ)P(HO62@EvYDK=IIJqAZ?COXA3`OZg8~J_QfrC!kg7bu)IkNO{az(8Gq(4DooF^L zJmd`rGNgvI4zN01YP2GB%8?tzdcPH9H_d6JuAV>(qnTFvXO<4i(P%!NVjTYE+%q`` z?0cFgolQY@I;5y)M$Ye>eaVdtKNKREQWD8=PN zJ~iSXrdJcDf#;7-j|H|=F^0);9EIqw%V<#A0IU3W9Rmew>aYO|Sk_X{0G3(v zU^7Nm5OXqcoR)yb&k}mV6kzA>(1ci+2|t;)3iHZ%);?SvwGqw#EkSCD=OXvk7<23C9F5;0i}@ zX6T*t&=$b&>XsTsJbyA@J%bMCb(s8SC&K61XZI4Izreui`WD0Or7Of0W$gk*Od_ds zzLprYv4a$oN=}H@Wat_37MZW`3Dsr*?Y?=g9xYcMd|!itXFXR{fT%VYTE##-Sq@<= z+Ub+AxoWf4-iHmU`QaypAqzQn8exkjpakOwAL|rQ`ngi;{o?J-GqS0cr3K*Ibn>5c zj-r8R!`}dg4f^TEEGk!uw7x3mZ!|}9B%tIxrbZbseD>(tt2uWWW{24-H5JM9_j}Te z7p)G^C)-nB!CxdLOT8XLuW4H4Liro|D}%{_0$oLx*4wiFz>kJ3-ivZQ(Thx9n6ya_ z#B<`JBvA0D*3;`lGGmSAJ_cnnif0f7Nz)`hGM|V1#?PG}L}i{yBx}4>UU|4^7T6;* ztJJ*DMle=hsCY%ZfHn1vFXvDu~~FXp`%!)jeTE!lmx9O%PwlU}>siX3;# zh{U!j%IyWEny4;Ivpo60>1J_3Lm9p6co0l*Dv@r~4r20!H05N}?Fc9xB^+#DUIf8u z)4EG5^Oe_-%98G{*=riPJ?keV0{U?thA-(3 zEu|g|=U6y-_tlWmn$c5d{!TY~=(h?R+-F#A0$fqhifVo&4Q84dF{d%Xvy&nhEmX*V}+L1eicGw@jv`GLOxt&WrVeEHc=+P?qM5^V)dZQSwV z|Am)YQ*(9hC~0jUc^>2tA}kd@W8V?+i2(>dj)&0uB{jFX)DqE3lsR~EdrEhU7|UZJ zh;;SuQhYq1vB0cqt99oTFEp^~D1}&(u(~4cAoaOE=3J`K3OEYA;m0_vq9zzVX$d5l3*P$Zkaf<>r19J zDlp}G)QsUSVd-du4@hT`D!kn2!T`!~eh&sDY1}6&bS% zP&vwbAYZY8AzaYP;8`ghj`j?${AiXp>n%4-tKufu_FsXu`_welP<#c77FZ?PyD0uD zF4wh1U{LDg%oKf=_DHQIpw17ZeHf6k&JVhi?{`D>bs#vxB8ArB=+Z46KUW6ks$^Wy zwFzx?>;&79Gf(Q7uU2!Ry2@OK=Ga7xe}xa!=itv<=Yq0ITy>R!xQY_L!&uR#!+)Gb;#>!D10QZrqz`^m%(j3UGgVCR5-`MGvC((R@+uzp6aE%g--$=wA5Y@s~!P z8aA&(>ZY$=uHhIWY*;{6-97LV51A^_Z5ua8>PO1PK!W&Yt8S3jw?iG&VEolcGv$kQ zK2fz2KWswxg6I_;1DeVAp0V<6h;E7TB(#WDQ*}cqN?^U+8)AH;iKav_6CBL^Zf2p7 zI2a|ig7b)%gfs=`jPsZiuTk0B$>Y$VO%LTx0E<(e%$ZE$TCWw$9h+2FwBS=xA6O-S zG8>qMuzo<|c{Uf1`?$yX*>}TDlpBf;#I^UKC57iuTD+A}0RhthfGAUwU&UI8Ce_w$_^f5NCfo zdG5SNp3cpT1Cy{j@mHW*qo40)#^U8q8r0LfU=o0)kHcBG`T)HA4t6#EFW|{TTiu47=X&}VWH7R&q#>_aPW=%&k9iadmQrTp%es{SZCTtFf2i$qmR zBhj0i<}-_n{?Ff#yE1=yx=mO#h>6l%tJ!&!FvT^#2WFL?MEW{ksAWwe%_3IgbkZ(L z9|Tg`85sBcG@5$s-sn9#AwNl;xtrz?j~9~X)bOwoG#5+-{lBxW8FKI`p_irw^8pOW zRbX0Y2hhkR)D8?X;s96^>#qjbY=G*bR?Pp%i&U))Kgl4|N(f=^Q&7t)DRfa!f4^v; z3HU?rfx4E~98=w_kAlB{vC`9%L|&|w zSI+TYY+1{|hY8??x0)mvj9O3ICrs(;tfh#tC%_5|uWCEO<&dy{LOyHfO^V`hJ+??) zxFa_cjq#?=Uk~_N#3P5nCU+6C$=#!>4nA9YnE1-t3MSAnI!@&@mh$o`^0A?u2xWBP{OC75DS?gz8MK)o&--e#lUV{uz34@`#ZJjz5?pdz z**csQ=|q;@xeT&<6O_1+WA9WG6 zFEvwK#`tb;EGl_U%JDEq_sY^pkFTBK#X${TIlPY^fCZT6>WN6n)WqMP-@Yg_THxyH zzyKqmc|#0sx5)EGzLPgOGnaW&Q}XFDS2m5qd`o&_sw>wVxm$hKaK|_v_lH|CT{hi zQ9rx6DiE7%wMNMfQ}&fcHM0HZ=mq;YLsN6C-_*>cA8Y9e+PNDUeG;N$vddQU!x} z??ywld)8-+IH*?CKN76zKGDTBZRz#_Rqvo+0=ntq(Rs^u5LNx+6mWfwBG;u#88W3d z!d`3|Vwx%JBDEUYoOWX{$`}9u;6+@HT(LTNABMYlS8hHcXMeke&(vDPMr%$EQgg7+ zj;(_^0g}%oUY#f5ar8@kvqghkH%VGk2l;%5lklK# zF0-Uv0p2a#V=p~?E190MvdDK|TnmGWUUDKpD$KN}>r7o`5jv{mx2ILPGmG>7Hz2AQ zU-9L!MG@Gh>Atc9<52RwR15a^w8ya~9ZUV;@`QnVa6l|={t46@DsGp^Z|aJjk)ny% zieq>HekL!aT{x~2mB@H!zNL)8c+j$MSWT`2wc6PrbC#uxj_?Z~rk(8t#PNAHB%~n0 zbYLQ>+%--H>frF*N8nDQG_h%leJ+CkSmGMsl$(>;AU%b|ei#|~*j=l7yPe_?G$BpF zgV?jk1J+D{)PKcY`UK6vbbcN^EgUQgu-KD3YA99`6a}Tz?dy+!EOc{_c)8O1(11lv zH8(uAg)cGh!7kFK$=X%EW6lhR0azvx_xs!wzaY^H_@YKcGop3}b2V2IZVfX#J?#&u zo6(E)%DIl*bftWfc=U|2^oYhrS~P2ys~Q^y2>j06(49JjL3E=28K?ubgIa$922!1r z1b7p{RdJ;bU)x0hxJ5BH5JOyiQ{9(gBaWQx`60YP!DQR^I|keU=3~6EzQaQ$IPmXu zw*VT=U5;o62rFc16Pne|;G5=s_jpl%_|;VMhn`abuBY@=JEnEY0bG?R1A&NJ17Vn& z^sl{;J2n3KKjZaKNqA=bgYl8*;0%$T+$o&^J3z$0EPG_(>nVzrZ3&i&kT)rJig^j! zk}Zw$!sG66TM>>S0=W_P2A=NlXb4)kG47!Hpy!~aXJpcvovl#YaOudh0!j|BZbsqC zVFN|bX3g^i&_21)^?Zq^6NlIjB8QK!9f*{yLYZ}Mdos>+lI@B(8nL>wGWKRn4&2Ag z>$s6Pi_nn6J7BW4L{`*U8u~vnK<0X6U0;J;PYm|W#NeMvDC$K;-Psxsy*oskI$m)@ z0}`$vqcEP=4xq*!!WB*J=+$AGL!;U$MSec-9!Gx&SZz%y^`B=lg_(p9Muzsn7Lyh{pIC~B;h(h&}L zUhSzw^e^LtewD5uuw-X{*b#pk7o6!ve`xiHw*G3Huqn?govp{Bz~`Wj*op%=|5%s$ z?D}i3h!YCT!tcY{?>HUZ9ePe;r_db+MNaa5ZS2avbhpG5PAJzVbsfRra$Ky z&rFIdNKEcYZC^*T=tcdz1p6WSlL!g^-Ko_~d|an^Pj`3AEbZ^at`Fr)nbT!afs&t= zgE}BL(Sv>U3Oo^iIbJRUladbc_`USbD*zZM3YSS-q0ZeZ*qS}(FGLUkefSPI767>I z6*nl;8)m9hB7dX}|HlzfdT7MXZ%vje*77Xju*0lFVBnf^aRYHtWl%)Dd>&d&&j! zA-l`+r09^#^%Ip$PDcMX7d45E>(~FBP}7-2H-~Zw6)8{R7(jJJSOHnRZo%F3QT))b z18f~EHq2cZhkj=)Mlf9$S`63CpqEUnF)aoEE~u3^O1tqp^~2(I?|1*k|p^3a?;STil_ z;p@i)D*H2ZUJPw5%nZtB;_K=~IfCI3! z7fX1IdAJy5z+wQh;ft-306yN2hy|1=N5^nLp|V8WcyLRJ&VZpFZ@=eWz^8Zam5DIS zJ||{N;L>0wgPxk(a6Pouaf$I$mUkXHu><>hW)cv^G%JD2la9+qAjE1C|JKk2MI>Fj zd~sdT*;h%W%utvPpab6i8`lKWbH7xWJV%AVu?M`>?3;0dO>5I1EymnWzd;jiN&UVGG6ZJS{0kLS)ut z50nTbk<;5exNhV_li-P7@~8 zWOhd%m{vG8vDOx>3fEG08*WBi-6R9L2c2vW#2n4LQc5Zy%D{Jns-hihHNsN)`U$)Q z2FuF7v28?jXh|V)OMJg7nEtr|(gW>0N`1G~-qCtKf>@`u$PQK0IDoqplL$-j!F318 zi)mG&+Lnz0IYQ``OCv7&=kd8UOUaRASu#pnxReqkS(&gy?F5sWkOhWfE#byJCb?}z zfBOK}L4aLgt-1jzPcmj5x=Wkclb!aDQ|pa3@JhoV;?DdXC#G7@1lVlKSo={s*cQP=48`U{_wG=>aj*_#2=TnY3jX})O`S5?U|^K`VhCxLB2uKq z^6#Qf%vZ33$wqeU*zYYna;>#PO|s6{6X5?Q=}xxek&uqt2NI#BHgv23TXV4;yO@zT zh#~{LcJLFZAY9l(_a=W$m4c@Vz5^hd{(QqVAj5T2npE4ABWD{{PD-=!v4O$bk5U#* zvd~qNrK~sC+E{4`qRghL3@{zphk50LgU%DPkva`XoUaP^&m;hf@Yp*jD_&B23Syml z7WWg|2b;ONZ>klT;OL53%Q)=r;R{4J5`#S}RJa_+Ccob)K;e$pd`c7IGRa$c*#Z6| zIt6MWHI;;L1c~J9m4kJ!WUlm54%bwt$5`oIJu_^l<^R##FO!){g9k7FCenjlG2k& zN-xh)*lQ}erNTyx^oT>po07(&Z=BLtIPjWn1OMX+ zfR-~IwElY3-(|3ne&_;TjeJ=MSC9gj10~PI<>t*$OPK|psGAab0 zqrELp=l`Q)=n($KwI&OqN@0Zs zhJ(w#-=lv3NxlO!sd%8M{YB`%0zA_ zz)6+g@nSmV$tl18YOU4Uo5VHfu{!&KAA*q89Z&OE9#ps9-zSZZ4`_dqDa=+{PeN{=MmA$_>A zOIBmBD8Zgo9{J$%l@D3o&cPEL}s-;i=ZtDywbQ0M4U@R zRALfcJ>T$c@zjQ8vaiz0-#pPSouPD@LMjq#h+3Hh)h3rQ&*y;J@_-+oxU^d0TlZsY z7_t5F6Q_Hf`oFEc-OSz9xc{?l?4Z|Kpl{-Aog$A<@V;ezt%|0{p}VPo(=)#>M8`E>M`lIShZLa&t|D=R2iFezGll zX?g9PL2y%SA;Skq^oy%~uSAg|!^(2_+Z5pvEF3;jb!sHZccE^`|IAMaVYFCmbsF|+ zPPZ`ElT%hS=|@zpY(Hw5NU?{UshdMn*d#@8P;B+P2ei7oqeisu@=0eTLNhuaOhaCI zEc^GTb7DFqtb_nncn!s+&!I5$<8M(bv(MelSr$I&X>_35A#J1Blw!GlYRxaPvDs~B zq(z{4TIF*#WyEECTV#VAI`&Kmyg)AqfX9 zoLailBjnVoF@yZ!>+u-&(3ZR>KN@oy)I=F4bSRuEB}!h=SRQhu_65TA9=+A?a@%|b zpEUU6?7=S)#KUK1NC#)|Y%}8OLI;5@kfH((uD=td)GMAtCqT=IVyB9A4Ldq_d|VKuJt^s@7q) zk6cw#baI%F2O9Tz7t3e&l-o1Ux)Kuc$QjM6X6MJi@!;qm@`rbDRcjY%Ch(p_as~v) zE<;tU7o$1$II}L$1qIO!6m0gZ!OJ;cgz0>Yg|$Qdhz^9nDB%c;YlF)Cc5+k#UIYZL zN>43y$Y-z`CWsEd{wyKndM{q-+6Dq#Y7ZRn)S>|t>WuGt5=5vdSjqgf5!5q3)CbTd=5kwYS zu=Kbc8Kw^ws!sv{GOnZ&pGDf@Zzkg7oL~+L0V>zRs$z*;ir2$ zqW-5i4rnuCWSHz~0w*F$CdA}ihs9V3MtSHl%wE;*QW=?H73IMXR-P^0MS-no9 zd_Og*L;E#8{T3=@jlasa%fdH`;C5aYm>ix*3~+G!ZZ;#uMaJZQ9{-*2munWmF=g)x zWc26c;A?cDVb{F#=KQsE*czj*atx7_6qR%9p#LB;3OL zp$x7j@Oifm6v`UkFKISSelO9dK-{3rqD&>%j7dc9$kV4^s24?~^?rk3V|_0f-F@L6Ej_R4G*{^Z8yP;Lxr2ki6+8Vaf~^UZOUMXNVUn<`!kqpDY0j zmfZE#+tF~r%1hH*f#p^@>i=eWNx!ujPFH#^@kSe$LfTR73cZFRZ0r{ntgb`xqIdkpEHiJ#cTON`4Y3i&TNVh(`V;Ud_5U=|w) zjo!g2bj-KrMm{Q%GEtLP0-ztUo#!u=i5@%I$88ELQov};z=Z}KFkR9(CGo!EW*&Tf zC8e6eY@xt>U8s6Y9Sgz57%|jpYc)W%k*mIt;&wDQome9Eu7q!CfNO{;9mgUb(yo)d zy)#tJB}RUg63^^R1!hMuBVzZ#!%sG{ogSoqMc7mg5(trUgE0G3K=PMCWu7cbFRc&) zKr_-!+G|KgF+ddw9Z>SsTuZ1ZN+uzcjf;&(ro6!+AFc&TM>){c>=wPeK2;FX5+|vX zm^H;c{wq_iW~Q4o>l~=%tOWI*P4kc&1n%n8ytC_JxUy%}nr7Ev5%I>#})+5`ZB->?_Am<;r9K3KZ_Ys^9XC?voP9yAhJt|rCi6Siio2t{M z+jZLm$*Af;O@=)*1&roE%@-Vs9L&U8#B$S)g+okS_7YFQ9#EYl9(}DzITKvRj(kOY zKwFTMm%}}MoJs_IhzH`+Y}$@^-jtRkkCsDy4N5=hQqBuw6Txr7Lieyk4d@}^6pOhY z&e?2*%^zN+=K##RJu@2jx+50_{Gd@)!vQr<$_S6Ueo)&fyaJPljNXrJOMN9YDc;WQ zPD4{1WWFvKJvMn-z&N%MQWKUtKL_$$DpRx6~Mch~Jt~qql0wZ}H{N8qb3A|-XgukLKdd38A^-T_&69+o0YC6; zJ%hQDH8slUQcmMf%2%lEskH0ceD?pyOm-Cf$k(D#X9{@FC&Y4ZEJ$<0A02`!$))C` zL$e*e`SmvB+@qo!0ZO!OqtXd|dUi=h7#Wl4yQ`s%|DX?M?O;y{Iz0M$V9N8gX#D>S zIQG{3+8-PM*~_oa;*eo1)qnWzgcMi7ylblICrurG9RLIw*#BnjR(9I3t=0LIp*oGN z7U#v{h`I*e!c34-k zQx%D9zh{X(dI=`fpCqksy^JPl;YzWZiKPKVKe+4)7+>DSzDQ3#Y)X}kcHXnixA{H^C7|xv5+Lw(OQ>WWXN8ado6#&A(8K$6J0&E&@J&3&lhe7Ne|5jYfEJK7Wawts9D-L8v83 z8#UCme)k?^F#D>wMEU0I4O!JJ%;*95#V5~AnYMHNN&C?P>hC#(`N>R)LNSGflubtubMzWL^A6c5?6w662JyyT0VWs%wC)iuHyXzJ6N4_f4!UI@jAS<{7e_fYFB&1jI+d&SxmISp zQriAW8+wzTpvH8u=ERAK=ytbIN3|xK<<{k>z)dA zgvH0-@jWA1Y&$nHO>T$5psmnJx5BY-ufZgNtP(>65&m13mj3B5ziJvkyAiWblGXI0Y*4$Ias7%?KJ2@NRI)3n{^DKlT zDcHQ#7a9baE|tc^!xd7d4A6JlPkl+n#~cgkXc;3&!NM(yU~$dQfw783bk19jc6a(( zGj8Flgwp`(AHmFdixu9E(mttk*56R|p!Sn17g`Z*#ki%M*HE}~5!pyEVnm4P?E8k} zraLy)>9h(?ue!&MSeJ@v8Y&k)T=^DE1?yDi5+-Fb14Fzq@qXYsfvVarJEZl=i><&d z_cTD=topp?mL}cRHFP71(qQw^P$$0;4?xVqRumTi1Ag6978P+sPaO3_Bik)_6(g>9 zG;Q||+1gl`b&48UJ_SC-0efI1rH&Xm@+*8$&Up@SoXERw8yu8hp;dhk1ff1x8(!{W z>!Hec{fMEtFYuc|6b|z~>>G808Z6W%?#nc(n9r-WV+9sO({F3l-$4~t?XzAU{xdQ> z`Zd#YCd}|C$eW5Ne^MjJO7&s~uX;7Z7ZK*E!Db5IY2lm)_^eKiUf(l>w~-Ppz6*R* zc#_p9lf>MOO+&Wy{0||olty!&S7F~aZ1kv?yiYX$(1HZo@&+X}-Y{u&nTszpUA@{f zr>r%VV*0RHoeMReC((1_yvM`2E;P$Xu@w3dX2=EY80vlcGM1 zqssP;Fw+tj_{2P8T<|b10z93c(zS|+KSg#6q8kblJv>ZGZD(Kq3WQ9K-_Q}$tJSxK zzMPGgCQgh3BIe6kiw0TF&S>gaOzuZ@W*EO2&lyv3HRPakYqysyop#6;-vZgnK1w^^t4!>r8I^=M#7e7EOat^@U=J)Z0j|K}sv6N{i`*7&q)6 zaGb=6chRmW6xe3Hkxxh8D0moyXiVwD;I;gip4P&9-Nqz6I(biz!aGeKMf1*&+8~$- zb2pV#y9mTJb_WS&sr}lSEdOhTXnM?SrJ8brnjfTdeCvon3P!6zG-GhE<@+n35VjvU%ZPP)d-$M~MJfq*Km$6gf@*UU^E0B)^JO}wXXfquyAzRzAycWU!C=%Z>lq~`)-INNt1c@P=kKUl#-aNjDEg$hG5<+Prc z+74B%mNg!MEM8>nitxhJ23`t5736520#&|rII^c)+>gFa5V!lF+OQ={iw5ETB-K%P zEc+K#9`B&kk-KYYMherQ##0I^o`FqMlNQ~UM|s={XOqm6AL-#>$MyCa&CJMTDz?9* zS#LhQmLL)7*!ehR#aUKsI+%B+M*5-?fQHfDYJ^L;e;tRudeoVr9K>lQe;MUK+{pl` z(pgPF@n1PsUe&SE)G)fCVJ~WJo57*_6*EZQ(4s!%9;dM?K<43($Q04r>wFDGdap}l zPMPmT96Vff|9s~83g*w|4F+J6X`oO7eWI}m;C;;#!d)*i?(MkPmb2^Y;p1&M4A2vw z#&?|X1f#h4oGlsNJN)GbgJ~H{esh;cy8jivv<)s@yPw@kh&~HWQ=>>PeV(bQ5GCZv zS7$J}s5*dS3KCh79LA{c928JmIQPw!_lvT`JKJa%UiPUzbn97khZVjQ&8>*{KvDBg z-1L6+T*wQdfw)rkVd+^6_iJ==(VoQrFNIAA{6_o z_je{w%1aPq^1Penq$CUH?-9Qy^iH{#s2N(NC&S(y$R2=<4H8(Z`+i7`*huZm(gW|& zj~CCcoGF7-Qke@0**9bzFGGZTH>SXsEC*V4EE!mmF3!Y`8!8ul=e z-nGVi{-|wr4EurIaweYJ4m^6HO$?UX`IElTIit3K4+7J_IPhm*I}73xhi{P$f8npA zilq2c`F42PMU4Di>2`PD*17LlDyOVYyehQ40{ysT#;Ve_;V@!B{NV}P z{@(woT#c_Ee}$(Pt~=czV%Z4X)nvYo(3G~5U5G0lPpb?>UCxm-Ix?5P329iVUm!l1 zd`+-LKs1*rOsz~56IUF&<_9NEHQzp}WY>>h#JCDsCkC;7025{~x0Q4B@Sjv9iu;wx zJ+37V7SpY8oi7@Vzu#8GsH}*EDJ`N76-RA_tCv+jp!qpn>*Zao(WREteW2xZitvWy z>tza47 zI4N||X-VK}8vWmlyE7=#m6Ot9B@{Sf3LpRdn{GDx#E-`kQtOHeHrF66#2N9KAh%k# z2ZaW}9p86x6IF~e4bJ{dgYhzp)u!mEYEC3h&h^=sE%bExi_nE&_o;rWfZQ?geY{X)1yHrT{ywF=AjU6okkfBZ zmXj8y67x2uq5q*1VO5Yt}lR|f8ofb z1QYH(Fa6I{DhA`i_)Bs9hc8RWH%q&exYz@|5UqDGn-S@^(hSYmS!SrBDx=ino@(*^ z^yW8;Ej(`zrbL^QSuQ%0sUER$1b`s85x^pV)y~z5p#<3|Obzbj8ZN$)GvUUU(-=kC zb&Staa}1v|`!GJ=P0YRsD6@P2%WyT_gjD#Nk5BSZbD?%lnu~2+)rMzFoedOqS8b?d zQh3(^bZPsdo~~GLA?i!W&yAgSOG@ev25|0%PMHif$={FrNUocgCQgdKaVhU7pT ztTRrl!EO274cDEbP6GUjcp%753T_{I+G* z)CIw(#28l2NJd}%gsA`A5*hr%5l()jiFfNnHZ~=QraqLUs}yzI6`@nvaD-AktBw{b zHP;zCs=oS1xXyY{n>|XE-wp)O05WrnB)jH&;e|+Obvr|1d9if;EL@Nj^f*Vxg4&OY zDpBaqUcfBqdFlQnNLYew3BnPA0ia?g_!holj}D|2cqBO}?ObIG5i6B9FQfe8Dge-Fi*X?74VW;6hCQ3{ED%uzUtD7JKAxR#vL#7k@bb zZsIInpgMDUY)$EDPsl-rm*3s{*@=Vso`W)3yj?o)I|jyjnN?@m4S`cqw6ulFUP7EJ zvHSvDzt5Hf+X{rrWkpm?@n#al!-2@$@)|Iq(S82+r$@k{Ud!;CcGd+QKHwk))dmiI zg5rJgCr1SZ!Tu3=IR+i>`Eys;u-n)S-^GrXXkDO~OFDPUJd>V^*XJ3vG|e&Zlzy4i zA&~bADvRLN{o@C@UANvz^Mx&w^3{Rgqnb*0nTpxwVkHJI#A;56*8n0Yv0V=kLE91rx275|$^jF8t!Y5- zhgn7TrW#F#q|;$lwinJ{{$gReFKNs~r?Pd?+G{57a57m2z~K6+Vs?^i5b=aSh#hyk z3PAiSGIK~nvIST@yMSAtX~`=lX;fRsLjSa5sP%CVr^5hv)S(OX3T&C5wh|ghjIpB5tFrBy&aGFZhy>H=&ajoSy zP+x6NSVVJU{nkoBG7$Y*Ds~Bh0NhV=>ZOEuNCu>|GfA#RJYG-E!4>fEwl6&7KCY*2Lv82G|oSf<3Dj{MW zjnOQ~&PaNe=NH<8@0{!EWc=mW3tK;^b$eFcQgkh9THt;dR;MHQaoH?NAyE61CIY1m zVuPe^*~-Q~b^TZV;U$td7LMe(GSjlGPOycF%tA-gmhE$MEY(4hWo5D)aSjY@Bs^1b zg8*LShR8SL_~UDrOvHO;-*oj+uHaBcqO?`3BYb8|kY}&>F6{~-Ht+2oCHTZoUA`L# zy@rs(R}S`g@%D(ianMQqT40{FdZiyNT`}@q1+E);@ye-wx3q0kCJ#8&bhvk=~d}n6$Fz`}^QRhbBvI zt#Ur-(mb2f_AO-oM%K$QkK&hG@um$dNC#~3*=dd4f+k>p1_>!6WuiP)G8loJckJ>P zmePvX7a4uaBXeVBb5Sux_S&oSpqVByHZus|#^MuJIt0BB@7ZO_gbxTr^fLPy?o80w zY=I7aJwRA7_ojj$B+Pbhu9mrfd69Ynt#hacaDQ6IQxvicfm85boOB(JcKJdk@n<`! zGt>C=!nFF;IgvHN7eEdaX85@!rQ{2JsI^Hfh3gj;T#5!Y8N`kMf}F&=rY!eIcI$X3 zJW|@76ES6&HYv720o%UhWzjT#g56A~_;B6bWQF zo!Tmbe%M+Qs&4UK3foTvdEm%mpIU$2m1wo_A+VOwSi^{@tB~*A8E4IOIeVgoIZDJW zoTdAgM;vLl^1{48uDq7IQ@0P5b)=coMh$N?)QM1R@hAX~S2v8zsMgjsw!8AP^>B%$ zu;Y3V7Mf`G-N3!1)UYBpj9b7a=%6E%5f*YjDa)n!ENPt@dCo`J4i z{?OO3al{5`&D?yvldH32zCDdrEtmCets0DEMSvjjQ3uc($Ndlw?=yJyCSJU(BLr^F zhj2$#zJ=m^T6cv67RD%Q;4C1)AU9qHr;Dj~rbMH6JJw7=aqD?#Nwk-hN(rCsoF{3~ z7`_`K0Q*MGdmreZK(osDnvtm4jPwZDx%pNBKg$RsazCP%n=H^!OGK`z0~T$>3DX34 z%Yb|z?A41sK1~SVr|!B21QdPq22|JvKuEJfXm+V^qA==0+X!50Xx)mV2=wJ~3xzyb zQ?uD{WICjzbo(lY7g|Of{uF}E7q~1+wxp~iG#Z`tA^>$BZ95o_7qvHmnAZ!{s(tMc z#@AM`EhcrrmQhUB;D{1QOKI}{Va@;eb!Cy5j7-HF*${qcPUbm>ZNEDSQL60uAOo#r z1z$jNl=w-sA(#2l;Sz^co_s02Ff{KI_1mK347{vVh4Za0Nr1g1grbl$FRiTpxA@Na zROOl6DZnK4-6BN$HfI@szsNZk+yc zUWV!16d0e|eC;P05;uqMlu^S1F{dAh1?cTK_~X-XH>GSvt$zPY_)FI8q%a_(E>LvT zE7Mkbfic$YQKoHucR;+4xqHI(BF0J*p>0XM6i7Q+WQ_giQ+419GYML583z>>8!v46H%as=u<%Zy0!JvAvfTH! zW(_iKC-FYt7p1{fGnp~Mbxn>FE*s=&Y%5g|)S=LuI#FrPvoYbD-v)=GEzS>0s0tDz zhSfa)$}H@rO6v#Ed$OpWM#Eh$SpoKOZ%kX_)2JBA>evd%t?&-0<{&dmr2DHpO z^N360AqdFMFFWlfrx{IA(#x-+8IH`6&r+np3+?X=ku2TJb-6|Q+!=?3=m$P;p@LKe zthMjAzt!?B4Kgn7<7?y$GO*ZbB-jmSmb-?$nztRqz?cipfIauk zwf&5cS`!(xjAztnlxh+>k;?i$VXj_E^Nv-r(u<(IH@VDjnB?xUb2Z=Umqyb0q>2ID zN1wD8nXKMd?;3CzbxM}jKl)00*47omG6@*D=H_gG$iE2P^mPfb8KCj>wZ8v&$GIE; zV8)CaQI_)zw)hElh2sB}YQ$JWHGl9aefZK7U!yjU6Aenj^T*0sXZ1no=h?qxFAYqB zxT@2ELwT=&!5;}M`$YTV;?D}NuT@#qo^YB9rO~WyLt%>ldan~ z%q-nxP#V`mjQA(AVP&Mywyxq;E_yGqZ3FUDx`H^XdFnAq zhfmc@WwMIhFMeUPb>L{3r#y5os?QWZaOgRjn&G`!S|q(?Asy})z#f}gAir1jIZbd? z?4zaB-P^WG9wnpMjRhu}hz4j1ux)*}9o_E(5?Is7d*^R2;JX07)%jW-!H6T=$IXRT znmr*%fGUf~e6C`|H*c>@{s3F+2&70I3T=Q8gd;R6iTax7Yr8*0D9^2LG1*8xg-~g>|tE>0k z3?qx0D(5ywgt1*7oduR7{c;=F+N#_MILPaOxEjJSzLzz_$x?cLmpKU|Z;c<)N1YkFz#2Cx2ypC!l9Oak# zmQ&h|YSFv+(f3u*zpXC^g(x+V71{4>o&~76*TXIkdO?Hfz!8`Y066y!JA>_7*~?T~ z>%c`=(h2a_KFo&Mv)C75i%#G~T&&XNzzJA>30%WZJvTLk;)02^Kf{h;iaejf-_5Rh zP2fW~eO_nrbrFshUUEcI?wkEsF)`3Jcp1hwe#2-s#3q5LzC znOs*Seke2A4P7uH$cO;S4hTUUdsB!QbJf=108b*kz&jHuVUk^GCPrT^G>NPbf-uSU z!L#G^Gzxnbu>Tgx4m(urRv=`1xgzEfC@HMp2fM)uA|3kULAvIT*_edFz@6{PgMh>OfqrM-wd7iy+V zb`Z=N(Hf1N$;+{TC}6)a44cl+RmQXH)1ozo1txv25P$-qZyLNlw8V1A~IDY~ZWmYT83pcB<`w7>_yJQYk)11ScIuoD~$ zOprm2d+e`|1#!tj#A5-suiZ0b3q#?P0H*p)tsoLZamz@5BZFc!`iHSZDz^1$I^qo?!rl@FFq=f}ck-Q`1gud^A zoI|*!-E4! z@;ea+h$LVB5DAwiOzsbIaQp%?VlwgrtsmZ=(Q4ybDDIQ0fi@)O8+CwwNbeZQB42o< zq%=Z5x&z6dV}sWja3Pe3X$k`Nf!HLkbkc1y<)b*$vXv_qw#iz4KpeYd8_v#;?=NdU z(%jZmz+l2%4&z7fM`Q&=hu1t-j)Qi~D*YYa{J#EEH$~ zsd^vm-W9gxyk$=NEr!;lW!-!$>-nY%EmtFk|$5Ue#=#(QH9%4T6n<-2>{ajTTo9 zzZJ#?Bef#&Z)>eIOf_13I==gh9Y)sQa8UtLP*)9FgGU zY9Bb_hNuPl_iXCg?s~3tgXHr6d!3a-=P0&T&8sNkBZf$k0oe@|tZ#S9t1 zYka;e&*RVmk@ue8$HV`@+$8k9yKw?vFoqqr8Cb{b;Qi@Y41g3&tMt_`B~99*IL2{H z@fwObi}ER*Vtv=309?I>0)?7eOOssrRO^k*1Fz~}*uioYxY-TewNcY(aKg3q!n%pg z3;VZ)^S<3iA`H1{VnyXDs56}%PVa{&DX<-pjLRa=is0ioL5QtW=Mlf*O%axzyXri3 zXjzMkbS6fK8+Qjr07hO8jw54Gd2w8INq;ZHW46>xUSrl)nR(js2 zkvzRG&R;Pl^_~dM@%E)aT;jcOjBibFllSE|PnksN*dNB}jvL=pV^{nBd?9M*Mz?0i zvb!F>vLlJrWlRe3hnic89ZfKOoBZ9fRP31%qe{bSJ|bVtpC9yqvDUSE7}(f^%RR@j zQkzak!SYR@bwaEku3q2ClnU#o23&#vZu+5Z+EnU)}icTVn zNVNz>G`Znn#6KU_rmp$;%2f1IU4N#B?-GR#i1g2BIA`B?XEJ1g7a;&##vHj~aY@I6 zYQu*%4J*!c!>?bmIyTuv>q^~a4wHcu5n!bEOeqVitm=PLE<>w02W7oX z4es+w0xuzxC0?B$jF?Lc@7p4GQlpn3u0JvjQkwNmC_MMynLqNR0OUBW( z%G1JOsvPYOG914F8E_J!R|?xNpoyr;b-z7;sQWIqvu-4S;~Q*XDLH%W(`7-+x9dq~ z%w8r$tfNO}oP1EbLn;%Ry)B){d&h1_3Veudm{!9x6nCR8^)fB-1vW%zxh-+f}kG>33~iRj|L1b&~{#u%FX$#WP% zW?E$Z;wBh_vPR3ED0z?GsX+R2413-z#SQuB@*~nGWVXGqq#pa^veJHNrhi6Wr zaVZlp@0#*Q=gA$ZwVzVM=}Z6Mf)m8!j?}_k0E)dyWW2h~Qyi*3QY{S5%sBWze>@U( zio*a9&&|vM;=-VVYnl~xKtY6p7s0ZWU#>rWVfq-R%=Z$2fmkNou6xNgC8)eTbuIfe zK-H~;wEY(S&;8pz3@fm7Ip2F&7&H)zF@wn4N}Oo~he7Nq?SHl=PZPCt9AnExITyyz zm(cV%pJA8I@Z5P&gj0o=7ibU&DjM(@@;t|8H#{2t0DLio38f_C8Jp7x&t4H}O|~c4 z5yputXVGfO1t=bF_}_kz!13UIurybf)PftMF7Dm6{UU;Xp+X;Z>mv2yvf@4>@V@jO zmZX*d%`1{KW^)nje%a2)tN)Xh2+^2Z;V2-{{a-^m&5lYc8Pi}Q#7`wlH5wi4^5n<7 z^BHw4a2^5P-PkYe5(gdiI-5Ej#4c73TXmzyhAu>CbJZ*MxO-tIE10^={w8s=63Agt z;ic4qoW%T-`nnD&HxswSazq(vf~!;67Dze;D5B|&vIA6X+jPyCTY7=m-kmz{St+%V z4!b~{@@f++Cn`$zrSWv^VZWnmD{G&YfwZCqhI*e(yUNUfp>j^!X}jKX+3!%g){{9K zK+&;N`_{-?H5UECWG;g+@LQp#(A?dGWParo`v5c6OA>viy_`s1|1@u!G>3^%7HlY(#O>2Y8dS30d~Mg>W^ zsM$|A$=-gH7#NAA+23h;0?@82!m{tbtbzSKHh3;UUfr9aWKTheZ0H@PG6e>WrM8)b zc?68`8vHK3f*d9X6?+1|{VCE_G>Q2pIzqFub712*iMiUxUwS&^lHmQ;qCK^xk1Lx6 zadHS%F#B|SKEO$E5%zMMDq^7mR0vnrtSX?*U>B}AGy8j$2aWs6I2HsO6zfh4S6z(JwZKB!fSJs(2(QBF=k0GCkj-_Ixj5yq{=CJEPqkUK4D zBOg(xTtaD_DAlx5?)3Kp&kWoIVVil$Ooe_c$sRyU;hj+UcCv6O?e5k8t6>Qphy*TZ zbPv#Qhs+BM*(*sh7IwwLyPvtR4x%eESQY5&r=7~I8@c!?(q3oi8S}qwjV2kWL(T4y zFMWobz&5Xc(abpse?j}Q@qiUnFCRjv^l?Pu$}hMWFQb#0+^+Z za(UsNWLvsdjx!^fVZ4Rd7YsBn@wKk5)b|bprScze^OrZ($RMIs)2`J;(XL5-sUbhh z>?0s~Lugt$pOdHdop5z+V$HmQ4EshYQf3|f%K(~ClTY)yu1+|iw=fCntqz*K#jzJ5 zEe)`o!1y)a-g!{!_}eF&hk%azpjech1XO*eBhEr>bdv<$>Fxu*OEAb|%1O&|!(2N> zC{V20RcDSvG(%j*$2J8FoF@^oL=t7mF}|x<`uZ5(P=usA+ZIYR@FeIkRqL*M+2I;; z9>e!BF?Of2zZ~RCuDG>1^D|@6mqh7h?4>kzm6zyt+6-6)BcB3|usTJ=A1LO5O@^@w zCIZw4P(KSHQ&R_2hO)9zGbc+(jV}JSjpKTCy-*nRVDUYtqCuS}f+`zNf5i zf>sorA6&(Z{c1Q_*=WZ=o^n};sV^{#v>}%HmPq>--cV)m5Zom1t&b=M)x2l2l$_zG zqn0Pn$0bmCZfYfs&ra>k*pWoyMmMlLd`aqjlOAxLN;%3f{6FgwqUr+j>pES2LLADS zY|cXhH!%RP_@sSP%e&EE4L-ted|}xVA~Rchrh|{nFg@MG4~U)S4h5epPnV&2eS7}6 zfzsifQvjH_dk>8z6*^~C!IC%5qYs2MYfw)LrzlZwzIfkB6am`|l<)6skSYF08Mz}3 z9NG*BD^Hk1sZ)#zA{tgG@=5R_jvaj3+sN$o+w!KPM}Bzx^WXh7e${Qy*!f$mMcxH6 zpAJp}xJ4I+GEzP9uTF;qW^0Ek#@z~IQYTZ)C1pw#g$WpCp-Yb&xP}#ub_o`z)8jzE z5|pW8Yp!#Q3qq8IVky!qyv63K^@nqdj(`f6Qn{M;HaT! zO$c+@&&m!hKT`VEp$(l_aYj#x%OFS^TnVfIf-|po#bx(?Oa_k2HA|l=s}nC6HgS^= zn03<@VbnJZzQ_3LGY3eu+W{K2K_9B$I;|;~6)%YRGwa2b+&f2JjzcRp_QeDL^cfcj zq461SuX??m!M#TJqviVZP2&6es8`^C|BOz5pEJTH>c(fMt z+@mZK=_E5F*t5`tq=e8P$MA>b>Vt1m$``yhYDAxTZj;m_g!Ng$0blPD7U6OxhedAqWi zBwLi30q9mO6|L9~SS`^t?{NTOp5Ab5yAFkRuIF7y!dml$n%=StBo}`iQ2EK6mt*$U zB?#IrW(;8IJ+;)6f=-Q>(g!Ln{9-Mtkl1oU?3~7FexS`5`8t`uqz%>H9eNp=9su=u zi}?v@9PLfQE=Z1+uB(7IA_bqCoIqSyLep>>$yMk{w{9~Zvv$rjc7 z-schQo@_t_MW0N@Nd!py2!(=syUu}8^S(k6%iz$eH7&hl>Yt@W;>V5+~!QcSmq z^#dhQC1aM1SRb&~oZ2qLQ|i>tW?Tw?+NMuG7Btbpm!C#Am9{|E+f~kJB2^21nFBzv z`UmZA)KAni_%7TTsa`IDY+hkx7U_6pyUDam;A%@Ynmu0!_!me!+%IV zAzWsw?#L1tD82&H3{usT@}WHhrD~HDcc!qERIu20!GX|MQ2ox0 z06E>xTw{lBkJt`sMTxYdiZ9gYA1ZjC8ZRQq#8|C#2$+swccWB2pXd*2UbRI}xe|2C zmP{IxiCwieBewT}*RWu!wR~Cngw1DkG~L7+mk6K#qP{*jQB+ltnX}LN3}iAk4kyg( z&!P(9z-%zYWF^G1-x}E@GfCDRHB^8ODx)8_)ye`ks(I7*{+U?|!sZ5Po3{)Z9(wcM zIxO2T@VF<9i@wm;B)41QnE=kY96`xoNr4hsqA|+3p>S&iR!=G>rj@N=SRfR$d^vVd z^z;k0O-`QamH7PgeFeVAl~W?WCa)j6u&d;feeqL3Nq-OfcarP*5|_~&;fBjkrZn5L zn*9Mi6k@fM3^j8Po_)pk&v%lZ0oBUFGzyuf1X3m5V+H0Z)z{xDJ_7|c?Vs&|V`;(2 zPBcTnF4|K`lDWDz0_=q6sa&`xbza|0t`iPZjY-(uI~ek+E1qy@{{lIYS!s7Nj&qV^ z^~`uOPOekI@&;<`K4(vAcxvhmU3JP~E{Zt^WXVRsy_+Q^$44;!P1!t_wNjJRLcdIE z(q-RPMgXktwVe+Gng1`0w*__p_pkoscoq=c{*ER6UWKyb zHF%*c!EdTnwlxN}3{#E_{auvw0-JdEqL^rjZP%m-Fy1eB2M7{H!W~4^LeXex7h^Dt zEia@e$UAhS6=aItd?VL-(`qrzJL_Ip>au=$?Be_)vwyKOE~O7Wy_v7=k3vL3vAZ73_^K$#fndhNk0^bn-O(S|I(m zn)hFez}VK!m|v|7a6g*OgrAwN3q!O{#Gsss1NH2r)pW|>z9^F^qY%apQmcPQE6x`m z{rvxUBSx@B?g2jZRrr)*60vz*SVg3M*pY`AHbGU|lz4C{u8K+9%Fa7Dt}!i?VZS9; zB<`LRD{mG>`Ei`p0iIF8=7YOexta!|*TtP+A)}cnLi52|cRsn3{PHzH)-k~e z^G(gTJYkp^@&$|-H+H%!Aw!#o10S%mR7j!mI_buc%Uo7-`HDRq_eMFXQ}%5PJ_t-) z*!nh-DAcl5-2yZPD7+^C+eEjD&0!?{`j*rX70QeCd5a0ZHHiwYb%1I*RY7@V`9gS- z=`w$&*cjxB)0;?wwKi#xrTz2ob|;VDd!WqX@T(VyOXtZD>Za}aqpTtHRephmYeb&w zg_Tx;hpV?Tk@NB^X9Z#H!;>1{m3M%3+>09K zad~`W7u7^^hp?I)`_i<=4UnuNh?lSf5_h%HX=a{Z3MBcde}zM2P=~5c%2cvICx|!F znIH7PwBN$3Th{+;agr}SW8N28iN{K6&58}wP$8AcwYRX|Q*Xw51%|Zlm+5<*C9u@C z8gF~Gb3L9h0W9Aw6em;i&G%8~nFzO%JjgH+65(sggP^l90js(7oEBszeUwyaLJ7}? zw%V}$V3+h^=(0+K)}4AxjVe-DCd|U;@* zsvBA*Hn+wAL0s}dAP~XAlJLn7Lteom&YFEi%~;~yr<7w z0meLbWL|PS>#2z1Vc*@8kM^a~(j~E;~I|t2F!%$Y1*YdZt zZWUDJA_Z$A1J=LheRu+F@2R4!RS$z4U49t^IUdi)##e=m1fKWM*tZkxq8)`<-28Sf-M&DCmzRS+rk_If;4=+RrJk8RLn#%jxl9*Le)R|8@6Y?F*cj) zVS8yzR_j_z(|_*L7~ArSX?OM?0-um9T4-P^gdhf>n8&}7zO(744bOE`BzQkIn_=IT zuwf=!0(eOJag9>wLmMOF?MYph#-!G~>BXU-WQYufo?JT7^23f@P~vC@IdOT8L+2FJ z+U5eB2J+=_2Jvv&usI$<8rr+Eis;TF`2XN!LKD<6^zw|&oNmyK#mBw}u|~6V&L&&5 z#!c4z*TgX^mMA*zQ6^KQQ8~BGBxsTjr$Tlr=>tHmG}U6Wf8@Ca4_?1&3o5FMpb{)G zxQrVs45Er1N$;jn)sFQV8YN7snp5%vJ(l-PVgx87WJwE30!otuXQD5$$5%Lji(z?T_0dH7dtv9${YiA0wPT+sM2W|fYqWLHfT?ln7#$JJo;PTv8+fJWvQ`I4&*N_&Q+npg0 zVOEUZ8F-3OFmo!}0tu0$yp%K-GFqH;B-Dcl?x8o8SS){2c0+4zg*i3;JVo4S? z${hiD)^Vyj{j?rWaff5=prDxyO9=2cqr_44V-QdnartD|h{AgrPq;{>_;hgJ9n)DJ zg6W4k*S_CAu+RTQh|lyOh!e9TVUPE=$`oD&u6=%TMg>@?XFXADzl-P1m{B46L)1_` z`P(wc-{n~Iq`;n#8GUw8Pz?*c{Sk{?ft1V8#z60~!;8-H_JJI0d)?c&#;?}wC4FM;O3R`B#8DK8CX-K_^G8~^~<wWd84=dpL) z8*L^1se~nw1#0I}QBAB9X(1u>WCP<+;=WFXwsTb( z_WX{idj|cPFlG$$YlO+9W7BqjNodUc8$9cQJ=8;Eh(yqekP{Na60X;?_oMB}U4Q{- zHBYr1yd#`XWQ*J%LrnueA+n&C2(DNUbO38tws=3LSyd5mD;CNt7(u?R$G(inQ?v23 zHshYy17}o_jC+M{qt4VaLd z)C<8xOw0v}OyNvAb%`@T7mhn%&^(k;R?B=-t4%Rs0y@rB!MgO0w{{Ejhmt+<77!RQ z_i_Oq&dZ6+Utyf2tVcip4s1Cf$;d+n=YS#dGL4oq=C4@roHz}ZWexsRQz41F6GMNH z#vfIxFHlhbHo#yZW}^B=h}Re3!=DOEij(kCU8kPkVb;f~tp!s;&uVo?J?L_RBa9J_ zm?|h$(&f!`L5MA_L*q_KV@zA-8k1l)a;}|$Sj=+n~;B0qYN@Q+F(P ze7d)<#0#+g;x0pVU4yw5$>tA-u!P<8dZYNXWc8K^rv(C_AY_2v=>5l4iS}h03}K{MYgF?*DBBENzRn7bVNDpf}Qx>y~}LDY?+hh%q|AY;G$1oiF{k zZI>DjxO=(}O!<6sYxLpOSLg}8k<|}<_4>!a4{fkJiUE+qQQHbj`d%4{&GqomI^GGSOMb&9hB ziikA3>GG~$gq`VlU{+s_|EzcXLj2nB9G-bJI>;A(-ksi@q0z1;_Yi9*=g3IFRDyd5 zd~!CS{yY{G7^M}50j-sYBGQM)Xw-eZj1f6*@*F9ETwx8hu{nhOxB?_5*h8)8<-6mm z&ClaO<*&S&+uqFxw_ZhaKL=E zpndWv8NC_UKbrOdI$_bs)fwCpOE)2{6{{PO5yr~1{12wpI4~Gmj3Mp(o*sl`!6E)$ zkZSG>2r8HImALr@pP+@TL5w>bjowXQmIN7WOga{js~>hhP(zf=3Rf4?pJT`^491+U zx$}al+HxFTYMtOCabTNV(fzKc=T|(0nS~SE=)bxhM}RDXk%>!Y%}2@+Z1U;+vikuF zo#@z8(nk^5^4sGdZtjVq&oZEjN*fq>05sIUr5jX*Lo#Fd+bcY2_6B5%z?E=*xuSfx z2xbzD5->PSIY*E*!)O(YWp{_#D$2N+2S zc^Iq_COI|!Xs%OIMblBmWf#e$sErYyUX3mZ0b27~I_`0V1LcW-n$Pc-3Gqn->2I3A z8;DDlIR~(&gBr_?Ao}02(d>krB6+Z2-tc_*F5?RPs~S0(H(Q4gWR73M&_=$Ip=4C= ztI|g0L?Q?|prp>=`GDByRc+tOB5sA&OhU5NVd*DKDyvtw^i0NUZEG##ccStg<+M~_&*a&+4xVizo0 zbqXvE3=d;%vI%DWuv~6hb!>{ess5xx%sWg?AwNd}mmi3uW|`za?uR4CYe54(C%FYc zw{)z_XIHVrej~JN=f!3=$GFcmTd*ljWvpPIzUfm&BgtS}ls5X3QQjW{L|Xj@^%l}A zx{Cf}AA2sV&@K#h+XF6Fr_-Pzdlnhf7tq!jC4*A~*Op)H>UwZQ!Sp(=5|jrS*j!=G z`Xszg5fzsk5BZcFM8AKiou8lW3AeBXr-fOx7&WB%$`JJkxIZ1Aa0;D5@}8$CJbR($ z5M9SQ?F6{H?7ng2yy_>oebf9i8y)DFIhLc1pHHoB=Lkp?_#MH!&)OM5_lhvotYH{+ z@afZ4V|fSZgVy31oe1bL6woa>!ID$Xle(RZhq=_!(VFTlf^veL$4hBf*{AZFo7?Dl zg)Kq1L~>8AfFvuZ}zI(%y}^$au-*AkMy1It0Ko^?(O~x7UuX zgJVo5_P{t5v@oMdw_j>ZsJNR)?(3~zNgnFMCK zsz%z+*Wc^a!{j}>BROUpkq*2Jc+~_M27v>h9&18`IPBjCxp#v7B10$C+%9{*oRWOP zDRW=a_SpIf=?y;q$55Qv03tSur~;+Hijs6FX*~B<-|gv(&q}M8P;WwXb3y3_AQ*BR z{7;>G<*k2FhO)ow%<|4Gr5{fJ%_fJcHs_*Y(@tFhox4^FBR6(t4*oW#C5^Cp5?kn; z*x}4r949v}$Y}FM7xhz{1?M z8RZx}HLeh*Vx&PdYno?Rj24N7wP_8kDo;PD+1o+P5jDF}b%~xTT!BjOw%Km9IMH;w zDiV?gPb(R6hSfD};@t}JOmgCI-SAuc+PrZ`74_Y1^_0M5gnUdkD77Tw3Nz%Ht38NO#~bgY8W zW3>u!{N~5)0C;K-gnejpC!~^grK~udb=$;XfM%9$6E8yhELbt?ma8zNOA-+QDPM3G)W**+nl3dMEY;eQ|OW8$$W|=hkHId8uhLvIn z>CB%sC;*GafKK(ao4f4W21+&xZ6m@K&kGAY?wfM|j8$UZTgUa_yZ1nl!XRX7;#x}f z7%Af1g3J)1f1EcR3lo4a0W6@G^?;Ch7q<7!UdL@)nio#n9ox+tX zL^!FD&H<>q%LIi#;Sb=Mi2e;D*vkqg$d}IhOnM`D{ zb!qrOIkQme8mOu9md@<*aH?n4WV`O|0r+P*DL@%-_Q6Vmf$!@3&{PFIg(5)HJAZxJ zr8LL?c)`^+z-+Hh$}Pk*QrE#GQ8(T%QQko5q;!3Mz3CXmogu%$Euw7huqi6_`@*ISMWkj z@+&z9w?NQXM`KN{_Ks)k7wBg=bNZiv1#)DeAI_b~zghPOVX|v@9@4^^StinWk~Ifc zz8*s)iEoDTcCjQGka3-#-VA_L3zmn;G9Q`XeIUH*lxR^?;Js=|X0$N@nSaPkV$LE0 z%Ui>XEeS}}p4*Tq*G$yOL5!dE*P%lz8z@*8I-wuYQAoXZGl$E~BbsI&zv$?uH4H5s z(6LJFNA6X!y2Xp(QT98cH8Q?@67WXUnYkec-y-ha~Q_$kh!H_%qc2ZxM_a>=>mj(o?k<(J$h z?n&zyZQsv3y;ZV_`>K>%4C zGaRSXX3A6il~K~?9LcB&a{$`cmSgb-LBBSbTlI)1aSboF?M~FC(;iGLz;}>_craN+ zl`CH;?0@$6)pBNPnuOkxcVa>(_VOkNVZR;&C7Vc4Bhx&31qu6DU$82=*f}T@ou_uH zzs|EB5*`XBbZiD^PT`EHx;o|P0bmml%8=7Y^lVe7X7%wU1G+ymYx;q#6=Y9XZS>xr zr?@h4zxNtC>%I;V+F3(ZjoXlx7mqDrqSA1NkhB#XpFchcIR2&v?)384DITcsj7*ww zlnX4I=BQzp;yAM;rFJ5XERKEH$2TUs{8pXPqhyVIF!peWX~Zvi|Ixm(l~Zqw#hTa) zDdH!ODyNe9>|I|*2mM+?>ak$`+lX{5{^V-UZGL5Tu!5(P=erQEf;@%!q>K%o&rYz^ z%qD-0tjtrwcgrmqsLX8Q zEkFweoe|1~;w|TJi2cxEVFCcP@ad6>ihua`r=^mT&~2uBNVW?% zPmq)V8H@QU1;@IOwndv9)sK|0rC+hh{mU{22PY-=o+xjemq``aq)r45UYSW0BJKgR zxK-#OyFlG+u)w7X?Kc-sZi+=F&2k2NkwGb{aXzM3z=_0Ml{T?w4ztEzA9lsk)BJnI zEa7me#~rcR1$d>l?-X(3DB`)3>t0m%Kqbgy7ui zbg)G8%2|ePYJlZ3Z<^2}CbG*6y5H5R2dLrhcBR^gq@&c45Yb*+#1==sTOY14A2}TG zX=)zl7;?j)r3u53<;L0XmXp2J2A@1NTUmi$ccx1ir~m=K&-Ci96R)D_ ztM2tHLNXS&#j7%46}lp(95zO_ea|w&Ps?=aL`$dKWkWYff2-+wJpu~^M5;Lf45d%e zQ7+5DOiJeZk>~yA+V-`DqXjjNuFP(<2`A!!K;DO;)SDKCPOy!Bm`^Je59MH#MqYAk z1dP4k(E2Q--;CfqGdHh5euehHu*ET87vEy#hnapM`SYl>h^DvCBS$rTl`GeH2 z&u=GVXM3A+(kcFneE(mMonJbaqNV%uxCE>8V}9-Xm943tE6d|O6YgFGHoZGKtdT3Y z`woVmhu9(nuSbgGAH-Fnm<{?H9;8cvmb?jS;(G+0JQ}qVIHYYq?uqXhbCm@NWrfkQV_yw77BTh#lRvmw)9j!xP*zBvHF|}^2k~wOfa3a84ESUioe;t%>?f>oY%s~{AW|%9dsP|s6_N7%8XtlWbAb0Z+O3W zBJA8y94I;q47d5TySs@X0KcsHu>{B;A8sPgwWM=(frV|hu8(Yyw#wBB;SX7E$=mh` zc#p^br#ze|lU0Mq)51)fkD_he3Zt{=5)#osW`|f^a|0X$m`1-!ywl9U{ zUT4ZqFA$0X1^}vaH<}!vBv?;Et~cCAQzo6U8;YR;GCfatVesWwh38u^4l{3>7*ypG zqfii8H|)^>WX{~hr4ve#imW}dFdT3BV* zz*WrHQXVj`kaIfYSVjhR7qoym<|T%LIC-Vf!PB%E$vq~;o0UYOnxpSPKuO6h1(FJh zM`4!VPpT!KT0u+z8F{$$IK#^+sM5em@^o8=$02(vpYA-({i6dm+y>u}u0}u64mdK4 zKNxZE1ya}@0^tg$Kr#2L6{iF+6KdX6O1EpCyKNlJ?>3grC<~A4cor|)d~Fw%e0rh_P82}p|2HcANuVx z9==qXY21_f%#gF}7>}`kxP0q#(Su1FrWw6>hdSD!5tpWe(n4VgS^c>HX~7j>C0a*v06Y{OWhoq18dE9ZT_ z;rH;-1-KB!U8S(zjVgyHbR+>hnl4>P`ue-qM=RSwW-}0ECgO2r=(Ho|zbW06Y~?Ar zJ;PKtA{@pYv87Ru{+Cvk-Jk(q74Nb$iUxwX*h71{YvoQpb$^Dj^GVDnMH#XYQz zlFTNnn|<(vbkmh$KRS=n%%5(9}0!7gZqrU?G0be`uNGlsk)8HO`z zRQ-jGqIA5Kcdwkd<#40cV>?D4K5z%~eU{r7QzrvJC)~0PA2;QD)aQynPS0o_2Hd*Ii*NxgD%I(_bzGC6bp(be4@yL8c_4lK&pe2`b3jbOPF!S zRG1@bW_TRZlMec-^li(JF zwc=oUv8Q4fD>q*R2?*r|B^!?h$|bS-mQ5(l)#{H214^A*gIsMQm=V(i0zEV4l#U)= z(bI@%*4qe!Fc)R|I)={#Vj+=aC-1sX%zlVkT61d+^2n@WY3lW_>EBkS3eo&1hqI`6%->ohDefsAh53*zKcBoHfBg#Gtp*I5`hu_P7+a;v8Tvuph zp|m0sy0guVO*5#`d${a%0v~*!U?=Om9bvirEwPym+irYwrmRuKe;&^cki&U#TZU@S z8RoQjdkYf3gzuxQx@gT6b;o{uUQWXy5mpuoN6Q!Z+sR^l{aO&u+!fyaZ{3hXLQUlO zc^j^ETV%#?(P#&l8%TZiA}%t6Y%F~5kObg}z^wu!Ju_RSH$gQ6f{dVP?Zty@_vn-n zN>xt2+@lDCZYy2tt|BFQLZ#Gbu@gU+Y^_K-GxjQ5$ADgwTdu%$!iqVDER-o^P`#cR zIMcIFK)R!r!+$#Og9AE|yGzKjwPp2ID!quk;{_2># zykvH5h>|_-+7<>o1p2@=`sv6bSfW@Ry>t)P1xEI4Uq(= zYKO9j|AUH)#$ebPZ0;aTaH!&1hI6kl{`#FWL-72?4mge>0LQTh!hS8IWaaKva!I#lhrd~Obn^imk2-uKbRD^kOfg^FYDxj&0TMmiN@@XH zsEW|+OC8eMVhd@lb2Lgb!+_pmG_l40;!8bbnO|!2YRB+KZ0*qUoKo5dL}fQ<(>F=L zHHYryb4s4$p2%RQ6~!H6)PDj%ETlDS|8ZPWyf@6k1wJ+OK055?53Kky$$|*Bg>FYR z<&^sztKG-@1~{Bvxebx@eO%!QUVVn$^Un2K|(wC*o=%x+`Za-%Xz zYa!jP@}FNMB&Rv9&S=y)j|A}0g@1^!{EyVu326--`6=M(qt|U9tnP9CQ$MWyO9hQg z(_mUZ@2<#!(1{lCD;q*;SHpEyk4CeOIBL^zW==w*;z@iD0>1PDal&aOhozu_eP>Mr zwmC1;^qB*e=u{64+oT$mE8KTl?Y9z1IJQ8^3W~l%MZT|KTx5=4{mG*6c=i~Dd-b=K z9hNg(S2(XFaR=83)6R^A<{;4~xI$~|)ekl)=rqXas$nk_8#Xg&i8 zaJ1fGWg$0&f9~FwPWt0$@wYt}vc;uGdfs*|#Le5awanp{h~U1eT2aiv{dF?UrWtW( zk0av(&ZLqehr>t0UGBp@1OpG~9;ZD$G-=v8M4LJ03>+2QG=_(4!nQ^}lwXBn|+N?4!jjr6Zt&*73 z(}J(I*|Yji>fqQVo*dqwtus5+D!$oS7G*&Jqp|q3E@)qaX8{tYpO{>qrhk8?+d>jE z)Dur;fJ}1AhFb{yWh}5rp*9Q`)yV6#Oqzb4$vcon+lx8z8h1!(*RS6vKzp}X`1IAA zqV&+0z8_?C1#;2zz7xu@iFf50Qwap=>hdGO0E5(cmhKD6>%#mFUZL%OSV5nfM&mLZ z<7OS5?(d}PF*twGnnzbYbRKv1*HOMz1Hw%kaRi4Gy(sbG-fC0xvnCU_YL>Ua z98>W54LAizW9d1-8v7(r=eTZ8jJF{B`Nv<)(k+u#Mjsl?CJZ1j!YZjBV(c;UZkTYf z*sc7Bv+6(SKb6LkV(9j-rr=FQICU?Z0?--D%58@i)zwp)R+cWPK!}|fhJvAPe;M!b zpOt|Awdu@w$25xReZ)He8D_-jqI(Xbk69$UaA4A=#xX8Ql zkl|Ev#Z6CSh$||`nog(b=0gLoV2G8tq6c2iJ8M}fI<-js4gskgP`Gn!SQpI6?VI8x znJ8HVY%-B%gfO4d)tlpjVavAhjrTo~CJLV%8S}&Fz^Y~NH~<3+Y_4`74;be+jb8Q$ z*+x!9g?^bYH*>8dTs`@t$D&`1-8Y-4@**G?w(1<2=m&K_DqRBv)8514qJgkCq|Rf% zMu*eFQr^eQX2Dy5wl<}jF!Svy{0AHlI(avet9cabHGQ<~4Tad5kYI*MYA_;1t#RIK13D+aqU%kX{8x@- zy254TQ?SBOtLcVjoEX`yTlea`@+(*6`&i7jwNL^_uaan!zm2aNbfX9q zL~c;hq5%T{vNSDo{aM<+p-;Gk&2^%7a$(o#QBR&hG-%SFBu@O z2EYpaV!WENHjx%#?rVdI3c4z5T6ptt-KZ$AZ@v3Tu=MHdLEskk$ zd=GmYlBm2+SB7h8`4_7rMCJzcwkP?(OpWMptqWD?o|#iDTE3)WkQW@7pWRhf&Uot_ z>cmkHEk}2mdnRK-z~Y#z)s}J@y_oR78S?b6t~|WOm~dmdda+nQDK?-iA$kNFA0+fq z?g|6vK~~{inPof6+w~hlI>lJn0GQ5#pQPx-+J<(BRhj*HUX@ov+j@h6#T0wGL`p$c zcvMQ zo#);dpME=>$$y3x;XvbWhEQ>u^&wQY9juInQg<5qFm@Qkn)3G_E-V zlNwW(7fudv2>5%aC?4mR=GvM=T*YnDZilwL2ltn+vw1=rtKKx-X>)vU(mwKOZ zA^h2beyP$r(`|&EoTfl?M5B@P_mdTILR6PL)h*FeC(&?dK0Qan^@=)`u^v``!8sO6 zR|_@1)O`NbOL}W&+fDnUChF@AyV5x`F?kycsW;LZPqVXqNfh^FBTt1HK3u}%H;m%3 zSgD%i$&r|kPy~=?_lFskdWjd{R3##*a>I-QY_aIJJ3{4f52@NrlLU_&=E0t0xFJ?m zRMp9l0B!v1s6j{%=eM^ofFS;z;0Q5&!JkbhGEjwC2TzP97au=fE3)jK=gXCRI~0Fe zSWfNAb5p5Z4B7~#Nk6yiIHQhuti%B;#H*|s*^4zUm2@Bj;H#mMN@wNWcV!EDDsVz| zF{1z}E|zo{$^!6oGy<2zi>#U#oVx1)!M5rHFYKWRl$Z2Vm=JO(i zd3}mRNwB&ReKTtww(pHvNs*6T>U($`0h_hctEXd}_S-p16%s&yJg!bVzqtT*?R81d zacjOxtOC8!2NhjCRcZoR8W1^->`XlvFzXmUC0}HfH9moV2vBtnQPQD(UrF@M~(hGW_!)h!9a73*g(u=$235RQzHgH2W&sT(4<$}doWXxvoY91>$; z^bBOz#AUg4bKvchVVzAmjMFuw{);D%P4!KpX5G_uKiU?~ZrOz|QPc*9k9!k<8|wKz zFQ|z|-#h;!ooYVYcpUiFcAO!pIy7JxsK7lgs}37CrG4pB(gihOQ2tADhC1Yn8x zC0CuO#mZ47!%sZ#4F3g-2ArZJe}RcqgNSIa=94USvX%)e)%1=Dn8)3h#5?$c zli=NsP^(r{Pt;gl5^8wc6#P~PuXXMbs@KD=PUXhkV1JR5KsqmMHkVa-cDUa$V8@$A zpj84gqk7PSSjFv0?3z4k=m0yB;Y-i)Lv^5olJ>YiPiW>UhFqSVN!`{*8KA#~2^aGT zw11jo=NR3(c;}$0n=ZJ6pnU+HHta6%9IOZCV{g5tOIrpgvsTA@Ar ztwm^}`#&+LRBy;lt`-#CJX8aY@r3bNjFL5239KIKu^mB>o)0|h>B zcWexQn&tRTP1LooINerz0AW5=jL9M&b|kwpAik~!fI6h*d-~6jq9OREviu#t6o~nY zNO19^+pPk*&)SY^P_k?QK|sF0JicG7ut#2XEl@VgAn?$n#evh&JnZ+dcHu1nS5-mU z57CgY(NjoGg-#ugMwWj4pP~%M$GDay3s%(kQ9srA6KQR}*I{=eYDun@%f$7teswgX z2d?F{Rs3Ns;bWY+p}x?@5om(rr49OLQuYxH@?Gp!NuFY}$Dr&mFfjRW!0(Pg;4NJW zMsv(L6jl>TyZN+R^}Kqud%7NN-2AW4HQlos17ew+^yCZwP2lRFcc_sTn-|WDgSbl| z3i#9`pkN^^pj`mxw~s`ki9)?*2t5oahJz<5TxjDzt`05AW~B!-_v}0{zAY-{IMi*01?&>{rpw1(Z12PuWcgOE^CMC8qyc5%Z8sp^!p~; zfytjq9fpbsfF{4nwd(6E-L)aMt#k9vtd|gh2ru#RYJrEmDa|=WSuVbzS7W_c^x0S^_SgeUgofY~fJ6C-T}Hw^uev1TV86}d-IiFC zRUb=C5{I_OqPyuRXgq^z$x_1d8@(X29)cGU91jBkUdBBNN~Ex01lMYD|Abe*@EK0k zKfLk282y7;A4;+Hhvrv4oHqWrnZ|wj_vWr_!xR)HR%6N zOirqF-b+w;MnzdzJn@2}bwXkIU$KJ#vgTT78HbwV86n|R{gHKlFD@Z;N~PyF#9wJ6 zB^cBCRN>sVIxKjCHxJhB-iE=;;&rl1kK7aH!Br7V>>qv0%8}2(4wT3mUSqa4x;Pfj zd|km`HZzrax-JpZIJR{VOj}jMEc@ znc6V2rLhXMwev?`kmi4_G&cD}R-fF+@<+w9#5ardH13_M+16l8N6eqUmG1=xTVOa9 zXfw~*`i_RF+A-pyn z1${1F1d$_I@7!tyd z=;jHvSKPLs4FLvZjKme?`!jJ91Q3AN!QxY;+p(7cSQ+jP8aCaq zQr0$|eyD4BP%zxVJ=1hb*VQ*s<7~UvS=bWkboeN-k8D9*V({D*$ zte;B0hr!d1I6urvgjj%D*DHR0iuOEV@m&R)r1UtOzt&+~XvGw4gxWUKYjSNM0{77F z4mwyfD4V(x{@@wR9F~TvQ!Kuwv&rdabKbhU(jXU|CVyEvyjNFE#7xD&5g;iY06r&4 z5S}Is5&~75GSvHcoWI>3Lbp)paz(}IxA#bjG_hf4n$$wRyQnmP%s=IIxC82vC(+C| zd-VzhYo84RsG~B02d51ebs{5x-;#V5neZw$m&DpOOU=M?jp;dRDnl@7`1Wx9KPgf~ zDm=P$?Cab7n4b<19W$0-8JzzH?lkI4t_Rd>N93x$oE>m}Wl+VX)O*`qmc^2VIBH?G z;N!GsAKbNA&$5vFZ8NF=yc@v2ZA2W+5R;k6D8UDPB8mr4>z4)09}<6N12i!eXeVI2UXGA?T_u*E(xO{ zF|7L6-rBSyM(er$dX$7g1gNAAR3Md%4M!tivkoB+S)uep6m z!z}(}wJ_-+BlU>eZlagFRBXH;3!zr|1X!c=d-w4V(y5o;WriM`3b#Fy!b`5$A4_Gz znLj$vv#_46MS$z(r1&cE8X?URo&Ej{;CV1(`{3G_(>qhhV}$of%Rq55AX1W8h1Df; zETK1uDA@G%CFR7}A@Q<!9%I&9HWeMlwFgF!=SB~X|h=BYW6oK z$g4DjV0m(jkBG@qm6kuGlgLE5qA=2Urs>tNE@TOZxuJAUSfu%8LIYurUgH}o9@+1b zabsA=>1kd4It0n!BGl&YleIA9Fb)0rTFblLAOnr5a%^ab)>^mVMr4SZ zk}ZbeSR&%KWaOtqGt*c%0(&%=0tgqlZ3Um_mr2DmX%EOZ+qLH@?<&d$6%G z(t2O%lw0_w01B#~@sbRaf}MfU!`_qkwOO)Hk`ikH;C)(*ZQ#U-!`1^kDTJhL@a;-U z9XU?vIBb?Lx;|Rq+@}FN9%41N=C}4-CZp+`72u+lGWDLUElJh_cjk2{P7|Q*Cs_p{D8}eye&ko9L>Zo(cDOaBGSP?I?NSIU1o5nruPwbMp;HaA1UGdf~=kn>JT%Gp^F4m1*q_t6-sHjY}Ii0-0j)$E4`e_hm7a9*~XiKY*g z^U=y|S*%t@V+DiTa=E_E$LICGD+s%vLxSzM{ih5ll@scP==R8{z zsLe}rJYd{#LYR#4&v^L~FbOMi8qO^Mv`)W3WO;BUctia@@g1y31pe)Y>JPg0JVUO0 zbP{D0Bq5d-BbIZx29;c{jfwZxWSHu6(S5HC;YNVB9G^T8_z> zBg*Pv=fc#zf5mBv&+`jRT7#n7yH!mFeQ^3mfZ+_ezIY;7L4~EOuufaP>$zIWIs-me z*w0j^Mzy%7oH@c7!63jSzb%#^+|O*Cd#X+Dz{!fk?$|6c(Eds=XMBRkL9aK1UVNWbUHTz`rTrLL7*-#Z{)wGb?;P5ewLPgy6;yAaP^ zuncd)C-tzr=A-6$Bd%0C%LO2o_RYIj!`iKzGDDjCI6a=B<2%jK`LeZI%*FN^1@tY+ zMREi$(Z|LfU-alhh&Gwloipj7cqTrPpBQt=xh&*<^GTC%U_fr zg&^F>NRv_6V10VbDFZRXGKH@7s*AYi?)IUHKXu-*6qiQc&T^}rbZB1$;B90!HPpAAOLY( z&S*~i29}$Fjzpn*4{m@uRKU8$qC5ry*&-!mCeT6Xu3x%;o6o$U7{7QYDgaL}#neApQ7Q%kx!8f@@e}k;nt?Ei8?Muh&MDWJiuHo5Z&z2hds6!%%g+feu_$6b+@U0&O+Ff!ui5P_X*7|) zzY?tpR_%H<^5Sh@W}GO!Gt;2O6^AICasiQ+7IRJ9SS(DRpk!3;HU|5;o~QOsn|-n4Cx>*8?wvR?}-N?YM2z%It_XJ3c_z<(d&Eu39VpUpN# z_XQOqWj6JR!N9>E^Ic(5v<~)qTmsxf@7-I|#O!f1wUU}v&BCAB0W4}GSey&n5Lk!( zSaeWlEm_qovE>X;@PkAhl@I>>~fB1kA6&I4^2sB)9T$=3WQOrhwq zjC>rkp9PM`_-9-FvTqIi)bvXD{-!Nlc=fnxV^er526lCTrcQ-}Q?=+(myACeL7t2Q z9bA4+(&{Q9hW95Fk^VkW9w54+}Q~# z_!5T~W9er~7D4gW7}ZjGlwg`Y;7xUZR!=GmLiWB8gaPds9vgAz4!)gYMDKX2rlQZk zVIjeCg#IC*9LdNVs}2nS#`J|I-zvt8Gx$#1D(lOY(<#}(m~DM~F_~5JQLIpe0{j3t zHJYd7n1jyWBT5E-z)~aK_{h2Y=x<1@N z8VQsDD^yrKBGfSiN2CJjY`1g4k9ClWiJrtbv&VWOH5GLBx_a20iGA{#=kE9KdZ>^O zI4=v*Q#f9Cg0t}|D!MsibKRH`z72g3(;i{}cbPNNc!4lX0aBznMW<^~?oOc-a(w8= zO5jC6)${rnBCPz88EtjL_l&1xGuXakD6RzH%nWUZB5P2zy?3`Z&>e*fi>6Bo|Ey>9 zn!?W`;1^AtjY91R(W3vMk_>z}S_W;JQjQ5t4kpuhtaIr38_K64X99@5p(1hkokcu4 z*9?1(tj_HDX)rD&ezd0OT?sEyirV-OoNPd^+}T<1r9;EKQYP05T`&ymoJgTSBU2kK zNZB!XqBup>JD4lZ>MqF1TRx?u3_R@Ef>($@2Tqlnd%@vHN6+}Ph5Wp(n}PvuUv8T8faz|cfhzc`vmMT((hV7%4~!^PB{mrj z)~;5GlS9wrX1N51(Z0j2mSEk9>13GAM!Bi8vLnr9hr_4qEQIo!-$PHAm^3f|;am7M zf_NDX%i~~m@g+N&ShG4Sj$`*ooSVAA%F!?6@PI4?#UYb7;5giC`>P z1?uAK#7LzhrKd7dSpenZLn2G7=M5UYP*_sn7p2^-WhRQ)4_iG)4H46WRl?LgE_cD@ z(=lu3ym7D0j~p`+GlOxk*s%)DG~ulsyr^)xoJlCMjnOFlTV4P`pa2m7VZ2Ve(l&r{ z3i|S#+}wE#Li`A&h3|Kr<}qr(v7M6B(DGZ1nrOXv3RZ!Fbv1;u<6gU z4ItestC#CVt~AL87YIFZ^yDTpuGawPwcTuYXKaAiN4%%FQjIJvAl1$}TXR20X+?_d zK!F_Q!6QqQ)o+A4y2PtZGn}12-5nW+ZznVfZ%u9S%i(YEZ$RcPLADNuFtURLf{V|c z@p6$jI*MJosLZoT>JG;wXz^)m@>=J$N$9*bcb6-ak6NA>$=j@}T*>kE&XK*MiulfA z4CBv+H= zAtUg+=(Nu<7v7^yt=&sFrNWGQEC9cf%s%}Z;D94LP;n2;OEdbrk$S=~)p;tGW_ve0 z==VJw?X(Q%qP14iF_aT@E$Seo@@;QV!6IpE8I|skEwT?$t4BvLdBTx!@o$Ww6J3m= zFTM=S$aiRcNtUimHRgd&P%7F?%CnhFI7*4isJ7htU=oq$>N-z&R2fsIf|>z)I4MuJXy2CTH0CJ)WVJrT&g2JJ`EP^L zi>7c2`S5Z|5eIV`2Ue^7i{Iu3ICYu$Yi4SkEx`?tCmh6kuDSf0ov`S8wb^}IwW3ES z{+rK%v^|Cbo~i3mDbCyVhrB$Ui@ZO~WURZX1*U(StM~}Jau4(tW9U|~0@1EcF`IMy zmViOer;O*kME#GpBV43mp#Hzrk&H$|pSMs&M0Pqi@V@XQ>BtV(LrQpS;I1qX!T%5i z9$pynx1`~)Vv63Z9rJmQjZt#W-q4v(as?2_Pp=~JIxJMgONjBbV#R~U6ghuG3dr~% z02ht{ShaNQRj@iV0RgnfCnVkC;OfpYu5f|cW|{oi$u_MyIi#wowZs530I`Zqem__h6~qs+rVPm3i@Bnnlh{H&8%T${Z6u4D;RN5px5;i(lYANO30jQ4OQE2Z{6bb=vZa zGncUtk1ujcTChc9?#L%-1_AC_*8pF7}Ih{Q;)9J1V+8-apoRMagi+E3- z=A%SuHW<$E#oLLG_6yuYcnEX@uc-cof~m-tVyR3SxoF~v^2J^ir2w*uCWP&NKQ-xv zKa`hF5W4_#7)4C;ZA2Bo>(O>UeN%A!h`qq7<}@=!KcXM<+T)J zJ`Vr#M@r(%@+~oW8|$w9XbipoNIRvbi6JdNFOoWcw2rkSaEu-3Qjn)z-p_+~E?2mwtSb{gX zd&{*pnA?D!@9aAFcEL1G=~!lCC3EK3C7DQgsD7fh2F*# z;6gGSqXzcu_#+D3p3oOIRRd>U?h{n(n5)66GSC%Mfw%^eevN(?{*4g>O`TTF$M6Wi zDMtXcsb}zm=(76t-nprlw<4iYVQ%zqQ3T_u$|mOLU_m#&jk#(UQD2TV=4^LwtTD6} zo#|>>x$oyaaxvs}P4h-d*3nYR*r+S#AQ>2ft?gg}UCx`TM@#~uZxc^$SVs>E~2CZ0Cv#L$gB_ zd3zun70otCq&kdGc?dz+wsvR1bm+F|A%UhuR|p~R$hs&!JXATN`RavkUugt2Pq16n zx;BPF`l(i7s4ly+R`%WBS{P?#Sywi7MCp8371m?^*!uYs*6fLJz{Smei!uVG6#J=v z?yK#f*!)x8CsGX39m17=R`SX#j0hfZ#?mxPBX9(cfsUa(c?il$U3Itgf^pYP+3TEE_Y6cCj91H_A za0C1GyfY`(5`QQA5SUPmTVE2!7E3yyT~2rwH3cFRcDliYIj_psI6Li6%?lg&@g02X za!@^g1qN$oh5pkhNo6g2Dk?CyEWF2ZUc6lYKNdNVf@$esP9yb^YgDgm!_G+9h6-8X zS2YeYe9UnMNpsDmCIYrdBGw2DuL3=)XB_vl$y)a%_=-T~JOLtKibgOy%8FTFMID0; za-?#p!4}Qf_jexj-i}wtI{~oJP4zwss+7@i(k|RglYSqejY6_(&o+PC{ktQpFzNY1c|Qjk zo9+pmPEMtM3rVl}UYfCb5YpPEYm>h?lnWQ?1vp&&%$`Tdk`Chjnjhe!Q^iJcNL6fy z=ly}XI_}sgm_L8%sqzJ8trco_5T3(yd5!=n({YN1H6@ADqpZ5Xksn+4UmBc=n~%~{ zPO}G_z6#_T#e*Tp9=f@93oTakgr18(Ce^eKHxG;7t_;c;1H{Lhu-8^aVoe%vvdCrzoe+&wO*u!3^G)e+>ox)Ht!;f=YY7|) zYeo6wWD7XHVbsWRLjkb_$~HMko!-Q)mk;Vr$yv;B>Awoi@7}Lt2|)lIXrq&Nh&d(X9@z1xfq{=x7Fu?7$r) z*Ust!)S@?$zCI%Z6jxEH`ibHrA@eH3si(t%!~lIRPI(~DA67IJ0A@v;+5qnz&jlrY zx<{e$m*thpEI~2~gZ0aOS}iYy+Q8)K2!5~^kVH|@Y|oNJ-a%ji zWY`7kE|rty36_n(=XcOfC6%}SRpg3ZE=6F!0cZi#i_v>yTqa3hLw}N90JrO~a!7e7 z0TZpuxmH|Nzuf)!lf3ng!nt)y)Q|uMl~Dahwp;<$%6sOK1W&AoZ34LEcXLOR5jaiL zZo5GXjyRSns)lHh;UH^=G?h*cHP$zwKg^|ORvAZGttli_n(G)*1*zcqyUka7esfnk z&z5wr{9oCuWBlSdb2}(LB8SC8$wxhW;^4X11zq88C7j$gm<@en`!@7QDw=s( zj%}}XxAHZa{wdX?Wd?rURNb$%t^sf-&BrA=s}3QUf@BHxqN63w-H9m7<<_7Kg4ux( zRzAYB9sdzf!SCNO;ER7g?d2Gx?$PGTJdm}oy)H85-5vUeua8zfbjB>NFaYWMULd$U za%a>EvAn_yiTT?S`F=oBDHPE=`Plc^fBM^IcNrQ2J0+y|wAmA7hy3?6+qBLbXtxEb zjWkwC&O+@5lGnv+c0Jl?Kf}Hq}u9Xgd1r*1QITf*O1|+0LW&wB{Oi zFVW)lx_83K))5+wLFU5lxCmLebc;7hLopzImLU*JZIPU_L&R~jsW}#7Cw(=r^{SrP z|K&B$Px~9YqQFZ(kc#9{f&VSGZ#ipHU)gIg2m zhIMf?Lzbj;G(Fi-v`D)l>!RfwYhg6gLwWc|^VgmG3hS{kC&lvTgLB+zS^|<4^PTSc z3$jq0`mQwR!d;0r@5o2U74V1G2tZ!X0MoFmQm5RQMlm~aTc>gedIzm$7tWRmv}Qen zO7+8c!5a4}lm2w2<%J36jlmhe0!GYgeZ@#Rv^_=+h~XsO*k>|Q2x<;+cZgdD#=MyN zl%q8!ep@ZEugAXF<+HQ;{a~)wq13IU-=^q_o3NNK&zy&pDnq;WqFj_S-El~OzM7|s zUgFM|6&eR)=lt@@pq4e#`vhn_l%>f>G$m`xZwK26PraUay0Dg`gxi5~Z{of+$`qZ1!Ign|;%jPnlZ!{Nl@5VK z1$9W?3MNko+Tx{xD|ZJahMq?@NYTt2MOWN=vcaL704z`1v>YlcQ|@@{K}=l7>wV=i zH%@UEy2f_)7l6g8j49cjr+=cKwbMh44eY9nhC*v!A^^7jcE7HSFrVEdcF@W zKj-2?Ju*mux@OIALNYCpbfKhDJwD*YUu*o?K1DJBFvg-wN);Y2i=}%1{fMPGrl3PFF5S6RN1max18`4=(>C7)0n({fsev^Cw_r z&JDgXk0}M_t2)$wCqn2+fgi*N(M)y}rXc9PV3HRNX$9LzN2@yNEH>Khu}grxEP1f{G(SS`lZaYGrEHd(chil){-nIW}GPUY{p4%8SwZA08N&M6*vWY zg2d#EH6Ht8=O)yx^f|WlEd=}N^r8Y-D35Vpv70T_TiZ(g8)~uc6J80qDME>>DT#sf zUXY6LV8!mDfxd7nwwiaM*faB4C&CkYADa6G$9T7J{ge7ZCzps(1_82Itl>_eZdQ4L zCeW8OtPMn4Omg4MIa&6i7E*`ZU7^YDY`S8&$o6rc;4*g5N`zv@)oY0PNd?rYhw0pJ z9&%;GS_>ZBa6U{0Q9l|ci>GEKU{wr6ll@-P)G)7{8w}Rn&K>RCT66M_!RR`ZzPrO+ z$pvs-oCgHwvvY(%;X34;v*YvcTlDKHeUz5N&U`n6_m1N_1X~=W8fq!hn!sg76dRJJuA9f))PwjJzSfg8`)^EV|C@CKP41fo7|A1L7#*sao zJ$FyHB6=KYDVei1zKM?N?-a|T zA=$a)hYM|uiSVk@jbmKs_EfoEaLj4U;`5(q@FAJ3{1R&S`25X#V<>utNM1{x%VDGV zd@VsEqam+uqlqrG%$8eNP-ph`=!x38`A#Vqm=h5ze`2xj_Cf-xp-Q+$je+>daW6z~ zl~=guTUmArd@!5>eUf$>c^f$*CBxS~tgDYjj&pY_aH|m>1^qFa z*!N9{8+!t(l=%$J*bxSSnw#%JLa|Xve3JzuR%9(3el@&Mr6tM zREw_jm&p7=XeZ-PuRkR!MNpX%*uxD={VG8nu&72AC_r?lMpv|P zR9VW`7mOHn-m=e9?*0^kbeiiW$RUT`$NzxDuwk$LS-ZVcM$Q%teX}1Wl7pNs(8H7X zwTV&q+y_;ry+m-P?jCUG{-2hAbvsZdwiEG z3El%M#AsFhxOaqjgfkUa^iNI#1rg47gk#+tQX~%NhR%Old_AYb76Y*& zJoRR>-h_vn-xLND`aiW=xO`fqQ&CJh5MeTPi{D|!N=Tz2KAq;2E^DIy z@EBlQyG!OR{#g2FG!z5%T;-Ps))%Q9YV`0Mp&R#KfJyz@seh{L3r{hM^`&`s9N8l| z3|x`4J9sOur7gNLT|ESk_V5IHle=;hoJeEL$zro+#8`D7Q=Y5$vExN*1lt}n#r8vt zm6!3>=@bDnzw&D?LnoXQ4GEH3G1E;_2VC6F2BWPXb3KiHKk@KsG6sSE%cFd(^(=|i z7ZtuT_W5;+w2f(-sHA~F(j~63#xC&R;!-27h!}qTPdGn^B5M9yWl$Siy_5L7Ami(5 zxC_Q+5E3{Yc}!$eF?MnQcRXKfEUAW) zIe^)pud(`L9)!EO9z05X5Y2_$Ab~$m8aR)7bp%+&{(CbGrau&Q!1Z$f{>N~%n;t$J zeK=Ovq4uDyIqJ@Whyc0hmDQkY7eYdW@$j1E1epc4&ta_J6htG}fKFvZa$0=E^&V~p zIcyeJ=SC`3wVm&L(4pGN7n$~G6ZOJvVGhn0Pi8nl3`5YmiQm59PvJ3#4d?4zvGgp?F+D=h74hMx?d0pmmy zZt{%(5{G&&*w=r~mKc0Q?4c6hA)K6D3+P6caQy%{6E|Sx0XDxzcoH_;Flf0tPMOaY~G-*?$+Pr?c$(o^5 zWDRjy3NUehFFa3cO`H(h?Bq%?OK!}qY>^zxy6VSeY5=?!m7rlPb=*~R=Ve82%3^HL zFvpYXVp!PM^r)%kUZ)p|29M5RxSGPf4g|C`c_N{Hf1F2z4U70Y0SSre5vb7eW<~R` zcq+q`Qw1f3LSlHA)c8&VuevgBZZ2{tPk+ESu%Ft=(o*s`a99WoFh8M-;KF7D9FiMB zS9!TQIaDb^l!gd z%6R)w%Idc7|3w$qkwg5fOxW)Z&koN_L^NR&p+emqkzN*YPQqTJ^q%wQ71n2K>~r`} zTJj`~k(D>YWdhT^8If6QTzi}t*eD33PCaW|!IDy3+M;}s03@6Y#5=$1dZVNrTsDR_ z#ZT1);9zk^uWOhATbw zIPgLWPVm{Bf&Zpcm2d~}%*)c}3caLYKWR$4ODjASHUGtKg^e+#);Wv)L7VAMpm6>G zFxl;Ulq0$PtM>*`|EQbfB71*D`XUPn!18pWf|{?IdKrwB?qL!2bP_VWT#-e-y9Bke z5ur7YZ=Zd+r1jaREXbDO_v<%kjGTgc?0em?7(OchsEr6iBxygy zM#NhBeP6pYI~zPlopslK@?`RQrKE)jjR}7`Q2ZdyR#F=E#8Ro-HKR6;@&-kj&OziQ zH12?WJ%|B1qteu=jsN)O`hQg66+WWYU_(~ZCLne62kfU7M%E|X4gG3qS&~Cv6qx$-Dg zE8v>dPni@Gl52|TbjmsXOrdpZKWD)_crbe&(M-L|@k5v(O&AwOsU4%XvgUtC;1~Nm z0hCq2llN^68{^|2&)*qz%6D36y(hUj!rR_xkQS@+%8B<2M0&RKFz4nSQ6DxN z+~)DjV0tDZ4_!}OOKxq|^cY88(k?g8naQlII<25{X4k_@3vC9G9h>th4Q__H!|$;+q*j>6q)v{#b9g>$$< z2j7V}>!Ge9g~K$3a?)xSVN_7|9tI~RfxC~nNmTOaP@^)RxEFA%s6vQ#DsEShpbQ`1 zCj&A7OY4VaW~HGvQ-<4)CHb+QAyq$M_V-;;}%WF%-hTILx$E7kj((DMplC0zVM z-^O+iHNhBje@r5`ujLGzE)m+%^>iUGp_IgN)zj>Nmd2D<@jO$(O!9!A5a5G!bYs-s zTxbkaj%*r|)=LH);|@AvZ+#%ot;fn%r^=nq+1}fG$NEFF0kD z(Fb;G)Ba7%OsT9rn{Xz@n(|Ej=X67&SEnl_*#ORbt9|*vj5{~9Uc-@E|)9MZ%zd!MH^Rg<@Um@xRlHj8VfKZymeFnjyy z1I$5Y3yL6bs;pE`>?YF2xLv&4VB;!;JBbWo9VDx}U+|Cv*WgyXFjLES1y-d&Yg4>y zJ`&bHHmw=^YO)`tdS8g8?cO^XjFF3;d7G|Ye>6qpCt0&5SwOGA(Gjl3ICsQRk>jHR&ty|>cp zotGNNRP0t|&prOO!6o7g?`Os+8}QIQ@vukYXz^iTv!hsqI}@VoMdZ-4{X}FSrim>y zehgNJrT$;_38)2x9S5FU3}>*Mz?o?dZf|Ea1oVf}Zuu8C1XaSGJ9^$;Q}YYpEy4aI zZ(JDE7_kNU)r4}3;1kkdPqGdKaZ=GRZ`KvGYJw7(vhlLEjTzA8Bwn<+D?j47%; z8xrE|fg1*m6C$j|znXga1LfKLYO6$MCP;9)=W}0H2|BFyvOpr_s{01u({)4?QGf@5 zB5W1oJ%JLKLS6#X6;cv&oge-#&Q_Q<;K(pb6z+Q*u0A5Q^>qA_;TDp&*10+(LcJv& zRPf|QWvQAA|LaCxKnOFpnvpRO4^v5`1=tv2P?#}o#3Nj_4oE7|PfZIG4_OaETMdYz zU`2<(m2_0QF;K6fZ;k${=6pTlXW6BHn9^nDTN|d>^@{Lq2yN8763btDxx61kh^M%# zNNP9VvF}CTOTO~X;`Bb2ODAj&>%B>r-8Y<$O{9kO%3ygxHm36!-Ts3ZZv=)lJLQZ4 zBRM{i5Wv}Xws=K?9_MXUu}(JZpeJQXB!unRuF#wOr79H8JRS8TMnJ1$m-MA^=%~Xm zGQFK}uX5?wsonET40S)JPaWaW-(&RTC}{ZX=%C=5ywgOgH8Bn-_lpW>W47c{^)2{Q z0k2w$EOg_X(6Not?=ZX+3-esY6d0DxR@X5Ez`{~dklJ2>0B01{0qOPop9C7X7lSU* zs?oX<5cfcYhC`(J4cg~sF&TSY-cC3wnPd8ohjZ%?_sChPO+_ppnBIaS6x&byy#38; znOKubB@k)k6Md8{2^zGLw%1693rLAlHcY|>JcSIiSmZ@}$>fE~jJQvyCB2cuVS3z7 zrO+m~?p}8tgvI@vNIz&Fnx0x|CJyPww#61x+no%IeP(C1>K~3n1~>ipQLK0qBf6EW zqW;-4Ud6i>zY`zlv7|BkL{}tR1AlNI zpHz9LJlfscs-@j-w%>Heiri+a}l2q&E(rEgR*?( z|HBABb|=-)r<*(;5moh5?OeofBlH&(+}oAuy`k~YGx|EW8P0eTnvlSDw(Zvq95FGW zej9+mwIxL3Qb^v}28xCp1_Lrl)fjc~7vhChVz+K-w%rkXBJ@-OQK2-f$1oc1ybN{4 za|3XOyu?CtYlBL14_e~1i&(7Cs4d!YR)3_Gn>Cm>0dH=Nsbf;KV6uDzT~`?JFG34R zpcyl3Kt(ZRZXZklYsa>R=(8FZ!n+Y2qe&ajj9X@_j;l95w0q?K;0w&w_DSy4DHyvN zh-{D?x_19mlY<@YSyalGFUoV;CG~WIC(68hP9xjqFQZL2*n<)bSeO}(WHt^fg#Na; zr=l4(Uz|`NWS4^SK^V0%sg9)OCm+}!YgU~Pe(B<6JId7Op^JwAz{UF$n&pOXAjzid z2`)hd2C|U@*W|q$vlvY-2NkY{e~EoO5wc0ssBh(uneUl^2G zVO;<8aM7f2z%6qv?;BEiA#(Z>R}6phDS-P&aR-dg*FY zyCn1L1Dm`p*iCRfXl3Q(wQ6(1Wkt6y(Ye#;# zhvSebA88YLa7~T}5jPPe4zZS{?lj|B^w6VF#Lb_B&_iJH8+=OU@|BxsOGk&Jx>4#- zvsm~Tykb#-&`B_E7`MA&IeS4wFXYFtO~9KvI0c&lQZpIv`V(%Ls+27g2pGOa78nus zvCOtXy=cmswxD7;h$>&HZEd?8n!R0>T*3`Cg!{{~IqK{7yV{#B1_9i~n~&ZdjCcC> zV1?8%E4$em)I!Y?oqeNjKF+VSW;)mYSiko3r2zao(X70U?N8*` z*AwjG!1=06;dK%y+U_3gT)Us}yCC;lVEC{+XjPv)VF0ahy-L2c=oNW7IOf{hQ9=>P z;u3?POot6!ey7d6<=O6y10t$%T*5(8dnqm^dmOvRC=cs{F>2gu9V&ahw()zw=1aG7 zdIOt|IDLb7Gatr<;hskAVUrX2Nj}ZS_Qz}2@M|yy`to?b<~lguClD_6_S&}blWNej z9fJV2PF2~*@HPI>P%obez&)fG?Ef&elOJ4h^IP%`5VdHWD0fXz_um0CPR0qUv%^kv zV?$Ti*%lVVs>910*Cdznhp6UZm<`q3KvvS9B~V#1R7F4j^Z-dfw!h2SpKo!h|0y56 z<7<~n1DJ>9MG(vkbe#y@qGp2`B}fmL8ieyPT*ztezW*2u<7@ZN{M;Dl_zJCKql`cw zS|;a&IQKGkGWe<9?Kz}hPMa13y3ZiCkEgYgbz|{!w@C%1rT|aN?j{U!h%aaFAM>!j8bz_Wa?`V|C_fdQD zpoiHO_5V@3b(6k0$%+&5Q6-Qi0gOKf92{%aqjz+c4QT`&h%bQDrHPV4qEKRcq4qpt zC^_l%*9IpKwo{<lN&L-X!YFkc9%4ruZ*1G|TRk8KvH?!Lh zw?Uu@?#=-mmkPb+2FriRS~le$D%tLj2#!vb`;BVV!a~%}<_N~@=NecU?=VjM0L)rK z+qA^b-ga$N>@i4&kKUIU^uO_nU>~sjjWCU20o568VKv1W8h8j^z>mX16H$Nt{z{O| z;xhT|bty@*Jev*SvZz!8%ynVL9F~sFfK<*ZMbGNyPw2#39!pf>ZlN?TH_Y&Wz+*Z7 z~I(M|kGl(kVw47l)`FMgokZi&By|Ykb z(|eTEFhL0iIpO~h?J%-H1=FyMq4t3}6!vhqD*eAS3HDXV8 zK%1%=?f^^wY4*>+%zi^fyBE2`tmNm)L zQDp_EyV)XTA#bIaty;?BXoqwFXq|;Qy-yXRj9x#~z%?dXAp_5pVZpRT=G1>g#712@ z#(A|a07`M7N!R(-Aj7<_uy(1Q0=3o$FiWLaem$JyaT~c)J&-bg2T7rC zO&qgds!5F~)@BX&PB3DtJSp$EJ}pKZSc^jAIee&0N<-sMKKBoQ14s&z4-p0vQBNVn zfjxeb47~G{iS-{6C1$rK59>mvT-$8E8x|Et)rcQI9*DI zN)mSr@ao62cBc8!y)Xuq?v@FbJGg=*l5B$bD^p`g+4ske-9{{DtlK%6hQg+)E?bsg z7^WsgnOZ9cey~K<>d8Qf>@lXA#;?P-&p}*;q4JH#q`jqm zWE37Ove6=9S4yvxhJuP{UZ@Y^En1Ps)PF)Xf!tUxVt1D_!ZvDPi9PH%fj4KO0f45` z%`(2z^VkN!s}^s$NovqPU%=J^rsAYt$Iphikj^kTB-JM5BJZWMjxWlr8QS`C%-gAd zJ*o;OE7{=@HRsO#chHidAYLDnQPhPAswwU0<$X#Co?XGWq7qAacv$XTdfukzqu;qG zuG$?rb~jkxxtMZMK%8yc@*L01Ss*juJx7j{V~gH;6%8#E9o!tywH*at)?wxIu&l~ za4ND|F0xDScKu$NnrFHzCN(Ah7gucc!-WxWwX56PLF=2inPWeEWCZBH8xIUe;R zSYu7_=}sx|w-8z&rBuhs8})iIR$n7)3d<1peW^DPt&!>(hITh*{F-m+5Clm}@igtx zosAiK3$-?%jg6J%Ry6lE@A@#aCSy~P-RhRaU~=lBb$nAm*{NOnl<~wup^?KlYx8la z!#-FwA;!VBQ#ZH5rJHOTQt?5VAE|--FP;7I4YsqZ+_OI8TheZGhsxlFaBV?2a4&%_ zqq!Ue_%vUkNI74+4Q9HJoOwq&_qb}dbQS(lV+vR=VPYZ-gA7i~; z<91X1C*me&0RvULBn*r#ZlBHzt;aE4LLIt^xEJc63UG2*pq&zB%DM-ZOEM*7=F|;8 zrYZV}%Uy|=LY>BPG8awd_Msp5a~^;QX=<#BN99f^$*xR0DNoPnO!h{EtTLDTrAN(C zA^`sYDSPf}AR}x~+cXi^JrnKjrVESX;7KM1Sf|hHZ0lS=x{HIW=yfSnNr(md#t9o( zGgc+<_0OM3&Apkn2{=MfaYLBZG`hSEZE68WMgo0>?6qEo3CIp0|4f%Yvpq1m!x;02 zWlw0ipFRUNjy$L8vE*B1;J8@()7`olR@G7)DPPG-o$Hl=wi{=OW_`fP9A2FnZmo9Qn21zZ=CV9aIvMkL8ky9Zg8TTqXg#EcN$i?4ATK z__ltto%BR+|^}8{bTvhF8UCVa?hKG#%krOGE&m6zim7$XWz8`?M;`QR(%_5 zhOgS>*39%5WZDL6R;5yU?TpCOX}hlCLv{Ejsy7~ z>958_vDN2AEli9mxs?flC)Xg2QWk(~A5~AuRwYF3vYn<8zsv z(1Cxiio2K}22$cWSz?gHI)FKzT#PQI(wEPIY&<7dFM&P8$U#8XQc17Aa5K`>W)WCe z4RSBdWV@EPdq&*NdVZQUigMfdlt)_?R$SCoo|IbLe_er~^fgk}nO7_Dl9}Crt0DOZ z8R|XE%6G$98TUTL5rh)PZIlS$U-Ok@UVyDU)Xzvq@UKd^}80NwAv zBEGhZHe&3Y`EQp5B}B-Vc&V6#bgJVkuni5ChgGrMta1MiZNpaD+=Qxlt+gnA3rgGAC5<);kYQ4qUKuFYLaz+w z$WUV}Yi>gSnKZu^OxM`O_EaZa1Du;vXidK)x8x}uU_s0uJ*hJM4_A>_boI*U-N#JD zl%OUU*?rlnbR5U+_+F)It~nwDnR2Gy;l{y%qv&&CZ06htIX)nrxAyUg;Uxm$V}QM*`a!;dAqi>6jFP9#25rnqRku}sC0 z?ZnYUQfocsB(7pyln4$C=yb;Ez-jIj4T4f3K07#wOee^JfF1Gya>qVQM4*!7YdTk2+N|MeoP9YPRW1_Eful(ijeriLc z0f$mwh3m#KTa&eN-BP$L>ir6r+0(2E-K$o!LBb-8m5eR~T@LT*KeC+EEIq2Apf`(y z?`O~)q@*>l;!1;N$n>QwEpt7kj^5g&ztKg$RqnN3sFB3LzUQfd{j83OOHp4gNN)QF z=s$Nim29q|f(7CmMj*_eh9s&$=BMcesUH&lmtN0B6meI7B<%`;0*qceyY4o;HUqS^ zUvrNWag*6n8M2JJ0DQ^;#L>7Q;1mcX)X&O8Jk~N$v&u<1H5swGzS%`yts!;s4Qv*m@0e4JXGL=+303K4N4RJVDJLs@Yx_$v7KP`|-IKJ;u6GDkGxe+!0ph^< zvsw*I0=4=Yvhx6^kEl<5S$rEA>=xrrdPg8b$c_0|cH8hpS@!9|&?Jh9QN<5utUio} z=6PeU&^k`e#M4>h)@{&pu#G5t3%fcvtNIa=l=z4z*a6`mSBmlVX!Tabw~Z{UxTS(% zZ9}2$f-nHYG7D*-OYPGs9hQh$7b=YdvQ0eiXcpX%HW4@AFAF`C5qkc%wIhaS<7bB?(ZU+wUPi$ND}ONj|B!EBl7xbi;>g-$p?(>)@u}wRZh0$ z!ElJ&qV`od$FgX^*=IhfeUT+XE!5zrbt9=7dO8PZw0+d1PRD@g9Lo~W-jPfvFhZH7 zhgF>cXcN#a9Kx#`M=+QEQRjtC53bp_ffA8&p(oUr0Dh?wnA58TZ&JKtKhsO15nENG zgVh`Hb|!rZ_sD3rkcjz`P1y$7KjyZtmQ<G(FsI;D^B9o`GdDA4kd zjyw%w;*TzJn-1g}+pQ+op(qd8dXnUySzh=^KlsnsM9s3{uYf>d=K()9%ji<6L#G?B z9r=CV7MIsT{SauVA%;<`MW+C-9)UZmb#O+krWJJh=Ojx?npUretL`WA! zhg8jv`Vmry$BrJf8hME$GB0Ad+Gk=fzQlen`%s(V*}sInU+AKW8Le&G zE2~z@?eU-{kK2L-84m8Z7mZ2LaVeufXb+2L&rbSZskOd55=tGrP?}E`cr9- zir`Y3Hg7BWzbw`VTC9;+yx3qBoUs_b&fyqC39~UPcLN2{*<_9TD1P}jE9`gp2W>g! z$2$Ul7HoBE7aThC^xd&DIEr?BDPDxdDC`0Wg%}hrJ})D-bU_O;z!W!BQ@UcP5IdWC zmHuWm@|h!)2QZIPG7;0rG;_eg5hv-jF{S<2d}%-8J5oW7#%**^E_2~i#7C^KYF;=< z>0O|JqW7uF_+RQjQ`&j5IR>MoWNs1K2&F8g+|ZJwT=c$WJf%Ga!DD}Y4hUYF4EyZL z=Pj8|i6(_U?*#KWpnUR?|?ElLsk9>1;7K0n4 z*mjjhj!)^4(26ow}CiN!x6_@k&k|J6E*&da3ZP6nEo<7y&Eh~NKnm=YZTS|myLGPptv!+y>a7V_ zd_g!1sr}CqNKq%E>`}jC7k;3^K`$PKH5@>gpeu0fiJ?8E!?tW(xU~IPay0x`TL@x? z6BfjtpVaXxY-JzkN^*kJZhV%$!KS{pnmge+#?2%RM9r(870FCiMU1?F#cimrgproO z$_AZ3LRs(GS-Y`xC=ve@PB0QM1*#(%QXFC*p~PsJp*Ee(1)=d!I(OIXY2s6yc9*=& z{~y{(Re4ot9JsK9rMQ%-tf@fC=2jJO{apuV$hjA|#K#&>jo1~rL!eAlE|#zSEwFlh zflRSWuz5K4DW~U(t^&muom)}$3#N$)>#ok(2naAKKA#lD%{WQ}DE=^RdwjJPzl~~V zvLUKbi1eM%*1p89DndkIBkGNKKMR4O@d8v1twD4ewKBe+6s5c(U{aeD^s_?$D4tXn zi56Wct9{>^L94#@Fs8vM7H4k^$$~InB5P*>gk5?Koe6jfgUhjOS&R? zB+gQfnb~{2ifn0MDVhNJ&7X#Rg^^qVu#!Mn{W{`26zTy?7I){!lzR4MZ;o3YcZI}j zT>F&aMX849rVZKh#o8`N(>F=v-kP62ef}xG;@m%pl13L4rwWcu?CzVd>dj$zd?pO_ zGvhh#o_+2{-lc47KMwoHRA4t`${)&MX`|}FWz-dZuXw~ePgwA|C$}l^B!g1-tm=i? zP3>JKodX`cdo}@7z5B#UJ%M8Z*GT*nvXKa$MD1Rk{Q{sOK{(u|t z(QX;^S=U91YsZPqrq{=v^-r|6%3=m#imYl9K>Ar3+K<|ai8}7Od8{HGtIYec z|42yV43#{_y{^)KcSM;l(zJtKzMunU{RLH=<&6oYX!b(FaDDSlD2gpQLRW^l*U6xK z%_gTbL)is1|DHB@Gu25KNnu1HnmYo4MPRBs@I{2m1GIhJiDjf~wQQ!;mJ#b@#a=&K z-RabM`8rt`VqlY*55T1{_b9uODf^(5+C!D8wAM$-tzsEL1gr29_-V=7P{%P0iSD?k zsuM$CY@IGG8l3J57l8- zLxIqrqLtHEr?$UtmF@mU4E-*w*K85ooyODX`5&?gMaQN*!n**oAM-%|_X7`d2kqQf zj=mZ&p009&LNUn$nxCDC`cZLQ-%^7~x|#_Vq;UPZsS=};Y9}ZwXE??8UDSTebi5T9 z|K}itfsGO++VzKF-&y#QHeu)i78ua$(x|>%)S({$wDCzOeyu+%Vl(wi`&D+a8(cHU zOorh~(gf!|{-q%PTx#XmMZgLe_H7Mz01hwaH1%R!P;E&;L67ae*36$^>?`rnQm5!H zQYf=^u>|dUc~bj=RJn^IJ@KMk=iyUcA2ayDX(u|_tZ8$h8k%N$LuPSqRKZdhA9zl{ z(aTSXwLdm8OR!pp*Q+E2_7aTL{sV~b`@)EWcgQGNn>2jQxr!iWY4AU_jgk-vc4zL( zumK=sE?C8L$qpnCjSI`BsNzE}DFhHm0tLh%kG2@c?$4Hver#B+mAL42j2&}+)E{g%v#yqx%R8c)FI-j#IY6!3kwL zf7WqCU@`ua&2OMzGt@k#4+u@AJ_2vK=U3YZvQedWnIhgh9`ov&5}^Bg51|c)ptjpz zt|}^OM~-Q4WnDJARvcnO@)3vTE(bNf-zV9y!P1qxhpb8iq_GTXT%}CjKI?)N(o>kS zno1N-G8VM37xl0sH;`{jc21e^=@e~_DzsXKupd)qDmt21VIYKO(Z7FRVPL(v?-$Uq zXwhHyb?c~3q+=)xTY)`8qY{Hv&$WFN&fjpJ_*N^0JrzV0U5bK@6w5?mf-NFP-+uQr z&seAm$JKldC#dUSV0(x2;naKh*H^KG^Q*}_6@oR}bTEv;j0tppzen4d(B zjLPPDfP-c?m6>+9Pk3leYmV39opFb~+$OnKtw_-*;vG%=5r$E@p1{K;(&xr4tV;V` z=QxtdV*#^0DhL*rdjm~QP&WUs1Ea>cf1xWqK=%+B_`5Llkj5FM%*A8)=JcB5 zfTt}Mls9r#0P=>;UE-jKV{!zY_FWnV(hjQO z&H}w(DNqB1JDg;g4FYHue<8ODv?-74L^xdvPvw&9dCo<)7C3V08?X*A(dm>2&)lJ%&WvSpLTNgP?hu<1A2XB>FJ=0K1*hNLgIl*C6lPb zZE0gNxKa50V}acx_OUfIGK?;GrVN`$h#dw$$`(CIBJ=VNcy~cP7wcu2!n_T9w&VTe z&CgUki-qM|>S6Q38gszRjd#74`!@@2&K?i8fM*cn4`1}gs7`hNDnjY{$*b92#uZ>x ztDctQ&w%{K!Oq`0loYN&(rHYW23!eu9XX$B+Et73;_8p5|BkiJn!}5&5YR+Ik=W%e zt&xo%YymB|(gpV_a%s|xn&v;b>TG9pCkM~63Cf1grM~n1UU3Qg>aCPi(|KoXG zChySCJNM_7L} zbp`S+WL4`6GXZD1lRx_eqE&-@5XdijYWrt~X5c3wF>=AoA~cqLL&2_lqz9#AY{j08 z`CQiRmEm*(9g&*o6vzD|_Z4c^(~Zvpg_mdVp6 zigVThEERa-S$qxGN&tn232lZHtr&lQt%)`2=b$*7k^7#Gc7-aZc~sb+A!6a<6(ODB z;>DcqS+@5&DI`a{M2t6H#rJcUu!6{^)>BWSKJ4v`qT!urm6%YAqQcv56YayE|87A| z1W_C9%s6CZC46QhW7i8M5XWQ#2310ctcV!;DECLN>UpW(p`%L?iAbqa&Ha}C^Nv&p zy6v}3LNBRg;S(4SiVLyV#?c4b?e-O|SF#nyr!aI^YUYrrOsLo*3d=@jbzyGv)ma>T zE>&wQ1ow_n@(_V3DH;MEStbB_i?T7a&K==n_{nzwe9$*@gQ9e&$^(cW^E!WL5x9sCFyq!yB>J?v>R5@JyMk`0m;_d_@iqy7GMNh*)B-K8}t){pfLZ z&UR-l@#NIoG|2RJ(VI+WOy3LuW$aQ};ov>u;($Sb2x-jGX)J6Fm^_F3%yD}>_E*QS zL&ZHbN;8~BV|Ne}xP5LTYz=y16JDL;n;%Zi+)X==vNS=x??+#bW6E|s^86I&Y`yzB|tidX{rZ)G@PYBeUOgu=Z zd(+bQM&1xMrHq$0<9S&Q#wHStuZI|T4|5x-UEu6D(k{IE15aHuqeOHsM9%$w?5T7$ z#4G8z-4qF+av_c;3{KLPn}go#s9ifV3d(9G4-{Y7&<;&>IbX(3>AT4-pt=BanW0T{ zZRC(V=K~b=(F{N^0J@SuiL80c;2PJU4fu@uEo;M#V4&VaA|?ZXZ3grMl4_ClyFXx@ zo9ZVq#{Co}o5g@({LMe%N5~||Qa9nzx1erWWW7QM8_FqRVf}?}iav-%;=-A%z zsQ~u9A|tTS+?(FtWP@_XSjFYl6i4_Ceg`fFalBfBnm$?R=w0+oi8&t>*}LeB6)97S zbsb^x%l*EDN23apwsEF=>ekqyW0qrvBzAC2!$W_}!yaP{_+rq$O3zl5FX5%+cRI8R z+f_}fmi|egp?W+7oEs)q6BcK#5M-+hm+YZ@$G2sxrjOdxJq0VIeaq`)7VD=JvBqIy z+c!ov;>46SgHiusi(2=ON%P)v0_(EM4wjdBXO!nk&|3IUGq?C`= z$j}j}q7a$^D$L%QOS2uS@dy3=LEN+W@v*>{p}pL2~dY8Fp^vaL{g-JKvk% zJkv)=MYMAXhunl*$JH<{esHx>aH+dX`Wc3^tI#{e^=F&#TBW79c4W|Pw>SY8oR6=! z*kv7@2d|6SbT$Zb@3^l{!Tv6{mdv)0{c)!uS5AyOZzg zC8mYoy(0>uVI1trOC;QYAux5zzt7mZQoWi(1Oi<>=Pn5TL%Z3bh-GTgCN|^QBs)_1 zUG9d8CR_})!bjm|daxW{vmVdXNqe|^Q#z3hM8Mc@4%;SqiEoJNp#KhV1PdG;P%^N` zjTGofw6?O48oWg-a9d9EvL8o1BZ3Eh@~AzJmb*js-v(p^-TU!hBkbbUQ{2czd0Q_1 zE+T|aqLhUyB}M~fO1**t3Dd~>)JICT2Oceyozx#v=HY_O_H;tppwTMZ7AB$O6a9eW zseR}GHdMp^6?EInF24av2-HdtXg(0hO#mvIxwvt=IBp>vwXT_gLHAVr&B}-q&?tu` z30-Wgy1SK^bihnr%Y7JP1GRqC56yl#4y4c32~D1?OCXP|+wUQ&=$iiow_5nSSbFf% z>`^Wzy>@Th!>*SI^e_*jWN`5j{erWZjX0#4ji?!_swoKi4QztzzwKy<0Cw$(Fp;OK zvEvLDSAopM1k9?$aUtb=tW%W3m@HlrLPA&U)491bzZJ;(3r1gChPBpiVZN5k zcj~Y&*F%Ov^R69Hq^@#Zo9Eaahxj5&q4dMQVnc;KoNv8IL1cSYfLbF`tHJKH{E)bB z$1k#ZE2V$@!t=Bb{B&gz((x9}=?d6TpS+<>qBqx|G2NiY7uitn0+W_k0aQt-5Lw1T zj}^ze9JB%HqF`>tER0D|rC{&M7s%r8XfA<+n1QD*Ix0AF;4ur*$md3vn(u6%3PhDquWMb;y5*zt_`7Z`-Jm4nPR zgbPL@uofj7^A2A1Mc8YFq9f-}1Oz)a0m>}(QuEOFA3w#8fJpvdVw!dYK9x}Dc5>d> zx76x$bZ|7}93&C`G_GW_!@Nvo zd=q#$Xb<RfT*T%_}>9wV;EgoGPPoJLu&}Vntn7f-&a;iv=g0 zg4Wg-Q_7_`ECAy>O^ouE@+-l%u%&7`y=FN%@VywMQeqGsJe1`2Kn1S1ppD!Vc0_sh z>40H|MWbcF-org@)E$Cc@m$5>c4F}-wZ=}J#V>WUuWc*S9a*BPe^S`98gDY*F__Kf z=MZERL25X+0LGJBVKAfB-Xbai>3@=u;cYo3LLj_ioVtUNbf8*6u#t3M2W+y4%J|n< z2z?NxsC=O?m%Dl0XJZ_%)Cx^==$^%LFhR$Z1$a)b-;iBB>v^m?Vo>+otDdfRd?j9( zUJ}uTa1g)A&@xO-+1m%I*aV#<20CU&^llmVZhdJ2)=EBvibS*!QgFWJs`Tk%t9A>V z$MmT!JHdlnlHBf{dBaV84X-%rthV8MB|H2D}Sixzql-j8vAnQ?zOx3NgR0Zr}Ty+@(BVb$kc@8!P9TcZ5lQA zOfyh2Hn-xZpvVwAS)R8KtZjuSCnT}cau4&*RX3fg>R;wHvMx08XW(wlH`PW2PUqey zY^?M1#s~m)7jru7ML=yx6w7KkkgL@dqTir&1GJkH_rDS-Mv=17i}Pdbl4Y%TrAt4u z=%GdW08WREWfEesKqjMpXQp8Nk=&5~fJUoQD6U_81uph{TJ-C6N1CYh+4jvL5-By= z9Cy@?bRxEY9`V_sgusEW^p@eT)-k+4mt(j$Q+4_<* zObH+t7y?=EBMog1Ezg%!5Z?E#bUVH`Az*Rl>q(2+S`?xPy@s({|Fn40aXyZbju#K2 zL?A;x{D!tT#2&2?4qL@%im57n91W;_g)8%>FuY_oP^@l0zGBg>oTYq8lxL{>k&GAS z1|VVboM(Vb4!b7~3GJpVhk5IP#x6Df9nJof$~ z+YBDuCagJKgmVef7ki|=LF?jN>2YVp3;}uCb=RKv-?Jj(0O!y?#MlG(O_qaHVvR}- z1?Mu2lOph#)0MgliA6lEU@1t$_gNbw%{nOH@pWc0((8c|gFs}U$2Ye2#zc8DdEQr&eN6^omY|FroA-6&DS>MFn2t9tthfC zVN_>_VeZbK3Uq_{IsK2Q)*X?*?FR~|61ePNbs%_TUh|tqHHY&8BCXEvdn%qowQ5k) zd4=5&eSk{Rnkd5woz=<=>tJSo|C1e){!g!gY27;@3;+Nxr&U6jdc?B&Ef64`>?xvx zj`*T?N2J4o|9-Zj2lZKt6zz4=0&r=7SqfWIml5u+X8|F$pMPJ2PwaxnVH>1X43>^pEL~{|{^ozJ)}+MU#H-r5i>3b;fS{sEP@QwW-*NZ8<%_PnOnD$?{dPAL+f@)4k~xAiEnEuYB=>4X@JYZe=E7})WQH_%H3MyQu^C{o{mNg6`Q@Pgh0U= zoi};yi=6yu{4^esp^l^mQm${)$8$qZ_dAh_yTK+I1Jn!ggP{pOUsxRUGE-O$6vZfw zw2(F1&IhpQdfSEcYeJGx0dKTBU{Uqy9R1(bKvjjFWjN!fVAep+Fy-%vr2F26B|#sB z53I)m$)oU*rPk%aAFDE2dxpWj{pRSv&zbRxZHt*e6nJaB<0%Dx>yh{-?k}hah)5&K z(`IAzE=Nr&VBOU6R~|tpK-rwRv<@M$>d3~l^V-^z6#zK;A4v zQ<8*h(+&X#r56%*s4CtsC;z|i!Tavj{COV}NgT_kQTGk0KjflUDYB*o9HY{#CpCMc zMxTK$zrTWkc?Egdfv05#DMAfO20(z&wx8wGGeb9b=D0sy*WuaY*0- z1hOdnS$@sH%h(x2N=j28hoq_f>Z&(4b$(K);Y=Aq+<2ACXqK0di6f@jMl{||bbP`= z_JG8OcE8tiVukB#hSAXZe1I9NZdsn^BY-BqP>QN4pzmA&{|1LT`owmJe-{@+xX=Cb zHT%rb?=*pg;;}*|`vDuxKQ99Xe$5=NqU+{d4X)i3tR{DD@_dErhJ)p?&RC}bK~&Xb z1nLYcg*HztDR?721I0Y+@g0{@amhxrxyKII1jor(7S_6*l0-a8jA-AHnu+P1hn4tp zjCrg~mvjpl4!9X#MfBTD%>cRS5BXu?QAW$57l;e0a@xg7^cJ!fjfOEcLD>&8>?M!D z2xQ?*O>;6CU1{}ctYiT=I{+U6cK?jBqy@!INQVJD$!-ngV%#wE37uWc2}0_F`Ahls z^!P;KVB7zg(|BBf<~&YO#U*UnjrWk@QhFL>#lU#V6qe*uO_E#KR3pK|4dUtcY%Q|j z+o8E8BML~eL{h5ZV@{DCcc;^|-5`TM`>Ji3BzZE1;7+LTs}uTfyIB4a@_sd)xKN1| zKfYT1E1}P&bq{U9*(K0d(%w_U1m}eAnlA!c15D;TX~L zK8>NXFeVy=M2P!z@QYaSzWxjgTxd97ueJ8*&=9QzKwMlZqUi73fCS-VVLGOc5NW|>oL>z;Ho1b1LK6|gOvQ000|^CEM?nPEOG_Pc^O>uWPh5aB4Xg&BUO$0un-raSx!K_){uO#I3mI zF<*adv#ye99gOdgl%*Y>e{Nn))-_Ep(IM4l)&W_ixHBPZGw^4N}hDAh{n5W>(vjs(u-iX@$p9`->T z`FdcJa(%+l!|kI)7Q_j=pCtr0Ye6}~W`b&cqXF_k&W|?5nfOjSs`jw<_7+0+MK~xQGJ@f* zot^zbN1_h@e2R%hhnIerNKiX{IhFYqLznZrl#bnNc&hy4f1e)KvTEpuf(e2FUMnu)R@{ ziNXibF&PV8ZZrg2qrNAQQ5r)B-(s;YtAv4Vf&wwo(!WTO9J)UVMj`==VDpM9qghH! zG(qiDNXg`uBUX;=$XG?iPyprKeEZ~tMy1EG_N!zD>+e5$ln_H~70+fC{au8%yvMqe z&FH3131sbjc@5S(0x+K@Fo#RVp}ABsjZ>aycJt=gG6~pn5!g4derg&$9Rg>*fkZ00 zx0kI$$x;0_E6nFsn*ze|>6`8i0?ra*2j(NwJJ-H!kk#*FY%p7pICjdCC26@7;*^V|PSQ(pz*JI$D&pN zA9-LmUxfTmJOf_@W0szJZ*2E&6!zA*+umKy1HAwbSy@Hs&$xECH*CIqEVHPe%Q80S zT-*@Y!=u1ZXlEzX@5miP3nxzBt(u^6Tw30CBRU#0T~Bm;3tO7&Y78p)-?=C674iZD z+g(;+z}qu#4UYnY5(f>*R4o3R26{)wYHG}9007?FsCI>I=oQ|;-$dEFW8mU(=FP~K z_Zf3UmK04)I;sU>*ES=x#L?y4O@-;uwR`X7Q?MLAA)&~GG^lCO(6b5Q+na+wq^#kq z%1uNc!;f4{>YxYN=agUi>438Vb}$N8=K4;@J4c+0S1>JQ!O1PLiVG+7L|3nlG1M(6 zo`M2a7#txpn3O1AZ?@De^6n&jXC%S%*KK_0VE>vR7Zyuq>rTMuAW_OZN1)Q60gf+P zDIbZqi^zdBoNV1B)^QKrAO7eLb+XX}QtA!>={hETm(IgH&Bl4rEKoLw71#b^IS1=A zlx2$j%@O?539vFCf9eHOu|5RxsqiXbERIec?P&`_lW}^v`qM{gO5%o~!^bH74|gnIlHOK{LGLK3*Jn#2YbOrOeWuGayRMaono7~Y_D=h zyBp)UkDGh|XNxM`cDM^m-Z7n+!xZWmll?C9o$pHKArtuk8x=KCiJM^9#VXU}bymEK zX805yFlD7cNk;Gwp^qaknou&2ci~fg{cy|>>_&2G5;xCRT_nk9lnie@i1ZD-hByf` zYf+~)k0`ab1HzBiV;qtRrIy5_(s>>F9E04;7W5)1R-p|F}dyZm?5pS8HIhC zrr8}kVe%%lcpP<{LBF~2sDnNQ3@KF*t6h5cG)wmh_LyIuS`C->Y&gkF(&m2kacgJ@ zic^jP{m}Pzvf0SFed)mB8Pz+E6aiA-5SL|UoSc+`>xUO=Hy{(boQ>j(40 zw+YePsSZ_r%mzQo1ARSv52_V;40I2c9O~SXFcaT3%TOc077SuMQ!G1WJ(?G(i}^a> zGpcLz6XGx#7o<4C-P+7dI07BsR%{)i#EU}E6%hQsn<4slTxkZ#iHp(%h34YPpKjZ~ zOt{^aptJFYlzjdL_-to`e-jvt>3j8d2}r_u@hhb)?%}}!`08|A6_52gshhL9Ij)m`R! z+xhsz0b4#>)hZ!i8Pb(1Q3w-jnG!*v6S#VD;3yL(>mrU;Xqq{UA-CyXbN#;mZW ziC6qwEd1~NN&p(#PaGXa0&|JQzzF0~$+_6cbClReq$``59CV0764L6b%+cCWwOBs_ zsH$bn>AZHNP?b3XF$f>a8*}eqe_8p6ySEZ&X@0wMt%axt=zR%M=uOQ?2(Na=ssB2% z$(wbdU>A{05o*!3@gkx#)eeKZ7OUI9@ko4UpBZxbG}3tfQ9J%aA+8>`i!QAyM)=b9 z(Qtd`a(fz+Jhw+(t{w^y3<_r0G!FN-fb?dzxu(T78Yv#SrzUe09L~>%{%)5y{rLRi z3l_~KH+Aa6pBAx92wyk*(1ZNEg0*D_H&Ntr zYlMn!z%p+wIEJ^FJq(h|AK0Z;78~6M2N*4|)u|wEzj%3NF`B;riF7G|Bc$lHkU=P2 z_r}W#uu>V!hCE);7kG;s{*SjOs@-K{ntbYg66(5yrG#Qy3NH{Xviw*Y;gD2+_c77% zEi1G>vFYyVc+g&rqwf!}#r?&2!CKZhBDfAjzIL{c*+8Hj?I(M@#MYTjBolC>+%{?? z7Y#fGRp`t0Ij6x+PQf5@5P?1zfS*e5+MW_^sgitC` zv`Z9Pq)DP-RVX2{+Df58NbmbWuID41|2)U>Tlc1<`zwQ=Z?M;mTitWF{!Y?cQ8&}s z)xs;qs9GBt-O{K9BZOMETeMg zh}1p|b(#jM+aeGxyXDewP}3@SD-m8Lhwf z>{XTTe&D3Ddx})b-$81FM%a1|eXSlDdP{Be-hGXFC4QG%4!%y`wXNCfy0XdB%Y}2l z=w$AU^XwQ}HF85t^q)TG?6{lXE`2!q-8kix% zmnx=9@BP=h@Auq;W1hyxW&2JQH`F`5^HtP6^It7- z!h_bl+nsdc{n=N6;*0Kd9T4bW@1^_Ae8v5EDV@is1nP#_%<33F_x#C~+h>F{&s+EM zrCY$E^j)obId|tu#f?mn7=F0o-ZANIY8!Pw&b2lw^A~V5*sND|VW9TkYyKVQ1#&Gs z%L_KBKM{|=H}Zg{!{7L1vGoPZ=ZSwET(R9p%l^qFhsk15&AsEMUZ|@mJoe0`xYBsU z@!1!}+aL>*6XKdEvKOp;{h7k`;b=xtdWP)~{+hJthZTYnlDvZ?6~~&d3z-{dR%i~&Y1y3V zGDU08#_^SxUQJ4`+PY+*zGRk#&)6yJ9r_hNUG2KoH6(7|+vT%gdoMPg+V(IYwW_8f z+zBFa*)m2lN4KRopnp=x_!c6}5SEkvDt5Q2ET}rctnHZ@B`d2JG z*gCn)?~CEg=ejc&HuNqlstB9zt?E*=^^8xB{e)u%heDMei>6;WzQkvLZ<&}qk$(I7;LBR0-tSFeEw7^6|5Oy%&8SKfnj|v$ z(y!<9U)7piYkjs`KHpjUh5U1ihWMZ<5vD2DUK?5tyFU{7b?Nox(R&vw%okkYaX-uG z!*}UZ>M|ydIZ}E>5r4N-g*dN&^x$>ws5#elepb&v*=w+4O8)T9o(IFXYA1MJ$#ou8 zRd2nf^@e7paH?9N>!%bu*(bkF*8ZB>zhk6aipo=E>*^mXu5YO|zmadB&|VmOVVZ@c zl+$(@??2~b+y4Fg{I%jo=RoOC2hLsYo%Q$mbfagh8`H%%HhZ|38P&bI%ir2ct(X4CaWYFC@T&Xc|7 zq_ep0z1@zE=r5sTmQS(j?)Pf7kj2D}YF?|1^3HAu{Ht>FcIkzmE<;W=x@aw$pryET zVVdY`Lyg#>+Qv0DL;G@i%g>z_JGXf9LA9GfDq~+)jo4wDv@At<$m5+WcKkRybMar* zgeQxnjXwB3T(VMY=G09K|1O>})M&nG*q(zwwVykjIV!XL-?2w8Qk<=f)5;GEc9-k7 zj&jI3DC;}%h^~MSd{LMMzY;UIZ1b<7ZsWp6O|6b80d)m{#7bV=TXl>}Tvf1~!=gRJIpND#NGN0dE zTN!!LRE1vAq(NwA5HLzM`s=(I{|C`;u zbz`P4J>0yb$+&TzdD{W)5v$%rt$wJ|Qg)$V>9_Z$shbP)AOGA`TX~}Q^wX2tnlH~^XT>agA$6=3;%A3vsRFb+^t(}H`_pQcEXCl&&PVh9tw^xG4NLqil37x zrMqNkp1J3N{bgx=8-qekO@eG+k35+dTiIzFue$JB!9?kV7rjUPg9kPj^=+E-D0;}9 zl>*ZOAC>fbyl2~{&8l)558fEZI_BQ~qV}euxNuAJ(Z06E2&;p60rSeYoI0}UZ+7Y1 zDD8s+z3oFL1&>JIIeAcE;C_{Xn$gxZB_6*X4>#FuUg4kE(~wzH{`Y}gELMjom+J|`k$Zvk-fsZ3!i+R|Fm!4t|X6l!>WbDo?4%hoc-vKdyVHK)l0ja z9HwqcY0LDx%+uWUAqhWXACxTDk=z2aV(DKdlu!K^@MVkV2iapEhk~Sv@EiIC- zcw`!9KJeX|L8k^?D|Qwe^TxNSwECq$xz0=1?EBZ|9UnK|eZ9rZ6E;bQM61lrAAJ}7 zV>NxC?9jKWVm8;}=9qh3DYNw3Jm%uUl@U3G7rkdJP+zQGuy&?G*ogFq+DRHMs&ApT7 z28~`Ev3=4l-9!2kxyF9&_kCW?m=&&Dm|W1l#MEPP!c#+8O|J{#F)b&xz9;*i8T_EA#R`&H8b!n05&Ltgn&SIB`kJJr)9PlPRq|fx> z25H~rugA)EW;aSccHObSW#X$3zIRJ*eKnqY!9Y>jLT20*)10VH(^u4WB{(We`3EOm zvWOZR;5F1BwSV>?K^4&%Z|;pyOe>F&i<0ls=&~~ze$&1E$=Fj;r>A^6dr5z?sNqe) zkcgz6N&6Z$x&D#+YnFQ?%Y62MTZVJqWOw+<`B$y7f3NfZX=#;>mFnIfl27iuH+qY5 zgpRq@e%;^o1tohT)Ys-XWb9rTCUWPtdduJ6Z6VL)3`5Sk4wK3;*t{h9V#-E?R4L2v z!CRyf9;~})xN7zP1^LvtZnxM@)eBko zba&@O42d%GX+1E-`bEF^fh$kx$xkT=Oui>D^U1{REGOiP zTF3FL*6X>5uD;k{;I=Nf%=UY#zd-P)ZAZj~^9v^Q#@qiGf9hJ>MX{d)q9k{|ZBr<& zo4KXUTDsTk;?UqL15D2D`MOzLu4>h+Y_(w)+t(_~Rc@X*X6~!^hGQ;OA9*Kee?+F^ zkk?0vh-dy9_kUz?O z+{w)Nx#R0g&yTqvEAnjCu)(`?m%dRKl$=&K+fb+9&W(*V|NMtvbrIJ;y+Y`R@7ED} zD-4g0Suo$x?&^S<78}>)B|kaafAE~fTl4yjYFr{4_%!rRzeiT5K8~4@<8yxc))|*C z4%{jz{bR*n&p{J&QYV(wsyfdR9G}hBG@=MEdb>D+VVoPUxR_U$uTX600 zz1uArW0VFOL=2kSZ{eb#8Rb3WG_8huzcX=O^zDx9x*=_8&fex)W7eMeadYLeO>w)& zjMDtw*jxQ_l#I~mnYp#0*;%^c0z0M}O#E{}WZ+?)ICYO_SBuJ9kKNGjlhu?=DsKF7 zbCFa3^4TJ}yA}+QK70Iv*!9FkW|;-!^wX~DoYWdp(>`F?#@rV-3`#D%STk9wTF?6N zluLKdA5Iba>Aon$Kju^9=jtI=#g4s#qb*No{yh@##zaYPeaFUmtItXYO)YJB_-~Q+ z^NfO3_Xc}SJo$Rru79Z)dv$8peOGR9augcWEjcXAc2xE_-3{L_U%sciMAx@Qrc7hE z+`25SlftiG40YYHR?ard;`bplqwJ&Nb*i-+#BMd1JH%KF-F)0@qQtAiU$UJ#V)Va6 zJ~CP>nPe0lvRT5VuO@e%Z+n6F25ULdi8ro|K4@dMvrlx8gubd=$%FkHi+nUX{sjM> zAF(*)e7o1YgH!6?o9NU#&HiPWFy_s^@K0C0Z+;Crx6GvSK;Lq$RgMa2g(DUuD~sA? zHaOnan*0U48&yhN{%4z4OB-w}3;XN`PnnykR z=X^Ar@z^~lH~;pAjDDBO=VWy>wqM=z?|`mU>EZUT(fyU&wd6)iVZw(I7#!eP}bHWZB(pweXY5 zHYRUJ7JhIVwk*L+r{CWDKF>8r>>U+3!@olC`0ae>9})59o3A9z>RUNR`fl}wIJxr4 z)8?Gj^9xE@@n`;wXeo)&1*KQdEL`dx9^fK&BwYHl#Z%JG()>LT=)OM z{hhXX^|byly6#!dTY?e}`z+BF9i zBD*DJf*U2`w7w0kJ2bto$otd#*S0@gniMK!Gx}n$jdCjPX%O5z`9|OSS0)WlC#{T1 zdND52r^`rGtUCIH<1Yp2m)g>jX8T^aP0b$mH%w1yCX1#lHYWV|Y5e>Dmmv@fZIOcQm zu^$CP#?Jgb*6H%Ypg_Af3u@Qohz3hkeG@WxFzId-G523zo@WZDp0VwPkC~pZKVBuhmDs%&tvLRdMTal=7XpeV&3zG$@I!U0F}q6algPChUA)7Inmr*RH9veLSjNw1On?jRp1bpCjf z`L%*^7v~P`h_jq~>Ugt*cAb>^D1pne7sRdv9~A%bwb`#K?BETLg@Hv8qVwese_Q%> zz@+_eqOya&zc92|xxUB3{r2`w!{LUz1q5nOD%ED4{IY3|$RdN_qe5-TC-Mq2%>sRc zwkK^6$t#w9BOCNZVeG2BZ7SP7W*6Mek6Ib#bmx-cd(|I@ATmKdyRz?@@2kkZPgREP3ZEq2Zg{fldbX6bU65{qYxX#yKzsW!{yNUi zXBIA*`y_LplDEvkNq8VG~J#8MVCq*!Jqjg3G=M3BNwqePO*!oyN2uO5@H+9G~QLzF6bSn1Dma1|@o# zij0*hS}*^s^`+02*2R}%%|pTzUI}a3EU;5O)8cr*`pnJ{iSh`W7613Vlr^N?=j84h z^=e~hr@QNwtNFJ6*PaKSwF>PuQA;!I*ZfN6{{`5RkJZW5hs3M(-w3<5sTupNXllQr zBPaCcqWqa(a3svnJJwD*XlUa*w)5IU`{T(lS+@vSw--KoA%VafuU!JX7GjL^r zcUGT&YR^uq`dZ6-0pgM^TOJE%Z@e`r=0UPt(;WA~GO_HIXWU-=v(x53Kw z+kXfY4bXo*(%0E-d+)~2^?ezWbt4-4-Ve3T-07~G*K+x>p5cpzf{$rZ7PYa{^9EYA z*b5#EFFfts)S-9q(56G8lJ|S=sm|1FxRqs+8vn`PPh;A;?tx!qymX@Gwn6T&>|= zAA{#-v@O2&+oCaTzm|ldTloUz><>PBmHP|+xbN3`Xyi(r9v|%lwX8XH9ip-ULt|3B zx&|oB7ri2;ET-!{#An#!f#GYT?e=D@$^UXICUg6cS6`BC%I>UpZ1s^2(5gOlzifHy-{9b zv26Sn!SP|EQ*@Uf80&mMe$I+^X_a7!%NFa`%)4TDuPCgm|CvKugoduz++CPdcfWn0 zLYh?L$PItfb&U((pHi^M2-|Jcawl~1QIVP;(~fR&`A0b`ll~oaHlLlPm)dOAZa>~I zWo?g^am?Ax<2NiVTKxP~hLKR#inWK5@0%JsjQd{fKL41BgkR{r;Q?tHtGbN8N8B8d zFP5vbdCD4#*d4Q~f7DsuE=@>o8~J3g=)+CUiFbVbtvoJ>SRcrHI`PGi`P1BGCLQ{* zaOj!nAzAah4O7mY>9L46)zJHQ^TeHAGqY<8TN@nzC=PgP-5VXUDri=K%nkE1n*<(N zC}c-m2wpgQV(8ap(^t53i}Y09Owew)S`w?-rIEPjlyh~zwD9EV;sI|IJu1!_SFd`I z=e_cI@1XiUJN@5P%&$1|ChOqPX^PYHg?l>czW!5d=BwUjFrsq>%x~?dK{kT{_0W;r*?MXGucm3$5kme~c1br4|xB z_nXTMHRT5T!BJu($`YT%iT?E0=vnr5{=)XPQa?&(tc}}$D&W9^7Zo$J6b9!=E+};R zm-@x%_PzG52f1DK_i}3D#%veU%4^7xe7R%!(tcN@4-HmLj`bE#>^QM>(|L*C(KpBGn#TPwLkz zf!NfrR-sTvKQ(TSUoY#OV!UkNuj?{WEA8hf8H+gCd1RVy3hTYO&-n7FvOx; zrGO1~7f*i-wbIz9)|j7v=ff^N#X8M@W*H(o7p;!(yKBERZu7WHC;n_YP?J0En#pn3 zYJ>dkq9fOC8un0p>4;KCJ!`-BDUu?KTaG@fUGQts1o7mdo&tdZe<#W$>G=AlHK#?H zY8iIMmu;W6*YIez{cgdKkq3o$<&7`OHqWGzMkg|1muF#1dC)3zhAX9nw-VFSnof z&Qa@)v5M3eY2TmG_T{6?3f1QE4~|W$x0Rp0aNnlIg>IHQ+3r_n*fs~3XLV+OyS7KJ zZ``WK*}gA+U;MdlZElO7MW^yJ*XwiVzU;lf?$4JF)%E2?KP3W>xhKC3u4*srT{uX( zTl#b3arLv;MJtq)=YKxXV>3bb`EPH9-!u0FX6KABwvl{qb|q2gW=@Uq&vQSf6pc;% zl)BqzcjxZ;Lql2eW{~wVpWX` z&v%bn+uict^>7x%jMlp zveJ?sWtnU+Qgcbt{G}!a=|-;6Ep7M2V*KY_a=x?u#kcAuT2b374q499hzJtjZ#T@r z>)XzTUH`Aw3}5&2!kV{RcVB)Xd2;Qw$@V`c?$X}VaAVn`Q}L5KKR68?tW$rXEA!0B zCBmztQ)KrB%vTc*xVw0?P*->2tRDL<+Ie#Q&qqtvI~FeXl^x~guKxLG$N8{zo2_L` z5{B*jHYng|LVusdgN3(hZWZ}p6#qVHYJ1M(sqf7N_ZGD#pR#^$_J1rwj!u%$)GhUY z_bMhUBke z&vkSinz(q_iAt$^8m7iSWQ_%WYwvBn_f~L!!Iq;xP9CcjJ}R6%KU7KCXnA$({#9o0 z&YjD9*p>Hh_hQ+#dkyTL4m1=PvQ2En5y|O)eqOz5>E}Jx|99omD^#n_G;~LlDg<7bz+sX$S1|U zD*KhfeI{L(c2ZH-(~UVhKC9ySL#D_WJ@q;AKD*>KJ+?lcRPuC0<(P)Jl|#S&-zA)QYjo_n18D`)r$^_`uD-pk zB%!LfK&ozmo5Sa8MtXOecGdp1Kh=H8bCjcyd2sL_g;X!O<#8(>PyLxRHBP8YY+U2# zCl}3r>3KgJbuz0{PhhFIP4B+ie>2tR{{E(-{@p>tL(5kDpyZr(2ajKgQBBH+pSS)F z-6S4!SjPSOwu=kn_Fh^o_C;`qkFoCI9u@x}+i};$p2TbE{ylKiw6Jea@uahn%1a&; zC|88kYRws`5wXdm-r4-y_-Vlv8UEKKWV(hgz1mfqG;!l{kv;vNgua%_e(s*Js8}{G zV{Fa&nAIa2m&fJGosQ`*{40E*h4g95=PCDcp6#|h_3UHZ#No3Bqz_kZpY`-;z2~+u zFK@m1u*h9fQ)Bqyo{h3$5tkC%>RQaNJn8c)3liLLPjc7LYXd&Tdg&Co?Cblc@_P0D z9XmbK<=zf`Cm*7E>E2GoWqxBRLbxIb&aV;17$r#+(t{xev-0c zg{ksZ*P~HK4*xi?reN&t{tp&;>QD8wt~0Okm^1lYt$9ccA^eaZyW487l#`{#-O+J64Y$|YUfiyuVQsDHE8e|F}q z?^NactL|CU#RM+B(egCtR=-r&e)$E>OO78Jo{^}0`j@ppRijJu#?Z28YqiQl$`Pw2 z=gXX%w(D!q4sXthvKV&qt(cfsMtI;- z1H(tpnkp^j0wpd?_y6=%CP+xpy)kdF&65{OTXvQXBS8t_Z~1iU=ebBb9U9u#>uv`mRxSve2}WW)x~&H(U%bS*v2hGw)sspjp~0d zEVOv_EV0%lgHpYe&0__sJLRYN8ytLCwqt_$hwWC912fbH&Xb7UGiTJ2%TJHxz1Ke1 zmv5e)U~~TbhcQ=w>Sd0~y=l|k&*G5i?snVrv+qvaq2XP2DDp&6?WzZFj;M5lk5c17ge zte&l+(`LJ0GWt9DPfJB+pUlWF!n)13ewd#*TcEhV{A>zzhxR|6656z&#yI%d?QrEsA?t_gB>O%s zYm0aInqytA-t86>6&fi&{jPfL4wFGnyBDo79&zEdWYyc;r1`;@-)I|rQTY|_)N{+B z+|JxAKYe1y=l$Wz=`GJb?a!~%{&^*;Yue3-buapL#*Ce_a#zrvCm-y>PDT3tx>V>e zT>j)|<@smM=EwIb`C0$?@ZDvO+!gEA)lI|iEZ(Csb>4D?rn04rPc-Z*Z8ra--)DH~ zTgIcICeG@PO0S8P4f;V`pf_mU-MUoVcx*VB2rRDH^b zk^x^srIx z-N6m@+a&6)Z?>Lbr@UkP>^pCKC3VVXZg*E+H0i#D)0uv1BWjP8ES3)ZQ<*bB>fM!z zGedGG3OMdMnX&s~o%=ZPqQf)G@9R%ru3R9takQ$(`~a1HW@GnmXnFGR#ybslP34s< z((c?ooFdt{LEAFI#Y^a2?PJF<*At7c4Dt`ZuYCJ+V&F@!B=@-NVJF`xO%EC{)3$ZJ z{QebH8A9=wEAGBaOy5;_@a?rk?95L&mN%{A05y6#-dA}|{IXk|yvcB{}R`F`nlJpk;ev8^{ zgUW2QN4{BK^DE?Y!l6Ub`u<9J+uzFG@iey>H(u{j$*TonfmP4)Jk+jvn`AaGe2|pu zx^!{T=&~i>^Hi%h{!ln4cWPI*(P)W%xj(l&>y@20Vs*@f(AsZ@RV(Z5-qbuy4-Js7 z>^ESnde2XhJ%0|R=lW!1u+=!B5MFOc84gTHMqIJ=lNypqa(DoR>^6Fa29_t8BNz z;ZZMo_uUt)-!}3Smz9qg(~zXJ z((s9|o|)AhA5ojMQ+q%AZS*i}KcQQ*`Ec68QTv_8r9{~VnmjmQq`WukXNtzV{eLE1 z{MX-5-*(nT%fojbd!2iC&m!y3v3o;@tn3Vacujqu@IdK5OZ_tE?*HU`aV>WA?|lrXhMRO+TdAr$Kv)T_S=#W{_x@Ay#L#JhR+v%s_I)^ z)?Fz-Q*DL4zSGBB4?{)z-RX)uy`scy$q3)oE@5e-Iz=|Tc<_6fuc%7+p=0usqMP%R z17{Y9`pn^VX;SC_hgU zaO_u>B0Bv1g#8jDD+E1K=IgE~OMX9PMd6!cmcuJ&T|C)yEq8=W_l$m8ow>js1-kSJ@&Ym>w%}hTRe|3#~XyVTL#QOslIDZtCSutehcZH@a8rP(|2W)Eda9%Ta{w$L@T845PU)+iC z3%j#6@#!@GDf;$p$K}tvPhX!uYuM9N_qg@<1|ObSdvSW=|5L4rMK^1|!MGGCZucr?P?Qc7FL@%p<%|NrM^6Rh3C>IU*oB4EUfSc8;p~tKSZ%Y}qt^P*V zxWs$1W5q?p-5!}|e2G%%*6n(d@4tS{--2&Js`5=&7DSvrp4)8S_VA@(%y7|uq}JXI;;E6yZzyLvi3fE6YK7h#yf|_ml$@oIjLUG z8M7gGaCBYlxUHu*?=4Sq_;~!B_rDD;PHNxYC_P>kRoOHvGtB1{{Bf8r}vM# z-M;6V^f>ud6DGMHbobVmnj#h~y>UpaL2$+{-LqFbucWyD9;Y?DW|Pw{&mWHpCA5=g z_&?2T3=8>}c5UwaTVsx_NZO*MdBUpYY1Z{$_tg@|94s|Da--d&DW@!K#KaGNe}4yj zu3B9n(V!HQJ>zwunWL8B{6U>R<7Jg@HDB~i{kSy7anZhH`C>WqZ(skdZQd_-;)P+X ze%P(?2YdSuROlXeN@o3Dk-*D0&wj9f?YBo&E$Gh&J8`G|v%b9Ar~7|WnCzkH^}}Y> zKN<8*efOhfUZ*{(T>EP8+!-B};W$1w_>`BTq^We2WzCRdJFJCmUo2@l6`7Q!|K+pW zyZvYLChzz+MPK&l??1nF&#oKb)O5rt?tDZ~*~EY|H`iv`Rpj<0UrNZeKah|zX7#i1 z$;yBJpUIhB*5b7Kb@8w(8jg;C2V_ZeDtR1#3Og!*;i}`OZIkI@@mWV+tzQdKYF-rRc%eT(?6Pl$KYZeT<^3_)w#~mpW1~dJrHOC1?pMo|d#T@{n&!6M-1F-( zqnhbkzovgUQF}Dy{&JC#@vd%O^?4tAkBHh>&)lH7ro?PRmB!Y)1v+1v{=LhrO&zdm z-{G)$*_cBiDw&xEKSo7f&1rd58n-?<#dexvPu(ZUd1+bqwx9IPQx*6yY4y~`4V@z8 z1H*czISi;1jvskS{n@?oTT_+cKt5;~!rg-W=H-zOuJP>+%izk#`@9#KwCyr~)EDMG&7ESRHb8p({rWxKH-zn9Cyi+@EHV!)`>7aS($`S+ebX@~k?C*E zo-h65`*VD){p_JfI(9{B-X73eCabvAWs-QquDG~T{UwzaORVx9DIR;Xsl;jDzfm=! zUY`BNEK3_XqEYgK*NU~-F6Vk5h`G#+^4h&{;w{~O87aF=_CE7_^B{7$c7Nk2vv}?0 z_s=}gD^RfUKCN`%U)bxWbDQ+%3Osz9y4L6CK8L3(6auB*u6Vxs^vp|Jju%)SvkUz{ z^*Z6F|HrwNRvqiR)J(s;bc{Z7&S2TN6yIG}4~)GSqG_(%b2rldbYF5)jE45a+L-l5 zzpmc2sWINMv9a*k>XIRn##g##`q{}HS@wSk=a{d;?Y^;V4$CNQowRR<)E?2)Sn=jj z214!M114lfPO>_h9#JnhT&m0C@j&IS%(;$=;p+>Uj930#Gi1=`?v*9weab6TUT=SS z^2DVDinT?5mh^vT>Lj6H{ULkw@dRV<{@*GqRlb|fvCo=6r|RI&o0pHDnq96pBD!>z z^{5q3-wtT|dm(IS$+=4w6Gq&U?>HkD7j9D`>!@Zn;L+7@^BUteimiA&!_19F9=Q7s&rlfBT+fnu} zbh3<6h;gg8uh*o@>n1iN7YV5euepEJMnTRy=>KtdpIe<9vwn5{h;`6D9jlS)zqX`n z-oJ;%x2|l82}*Gq=sG#A-urKdTHU4Gx-D@%BgEtL4ounYv&U(IkW|z9V$mBVdHtXL z2n&3B?%ZCzo3%9zJ773%|cJ$2jG;u)4K-K}ycD zyO+vL57bPqmDfHxc$v$Er(yj^N>?x5sINL?Mnv+j?RRB+Y_?ch|DR1D*}Pa_ar&8W zQHi^|f-XI7OPFkO_WtM3CDrd<6km$VHgx+kZI$8{r-DuE*WZ(EZE`!%7ZiHICUK#w zvqs^q?-nCk7uV`*S^F1l2n^e&Kiy-j-mF<%g@K5 zTNjlNnrq$}P_<~QuYqcg+4qlY*Yv&+8}Y0w_?PJ|jUBBuzYXWC3jcI#x2;#roz`&u z`@c%1yuE}qum4(LW4uVE+9>aQW~`lXXu!Lq|eN91J+zxJ81xJUkKOFs{b9v#h)??l+iKi>7yM`ZGd*Q*F z@54tbeYrEh{`a^G*DF7l+*DfDP&Z=M-<-J;(I)*<9#t2PUuV!3Xf$)~pY=P&ueaN~ zH23A_-4Cj?{f;DVx#yV{-r_dc@OXxBi=b`OXc5Ol_Mi7YEbMN&H*$nm>hz*RtM9AM z{;1}GQW z&3q`fbXP;-^d_^-io-UJ$xuoXYF{7S9d)Co?W5SE{ilxx{eAJ#*jw^J;=_XL`p4Xr zmKg}UR>p-q{%&^ZUw>_LxqQ>N-`0LrUb%H&ndS|p!-|?O3u_ET$A9&nA}1GO@O}PV z53S?V`@iyfB>#V~(ST{AvL?h;y!m1&q48{=)l21aO~rEAd-GH`g*`mlw)sN%K)tcZUk-{aaH}Z%Ldho9PguTEu`(fbVXfb1`u zbfa3Om3vLzkClA5NpptLx`=0oJv^hlTU7+N_uIP2uB|g>TAKUeje3(s#zkJ-IHLYQ z{(eu@@I5VctpmpB&K}?NQtD+?boxQXbLPW32m8*Q@=+x==G8Xu)~ycXj%>c|^})sR zXK++xzF1$O@!sT*U zxb*D5Zv$n^m9wl$t|v%_&kWyE?Nn{-*tJCIQS0UrX$qZ6@&9@P2aoG?DM%>`{?gPG zA}2SqP|@b)#c@yN?`XHZYaVTSWbyOi@|nun`xV6lvLw8N=7s#cDfLRxIXu7rixXu# z21FU}xayc&?6p%$Fh9^cTtQ$}o6tV-vREZAx%nkx_f$STK6yt!dhans?c2qPVdpzrkE`BW=sNY6mffB^Q_r`$`4}!+k^9*{edW9N_WecvJb9hb z+q3YKaoD1h|9A)>fB*srAbi$1oxnv^{g3}2Uycs zcMV0r(L`HR8m&xc)N%dL-yUyx!Qf?Vs&g9*W`n+M zD&O`u{12%X#XtZ71Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|00D=Dl1iTGihD?L!$9uEEFgw*?sBW$nZjj~uKjE@rt70&iW!dqA`}h3k z)?*~uJo$C_&0I8lW2AHM4|VrH^=`v+35gLCp8GVnqHFq!#v}S3%6lkvLFTfhyVDv} z53T>o>!%9ed7|jGro(5CkNdjS?f4lfmP%JnOnRr^i@u)^y4?9n)_XozzdTUYXU|g; z49_<|;acPK;$z)bwuxDO+1R^r#Jg2ujEgQWxOldBXU&o~m(H3uXk~EQ-vXO-+}_uI z=?|}QO~*#0PdXT~I21hqH%Y9@F>K^RLH! zov`}4mo07H?zAz0U@#^o5Bcqy3^F6lY!k8-an?GQv zoYJhuH=ngGh@1IfyI0rEd&Ixd<2C#mUYwp^-+S-$A2T0W-BfE6Q@Y~#l^1?`=C#j% zoV+`{?OPQZB_+c+QV`A9beaASSG*S<@a(Ox$n#JU;eyS z7Ru5CfddXofObGTpdD}>{Qtcl@Lc8pfltqnQIDAVkI@S~(<(AP{D1Ic2>0Y?RD<(> z@#8tNCu`ZQk2THz5I065lpp$D6l1Ev;46F7&(TuP@?_bvRFAI0QuQ51S;zoN|2bP0 zr%+#(=d1712dc(Y&l83U*<2R)qrb+zH!_yE9cJ{+1&b*TghW47i(Jx}2W9m!WKHqn6 zXQwXJ|7g|0Am3vc<+q|C+z?=hFa#Q63{_k0MbQy#Z0TRBUAHat&+zkGTg4DX9^ z-|Al?{<(24f+|GJpW%O9$<~W;FT%Z4e~qWM%6$!~YAf~MEpK^TPk#SiuH_D@lhsjvRO__%*Q??0POc^<#L{a{J`BOktc*=@=1RWs*ud~{ZQ*X3s)cq6Fa zmam7s)$l)?e|fs{QkTQ58IvC@ml3;mQ}Ajy5QU7 z+8-=l?|0H`n4?No+QSWVrw1h1hG$JE{pd{U8sF1PZP%9Oa1X;IS{4 z4ZHDt%ap6H%(FfJ)aofAQ})j?d+&Sojyr39!MM0pw^#n2b$!YU{M(uT?gq&55kLTe z|4jrU{x>Nn#r!{0Kz+v>Zt(M28vEJxud6K$oV96M{2$foZ;t%QfA}}=KQ(gwl3#lF z{O0dA;RfG*CrulpE?4%AYuY_;%lVI=4V@gP{q|*D_mWrV^qKVZ-oK|{8vz6m_|FK0 z7!9VH-aeI@nS3im)Qd34`#B~rZ==sBuU@l9R`3mscsRlkAz|M4hjocC#7LOW{b2(m z3~jo}zg3n(sDCwXG<H{x5+m#CEtmgw zKjm{E^3vMef6UeMT8{fKasTO+s{cgXe?0F0uXdFG`=0Vjl>-)*2b3@WamwW%ca*1; zsAv42I^06vM~|&bBlpr+#60$t%U@ zre9%DVO>Lv+$z1ie7v*kz1FSaoYYG7!k&z}@ZQ0$VXt-yw_mb>1D*~0 zxzj=W(SonP+p+1`h&6$ab$vIZbHf)0Uk~`@nJ**X9MkNvA$30PJmJN{>!&Yz9ci$# zXRn|I?>-!Df5~{O;U&w7svG^15ACcoBicN*c2V5rBPXBQGA8A*qjlCq51v}>cK544 zpML6#i&KN{zWaN$-?aM0j~7<>dE)MeW*@5bUV}$0(+Z2LU(dM^`Q^U1g4)y_`^e2{ zrN4K-`Aq(eV}9#`lHU9HkvY@r-2J3z#}%K`7k3<*@?Paf`^{KiV*9=KjjH+kzCE<5 zZpx#VX8ihxc6Ui}GA3IWa>!b5u9^gJ+np4`Kbc`X`XL&$O=hTIU-rk)|ApzzZ z!EKk@V+vC*dwCgOGTSPzZE(2P^2IUjX1?v6VEVzoO|`i#=O-`Ej+ryFjn7`+-GQIf z?iCe0W%;d`Ycu_gPnerlUe#c2@A-?CM|VkkCB^hYMe73#Tdf@#w`cilU1A;Y`X*Gp z{$TfnUK@i))XVKUKdpJiXRCE>(dKdO^TRLI^X?WfdwhVY#_q^HW9R-5yuDs}x7u@7 zRazZ(H2V0o#&_eqRy@(Yj&nej9~-sqcXNH?p_R9gS@?q6+n^W8&dZEI|My>P{) z*nn57)EL#e=BQO)nU_><+h9qLP8o04OlaF_?9K1yZW}mtWl4`JuT84`M~4*?_WaW8 z=#kA0w)T8$US8d>n4vR6{3--57`W=AUfW*Z(_me%J8yi_y!Yc(_N?05`@J^?JalEi zx#drHJ>aTRr%_Cwy$csLF%9-#XB)Kc{i6dKec0#eH;v7DC+^;G)3R=BmFF9s?X&;Q z#m#yrZTWD|@Csinc(Ku~K80^;&8{Tf*)(`$lboZD)fM{ISk$R`#*j`Q4IcH(S4Wqu zZr69}BJURKhAr5(@cAZZ2jwVZc#&>wo*3WB6wbp4* zcRCQVFu!qp!uuchdvQs%$Wfzfe)GxO6*|OEd_TY6sU>-lIb+Tpnzejg*Z4W_SMA^G z?MZFAJahfn@wLy4t7=};a=_wc7dqCMv7%(~AI`gP)Lt7Gw{`jaE(0BxeC?Ii*E#-Z z-w~Xm6~)Mw0qUj-jx>) zYWz#Wr41pEuge;gwz_)X-ivlO|90r5&yG)Na&ypctBd-2Ep8g|>By$L7rwEsS^VVp zOZr`V`^k2nK4(3%FlXJX@pacE4)}K2rH%=9Yr){}*X@XZX-&#&;Ntg^nv;HTG~i8HNO(0$Zv>%&5$*H0hpy{_w^%vCS-9`(lh zrU|2(9vZxQ-R$^J*Ia+BQD)N~p$pcxPk3d0M8d}P{)w?0`wUMwuzq1eiw~Ym{C2|~ z%cxJ*KNI@x`i%)sesC~x`iEVIfBTtrQo_~sKPBw_U{O-+rY*^PclMbUdZ%e|f?-4J zAn_JqA zdh^Sd-dx@6tE6flHGkT2aLcMuPkeQ5QKOb$Jznke=2I+1TW*f>`nvw&)e&DkQEhMY zS1olujvIa8>vK!e+BO@P_+#_EmIWWT8ME`?(0BKCY4%!T;}(O59{Oaop{YvZ8tG9nO>4D!`UKoDx^R1K9 zej9YY(f+UAc%WIU;mNzcSoY%Z8{XP4hYMCbFmltL~r(OrvYr2Wz9Zrj@*{Pw{4O<#^!zia%iN6owldOE&5@@wi+)+-X0xsaN4rij&DrNyZH5~8b5t}Xw1e#Dev`v zblA&_41qpB1hsiECGqg_G8p9i|Vv^w5IcuCeJ)| z^y$^kzUP;n=+uAm57*mVdgj70ZOygEnk}yu`>d;GtF~jT;om;K{#IhQO-0EYvxdI> zsc~$p6V?q^hD_YjV^sgIYA$WtaqN^6=8Y|ex<2{!nT+FauWvhi?A{Z38^0fRe%piN z1Anf$x9z;KO~0G+VU6JhpXE*Z=IYz$K0P>g<#$sy)fnN*S~UHeKWe%^HIHj^@|De9 zo+#M;{_Jlm)vDXB%eZ+bn}77elil|InjZMTsfexP$K5=6^CPdPBlkb}dPajxK3O&t3WP!sj)ng zIdtp2VKIKMd}tmX`dNhSd9Czt?-j?o&q@EV+K-W+J#V|LwKSrc{XVYsV z!}fN1!yZ{M?L^qdsY4&wHsJYp)Tl7CAo;sSo2Dkewez`YVO67=Od5Xq`kV$qy^>$=9P#3_*MGgx<;wPrbP0M(2xr4}P$GO_xn+XDaQi z|I%YOw`dth#;%;)v(@}F^>_Ap>AjnS@}D`DyJk(?^Q)5k?R@v89=ATcwB%c#4R2XC zeR9ScedeXTx0V$Q{O;7Io+BU2O`aPaGPPAv`sIheU%KV?sCi!}za8Cv>cpbL%eTI- z`pM*!c}J30MfaV$v?%7vn?J;V`qtP(-<{bUJ#OlcMR`|NpK@(`>-nIw@8;~BJ+!hj*@?I`HA7`3n^_>3L-7~j$UY~mD_SxUQ{pr*$ztls9pS-io)2bDBC`>yWmGj-3 zk2U`(IcxW{dB3;5k@4%;ZzeBo)#0ZJS$C&ZxD#>n8?EBe?^Ye^^V5>74%4UHxpTAf zrM}1g)@>S8cTHB@^tE?VZdE8abz<^|n})x)E6XuG_-^x}-!D6U=(#oM`JaBy+BbdS z-PX5XyjttWIiGE^zjrz7)buazF28O0?fe;en`p)ecb3GoJg2nw9|?EP-~8^k=P!;p@#xl~C~5$H^&}MUmn(F&?{dWPgOWr_3}e=hH=iAHCT>@~nYpGpO)7m* zds4@76Q^i}$LnqGHg?Y0N{7PwbS`;u%FW0GN-M^jtN#)56>i1kWZ+qR3y40Vurd5 zx6i|iR%ZB=2!?I zfB*srAbdr8qARJ?_8YCUb7w}6ls^xs{=A?4+Mhdq$UH8Aj_gvawRY^#!J6=cmaE8AYtYO;E1$@1?*ES8zkZR8zIb?kknWfJMK z{O&WQ$fvyDXt1@tzp!)Kl@~T>Yj)1rVAIX%21A^7RDz`paoS+{_bQG(AqR3(Zpxnq z)IKW@?=0aK%YocPm#v}MmDiwq!vKe7uszz#*0z_eSub0?UbY8%*#fOKtR`*0{5uwl zrJ!+^9Nnv+o-9%g1vO<6V<@O9i*Q3hfGmOy1twXT4X(W8Ty-jUJaAG9cVx74{vP>X z6r1+T$7pBpXqRDhRF18pp7pbO*6JiUrkf3kS%t-Nh67W)vX7J|Y7M2Z7E7XLQgyTk zIL?+jeI45kl8xJ9tL|>6y(M@q-_fpAql5)*%XY?^3;gwbL-l-c9zQf?Jye`K^vUm5NA(yJ^? zLewFPc8A+k&tu(b=hMZ~Lv$F1;M19S2NhMUoIb{~XDGgr^pc%fX3B8L`E2ZhL_Cwfv16 zm%Uh;?aerAu+_`zqg53P$DZ0Vr{5g9x-h7Wx03wdbuAXvybI&3A$q(5m2`Mv#_Y{f zR+o9^&pz|r?wJSV>=~S9S8TCs`zLxOOsch~7*c}_IR)mp)bl=hvF@O}*wRAHyRB+c zwWDXJ#)R2IWzi+fR!J5SO>BO$Xx+qambiWrw}V_Z?zklFtv^(8&5qGVDb1`?PTyg+ z1_kEB&$(0QN@|l~Mq_@sQZBnGb z6(?y=hHbXWYdxA$K=gKLHPe@F%`b1udEEH|8qRlPybtoriiwPX|$myn`& zQyHzL7~LC&2W{=wFkEaJuDptS?S9)OYH&eSN2!;+f?796U9p+eigAf+zl!3z;|vUu9GubB z<kMgrpMb@365$ZFrq56z&ET8#7Qrw`e zflk#Fe)jpy5R;m{{n3|qxsP2srbV7=aH2t;tF7u!ouP_F*Xr0pb*q#5>{R`2(AF8= zj^7NfO14Um*+WDzGN-}b$o&Nsa?S-u9%=AxE_6*V2KJ- z`Apauc}4C32c&~^tM2$`bHy(un}LCc=crD3u%r#zYEntnDY_u1C?%%;v$Cg?>~RFD z3c2sE<9(6U`Am@(kR7+rq*&x9+u1_N>@z7#`3ZKmP@eltib{S8_n8!q{2X?+P(a$T zh(8OEH7-2JkQk@6l_RI?WYYIFa?9VBk`B!472`=> zBssbQbqu}d)J1klHQWvMRXjW>Xlst7b9)Y}(6h`lz13l}RJu?-o!&+p?32UF%}@Ro z?U6sz?UP7l4YE)bL+_F1r+N$6hI?5$_Qa$}9luUltnXPMd*nu(XF4p0^ODYUm|SzY z@sX!GgsBkQJ!+@7QxE)Ab>N{;4bh;%1;#!#^>bzs+xvZE!*=?s%p5?}mgmL8S^ zOgLYDx{P)oDas*9;~BH5(VfL2g|gS|7_EjzwkkW^(ykli$e6%yvv>Y%sdLBZAyTtR zy~{GmXtT4qY`fdVX|p9GJ-O7$CS9MWO~`exw}BWHWrQlrp5V@2_SQY4^o%BKON~~p z2Kz&0DXejET9nF4x;j-DTcyp$`~W%fW^=wt7Uj`8Sj{N`6IBf=l;wV;^g0A*WNvt)Gmu%Bd4gtl=e+r(gb0 zQpU1;Qcmm5tw17p>VMyLdcqSZ!$L!e+@NMjA<&%RQ{R@tXR2V8TE&Ud??-lXlu7lVHh*=9qY_DOi0YV8dY5Yt%v42* zGO1qI6X!!cPPs!|wmQMxq%P6}7E2GfvX{gx+neRCE3N!Q$`BRF8QM?v$JHgOYkz}7 z&cHa?bOoyD4Ngeotr)2GJ3|M{r_J6-{e?tzN48nZ@e1|6?qoAh74&rb8k~sQZ?BN4 zQbz6el&?~G`Sep#tS4GomPj44L3tu|pz=iDi=M^OI(tO2Jhmk2V~~BO3+nnYmXAiH z*E$<475G>xpv{xfRZ6Pt*6K^!)>=wf$}4KKs%&PeK2Q3QVlUf}Nn;$vK9gb{#YS5j zN3qG)z)|dLs}hxGf6N-0()0~UVU`ZA;L()FAsGVZ$DphY#2{8ZOvOv|=6mwwd{BU$v4 zEYy0itamP3PnGpz@!z(LXgxGTfFv_Y^a*bLb`8>_T^Q}w%AP^vYMf|R9wLC;9tf0Crdn+;_t1C!#l#IjxX8?w<`-xwhg zOt?3P=}61A)p2C2JE=%DGSrrWMyvnbg550fA6MDr zW-gb4xB^$nr#!V98}w^vmMg;;nH`fGnXNx}u3YXbF}gQ2uUsW7WkG)BL9&vY-mjrb zaO`XY(-b-C?US{#Z=bvuT0sxJw|)C?y|NHF;ELIjA~#*Fshdh}%6R!qNtX}pl4?Mf zJd=vyl`D;`rsk@og5+$6TD`62eWvl!2IZ_sOO*#5>3$>|X@IIq>2r@uvSS5SgSBS; z#V1vM2|+4xdhW1Xc{Gs6V|&Yt`6^Pne@3c`5VSSo*sp5*Z+5m_F7*o9D)-TJ|6^y9 zb%NZWt@3c6lri5Ew^K%{p4i-=^w>pbv_cBnS|!~adE(f)5y{R_m4m0yCj$SW&{-wr zg|-^xaVkK2S{j2Yu(n?6sRmkV#zn9Af`7{6B|VSwO21ZCX)jk^{dZM4OTU^syu@uU z(Pu{VtRM4aEez5fC26M`Nmp6ux}&#)^gunmR^O!3cIw_Rz}6_`rU1(wtG?)Yn)GpN z6|I6i^QnmzxxvK9vsz?!!SC_uVd}J5t7@0k$&j5bQtuk=jUCZ83HDKAreXItx5(_7 zKg;dfP%+2;%VwWpx$4BInTyK-@rl|dk%%nnk!YM=>+AFKm?rf`0yOw%a z*YlihPr>DEM`qU#(<`1kceo7HinU-Vsb29!Ar#Znue6KO+sNZvLb3G!Y6>Y%`&dw< zi&(6;qPel|PO+u7#(K>qi$v`~-ArB1-$>m9%c_?nb=R*wFKwhmkVkQwe`Jx?OAaVm zL}t%AWj9*A3e4(>T>3wQmZ8vG{mpZ06zofsm~~`3QJbtnll43+fw#OFBD8LnKmP^@`o=`G3*cBTf>)uZDfn3j%hJNLFT4<(9?Fv=xe}~GVK~94s zkq4r72QAD=&rz*jhP|%G<*fP_<$6i)alEN?8M!gGholG6`_8Mnsnj!6zthMpnt7#; zUG6>@>8oPFxxgord!m}&2n^g>MXWOQMvZ3@e&lE7f80wx`qeDCu!^D z)Rh&ehE%D%JeO5gQXW&16i9A?W_yJ+x3USBl6@f@Dq9&32%tL9PCZxY!_~&R3aY$O zxj|_!N^KLR)lAU~<~i4{yT{Hu!&KLj|B~!h-NQh~sA7XW0CjUjrwFA?7L^*La`sx8 z<7CrOEayYU3HE^Hs(V#clM5;}T3xBqC_9ABl9fqD6|Ohax*0NWq}kO8mR45T>LZt1 znBD>^%fqb2k~+QAVE1tjFV{)kJ?C0(lX0dW0Ew7tY+?!h%UKitFJ4RrwDtH>Lc}ja*ABQ7E8zI zX%fNqV4}5pvRnkNgU8Ow_)~(?a%}!quSD%>-Li+HwAQ4blC7cIV98XSmx@VRZ_lcn zkNJ|)~qa|zt*aOG~Q37c-nW;V6DDdaM>=CcHF}=iKYo4-D%53#kz4RE>$u?5k zKGN3~nbexM&0nQ|LHCzAJei@NBf-8>_9fB=?v>qMDK%Q%E9EIT|BU?a5^}Yt(SW2#`7!@og(z9x9JnNG2*s4;uHzfD`F0vNy8Mb<+&TM{;z#r5# ztFhNZ+h1SJ37wNd^j|4Cm?U$}x3aADFDS39y?Yr$9j$}J({9Ms zq5Y;l{3MPRCMQMfr|jyAt+krAQ`S`lA4nPTs_c45U3>-pnwmq^8mf3(B(18Scf8hL zwj&SB%9bA8>gxL}%YwB59yJ-v6em^Z(_Nz$}yT8_6vdu4$@k4H+ zb)aTb`$IKfeZO|(7j^%ZTq+BBVA&n};0=}5I!Nm!aXn*xbE5W=eiA%Q@Xx3#JyAoo zJlSiF*Q!Yhi?eNYX}GdbBk4?o+~tz_FWHDc@YmZ5k z6m{R1y}6RP#gboYy4M3#E-z6f)tJ;HQJ5Z*D>w0uWtk1N`fDx9)*ECtm#ad32dDn0 zE;0=uS3{(}rIyY>wKp|d_2%9aRkwFb`AC;?MJ=V`(jBSWjF;V{y(nFYw9DURj~w7@ z9a4%Ok~v;ZXd}1#54UuPUWS!wGgnReo3x!Ou2I`6i^wanmPofnb*1KxE!1ezRzdFA z6ZCAfY0@;bky20XkX(!@*Cm#Av5wTfqdvBfqrWGebV7or=4|9twL7niR+h%zP30gZ zHE9#C$KO30X`c}{tzI%L#ddzc*b>+6z4u?J|6N}2?%kxHVzRgzn+y{`-k zj4D8LNLQDBQig<~(ipEvqM)t0an>O1OQDo@nB)#!ESYL;RR2*VVM*F)iIkw_$*1fe zRfku2mufzk+7%J~vYt{y)vLlr?k@jlvHYTX^WO!AUF6J@LDr24K_rSTj>E~)4U zVbu~nIhQ3&RtaTZCPpnKEW|S~(^g8yAl39y!KzyM7CCInHHEq$Om0r<$;l!Qze!T? zg2r-!LM7(C=l6|bqVt$V^N!lkrb~|bOXNcz+&9-c%QYzntY{68v;6sQDt_jZ(zG0- zF3ax)`MoJKUs~o+33JAt&9v&vLeEUTGxkhI?C}(XT=j9zFF*{Z7#N~iyX`FrZNC$FVfkUMEMrNlSu-D6slhriUr@C@vYQ-Kr zH_#=ZE_tk#sWVyApItrUYJIfbV7Ge4jq!}x)u=Lcy19DN1YcRynp9bOjPgO#>8q-G zL0j!+H9#qrA1;K;$yeV5X^GWURg0Yo@~CFk=E=pPPD$&Ob!z7zwJD>k z#%kY0wb3cpp5zQu<)0g-3cAlUUp_yP$Q_0U*gBLww@6;a+Bh$P)h8lWOXnZ2nvk^j zC4YN*ZmSnl9^xW0)w6@=X|{r1P){*EM~lq9|9CQ?Z;)p{d5l!g%*M#0U5}khRn5b0 zE_JH9+56_rR7*q3IaQBzX)&rE*F4Y0w~y8fRfDyCCRGuMU~sp+AlrE+Ri&~zX)0kg zse>g~%aS{d=W#)H?yn^WUm?ecl-VSSe`t+LqAml&TD7)Z)>`Uot7Ofhuc`iax~!=Q zC|P~_{qiK8^);2mN6$tjiPzUulBKey&b0nunlw_L#a#UZZvX5|xG7I&Pspncj!`8B zSAu-AEEJiCrC=3J$K}%=tj(+@6Q(M}8LC3$x*8`Tu3|lwD^P{S$$+-H>$2E0%UYz+S9BGpZ4`t%f{Q-kASy z|2ubScy8GMmn zFUqvovr!-$yVP@1+Kj>W2V_=%gk)J^#$b84KV=I}?_r$lQ&2%xP3b;!dl*Nk`2tCp zm~~Q0tgRNJ)M!_QC#&7pWslezKl0MzWtU@*QR-vT zj4kBW7p+ILRgh^X^9s+pMD*60-WO3#*6ZnwWiJEh>GR)dEH!sD%9GqBpUYAogFRM1 zHHq3b$y>GX0M8Ip?JKC0?kmHL`iXhI-r7fH`$IhY{bc_>lgg>CtR>6WQ1S@j4s9u? zz!9wdrK}Lu?j8DGag%fNe8W{q z45}op?=MM3RT8b@{YCi8{=by;LcU&7ndIo$wou9*lvW^BbOowEmh22vA+9dwB-dfr z?>Xm;w|`n$A|X-VO{y&u4nbvu#Z1W}Q-!N<6;z6-yh%ON2Ubcw_j2kTZ@bwUs84UV zOugf0uj4k|lo%b`s{dt~+NG8SRh@yw5?W9(^-e{*43+~V(2*0|%f6#yTNPbB^Za?Z z)_RE@fkuhsmgzJVA?nPewytQEm+OJ3P_<`b-N>TI1I+?A%U-M3kXm_Bh0_9FHbxzp z~N2L0jtsRKe34` zH|MO;$E0eQ9;a&8X>h|}n}0V)c5u}96D}8+B?s@hb)CM_zj(T#VD-eGDC6o{>aks$ zEKi&AI>>0pBjYU=duy3}9;Z%{wDt$ndsJ%pa%cabwCkcT}o}eZZ zq|JrPlZm~(_O_ggg0?~1dU(faYvk%konZ=+J9$B6PmseCe}gPOQQRccfYzsEUu?AMnC#tM zz7=~I?Un24lgn0B_G)_B9W#tx6Dm$NIUX@gkh#nPiRdz{^|E?JQmr5&(6?DQ&V zA#+RKwrcm+{N%5y=B={}s=DpLGLe<2wUY)QH|6w`>AA_nhU+ux>AfnY{`_+4@7{J_ zec+Spijnu_pT7b;OpRnZS8ITH#syIQT|nk3&-M;`DwR`sCMUg9|D z_BkPI31=gZ%A}90uIpu^GxnxWZq@I6@~WP2_P^jvxGaOU$RfwIPYVt5Mbxxg7rZ97 znBXTXXAKh@%H)gpg!55{Ci_jO+;RBX2?0?FB@_H62SmjdPxLGMQcNswy9PHjCMFHi z3e~kS!RYEFWpEw#`L60g$8NXdh|Dh8jY8PM@w?Xq-^sVqj!wKLll{SRr-?c<*>^&f zsC^SEMSZW|G+-?%S^o%cRR1Da-8$9xTj~qk8?vsh#`_L& zS7s%}Wlumyd$Fyvw7Jr3nR-+2n5j87DZ>vELEn8-?zr}wYPc4m#z=DM2Bp0(8J5PD zcC_ELe=P@>JnSn~=7}=U%`8t?Y-{5=sLE5X*X;6LH*J;6@;og=Z{HbZf^E3C=_m)k1R1*D`|n!!sOcV zRf}NFEl=h$9Z{?nRkUkr5u#m^MT&Y0Q!dn&+E+5qnW?tq`+OOU&vJ-Bd`AD0fmRvn z`$%~t#R5s;8eSsP_|m=kxpEz6{R&Lm)rpvSK1j}&BYL~^qlVEd)eM=<$8r9)n%*`` zah{WuYW~_RWqMMrtJzqylq|us5iA>(wO*bL^Dx<}qIFVRo_9^H6|~N>RW^a=uho&l zN-6XSyt=Y8NOnpsywoJ#3Ms34{?ckop#HXKWOn``8R%qISG7Cq_2&z;z2tihX#whf z>njMJH$o!I0v*v25?yYc%j7dLX;)0KOq$9?7temL=8>NcO%2c5!uxvLNWw4o~Z)r6oa;AzJm?}BNC2D3Bpdvc5Q{uGNfr_xX z?9Wsmf%09XA@1JpM`gFXv6yFSEIZ|$pxo4GwPvuz1Z^{^1oy?QDskOyRbf(8`L*}t znbzG_9Xh4E+MXxdGD+vjOO4F`{N7hh?-Z1Ju3woXTP#oQsu9n~43{0!9oVJGm&9p% zrG0rGT4HZzs&6qZ7Lhi{dyN(M+d9hw-yW5)Lu|<;8I{?jhCZ_QK(4)POG(PiyG(Q6 zH!b+!&vFBj%csQANTra|szu5)jC#S>lZUsSN;UR@YKUVu+l`S2)H_UVq+(HlYV0t< z-`Q4e$@smwD^wpt(p5AVlDQ7>@E$e3@v-iawm$PYbPCx0Ke%3ktf^)j&oPOCkz0f)R=E@Fo z)Q-`r43owr$`?wqDF@03F{>lDmet4uPP^tBBpvx#pFFw6OD`_Z)K$NXQ+;{=o0@t@ zLx!>T&`gz;8Y7j>f1OnZdSHxxlqh}FHDPJ;2>B{8vdHS!L%Sw)YUtr(^-dnG-dxT! z%Q;yaWAl+amHyTJVXa}=Ju4t|L7m~MzV=vhs z+HMeWS(WeW<@0Lh(=y6;+Rr-W8+*Gvg%t~@HN2qFc6DK>XqoC;aA|plR7d|px72gH z`m2U2sWn92B#q6MS8&{Im&riF9ePJTO*1mU6-?MxI_+G zxI0JlcD8LO>(cV%%VX)i+^ThX)-poARe8#oH_-L4v$Z3~=-6%SWxt`n3SO3F$554@ zC#SObY1xy45?!sG4@+!GqbDeP4$#N+T1Y+5BT8Ls-63&S<4X0Iac}sqH9wn(6)fNc2emXW$Fs~%igTNcj1aQRHuTRE3%OH2qlw7ZYiM8{*~ioJu^iSef$2T zH+6e0?N#YhQexD#Vz3%hRHN3minBDA-1zjz8=4c7WFF9@jgn}Q?yL?nH<{QmT20;C zYpZXG%BG$t%2LX+N}P60f`hjGnOTY| zr?yc7t%hCQrFcn+)^N{7<2vcNY!V&0-ZJ6Ywyr8-bCsVXS{2NgqTI4xE3RTS$A7CH>4eIELXq00WMtfWuUx#H%|g&`ZOd_8>7Bpk#F4P9CrQDa}MhzmYq0j zNY+^?T%y*esj5MuHbj!i4N9`N8a%t?&Hpk7kAgKMML)3CLJlu|hboDlhrHCGS3glw zl+{qHE7_K1SAL{sQXCbfEK{wdNm&%tamYhis+{6|qtm+h+tstv2-VZ}C@{*-fS_$% z{L}J+X3dip=O_)H+|Jg*l~?wUP4wpkqkZ!B+uDJo6C_WdfdY5Ou+$jha5T;GjO zi}SYy#tqcMJ4 zsiWBfe2SuOPg*TF$s_bPQ4%u7HJm&1@-it&qTDkx>}NYhhe*tzw1=cf8L_A1WE`ae zWJ|t^lcp(ehE6~2xh8{Vc}uX|5l*MPExY5itNQtnQqMUWF0+fqptRi*zScWv)@QPm z;KLF;+UYAT*`Wp4l6%=&%M)5q+AP^?m0ogEoHab7hj&V`^e*y1+gKG}dP@74d;M-f zTv@~z6>+;BamJq!AMr$#yRxC+p|Xe(D&kx{V#1#hLp>1%Q@#w4hrHyIs-c&a&@I*0 z0;P#cIV~AB-~WrfH-U?)djH4oY%n^&jEIKjf}*8jW}+q`h07r3(jW@r-r_`LpA=`% z77Q9u$J>;j_C1OEl(uiKi69DSR&M#RvQpbFjupA0lJkE*=iUKC?bG-3`~JVn@AvR} zG56fFpZ7WEInQ~X=bWp@ff`RB%K9K#pn3B5qXW=p;WYis1^d|b zIFkatNWOmYw%xzQp1oc-D@j_sZK&sv6?Dt83wH9A`a=gx6W)LbS5B!fiNVk#b5=6v{o^WhzGcPbEef!?b~E#bY26cF*dilc!*`2l?i=_Pa~ z^0ey0L13gcBRz1xQeoQ|gE6&MWkN!o-svF^-2{})hkkcfnNkrk5L#ur5l@O{)paDV zwQr`R(9KjBV=0Eq>1XzL_|<` zDUP&pc#|iDLEd5QJ1Gk>tk+bet^EvTSo?J+SuakutleeSOQ#NI39*9bK)v9T*42ec z(r@4zez}M@aWM$`?P5XLw|frh3pdpxz4I61UDMJ~iHtPm1sYc*8m|Q>0>w(xlG1)t z7EthJGh~33;HkvH1dFf**3Q5b0|Qc>z@!hf4qQW&LD&t;M)O5t&pj`87|2Xx3U8Qd zNCz<8Vc_VXM)7HN!)T;;xlXxHRL6$uR1uGdcBE&By`(%f%6cv2MBWgj_I5%Kcq3@r zo93iKjw~78%>Xg7Axrac{^Il+yE$cJx1i52co(mfz(^wJUn_*uNw_+Hqp~0tqH2+; z0$KM4Tm$7XQK+u%)Xvyy%V%j?xDl1qoSz_StUD^!9tCQWSUHW%>qyu?wIVI8nC1X6 zkm}Z8%d8n0-f&^ZGjb1=Q7ndBxDf--3v^>Eg+X-dj0}~8fK!o_&T33jq^(_4 zAUH8BrO?=ih=6J6y_(u?n45i(OUVrIGd1f$OO-ZI`zfEmRZM;*6zWN$xmk?sIyid#VE&@_=e^Ch=d#4cLw+IC$EY*ad5k;{<7$VA~T<&DG22azMWKIWp6O z41>nK9|148&!M~l?Megpexyk>jjxD1W%#b>(vIZLx<>m}-z z(^Yu|VSzSRfPKk{Ri45NY12VkX;p@Gk_%F1vbUmLA3en!LC1xbklB^rB&@IGHUxR$ zp#T=h@F}Z4NVRd@)8r!6!FO=M1T{V|!jmLQl~1|uDJIhz z3|LcO2bj?&Dv=E3dGJofv|%ArP*+QAUzGbrX~o+_8h1n&6YYpvB$0iRKXpX`mM!;{ zp1KZhE0|y9CPWrdX^QoAMR@8uxmtL-QxY7&^$KeNXchrhHhii~G!#LpVW}6~@>z=t z@b2jziP|H=Pe|$5PcE`)?B*xeuW;=>Os=DF$-;FKt}BI$hU=3x6iOrVZG~LKAs_ph zTpxpReL%QqYlk zMFks#iwaIVNTF14&31B8d!F1)E~>)22gpTL(Cf-!E=5%^2p3f$1g?r=N`X$$2M$yy z2_QwvSM;NNj?t?2rCT%Ylt9jDT)3V zOoP!rr7h%lSyiSb!Mw-;^e>h-OjeAgl>77yi*=MIuwT z8OLmmxxe^rjm0UwNV?R#AZ_37=}w~?YVl}j2a}ZwWDDTC2j4$X-@*FP%m8nWt|Ov@ zk%GxpB~rnuhq-Y%#`AKjBaT3|NGUw`EBYe0M)*vF*Un(ig;$!)D67SC`V9_!_xm*u z4+Nfc`r>uH%a{}9@1SG>Z!sfLBZI?l@g#}5f|Tme<==fONWmJZ9BW636iZdp;}?I} z(1)n5^gwr_56a#@&FXPAD`M;)Dm?N!au8Y)>|5gl-u&4sh`_o+%ayR?@&jRB`*@#y zwj(o}Mu74m4AKf`&Ia#;r6J6dKiigP$!P&8da}sVXU|5=0H9EoBBpH5?j8zO22qn} z@{6YEl_(Kcd5_L&&%DhFwTN8psfpSBlQ(~&H-FZty`G<}UiXZI{Mpt;{Q!NHeG2Vu zD083vHivAVlI&1=sre)86_mAgA--=ZCFI}lZi&>CE#=_8%@qOW9YX%?qBdDsNjUrz za9xum!P3&zD@m%xBQ{CGtp~0Ss3RV2@HiLH(%lhECr_Q#oeZ~5?I{1=knD4H+~Exg zRw&?}qC5w&4eC;mpB>^hCFI|Rrs`2{Po#&+)t)UU5&J8$@Qv=c-8;tN)j`d2x!gAX zYbb~|wf-c2mmz)nal#L?#};A%n!$|oX&5P6IvwMd6tjquzpJOlPwvU^5+AYh*; z+b4SLQ}l`U+13ZY0PT?7v%K!v*aF%_CMAe3yP?p;&TeFtoy=H(=5~S5thv4Ay>Sy} z`BKgDpu~i{XnCU1JJlh#^G3^AMlW6x*ub$lvb1 zLf%_`$RH1IQ!S5gvze5-XwYYBgZ9d&aEi*9xD9ou23@8$$UZy%WU8yTJo?0TdH9JP zhH|*}B$nqHv0XLJwd8~#>XB_Kc(YSd6Kiw#fY0!3acL4=Sniu;N0^*ygRbtV<#$+- zklxKbOr8^FnPYP&%8qDxPP9BfO3sQ(+?yML6Lx3wz;I2h>4>qEcoqlh_PRrIZu9?| zxL0Vp&dxRF*!&0N3AGl7%{`UU-xDLxM*0qk|I9Vd+njhT&*(2rJcgA2#94$c{tpw= zqI28LGbPT6%8N|==e!6QnH-x-#z{460kM2f6ndZqBDq6zhWHo30p;3riKlX(lGDO0 zX*PGB?1+)?0pcCxIZ?>KYJHGw`x3vM8(K44INTPL)gotTjh$ZqncES~_%`n{R1VQ? zxuLQHjhl-RUegT`0GOIaV*}U*0U~dPXUe&a&k;!1p(Rv?}-y?tq*oq zV*s1e$RVbN42coohW7M0Jd$e;!DCGUriNf>#hxV-%HQ~tiRWBnpq6l@Cb(^R!{n&d zvR=N?DDR8?(sMT8>bIU2L}$^YmaZh9^G6va#1dQnb9eqSf zqT7a(_+)|vU3Jmc`5~%-1{52=pv0y24kvd&+jSLcQGnYtq66+IRnJX1kq#BY8euI5 z3rWFZVHF^*y7~yHE7k#WkAj;FCUPv3u@^QE8?iBawv)S#Jx zRSbg9H?Xo$$|SP6k_V7|m7%WnQDI<-8FdPyr7HJ#k`?CMHcfdCl?$3t(L$1t-yv@} zc6uIMSKHI_Ryf^}$}PxlL}Gr2 z+>HXPsU(W3quqim_W_UL~$~3EI$y^LN!|mz-()JC3T~^&B_*g-}pdf ziV+fgpZ#fvW*wWGGcXf9rHV4Kl`K@3a8Q2h!Z45or)+;3!Y$eUtkb%xda3>SB~Ig# z6o@~3_7@#KSbjLYWA(}#Fx!{yZ+lbPF15eEB&GdQ`v*%>F3*Yb+1EiB-7P~|iU=48 zHERJuj`5NulEkgCMC6^KSF$Xq%j&XB-StwTKD zTQjTdb!4BG5S|J@S14Y|AWhCUCxjCt>yA+MQVF4Mh(Y|*K4DND#b`lj2uqA3;Rl#uPjU(?{1lq8GuC#@@ON6_O#a< z>PQj&z$y%@Y17FHk)oql>1qwClo$4JWvF5nhUB-NB=XV~lU~MUDo(~D-MVUGtPqvX z?&eJriCx`n843|&QB3zEN&p}U2wsw+xEcjBY16DOjxr<0d5~XjIO{MTOyTW0CW1bscx&?7R(9=t9KWI1ls5XI;yStVx@d`>?s(Qg$z1zBm5KMqc zkE!G?q(pT=wjd;-$p_t`YOw)La>w54&eFPYH4rKfsA`}MnRN!bufZtMYKN^k z4A{ajT;*B^I8>!Cl?>gkRqp@MAjF2{3}*6PNQzZN$t+D9TvhgZni4b_>ZwOzVrI6k z8m7z0EGk<7f~8+TlAwTcxoC`hpRo}9xlMv^IDAdQ7j|#g`sSMD5DfFsB-&1a!Hh)k zPq4kn%8I)_Lz#q%8wO?-1s?b^UroAAgkfXo8)Hs$I536l9O=q;y)cK`(13-gV{-?s zk~uc(6XnxB`@Mx0qg# z-i-*!awgi%c{raHP#mIUNaxa(uf$05hvNl>zl=BV*})}Rm=R-@$;^q#UIJ(^V_;dO z&`yHhDKXd=3PX-e#M6)xjoGceF2_z+E%gI(7EL)-N_-uTQYo=e{A<{5oZw7>5hQnETHVc4oOTH&-@r&ZX_7Ki5(zoG$3d#f@r#Y2ouE-dZ{RVT$UDJPH9`Ryg$(wjSRV?JxQcDmt5A@^&lTDkYa^MF%4o2 zu?irtu?rLr23uoY8lhKm5TKb}yRQi5eqAv4Ye1M?99Z#BmMTO0-s9<$uL@LD%1c(7$59x_yp`eQ2wFXmNvR*5U zo6<5eozKG-$PBg}R;1-M`eU!TLf24k{BSQzR zFfzVJOZ*9(QwMZz+vM9xUMOlGR?Q%eDVIYMxeM`(+<7UR8 zbQbg>YHEcFtV2;SSw-0N^C!bRO;c2!xG(4oF7LxX+a74oxolV zY&-3+rjzj)Z5hx{gM71%u*r5N4u>&$TZe+RK)Q)m2Gabxe~d4~qAgeYPxmXcmR39E zFkf^h;WDqFPO>nge^4R>+oWh&7ce9gV{wKo>qYiAvKV-%xE$5cmpO zB@Xrb+6)UDy)mMK-~vv0Rj6CY%xNVQ^3`_ zx=toRkvG)WI6 zl+PC)`9V|+(`9}s=v;D+aWZz~==lz~lTp3a1chO?MEdLnw4re!M`am+^xsIsx0UeD z)*r>n9*;%F--c!kEYc{lYTwcU-Zb1h(rAv>LOw<}XYVI|V62!8Hu4w8BC}9_g3k^U zBP9o;IN(keL7&m+Dbr)Lb;3Vnl-G;lge6dLo2`}0*N6os|9;8U)stVK%QfV*pA3f{ zTKbBvu)?A}|NY7vXk`$E+vr{q;vBKchB=gHks~xYS+Jb8J9qY^Rk!1fSt*HQ#({G`~ZVBx}*7w1yjVsnF>F|WvCA9DuH1cN4wV*I1XFC9yG zZ&6yEh$1YQeA8@-LP|91*>v#x$|7)9m~0paBT zseiyYK?4-7@)|>Ba==gtOp|r^*Go&HbOC#{rz`}f0iJVFxgY!N)ehy4cyRqf^>|V6 zPJBqsFOC3oxJze8`A@dBnz2RfPRr5Q^75a|mRekS&TBvT$! z?;EbugP(S9f!Q+do%Iz^37DH<@>vCHehFuMa*XN9n^#k(MtKc5NSHkn!|tDz381zrRQn)gtj3j(>jli?bo0jfo@|5WRN2kcDjbu=-8k|DGf7sv719YxT`uarp{fSW1M8zf7 z!fozWYNVQ+sBwz*1M20i6-^XcxIxyOV}x>6(`$8Y&}&60L;8SkjH0Pj(h{}KrqQ81 zsIm~M(hFhgg1NF`%#%##!pZprrnM@`OG{HqLHQf3UnShDf*z-{BQwD&H2CY_4@(ID z2gk zVo}UMr$=Wh_aY8T?T{nIRXUJTS%T_eRSJ@^8IYLZhH5f*S?)-uUTPwv_2nf>&K5FV&Fn?zhLk$Ya4zm!H;kJgA0z>ow($sqoKo9( zysGUtUTLz!fW{mZ9fO-{Y?52=pYF+z#^nofW6ZgFygCxb*z)xLkx*qB#@OcS{WpN7 zs;&X>OB`dKO96Q1werXM!`0BlF=0s5$XKf)KmdkQdg35KrmvJHvUPPRwt33U7*C!g zx@ZTBrz;kde$h^Zf;?&j(V1YPfl3qoVL|UT(!JKYy3J^;4&WN&w-)Wn>x65`DPLz| z|1o3X-#{6RL!iQ}fyqA6gFQl;m6=Ak*llP9?aAK2leS_jvvAZwtk%)QBY?yWAoD1> zO%#5MYe8or;L1x_OO)KY`W{?BkX2v)v(0ce@tnK$$su(*>*@q|Na7h+E5EVmjN1YZ z0w+>QfU=W*NLQ*;UVEDcFGd$#OXzbe!CMJ)F2mLMig_Po9UY@kf6&4BU0`YJioVVp zu(k($Mi+$ zL~&wVq@hIJ4o@|9tUG-ssSAKVP-}e~r|+A*nJc!`%_9(?)(+cpW&zk_^Onuv~*$#);p>YxBcK*>&r0SHCw`f3{ zNOZ=k z!q@RgG?n6a9&RSxglC>%i2o-oMC?XVtqT_-k5t#~I9@r*qZnO1JW8~+Xc0V%*CBCoTCo-zZ0RdNGyj_Vs9a(R#V}|eacl0a5fED+9Y6! znu7LsCDaIvvzZy5Bx;9*GYA1(;Q&&WR7^q-tfSrO#7hZ*k`mfp97^V4@0UDJHdTYqbQ_o2mD*>nXu z(jo5l2W8X_)VobJeUQ6~JL%?dEUNH~DqB{wg3L;)80lIt(slF5kuJNZ#^~zqslga1 zK!DmsxCsX}Pt(SN5{fMc2Eawb_G0JZKO}|=IvJ_taH=Hw7*(tg{?z*o0o3~qA?W>v z0Q5fjU#jq(h_-f!`L*!x#1&*K^htT5=W;3)AgxJajGs?jbOBnCoO?LwPd zGgT+QCS8c$zvY774;A^j-_?>*?+5$5(cZnG_d}F@$RT)tg1c96IDF8JzE42lV^DlV zQJM~l%VLJH4xynR_OmE}Q+wpz4aBPRhm{(lO5H!6S1P%pw*n;mp#JhWd zl8X@`b_<}lw!}(n(I-e72&atPA15SDiSS8K>A3sQUo0oDj6ZINX`IEDSqMXgbS6hIr}*f+?vERNT2WL@tbge?_IF z6M_Y7dW4w46v&J4l!XTJA{|N(NV4UW2pZO9p}2yj3}@bxJxQeRGiNU8c%U6_udtSq zN_Gvo6%rWxgfqTuNoT|)QoSO~)ijKBn-o@{hD{V< zOFDa!-q!-&Rs(K80F4}Q4uwaSqZ2i?1-=9#bcL#(qadkeJi;IuEt-J@!~nh_WI~?L z0|g6=fl3pFFB}RCc^oN8^ z1YMq~EEhpq9o*xPysH!UtyVir%#;Hz8gSWiI$-yUc+O(-BcWAUDvUmqP+U9OF;kf; zvhZUv(y2FSEpU6b>ZSz|wZ#=9PR|1Ua9DALW-5J}l&H5By@oirY7iO2rqw&99+h@= zUrYUr4=U+gtz=l+xhy_o(XJS(kJ;=g4{`3itKNM;)F#%{*izJG=Qq?+9I^WfE0{xB zL5mX7w>+t)H$(W=9!G*!ifBPK^_7Uf5>ED5NV0oN~E`1JbPL(Mcu1RoF$3SFXcq9rV6WRwXJB9gXGVjiE$6?j& z&>fvHv+f)OI@t6;Y!v1679GJ_=qsWtfgQ>=%t6S(Rk44VPlO>FWDjQL7?ughl<+}} z^^{`*PQ1Du4LjZ_&$;Y*?c{K>tM?hN^_17aX0nrdQ9}#djtB9dx`Yusr@T>2!x&?& z1HLGtq<{jT)aldwBmpogJ`pMwwaJ(*7Ya&di3nP2g|gxiAfVM+Xlg`_J5zHvM~khT zsy?E2z+6gQFx9R`?nBhYg)XJ1O-i)ReU-`?5XY!pr!uu7=|&2-;RK` z4UY#2RhA=XN6A9CefIYq*>*UTL%#t8lj^q$DyRDq2QukZKKsXb`d~FBbX2<&3$mo_e@S$wdzEqvDnJ66CNWx2jCCT0b+!Ft-*8hY%4ms9 z)nmviC7bl4kT_abe3#jm=&nn!N(jA4f@bu-RT} zwjVo;fJybEW)~q&W3%U}Z^33~<5hHm+VaBFW}|Vat4nw4lqBktrZCVxRr%t@APkdH zp=L0EgTSXBM2sdd7*L1`gG!*&aYO*i&!u1h7b7Wu6PYx?02w&CpQfbpHw?H&9BKs) z#oz)QC4I3ZithiNaQGhkh=57;BOLM(hj4I~Y!`UZAh<*I3!*UzuMLC1JRGfWMT0=Q z#p~-Af-NU`U$d4QsM2di3~D*Xe`)p(l;cnifsa#XVUw;lQS_x+^!$%~_a~KtWB&^4 zM;1sgEzZ-YC5rPqO$P|bj--qisUW&7z*Gf~fVx0*dvO*`H(Xgnd7j6jX^hm|&c%~j z1InntfZOmaAxi|1(Z?xT2h6tAA*6$ay}Y*XjrC0e{kDIQ5C zRdHojFrLaqbuM0|#VezDJt$sp{3zF`@hZd`t6GfEYN|0)V3=H8VD$1X6wJhrfB;1j zM?&WsLLpLp?hERkX%)D5J{kF@PlzwWxj~I7%9N9y$Jzt^^#)qrR68K~XjMDCkRB9r=L+t2-a3%&QgFniyEo~ z0?Tw;?Es*wEh)o8NJi~e*WM{2t-AW^-Iu9LxVCUNS;^JaSzVi{cCCY_xTA0}5B8Om=@Q$=wF0(^AXf0#0q{lY7|1v1D`_F{Lf zg(7LooRAFVV-b!E7ZD*D_fLHwqO?N>oe`x=K~g+9-O+_fH&QWBV$r>wX{vi5ZifsN zx46(IR+%mG5?MKrRrbHgDn?uZ+K^QfIt!B^e0)gFO+9Ce?Ao1|-Eg&L(e6Z#S~GXQ zVq)+zaDEy`SylCC?C+Mnq|rNMjxD#~jDYDA#IWp`me7VuZMsOJ_1KU;MevDzMxf14 zXwjd{(S>TP z{QS_1((z`Eu~t|sUezCla<@X(GXc5qGk z9f9jMSXAK>>TxiGE2c!}**c>`Lnh{!9qN5cFNvsfIN8yOy2n=IlT=~qirx{#KdYi< z%_dx~`~iMMD`7&0kEe(;amT&+_1^rt#LsbUK!R+K!Co*V$2JLHj3uq_M5Cv|ypCiU zzWxShg3Ub_YL#RImQdJ<(nfR&jEAhN7eJ+a+?PW3>V_)cl>6YQ!--72_ZpBv#L{~Q z$#y9B=w8Ko`rav7Rj79?%677&40XZ+(n%pP+8Z`J=IPU9`uYs*lu#TB_0-v1hoO9N zc|CQ}E*QI9j=gsT)~BKCwnT zzk1hRoj5Uoo3U^|mO|E+*41NhSy6|PI5|<%+TA4%Cc$H=7l|zcwr$wbI6Y_S zqo-EXWR9o_Ok-8+c`S-|lr6*HFbT8R+5}-WpErs$jA+cY*43ZDbiFT3I_jMXDK?xp zgKa47E**h9P_g5Rv`>&1aKsiE76z17B7c1AFfvhOmHQD=z<%Gly26_R{EmB5$Uvli zI*uvWG##E+mo+qw@J&!MmvzeMR){K{vD?;3*iktXx4BI)u<#?JWW9je=(2d~Ebg$W zH48Bxr`D7~a51%_=1p1()W)q*O^4Tz=`faep`&&vvREs`Du|tx7WF(ERRW$gmW{~M zp2)1s_ye0^IYih*IAhD#QpL~#WZaLsWl`P6qHgy3)M@AwrM0_{b#*y?*9;@U;_f2o zKECC1T-gm4&>zwGZbH>Tqcx5jD(~V`yY3n}oG} zty6|su|Te&g6nC5pqAE!1L2S>oCzV;g>i6NSL1HDb5YO?oQrm~!}mq-X=fU)qqoy= z^|#)L1pu0;jS>tC{icm1BrHlI;gcJ6IZj&wN}WWh+ak65_JpZ*ZgU~{9VDBS)7GCD z^uRvTKe8~tt^lQq7%}h|l+(uFjy#c(s|TXGI%!c*51bNEHh&`OVJrN(4C(x4&(DMX z2G7ri_^kT(&fknOniDOpeIuD&GOicNJz<73sh#Ks+~)#>uWpJT9H^S3Vi znZB3ew-o+-BWN9EYHFS(*h4zR4ZDyh%KQTg78vLZD529w)GAo-c2w`EV7+On4=7UooI09c~FIt94 zSz;be&-#)uJd1xoNU0D9Y>tvYORU5t71eZ$eO!4-J%aqVi9p=|%GZ-bUJ@<~Eb~vf zun>x(%t0ZbJfN0eH7`s4EMWj;Fc()&(36VkDO_YGh9i+6?KUs1M-bP6B&Mb1*p#yv zZ4IUxO-wlMZ0fI?aCB?178!eCAZkR`BE*C#Cah$dlmYfAeLzJnR>Dsh^$q^bjYPIy z7^szSo;^wy@)i@Eq>rjSAe#hP*FcHZI{D zEJ?Tj)FKD>(!o{q_U-F&HwRp~$No0B$}||R>rUMCD&%i)JuogJt;#eUu7|Qs&%wMN zt~b8)bgnXuhO6DD2cT`*3=16kgB-8HMOHbg-x|$DojSw$ys$;M!QBbZ@|qA=Tb!*? zA~DZB70HKA!c!Mc**RahS&RZCsHYUCldX#%Mt;7eYJ|p>t&PD83>!ccg^$Qhe+)(- z!qVZD%Fu!l#gvi3j*BV{)@n5xEXA+Q3-KkHuZKEp#9&`X%1wC;d5I8#DSk;8Y3m+$wkphCX$PCE1?34X^fQ2AQz31lH15dW27XTTr@^XX5pu?CB^hw zLNza@WUx2f7E)eqiQiFP9f3NT8bV@Cl$qRyVx8I*+lDf+In^$H)g zHuz?^@FxHaZK%RtQA=6m;cY|yYOY@4qn3v+xC(!YZ)iiMctt%%jJ*AOQ_YVU8={Ij zF+GbZu1?I)VydQ2OweM=Stn+w08b~TXff4BC+27|fus|YRN$-=vovcu%{?+crt{S~ zHgA5IQj7%=N6+#mq?4gNxIXMT^^?;A-i$|26RYMcl) z4%IR%%c1Q5T+~xkGRtsGBywaTI(;1vS$>D6YIR;XS%glXMpbXLDMVbN4v2dEAaZm<$dGR-&Fc}ZvVQcRr;AXzMoB{pS1^fA;o``LK04yBU{}4UgLIj5>Wsn|z2oFIKtkosdctI23rsfN(0QVqr z55^DN^bnK*ZXysNo!651Ge}JZnLfWM%0K=R1^xOjQP6`T78vUw1qB}p3K}^tL>|8W zxIYvGqc>{h30wxB@#_!3Cu&19eBw8G0v&~4weXWPzs|z1O!(C$Qao$*&N4xZso5hA zz5E}imunrUlt$ZI&+95Ce5{G)x=K2TSJV#QY#KFEdOqm2yqz-rG zI_zKQdQ9>jCcO94s{1_ezspHREX4@J|f6tHY7SE9*Qgk-|17+2_V$%rd{Yn24j znd}6&gXvI}Y@`R?3dCC&J(i@JY1ILGASL+BfOWOB=m2hh1$_`utJ+-Js3IPoHT`mO!b0jhvE2!3b#00d5DVTH_c&kW}SxTcM zL+OC{nZjUCh=r9fyh9-ENupqbkf!I^a;*5=m5^~hBofmF9Ik7M30AcDS=7T*cGN+Z z&`RoVN>A)OX`zCj;hG?l0eqopEj*Hn_Rv-0MQgAmLB9oE*2g620+bG)@T5H-^@P2a zdI>GV;H!m4CC+Ln-2^&Nc+;*#Ss83Hv|ATZNq_kuA(V~_hP5X51Z~x<($qFb3t}5= zbB_ZjvXuHf@f^0Zr!ss+>wr@_4uE__fGHbx5}CmMxG7Xh9d?BnVxA;1Yu)C! zbB1q=0`pdhF&`8o3DY4}uzPX1Ru&RmkPTvzkVK*zNhGX7BGJmD7+mJmRChaE_8x&f zv?V9mAClA8ug{5^=q#b`5!*y^D4o$qnlxE_O!`lR$=8Y^i;2XbU#Qzl=tn7lUlk5T{$tBM>kj1IhbWL_(e1o9h8J8Owl-O8!SsINN_p&B+B`Q~6L>bC~@t z;ob(jF>I-biJSM9X5GHIJ~IO)8>pCTP_jq!5LJn3;sM@D@>`pDP|b>I&xT#2r!IMJ zkBxM$#E>Mmae_o-Dht3j( zR+JWth$UjxB3~?~c;Lv{VVh+W&YeL4W2v3)9Y8B*gN~#@N2j}YnyMrbN88npD~}G+ zGt~d06fJatn4;+QjPn;L*?|thiis5(%d=S5 zgUdJ)$U9>9s{DYe3XKl(1Bl!>+phJ7Q;TsNOejhZKu9E3AhR+a0%2@uFx(+4kHT>i z65^MaVKvm@^p_rEqS?Y7`%jg7XufDqS6A(6QyX+hI8AIKBZzdEK=cNwi~o8FK14I7 z9v5EKlYO-UOB5iM(2?wAA;zu__$Sitt4%iDo}Hl#MmWA%ErQ(#vzK97WGM4d-v-a^ zvI|j84m@9MGdK}VuLZGg8) zXKFp%#OL4c-lkI%h=~Dt$ks@$RrU^Z*0KZV6Uz@{G&ano273eD9qMpyVrf9b}ZE zQx1PdC0o!y&00a|>>F11ml_&;@zs6%J;A|+OTuxHnyqu5758Z3Ea&b+YbbZz4RNqD z`Vo}c`s$|L2h>dk`d&^or$cRN_|lhdNoccVB*ftKIRyVqanr)COq>#J4_+p2n|G>h zX@~2UOt~h2BsfGj6x{nyhS_H5K2nW&5wdM*RI4RzhomH?8gq~0jt)7AGK)K#6Y%_I zNP#}++*X)gp2Aq0UKygROrfjlHO4UwJaB1`Wa^-%0M`w`7C(|*`VfF z7{W>@%j|`i_t`U2&^v!r;X_wHj1XiBpOg@cQn%7|!-$5}SK|Q#P&uODV>4wg`KHyo z+olELeFgODP`+3%))LTSo9C|jNYAg4h57XbNae1Uheg19P-!;G1OF>7-`jy&Dpg|b zB7PqyK+T!il#}vMFe5iiPltv14LP=nf;$5#7e{vGHdLANnohEDn>>CSCPIeipf3KT zfBeym$~CG3cxOThZvDl>?vH}s%Enn8s@M~^7u`-F)g+N z6~KL*VE8(MsCym8*w0C$jAM(@!v3DFw)W03CX1u{Xh%3T0!nb%cp4wuir;0~}K4a{!@h5Thrxc7pSLsrk+{5Ysrl&y|g&s zXH_cm2m@Rqs@|?zQiuAk74TJH;r_XWrKVFb7}@V$WDkl^=-ij)n&4$hl3|SJsKhKWR$~MNn|q zT05LR#6Z!^vJKl}$tb58vG=`~PFKr))$`S7oZjm_lD^-r_<+Bi9Bo~7#yci#>F8_q zODq8z7Uwo0#Tj`HPBC1c`yJ+4mU&5ggrtT2yE%o4oPygnO|Z~xRm#-3hX$TQ-l1_C zDjz{qtBG9UJU(J@P_7`3l`BtU&S=}%Fhh`!03`p4WdM(%ZS^nY8t@T;0*s9YImmw^ zizMz4z|r8Si}FZC=dYq4Lj{kxxF`hNz&m)+7^YZMPGy)b-B6q(Z(xt6Yb~9o@<)>! z`J?~*?wN9a_ngLdOzWPzKx+O~tsAO*$?nN;(xntl*8Ya=+#)AFr{lIlL?D*HHDMS; z{^(3Bb7324h0av`m{(+Rnq{b(t_qX-CMP!=C@R;`$VD{N=sdxY#()zyjq4!g5D3OF zhl3_mr!D`aNm>q$nM|ls48%X1WwW;xCMmu|N@AIhBjl;#_&#|@o0{jjN=v<4wSJ~>$& zr^YNmmo>}+x(4ab=j}zu^qhtPL9<$!CKg_GdN$o_|3#j@foYlYFPN6g<_M#25O1 zf;L%_a5zwGlO-v#q&>V|rYm@y-j;HB92`}q&T6z4C9xEEC4OK8hVL?v{1bmYnh%iP z|Dsby{4Lli&}VKW22~Cxh7}hb45^bt+l4rvryCTijLsJh)e2#hMs`0%X*V2g#j zEzQbc^r&aE(ccC6kU;)lYG8rX~aGTZIFTyu+^cFAy*H90Ixpi8yf^d zaz$#HQx@+CJQ|AI1?~iCp@GRdR33y{?G*H2L({AqLfkFjap)vA1|cKM51I^W?841d zZQPJd^;KIy_w=bPpz^*7zS)$Q)Y^OM@bOx?Iu-jC5;#(%W5GzcTgRr{p}tYPrZxXe zi!=sRt)xSeX=_`e<<_d&T;s82hfd*I2>OOX>3rN?VFK#>*mrKleHqtYZ`HlvTY`~5@^LR4ty3QesfJ8W1X~YuI9P zfvz@->s{bTX~ZPY`e7zda0DY!Bhp|BU&7S?mmvMF==U0g)-4nHMn_o9-$p- zbI+HI!?8eq??1Oe^z>bl{G-;{g-57g#7tceaGIyAwZ8Y#5;VnyG3WnMt!qek8Ufa# zSkwgP0_TenX0+h;hBb4{QkgfThR!5tL!((un!P40ejJ&*%?VFEO@-+F1J)izT5G>% z@tVCREPhB!wv3X6ih<`1X%@?~@lAx%)k62LJtcBg$En^wt69uuuL+A^(XxM?vZq>| z{7bcZUQ4!|lA%^MLSyZ6krsj(d>ycFv!VivX`l%Bn}sZ1Ot@pX@4!P0KOHVCqf2zQ zUhmmJo|5a}U+p)V81g{5IYLhF;xZ~E#n`NH@8V7HZ{{hBy5bYNaR-`(cs5ci^z`ik ze7uqBhR2=@a|k^0=dC@q?4lX#+&?w*x9Xl!D{hAIF21Yie0U$eu^7lR!vg*jartc~ zRFP|9K>`gGUPEC8Sl?(&+j#8q|YFv>aa0 z)96MJTx1yqOM_;|TCg3mHQkqupnX}0*X9W^#($mAIj>86*_~zmaCxZF5g4eH;xIRD zS3}NKSXWixn>L}j2O-rUrD9Vq-3|$-Y9+Crm~^rxz5WK9Q6=snDJcLMspU%fGm?tenPWeRt+JHUTQu!6q(J$v__D}!OXW0GrQIkj z2)JVc?hehr7IFm3so2>-$bC`GlkZmIT&GqbZ~kKh7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1pbF2F#pGg9!gr;;ihK>cyBJMxN5f~=|xSar(~o`W=Tqw-u(t1`WW)H(U1BU;6Fxy z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u 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®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