From 926572ee8291158c7da925d8a7a8a9cbea7a484c Mon Sep 17 00:00:00 2001 From: rkdevi27 <54701695+rkdevi27@users.noreply.github.com> Date: Thu, 25 Feb 2021 01:30:24 +0530 Subject: [PATCH] [dell/s6000]: Enable graceful reboot in S6000 (#6835) The S6000 devices, the cold reboot is abrupt and it is likely to cause issues which will cause the device to land into EFI shell. Hence the platform reboot will happen after graceful unmount of all the filesystems as in S6100. Moved the platform_reboot to platform_reboot_override and hooked it to the systemd shutdown services as in S6100 --- .../platform_reboot | 63 ------------------- .../debian/platform-modules-s6000.install | 3 + .../s6000/scripts/override.conf | 3 + .../s6000/scripts/platform_reboot_override | 27 ++++++++ .../scripts/platform_update_reboot_cause | 25 ++++++++ 5 files changed, 58 insertions(+), 63 deletions(-) delete mode 100755 device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot create mode 100644 platform/broadcom/sonic-platform-modules-dell/s6000/scripts/override.conf create mode 100755 platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_reboot_override create mode 100755 platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_update_reboot_cause diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot b/device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot deleted file mode 100755 index 28f2ec6266..0000000000 --- a/device/dell/x86_64-dell_s6000_s1220-r0/platform_reboot +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python3 - -import sys -import os -import struct - -PORT_RES = '/dev/port' -NVRAM_RES = '/dev/nvram' -COLD_RESET = 0xE # Cold Reset -WARM_RESET = 0x6 # Warm Reset -RESET_REG = 0xCF9 - -def io_reg_write(resource, offset, val): - fd = os.open(resource, os.O_RDWR) - if(fd < 0): - print('file open failed %s" % resource') - return - if(os.lseek(fd, offset, os.SEEK_SET) != offset): - print('lseek failed on %s' % resource) - return - ret = os.write(fd, struct.pack('B', val)) - if(ret != 1): - print('write failed %d' % ret) - return - os.close(fd) - -def power_reset(val): - with open('/sys/devices/platform/dell-s6000-cpld.0/power_reset', 'w') as p: - p.write(str(int(val)) + '\n') - p.flush() - -def gpio_direction(pin, direction): - kernpath = '/sys/class/gpio/gpio'+str(pin)+'/direction' - with open(('kernpath'), 'w') as p: - p.write(str(direction) + '\n') - p.flush() - -def gpio_set(pin, value): - kernpath = '/sys/class/gpio/gpio'+str(pin)+'/value' - with open(('kernpath'), 'w') as p: - p.write(str(int(value)) + '\n') - p.flush() - -def gpio_export(value): - with open('/sys/class/gpio/export', 'w') as p: - p.write(str(int(value)) + '\n') - p.flush() - -if __name__ == "__main__": - - retry_count = 0 - io_reg_write(NVRAM_RES, 0x49, COLD_RESET) - - while retry_count < 3: - if not os.path.isdir("/sys/class/gpio/gpio10"): - gpio_export(10) - gpio_direction("10", "out") - # Toggle GPIO10 pin (to reset MUX) - gpio_set("10", 1) - gpio_set("10", 0) - power_reset(1) - retry_count += 1 - io_reg_write(PORT_RES, RESET_REG, COLD_RESET) diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6000.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6000.install index d87efb31c4..e67a594851 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6000.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6000.install @@ -5,5 +5,8 @@ s6000/scripts/fancontrol.sh usr/local/bin s6000/systemd/platform-modules-s6000.service etc/systemd/system s6000/systemd/fancontrol.service etc/systemd/system common/io_rd_wr.py usr/local/bin +s6000/scripts/platform_reboot_override usr/share/sonic/device/x86_64-dell_s6000_s1220-r0 +s6000/scripts/platform_update_reboot_cause usr/share/sonic/device/x86_64-dell_s6000_s1220-r0 +s6000/scripts/override.conf /etc/systemd/system/systemd-reboot.service.d s6000/modules/sonic_platform-1.0-py2-none-any.whl usr/share/sonic/device/x86_64-dell_s6000_s1220-r0 s6000/modules/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-dell_s6000_s1220-r0 diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/override.conf b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/override.conf new file mode 100644 index 0000000000..4291afe0d2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/override.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=/usr/share/sonic/device/x86_64-dell_s6000_s1220-r0/platform_reboot_override diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_reboot_override b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_reboot_override new file mode 100755 index 0000000000..cae804f2cf --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_reboot_override @@ -0,0 +1,27 @@ +#!/usr/bin/python3 + +import os +import struct + +PORT_RES = '/dev/port' +COLD_RESET = 0xE # Cold Reset +WARM_RESET = 0x6 # Warm Reset +RESET_REG = 0xCF9 + +def io_reg_write(resource, offset, val): + fd = os.open(resource, os.O_RDWR) + if(fd < 0): + print('file open failed %s" % resource') + return + if(os.lseek(fd, offset, os.SEEK_SET) != offset): + print('lseek failed on %s' % resource) + return + ret = os.write(fd, struct.pack('B', val)) + if(ret != 1): + print('write failed %d' % ret) + return + os.close(fd) + + +if __name__ == "__main__": + io_reg_write(PORT_RES, RESET_REG, COLD_RESET) diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_update_reboot_cause b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_update_reboot_cause new file mode 100755 index 0000000000..ba6e3bbab5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/platform_update_reboot_cause @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import os +import struct + +NVRAM_RES = '/dev/nvram' +COLD_RESET = 0xE # Cold Reset +WARM_RESET = 0x6 # Warm Reset + +def io_reg_write(resource, offset, val): + fd = os.open(resource, os.O_RDWR) + if(fd < 0): + print('file open failed %s" % resource') + return + if(os.lseek(fd, offset, os.SEEK_SET) != offset): + print('lseek failed on %s' % resource) + return + ret = os.write(fd, struct.pack('B', val)) + if(ret != 1): + print('write failed %d' % ret) + return + os.close(fd) + +if __name__ == "__main__": + io_reg_write(NVRAM_RES, 0x49, COLD_RESET)